From 5e33153f70badc8ef1716fde08caf2d8008962fe Mon Sep 17 00:00:00 2001 From: Mandar Date: Mon, 15 Oct 2018 00:56:27 -0700 Subject: [PATCH 001/102] Allow for custom domains in the FDL iOS SDK Allow for custo domains to be whitelisted by the info.plist file. --- Example/DynamicLinks/App/iOS/DL-Info.plist | 8 +++ .../FDLBuilderTestAppObjC/Info.plist | 42 +++++++++----- .../FDLBuilderTestAppObjCTests/Info.plist | 19 +++++++ .../DynamicLinks/Tests/FIRDynamicLinksTest.m | 57 +++++++++++++++++++ .../GINDurableDeepLinkServiceReceivingTests.m | 2 +- Firebase/DynamicLinks/FIRDynamicLinks.m | 9 +++ .../DynamicLinks/Utilities/FDLUtilities.h | 5 ++ .../DynamicLinks/Utilities/FDLUtilities.m | 37 +++++++++++- 8 files changed, 163 insertions(+), 16 deletions(-) diff --git a/Example/DynamicLinks/App/iOS/DL-Info.plist b/Example/DynamicLinks/App/iOS/DL-Info.plist index fc26896d71d..ec6664f61d6 100644 --- a/Example/DynamicLinks/App/iOS/DL-Info.plist +++ b/Example/DynamicLinks/App/iOS/DL-Info.plist @@ -50,5 +50,13 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + FirebaseDynamicLinksCustomDomains + + https://google.com + g.co + https://g.co + https://google.com/one + https://a.firebase.com/mypath + diff --git a/Example/DynamicLinks/FDLBuilderTestAppObjC/Info.plist b/Example/DynamicLinks/FDLBuilderTestAppObjC/Info.plist index ee3a448f005..e18cee2ba90 100644 --- a/Example/DynamicLinks/FDLBuilderTestAppObjC/Info.plist +++ b/Example/DynamicLinks/FDLBuilderTestAppObjC/Info.plist @@ -2,6 +2,20 @@ + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 CFBundleURLTypes @@ -55,20 +69,6 @@ - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 CFBundleVersion 1 LSRequiresIPhoneOS @@ -85,5 +85,19 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + FirebaseDynamicLinksCustomDomains + + https://mydomain.com + https://mydomain2.com + https://google.com + https://google.com + go + g.co + https://go + https://g.co + https://google.com/one + https://custom.com/one/two + https://custom1.com/one/ + diff --git a/Example/DynamicLinks/FDLBuilderTestAppObjCTests/Info.plist b/Example/DynamicLinks/FDLBuilderTestAppObjCTests/Info.plist index 6c6c23c43ad..13fcbb5045d 100644 --- a/Example/DynamicLinks/FDLBuilderTestAppObjCTests/Info.plist +++ b/Example/DynamicLinks/FDLBuilderTestAppObjCTests/Info.plist @@ -18,5 +18,24 @@ 1.0 CFBundleVersion 1 + <?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<array> + <string>https://mydomain.com</string> + <string>https://mydomain2.com</string> + <string>https://google.com</string> + <string>https://google.com</string> + <string>go</string> + <string>g.co</string> + <string>https://go</string> + <string>https://g.co</string> + <string>https://google.com/one</string> + <string>https://custom.com/one/two</string> + <string>https://custom1.com/one/</string> +</array> +</plist> + + diff --git a/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m b/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m index 8dbb0e9a32d..c72f63bdf1d 100644 --- a/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m +++ b/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m @@ -1015,6 +1015,63 @@ - (void)testSelfDiagnoseCompletionCalled { [self waitForExpectationsWithTimeout:2.0 handler:nil]; } +#pragma mark - Custom domain tests +- (void)testValidCustomDomainNames { + // Entries in plist file: + // https://google.com + // g.co + // https://g.co + // https://google.com/one + // https://a.firebase.com/mypath + + [FIRApp configure]; + NSArray *urlStrings = @[ + @"https://google.com/1", // Valid domain. Any path. + @"https://google.com/2", // Valid domain. Any path. + @"https://google.com/one", // Valid domain. Specified path. + @"https://g.co/1", // Valid domain. Any path. + @"https://a.firebase.com/mypath/",// Valid subdomain. + @"https://a.firebase.com/mypath/abcd/efgh",// Long path. + ]; + + for (NSString *urlString in urlStrings) { + NSURL *url = [NSURL URLWithString:urlString]; + BOOL matchesShortLinkFormat = [self.service matchesShortLinkFormat:url]; + + XCTAssertTrue(matchesShortLinkFormat, + @"Non-DDL domain URL matched short link format with URL: %@", url); + } +} + +- (void)testInvalidCustomDomainNames { + // Entries in plist file: + // https://google.com + // g.co + // https://g.co + // https://google.com/one + // https://a.firebase.com/mypath + + [FIRApp configure]; + NSArray *urlStrings = @[ + @"mydomain.com", // Domain not in plist. Also, no scheme. + @"http://mydomain", // Domain not in plist. No path. + @"google.com", // Valid domain. No scheme. + @"https://google.com", // Valid domain. No path. + @"http://google.com", // Valid domain. Invalid scheme. + @"https://g.co.com/abc", //Invalid domain starts with valid domain. + @"https://firebase.com/mypath", // Invalid (sub)domain. + @"https://b.firebase.com/mypath" // Invalid subdomain. + ]; + + for (NSString *urlString in urlStrings) { + NSURL *url = [NSURL URLWithString:urlString]; + BOOL matchesShortLinkFormat = [self.service matchesShortLinkFormat:url]; + + XCTAssertFalse(matchesShortLinkFormat, + @"Non-DDL domain URL matched short link format with URL: %@", url); + } +} + #pragma mark - Private Helpers - (void)removeAllFIRApps { diff --git a/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m b/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m index 32e165a78a8..3fc5d1b45c6 100644 --- a/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m +++ b/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m @@ -18,7 +18,7 @@ #import #import "DynamicLinks/GINDurableDeepLinkServiceReceiving+Private.h" -#import "OCMock.h" +#import @interface GINDurableDeepLinkServiceReceivingTests : XCTestCase @end diff --git a/Firebase/DynamicLinks/FIRDynamicLinks.m b/Firebase/DynamicLinks/FIRDynamicLinks.m index 8b9448b6f7b..79d31e2f4c2 100644 --- a/Firebase/DynamicLinks/FIRDynamicLinks.m +++ b/Firebase/DynamicLinks/FIRDynamicLinks.m @@ -60,6 +60,9 @@ // We should only open url once. We use the following key to store the state in the user defaults. static NSString *const kFIRDLOpenURLKey = @"com.google.appinvite.openURL"; +// Custom domains to be whitelisted are optionally added as an array to the info.plist. +static NSString *const kInfoPlistCustomDomainsKey = @"FirebaseDynamicLinksCustomDomains"; + NS_ASSUME_NONNULL_BEGIN @interface FIRDynamicLinks () @@ -216,6 +219,12 @@ - (void)configureDynamicLinks:(FIRApp *)app { } [NSException raise:kFirebaseDurableDeepLinkErrorDomain format:@"%@", message]; } + // Check to see if FirebaseDynamicLinksCustomDomains array is present. + NSDictionary *infoDictionary = [NSBundle mainBundle].infoDictionary; + NSArray *customDomains = infoDictionary[kInfoPlistCustomDomainsKey]; + if (customDomains && customDomains.count > 0) { + FIRDLAddToWhiteListForCustomDomainsArray(customDomains); + } } - (instancetype)initWithAnalytics:(nullable id)analytics { diff --git a/Firebase/DynamicLinks/Utilities/FDLUtilities.h b/Firebase/DynamicLinks/Utilities/FDLUtilities.h index 1aa664f136f..63e20624822 100644 --- a/Firebase/DynamicLinks/Utilities/FDLUtilities.h +++ b/Firebase/DynamicLinks/Utilities/FDLUtilities.h @@ -136,4 +136,9 @@ BOOL FIRDLMatchesShortLinkFormat(NSURL *URL); */ NSString *FIRDLMatchTypeStringFromServerString(NSString *_Nullable serverMatchTypeString); +/** + Add custom domains from the info.plist to the internal whitelist. + */ +void FIRDLAddToWhiteListForCustomDomainsArray(NSArray* _Nonnull customDomains); + NS_ASSUME_NONNULL_END diff --git a/Firebase/DynamicLinks/Utilities/FDLUtilities.m b/Firebase/DynamicLinks/Utilities/FDLUtilities.m index 425e2a52909..441328fbdf3 100644 --- a/Firebase/DynamicLinks/Utilities/FDLUtilities.m +++ b/Firebase/DynamicLinks/Utilities/FDLUtilities.m @@ -32,6 +32,7 @@ NSString *const kFIRDLParameterWeakMatchEndpoint = @"invitation_weakMatchEndpoint"; NSString *const kFIRDLParameterMatchMessage = @"match_message"; NSString *const kFIRDLParameterRequestIPVersion = @"request_ip_version"; +static NSSet *FIRDLCustomDomains = nil; NSURL *FIRDLCookieRetrievalURL(NSString *urlScheme, NSString *bundleID) { static NSString *const kFDLBundleIDQueryParameterName = @"fdl_ios_bundle_id"; @@ -192,6 +193,22 @@ BOOL FIRDLOSVersionSupported(NSString *_Nullable systemVersion, NSString *minSup return timeZoneName; } +BOOL FIRDLIsURLForWhiteListedCustomDomain(NSURL *_Nullable URL) { + BOOL customDomainMatchFound = false; + for(NSURL* allowedCustomDomain in FIRDLCustomDomains) { + // All custom domain host names should match at a minimum. + if ([allowedCustomDomain.host isEqualToString:URL.host]) { + // Next, do a string compare to check if the full path matches as well. + if (([URL.absoluteString rangeOfString:allowedCustomDomain.absoluteString options:NSCaseInsensitiveSearch | NSAnchoredSearch].location) == 0) + { + customDomainMatchFound = true; + break; + } + } + } + return customDomainMatchFound; +} + BOOL FIRDLCanParseUniversalLinkURL(NSURL *_Nullable URL) { // Handle universal links with format |https://goo.gl/app/?|. // Also support page.link format. @@ -200,7 +217,11 @@ BOOL FIRDLCanParseUniversalLinkURL(NSURL *_Nullable URL) { // Handle universal links with format |https://.app.goo.gl?| and page.link. BOOL isDDLWithSubdomain = [URL.host hasSuffix:@".app.goo.gl"] || [URL.host hasSuffix:@".page.link"]; - return isDDLWithAppcodeInPath || isDDLWithSubdomain; + + // Handle universal links for custom domains. + BOOL isDDLWithCustomDomain = FIRDLIsURLForWhiteListedCustomDomain(URL); + + return isDDLWithAppcodeInPath || isDDLWithSubdomain || isDDLWithCustomDomain; } BOOL FIRDLMatchesShortLinkFormat(NSURL *URL) { @@ -227,4 +248,18 @@ BOOL FIRDLMatchesShortLinkFormat(NSURL *URL) { return matchMap[serverMatchTypeString] ?: @"none"; } +void FIRDLAddToWhiteListForCustomDomainsArray(NSArray* _Nonnull customDomains) { + // Duplicates will be weeded out when converting to a set. + NSMutableArray *validCustomDomains = [[NSMutableArray alloc] initWithCapacity:customDomains.count]; + for(NSString* customDomainEntry in customDomains) { + NSURL* customDomainURL = [NSURL URLWithString:customDomainEntry]; + // We require a valid scheme for each custom domain enumerated in the info.plist file. + if (customDomainURL && customDomainURL.scheme) { + [validCustomDomains addObject:customDomainURL]; + } + } + // Duplicates will be weeded out when converting to a set. + FIRDLCustomDomains = [NSSet setWithArray:validCustomDomains]; +} + NS_ASSUME_NONNULL_END From 0e16e6c86380523d68c692687cc199a3eff001a1 Mon Sep 17 00:00:00 2001 From: Mandar Date: Tue, 16 Oct 2018 16:24:01 -0700 Subject: [PATCH 002/102] Fix style. Run ./scripts/style.sh --- .../DynamicLinks/Tests/FIRDynamicLinksTest.m | 34 ++++++------- .../GINDurableDeepLinkServiceReceivingTests.m | 2 +- Firebase/DynamicLinks/FIRDynamicLinks.m | 51 +++++++++---------- .../DynamicLinks/Utilities/FDLUtilities.h | 2 +- .../DynamicLinks/Utilities/FDLUtilities.m | 24 +++++---- 5 files changed, 56 insertions(+), 57 deletions(-) diff --git a/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m b/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m index c72f63bdf1d..13da29c7e23 100644 --- a/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m +++ b/Example/DynamicLinks/Tests/FIRDynamicLinksTest.m @@ -1026,20 +1026,20 @@ - (void)testValidCustomDomainNames { [FIRApp configure]; NSArray *urlStrings = @[ - @"https://google.com/1", // Valid domain. Any path. - @"https://google.com/2", // Valid domain. Any path. - @"https://google.com/one", // Valid domain. Specified path. - @"https://g.co/1", // Valid domain. Any path. - @"https://a.firebase.com/mypath/",// Valid subdomain. - @"https://a.firebase.com/mypath/abcd/efgh",// Long path. - ]; + @"https://google.com/1", // Valid domain. Any path. + @"https://google.com/2", // Valid domain. Any path. + @"https://google.com/one", // Valid domain. Specified path. + @"https://g.co/1", // Valid domain. Any path. + @"https://a.firebase.com/mypath/", // Valid subdomain. + @"https://a.firebase.com/mypath/abcd/efgh", // Long path. + ]; for (NSString *urlString in urlStrings) { NSURL *url = [NSURL URLWithString:urlString]; BOOL matchesShortLinkFormat = [self.service matchesShortLinkFormat:url]; XCTAssertTrue(matchesShortLinkFormat, - @"Non-DDL domain URL matched short link format with URL: %@", url); + @"Non-DDL domain URL matched short link format with URL: %@", url); } } @@ -1053,15 +1053,15 @@ - (void)testInvalidCustomDomainNames { [FIRApp configure]; NSArray *urlStrings = @[ - @"mydomain.com", // Domain not in plist. Also, no scheme. - @"http://mydomain", // Domain not in plist. No path. - @"google.com", // Valid domain. No scheme. - @"https://google.com", // Valid domain. No path. - @"http://google.com", // Valid domain. Invalid scheme. - @"https://g.co.com/abc", //Invalid domain starts with valid domain. - @"https://firebase.com/mypath", // Invalid (sub)domain. - @"https://b.firebase.com/mypath" // Invalid subdomain. - ]; + @"mydomain.com", // Domain not in plist. Also, no scheme. + @"http://mydomain", // Domain not in plist. No path. + @"google.com", // Valid domain. No scheme. + @"https://google.com", // Valid domain. No path. + @"http://google.com", // Valid domain. Invalid scheme. + @"https://g.co.com/abc", // Invalid domain starts with valid domain. + @"https://firebase.com/mypath", // Invalid (sub)domain. + @"https://b.firebase.com/mypath" // Invalid subdomain. + ]; for (NSString *urlString in urlStrings) { NSURL *url = [NSURL URLWithString:urlString]; diff --git a/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m b/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m index 3fc5d1b45c6..9fc05eb8e6d 100644 --- a/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m +++ b/Example/DynamicLinks/Tests/GINDurableDeepLinkServiceReceivingTests.m @@ -17,8 +17,8 @@ #import #import -#import "DynamicLinks/GINDurableDeepLinkServiceReceiving+Private.h" #import +#import "DynamicLinks/GINDurableDeepLinkServiceReceiving+Private.h" @interface GINDurableDeepLinkServiceReceivingTests : XCTestCase @end diff --git a/Firebase/DynamicLinks/FIRDynamicLinks.m b/Firebase/DynamicLinks/FIRDynamicLinks.m index 79d31e2f4c2..a56bfd403db 100644 --- a/Firebase/DynamicLinks/FIRDynamicLinks.m +++ b/Firebase/DynamicLinks/FIRDynamicLinks.m @@ -41,8 +41,7 @@ #import "DynamicLinks/Utilities/FDLUtilities.h" #ifndef FIRDynamicLinks_VERSION -#error \ - "FIRDynamicLinks_VERSION is not defined: add -DFIRDynamicLinks_VERSION=... to the build \ +#error "FIRDynamicLinks_VERSION is not defined: add -DFIRDynamicLinks_VERSION=... to the build \ invocation" #endif @@ -123,8 +122,8 @@ + (void)load { + (nonnull NSArray *)componentsToRegister { // Product requirement is enforced by CocoaPod. Not technical requirement for analytics. - FIRDependency *analyticsDep = - [FIRDependency dependencyWithProtocol:@protocol(FIRAnalyticsInterop) isRequired:NO]; + FIRDependency *analyticsDep = [FIRDependency dependencyWithProtocol:@protocol(FIRAnalyticsInterop) + isRequired:NO]; FIRComponentCreationBlock creationBlock = ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { // Ensure it's cached so it returns the same instance every time dynamicLinks is called. @@ -580,8 +579,9 @@ + (NSString *)diagnosticAnalyzeEntitlements { stringByAppendingPathComponent:@"embedded.mobileprovision"]; NSError *error; - NSMutableData *profileData = - [NSMutableData dataWithContentsOfFile:embeddedMobileprovisionFilePath options:0 error:&error]; + NSMutableData *profileData = [NSMutableData dataWithContentsOfFile:embeddedMobileprovisionFilePath + options:0 + error:&error]; if (!profileData.length || error) { return @"\tSKIPPED: Not able to read entitlements (embedded.mobileprovision).\n"; @@ -672,21 +672,20 @@ + (NSString *)performDiagnosticsIncludingHeaderFooter:(BOOL)includingHeaderFoote #if TARGET_IPHONE_SIMULATOR // check is Simulator and print WARNING that Universal Links is not supported on Simulator - [diagnosticString appendString: - @"WARNING: iOS Simulator does not support Universal Links. Firebase " - @"Dynamic Links SDK functionality will be limited. Some FDL " - @"features may be missing or will not work correctly.\n"]; + [diagnosticString + appendString:@"WARNING: iOS Simulator does not support Universal Links. Firebase " + @"Dynamic Links SDK functionality will be limited. Some FDL " + @"features may be missing or will not work correctly.\n"]; #endif // TARGET_IPHONE_SIMULATOR id applicationDelegate = [UIApplication sharedApplication].delegate; if (![applicationDelegate respondsToSelector:@selector(application:openURL:options:)]) { detectedErrorsCnt++; - [diagnosticString appendFormat: - @"ERROR: UIApplication delegate %@ does not implements selector " - @"%@. FDL depends on this implementation to retrieve pending " - @"dynamic link.\n", - applicationDelegate, - NSStringFromSelector(@selector(application:openURL:options:))]; + [diagnosticString appendFormat:@"ERROR: UIApplication delegate %@ does not implements selector " + @"%@. FDL depends on this implementation to retrieve pending " + @"dynamic link.\n", + applicationDelegate, + NSStringFromSelector(@selector(application:openURL:options:))]; } // check that Info.plist has custom URL scheme and the scheme is the same as bundleID or @@ -708,16 +707,14 @@ + (NSString *)performDiagnosticsIncludingHeaderFooter:(BOOL)includingHeaderFoote } if (!URLSchemeFoundInPlist) { detectedErrorsCnt++; - [diagnosticString appendFormat: - @"ERROR: Specified custom URL scheme is %@ but Info.plist do " - @"not contain such scheme in " - "CFBundleURLTypes key.\n", - URLScheme]; + [diagnosticString appendFormat:@"ERROR: Specified custom URL scheme is %@ but Info.plist do " + @"not contain such scheme in " + "CFBundleURLTypes key.\n", + URLScheme]; } else { - [diagnosticString appendFormat: - @"\tSpecified custom URL scheme is %@ and Info.plist contains " - @"such scheme in CFBundleURLTypes key.\n", - URLScheme]; + [diagnosticString appendFormat:@"\tSpecified custom URL scheme is %@ and Info.plist contains " + @"such scheme in CFBundleURLTypes key.\n", + URLScheme]; } #if !TARGET_IPHONE_SIMULATOR @@ -748,8 +745,8 @@ + (void)performDiagnosticsWithCompletion:(void (^_Nullable)(NSString *diagnostic BOOL hasErrors))completionHandler; { NSInteger detectedErrorsCnt = 0; - NSString *diagnosticString = - [self performDiagnosticsIncludingHeaderFooter:YES detectedErrors:&detectedErrorsCnt]; + NSString *diagnosticString = [self performDiagnosticsIncludingHeaderFooter:YES + detectedErrors:&detectedErrorsCnt]; if (completionHandler) { completionHandler(diagnosticString, detectedErrorsCnt > 0); } else { diff --git a/Firebase/DynamicLinks/Utilities/FDLUtilities.h b/Firebase/DynamicLinks/Utilities/FDLUtilities.h index 63e20624822..63c570e3d20 100644 --- a/Firebase/DynamicLinks/Utilities/FDLUtilities.h +++ b/Firebase/DynamicLinks/Utilities/FDLUtilities.h @@ -139,6 +139,6 @@ NSString *FIRDLMatchTypeStringFromServerString(NSString *_Nullable serverMatchTy /** Add custom domains from the info.plist to the internal whitelist. */ -void FIRDLAddToWhiteListForCustomDomainsArray(NSArray* _Nonnull customDomains); +void FIRDLAddToWhiteListForCustomDomainsArray(NSArray *_Nonnull customDomains); NS_ASSUME_NONNULL_END diff --git a/Firebase/DynamicLinks/Utilities/FDLUtilities.m b/Firebase/DynamicLinks/Utilities/FDLUtilities.m index 441328fbdf3..16e6032993a 100644 --- a/Firebase/DynamicLinks/Utilities/FDLUtilities.m +++ b/Firebase/DynamicLinks/Utilities/FDLUtilities.m @@ -44,10 +44,10 @@ components.path = @"/app/_/deeplink"; NSMutableArray *queryItems = [NSMutableArray array]; - [queryItems - addObject:[NSURLQueryItem queryItemWithName:kFDLBundleIDQueryParameterName value:bundleID]]; - [queryItems - addObject:[NSURLQueryItem queryItemWithName:kFDLURLSchemeQueryParameterName value:urlScheme]]; + [queryItems addObject:[NSURLQueryItem queryItemWithName:kFDLBundleIDQueryParameterName + value:bundleID]]; + [queryItems addObject:[NSURLQueryItem queryItemWithName:kFDLURLSchemeQueryParameterName + value:urlScheme]]; [components setQueryItems:queryItems]; return [components URL]; @@ -195,12 +195,13 @@ BOOL FIRDLOSVersionSupported(NSString *_Nullable systemVersion, NSString *minSup BOOL FIRDLIsURLForWhiteListedCustomDomain(NSURL *_Nullable URL) { BOOL customDomainMatchFound = false; - for(NSURL* allowedCustomDomain in FIRDLCustomDomains) { + for (NSURL *allowedCustomDomain in FIRDLCustomDomains) { // All custom domain host names should match at a minimum. if ([allowedCustomDomain.host isEqualToString:URL.host]) { // Next, do a string compare to check if the full path matches as well. - if (([URL.absoluteString rangeOfString:allowedCustomDomain.absoluteString options:NSCaseInsensitiveSearch | NSAnchoredSearch].location) == 0) - { + if (([URL.absoluteString rangeOfString:allowedCustomDomain.absoluteString + options:NSCaseInsensitiveSearch | NSAnchoredSearch] + .location) == 0) { customDomainMatchFound = true; break; } @@ -248,11 +249,12 @@ BOOL FIRDLMatchesShortLinkFormat(NSURL *URL) { return matchMap[serverMatchTypeString] ?: @"none"; } -void FIRDLAddToWhiteListForCustomDomainsArray(NSArray* _Nonnull customDomains) { +void FIRDLAddToWhiteListForCustomDomainsArray(NSArray *_Nonnull customDomains) { // Duplicates will be weeded out when converting to a set. - NSMutableArray *validCustomDomains = [[NSMutableArray alloc] initWithCapacity:customDomains.count]; - for(NSString* customDomainEntry in customDomains) { - NSURL* customDomainURL = [NSURL URLWithString:customDomainEntry]; + NSMutableArray *validCustomDomains = + [[NSMutableArray alloc] initWithCapacity:customDomains.count]; + for (NSString *customDomainEntry in customDomains) { + NSURL *customDomainURL = [NSURL URLWithString:customDomainEntry]; // We require a valid scheme for each custom domain enumerated in the info.plist file. if (customDomainURL && customDomainURL.scheme) { [validCustomDomains addObject:customDomainURL]; From e41acdb341a6d238ce1c53c1c2afb50d982ae2be Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Tue, 16 Oct 2018 17:40:42 -0700 Subject: [PATCH 003/102] style --- Firebase/DynamicLinks/FIRDynamicLinks.m | 51 ++++++++++--------- .../DynamicLinks/Utilities/FDLUtilities.m | 8 +-- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/Firebase/DynamicLinks/FIRDynamicLinks.m b/Firebase/DynamicLinks/FIRDynamicLinks.m index a56bfd403db..79d31e2f4c2 100644 --- a/Firebase/DynamicLinks/FIRDynamicLinks.m +++ b/Firebase/DynamicLinks/FIRDynamicLinks.m @@ -41,7 +41,8 @@ #import "DynamicLinks/Utilities/FDLUtilities.h" #ifndef FIRDynamicLinks_VERSION -#error "FIRDynamicLinks_VERSION is not defined: add -DFIRDynamicLinks_VERSION=... to the build \ +#error \ + "FIRDynamicLinks_VERSION is not defined: add -DFIRDynamicLinks_VERSION=... to the build \ invocation" #endif @@ -122,8 +123,8 @@ + (void)load { + (nonnull NSArray *)componentsToRegister { // Product requirement is enforced by CocoaPod. Not technical requirement for analytics. - FIRDependency *analyticsDep = [FIRDependency dependencyWithProtocol:@protocol(FIRAnalyticsInterop) - isRequired:NO]; + FIRDependency *analyticsDep = + [FIRDependency dependencyWithProtocol:@protocol(FIRAnalyticsInterop) isRequired:NO]; FIRComponentCreationBlock creationBlock = ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { // Ensure it's cached so it returns the same instance every time dynamicLinks is called. @@ -579,9 +580,8 @@ + (NSString *)diagnosticAnalyzeEntitlements { stringByAppendingPathComponent:@"embedded.mobileprovision"]; NSError *error; - NSMutableData *profileData = [NSMutableData dataWithContentsOfFile:embeddedMobileprovisionFilePath - options:0 - error:&error]; + NSMutableData *profileData = + [NSMutableData dataWithContentsOfFile:embeddedMobileprovisionFilePath options:0 error:&error]; if (!profileData.length || error) { return @"\tSKIPPED: Not able to read entitlements (embedded.mobileprovision).\n"; @@ -672,20 +672,21 @@ + (NSString *)performDiagnosticsIncludingHeaderFooter:(BOOL)includingHeaderFoote #if TARGET_IPHONE_SIMULATOR // check is Simulator and print WARNING that Universal Links is not supported on Simulator - [diagnosticString - appendString:@"WARNING: iOS Simulator does not support Universal Links. Firebase " - @"Dynamic Links SDK functionality will be limited. Some FDL " - @"features may be missing or will not work correctly.\n"]; + [diagnosticString appendString: + @"WARNING: iOS Simulator does not support Universal Links. Firebase " + @"Dynamic Links SDK functionality will be limited. Some FDL " + @"features may be missing or will not work correctly.\n"]; #endif // TARGET_IPHONE_SIMULATOR id applicationDelegate = [UIApplication sharedApplication].delegate; if (![applicationDelegate respondsToSelector:@selector(application:openURL:options:)]) { detectedErrorsCnt++; - [diagnosticString appendFormat:@"ERROR: UIApplication delegate %@ does not implements selector " - @"%@. FDL depends on this implementation to retrieve pending " - @"dynamic link.\n", - applicationDelegate, - NSStringFromSelector(@selector(application:openURL:options:))]; + [diagnosticString appendFormat: + @"ERROR: UIApplication delegate %@ does not implements selector " + @"%@. FDL depends on this implementation to retrieve pending " + @"dynamic link.\n", + applicationDelegate, + NSStringFromSelector(@selector(application:openURL:options:))]; } // check that Info.plist has custom URL scheme and the scheme is the same as bundleID or @@ -707,14 +708,16 @@ + (NSString *)performDiagnosticsIncludingHeaderFooter:(BOOL)includingHeaderFoote } if (!URLSchemeFoundInPlist) { detectedErrorsCnt++; - [diagnosticString appendFormat:@"ERROR: Specified custom URL scheme is %@ but Info.plist do " - @"not contain such scheme in " - "CFBundleURLTypes key.\n", - URLScheme]; + [diagnosticString appendFormat: + @"ERROR: Specified custom URL scheme is %@ but Info.plist do " + @"not contain such scheme in " + "CFBundleURLTypes key.\n", + URLScheme]; } else { - [diagnosticString appendFormat:@"\tSpecified custom URL scheme is %@ and Info.plist contains " - @"such scheme in CFBundleURLTypes key.\n", - URLScheme]; + [diagnosticString appendFormat: + @"\tSpecified custom URL scheme is %@ and Info.plist contains " + @"such scheme in CFBundleURLTypes key.\n", + URLScheme]; } #if !TARGET_IPHONE_SIMULATOR @@ -745,8 +748,8 @@ + (void)performDiagnosticsWithCompletion:(void (^_Nullable)(NSString *diagnostic BOOL hasErrors))completionHandler; { NSInteger detectedErrorsCnt = 0; - NSString *diagnosticString = [self performDiagnosticsIncludingHeaderFooter:YES - detectedErrors:&detectedErrorsCnt]; + NSString *diagnosticString = + [self performDiagnosticsIncludingHeaderFooter:YES detectedErrors:&detectedErrorsCnt]; if (completionHandler) { completionHandler(diagnosticString, detectedErrorsCnt > 0); } else { diff --git a/Firebase/DynamicLinks/Utilities/FDLUtilities.m b/Firebase/DynamicLinks/Utilities/FDLUtilities.m index 16e6032993a..8217bb489e8 100644 --- a/Firebase/DynamicLinks/Utilities/FDLUtilities.m +++ b/Firebase/DynamicLinks/Utilities/FDLUtilities.m @@ -44,10 +44,10 @@ components.path = @"/app/_/deeplink"; NSMutableArray *queryItems = [NSMutableArray array]; - [queryItems addObject:[NSURLQueryItem queryItemWithName:kFDLBundleIDQueryParameterName - value:bundleID]]; - [queryItems addObject:[NSURLQueryItem queryItemWithName:kFDLURLSchemeQueryParameterName - value:urlScheme]]; + [queryItems + addObject:[NSURLQueryItem queryItemWithName:kFDLBundleIDQueryParameterName value:bundleID]]; + [queryItems + addObject:[NSURLQueryItem queryItemWithName:kFDLURLSchemeQueryParameterName value:urlScheme]]; [components setQueryItems:queryItems]; return [components URL]; From 9fe54ed34b1dc607715be872657a6a8a9d402ff6 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Wed, 17 Oct 2018 11:25:40 -0400 Subject: [PATCH 004/102] Update versions for Release 5.11.0 --- Example/Podfile | 2 +- Firebase/Core/FIROptions.m | 2 +- FirebaseCore.podspec | 4 ++-- FirebaseFirestore.podspec | 2 +- FirebaseMessaging.podspec | 2 +- Firestore/Example/Podfile | 2 +- Releases/Manifests/5.11.0.json | 6 ++++++ 7 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 Releases/Manifests/5.11.0.json diff --git a/Example/Podfile b/Example/Podfile index ff33c88de9b..672b4da9351 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -15,7 +15,7 @@ target 'Core_Example_iOS' do # The next line is the forcing function for the Firebase pod. The Firebase # version's subspecs should depend on the component versions in their # corresponding podspec's. - pod 'Firebase/CoreOnly', '5.10.0' + pod 'Firebase/CoreOnly', '5.11.0' target 'Core_Tests_iOS' do inherit! :search_paths diff --git a/Firebase/Core/FIROptions.m b/Firebase/Core/FIROptions.m index 764c8a3ad6d..460554dc8f3 100644 --- a/Firebase/Core/FIROptions.m +++ b/Firebase/Core/FIROptions.m @@ -43,7 +43,7 @@ NSString *const kFIRLibraryVersionID = @"5" // Major version (one or more digits) @"01" // Minor version (exactly 2 digits) - @"05" // Build number (exactly 2 digits) + @"06" // Build number (exactly 2 digits) @"000"; // Fixed "000" // Plist file name. NSString *const kServiceInfoFileName = @"GoogleService-Info"; diff --git a/FirebaseCore.podspec b/FirebaseCore.podspec index cba4f871aa8..b29a84bdff3 100644 --- a/FirebaseCore.podspec +++ b/FirebaseCore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'FirebaseCore' - s.version = '5.1.5' + s.version = '5.1.6' s.summary = 'Firebase Core for iOS (plus community support for macOS and tvOS)' s.description = <<-DESC @@ -34,6 +34,6 @@ Firebase Core includes FIRApp and FIROptions which provide central configuration s.pod_target_xcconfig = { 'OTHER_CFLAGS' => '-fno-autolink', 'GCC_PREPROCESSOR_DEFINITIONS' => - 'FIRCore_VERSION=' + s.version.to_s + ' Firebase_VERSION=5.10.0' + 'FIRCore_VERSION=' + s.version.to_s + ' Firebase_VERSION=5.11.0' } end diff --git a/FirebaseFirestore.podspec b/FirebaseFirestore.podspec index 97013618600..cbdba6d7fbb 100644 --- a/FirebaseFirestore.podspec +++ b/FirebaseFirestore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'FirebaseFirestore' - s.version = '0.13.5' + s.version = '0.13.6' s.summary = 'Google Cloud Firestore for iOS' s.description = <<-DESC diff --git a/FirebaseMessaging.podspec b/FirebaseMessaging.podspec index bacedf639db..978a38acb4f 100644 --- a/FirebaseMessaging.podspec +++ b/FirebaseMessaging.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'FirebaseMessaging' - s.version = '3.2.0' + s.version = '3.2.1' s.summary = 'Firebase Messaging for iOS' s.description = <<-DESC diff --git a/Firestore/Example/Podfile b/Firestore/Example/Podfile index 921c5b76c64..e2488583a53 100644 --- a/Firestore/Example/Podfile +++ b/Firestore/Example/Podfile @@ -10,7 +10,7 @@ target 'Firestore_Example_iOS' do # The next line is the forcing function for the Firebase pod. The Firebase # version's subspecs should depend on the component versions in their # corresponding podspec's. - pod 'Firebase/CoreOnly', '5.10.0' + pod 'Firebase/CoreOnly', '5.11.0' pod 'FirebaseAuth', :path => '../../' pod 'FirebaseAuthInterop', :path => '../../' diff --git a/Releases/Manifests/5.11.0.json b/Releases/Manifests/5.11.0.json new file mode 100644 index 00000000000..69c2ccc9159 --- /dev/null +++ b/Releases/Manifests/5.11.0.json @@ -0,0 +1,6 @@ +{ + "FirebaseCore":"5.1.6", + "FirebaseMessaging":"3.2.1", + "FirebaseFirestore":"0.13.6", + "FirebaseAnalyticsInterop":"1.1.0" +} From 91297fdec072f2ecf311901cc5a27238a80c09bf Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Fri, 19 Oct 2018 13:27:58 -0700 Subject: [PATCH 005/102] Update Firestore Generated Protos (#1972) --- .../cpp/firestore/local/maybe_document.pb.cc | 474 +++++++++++++++++- .../cpp/firestore/local/maybe_document.pb.h | 304 ++++++++++- .../firestore/local/maybe_document.nanopb.c | 14 +- .../firestore/local/maybe_document.nanopb.h | 24 +- .../firestore/local/MaybeDocument.pbobjc.h | 46 +- .../firestore/local/MaybeDocument.pbobjc.m | 75 +++ .../objc/firestore/local/Target.pbobjc.h | 2 + 7 files changed, 918 insertions(+), 21 deletions(-) diff --git a/Firestore/Protos/cpp/firestore/local/maybe_document.pb.cc b/Firestore/Protos/cpp/firestore/local/maybe_document.pb.cc index 04f2b261c75..c4913254e0c 100644 --- a/Firestore/Protos/cpp/firestore/local/maybe_document.pb.cc +++ b/Firestore/Protos/cpp/firestore/local/maybe_document.pb.cc @@ -42,12 +42,18 @@ class NoDocumentDefaultTypeInternal { ::google::protobuf::internal::ExplicitlyConstructed _instance; } _NoDocument_default_instance_; +class UnknownDocumentDefaultTypeInternal { + public: + ::google::protobuf::internal::ExplicitlyConstructed + _instance; +} _UnknownDocument_default_instance_; class MaybeDocumentDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; const ::firestore::client::NoDocument* no_document_; const ::google::firestore::v1beta1::Document* document_; + const ::firestore::client::UnknownDocument* unknown_document_; } _MaybeDocument_default_instance_; } // namespace client } // namespace firestore @@ -74,6 +80,28 @@ void InitDefaultsNoDocument() { ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsNoDocumentImpl); } +void InitDefaultsUnknownDocumentImpl() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + +#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS + ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); +#else + ::google::protobuf::internal::InitProtobufDefaults(); +#endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS + protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestamp(); + { + void* ptr = &::firestore::client::_UnknownDocument_default_instance_; + new (ptr) ::firestore::client::UnknownDocument(); + ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); + } + ::firestore::client::UnknownDocument::InitAsDefaultInstance(); +} + +void InitDefaultsUnknownDocument() { + static GOOGLE_PROTOBUF_DECLARE_ONCE(once); + ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsUnknownDocumentImpl); +} + void InitDefaultsMaybeDocumentImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -84,6 +112,7 @@ void InitDefaultsMaybeDocumentImpl() { #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::InitDefaultsNoDocument(); protobuf_google_2ffirestore_2fv1beta1_2fdocument_2eproto::InitDefaultsDocument(); + protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::InitDefaultsUnknownDocument(); { void* ptr = &::firestore::client::_MaybeDocument_default_instance_; new (ptr) ::firestore::client::MaybeDocument(); @@ -97,7 +126,7 @@ void InitDefaultsMaybeDocument() { ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMaybeDocumentImpl); } -::google::protobuf::Metadata file_level_metadata[2]; +::google::protobuf::Metadata file_level_metadata[3]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ @@ -108,21 +137,32 @@ const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUT GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::NoDocument, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::NoDocument, read_time_), ~0u, // no _has_bits_ + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::UnknownDocument, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::UnknownDocument, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::UnknownDocument, version_), + ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::MaybeDocument, _internal_metadata_), ~0u, // no _extensions_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::MaybeDocument, _oneof_case_[0]), ~0u, // no _weak_field_map_ offsetof(::firestore::client::MaybeDocumentDefaultTypeInternal, no_document_), offsetof(::firestore::client::MaybeDocumentDefaultTypeInternal, document_), + offsetof(::firestore::client::MaybeDocumentDefaultTypeInternal, unknown_document_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::MaybeDocument, has_committed_mutations_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::firestore::client::MaybeDocument, document_type_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::firestore::client::NoDocument)}, - { 7, -1, sizeof(::firestore::client::MaybeDocument)}, + { 7, -1, sizeof(::firestore::client::UnknownDocument)}, + { 14, -1, sizeof(::firestore::client::MaybeDocument)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::firestore::client::_NoDocument_default_instance_), + reinterpret_cast(&::firestore::client::_UnknownDocument_default_instance_), reinterpret_cast(&::firestore::client::_MaybeDocument_default_instance_), }; @@ -142,7 +182,7 @@ void protobuf_AssignDescriptorsOnce() { void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); - ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 2); + ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 3); } void AddDescriptorsImpl() { @@ -153,15 +193,19 @@ void AddDescriptorsImpl() { "a1/document.proto\032\037google/protobuf/times" "tamp.proto\"I\n\nNoDocument\022\014\n\004name\030\001 \001(\t\022-" "\n\tread_time\030\002 \001(\0132\032.google.protobuf.Time" - "stamp\"\215\001\n\rMaybeDocument\0223\n\013no_document\030\001" - " \001(\0132\034.firestore.client.NoDocumentH\000\0226\n\010" - "document\030\002 \001(\0132\".google.firestore.v1beta" - "1.DocumentH\000B\017\n\rdocument_typeB/\n#com.goo" - "gle.firebase.firestore.protoP\001\242\002\005FSTPBb\006" - "proto3" + "stamp\"L\n\017UnknownDocument\022\014\n\004name\030\001 \001(\t\022+" + "\n\007version\030\002 \001(\0132\032.google.protobuf.Timest" + "amp\"\355\001\n\rMaybeDocument\0223\n\013no_document\030\001 \001" + "(\0132\034.firestore.client.NoDocumentH\000\0226\n\010do" + "cument\030\002 \001(\0132\".google.firestore.v1beta1." + "DocumentH\000\022=\n\020unknown_document\030\003 \001(\0132!.f" + "irestore.client.UnknownDocumentH\000\022\037\n\027has" + "_committed_mutations\030\004 \001(\010B\017\n\rdocument_t" + "ypeB/\n#com.google.firebase.firestore.pro" + "toP\001\242\002\005FSTPBb\006proto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( - descriptor, 406); + descriptor, 580); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "firestore/local/maybe_document.proto", &protobuf_RegisterTypes); ::protobuf_google_2ffirestore_2fv1beta1_2fdocument_2eproto::AddDescriptors(); @@ -494,6 +538,318 @@ ::google::protobuf::Metadata NoDocument::GetMetadata() const { } +// =================================================================== + +void UnknownDocument::InitAsDefaultInstance() { + ::firestore::client::_UnknownDocument_default_instance_._instance.get_mutable()->version_ = const_cast< ::google::protobuf::Timestamp*>( + ::google::protobuf::Timestamp::internal_default_instance()); +} +void UnknownDocument::clear_version() { + if (GetArenaNoVirtual() == NULL && version_ != NULL) { + delete version_; + } + version_ = NULL; +} +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int UnknownDocument::kNameFieldNumber; +const int UnknownDocument::kVersionFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +UnknownDocument::UnknownDocument() + : ::google::protobuf::Message(), _internal_metadata_(NULL) { + if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { + ::protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::InitDefaultsUnknownDocument(); + } + SharedCtor(); + // @@protoc_insertion_point(constructor:firestore.client.UnknownDocument) +} +UnknownDocument::UnknownDocument(const UnknownDocument& from) + : ::google::protobuf::Message(), + _internal_metadata_(NULL), + _cached_size_(0) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (from.name().size() > 0) { + name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); + } + if (from.has_version()) { + version_ = new ::google::protobuf::Timestamp(*from.version_); + } else { + version_ = NULL; + } + // @@protoc_insertion_point(copy_constructor:firestore.client.UnknownDocument) +} + +void UnknownDocument::SharedCtor() { + name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + version_ = NULL; + _cached_size_ = 0; +} + +UnknownDocument::~UnknownDocument() { + // @@protoc_insertion_point(destructor:firestore.client.UnknownDocument) + SharedDtor(); +} + +void UnknownDocument::SharedDtor() { + name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (this != internal_default_instance()) delete version_; +} + +void UnknownDocument::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* UnknownDocument::descriptor() { + ::protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::protobuf_AssignDescriptorsOnce(); + return ::protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; +} + +const UnknownDocument& UnknownDocument::default_instance() { + ::protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::InitDefaultsUnknownDocument(); + return *internal_default_instance(); +} + +UnknownDocument* UnknownDocument::New(::google::protobuf::Arena* arena) const { + UnknownDocument* n = new UnknownDocument; + if (arena != NULL) { + arena->Own(n); + } + return n; +} + +void UnknownDocument::Clear() { +// @@protoc_insertion_point(message_clear_start:firestore.client.UnknownDocument) + ::google::protobuf::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (GetArenaNoVirtual() == NULL && version_ != NULL) { + delete version_; + } + version_ = NULL; + _internal_metadata_.Clear(); +} + +bool UnknownDocument::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:firestore.client.UnknownDocument) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // string name = 1; + case 1: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->name().data(), static_cast(this->name().length()), + ::google::protobuf::internal::WireFormatLite::PARSE, + "firestore.client.UnknownDocument.name")); + } else { + goto handle_unusual; + } + break; + } + + // .google.protobuf.Timestamp version = 2; + case 2: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, mutable_version())); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:firestore.client.UnknownDocument) + return true; +failure: + // @@protoc_insertion_point(parse_failure:firestore.client.UnknownDocument) + return false; +#undef DO_ +} + +void UnknownDocument::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:firestore.client.UnknownDocument) + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string name = 1; + if (this->name().size() > 0) { + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->name().data(), static_cast(this->name().length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, + "firestore.client.UnknownDocument.name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // .google.protobuf.Timestamp version = 2; + if (this->has_version()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, *this->version_, output); + } + + if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); + } + // @@protoc_insertion_point(serialize_end:firestore.client.UnknownDocument) +} + +::google::protobuf::uint8* UnknownDocument::InternalSerializeWithCachedSizesToArray( + bool deterministic, ::google::protobuf::uint8* target) const { + (void)deterministic; // Unused + // @@protoc_insertion_point(serialize_to_array_start:firestore.client.UnknownDocument) + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string name = 1; + if (this->name().size() > 0) { + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->name().data(), static_cast(this->name().length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, + "firestore.client.UnknownDocument.name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // .google.protobuf.Timestamp version = 2; + if (this->has_version()) { + target = ::google::protobuf::internal::WireFormatLite:: + InternalWriteMessageToArray( + 2, *this->version_, deterministic, target); + } + + if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:firestore.client.UnknownDocument) + return target; +} + +size_t UnknownDocument::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:firestore.client.UnknownDocument) + size_t total_size = 0; + + if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); + } + // string name = 1; + if (this->name().size() > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // .google.protobuf.Timestamp version = 2; + if (this->has_version()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize( + *this->version_); + } + + int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = cached_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void UnknownDocument::MergeFrom(const ::google::protobuf::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:firestore.client.UnknownDocument) + GOOGLE_DCHECK_NE(&from, this); + const UnknownDocument* source = + ::google::protobuf::internal::DynamicCastToGenerated( + &from); + if (source == NULL) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:firestore.client.UnknownDocument) + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:firestore.client.UnknownDocument) + MergeFrom(*source); + } +} + +void UnknownDocument::MergeFrom(const UnknownDocument& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:firestore.client.UnknownDocument) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.name().size() > 0) { + + name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); + } + if (from.has_version()) { + mutable_version()->::google::protobuf::Timestamp::MergeFrom(from.version()); + } +} + +void UnknownDocument::CopyFrom(const ::google::protobuf::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:firestore.client.UnknownDocument) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void UnknownDocument::CopyFrom(const UnknownDocument& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:firestore.client.UnknownDocument) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool UnknownDocument::IsInitialized() const { + return true; +} + +void UnknownDocument::Swap(UnknownDocument* other) { + if (other == this) return; + InternalSwap(other); +} +void UnknownDocument::InternalSwap(UnknownDocument* other) { + using std::swap; + name_.Swap(&other->name_); + swap(version_, other->version_); + _internal_metadata_.Swap(&other->_internal_metadata_); + swap(_cached_size_, other->_cached_size_); +} + +::google::protobuf::Metadata UnknownDocument::GetMetadata() const { + protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::protobuf_AssignDescriptorsOnce(); + return ::protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::file_level_metadata[kIndexInFileMessages]; +} + + // =================================================================== void MaybeDocument::InitAsDefaultInstance() { @@ -501,6 +857,8 @@ void MaybeDocument::InitAsDefaultInstance() { ::firestore::client::NoDocument::internal_default_instance()); ::firestore::client::_MaybeDocument_default_instance_.document_ = const_cast< ::google::firestore::v1beta1::Document*>( ::google::firestore::v1beta1::Document::internal_default_instance()); + ::firestore::client::_MaybeDocument_default_instance_.unknown_document_ = const_cast< ::firestore::client::UnknownDocument*>( + ::firestore::client::UnknownDocument::internal_default_instance()); } void MaybeDocument::set_allocated_no_document(::firestore::client::NoDocument* no_document) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); @@ -536,9 +894,25 @@ void MaybeDocument::clear_document() { clear_has_document_type(); } } +void MaybeDocument::set_allocated_unknown_document(::firestore::client::UnknownDocument* unknown_document) { + ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); + clear_document_type(); + if (unknown_document) { + ::google::protobuf::Arena* submessage_arena = NULL; + if (message_arena != submessage_arena) { + unknown_document = ::google::protobuf::internal::GetOwnedMessage( + message_arena, unknown_document, submessage_arena); + } + set_has_unknown_document(); + document_type_.unknown_document_ = unknown_document; + } + // @@protoc_insertion_point(field_set_allocated:firestore.client.MaybeDocument.unknown_document) +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int MaybeDocument::kNoDocumentFieldNumber; const int MaybeDocument::kDocumentFieldNumber; +const int MaybeDocument::kUnknownDocumentFieldNumber; +const int MaybeDocument::kHasCommittedMutationsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 MaybeDocument::MaybeDocument() @@ -554,6 +928,7 @@ MaybeDocument::MaybeDocument(const MaybeDocument& from) _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); + has_committed_mutations_ = from.has_committed_mutations_; clear_has_document_type(); switch (from.document_type_case()) { case kNoDocument: { @@ -564,6 +939,10 @@ MaybeDocument::MaybeDocument(const MaybeDocument& from) mutable_document()->::google::firestore::v1beta1::Document::MergeFrom(from.document()); break; } + case kUnknownDocument: { + mutable_unknown_document()->::firestore::client::UnknownDocument::MergeFrom(from.unknown_document()); + break; + } case DOCUMENT_TYPE_NOT_SET: { break; } @@ -572,6 +951,7 @@ MaybeDocument::MaybeDocument(const MaybeDocument& from) } void MaybeDocument::SharedCtor() { + has_committed_mutations_ = false; clear_has_document_type(); _cached_size_ = 0; } @@ -621,6 +1001,10 @@ void MaybeDocument::clear_document_type() { delete document_type_.document_; break; } + case kUnknownDocument: { + delete document_type_.unknown_document_; + break; + } case DOCUMENT_TYPE_NOT_SET: { break; } @@ -635,6 +1019,7 @@ void MaybeDocument::Clear() { // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; + has_committed_mutations_ = false; clear_document_type(); _internal_metadata_.Clear(); } @@ -673,6 +1058,32 @@ bool MaybeDocument::MergePartialFromCodedStream( break; } + // .firestore.client.UnknownDocument unknown_document = 3; + case 3: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, mutable_unknown_document())); + } else { + goto handle_unusual; + } + break; + } + + // bool has_committed_mutations = 4; + case 4: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) { + + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &has_committed_mutations_))); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -711,6 +1122,17 @@ void MaybeDocument::SerializeWithCachedSizes( 2, *document_type_.document_, output); } + // .firestore.client.UnknownDocument unknown_document = 3; + if (has_unknown_document()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, *document_type_.unknown_document_, output); + } + + // bool has_committed_mutations = 4; + if (this->has_committed_mutations() != 0) { + ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->has_committed_mutations(), output); + } + if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); @@ -739,6 +1161,18 @@ ::google::protobuf::uint8* MaybeDocument::InternalSerializeWithCachedSizesToArra 2, *document_type_.document_, deterministic, target); } + // .firestore.client.UnknownDocument unknown_document = 3; + if (has_unknown_document()) { + target = ::google::protobuf::internal::WireFormatLite:: + InternalWriteMessageToArray( + 3, *document_type_.unknown_document_, deterministic, target); + } + + // bool has_committed_mutations = 4; + if (this->has_committed_mutations() != 0) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(4, this->has_committed_mutations(), target); + } + if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); @@ -756,6 +1190,11 @@ size_t MaybeDocument::ByteSizeLong() const { ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } + // bool has_committed_mutations = 4; + if (this->has_committed_mutations() != 0) { + total_size += 1 + 1; + } + switch (document_type_case()) { // .firestore.client.NoDocument no_document = 1; case kNoDocument: { @@ -771,6 +1210,13 @@ size_t MaybeDocument::ByteSizeLong() const { *document_type_.document_); break; } + // .firestore.client.UnknownDocument unknown_document = 3; + case kUnknownDocument: { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize( + *document_type_.unknown_document_); + break; + } case DOCUMENT_TYPE_NOT_SET: { break; } @@ -804,6 +1250,9 @@ void MaybeDocument::MergeFrom(const MaybeDocument& from) { ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; + if (from.has_committed_mutations() != 0) { + set_has_committed_mutations(from.has_committed_mutations()); + } switch (from.document_type_case()) { case kNoDocument: { mutable_no_document()->::firestore::client::NoDocument::MergeFrom(from.no_document()); @@ -813,6 +1262,10 @@ void MaybeDocument::MergeFrom(const MaybeDocument& from) { mutable_document()->::google::firestore::v1beta1::Document::MergeFrom(from.document()); break; } + case kUnknownDocument: { + mutable_unknown_document()->::firestore::client::UnknownDocument::MergeFrom(from.unknown_document()); + break; + } case DOCUMENT_TYPE_NOT_SET: { break; } @@ -843,6 +1296,7 @@ void MaybeDocument::Swap(MaybeDocument* other) { } void MaybeDocument::InternalSwap(MaybeDocument* other) { using std::swap; + swap(has_committed_mutations_, other->has_committed_mutations_); swap(document_type_, other->document_type_); swap(_oneof_case_[0], other->_oneof_case_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); diff --git a/Firestore/Protos/cpp/firestore/local/maybe_document.pb.h b/Firestore/Protos/cpp/firestore/local/maybe_document.pb.h index 66ae01955e4..56c7408952e 100644 --- a/Firestore/Protos/cpp/firestore/local/maybe_document.pb.h +++ b/Firestore/Protos/cpp/firestore/local/maybe_document.pb.h @@ -54,7 +54,7 @@ namespace protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto { struct TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; - static const ::google::protobuf::internal::ParseTable schema[2]; + static const ::google::protobuf::internal::ParseTable schema[3]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; @@ -62,10 +62,13 @@ struct TableStruct { void AddDescriptors(); void InitDefaultsNoDocumentImpl(); void InitDefaultsNoDocument(); +void InitDefaultsUnknownDocumentImpl(); +void InitDefaultsUnknownDocument(); void InitDefaultsMaybeDocumentImpl(); void InitDefaultsMaybeDocument(); inline void InitDefaults() { InitDefaultsNoDocument(); + InitDefaultsUnknownDocument(); InitDefaultsMaybeDocument(); } } // namespace protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto @@ -77,6 +80,9 @@ extern MaybeDocumentDefaultTypeInternal _MaybeDocument_default_instance_; class NoDocument; class NoDocumentDefaultTypeInternal; extern NoDocumentDefaultTypeInternal _NoDocument_default_instance_; +class UnknownDocument; +class UnknownDocumentDefaultTypeInternal; +extern UnknownDocumentDefaultTypeInternal _UnknownDocument_default_instance_; } // namespace client } // namespace firestore namespace firestore { @@ -201,6 +207,123 @@ class NoDocument : public ::google::protobuf::Message /* @@protoc_insertion_poin }; // ------------------------------------------------------------------- +class UnknownDocument : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:firestore.client.UnknownDocument) */ { + public: + UnknownDocument(); + virtual ~UnknownDocument(); + + UnknownDocument(const UnknownDocument& from); + + inline UnknownDocument& operator=(const UnknownDocument& from) { + CopyFrom(from); + return *this; + } + #if LANG_CXX11 + UnknownDocument(UnknownDocument&& from) noexcept + : UnknownDocument() { + *this = ::std::move(from); + } + + inline UnknownDocument& operator=(UnknownDocument&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + #endif + static const ::google::protobuf::Descriptor* descriptor(); + static const UnknownDocument& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const UnknownDocument* internal_default_instance() { + return reinterpret_cast( + &_UnknownDocument_default_instance_); + } + static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = + 1; + + void Swap(UnknownDocument* other); + friend void swap(UnknownDocument& a, UnknownDocument& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline UnknownDocument* New() const PROTOBUF_FINAL { return New(NULL); } + + UnknownDocument* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; + void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; + void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; + void CopyFrom(const UnknownDocument& from); + void MergeFrom(const UnknownDocument& from); + void Clear() PROTOBUF_FINAL; + bool IsInitialized() const PROTOBUF_FINAL; + + size_t ByteSizeLong() const PROTOBUF_FINAL; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; + ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( + bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; + int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const PROTOBUF_FINAL; + void InternalSwap(UnknownDocument* other); + private: + inline ::google::protobuf::Arena* GetArenaNoVirtual() const { + return NULL; + } + inline void* MaybeArenaPtr() const { + return NULL; + } + public: + + ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string name = 1; + void clear_name(); + static const int kNameFieldNumber = 1; + const ::std::string& name() const; + void set_name(const ::std::string& value); + #if LANG_CXX11 + void set_name(::std::string&& value); + #endif + void set_name(const char* value); + void set_name(const char* value, size_t size); + ::std::string* mutable_name(); + ::std::string* release_name(); + void set_allocated_name(::std::string* name); + + // .google.protobuf.Timestamp version = 2; + bool has_version() const; + void clear_version(); + static const int kVersionFieldNumber = 2; + const ::google::protobuf::Timestamp& version() const; + ::google::protobuf::Timestamp* release_version(); + ::google::protobuf::Timestamp* mutable_version(); + void set_allocated_version(::google::protobuf::Timestamp* version); + + // @@protoc_insertion_point(class_scope:firestore.client.UnknownDocument) + private: + + ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; + ::google::protobuf::internal::ArenaStringPtr name_; + ::google::protobuf::Timestamp* version_; + mutable int _cached_size_; + friend struct ::protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::TableStruct; + friend void ::protobuf_firestore_2flocal_2fmaybe_5fdocument_2eproto::InitDefaultsUnknownDocumentImpl(); +}; +// ------------------------------------------------------------------- + class MaybeDocument : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:firestore.client.MaybeDocument) */ { public: MaybeDocument(); @@ -233,6 +356,7 @@ class MaybeDocument : public ::google::protobuf::Message /* @@protoc_insertion_p enum DocumentTypeCase { kNoDocument = 1, kDocument = 2, + kUnknownDocument = 3, DOCUMENT_TYPE_NOT_SET = 0, }; @@ -242,7 +366,7 @@ class MaybeDocument : public ::google::protobuf::Message /* @@protoc_insertion_p &_MaybeDocument_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = - 1; + 2; void Swap(MaybeDocument* other); friend void swap(MaybeDocument& a, MaybeDocument& b) { @@ -289,6 +413,12 @@ class MaybeDocument : public ::google::protobuf::Message /* @@protoc_insertion_p // accessors ------------------------------------------------------- + // bool has_committed_mutations = 4; + void clear_has_committed_mutations(); + static const int kHasCommittedMutationsFieldNumber = 4; + bool has_committed_mutations() const; + void set_has_committed_mutations(bool value); + // .firestore.client.NoDocument no_document = 1; bool has_no_document() const; void clear_no_document(); @@ -307,21 +437,33 @@ class MaybeDocument : public ::google::protobuf::Message /* @@protoc_insertion_p ::google::firestore::v1beta1::Document* mutable_document(); void set_allocated_document(::google::firestore::v1beta1::Document* document); + // .firestore.client.UnknownDocument unknown_document = 3; + bool has_unknown_document() const; + void clear_unknown_document(); + static const int kUnknownDocumentFieldNumber = 3; + const ::firestore::client::UnknownDocument& unknown_document() const; + ::firestore::client::UnknownDocument* release_unknown_document(); + ::firestore::client::UnknownDocument* mutable_unknown_document(); + void set_allocated_unknown_document(::firestore::client::UnknownDocument* unknown_document); + DocumentTypeCase document_type_case() const; // @@protoc_insertion_point(class_scope:firestore.client.MaybeDocument) private: void set_has_no_document(); void set_has_document(); + void set_has_unknown_document(); inline bool has_document_type() const; void clear_document_type(); inline void clear_has_document_type(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; + bool has_committed_mutations_; union DocumentTypeUnion { DocumentTypeUnion() {} ::firestore::client::NoDocument* no_document_; ::google::firestore::v1beta1::Document* document_; + ::firestore::client::UnknownDocument* unknown_document_; } document_type_; mutable int _cached_size_; ::google::protobuf::uint32 _oneof_case_[1]; @@ -440,6 +582,108 @@ inline void NoDocument::set_allocated_read_time(::google::protobuf::Timestamp* r // ------------------------------------------------------------------- +// UnknownDocument + +// string name = 1; +inline void UnknownDocument::clear_name() { + name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline const ::std::string& UnknownDocument::name() const { + // @@protoc_insertion_point(field_get:firestore.client.UnknownDocument.name) + return name_.GetNoArena(); +} +inline void UnknownDocument::set_name(const ::std::string& value) { + + name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:firestore.client.UnknownDocument.name) +} +#if LANG_CXX11 +inline void UnknownDocument::set_name(::std::string&& value) { + + name_.SetNoArena( + &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:firestore.client.UnknownDocument.name) +} +#endif +inline void UnknownDocument::set_name(const char* value) { + GOOGLE_DCHECK(value != NULL); + + name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:firestore.client.UnknownDocument.name) +} +inline void UnknownDocument::set_name(const char* value, size_t size) { + + name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:firestore.client.UnknownDocument.name) +} +inline ::std::string* UnknownDocument::mutable_name() { + + // @@protoc_insertion_point(field_mutable:firestore.client.UnknownDocument.name) + return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline ::std::string* UnknownDocument::release_name() { + // @@protoc_insertion_point(field_release:firestore.client.UnknownDocument.name) + + return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline void UnknownDocument::set_allocated_name(::std::string* name) { + if (name != NULL) { + + } else { + + } + name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name); + // @@protoc_insertion_point(field_set_allocated:firestore.client.UnknownDocument.name) +} + +// .google.protobuf.Timestamp version = 2; +inline bool UnknownDocument::has_version() const { + return this != internal_default_instance() && version_ != NULL; +} +inline const ::google::protobuf::Timestamp& UnknownDocument::version() const { + const ::google::protobuf::Timestamp* p = version_; + // @@protoc_insertion_point(field_get:firestore.client.UnknownDocument.version) + return p != NULL ? *p : *reinterpret_cast( + &::google::protobuf::_Timestamp_default_instance_); +} +inline ::google::protobuf::Timestamp* UnknownDocument::release_version() { + // @@protoc_insertion_point(field_release:firestore.client.UnknownDocument.version) + + ::google::protobuf::Timestamp* temp = version_; + version_ = NULL; + return temp; +} +inline ::google::protobuf::Timestamp* UnknownDocument::mutable_version() { + + if (version_ == NULL) { + version_ = new ::google::protobuf::Timestamp; + } + // @@protoc_insertion_point(field_mutable:firestore.client.UnknownDocument.version) + return version_; +} +inline void UnknownDocument::set_allocated_version(::google::protobuf::Timestamp* version) { + ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == NULL) { + delete reinterpret_cast< ::google::protobuf::MessageLite*>(version_); + } + if (version) { + ::google::protobuf::Arena* submessage_arena = + reinterpret_cast< ::google::protobuf::MessageLite*>(version)->GetArena(); + if (message_arena != submessage_arena) { + version = ::google::protobuf::internal::GetOwnedMessage( + message_arena, version, submessage_arena); + } + + } else { + + } + version_ = version; + // @@protoc_insertion_point(field_set_allocated:firestore.client.UnknownDocument.version) +} + +// ------------------------------------------------------------------- + // MaybeDocument // .firestore.client.NoDocument no_document = 1; @@ -516,6 +760,60 @@ inline ::google::firestore::v1beta1::Document* MaybeDocument::mutable_document() return document_type_.document_; } +// .firestore.client.UnknownDocument unknown_document = 3; +inline bool MaybeDocument::has_unknown_document() const { + return document_type_case() == kUnknownDocument; +} +inline void MaybeDocument::set_has_unknown_document() { + _oneof_case_[0] = kUnknownDocument; +} +inline void MaybeDocument::clear_unknown_document() { + if (has_unknown_document()) { + delete document_type_.unknown_document_; + clear_has_document_type(); + } +} +inline ::firestore::client::UnknownDocument* MaybeDocument::release_unknown_document() { + // @@protoc_insertion_point(field_release:firestore.client.MaybeDocument.unknown_document) + if (has_unknown_document()) { + clear_has_document_type(); + ::firestore::client::UnknownDocument* temp = document_type_.unknown_document_; + document_type_.unknown_document_ = NULL; + return temp; + } else { + return NULL; + } +} +inline const ::firestore::client::UnknownDocument& MaybeDocument::unknown_document() const { + // @@protoc_insertion_point(field_get:firestore.client.MaybeDocument.unknown_document) + return has_unknown_document() + ? *document_type_.unknown_document_ + : *reinterpret_cast< ::firestore::client::UnknownDocument*>(&::firestore::client::_UnknownDocument_default_instance_); +} +inline ::firestore::client::UnknownDocument* MaybeDocument::mutable_unknown_document() { + if (!has_unknown_document()) { + clear_document_type(); + set_has_unknown_document(); + document_type_.unknown_document_ = new ::firestore::client::UnknownDocument; + } + // @@protoc_insertion_point(field_mutable:firestore.client.MaybeDocument.unknown_document) + return document_type_.unknown_document_; +} + +// bool has_committed_mutations = 4; +inline void MaybeDocument::clear_has_committed_mutations() { + has_committed_mutations_ = false; +} +inline bool MaybeDocument::has_committed_mutations() const { + // @@protoc_insertion_point(field_get:firestore.client.MaybeDocument.has_committed_mutations) + return has_committed_mutations_; +} +inline void MaybeDocument::set_has_committed_mutations(bool value) { + + has_committed_mutations_ = value; + // @@protoc_insertion_point(field_set:firestore.client.MaybeDocument.has_committed_mutations) +} + inline bool MaybeDocument::has_document_type() const { return document_type_case() != DOCUMENT_TYPE_NOT_SET; } @@ -530,6 +828,8 @@ inline MaybeDocument::DocumentTypeCase MaybeDocument::document_type_case() const #endif // __GNUC__ // ------------------------------------------------------------------- +// ------------------------------------------------------------------- + // @@protoc_insertion_point(namespace_scope) diff --git a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.c b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.c index 59a26853771..86f3ac89981 100644 --- a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.c +++ b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.c @@ -32,9 +32,17 @@ const pb_field_t firestore_client_NoDocument_fields[3] = { PB_LAST_FIELD }; -const pb_field_t firestore_client_MaybeDocument_fields[3] = { +const pb_field_t firestore_client_UnknownDocument_fields[3] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, firestore_client_UnknownDocument, name, name, 0), + PB_FIELD( 2, MESSAGE , SINGULAR, STATIC , OTHER, firestore_client_UnknownDocument, version, name, &google_protobuf_Timestamp_fields), + PB_LAST_FIELD +}; + +const pb_field_t firestore_client_MaybeDocument_fields[5] = { PB_ANONYMOUS_ONEOF_FIELD(document_type, 1, MESSAGE , ONEOF, STATIC , FIRST, firestore_client_MaybeDocument, no_document, no_document, &firestore_client_NoDocument_fields), PB_ANONYMOUS_ONEOF_FIELD(document_type, 2, MESSAGE , ONEOF, STATIC , UNION, firestore_client_MaybeDocument, document, document, &google_firestore_v1beta1_Document_fields), + PB_ANONYMOUS_ONEOF_FIELD(document_type, 3, MESSAGE , ONEOF, STATIC , UNION, firestore_client_MaybeDocument, unknown_document, unknown_document, &firestore_client_UnknownDocument_fields), + PB_FIELD( 4, BOOL , SINGULAR, STATIC , OTHER, firestore_client_MaybeDocument, has_committed_mutations, unknown_document, 0), PB_LAST_FIELD }; @@ -48,7 +56,7 @@ const pb_field_t firestore_client_MaybeDocument_fields[3] = { * numbers or field sizes that are larger than what can fit in 8 or 16 bit * field descriptors. */ -PB_STATIC_ASSERT((pb_membersize(firestore_client_NoDocument, read_time) < 65536 && pb_membersize(firestore_client_MaybeDocument, no_document) < 65536 && pb_membersize(firestore_client_MaybeDocument, document) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_firestore_client_NoDocument_firestore_client_MaybeDocument) +PB_STATIC_ASSERT((pb_membersize(firestore_client_NoDocument, read_time) < 65536 && pb_membersize(firestore_client_UnknownDocument, version) < 65536 && pb_membersize(firestore_client_MaybeDocument, no_document) < 65536 && pb_membersize(firestore_client_MaybeDocument, document) < 65536 && pb_membersize(firestore_client_MaybeDocument, unknown_document) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_firestore_client_NoDocument_firestore_client_UnknownDocument_firestore_client_MaybeDocument) #endif #if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) @@ -59,7 +67,7 @@ PB_STATIC_ASSERT((pb_membersize(firestore_client_NoDocument, read_time) < 65536 * numbers or field sizes that are larger than what can fit in the default * 8 bit descriptors. */ -PB_STATIC_ASSERT((pb_membersize(firestore_client_NoDocument, read_time) < 256 && pb_membersize(firestore_client_MaybeDocument, no_document) < 256 && pb_membersize(firestore_client_MaybeDocument, document) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_firestore_client_NoDocument_firestore_client_MaybeDocument) +PB_STATIC_ASSERT((pb_membersize(firestore_client_NoDocument, read_time) < 256 && pb_membersize(firestore_client_UnknownDocument, version) < 256 && pb_membersize(firestore_client_MaybeDocument, no_document) < 256 && pb_membersize(firestore_client_MaybeDocument, document) < 256 && pb_membersize(firestore_client_MaybeDocument, unknown_document) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_firestore_client_NoDocument_firestore_client_UnknownDocument_firestore_client_MaybeDocument) #endif diff --git a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h index 60e8a2d1b42..e10dc747765 100644 --- a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h +++ b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h @@ -41,12 +41,20 @@ typedef struct _firestore_client_NoDocument { /* @@protoc_insertion_point(struct:firestore_client_NoDocument) */ } firestore_client_NoDocument; +typedef struct _firestore_client_UnknownDocument { + pb_bytes_array_t *name; + google_protobuf_Timestamp version; +/* @@protoc_insertion_point(struct:firestore_client_UnknownDocument) */ +} firestore_client_UnknownDocument; + typedef struct _firestore_client_MaybeDocument { pb_size_t which_document_type; union { firestore_client_NoDocument no_document; google_firestore_v1beta1_Document document; + firestore_client_UnknownDocument unknown_document; }; + bool has_committed_mutations; /* @@protoc_insertion_point(struct:firestore_client_MaybeDocument) */ } firestore_client_MaybeDocument; @@ -54,23 +62,31 @@ typedef struct _firestore_client_MaybeDocument { /* Initializer values for message structs */ #define firestore_client_NoDocument_init_default {NULL, google_protobuf_Timestamp_init_default} -#define firestore_client_MaybeDocument_init_default {0, {firestore_client_NoDocument_init_default}} +#define firestore_client_UnknownDocument_init_default {NULL, google_protobuf_Timestamp_init_default} +#define firestore_client_MaybeDocument_init_default {0, {firestore_client_NoDocument_init_default}, 0} #define firestore_client_NoDocument_init_zero {NULL, google_protobuf_Timestamp_init_zero} -#define firestore_client_MaybeDocument_init_zero {0, {firestore_client_NoDocument_init_zero}} +#define firestore_client_UnknownDocument_init_zero {NULL, google_protobuf_Timestamp_init_zero} +#define firestore_client_MaybeDocument_init_zero {0, {firestore_client_NoDocument_init_zero}, 0} /* Field tags (for use in manual encoding/decoding) */ #define firestore_client_NoDocument_name_tag 1 #define firestore_client_NoDocument_read_time_tag 2 +#define firestore_client_UnknownDocument_name_tag 1 +#define firestore_client_UnknownDocument_version_tag 2 #define firestore_client_MaybeDocument_no_document_tag 1 #define firestore_client_MaybeDocument_document_tag 2 +#define firestore_client_MaybeDocument_unknown_document_tag 3 +#define firestore_client_MaybeDocument_has_committed_mutations_tag 4 /* Struct field encoding specification for nanopb */ extern const pb_field_t firestore_client_NoDocument_fields[3]; -extern const pb_field_t firestore_client_MaybeDocument_fields[3]; +extern const pb_field_t firestore_client_UnknownDocument_fields[3]; +extern const pb_field_t firestore_client_MaybeDocument_fields[5]; /* Maximum encoded size of messages (where known) */ /* firestore_client_NoDocument_size depends on runtime parameters */ -#define firestore_client_MaybeDocument_size (0 + ((firestore_client_NoDocument_size > google_firestore_v1beta1_Document_size ? firestore_client_NoDocument_size : google_firestore_v1beta1_Document_size) > 0 ? (firestore_client_NoDocument_size > google_firestore_v1beta1_Document_size ? firestore_client_NoDocument_size : google_firestore_v1beta1_Document_size) : 0)) +/* firestore_client_UnknownDocument_size depends on runtime parameters */ +#define firestore_client_MaybeDocument_size (2 + (((firestore_client_NoDocument_size > firestore_client_UnknownDocument_size ? firestore_client_NoDocument_size : firestore_client_UnknownDocument_size) > google_firestore_v1beta1_Document_size ? (firestore_client_NoDocument_size > firestore_client_UnknownDocument_size ? firestore_client_NoDocument_size : firestore_client_UnknownDocument_size) : google_firestore_v1beta1_Document_size) > 0 ? ((firestore_client_NoDocument_size > firestore_client_UnknownDocument_size ? firestore_client_NoDocument_size : firestore_client_UnknownDocument_size) > google_firestore_v1beta1_Document_size ? (firestore_client_NoDocument_size > firestore_client_UnknownDocument_size ? firestore_client_NoDocument_size : firestore_client_UnknownDocument_size) : google_firestore_v1beta1_Document_size) : 0)) /* Message IDs (where set with "msgid" option) */ #ifdef PB_MSGID diff --git a/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.h b/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.h index 6ff7d7d65ef..cac820928be 100644 --- a/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.h +++ b/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.h @@ -44,6 +44,7 @@ CF_EXTERN_C_BEGIN @class FSTPBNoDocument; +@class FSTPBUnknownDocument; @class GCFSDocument; @class GPBTimestamp; @@ -89,22 +90,52 @@ typedef GPB_ENUM(FSTPBNoDocument_FieldNumber) { @end +#pragma mark - FSTPBUnknownDocument + +typedef GPB_ENUM(FSTPBUnknownDocument_FieldNumber) { + FSTPBUnknownDocument_FieldNumber_Name = 1, + FSTPBUnknownDocument_FieldNumber_Version = 2, +}; + +/** + * A message indicating that the document that is known to exist but its data + * is unknown. + **/ +@interface FSTPBUnknownDocument : GPBMessage + +/** + * The name of the document that is known to exist, in the standard format: + * `projects/{project_id}/databases/{database_id}/documents/{document_path}` + **/ +@property(nonatomic, readwrite, copy, null_resettable) NSString *name; + +/** The version at which we know the document exists. */ +@property(nonatomic, readwrite, strong, null_resettable) GPBTimestamp *version; +/** Test to see if @c version has been set. */ +@property(nonatomic, readwrite) BOOL hasVersion; + +@end + #pragma mark - FSTPBMaybeDocument typedef GPB_ENUM(FSTPBMaybeDocument_FieldNumber) { FSTPBMaybeDocument_FieldNumber_NoDocument = 1, FSTPBMaybeDocument_FieldNumber_Document = 2, + FSTPBMaybeDocument_FieldNumber_UnknownDocument = 3, + FSTPBMaybeDocument_FieldNumber_HasCommittedMutations = 4, }; typedef GPB_ENUM(FSTPBMaybeDocument_DocumentType_OneOfCase) { FSTPBMaybeDocument_DocumentType_OneOfCase_GPBUnsetOneOfCase = 0, FSTPBMaybeDocument_DocumentType_OneOfCase_NoDocument = 1, FSTPBMaybeDocument_DocumentType_OneOfCase_Document = 2, + FSTPBMaybeDocument_DocumentType_OneOfCase_UnknownDocument = 3, }; /** - * Represents either an existing document or the explicitly known absence of a - * document. + * Represents either an existing document, the explicitly known absence of a + * document, or a document that is known to exist (at some version) but whose + * contents are unknown. **/ @interface FSTPBMaybeDocument : GPBMessage @@ -116,6 +147,17 @@ typedef GPB_ENUM(FSTPBMaybeDocument_DocumentType_OneOfCase) { /** The document (if it exists). */ @property(nonatomic, readwrite, strong, null_resettable) GCFSDocument *document; +/** Used if the document is known to exist but its data is unknown. */ +@property(nonatomic, readwrite, strong, null_resettable) FSTPBUnknownDocument *unknownDocument; + +/** + * `has_committed_mutations` marks documents that were written to the remote + * document store based on a write acknowledgment. These documents are + * potentially inconsistent with the backend's copy and use the write's + * commit version as their document version. + **/ +@property(nonatomic, readwrite) BOOL hasCommittedMutations; + @end /** diff --git a/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.m b/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.m index c0208925aad..83bed77a99f 100644 --- a/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.m +++ b/Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.m @@ -120,6 +120,60 @@ + (GPBDescriptor *)descriptor { @end +#pragma mark - FSTPBUnknownDocument + +@implementation FSTPBUnknownDocument + +@dynamic name; +@dynamic hasVersion, version; + +typedef struct FSTPBUnknownDocument__storage_ { + uint32_t _has_storage_[1]; + NSString *name; + GPBTimestamp *version; +} FSTPBUnknownDocument__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "name", + .dataTypeSpecific.className = NULL, + .number = FSTPBUnknownDocument_FieldNumber_Name, + .hasIndex = 0, + .offset = (uint32_t)offsetof(FSTPBUnknownDocument__storage_, name), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + { + .name = "version", + .dataTypeSpecific.className = GPBStringifySymbol(GPBTimestamp), + .number = FSTPBUnknownDocument_FieldNumber_Version, + .hasIndex = 1, + .offset = (uint32_t)offsetof(FSTPBUnknownDocument__storage_, version), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[FSTPBUnknownDocument class] + rootClass:[FSTPBMaybeDocumentRoot class] + file:FSTPBMaybeDocumentRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(FSTPBUnknownDocument__storage_) + flags:GPBDescriptorInitializationFlag_None]; + NSAssert(descriptor == nil, @"Startup recursed!"); + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma mark - FSTPBMaybeDocument @implementation FSTPBMaybeDocument @@ -127,11 +181,14 @@ @implementation FSTPBMaybeDocument @dynamic documentTypeOneOfCase; @dynamic noDocument; @dynamic document; +@dynamic unknownDocument; +@dynamic hasCommittedMutations; typedef struct FSTPBMaybeDocument__storage_ { uint32_t _has_storage_[2]; FSTPBNoDocument *noDocument; GCFSDocument *document; + FSTPBUnknownDocument *unknownDocument; } FSTPBMaybeDocument__storage_; // This method is threadsafe because it is initially called @@ -158,6 +215,24 @@ + (GPBDescriptor *)descriptor { .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, + { + .name = "unknownDocument", + .dataTypeSpecific.className = GPBStringifySymbol(FSTPBUnknownDocument), + .number = FSTPBMaybeDocument_FieldNumber_UnknownDocument, + .hasIndex = -1, + .offset = (uint32_t)offsetof(FSTPBMaybeDocument__storage_, unknownDocument), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "hasCommittedMutations", + .dataTypeSpecific.className = NULL, + .number = FSTPBMaybeDocument_FieldNumber_HasCommittedMutations, + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. + .flags = GPBFieldOptional, + .dataType = GPBDataTypeBool, + }, }; GPBDescriptor *localDescriptor = [GPBDescriptor allocDescriptorForClass:[FSTPBMaybeDocument class] diff --git a/Firestore/Protos/objc/firestore/local/Target.pbobjc.h b/Firestore/Protos/objc/firestore/local/Target.pbobjc.h index 37707df3aec..bab0d7953dc 100644 --- a/Firestore/Protos/objc/firestore/local/Target.pbobjc.h +++ b/Firestore/Protos/objc/firestore/local/Target.pbobjc.h @@ -99,6 +99,7 @@ typedef GPB_ENUM(FSTPBTarget_TargetType_OneOfCase) { * The last snapshot version received from the Watch Service for this target. * * This is the same value as TargetChange.read_time + * https://github.com/googleapis/googleapis/blob/master/google/firestore/v1beta1/firestore.proto#L734 **/ @property(nonatomic, readwrite, strong, null_resettable) GPBTimestamp *snapshotVersion; /** Test to see if @c snapshotVersion has been set. */ @@ -119,6 +120,7 @@ typedef GPB_ENUM(FSTPBTarget_TargetType_OneOfCase) { * the client should use the snapshot_version for its own purposes. * * This is the same value as TargetChange.resume_token + * https://github.com/googleapis/googleapis/blob/master/google/firestore/v1beta1/firestore.proto#L722 **/ @property(nonatomic, readwrite, copy, null_resettable) NSData *resumeToken; From 868044134180ceec42ddbfe076540978ccecfef7 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Sun, 21 Oct 2018 15:14:45 -0700 Subject: [PATCH 006/102] Remove cruft from project file (#1975) --- Example/Firebase.xcodeproj/project.pbxproj | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Example/Firebase.xcodeproj/project.pbxproj b/Example/Firebase.xcodeproj/project.pbxproj index ac50412a135..aaa16c4df2d 100644 --- a/Example/Firebase.xcodeproj/project.pbxproj +++ b/Example/Firebase.xcodeproj/project.pbxproj @@ -121,7 +121,6 @@ 7EE21F7C1FE8919E009B1370 /* FIREmailLinkSignInResponseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EE21F7B1FE8919D009B1370 /* FIREmailLinkSignInResponseTests.m */; }; 7EFA2E041F71C93300DD354F /* FIRUserMetadataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA2E031F71C93300DD354F /* FIRUserMetadataTests.m */; }; 923F824C206C4D8000034974 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 923F824B206C4D8000034974 /* SafariServices.framework */; }; - 923F824E206C4D8B00034974 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 923F824D206C4D8B00034974 /* SafariServices.framework */; }; 923F824F206C4DA500034974 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE45C6641E7DA8CB009E6ACD /* XCTest.framework */; }; 923F8251206C4DC600034974 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 923F8250206C4DC500034974 /* UserNotifications.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 923F8252206C4DD500034974 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; @@ -185,8 +184,6 @@ D064E6B51ED9B31C001956DF /* FIRTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = DEE14D7C1E844677006FA992 /* FIRTestCase.m */; }; D067EF831ED9BDE00095C27F /* Shared.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */; }; D067EF841ED9BDFF0095C27F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = DEE14D711E844677006FA992 /* GoogleService-Info.plist */; }; - D09005371EDB331C00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */; settings = {ATTRIBUTES = (); }; }; - D090053D1EDB334D00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */; settings = {ATTRIBUTES = (); }; }; D0EDB2C51EDA04F800B6C31B /* Shared.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */; }; D0EDB2D71EDA057800B6C31B /* FIRAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D0EDB2D21EDA056A00B6C31B /* FIRAppDelegate.m */; }; D0EDB2D81EDA057800B6C31B /* FIRViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0EDB2D41EDA056A00B6C31B /* FIRViewController.m */; }; @@ -877,7 +874,6 @@ dstPath = ""; dstSubfolderSpec = 16; files = ( - D09005371EDB331C00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -887,7 +883,6 @@ dstPath = ""; dstSubfolderSpec = 16; files = ( - D090053D1EDB334D00154410 /* OCMock-iOS/OCMock.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -962,7 +957,6 @@ 7EFA2E031F71C93300DD354F /* FIRUserMetadataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRUserMetadataTests.m; sourceTree = ""; }; 8496034D8156555C5FCF8F14 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 923F824B206C4D8000034974 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = System/Library/Frameworks/SafariServices.framework; sourceTree = SDKROOT; }; - 923F824D206C4D8B00034974 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/SafariServices.framework; sourceTree = DEVELOPER_DIR; }; 923F8250206C4DC500034974 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Shared.xcassets; path = Shared/Shared.xcassets; sourceTree = ""; }; AFC8BAA11EC257D700B8EEAE /* Messaging_Example-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Messaging_Example-Bridging-Header.h"; sourceTree = ""; }; @@ -987,7 +981,6 @@ D064E6A41ED9B1BF001956DF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; D064E6A61ED9B1BF001956DF /* Core-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Core-Info.plist"; sourceTree = ""; }; D064E6BF1ED9B31C001956DF /* Core_Tests_macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Core_Tests_macOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = "OCMock-iOS/OCMock.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; D0EDB2CD1EDA04F800B6C31B /* Storage_Example_macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Storage_Example_macOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; D0EDB2D01EDA056A00B6C31B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; D0EDB2D11EDA056A00B6C31B /* FIRAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FIRAppDelegate.h; sourceTree = ""; }; @@ -1386,7 +1379,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 923F824E206C4D8B00034974 /* SafariServices.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1766,8 +1758,6 @@ children = ( 923F8250206C4DC500034974 /* UserNotifications.framework */, 923F824B206C4D8000034974 /* SafariServices.framework */, - 923F824D206C4D8B00034974 /* SafariServices.framework */, - D09005301EDB32D600154410 /* OCMock-iOS/OCMock.framework */, DE45C6641E7DA8CB009E6ACD /* XCTest.framework */, DEB61E781E7C542600C04B96 /* libsqlite3.tbd */, 6003F58D195388D20070C39A /* Foundation.framework */, @@ -5749,7 +5739,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 4ANB9W7R3P; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "$SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist"; + INFOPLIST_FILE = $SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; @@ -5783,7 +5773,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 4ANB9W7R3P; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "$SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist"; + INFOPLIST_FILE = $SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; From 1dea38cbedc17c41c89f751636b0c805060a38da Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Fri, 19 Oct 2018 12:07:53 -0700 Subject: [PATCH 007/102] Lock reads and writes to session map --- .../Network/GULNetworkURLSession.m | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/GoogleUtilities/Network/GULNetworkURLSession.m b/GoogleUtilities/Network/GULNetworkURLSession.m index 7fe134cdc65..26da579a3bb 100644 --- a/GoogleUtilities/Network/GULNetworkURLSession.m +++ b/GoogleUtilities/Network/GULNetworkURLSession.m @@ -158,7 +158,7 @@ - (NSString *)sessionIDFromAsyncPOSTRequest:(NSURLRequest *)request } // Save the session into memory. - [self setSessionInFetcherMap:self forSessionID:_sessionID]; + [[self class] setSessionInFetcherMap:self forSessionID:_sessionID]; _request = [request copy]; @@ -200,7 +200,7 @@ - (NSString *)sessionIDFromAsyncGETRequest:(NSURLRequest *)request } // Save the session into memory. - [self setSessionInFetcherMap:self forSessionID:_sessionID]; + [[self class] setSessionInFetcherMap:self forSessionID:_sessionID]; _request = [request copy]; @@ -291,7 +291,7 @@ - (void)URLSession:(NSURLSession *)session // Explicitly remove the session so it won't be reused. The weak map table should // remove the session on deallocation, but dealloc may not happen immediately after // calling `finishTasksAndInvalidate`. - [self setSessionInFetcherMap:nil forSessionID:sessionID]; + [[self class] setSessionInFetcherMap:nil forSessionID:sessionID]; } } @@ -540,18 +540,19 @@ - (void)removeTempItemAtURL:(NSURL *)fileURL { /// Gets the fetcher with the session ID. + (instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier { - NSMapTable *sessionIdentifierToFetcherMap = - [self sessionIDToFetcherMap]; - GULNetworkURLSession *session = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; + GULNetworkURLSession *session = [self sessionFromFetcherMapForSessionID:sessionIdentifier]; if (!session && [sessionIdentifier hasPrefix:kGULNetworkBackgroundSessionConfigIDPrefix]) { session = [[GULNetworkURLSession alloc] initWithNetworkLoggerDelegate:nil]; [session setSessionID:sessionIdentifier]; - [sessionIdentifierToFetcherMap setObject:session forKey:sessionIdentifier]; + [self setSessionInFetcherMap:session forSessionID:sessionIdentifier]; } return session; } /// Returns a map of the fetcher by session ID. Creates a map if it is not created. +/// When reading and writing from/to the session map, don't use this method directly. +/// To avoid thread safety issues, use one of the helper methods at the bottom of the +/// file: setSessionInFetcherMap:forSessionID:, sessionFromFetcherMapForSessionID: + (NSMapTable *)sessionIDToFetcherMap { static NSMapTable *sessionIDToFetcherMap; @@ -562,6 +563,16 @@ + (instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier { return sessionIDToFetcherMap; } ++ (NSLock *)sessionIDToFetcherMapReadWriteLock { + static NSLock *lock; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + lock = [[NSLock alloc] init]; + }); + return lock; +} + /// Returns a map of system provided completion handler by session ID. Creates a map if it is not /// created. + (GULMutableDictionary *)sessionIDToSystemCompletionHandlerDictionary { @@ -661,26 +672,32 @@ - (void)URLSession:(NSURLSession *)session #pragma mark - Helper Methods -- (void)setSessionInFetcherMap:(GULNetworkURLSession *)session forSessionID:(NSString *)sessionID { - GULNetworkURLSession *existingSession = [self sessionFromFetcherMapForSessionID:sessionID]; ++ (void)setSessionInFetcherMap:(GULNetworkURLSession *)session forSessionID:(NSString *)sessionID { + [[self sessionIDToFetcherMapReadWriteLock] lock]; + GULNetworkURLSession *existingSession = + [[[self class] sessionIDToFetcherMap] objectForKey:sessionID]; if (existingSession) { // Invalidating doesn't seem like the right thing to do here since it may cancel an active // background transfer if the background session is handling multiple requests. The old // session will be dropped from the map table, but still complete its request. NSString *message = [NSString stringWithFormat:@"Discarding session: %@", existingSession]; - [_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelInfo - messageCode:kGULNetworkMessageCodeURLSession019 - message:message]; + [existingSession->_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelInfo + messageCode:kGULNetworkMessageCodeURLSession019 + message:message]; } if (session) { [[[self class] sessionIDToFetcherMap] setObject:session forKey:sessionID]; } else { [[[self class] sessionIDToFetcherMap] removeObjectForKey:sessionID]; } + [[self sessionIDToFetcherMapReadWriteLock] unlock]; } -- (nullable GULNetworkURLSession *)sessionFromFetcherMapForSessionID:(NSString *)sessionID { - return [[[self class] sessionIDToFetcherMap] objectForKey:sessionID]; ++ (nullable GULNetworkURLSession *)sessionFromFetcherMapForSessionID:(NSString *)sessionID { + [[self sessionIDToFetcherMapReadWriteLock] lock]; + GULNetworkURLSession *session = [[[self class] sessionIDToFetcherMap] objectForKey:sessionID]; + [[self sessionIDToFetcherMapReadWriteLock] unlock]; + return session; } - (void)callCompletionHandler:(GULNetworkURLSessionCompletionHandler)handler From ece6b3d6a8a6716e0fac9bc7281aabe51df65ad3 Mon Sep 17 00:00:00 2001 From: Stewart Miles Date: Mon, 22 Oct 2018 14:45:17 -0700 Subject: [PATCH 008/102] Changed FDL to use compatible __typeof__() operator. (#1982) typeof() is not supported in some C language dialects which causes issues when integrating FDL in projects that do use non-GNU compiler modes. For example, this causes problems when building in some versions of Unity https://github.com/firebase/quickstart-unity/issues/228 --- Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m | 4 ++-- Firebase/DynamicLinks/FIRDynamicLinks.m | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m b/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m index dfc59269d2d..39a48ed7e04 100644 --- a/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m +++ b/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m @@ -123,11 +123,11 @@ - (void)retrievePendingDynamicLinkInternal { } NSURL *uniqueMatchLinkToCheck = [self uniqueMatchLinkToCheck]; - __weak typeof(self) weakSelf = self; + __weak __typeof__(self) weakSelf = self; FIRPostInstallAttributionCompletionHandler completionHandler = ^(NSDictionary *_Nullable dynamicLinkParameters, NSString *_Nullable matchMessage, NSError *_Nullable error) { - typeof(self) strongSelf = weakSelf; + __typeof__(self) strongSelf = weakSelf; if (!strongSelf) { return; } diff --git a/Firebase/DynamicLinks/FIRDynamicLinks.m b/Firebase/DynamicLinks/FIRDynamicLinks.m index 8b9448b6f7b..cf02f35c4f8 100644 --- a/Firebase/DynamicLinks/FIRDynamicLinks.m +++ b/Firebase/DynamicLinks/FIRDynamicLinks.m @@ -422,10 +422,10 @@ - (nullable FIRDynamicLink *)dynamicLinkFromUniversalLinkURL:(NSURL *)url { - (BOOL)handleUniversalLink:(NSURL *)universalLinkURL completion:(FIRDynamicLinkUniversalLinkHandler)completion { if ([self matchesShortLinkFormat:universalLinkURL]) { - __weak typeof(self) weakSelf = self; + __weak __typeof__(self) weakSelf = self; [self resolveShortLink:universalLinkURL completion:^(NSURL *url, NSError *error) { - typeof(self) strongSelf = weakSelf; + __typeof__(self) strongSelf = weakSelf; if (strongSelf) { FIRDynamicLink *dynamicLink = [strongSelf dynamicLinkFromCustomSchemeURL:url]; dispatch_async(dispatch_get_main_queue(), ^{ From 45eaf73420bb5342a2226e8f13acfc558fd11397 Mon Sep 17 00:00:00 2001 From: Stewart Miles Date: Mon, 22 Oct 2018 14:45:17 -0700 Subject: [PATCH 009/102] Changed FDL to use compatible __typeof__() operator. (#1982) typeof() is not supported in some C language dialects which causes issues when integrating FDL in projects that do use non-GNU compiler modes. For example, this causes problems when building in some versions of Unity https://github.com/firebase/quickstart-unity/issues/228 --- Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m | 4 ++-- Firebase/DynamicLinks/FIRDynamicLinks.m | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m b/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m index dfc59269d2d..39a48ed7e04 100644 --- a/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m +++ b/Firebase/DynamicLinks/FIRDLDefaultRetrievalProcessV2.m @@ -123,11 +123,11 @@ - (void)retrievePendingDynamicLinkInternal { } NSURL *uniqueMatchLinkToCheck = [self uniqueMatchLinkToCheck]; - __weak typeof(self) weakSelf = self; + __weak __typeof__(self) weakSelf = self; FIRPostInstallAttributionCompletionHandler completionHandler = ^(NSDictionary *_Nullable dynamicLinkParameters, NSString *_Nullable matchMessage, NSError *_Nullable error) { - typeof(self) strongSelf = weakSelf; + __typeof__(self) strongSelf = weakSelf; if (!strongSelf) { return; } diff --git a/Firebase/DynamicLinks/FIRDynamicLinks.m b/Firebase/DynamicLinks/FIRDynamicLinks.m index 8b9448b6f7b..cf02f35c4f8 100644 --- a/Firebase/DynamicLinks/FIRDynamicLinks.m +++ b/Firebase/DynamicLinks/FIRDynamicLinks.m @@ -422,10 +422,10 @@ - (nullable FIRDynamicLink *)dynamicLinkFromUniversalLinkURL:(NSURL *)url { - (BOOL)handleUniversalLink:(NSURL *)universalLinkURL completion:(FIRDynamicLinkUniversalLinkHandler)completion { if ([self matchesShortLinkFormat:universalLinkURL]) { - __weak typeof(self) weakSelf = self; + __weak __typeof__(self) weakSelf = self; [self resolveShortLink:universalLinkURL completion:^(NSURL *url, NSError *error) { - typeof(self) strongSelf = weakSelf; + __typeof__(self) strongSelf = weakSelf; if (strongSelf) { FIRDynamicLink *dynamicLink = [strongSelf dynamicLinkFromCustomSchemeURL:url]; dispatch_async(dispatch_get_main_queue(), ^{ From 614de80484e37eec504dc8d4ad0f2a687535b5a5 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Mon, 22 Oct 2018 14:53:38 -0700 Subject: [PATCH 010/102] Bump DynamicLinks patch version --- Firebase/DynamicLinks/CHANGELOG.md | 3 +++ FirebaseDynamicLinks.podspec | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Firebase/DynamicLinks/CHANGELOG.md b/Firebase/DynamicLinks/CHANGELOG.md index d393266091f..8064ae7366e 100644 --- a/Firebase/DynamicLinks/CHANGELOG.md +++ b/Firebase/DynamicLinks/CHANGELOG.md @@ -1,3 +1,6 @@ +# v3.1.1 +- Use c99 compatible __typeof__() operator. (#1982) + # v3.1.0 - Firebase Dynamic Links is now open source and delivered as a source pod. (#1842) diff --git a/FirebaseDynamicLinks.podspec b/FirebaseDynamicLinks.podspec index 72c3a0f8b0c..297dbda2607 100644 --- a/FirebaseDynamicLinks.podspec +++ b/FirebaseDynamicLinks.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'FirebaseDynamicLinks' - s.version = '3.1.0' + s.version = '3.1.1' s.summary = 'Firebase DynamicLinks for iOS' s.description = <<-DESC From 53a2ef395d501b60851f09447a8fca471df2239d Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Mon, 22 Oct 2018 15:19:31 -0700 Subject: [PATCH 011/102] Add FDL to release manifest --- Releases/Manifests/5.11.0.json | 1 + 1 file changed, 1 insertion(+) diff --git a/Releases/Manifests/5.11.0.json b/Releases/Manifests/5.11.0.json index 69c2ccc9159..25f42b1fa67 100644 --- a/Releases/Manifests/5.11.0.json +++ b/Releases/Manifests/5.11.0.json @@ -1,5 +1,6 @@ { "FirebaseCore":"5.1.6", + "FirebaseDynamicLinks":"3.1.1", "FirebaseMessaging":"3.2.1", "FirebaseFirestore":"0.13.6", "FirebaseAnalyticsInterop":"1.1.0" From 5cfe5671479f7601b35ebe2a480f3a61a09a1ef0 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Tue, 23 Oct 2018 09:57:02 -0700 Subject: [PATCH 012/102] Bump GoogleUtilities patch version to deliver fix for #1964 (#1987) --- GoogleUtilities.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GoogleUtilities.podspec b/GoogleUtilities.podspec index d07f4f8dbcf..c9f33a334c1 100644 --- a/GoogleUtilities.podspec +++ b/GoogleUtilities.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'GoogleUtilities' - s.version = '5.3.3' + s.version = '5.3.4' s.summary = 'Google Utilities for iOS (plus community support for macOS and tvOS)' s.description = <<-DESC From 8de5cb2834a5f3a2ae51c1827adb008d7d4fd209 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Tue, 23 Oct 2018 13:29:13 -0400 Subject: [PATCH 013/102] Wrap diagnostics notification in collection flag check. (#1979) * Wrap diagnostics notification in collection flag check. Some of the diagnostics notifications were missed and not covered by the data collection flag. * Remove redundant notification call, move Core diagnostics API call. * Removed configure with no options test. --- Example/Core/Tests/FIRAppTest.m | 5 +++-- Firebase/Core/FIRApp.m | 39 ++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Example/Core/Tests/FIRAppTest.m b/Example/Core/Tests/FIRAppTest.m index 13bc9210817..7b8b29dfb9f 100644 --- a/Example/Core/Tests/FIRAppTest.m +++ b/Example/Core/Tests/FIRAppTest.m @@ -690,8 +690,6 @@ - (void)testGlobalDataCollectionClearedAfterDelete { } - (void)testGlobalDataCollectionNoDiagnosticsSent { - [FIRApp configure]; - // Add an observer for the diagnostics notification - both with and without an object to ensure it // catches it either way. Currently no object is sent, but in the future that could change. [self.notificationCenter addMockObserver:self.observerMock @@ -707,6 +705,9 @@ - (void)testGlobalDataCollectionNoDiagnosticsSent { OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(@NO); + // Ensure configure doesn't fire a notification. + [FIRApp configure]; + NSError *error = [NSError errorWithDomain:@"com.firebase" code:42 userInfo:nil]; [[FIRApp defaultApp] sendLogsWithServiceName:@"Service" version:@"Version" error:error]; diff --git a/Firebase/Core/FIRApp.m b/Firebase/Core/FIRApp.m index 2edcb078963..2920d4c737d 100644 --- a/Firebase/Core/FIRApp.m +++ b/Firebase/Core/FIRApp.m @@ -107,13 +107,19 @@ @implementation FIRApp + (void)configure { FIROptions *options = [FIROptions defaultOptions]; if (!options) { - [[NSNotificationCenter defaultCenter] - postNotificationName:kFIRAppDiagnosticsNotification - object:nil - userInfo:@{ - kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeCore), - kFIRAppDiagnosticsErrorKey : [FIRApp errorForMissingOptions] - }]; + // Read the Info.plist to see if the flag is set. At this point we can't check any user defaults + // since the app isn't configured at all, so only rely on the Info.plist value. + NSNumber *collectionEnabledPlistValue = [[self class] readDataCollectionSwitchFromPlist]; + if (!collectionEnabledPlistValue || [collectionEnabledPlistValue boolValue]) { + [[NSNotificationCenter defaultCenter] + postNotificationName:kFIRAppDiagnosticsNotification + object:nil + userInfo:@{ + kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeCore), + kFIRAppDiagnosticsErrorKey : [FIRApp errorForMissingOptions] + }]; + } + [NSException raise:kFirebaseCoreErrorDomain format: @"`[FIRApp configure];` (`FirebaseApp.configure()` in Swift) could not find " @@ -274,13 +280,6 @@ + (void)addAppToAppDictionary:(FIRApp *)app { } if ([app configureCore]) { sAllApps[app.name] = app; - [[NSNotificationCenter defaultCenter] - postNotificationName:kFIRAppDiagnosticsNotification - object:nil - userInfo:@{ - kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeCore), - kFIRAppDiagnosticsFIRAppKey : app - }]; } else { [NSException raise:kFirebaseCoreErrorDomain format: @@ -317,7 +316,7 @@ - (void)getTokenForcingRefresh:(BOOL)forceRefresh withCallback:(FIRTokenCallback - (BOOL)configureCore { [self checkExpectedBundleID]; if (![self isAppIDValid]) { - if (_options.usingOptionsFromDefaultPlist) { + if (_options.usingOptionsFromDefaultPlist && [self isDataCollectionDefaultEnabled]) { [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppDiagnosticsNotification object:nil @@ -329,6 +328,16 @@ - (BOOL)configureCore { return NO; } + if ([self isDataCollectionDefaultEnabled]) { + [[NSNotificationCenter defaultCenter] + postNotificationName:kFIRAppDiagnosticsNotification + object:nil + userInfo:@{ + kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeCore), + kFIRAppDiagnosticsFIRAppKey : self + }]; + } + #if TARGET_OS_IOS // Initialize the Analytics once there is a valid options under default app. Analytics should // always initialize first by itself before the other SDKs. From b192fd7c77be45c682c513874112c445972573f1 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Tue, 23 Oct 2018 12:15:11 -0700 Subject: [PATCH 014/102] Queue Storage Tasks on separate queue (#1981) --- .../Integration/FIRStorageIntegrationTests.m | 88 +++++++ .../Tests/Unit/FIRStorageDeleteTests.m | 8 + .../Tests/Unit/FIRStorageGetMetadataTests.m | 9 + .../Unit/FIRStorageUpdateMetadataTests.m | 9 + Firebase/Storage/FIRStorage.m | 1 + Firebase/Storage/FIRStorageDeleteTask.m | 52 ++-- Firebase/Storage/FIRStorageDownloadTask.m | 214 +++++++-------- .../Storage/FIRStorageGetDownloadURLTask.m | 79 +++--- Firebase/Storage/FIRStorageGetMetadataTask.m | 70 ++--- Firebase/Storage/FIRStorageObservableTask.m | 5 +- Firebase/Storage/FIRStorageReference.m | 8 + Firebase/Storage/FIRStorageTask.m | 16 +- .../Storage/FIRStorageUpdateMetadataTask.m | 88 ++++--- Firebase/Storage/FIRStorageUploadTask.m | 245 +++++++++--------- .../Storage/Private/FIRStorageDeleteTask.h | 1 + .../Private/FIRStorageDownloadTask_Private.h | 2 + .../Private/FIRStorageGetDownloadURLTask.h | 1 + .../Private/FIRStorageGetMetadataTask.h | 1 + .../FIRStorageObservableTask_Private.h | 4 +- .../Storage/Private/FIRStorageTask_Private.h | 14 +- .../Private/FIRStorageUpdateMetadataTask.h | 1 + .../Private/FIRStorageUploadTask_Private.h | 4 + Firebase/Storage/Private/FIRStorage_Private.h | 2 + 23 files changed, 566 insertions(+), 356 deletions(-) diff --git a/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m b/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m index b20108a38ac..94729c92505 100644 --- a/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m +++ b/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m @@ -198,6 +198,26 @@ - (void)testUnauthenticatedSimplePutData { [self waitForExpectations]; } +- (void)testUnauthenticatedSimplePutDataInBackgroundQueue { + XCTestExpectation *expectation = + [self expectationWithDescription:@"testUnauthenticatedSimplePutDataInBackgroundQueue"]; + FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/testBytesUpload"]; + + NSData *data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [ref putData:data + metadata:nil + completion:^(FIRStorageMetadata *metadata, NSError *error) { + XCTAssertNotNil(metadata, "Metadata should not be nil"); + XCTAssertNil(error, "Error should be nil"); + [expectation fulfill]; + }]; + }); + + [self waitForExpectations]; +} + - (void)testUnauthenticatedSimplePutEmptyData { XCTestExpectation *expectation = [self expectationWithDescription:@"testUnauthenticatedSimplePutEmptyData"]; @@ -369,6 +389,24 @@ - (void)testUnauthenticatedSimpleGetData { [self waitForExpectations]; } +- (void)testUnauthenticatedSimpleGetDataInBackgroundQueue { + XCTestExpectation *expectation = + [self expectationWithDescription:@"testUnauthenticatedSimpleGetDataInBackgroundQueue"]; + + FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/1mb"]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [ref dataWithMaxSize:1 * 1024 * 1024 + completion:^(NSData *data, NSError *error) { + XCTAssertNotNil(data, "Data should not be nil"); + XCTAssertNil(error, "Error should be nil"); + [expectation fulfill]; + }]; + }); + + [self waitForExpectations]; +} + - (void)testUnauthenticatedSimpleGetDataTooSmall { XCTestExpectation *expectation = [self expectationWithDescription:@"testUnauthenticatedSimpleGetDataTooSmall"]; @@ -615,6 +653,56 @@ - (void)testUnauthenticatedResumeGetFile { XCTAssertEqualWithAccuracy(sqrt(INT_MAX - 499), computationResult, 0.1); } +- (void)testUnauthenticatedResumeGetFileInBackgroundQueue { + XCTestExpectation *expectation = + [self expectationWithDescription:@"testUnauthenticatedResumeGetFileInBackgroundQueue"]; + + FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/1mb"]; + + NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory()]; + NSURL *fileURL = + [[tmpDirURL URLByAppendingPathComponent:@"hello"] URLByAppendingPathExtension:@"txt"]; + + __block long resumeAtBytes = 256 * 1024; + __block long downloadedBytes = 0; + + FIRStorageDownloadTask *task = [ref writeToFile:fileURL]; + + [task observeStatus:FIRStorageTaskStatusSuccess + handler:^(FIRStorageTaskSnapshot *snapshot) { + XCTAssertEqualObjects([snapshot description], @""); + [expectation fulfill]; + }]; + + [task observeStatus:FIRStorageTaskStatusProgress + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + XCTAssertTrue([[snapshot description] containsString:@"State: Progress"] || + [[snapshot description] containsString:@"State: Resume"]); + NSProgress *progress = snapshot.progress; + XCTAssertGreaterThanOrEqual(progress.completedUnitCount, downloadedBytes); + downloadedBytes = progress.completedUnitCount; + if (progress.completedUnitCount > resumeAtBytes) { + NSLog(@"Pausing"); + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [task pause]; + }); + resumeAtBytes = INT_MAX; + } + }]; + + [task observeStatus:FIRStorageTaskStatusPause + handler:^(FIRStorageTaskSnapshot *snapshot) { + XCTAssertEqualObjects([snapshot description], @""); + NSLog(@"Resuming"); + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [task resume]; + }); + }]; + + [self waitForExpectations]; + XCTAssertEqual(INT_MAX, resumeAtBytes); +} + - (void)waitForExpectations { [self waitForExpectationsWithTimeout:kFIRStorageIntegrationTestTimeout handler:^(NSError *_Nullable error) { diff --git a/Example/Storage/Tests/Unit/FIRStorageDeleteTests.m b/Example/Storage/Tests/Unit/FIRStorageDeleteTests.m index 11034ffff8e..bae7657aaeb 100644 --- a/Example/Storage/Tests/Unit/FIRStorageDeleteTests.m +++ b/Example/Storage/Tests/Unit/FIRStorageDeleteTests.m @@ -18,6 +18,7 @@ @interface FIRStorageDeleteTests : XCTestCase @property(strong, nonatomic) GTMSessionFetcherService *fetcherService; +@property(nonatomic) dispatch_queue_t dispatchQueue; @property(strong, nonatomic) FIRStorageMetadata *metadata; @property(strong, nonatomic) FIRStorage *storage; @property(strong, nonatomic) id mockApp; @@ -45,6 +46,8 @@ - (void)setUp { fetcherService:self.fetcherService authProvider:nil]; + self.dispatchQueue = dispatch_queue_create("Test dispatch queue", DISPATCH_QUEUE_SERIAL); + self.storage = [FIRStorage storageForApp:self.mockApp]; } @@ -76,6 +79,7 @@ - (void)testFetcherConfiguration { FIRStorageReference *ref = [[FIRStorageReference alloc] initWithStorage:self.storage path:path]; FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(NSError *error) { [expectation fulfill]; }]; @@ -92,6 +96,7 @@ - (void)testSuccessfulFetch { FIRStorageReference *ref = [[FIRStorageReference alloc] initWithStorage:self.storage path:path]; FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(NSError *error) { XCTAssertEqual(error, nil); [expectation fulfill]; @@ -111,6 +116,7 @@ - (void)testUnsuccessfulFetchUnauthenticated { FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(NSError *error) { XCTAssertEqual(error.code, FIRStorageErrorCodeUnauthenticated); [expectation fulfill]; @@ -130,6 +136,7 @@ - (void)testUnsuccessfulFetchUnauthorized { FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(NSError *error) { XCTAssertEqual(error.code, FIRStorageErrorCodeUnauthorized); [expectation fulfill]; @@ -149,6 +156,7 @@ - (void)testUnsuccessfulFetchObjectDoesntExist { FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(NSError *error) { XCTAssertEqual(error.code, FIRStorageErrorCodeObjectNotFound); [expectation fulfill]; diff --git a/Example/Storage/Tests/Unit/FIRStorageGetMetadataTests.m b/Example/Storage/Tests/Unit/FIRStorageGetMetadataTests.m index b7d80a64ad4..775afe2e1e3 100644 --- a/Example/Storage/Tests/Unit/FIRStorageGetMetadataTests.m +++ b/Example/Storage/Tests/Unit/FIRStorageGetMetadataTests.m @@ -18,6 +18,7 @@ @interface FIRStorageGetMetadataTests : XCTestCase @property(strong, nonatomic) GTMSessionFetcherService *fetcherService; +@property(nonatomic) dispatch_queue_t dispatchQueue; @property(strong, nonatomic) FIRStorageMetadata *metadata; @property(strong, nonatomic) FIRStorage *storage; @property(strong, nonatomic) id mockApp; @@ -45,6 +46,8 @@ - (void)setUp { fetcherService:self.fetcherService authProvider:nil]; + self.dispatchQueue = dispatch_queue_create("Test dispatch queue", DISPATCH_QUEUE_SERIAL); + self.storage = [FIRStorage storageForApp:self.mockApp]; } @@ -77,6 +80,7 @@ - (void)testFetcherConfiguration { FIRStorageGetMetadataTask *task = [[FIRStorageGetMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(FIRStorageMetadata *metadata, NSError *error) { [expectation fulfill]; }]; @@ -94,6 +98,7 @@ - (void)testSuccessfulFetch { FIRStorageGetMetadataTask *task = [[FIRStorageGetMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(FIRStorageMetadata *metadata, NSError *error) { XCTAssertEqualObjects(self.metadata.bucket, metadata.bucket); XCTAssertEqualObjects(self.metadata.name, metadata.name); @@ -115,6 +120,7 @@ - (void)testUnsuccessfulFetchUnauthenticated { FIRStorageGetMetadataTask *task = [[FIRStorageGetMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(FIRStorageMetadata *metadata, NSError *error) { XCTAssertEqual(metadata, nil); XCTAssertEqual(error.code, FIRStorageErrorCodeUnauthenticated); @@ -135,6 +141,7 @@ - (void)testUnsuccessfulFetchUnauthorized { FIRStorageGetMetadataTask *task = [[FIRStorageGetMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(FIRStorageMetadata *metadata, NSError *error) { XCTAssertEqual(metadata, nil); XCTAssertEqual(error.code, FIRStorageErrorCodeUnauthorized); @@ -155,6 +162,7 @@ - (void)testUnsuccessfulFetchObjectDoesntExist { FIRStorageGetMetadataTask *task = [[FIRStorageGetMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(FIRStorageMetadata *metadata, NSError *error) { XCTAssertEqual(metadata, nil); XCTAssertEqual(error.code, FIRStorageErrorCodeObjectNotFound); @@ -175,6 +183,7 @@ - (void)testUnsuccessfulFetchBadJSON { FIRStorageGetMetadataTask *task = [[FIRStorageGetMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue completion:^(FIRStorageMetadata *metadata, NSError *error) { XCTAssertEqual(metadata, nil); XCTAssertEqual(error.code, FIRStorageErrorCodeUnknown); diff --git a/Example/Storage/Tests/Unit/FIRStorageUpdateMetadataTests.m b/Example/Storage/Tests/Unit/FIRStorageUpdateMetadataTests.m index 9ddcf280498..d0bfa7986b8 100644 --- a/Example/Storage/Tests/Unit/FIRStorageUpdateMetadataTests.m +++ b/Example/Storage/Tests/Unit/FIRStorageUpdateMetadataTests.m @@ -19,6 +19,7 @@ @interface FIRStorageUpdateMetadataTests : XCTestCase @property(strong, nonatomic) GTMSessionFetcherService *fetcherService; +@property(nonatomic) dispatch_queue_t dispatchQueue; @property(strong, nonatomic) FIRStorageMetadata *metadata; @property(strong, nonatomic) FIRStorage *storage; @property(strong, nonatomic) id mockApp; @@ -46,6 +47,8 @@ - (void)setUp { fetcherService:self.fetcherService authProvider:nil]; + self.dispatchQueue = dispatch_queue_create("Test dispatch queue", DISPATCH_QUEUE_SERIAL); + self.storage = [FIRStorage storageForApp:self.mockApp]; } @@ -84,6 +87,7 @@ - (void)testFetcherConfiguration { FIRStorageUpdateMetadataTask *task = [[FIRStorageUpdateMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue metadata:self.metadata completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { [expectation fulfill]; @@ -102,6 +106,7 @@ - (void)testSuccessfulFetch { FIRStorageUpdateMetadataTask *task = [[FIRStorageUpdateMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue metadata:self.metadata completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { XCTAssertEqualObjects(self.metadata.bucket, metadata.bucket); @@ -124,6 +129,7 @@ - (void)testUnsuccessfulFetchUnauthenticated { FIRStorageUpdateMetadataTask *task = [[FIRStorageUpdateMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue metadata:self.metadata completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { XCTAssertNil(metadata); @@ -145,6 +151,7 @@ - (void)testUnsuccessfulFetchUnauthorized { FIRStorageUpdateMetadataTask *task = [[FIRStorageUpdateMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue metadata:self.metadata completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { XCTAssertNil(metadata); @@ -166,6 +173,7 @@ - (void)testUnsuccessfulFetchObjectDoesntExist { FIRStorageUpdateMetadataTask *task = [[FIRStorageUpdateMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue metadata:self.metadata completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { XCTAssertNil(metadata); @@ -187,6 +195,7 @@ - (void)testUnsuccessfulFetchBadJSON { FIRStorageUpdateMetadataTask *task = [[FIRStorageUpdateMetadataTask alloc] initWithReference:ref fetcherService:self.fetcherService + dispatchQueue:self.dispatchQueue metadata:self.metadata completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { XCTAssertNil(metadata); diff --git a/Firebase/Storage/FIRStorage.m b/Firebase/Storage/FIRStorage.m index 65613f876b6..82dcbfa4da4 100644 --- a/Firebase/Storage/FIRStorage.m +++ b/Firebase/Storage/FIRStorage.m @@ -149,6 +149,7 @@ - (instancetype)initWithApp:(FIRApp *)app _app = app; _auth = auth; _storageBucket = bucket; + _dispatchQueue = dispatch_queue_create("com.google.firebase.storage", DISPATCH_QUEUE_SERIAL); _fetcherServiceForApp = [FIRStorage fetcherServiceForApp:_app bucket:bucket auth:auth]; _maxDownloadRetryTime = 600.0; _maxOperationRetryTime = 120.0; diff --git a/Firebase/Storage/FIRStorageDeleteTask.m b/Firebase/Storage/FIRStorageDeleteTask.m index b41f06ed9d3..5617e48120d 100644 --- a/Firebase/Storage/FIRStorageDeleteTask.m +++ b/Firebase/Storage/FIRStorageDeleteTask.m @@ -30,8 +30,9 @@ - (void)dealloc { - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue completion:(FIRStorageVoidError)completion { - self = [super initWithReference:reference fetcherService:service]; + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _completion = [completion copy]; } @@ -39,34 +40,43 @@ - (instancetype)initWithReference:(FIRStorageReference *)reference } - (void)enqueue { - NSMutableURLRequest *request = [self.baseRequest mutableCopy]; - request.HTTPMethod = @"DELETE"; - request.timeoutInterval = self.reference.storage.maxOperationRetryTime; + __weak FIRStorageDeleteTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageDeleteTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } - FIRStorageVoidError callback = _completion; - _completion = nil; + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"DELETE"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; - GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request]; - _fetcher = fetcher; + FIRStorageVoidError callback = strongSelf->_completion; + strongSelf->_completion = nil; - fetcher.comment = @"DeleteTask"; + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + + fetcher.comment = @"DeleteTask"; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" - _fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) { - if (!self.error) { - self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; - } - if (callback) { - callback(self.error); - } - self->_fetcherCompletion = nil; - }; + strongSelf->_fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } + if (callback) { + callback(self.error); + } + self->_fetcherCompletion = nil; + }; #pragma clang diangostic pop - __weak FIRStorageDeleteTask *weakSelf = self; - [fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { - weakSelf.fetcherCompletion(data, error); + [fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { + weakSelf.fetcherCompletion(data, error); + }]; }]; } diff --git a/Firebase/Storage/FIRStorageDownloadTask.m b/Firebase/Storage/FIRStorageDownloadTask.m index 91da4b72700..0752df73538 100644 --- a/Firebase/Storage/FIRStorageDownloadTask.m +++ b/Firebase/Storage/FIRStorageDownloadTask.m @@ -27,8 +27,9 @@ @implementation FIRStorageDownloadTask - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue file:(nullable NSURL *)fileURL { - self = [super initWithReference:reference fetcherService:service]; + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _fileURL = [fileURL copy]; _progress = [NSProgress progressWithTotalUnitCount:0]; @@ -45,97 +46,102 @@ - (void)enqueue { } - (void)enqueueWithData:(nullable NSData *)resumeData { - NSAssert([NSThread isMainThread], - @"Download attempting to execute on non main queue! Please " - @"only execute this method on the main queue."); - self.state = FIRStorageTaskStateQueueing; - NSMutableURLRequest *request = [self.baseRequest mutableCopy]; - request.HTTPMethod = @"GET"; - request.timeoutInterval = self.reference.storage.maxDownloadRetryTime; - NSURLComponents *components = - [NSURLComponents componentsWithURL:request.URL resolvingAgainstBaseURL:NO]; - [components setQuery:@"alt=media"]; - request.URL = components.URL; - - GTMSessionFetcher *fetcher; - if (resumeData) { - fetcher = [GTMSessionFetcher fetcherWithDownloadResumeData:resumeData]; - fetcher.comment = @"Resuming DownloadTask"; - } else { - fetcher = [self.fetcherService fetcherWithRequest:request]; - fetcher.comment = @"Starting DownloadTask"; - } - __weak FIRStorageDownloadTask *weakSelf = self; - [fetcher setResumeDataBlock:^(NSData *data) { - if (data) { - FIRStorageDownloadTask *strongSelf = weakSelf; - strongSelf->_downloadData = data; + [self dispatchAsync:^() { + FIRStorageDownloadTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; } - }]; - fetcher.maxRetryInterval = self.reference.storage.maxDownloadRetryTime; - - if (_fileURL) { - // Handle file downloads - [fetcher setDestinationFileURL:_fileURL]; - [fetcher setDownloadProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten, - int64_t totalBytesExpectedToWrite) { - weakSelf.state = FIRStorageTaskStateProgress; - weakSelf.progress.completedUnitCount = totalBytesWritten; - weakSelf.progress.totalUnitCount = totalBytesExpectedToWrite; - FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; - [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; - weakSelf.state = FIRStorageTaskStateRunning; - }]; - } else { - // Handle data downloads - [fetcher setReceivedProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten) { - weakSelf.state = FIRStorageTaskStateProgress; - weakSelf.progress.completedUnitCount = totalBytesWritten; - int64_t totalLength = [[weakSelf.fetcher response] expectedContentLength]; - weakSelf.progress.totalUnitCount = totalLength; - FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; - [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; - weakSelf.state = FIRStorageTaskStateRunning; + strongSelf.state = FIRStorageTaskStateQueueing; + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"GET"; + request.timeoutInterval = strongSelf.reference.storage.maxDownloadRetryTime; + NSURLComponents *components = + [NSURLComponents componentsWithURL:request.URL resolvingAgainstBaseURL:NO]; + [components setQuery:@"alt=media"]; + request.URL = components.URL; + + GTMSessionFetcher *fetcher; + if (resumeData) { + fetcher = [GTMSessionFetcher fetcherWithDownloadResumeData:resumeData]; + fetcher.comment = @"Resuming DownloadTask"; + } else { + fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + fetcher.comment = @"Starting DownloadTask"; + } + + [fetcher setResumeDataBlock:^(NSData *data) { + FIRStorageDownloadTask *strong = weakSelf; + if (strong && data) { + strong->_downloadData = data; + } }]; - } - _fetcher = fetcher; + fetcher.maxRetryInterval = strongSelf.reference.storage.maxDownloadRetryTime; + + if (strongSelf->_fileURL) { + // Handle file downloads + [fetcher setDestinationFileURL:strongSelf->_fileURL]; + [fetcher setDownloadProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten, + int64_t totalBytesExpectedToWrite) { + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesWritten; + weakSelf.progress.totalUnitCount = totalBytesExpectedToWrite; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; + } else { + // Handle data downloads + [fetcher setReceivedProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten) { + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesWritten; + int64_t totalLength = [[weakSelf.fetcher response] expectedContentLength]; + weakSelf.progress.totalUnitCount = totalLength; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; + } + + strongSelf->_fetcher = fetcher; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" - _fetcherCompletion = ^(NSData *data, NSError *error) { - // Fire last progress updates - [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot]; - - // Handle potential issues with download - if (error) { - self.state = FIRStorageTaskStateFailed; - self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; - [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + // Fire last progress updates + [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot]; + + // Handle potential issues with download + if (error) { + self.state = FIRStorageTaskStateFailed; + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + [self removeAllObservers]; + self->_fetcherCompletion = nil; + return; + } + + // Download completed successfully, fire completion callbacks + self.state = FIRStorageTaskStateSuccess; + + if (data) { + self->_downloadData = data; + } + + [self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; [self removeAllObservers]; self->_fetcherCompletion = nil; - return; - } - - // Download completed successfully, fire completion callbacks - self.state = FIRStorageTaskStateSuccess; - - if (data) { - self->_downloadData = data; - } - - [self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; - [self removeAllObservers]; - self->_fetcherCompletion = nil; - }; + }; #pragma clang diagnostic pop - self.state = FIRStorageTaskStateRunning; - [self.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - weakSelf.fetcherCompletion(data, error); + strongSelf.state = FIRStorageTaskStateRunning; + [strongSelf.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; }]; } @@ -147,37 +153,37 @@ - (void)cancel { } - (void)cancelWithError:(NSError *)error { - NSAssert([NSThread isMainThread], - @"Cancel attempting to execute on non main queue! Please only " - @"execute this method on the main queue."); - self.state = FIRStorageTaskStateCancelled; - [self.fetcher stopFetching]; - self.error = error; - [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + __weak FIRStorageDownloadTask *weakSelf = self; + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateCancelled; + [weakSelf.fetcher stopFetching]; + weakSelf.error = error; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:weakSelf.snapshot]; + }]; } - (void)pause { - NSAssert([NSThread isMainThread], - @"Pause attempting to execute on non main queue! Please only " - @"execute this method on the main queue."); - self.state = FIRStorageTaskStatePausing; - [self.fetcher stopFetching]; - // Give the resume callback a chance to run (if scheduled) - [self.fetcher waitForCompletionWithTimeout:0.001]; - self.state = FIRStorageTaskStatePaused; - FIRStorageTaskSnapshot *snapshot = self.snapshot; - [self fireHandlersForStatus:FIRStorageTaskStatusPause snapshot:snapshot]; + __weak FIRStorageDownloadTask *weakSelf = self; + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStatePausing; + [weakSelf.fetcher stopFetching]; + // Give the resume callback a chance to run (if scheduled) + [weakSelf.fetcher waitForCompletionWithTimeout:0.001]; + weakSelf.state = FIRStorageTaskStatePaused; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusPause snapshot:snapshot]; + }]; } - (void)resume { - NSAssert([NSThread isMainThread], - @"Resume attempting to execute on non main queue! Please only " - @"execute this method on the main queue."); - self.state = FIRStorageTaskStateResuming; - FIRStorageTaskSnapshot *snapshot = self.snapshot; - [self fireHandlersForStatus:FIRStorageTaskStatusResume snapshot:snapshot]; - self.state = FIRStorageTaskStateRunning; - [self enqueueWithData:_downloadData]; + __weak FIRStorageDownloadTask *weakSelf = self; + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateResuming; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusResume snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + [weakSelf enqueueWithData:weakSelf.downloadData]; + }]; } @end diff --git a/Firebase/Storage/FIRStorageGetDownloadURLTask.m b/Firebase/Storage/FIRStorageGetDownloadURLTask.m index 02d202e8ea3..f5f7a7ad382 100644 --- a/Firebase/Storage/FIRStorageGetDownloadURLTask.m +++ b/Firebase/Storage/FIRStorageGetDownloadURLTask.m @@ -26,8 +26,9 @@ @implementation FIRStorageGetDownloadURLTask { - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue completion:(FIRStorageVoidURLError)completion { - self = [super initWithReference:reference fetcherService:service]; + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _completion = [completion copy]; } @@ -67,51 +68,59 @@ + (NSURL *)downloadURLFromMetadataDictionary:(NSDictionary *)dictionary { } - (void)enqueue { - NSMutableURLRequest *request = [self.baseRequest mutableCopy]; - request.HTTPMethod = @"GET"; - request.timeoutInterval = self.reference.storage.maxOperationRetryTime; + __weak FIRStorageGetDownloadURLTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageGetDownloadURLTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } - FIRStorageVoidURLError callback = _completion; - _completion = nil; + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"GET"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; - GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request]; - _fetcher = fetcher; - fetcher.comment = @"GetDownloadURLTask"; + FIRStorageVoidURLError callback = strongSelf->_completion; + strongSelf->_completion = nil; + + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + fetcher.comment = @"GetDownloadURLTask"; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" - _fetcherCompletion = ^(NSData *data, NSError *error) { - NSURL *downloadURL; - if (error) { - if (!self.error) { - self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; - } - } else { - NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; - if (responseDictionary != nil) { - downloadURL = - [FIRStorageGetDownloadURLTask downloadURLFromMetadataDictionary:responseDictionary]; - if (!downloadURL) { - self.error = - [FIRStorageErrors errorWithCustomMessage:@"Failed to retrieve a download URL."]; + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + NSURL *downloadURL; + if (error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; } } else { - self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary != nil) { + downloadURL = + [FIRStorageGetDownloadURLTask downloadURLFromMetadataDictionary:responseDictionary]; + if (!downloadURL) { + self.error = + [FIRStorageErrors errorWithCustomMessage:@"Failed to retrieve a download URL."]; + } + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } } - } - if (callback) { - callback(downloadURL, self.error); - } + if (callback) { + callback(downloadURL, self.error); + } - self->_fetcherCompletion = nil; - }; + self->_fetcherCompletion = nil; + }; #pragma clang diagnostic pop - - __weak FIRStorageGetDownloadURLTask *weakSelf = self; - [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - weakSelf.fetcherCompletion(data, error); + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; }]; -} +}; @end diff --git a/Firebase/Storage/FIRStorageGetMetadataTask.m b/Firebase/Storage/FIRStorageGetMetadataTask.m index 752c4102640..efa637b9436 100644 --- a/Firebase/Storage/FIRStorageGetMetadataTask.m +++ b/Firebase/Storage/FIRStorageGetMetadataTask.m @@ -31,8 +31,9 @@ @implementation FIRStorageGetMetadataTask { - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue completion:(FIRStorageVoidMetadataError)completion { - self = [super initWithReference:reference fetcherService:service]; + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _completion = [completion copy]; } @@ -44,45 +45,54 @@ - (void)dealloc { } - (void)enqueue { - NSMutableURLRequest *request = [self.baseRequest mutableCopy]; - request.HTTPMethod = @"GET"; - request.timeoutInterval = self.reference.storage.maxOperationRetryTime; + __weak FIRStorageGetMetadataTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageGetMetadataTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"GET"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; - FIRStorageVoidMetadataError callback = _completion; - _completion = nil; + FIRStorageVoidMetadataError callback = strongSelf->_completion; + strongSelf->_completion = nil; - GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request]; - _fetcher = fetcher; - fetcher.comment = @"GetMetadataTask"; + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + fetcher.comment = @"GetMetadataTask"; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" - _fetcherCompletion = ^(NSData *data, NSError *error) { - FIRStorageMetadata *metadata; - if (error) { - if (!self.error) { - self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; - } - } else { - NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; - if (responseDictionary != nil) { - metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; - [metadata setType:FIRStorageMetadataTypeFile]; + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + FIRStorageMetadata *metadata; + if (error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } } else { - self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary != nil) { + metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; + [metadata setType:FIRStorageMetadataTypeFile]; + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } } - } - if (callback) { - callback(metadata, self.error); - } - self->_fetcherCompletion = nil; - }; + if (callback) { + callback(metadata, self.error); + } + self->_fetcherCompletion = nil; + }; #pragma clang diagnostic pop - __weak FIRStorageGetMetadataTask *weakSelf = self; - [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - weakSelf.fetcherCompletion(data, error); + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; }]; } diff --git a/Firebase/Storage/FIRStorageObservableTask.m b/Firebase/Storage/FIRStorageObservableTask.m index 4650b17f4e7..2f35e53ff12 100644 --- a/Firebase/Storage/FIRStorageObservableTask.m +++ b/Firebase/Storage/FIRStorageObservableTask.m @@ -31,8 +31,9 @@ @implementation FIRStorageObservableTask { @synthesize state = _state; - (instancetype)initWithReference:(FIRStorageReference *)reference - fetcherService:(GTMSessionFetcherService *)service { - self = [super initWithReference:reference fetcherService:service]; + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _pauseHandlers = [[NSMutableDictionary alloc] init]; _resumeHandlers = [[NSMutableDictionary alloc] init]; diff --git a/Firebase/Storage/FIRStorageReference.m b/Firebase/Storage/FIRStorageReference.m index 51eefa5ea85..99f00992473 100644 --- a/Firebase/Storage/FIRStorageReference.m +++ b/Firebase/Storage/FIRStorageReference.m @@ -167,6 +167,7 @@ - (FIRStorageUploadTask *)putData:(NSData *)uploadData FIRStorageUploadTask *task = [[FIRStorageUploadTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue data:uploadData metadata:metadata]; @@ -214,6 +215,7 @@ - (FIRStorageUploadTask *)putFile:(NSURL *)fileURL FIRStorageUploadTask *task = [[FIRStorageUploadTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue file:fileURL metadata:metadata]; @@ -247,6 +249,7 @@ - (FIRStorageDownloadTask *)dataWithMaxSize:(int64_t)size FIRStorageDownloadTask *task = [[FIRStorageDownloadTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue file:nil]; dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue; @@ -294,6 +297,7 @@ - (FIRStorageDownloadTask *)writeToFile:(NSURL *)fileURL FIRStorageDownloadTask *task = [[FIRStorageDownloadTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue file:fileURL]; if (completion) { dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue; @@ -322,6 +326,7 @@ - (void)downloadURLWithCompletion:(FIRStorageVoidURLError)completion { FIRStorageGetDownloadURLTask *task = [[FIRStorageGetDownloadURLTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue completion:completion]; [task enqueue]; } @@ -332,6 +337,7 @@ - (void)metadataWithCompletion:(FIRStorageVoidMetadataError)completion { FIRStorageGetMetadataTask *task = [[FIRStorageGetMetadataTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue completion:completion]; [task enqueue]; } @@ -341,6 +347,7 @@ - (void)updateMetadata:(FIRStorageMetadata *)metadata FIRStorageUpdateMetadataTask *task = [[FIRStorageUpdateMetadataTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue metadata:metadata completion:completion]; [task enqueue]; @@ -352,6 +359,7 @@ - (void)deleteWithCompletion:(nullable FIRStorageVoidError)completion { FIRStorageDeleteTask *task = [[FIRStorageDeleteTask alloc] initWithReference:self fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue completion:completion]; [task enqueue]; } diff --git a/Firebase/Storage/FIRStorageTask.m b/Firebase/Storage/FIRStorageTask.m index 0305a39c327..c0848df259d 100644 --- a/Firebase/Storage/FIRStorageTask.m +++ b/Firebase/Storage/FIRStorageTask.m @@ -27,21 +27,21 @@ @implementation FIRStorageTask - (instancetype)init { - FIRStorage *storage = [FIRStorage storage]; - FIRStorageReference *reference = [storage reference]; - FIRStorageTask *task = - [self initWithReference:reference fetcherService:storage.fetcherServiceForApp]; - return task; + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." + reason:@"init unavailable, use designated initializer" + userInfo:nil]; } - (instancetype)initWithReference:(FIRStorageReference *)reference - fetcherService:(GTMSessionFetcherService *)service { + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue { self = [super init]; if (self) { _reference = reference; _baseRequest = [FIRStorageUtils defaultRequestForPath:reference.path]; _fetcherService = service; _fetcherService.maxRetryInterval = _reference.storage.maxOperationRetryTime; + _dispatchQueue = queue; } return self; } @@ -61,4 +61,8 @@ - (FIRStorageTaskSnapshot *)snapshot { } } +- (void)dispatchAsync:(void (^)(void))block { + dispatch_async(self.dispatchQueue, block); +} + @end diff --git a/Firebase/Storage/FIRStorageUpdateMetadataTask.m b/Firebase/Storage/FIRStorageUpdateMetadataTask.m index cea4e7d8ced..70665b1e434 100644 --- a/Firebase/Storage/FIRStorageUpdateMetadataTask.m +++ b/Firebase/Storage/FIRStorageUpdateMetadataTask.m @@ -29,9 +29,10 @@ @implementation FIRStorageUpdateMetadataTask { - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue metadata:(FIRStorageMetadata *)metadata completion:(FIRStorageVoidMetadataError)completion { - self = [super initWithReference:reference fetcherService:service]; + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _updateMetadata = [metadata copy]; _completion = [completion copy]; @@ -44,53 +45,62 @@ - (void)dealloc { } - (void)enqueue { - NSMutableURLRequest *request = [self.baseRequest mutableCopy]; - NSDictionary *updateDictionary = [_updateMetadata updatedMetadata]; - NSData *updateData = [NSData frs_dataFromJSONDictionary:updateDictionary]; - request.HTTPMethod = @"PATCH"; - request.timeoutInterval = self.reference.storage.maxOperationRetryTime; - request.HTTPBody = updateData; - NSString *typeString = @"application/json; charset=UTF-8"; - [request setValue:typeString forHTTPHeaderField:@"Content-Type"]; - NSString *lengthString = [NSString stringWithFormat:@"%zu", (unsigned long)[updateData length]]; - [request setValue:lengthString forHTTPHeaderField:@"Content-Length"]; - - FIRStorageVoidMetadataError callback = _completion; - _completion = nil; - - GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request]; - _fetcher = fetcher; + __weak FIRStorageUpdateMetadataTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageUpdateMetadataTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + NSDictionary *updateDictionary = [strongSelf->_updateMetadata updatedMetadata]; + NSData *updateData = [NSData frs_dataFromJSONDictionary:updateDictionary]; + request.HTTPMethod = @"PATCH"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; + request.HTTPBody = updateData; + NSString *typeString = @"application/json; charset=UTF-8"; + [request setValue:typeString forHTTPHeaderField:@"Content-Type"]; + NSString *lengthString = [NSString stringWithFormat:@"%zu", (unsigned long)[updateData length]]; + [request setValue:lengthString forHTTPHeaderField:@"Content-Length"]; + + FIRStorageVoidMetadataError callback = strongSelf->_completion; + strongSelf->_completion = nil; + + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" - _fetcherCompletion = ^(NSData *data, NSError *error) { - FIRStorageMetadata *metadata; - if (error) { - if (!self.error) { - self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; - } - } else { - NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; - if (responseDictionary) { - metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; - [metadata setType:FIRStorageMetadataTypeFile]; + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + FIRStorageMetadata *metadata; + if (error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } } else { - self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary) { + metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; + [metadata setType:FIRStorageMetadataTypeFile]; + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } } - } - if (callback) { - callback(metadata, self.error); - } - self->_fetcherCompletion = nil; - }; + if (callback) { + callback(metadata, self.error); + } + self->_fetcherCompletion = nil; + }; #pragma clang diagnostic pop - fetcher.comment = @"UpdateMetadataTask"; + fetcher.comment = @"UpdateMetadataTask"; - __weak FIRStorageUpdateMetadataTask *weakSelf = self; - [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - weakSelf.fetcherCompletion(data, error); + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; }]; } diff --git a/Firebase/Storage/FIRStorageUploadTask.m b/Firebase/Storage/FIRStorageUploadTask.m index 2c4daa962e0..8c299e79edc 100644 --- a/Firebase/Storage/FIRStorageUploadTask.m +++ b/Firebase/Storage/FIRStorageUploadTask.m @@ -29,9 +29,10 @@ @implementation FIRStorageUploadTask - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue data:(NSData *)uploadData metadata:(FIRStorageMetadata *)metadata { - self = [super initWithReference:reference fetcherService:service]; + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _uploadMetadata = [metadata copy]; _uploadData = [uploadData copy]; @@ -46,9 +47,10 @@ - (instancetype)initWithReference:(FIRStorageReference *)reference - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue file:(NSURL *)fileURL metadata:(FIRStorageMetadata *)metadata { - self = [super initWithReference:reference fetcherService:service]; + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; if (self) { _uploadMetadata = [metadata copy]; _fileURL = [fileURL copy]; @@ -68,145 +70,154 @@ - (void)dealloc { } - (void)enqueue { - NSAssert([NSThread isMainThread], - @"Upload attempting to execute on non main queue! Please only " - @"execute this method on the main queue."); - self.state = FIRStorageTaskStateQueueing; - - NSMutableURLRequest *request = [self.baseRequest mutableCopy]; - request.HTTPMethod = @"POST"; - request.timeoutInterval = self.reference.storage.maxUploadRetryTime; - NSData *bodyData = [NSData frs_dataFromJSONDictionary:[_uploadMetadata dictionaryRepresentation]]; - request.HTTPBody = bodyData; - [request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; - NSString *contentLengthString = - [NSString stringWithFormat:@"%zu", (unsigned long)[bodyData length]]; - [request setValue:contentLengthString forHTTPHeaderField:@"Content-Length"]; - - NSURLComponents *components = - [NSURLComponents componentsWithURL:request.URL resolvingAgainstBaseURL:NO]; - - if ([components.host isEqual:kGCSHost]) { - [components setPercentEncodedPath:[@"/upload" stringByAppendingString:components.path]]; - } + __weak FIRStorageUploadTask *weakSelf = self; - NSDictionary *queryParams = @{@"uploadType" : @"resumable", @"name" : self.uploadMetadata.path}; - [components setPercentEncodedQuery:[FIRStorageUtils queryStringForDictionary:queryParams]]; - request.URL = components.URL; - - GTMSessionUploadFetcher *uploadFetcher = - [GTMSessionUploadFetcher uploadFetcherWithRequest:request - uploadMIMEType:_uploadMetadata.contentType - chunkSize:kGTMSessionUploadFetcherStandardChunkSize - fetcherService:self.fetcherService]; - - if (_uploadData) { - [uploadFetcher setUploadData:_uploadData]; - uploadFetcher.comment = @"Data UploadTask"; - } else if (_fileURL) { - [uploadFetcher setUploadFileURL:_fileURL]; - uploadFetcher.comment = @"File UploadTask"; - } + [self dispatchAsync:^() { + FIRStorageUploadTask *strongSelf = weakSelf; - uploadFetcher.maxRetryInterval = self.reference.storage.maxUploadRetryTime; + if (!strongSelf) { + return; + } - __weak FIRStorageUploadTask *weakSelf = self; + strongSelf.state = FIRStorageTaskStateQueueing; - [uploadFetcher setSendProgressBlock:^(int64_t bytesSent, int64_t totalBytesSent, - int64_t totalBytesExpectedToSend) { - weakSelf.state = FIRStorageTaskStateProgress; - weakSelf.progress.completedUnitCount = totalBytesSent; - weakSelf.progress.totalUnitCount = totalBytesExpectedToSend; - weakSelf.metadata = self->_uploadMetadata; - [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:weakSelf.snapshot]; - weakSelf.state = FIRStorageTaskStateRunning; - }]; + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"POST"; + request.timeoutInterval = strongSelf.reference.storage.maxUploadRetryTime; + NSData *bodyData = + [NSData frs_dataFromJSONDictionary:[strongSelf->_uploadMetadata dictionaryRepresentation]]; + request.HTTPBody = bodyData; + [request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; + NSString *contentLengthString = + [NSString stringWithFormat:@"%zu", (unsigned long)[bodyData length]]; + [request setValue:contentLengthString forHTTPHeaderField:@"Content-Length"]; - _uploadFetcher = uploadFetcher; + NSURLComponents *components = + [NSURLComponents componentsWithURL:request.URL resolvingAgainstBaseURL:NO]; - // Process fetches - self.state = FIRStorageTaskStateRunning; + if ([components.host isEqual:kGCSHost]) { + [components setPercentEncodedPath:[@"/upload" stringByAppendingString:components.path]]; + } + + NSDictionary *queryParams = @{@"uploadType" : @"resumable", @"name" : self.uploadMetadata.path}; + [components setPercentEncodedQuery:[FIRStorageUtils queryStringForDictionary:queryParams]]; + request.URL = components.URL; + + GTMSessionUploadFetcher *uploadFetcher = + [GTMSessionUploadFetcher uploadFetcherWithRequest:request + uploadMIMEType:strongSelf->_uploadMetadata.contentType + chunkSize:kGTMSessionUploadFetcherStandardChunkSize + fetcherService:self.fetcherService]; + + if (strongSelf->_uploadData) { + [uploadFetcher setUploadData:strongSelf->_uploadData]; + uploadFetcher.comment = @"Data UploadTask"; + } else if (strongSelf->_fileURL) { + [uploadFetcher setUploadFileURL:strongSelf->_fileURL]; + uploadFetcher.comment = @"File UploadTask"; + } + + uploadFetcher.maxRetryInterval = self.reference.storage.maxUploadRetryTime; + + [uploadFetcher setSendProgressBlock:^(int64_t bytesSent, int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesSent; + weakSelf.progress.totalUnitCount = totalBytesExpectedToSend; + weakSelf.metadata = self->_uploadMetadata; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:weakSelf.snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; + + strongSelf->_uploadFetcher = uploadFetcher; + + // Process fetches + strongSelf.state = FIRStorageTaskStateRunning; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" - _fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) { - // Fire last progress updates - [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot]; - - // Handle potential issues with upload - if (error) { - self.state = FIRStorageTaskStateFailed; - self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; - self.metadata = self->_uploadMetadata; - [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + strongSelf->_fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) { + // Fire last progress updates + [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot]; + + // Handle potential issues with upload + if (error) { + self.state = FIRStorageTaskStateFailed; + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + self.metadata = self->_uploadMetadata; + [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + [self removeAllObservers]; + self->_fetcherCompletion = nil; + return; + } + + // Upload completed successfully, fire completion callbacks + self.state = FIRStorageTaskStateSuccess; + + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary) { + FIRStorageMetadata *metadata = + [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; + [metadata setType:FIRStorageMetadataTypeFile]; + self.metadata = metadata; + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } + + [self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; [self removeAllObservers]; self->_fetcherCompletion = nil; - return; - } - - // Upload completed successfully, fire completion callbacks - self.state = FIRStorageTaskStateSuccess; - - NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; - if (responseDictionary) { - FIRStorageMetadata *metadata = - [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; - [metadata setType:FIRStorageMetadataTypeFile]; - self.metadata = metadata; - } else { - self.error = [FIRStorageErrors errorWithInvalidRequest:data]; - } - - [self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; - [self removeAllObservers]; - self->_fetcherCompletion = nil; - }; + }; #pragma clang diagnostic pop - [_uploadFetcher - beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { - weakSelf.fetcherCompletion(data, error); - }]; + [strongSelf->_uploadFetcher + beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { + weakSelf.fetcherCompletion(data, error); + }]; + }]; } #pragma mark - Upload Management - (void)cancel { - NSAssert([NSThread isMainThread], - @"Cancel attempting to execute on non main queue! Please only " - @"execute this method on the main queue."); - self.state = FIRStorageTaskStateCancelled; - [_uploadFetcher stopFetching]; - if (self.state != FIRStorageTaskStateSuccess) { - self.metadata = _uploadMetadata; - } - self.error = [FIRStorageErrors errorWithCode:FIRStorageErrorCodeCancelled]; - [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + __weak FIRStorageUploadTask *weakSelf = self; + + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateCancelled; + [weakSelf.uploadFetcher stopFetching]; + if (weakSelf.state != FIRStorageTaskStateSuccess) { + weakSelf.metadata = weakSelf.uploadMetadata; + } + weakSelf.error = [FIRStorageErrors errorWithCode:FIRStorageErrorCodeCancelled]; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:weakSelf.snapshot]; + }]; } - (void)pause { - NSAssert([NSThread isMainThread], - @"Pause attempting to execute on non main queue! Please only " - @"execute this method on the main queue."); - self.state = FIRStorageTaskStatePaused; - [_uploadFetcher pauseFetching]; - if (self.state != FIRStorageTaskStateSuccess) { - self.metadata = _uploadMetadata; - } - [self fireHandlersForStatus:FIRStorageTaskStatusPause snapshot:self.snapshot]; + __weak FIRStorageUploadTask *weakSelf = self; + + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStatePaused; + [weakSelf.uploadFetcher pauseFetching]; + if (weakSelf.state != FIRStorageTaskStateSuccess) { + weakSelf.metadata = weakSelf.uploadMetadata; + } + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusPause snapshot:weakSelf.snapshot]; + }]; } - (void)resume { - NSAssert([NSThread isMainThread], - @"Resume attempting to execute on non main queue! Please only " - @"execute this method on the main queue."); - self.state = FIRStorageTaskStateResuming; - [_uploadFetcher resumeFetching]; - if (self.state != FIRStorageTaskStateSuccess) { - self.metadata = _uploadMetadata; - } - [self fireHandlersForStatus:FIRStorageTaskStatusResume snapshot:self.snapshot]; - self.state = FIRStorageTaskStateRunning; + __weak FIRStorageUploadTask *weakSelf = self; + + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateResuming; + [weakSelf.uploadFetcher resumeFetching]; + if (weakSelf.state != FIRStorageTaskStateSuccess) { + weakSelf.metadata = weakSelf.uploadMetadata; + } + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusResume snapshot:weakSelf.snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; } @end diff --git a/Firebase/Storage/Private/FIRStorageDeleteTask.h b/Firebase/Storage/Private/FIRStorageDeleteTask.h index 4c93de2886d..5eeaa889e9c 100644 --- a/Firebase/Storage/Private/FIRStorageDeleteTask.h +++ b/Firebase/Storage/Private/FIRStorageDeleteTask.h @@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue completion:(FIRStorageVoidError)completion; @end diff --git a/Firebase/Storage/Private/FIRStorageDownloadTask_Private.h b/Firebase/Storage/Private/FIRStorageDownloadTask_Private.h index 293d1d5b438..8b5a0d86d2f 100644 --- a/Firebase/Storage/Private/FIRStorageDownloadTask_Private.h +++ b/Firebase/Storage/Private/FIRStorageDownloadTask_Private.h @@ -34,11 +34,13 @@ NS_ASSUME_NONNULL_BEGIN * Initializes a download task with a base FIRStorageReference and GTMSessionFetcherService. * @param reference The base FIRStorageReference which fetchers use for configuration. * @param service The GTMSessionFetcherService which will create fetchers. + * @param queue The shared queue to use for all Storage operations. * @param fileURL The system URL to download to. If nil, download in memory as bytes. * @return Returns an instance of FIRStorageDownloadTask */ - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue file:(nullable NSURL *)fileURL; /** diff --git a/Firebase/Storage/Private/FIRStorageGetDownloadURLTask.h b/Firebase/Storage/Private/FIRStorageGetDownloadURLTask.h index 8cd9eb31930..0dc81791a57 100644 --- a/Firebase/Storage/Private/FIRStorageGetDownloadURLTask.h +++ b/Firebase/Storage/Private/FIRStorageGetDownloadURLTask.h @@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue completion:(FIRStorageVoidURLError)completion; @end diff --git a/Firebase/Storage/Private/FIRStorageGetMetadataTask.h b/Firebase/Storage/Private/FIRStorageGetMetadataTask.h index e5ba37e7065..e98d6d1ef76 100644 --- a/Firebase/Storage/Private/FIRStorageGetMetadataTask.h +++ b/Firebase/Storage/Private/FIRStorageGetMetadataTask.h @@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue completion:(FIRStorageVoidMetadataError)completion; @end diff --git a/Firebase/Storage/Private/FIRStorageObservableTask_Private.h b/Firebase/Storage/Private/FIRStorageObservableTask_Private.h index e37b63fa645..404ec9e328f 100644 --- a/Firebase/Storage/Private/FIRStorageObservableTask_Private.h +++ b/Firebase/Storage/Private/FIRStorageObservableTask_Private.h @@ -27,10 +27,12 @@ NS_ASSUME_NONNULL_BEGIN * @param reference A FIRStorageReference the task will be performed on. * @param service A GTMSessionFetcherService which provides the fetchers and configuration for * requests. + * @param queue The shared queue to use for all Storage operations. * @return A new FIRStorageTask representing the current task. */ - (instancetype)initWithReference:(FIRStorageReference *)reference - fetcherService:(GTMSessionFetcherService *)service; + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue; /** * Raise events for a given task status by passing along a snapshot of existing task state. diff --git a/Firebase/Storage/Private/FIRStorageTask_Private.h b/Firebase/Storage/Private/FIRStorageTask_Private.h index 382f27febfb..582043e4b25 100644 --- a/Firebase/Storage/Private/FIRStorageTask_Private.h +++ b/Firebase/Storage/Private/FIRStorageTask_Private.h @@ -54,6 +54,11 @@ NS_ASSUME_NONNULL_BEGIN */ @property(strong, nonatomic) FIRStorageReference *reference; +/** + * A serial queue for all storage operations. + */ +@property(nonatomic, readonly) dispatch_queue_t dispatchQueue; + @property(strong, readwrite, nonatomic, nonnull) FIRStorageTaskSnapshot *snapshot; @property(readonly, copy, nonatomic) NSURLRequest *baseRequest; @@ -64,15 +69,22 @@ NS_ASSUME_NONNULL_BEGIN @property(readonly, copy) GTMSessionFetcherCompletionHandler fetcherCompletion; +- (instancetype)init NS_UNAVAILABLE; + /** * Creates a new FIRStorageTask initialized with a FIRStorageReference and GTMSessionFetcherService. * @param reference A FIRStorageReference the task will be performed on. * @param service A GTMSessionFetcherService which provides the fetchers and configuration for * requests. + * @param queue The shared queue to use for all Storage operations. * @return A new FIRStorageTask representing the current task. */ - (instancetype)initWithReference:(FIRStorageReference *)reference - fetcherService:(GTMSessionFetcherService *)service NS_DESIGNATED_INITIALIZER; + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER; + +/** Dispatches a block on the shared Storage queue. */ +- (void)dispatchAsync:(void (^)(void))block; @end diff --git a/Firebase/Storage/Private/FIRStorageUpdateMetadataTask.h b/Firebase/Storage/Private/FIRStorageUpdateMetadataTask.h index 46bd65a8232..23c6c34b7a0 100644 --- a/Firebase/Storage/Private/FIRStorageUpdateMetadataTask.h +++ b/Firebase/Storage/Private/FIRStorageUpdateMetadataTask.h @@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue metadata:(FIRStorageMetadata *)metadata completion:(FIRStorageVoidMetadataError)completion; diff --git a/Firebase/Storage/Private/FIRStorageUploadTask_Private.h b/Firebase/Storage/Private/FIRStorageUploadTask_Private.h index 468d9d39a14..8d37a8b62eb 100644 --- a/Firebase/Storage/Private/FIRStorageUploadTask_Private.h +++ b/Firebase/Storage/Private/FIRStorageUploadTask_Private.h @@ -44,11 +44,13 @@ NS_ASSUME_NONNULL_BEGIN * Initializes an upload task with a base FIRStorageReference and GTMSessionFetcherService. * @param reference The base FIRStorageReference which fetchers use for configuration. * @param service The GTMSessionFetcherService which will create fetchers. + * @param queue The shared queue to use for all Storage operations. * @param uploadData The NSData object to be uploaded. * @return Returns an instance of FIRStorageUploadTask. */ - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue data:(NSData *)uploadData metadata:(FIRStorageMetadata *)metadata; @@ -56,11 +58,13 @@ NS_ASSUME_NONNULL_BEGIN * Initializes an upload task with a base FIRStorageReference and GTMSessionFetcherService. * @param reference The base FIRStorageReference which fetchers use for configuration. * @param service The GTMSessionFetcherService which will create fetchers. + * @param queue The shared queue to use for all Storage operations. * @param fileURL The system file URL to upload from. * @return Returns an instance of FIRStorageUploadTask. */ - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue file:(NSURL *)fileURL metadata:(FIRStorageMetadata *)metadata; diff --git a/Firebase/Storage/Private/FIRStorage_Private.h b/Firebase/Storage/Private/FIRStorage_Private.h index aefe808baa6..04cecc14494 100644 --- a/Firebase/Storage/Private/FIRStorage_Private.h +++ b/Firebase/Storage/Private/FIRStorage_Private.h @@ -25,6 +25,8 @@ NS_ASSUME_NONNULL_BEGIN @property(strong, nonatomic) GTMSessionFetcherService *fetcherServiceForApp; +@property(nonatomic, readonly) dispatch_queue_t dispatchQueue; + @property(strong, nonatomic) NSString *storageBucket; /** From 76a51a5a9e8a1f8dcc0af19603367e4c4b7263e4 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Tue, 23 Oct 2018 12:28:18 -0700 Subject: [PATCH 015/102] Increase timeout for testDispatchAfterDelay (#1988) --- Example/Auth/Tests/FIRAuthDispatcherTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/Auth/Tests/FIRAuthDispatcherTests.m b/Example/Auth/Tests/FIRAuthDispatcherTests.m index 193be4cd592..9eeb2391afa 100644 --- a/Example/Auth/Tests/FIRAuthDispatcherTests.m +++ b/Example/Auth/Tests/FIRAuthDispatcherTests.m @@ -32,7 +32,7 @@ /** @var kExpectationTimeout @brief The maximum time waiting for expectations to fulfill. */ -static const NSTimeInterval kExpectationTimeout = 2; +static const NSTimeInterval kExpectationTimeout = 3; id testWorkQueue; From 58b3c081438f01cd6eaaf0051571802c1ba51faf Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Tue, 23 Oct 2018 14:17:23 -0700 Subject: [PATCH 016/102] Update Storage Changelog (#1989) --- Firebase/Storage/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Firebase/Storage/CHANGELOG.md b/Firebase/Storage/CHANGELOG.md index fc7bcdd7b6a..6d63f48cba9 100644 --- a/Firebase/Storage/CHANGELOG.md +++ b/Firebase/Storage/CHANGELOG.md @@ -1,3 +1,6 @@ +# 3.0.2 +- [changed] Storage operations can now be scheduled and controlled from any thread (#1302, #1388). + # v3.0.1 - [fixed] Fixed potential `EXC_BAD_ACCESS` violation in the internal logic for processing finished downloads (#1565, #1747). From 44596adefbf0f1b59892091d01d6f7cdeb672432 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Tue, 23 Oct 2018 16:25:40 -0700 Subject: [PATCH 017/102] Add missing FirebaseStorage release note (#1990) --- Firebase/Storage/CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Firebase/Storage/CHANGELOG.md b/Firebase/Storage/CHANGELOG.md index 6d63f48cba9..dada0b60519 100644 --- a/Firebase/Storage/CHANGELOG.md +++ b/Firebase/Storage/CHANGELOG.md @@ -1,6 +1,9 @@ -# 3.0.2 +# 3.0.3 - [changed] Storage operations can now be scheduled and controlled from any thread (#1302, #1388). +# 3.0.2 +- [changed] Migrate to use FirebaseAuthInterop interfaces to access FirebaseAuth (#1660). + # v3.0.1 - [fixed] Fixed potential `EXC_BAD_ACCESS` violation in the internal logic for processing finished downloads (#1565, #1747). From 69b17eb4f52b1a4a0e91cd725c9394db6e16f1e1 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Tue, 23 Oct 2018 16:53:13 -0700 Subject: [PATCH 018/102] Allow semicolon in file name (#1991) --- .../Integration/FIRStorageIntegrationTests.m | 18 ++++++++++++++++++ Firebase/Storage/CHANGELOG.md | 1 + Firebase/Storage/FIRStorageUtils.m | 4 ++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m b/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m index 94729c92505..d16a95ead67 100644 --- a/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m +++ b/Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m @@ -198,6 +198,24 @@ - (void)testUnauthenticatedSimplePutData { [self waitForExpectations]; } +- (void)testUnauthenticatedSimplePutSpecialCharacter { + XCTestExpectation *expectation = + [self expectationWithDescription:@"testUnauthenticatedSimplePutDataEscapedName"]; + FIRStorageReference *ref = [self.storage referenceWithPath:@"ios/public/-._~!$'()*,=:@&+;"]; + + NSData *data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding]; + + [ref putData:data + metadata:nil + completion:^(FIRStorageMetadata *metadata, NSError *error) { + XCTAssertNotNil(metadata, "Metadata should not be nil"); + XCTAssertNil(error, "Error should be nil"); + [expectation fulfill]; + }]; + + [self waitForExpectations]; +} + - (void)testUnauthenticatedSimplePutDataInBackgroundQueue { XCTestExpectation *expectation = [self expectationWithDescription:@"testUnauthenticatedSimplePutDataInBackgroundQueue"]; diff --git a/Firebase/Storage/CHANGELOG.md b/Firebase/Storage/CHANGELOG.md index dada0b60519..dc4c7b0fb4a 100644 --- a/Firebase/Storage/CHANGELOG.md +++ b/Firebase/Storage/CHANGELOG.md @@ -1,5 +1,6 @@ # 3.0.3 - [changed] Storage operations can now be scheduled and controlled from any thread (#1302, #1388). +- [fixed] Fixed an issue that prevented uploading of files whose names include semicolons. # 3.0.2 - [changed] Migrate to use FirebaseAuthInterop interfaces to access FirebaseAuth (#1660). diff --git a/Firebase/Storage/FIRStorageUtils.m b/Firebase/Storage/FIRStorageUtils.m index bc517ffaaf4..66869ecc7b5 100644 --- a/Firebase/Storage/FIRStorageUtils.m +++ b/Firebase/Storage/FIRStorageUtils.m @@ -29,9 +29,9 @@ #import "GTMSessionFetcher.h" -// This is the list at https://cloud.google.com/storage/docs/json_api/ without & and +. +// This is the list at https://cloud.google.com/storage/docs/json_api/ without &, ; and +. NSString *const kGCSObjectAllowedCharacterSet = - @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$'()*,;=:@"; + @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$'()*,=:@"; @implementation FIRStorageUtils From ef5949d6a87ee49f0cf2f7c964f39412c598db70 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Wed, 24 Oct 2018 07:17:12 -0400 Subject: [PATCH 019/102] Remove unnecessary notification flag (#1993) * Remove unnecessary notification flag. This was added when the Google pod could configure Firebase but the Google pod is deprecated and can only work with Firebase 3.X. These flags and conditional checks can be safely removed. * Resolve issues from commit split. * Style fixes. --- Example/Core/Tests/FIRAppTest.m | 5 ----- Firebase/Core/FIRApp.m | 37 +++++++-------------------------- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/Example/Core/Tests/FIRAppTest.m b/Example/Core/Tests/FIRAppTest.m index 7b8b29dfb9f..7ff9f98852e 100644 --- a/Example/Core/Tests/FIRAppTest.m +++ b/Example/Core/Tests/FIRAppTest.m @@ -23,9 +23,6 @@ @interface FIRApp (TestInternal) -@property(nonatomic) BOOL alreadySentConfigureNotification; -@property(nonatomic) BOOL alreadySentDeleteNotification; - + (void)resetApps; - (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; - (BOOL)configureCore; @@ -98,7 +95,6 @@ - (void)testConfigure { XCTAssertEqualObjects(self.app.name, kFIRDefaultAppName); XCTAssertEqualObjects(self.app.options.clientID, kClientID); XCTAssertTrue([FIRApp allApps].count == 1); - XCTAssertTrue(self.app.alreadySentConfigureNotification); // Test if options is nil id optionsClassMock = OCMClassMock([FIROptions class]); @@ -268,7 +264,6 @@ - (void)testDeleteApp { }]; OCMVerifyAll(self.observerMock); - XCTAssertTrue(self.app.alreadySentDeleteNotification); XCTAssertTrue([FIRApp allApps].count == 0); } diff --git a/Firebase/Core/FIRApp.m b/Firebase/Core/FIRApp.m index 2920d4c737d..c7e2e8c3501 100644 --- a/Firebase/Core/FIRApp.m +++ b/Firebase/Core/FIRApp.m @@ -85,10 +85,6 @@ @interface FIRApp () -@property(nonatomic) BOOL alreadySentConfigureNotification; - -@property(nonatomic) BOOL alreadySentDeleteNotification; - #ifdef DEBUG @property(nonatomic) BOOL alreadyOutputDataCollectionFlag; #endif // DEBUG @@ -147,22 +143,13 @@ + (void)configureWithOptions:(FIROptions *)options { + (void)configureDefaultAppWithOptions:(FIROptions *)options sendingNotifications:(BOOL)sendNotifications { if (sDefaultApp) { - // FIRApp sets up FirebaseAnalytics and does plist validation, but does not cause it - // to fire notifications. So, if the default app already exists, but has not sent out - // configuration notifications, then continue re-initializing it. - if (!sendNotifications || sDefaultApp.alreadySentConfigureNotification) { - [NSException raise:kFirebaseCoreErrorDomain - format:@"Default app has already been configured."]; - } + [NSException raise:kFirebaseCoreErrorDomain format:@"Default app has already been configured."]; } @synchronized(self) { FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configuring the default app."); sDefaultApp = [[FIRApp alloc] initInstanceWithName:kFIRDefaultAppName options:options]; [FIRApp addAppToAppDictionary:sDefaultApp]; - if (!sDefaultApp.alreadySentConfigureNotification && sendNotifications) { - [FIRApp sendNotificationsToSDKs:sDefaultApp]; - sDefaultApp.alreadySentConfigureNotification = YES; - } + [FIRApp sendNotificationsToSDKs:sDefaultApp]; } } @@ -196,10 +183,7 @@ + (void)configureWithName:(NSString *)name options:(FIROptions *)options { FIRLogDebug(kFIRLoggerCore, @"I-COR000002", @"Configuring app named %@", name); FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; [FIRApp addAppToAppDictionary:app]; - if (!app.alreadySentConfigureNotification) { - [FIRApp sendNotificationsToSDKs:app]; - app.alreadySentConfigureNotification = YES; - } + [FIRApp sendNotificationsToSDKs:app]; } } @@ -259,13 +243,10 @@ - (void)deleteApp:(FIRAppVoidBoolCallback)completion { if ([self.name isEqualToString:kFIRDefaultAppName]) { sDefaultApp = nil; } - if (!self.alreadySentDeleteNotification) { - NSDictionary *appInfoDict = @{kFIRAppNameKey : self.name}; - [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppDeleteNotification - object:[self class] - userInfo:appInfoDict]; - self.alreadySentDeleteNotification = YES; - } + NSDictionary *appInfoDict = @{kFIRAppNameKey : self.name}; + [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppDeleteNotification + object:[self class] + userInfo:appInfoDict]; completion(YES); } else { FIRLogError(kFIRLoggerCore, @"I-COR000007", @"App does not exist."); @@ -296,10 +277,6 @@ - (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)opti _options.editingLocked = YES; _isDefaultApp = [name isEqualToString:kFIRDefaultAppName]; _container = [[FIRComponentContainer alloc] initWithApp:self]; - - FIRApp *app = sAllApps[name]; - _alreadySentConfigureNotification = app.alreadySentConfigureNotification; - _alreadySentDeleteNotification = app.alreadySentDeleteNotification; } return self; } From 4c50de65d438ee01d8cf7a102ebfee5129a130d4 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Wed, 24 Oct 2018 11:03:54 -0400 Subject: [PATCH 020/102] Reduce singleton usage in FIRApp tests. (#1995) * Reduce singleton usage in FIRApp tests. There have been some issues while creating new tests of conflicts with mocks of classes and instances, this should alleviate some of those conflicts in the future. * Remove bad style changes. * Use default app name flag instead of local variable. --- Example/Core/Tests/FIRAppTest.m | 288 +++++++++++++------------ Example/Core/Tests/FIROptionsTest.m | 19 ++ Firebase/Core/FIRApp.m | 62 +++--- Firebase/Core/Private/FIRAppInternal.h | 2 +- 4 files changed, 197 insertions(+), 174 deletions(-) diff --git a/Example/Core/Tests/FIRAppTest.m b/Example/Core/Tests/FIRAppTest.m index 7ff9f98852e..bd98036d97d 100644 --- a/Example/Core/Tests/FIRAppTest.m +++ b/Example/Core/Tests/FIRAppTest.m @@ -48,9 +48,7 @@ + (nullable NSNumber *)readDataCollectionSwitchFromUserDefaultsForApp:(FIRApp *) @interface FIRAppTest : FIRTestCase @property(nonatomic) id appClassMock; -@property(nonatomic) id optionsInstanceMock; @property(nonatomic) id observerMock; -@property(nonatomic) FIRApp *app; @property(nonatomic) NSNotificationCenter *notificationCenter; @end @@ -62,7 +60,6 @@ - (void)setUp { [FIROptions resetDefaultOptions]; [FIRApp resetApps]; _appClassMock = OCMClassMock([FIRApp class]); - _optionsInstanceMock = OCMPartialMock([FIROptions defaultOptions]); _observerMock = OCMObserverMock(); // TODO: Remove all usages of defaultCenter in Core, then we can instantiate an instance here to @@ -72,7 +69,6 @@ - (void)setUp { - (void)tearDown { [_appClassMock stopMocking]; - [_optionsInstanceMock stopMocking]; [_notificationCenter removeObserver:_observerMock]; _observerMock = nil; _notificationCenter = nil; @@ -90,22 +86,23 @@ - (void)testConfigure { XCTAssertNoThrow([FIRApp configure]); OCMVerifyAll(self.observerMock); - self.app = [FIRApp defaultApp]; - XCTAssertNotNil(self.app); - XCTAssertEqualObjects(self.app.name, kFIRDefaultAppName); - XCTAssertEqualObjects(self.app.options.clientID, kClientID); + FIRApp *app = [FIRApp defaultApp]; + XCTAssertNotNil(app); + XCTAssertEqualObjects(app.name, kFIRDefaultAppName); + XCTAssertEqualObjects(app.options.clientID, kClientID); XCTAssertTrue([FIRApp allApps].count == 1); +} - // Test if options is nil +- (void)testConfigureWithNoDefaultOptions { id optionsClassMock = OCMClassMock([FIROptions class]); OCMStub([optionsClassMock defaultOptions]).andReturn(nil); XCTAssertThrows([FIRApp configure]); } - (void)testConfigureWithOptions { -// nil options #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnonnull" + // Test `nil` options. XCTAssertThrows([FIRApp configureWithOptions:nil]); #pragma clang diagnostic pop XCTAssertTrue([FIRApp allApps].count == 0); @@ -116,50 +113,35 @@ - (void)testConfigureWithOptions { notificationName:kFIRAppReadyToConfigureSDKNotification object:[FIRApp class] userInfo:expectedUserInfo]; - // default options - XCTAssertNoThrow([FIRApp configureWithOptions:[FIROptions defaultOptions]]); - OCMVerifyAll(self.observerMock); - - self.app = [FIRApp defaultApp]; - XCTAssertNotNil(self.app); - XCTAssertEqualObjects(self.app.name, kFIRDefaultAppName); - XCTAssertEqualObjects(self.app.options.clientID, kClientID); - XCTAssertTrue([FIRApp allApps].count == 1); -} -- (void)testConfigureWithCustomizedOptions { - // valid customized options + // Use a valid instance of options. FIROptions *options = [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; - options.bundleID = kBundleID; - options.APIKey = kCustomizedAPIKey; - NSDictionary *expectedUserInfo = - [self expectedUserInfoWithAppName:kFIRDefaultAppName isDefaultApp:YES]; - [self expectNotificationForObserver:self.observerMock - notificationName:kFIRAppReadyToConfigureSDKNotification - object:[FIRApp class] - userInfo:expectedUserInfo]; - + options.clientID = kClientID; XCTAssertNoThrow([FIRApp configureWithOptions:options]); OCMVerifyAll(self.observerMock); - self.app = [FIRApp defaultApp]; - XCTAssertNotNil(self.app); - XCTAssertEqualObjects(self.app.name, kFIRDefaultAppName); - XCTAssertEqualObjects(self.app.options.googleAppID, kGoogleAppID); - XCTAssertEqualObjects(self.app.options.APIKey, kCustomizedAPIKey); + // Verify the default app instance is created. + FIRApp *app = [FIRApp defaultApp]; + XCTAssertNotNil(app); + XCTAssertEqualObjects(app.name, kFIRDefaultAppName); + XCTAssertEqualObjects(app.options.googleAppID, kGoogleAppID); + XCTAssertEqualObjects(app.options.GCMSenderID, kGCMSenderID); + XCTAssertEqualObjects(app.options.clientID, kClientID); XCTAssertTrue([FIRApp allApps].count == 1); } - (void)testConfigureWithNameAndOptions { + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + options.clientID = kClientID; + #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnonnull" - XCTAssertThrows([FIRApp configureWithName:nil options:[FIROptions defaultOptions]]); + XCTAssertThrows([FIRApp configureWithName:nil options:options]); XCTAssertThrows([FIRApp configureWithName:kFIRTestAppName1 options:nil]); #pragma clang diagnostic pop - XCTAssertThrows([FIRApp configureWithName:@"" options:[FIROptions defaultOptions]]); - XCTAssertThrows( - [FIRApp configureWithName:kFIRDefaultAppName options:[FIROptions defaultOptions]]); + XCTAssertThrows([FIRApp configureWithName:@"" options:options]); XCTAssertTrue([FIRApp allApps].count == 0); NSDictionary *expectedUserInfo = @@ -168,23 +150,23 @@ - (void)testConfigureWithNameAndOptions { notificationName:kFIRAppReadyToConfigureSDKNotification object:[FIRApp class] userInfo:expectedUserInfo]; - XCTAssertNoThrow([FIRApp configureWithName:kFIRTestAppName1 options:[FIROptions defaultOptions]]); + XCTAssertNoThrow([FIRApp configureWithName:kFIRTestAppName1 options:options]); OCMVerifyAll(self.observerMock); XCTAssertTrue([FIRApp allApps].count == 1); - self.app = [FIRApp appNamed:kFIRTestAppName1]; - XCTAssertNotNil(self.app); - XCTAssertEqualObjects(self.app.name, kFIRTestAppName1); - XCTAssertEqualObjects(self.app.options.clientID, kClientID); + FIRApp *app = [FIRApp appNamed:kFIRTestAppName1]; + XCTAssertNotNil(app); + XCTAssertEqualObjects(app.name, kFIRTestAppName1); + XCTAssertEqualObjects(app.options.clientID, kClientID); // Configure the same app again should throw an exception. - XCTAssertThrows([FIRApp configureWithName:kFIRTestAppName1 options:[FIROptions defaultOptions]]); + XCTAssertThrows([FIRApp configureWithName:kFIRTestAppName1 options:options]); } -- (void)testConfigureWithNameAndCustomizedOptions { - FIROptions *options = [FIROptions defaultOptions]; - FIROptions *newOptions = [options copy]; - newOptions.deepLinkURLScheme = kDeepLinkURLScheme; +- (void)testConfigureWithMultipleApps { + FIROptions *options1 = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + options1.deepLinkURLScheme = kDeepLinkURLScheme; // Set up notification center observer for verifying notifications. [self.notificationCenter addMockObserver:self.observerMock @@ -196,15 +178,14 @@ - (void)testConfigureWithNameAndCustomizedOptions { [[self.observerMock expect] notificationWithName:kFIRAppReadyToConfigureSDKNotification object:[FIRApp class] userInfo:expectedUserInfo1]; - XCTAssertNoThrow([FIRApp configureWithName:kFIRTestAppName1 options:newOptions]); + XCTAssertNoThrow([FIRApp configureWithName:kFIRTestAppName1 options:options1]); XCTAssertTrue([FIRApp allApps].count == 1); - self.app = [FIRApp appNamed:kFIRTestAppName1]; - // Configure a different app with valid customized options - FIROptions *customizedOptions = + // Configure a different app with valid customized options. + FIROptions *options2 = [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; - customizedOptions.bundleID = kBundleID; - customizedOptions.APIKey = kCustomizedAPIKey; + options2.bundleID = kBundleID; + options2.APIKey = kCustomizedAPIKey; NSDictionary *expectedUserInfo2 = [self expectedUserInfoWithAppName:kFIRTestAppName2 isDefaultApp:NO]; @@ -213,15 +194,15 @@ - (void)testConfigureWithNameAndCustomizedOptions { userInfo:expectedUserInfo2]; [self.observerMock setExpectationOrderMatters:YES]; - XCTAssertNoThrow([FIRApp configureWithName:kFIRTestAppName2 options:customizedOptions]); + XCTAssertNoThrow([FIRApp configureWithName:kFIRTestAppName2 options:options2]); OCMVerifyAll(self.observerMock); XCTAssertTrue([FIRApp allApps].count == 2); - self.app = [FIRApp appNamed:kFIRTestAppName2]; - XCTAssertNotNil(self.app); - XCTAssertEqualObjects(self.app.name, kFIRTestAppName2); - XCTAssertEqualObjects(self.app.options.googleAppID, kGoogleAppID); - XCTAssertEqualObjects(self.app.options.APIKey, kCustomizedAPIKey); + FIRApp *app = [FIRApp appNamed:kFIRTestAppName2]; + XCTAssertNotNil(app); + XCTAssertEqualObjects(app.name, kFIRTestAppName2); + XCTAssertEqualObjects(app.options.googleAppID, kGoogleAppID); + XCTAssertEqualObjects(app.options.APIKey, kCustomizedAPIKey); } - (void)testValidName { @@ -232,37 +213,45 @@ - (void)testValidName { } - (void)testDefaultApp { - self.app = [FIRApp defaultApp]; - XCTAssertNil(self.app); + FIRApp *app = [FIRApp defaultApp]; + XCTAssertNil(app); [FIRApp configure]; - self.app = [FIRApp defaultApp]; - XCTAssertEqualObjects(self.app.name, kFIRDefaultAppName); - XCTAssertEqualObjects(self.app.options.clientID, kClientID); + app = [FIRApp defaultApp]; + XCTAssertEqualObjects(app.name, kFIRDefaultAppName); + XCTAssertEqualObjects(app.options.clientID, kClientID); } - (void)testAppNamed { - self.app = [FIRApp appNamed:kFIRTestAppName1]; - XCTAssertNil(self.app); + FIRApp *app = [FIRApp appNamed:kFIRTestAppName1]; + XCTAssertNil(app); [FIRApp configureWithName:kFIRTestAppName1 options:[FIROptions defaultOptions]]; - self.app = [FIRApp appNamed:kFIRTestAppName1]; - XCTAssertEqualObjects(self.app.name, kFIRTestAppName1); - XCTAssertEqualObjects(self.app.options.clientID, kClientID); + app = [FIRApp appNamed:kFIRTestAppName1]; + XCTAssertEqualObjects(app.name, kFIRTestAppName1); + XCTAssertEqualObjects(app.options.clientID, kClientID); } - (void)testDeleteApp { - [FIRApp configure]; - self.app = [FIRApp defaultApp]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + [FIRApp configureWithName:name options:options]; + FIRApp *app = [FIRApp appNamed:name]; + XCTAssertNotNil(app); XCTAssertTrue([FIRApp allApps].count == 1); [self expectNotificationForObserver:self.observerMock notificationName:kFIRAppDeleteNotification object:[FIRApp class] userInfo:[OCMArg any]]; - [self.app deleteApp:^(BOOL success) { + XCTestExpectation *expectation = + [self expectationWithDescription:@"Deleting the app should succeed."]; + [app deleteApp:^(BOOL success) { XCTAssertTrue(success); + [expectation fulfill]; }]; + [self waitForExpectations:@[ expectation ] timeout:1]; OCMVerifyAll(self.observerMock); XCTAssertTrue([FIRApp allApps].count == 0); } @@ -331,25 +320,6 @@ - (void)testGetTokenWithCallback { "'getTokenImplementation' block correctly."); } -- (void)testModifyingOptionsThrows { - [FIRApp configure]; - FIROptions *options = [[FIRApp defaultApp] options]; - XCTAssertTrue(options.isEditingLocked); - - // Modification to every property should result in an exception. - XCTAssertThrows(options.androidClientID = @"should_throw"); - XCTAssertThrows(options.APIKey = @"should_throw"); - XCTAssertThrows(options.bundleID = @"should_throw"); - XCTAssertThrows(options.clientID = @"should_throw"); - XCTAssertThrows(options.databaseURL = @"should_throw"); - XCTAssertThrows(options.deepLinkURLScheme = @"should_throw"); - XCTAssertThrows(options.GCMSenderID = @"should_throw"); - XCTAssertThrows(options.googleAppID = @"should_throw"); - XCTAssertThrows(options.projectID = @"should_throw"); - XCTAssertThrows(options.storageBucket = @"should_throw"); - XCTAssertThrows(options.trackingID = @"should_throw"); -} - - (void)testOptionsLocking { FIROptions *options = [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; @@ -360,8 +330,9 @@ - (void)testOptionsLocking { XCTAssertFalse(options.isEditingLocked); // The options returned should be locked after configuring `FIRApp`. - [FIRApp configureWithOptions:options]; - FIROptions *optionsCopy = [[FIRApp defaultApp] options]; + NSString *name = NSStringFromSelector(_cmd); + [FIRApp configureWithName:name options:options]; + FIROptions *optionsCopy = [[FIRApp appNamed:name] options]; XCTAssertTrue(optionsCopy.isEditingLocked); } @@ -411,16 +382,18 @@ - (void)testAppIDEmpty { - (void)testAppIDValidationTrue { // Ensure that isAppIDValid matches validateAppID. - [FIRApp configure]; + FIROptions *options = [[FIROptions alloc] initWithGoogleAppID:@"" GCMSenderID:@""]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:NSStringFromSelector(_cmd) options:options]; OCMStub([self.appClassMock validateAppID:[OCMArg any]]).andReturn(YES); - XCTAssertTrue([[FIRApp defaultApp] isAppIDValid]); + XCTAssertTrue([app isAppIDValid]); } - (void)testAppIDValidationFalse { // Ensure that isAppIDValid matches validateAppID. - [FIRApp configure]; + FIROptions *options = [[FIROptions alloc] initWithGoogleAppID:@"" GCMSenderID:@""]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:NSStringFromSelector(_cmd) options:options]; OCMStub([self.appClassMock validateAppID:[OCMArg any]]).andReturn(NO); - XCTAssertFalse([[FIRApp defaultApp] isAppIDValid]); + XCTAssertFalse([app isAppIDValid]); } - (void)testAppIDPrefix { @@ -576,85 +549,108 @@ - (void)testAppIDFingerprintInvalid { - (void)testGlobalDataCollectionNoFlags { // Test: No flags set. - [FIRApp configure]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; OCMStub([self.appClassMock readDataCollectionSwitchFromPlist]).andReturn(nil); OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(nil); - XCTAssertTrue([FIRApp defaultApp].isDataCollectionDefaultEnabled); + XCTAssertTrue(app.isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionPlistSetEnabled { // Test: Plist set to enabled, no override. - [FIRApp configure]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; OCMStub([self.appClassMock readDataCollectionSwitchFromPlist]).andReturn(@YES); OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(nil); - XCTAssertTrue([FIRApp defaultApp].isDataCollectionDefaultEnabled); + XCTAssertTrue(app.isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionPlistSetDisabled { // Test: Plist set to disabled, no override. - [FIRApp configure]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; OCMStub([self.appClassMock readDataCollectionSwitchFromPlist]).andReturn(@NO); OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(nil); - XCTAssertFalse([FIRApp defaultApp].isDataCollectionDefaultEnabled); + XCTAssertFalse(app.isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionUserSpecifiedEnabled { // Test: User specified as enabled, no plist value. - [FIRApp configure]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; OCMStub([self.appClassMock readDataCollectionSwitchFromPlist]).andReturn(nil); OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(@YES); - XCTAssertTrue([FIRApp defaultApp].isDataCollectionDefaultEnabled); + XCTAssertTrue(app.isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionUserSpecifiedDisabled { // Test: User specified as disabled, no plist value. - [FIRApp configure]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; OCMStub([self.appClassMock readDataCollectionSwitchFromPlist]).andReturn(nil); OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(@NO); - XCTAssertFalse([FIRApp defaultApp].isDataCollectionDefaultEnabled); + XCTAssertFalse(app.isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionUserOverriddenEnabled { // Test: User specified as enabled, with plist set as disabled. - [FIRApp configure]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; OCMStub([self.appClassMock readDataCollectionSwitchFromPlist]).andReturn(@NO); OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(@YES); - XCTAssertTrue([FIRApp defaultApp].isDataCollectionDefaultEnabled); + XCTAssertTrue(app.isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionUserOverriddenDisabled { // Test: User specified as disabled, with plist set as enabled. - [FIRApp configure]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; OCMStub([self.appClassMock readDataCollectionSwitchFromPlist]).andReturn(@YES); OCMStub([self.appClassMock readDataCollectionSwitchFromUserDefaultsForApp:OCMOCK_ANY]) .andReturn(@NO); - XCTAssertFalse([FIRApp defaultApp].isDataCollectionDefaultEnabled); + XCTAssertFalse(app.isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionWriteToDefaults { id defaultsMock = OCMPartialMock([NSUserDefaults standardUserDefaults]); - [FIRApp configure]; - - FIRApp *app = [FIRApp defaultApp]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + [FIRApp configureWithName:name options:options]; + FIRApp *app = [FIRApp appNamed:name]; app.dataCollectionDefaultEnabled = YES; NSString *key = [NSString stringWithFormat:kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat, app.name]; OCMVerify([defaultsMock setObject:@YES forKey:key]); - [FIRApp defaultApp].dataCollectionDefaultEnabled = NO; + app.dataCollectionDefaultEnabled = NO; OCMVerify([defaultsMock setObject:@NO forKey:key]); [defaultsMock stopMocking]; @@ -662,8 +658,11 @@ - (void)testGlobalDataCollectionWriteToDefaults { - (void)testGlobalDataCollectionClearedAfterDelete { // Configure and disable data collection for the default FIRApp. - [FIRApp configure]; - FIRApp *app = [FIRApp defaultApp]; + NSString *name = NSStringFromSelector(_cmd); + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + [FIRApp configureWithName:name options:options]; + FIRApp *app = [FIRApp appNamed:name]; app.dataCollectionDefaultEnabled = NO; XCTAssertFalse(app.isDataCollectionDefaultEnabled); @@ -671,25 +670,26 @@ - (void)testGlobalDataCollectionClearedAfterDelete { XCTestExpectation *deleteFinished = [self expectationWithDescription:@"The app should successfully delete."]; [app deleteApp:^(BOOL success) { - if (success) { - [deleteFinished fulfill]; - } + XCTAssertTrue(success); + [deleteFinished fulfill]; }]; // Wait for the delete to complete. [self waitForExpectations:@[ deleteFinished ] timeout:1]; - // Set up the default app again, and check the data collection flag. - [FIRApp configure]; - XCTAssertTrue([FIRApp defaultApp].isDataCollectionDefaultEnabled); + // Set up an app with the same name again, and check the data collection flag. + [FIRApp configureWithName:name options:options]; + XCTAssertTrue([FIRApp appNamed:name].isDataCollectionDefaultEnabled); } - (void)testGlobalDataCollectionNoDiagnosticsSent { - // Add an observer for the diagnostics notification - both with and without an object to ensure it - // catches it either way. Currently no object is sent, but in the future that could change. - [self.notificationCenter addMockObserver:self.observerMock - name:kFIRAppDiagnosticsNotification - object:nil]; + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + FIRApp *app = [[FIRApp alloc] initInstanceWithName:NSStringFromSelector(_cmd) options:options]; + app.dataCollectionDefaultEnabled = NO; + + // Add an observer for the diagnostics notification. Currently no object is sent, but in the + // future that could change so leave it as OCMOCK_ANY. [self.notificationCenter addMockObserver:self.observerMock name:kFIRAppDiagnosticsNotification object:OCMOCK_ANY]; @@ -704,7 +704,7 @@ - (void)testGlobalDataCollectionNoDiagnosticsSent { [FIRApp configure]; NSError *error = [NSError errorWithDomain:@"com.firebase" code:42 userInfo:nil]; - [[FIRApp defaultApp] sendLogsWithServiceName:@"Service" version:@"Version" error:error]; + [app sendLogsWithServiceName:@"Service" version:@"Version" error:error]; // The observer mock is strict and will raise an exception when an unexpected notification is // received. @@ -716,35 +716,39 @@ - (void)testGlobalDataCollectionNoDiagnosticsSent { - (void)testAnalyticsSetByGlobalDataCollectionSwitch { // Test that the global data collection switch triggers setting Analytics when no explicit flag is // set. - [FIRApp configure]; + id optionsMock = OCMClassMock([FIROptions class]); + OCMStub([optionsMock isAnalyticsCollectionExpicitlySet]).andReturn(NO); + + // We need to use the default app name since Analytics only associates with the default app. + FIRApp *defaultApp = [[FIRApp alloc] initInstanceWithName:kFIRDefaultAppName options:optionsMock]; id configurationMock = OCMClassMock([FIRAnalyticsConfiguration class]); OCMStub([configurationMock sharedInstance]).andReturn(configurationMock); OCMStub([configurationMock setAnalyticsCollectionEnabled:OCMOCK_ANY persistSetting:OCMOCK_ANY]); - OCMStub([self.optionsInstanceMock isAnalyticsCollectionExpicitlySet]).andReturn(NO); - // Ensure Analytics is set after the global flag is set. - [[FIRApp defaultApp] setDataCollectionDefaultEnabled:YES]; + // Ensure Analytics is set after the global flag is set. It needs to + [defaultApp setDataCollectionDefaultEnabled:YES]; OCMVerify([configurationMock setAnalyticsCollectionEnabled:YES persistSetting:NO]); - [[FIRApp defaultApp] setDataCollectionDefaultEnabled:NO]; + [defaultApp setDataCollectionDefaultEnabled:NO]; OCMVerify([configurationMock setAnalyticsCollectionEnabled:NO persistSetting:NO]); } - (void)testAnalyticsNotSetByGlobalDataCollectionSwitch { // Test that the global data collection switch doesn't override an explicitly set Analytics flag. - [FIRApp configure]; + id optionsMock = OCMClassMock([FIROptions class]); + OCMStub([optionsMock isAnalyticsCollectionExpicitlySet]).andReturn(YES); + FIRApp *app = [[FIRApp alloc] initInstanceWithName:@"testAnalyticsNotSet" options:optionsMock]; id configurationMock = OCMClassMock([FIRAnalyticsConfiguration class]); OCMStub([configurationMock sharedInstance]).andReturn(configurationMock); OCMStub([configurationMock setAnalyticsCollectionEnabled:OCMOCK_ANY persistSetting:OCMOCK_ANY]); - OCMStub([self.optionsInstanceMock isAnalyticsCollectionExpicitlySet]).andReturn(YES); // Reject any changes to Analytics when the data collection changes. - [[FIRApp defaultApp] setDataCollectionDefaultEnabled:YES]; + [app setDataCollectionDefaultEnabled:YES]; OCMReject([configurationMock setAnalyticsCollectionEnabled:OCMOCK_ANY persistSetting:OCMOCK_ANY]); - [[FIRApp defaultApp] setDataCollectionDefaultEnabled:NO]; + [app setDataCollectionDefaultEnabled:NO]; OCMReject([configurationMock setAnalyticsCollectionEnabled:OCMOCK_ANY persistSetting:OCMOCK_ANY]); } @@ -760,7 +764,7 @@ - (void)testAuthGetUID { XCTAssertEqual([[FIRApp defaultApp] getUID], @"highlander"); } -- (void)testIsAppConfigured { +- (void)testIsDefaultAppConfigured { // Ensure it's false before anything is configured. XCTAssertFalse([FIRApp isDefaultAppConfigured]); diff --git a/Example/Core/Tests/FIROptionsTest.m b/Example/Core/Tests/FIROptionsTest.m index 6c3952607c0..382ac49231f 100644 --- a/Example/Core/Tests/FIROptionsTest.m +++ b/Example/Core/Tests/FIROptionsTest.m @@ -556,6 +556,25 @@ - (void)testAnalyticsCollectionExplicitlySet { XCTAssertTrue([options isAnalyticsCollectionExpicitlySet]); } +- (void)testModifyingOptionsThrows { + FIROptions *options = + [[FIROptions alloc] initWithGoogleAppID:kGoogleAppID GCMSenderID:kGCMSenderID]; + options.editingLocked = YES; + + // Modification to every property should result in an exception. + XCTAssertThrows(options.androidClientID = @"should_throw"); + XCTAssertThrows(options.APIKey = @"should_throw"); + XCTAssertThrows(options.bundleID = @"should_throw"); + XCTAssertThrows(options.clientID = @"should_throw"); + XCTAssertThrows(options.databaseURL = @"should_throw"); + XCTAssertThrows(options.deepLinkURLScheme = @"should_throw"); + XCTAssertThrows(options.GCMSenderID = @"should_throw"); + XCTAssertThrows(options.googleAppID = @"should_throw"); + XCTAssertThrows(options.projectID = @"should_throw"); + XCTAssertThrows(options.storageBucket = @"should_throw"); + XCTAssertThrows(options.trackingID = @"should_throw"); +} + - (void)testVersionFormat { NSRegularExpression *sLibraryVersionRegex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]{8,}$" options:0 error:NULL]; diff --git a/Firebase/Core/FIRApp.m b/Firebase/Core/FIRApp.m index c7e2e8c3501..bc956aa4b4d 100644 --- a/Firebase/Core/FIRApp.m +++ b/Firebase/Core/FIRApp.m @@ -123,7 +123,7 @@ + (void)configure { @"from %@.", kPlistURL]; } - [FIRApp configureDefaultAppWithOptions:options sendingNotifications:YES]; + [FIRApp configureWithOptions:options]; #if TARGET_OS_OSX || TARGET_OS_TV FIRLogNotice(kFIRLoggerCore, @"I-COR000028", @"tvOS and macOS SDK support is not part of the official Firebase product. " @@ -137,20 +137,7 @@ + (void)configureWithOptions:(FIROptions *)options { [NSException raise:kFirebaseCoreErrorDomain format:@"Options is nil. Please pass a valid options."]; } - [FIRApp configureDefaultAppWithOptions:options sendingNotifications:YES]; -} - -+ (void)configureDefaultAppWithOptions:(FIROptions *)options - sendingNotifications:(BOOL)sendNotifications { - if (sDefaultApp) { - [NSException raise:kFirebaseCoreErrorDomain format:@"Default app has already been configured."]; - } - @synchronized(self) { - FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configuring the default app."); - sDefaultApp = [[FIRApp alloc] initInstanceWithName:kFIRDefaultAppName options:options]; - [FIRApp addAppToAppDictionary:sDefaultApp]; - [FIRApp sendNotificationsToSDKs:sDefaultApp]; - } + [FIRApp configureWithName:kFIRDefaultAppName options:options]; } + (void)configureWithName:(NSString *)name options:(FIROptions *)options { @@ -160,30 +147,43 @@ + (void)configureWithName:(NSString *)name options:(FIROptions *)options { if (name.length == 0) { [NSException raise:kFirebaseCoreErrorDomain format:@"Name cannot be empty."]; } + if ([name isEqualToString:kFIRDefaultAppName]) { - [NSException raise:kFirebaseCoreErrorDomain format:@"Name cannot be __FIRAPP_DEFAULT."]; - } - for (NSUInteger charIndex = 0; charIndex < name.length; charIndex++) { - char character = [name characterAtIndex:charIndex]; - if (!((character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || - (character >= '0' && character <= '9') || character == '_' || character == '-')) { + if (sDefaultApp) { [NSException raise:kFirebaseCoreErrorDomain - format: - @"App name should only contain Letters, " - @"Numbers, Underscores, and Dashes."]; + format:@"Default app has already been configured."]; } - } - if (sAllApps && sAllApps[name]) { - [NSException raise:kFirebaseCoreErrorDomain - format:@"App named %@ has already been configured.", name]; + FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configuring the default app."); + } else { + // Validate the app name and ensure it hasn't been configured already. + for (NSUInteger charIndex = 0; charIndex < name.length; charIndex++) { + char character = [name characterAtIndex:charIndex]; + if (!((character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || + (character >= '0' && character <= '9') || character == '_' || character == '-')) { + [NSException raise:kFirebaseCoreErrorDomain + format: + @"App name should only contain Letters, " + @"Numbers, Underscores, and Dashes."]; + } + } + + if (sAllApps && sAllApps[name]) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"App named %@ has already been configured.", name]; + } + + FIRLogDebug(kFIRLoggerCore, @"I-COR000002", @"Configuring app named %@", name); } @synchronized(self) { - FIRLogDebug(kFIRLoggerCore, @"I-COR000002", @"Configuring app named %@", name); FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; [FIRApp addAppToAppDictionary:app]; [FIRApp sendNotificationsToSDKs:app]; + + if (app.isDefaultApp) { + sDefaultApp = app; + } } } @@ -362,7 +362,7 @@ - (void)setDataCollectionDefaultEnabled:(BOOL)dataCollectionDefaultEnabled { // Core also controls the FirebaseAnalytics flag, so check if the Analytics flags are set // within FIROptions and change the Analytics value if necessary. Analytics only works with the // default app, so return if this isn't the default app. - if (self != sDefaultApp) { + if (!self.isDefaultApp) { return; } @@ -419,7 +419,7 @@ - (BOOL)isDataCollectionDefaultEnabled { + (void)sendNotificationsToSDKs:(FIRApp *)app { // TODO: Remove this notification once all SDKs are registered with `FIRCoreConfigurable`. - NSNumber *isDefaultApp = [NSNumber numberWithBool:(app == sDefaultApp)]; + NSNumber *isDefaultApp = [NSNumber numberWithBool:app.isDefaultApp]; NSDictionary *appInfoDict = @{ kFIRAppNameKey : app.name, kFIRAppIsDefaultAppKey : isDefaultApp, diff --git a/Firebase/Core/Private/FIRAppInternal.h b/Firebase/Core/Private/FIRAppInternal.h index f9fc5398ff9..e1aa65d0ba1 100644 --- a/Firebase/Core/Private/FIRAppInternal.h +++ b/Firebase/Core/Private/FIRAppInternal.h @@ -130,7 +130,7 @@ typedef NSString *_Nullable (^FIRAppGetUIDImplementation)(void); @interface FIRApp () /** - * A flag indicating if this is the default app. + * A flag indicating if this is the default app (has the default app name). */ @property(nonatomic, readonly) BOOL isDefaultApp; From 420dfc257b40d6ba88f6effacb877f46bab746e4 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Wed, 24 Oct 2018 11:04:00 -0700 Subject: [PATCH 021/102] Comply with c99 standard (#1992) * Trigger travis for Firestore podspec changes --- FirebaseAuth.podspec | 1 + FirebaseCore.podspec | 5 +++-- FirebaseDatabase.podspec | 4 +++- FirebaseDynamicLinks.podspec | 5 +++-- FirebaseFirestore.podspec | 1 + FirebaseFunctions.podspec | 4 ++++ FirebaseInAppMessagingDisplay.podspec | 4 +++- FirebaseMessaging.podspec | 1 + FirebaseStorage.podspec | 4 +++- scripts/if_changed.sh | 2 +- 10 files changed, 23 insertions(+), 8 deletions(-) diff --git a/FirebaseAuth.podspec b/FirebaseAuth.podspec index 2f7ca03c50c..f2a09204103 100644 --- a/FirebaseAuth.podspec +++ b/FirebaseAuth.podspec @@ -55,6 +55,7 @@ supports email and password accounts, as well as several 3rd party authenticatio 'Firebase/Auth/CHANGELOG.md' ] s.pod_target_xcconfig = { + 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => 'FIRAuth_VERSION=' + s.version.to_s + ' FIRAuth_MINOR_VERSION=' + s.version.to_s.split(".")[0] + "." + s.version.to_s.split(".")[1] diff --git a/FirebaseCore.podspec b/FirebaseCore.podspec index cba4f871aa8..806a3503541 100644 --- a/FirebaseCore.podspec +++ b/FirebaseCore.podspec @@ -32,8 +32,9 @@ Firebase Core includes FIRApp and FIROptions which provide central configuration ] s.dependency 'GoogleUtilities/Logger', '~> 5.2' s.pod_target_xcconfig = { - 'OTHER_CFLAGS' => '-fno-autolink', + 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => - 'FIRCore_VERSION=' + s.version.to_s + ' Firebase_VERSION=5.10.0' + 'FIRCore_VERSION=' + s.version.to_s + ' Firebase_VERSION=5.10.0', + 'OTHER_CFLAGS' => '-fno-autolink' } end diff --git a/FirebaseDatabase.podspec b/FirebaseDatabase.podspec index 96a817abbe9..876ecda29e3 100644 --- a/FirebaseDatabase.podspec +++ b/FirebaseDatabase.podspec @@ -34,6 +34,8 @@ Simplify your iOS development, grow your user base, and monetize more effectivel s.dependency 'leveldb-library', '~> 1.18' s.dependency 'FirebaseCore', '~> 5.0' s.pod_target_xcconfig = { + 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => - 'FIRDatabase_VERSION=' + s.version.to_s } + 'FIRDatabase_VERSION=' + s.version.to_s + } end diff --git a/FirebaseDynamicLinks.podspec b/FirebaseDynamicLinks.podspec index 72c3a0f8b0c..8f7b6335fc0 100644 --- a/FirebaseDynamicLinks.podspec +++ b/FirebaseDynamicLinks.podspec @@ -35,8 +35,9 @@ Firebase Dynamic Links are deep links that enhance user experience and increase s.ios.dependency 'FirebaseAnalyticsInterop', '~> 1.0' s.pod_target_xcconfig = { - 'HEADER_SEARCH_PATHS' => '"${PODS_TARGET_SRCROOT}"/Firebase', + 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => 'FIRDynamicLinks_VERSION=' + s.version.to_s + - ' FIRDynamicLinks3P GIN_SCION_LOGGING' + ' FIRDynamicLinks3P GIN_SCION_LOGGING', + 'HEADER_SEARCH_PATHS' => '"${PODS_TARGET_SRCROOT}"/Firebase' } end diff --git a/FirebaseFirestore.podspec b/FirebaseFirestore.podspec index 97013618600..f9e459a182b 100644 --- a/FirebaseFirestore.podspec +++ b/FirebaseFirestore.podspec @@ -60,6 +60,7 @@ Google Cloud Firestore is a NoSQL document database built for automatic scaling, s.frameworks = 'MobileCoreServices', 'SystemConfiguration' s.library = 'c++' s.pod_target_xcconfig = { + 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => "FIRFirestore_VERSION=#{s.version} " + 'GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 ' + diff --git a/FirebaseFunctions.podspec b/FirebaseFunctions.podspec index c5329549665..c3c72428e4b 100644 --- a/FirebaseFunctions.podspec +++ b/FirebaseFunctions.podspec @@ -26,4 +26,8 @@ iOS SDK for Cloud Functions for Firebase. s.dependency 'FirebaseCore', '~> 5.0' s.dependency 'GTMSessionFetcher/Core', '~> 1.1' + + s.pod_target_xcconfig = { + 'GCC_C_LANGUAGE_STANDARD' => 'c99' + } end diff --git a/FirebaseInAppMessagingDisplay.podspec b/FirebaseInAppMessagingDisplay.podspec index fcb0a130b07..9bf260bbc09 100644 --- a/FirebaseInAppMessagingDisplay.podspec +++ b/FirebaseInAppMessagingDisplay.podspec @@ -33,7 +33,9 @@ Firebase In-App Messaging SDK. base_dir + 'Resources/*.png'] } - s.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => + s.pod_target_xcconfig = { + 'GCC_C_LANGUAGE_STANDARD' => 'c99', + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) ' + 'FIRInAppMessagingDisplay_LIB_VERSION=' + String(s.version) } diff --git a/FirebaseMessaging.podspec b/FirebaseMessaging.podspec index bacedf639db..afd777887b9 100644 --- a/FirebaseMessaging.podspec +++ b/FirebaseMessaging.podspec @@ -31,6 +31,7 @@ device, and it is completely free. s.public_header_files = base_dir + 'Public/*.h' s.library = 'sqlite3' s.pod_target_xcconfig = { + 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => 'GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 ' + 'FIRMessaging_LIB_VERSION=' + String(s.version) diff --git a/FirebaseStorage.podspec b/FirebaseStorage.podspec index 5e7fbb6aa54..8198b176aee 100644 --- a/FirebaseStorage.podspec +++ b/FirebaseStorage.podspec @@ -33,6 +33,8 @@ Firebase Storage provides robust, secure file uploads and downloads from Firebas s.dependency 'FirebaseCore', '~> 5.1' s.dependency 'GTMSessionFetcher/Core', '~> 1.1' s.pod_target_xcconfig = { + 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => - 'FIRStorage_VERSION=' + s.version.to_s } + 'FIRStorage_VERSION=' + s.version.to_s + } end diff --git a/scripts/if_changed.sh b/scripts/if_changed.sh index 52a01c711d7..283bdb3e676 100755 --- a/scripts/if_changed.sh +++ b/scripts/if_changed.sh @@ -59,7 +59,7 @@ else ;; Firestore-xcodebuild|Firestore-pod-lib-lint) - check_changes '^Firestore' + check_changes '^(Firestore|FirebaseFirestore.podspec|FirebaseFirestoreSwift.podspec)' ;; Firestore-cmake) From 1d1dd64762f0421d7d277d77cddec5b611d8b6c3 Mon Sep 17 00:00:00 2001 From: Gil Date: Wed, 24 Oct 2018 11:05:42 -0700 Subject: [PATCH 022/102] Use C99-compatible __typeof__ instead of typeof (#1985) `typeof` is only defined if you compile with GNU extensions, while `__typeof__` is always available. This is the Firestore equivalent of #1982. Note that Firestore won't yet build in this mode because among other things the Objective-C gRPC still uses `typeof`. Once we eliminate that dependency this might become possible. --- Firestore/Source/Core/FSTFirestoreClient.mm | 4 ++-- Firestore/Source/Util/FSTClasses.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Firestore/Source/Core/FSTFirestoreClient.mm b/Firestore/Source/Core/FSTFirestoreClient.mm index af3a9b098cb..ecd288c4a0f 100644 --- a/Firestore/Source/Core/FSTFirestoreClient.mm +++ b/Firestore/Source/Core/FSTFirestoreClient.mm @@ -129,10 +129,10 @@ - (instancetype)initWithDatabaseInfo:(const DatabaseInfo &)databaseInfo auto userPromise = std::make_shared>(); - __weak typeof(self) weakSelf = self; + __weak __typeof__(self) weakSelf = self; auto credentialChangeListener = [initialized = false, userPromise, weakSelf, workerDispatchQueue](User user) mutable { - typeof(self) strongSelf = weakSelf; + __typeof__(self) strongSelf = weakSelf; if (!strongSelf) return; if (!initialized) { diff --git a/Firestore/Source/Util/FSTClasses.h b/Firestore/Source/Util/FSTClasses.h index 77dca12c848..79d67c49d52 100644 --- a/Firestore/Source/Util/FSTClasses.h +++ b/Firestore/Source/Util/FSTClasses.h @@ -28,13 +28,13 @@ NS_ASSUME_NONNULL_BEGIN userInfo:nil]; // Declare a weak pointer to the given variable -#define FSTWeakify(var) __weak typeof(var) fstWeakPointerTo##var = var; +#define FSTWeakify(var) __weak __typeof__(var) fstWeakPointerTo##var = var; // Declare a strong pointer to a variable that's been FSTWeakified. This creates a shadow of the // original. #define FSTStrongify(var) \ _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wshadow\"") \ - __strong typeof(var) var = fstWeakPointerTo##var; \ + __strong __typeof__(var) var = fstWeakPointerTo##var; \ _Pragma("clang diagnostic pop") NS_ASSUME_NONNULL_END From 77f1bee0606b06750fe29755a458c5198d6c2433 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Wed, 24 Oct 2018 13:47:36 -0700 Subject: [PATCH 023/102] Adding AppCode Diff (#1996) --- Example/Firebase.xcodeproj/project.pbxproj | 4 ++-- .../xcshareddata/xcschemes/Auth_ApiTests.xcscheme | 13 +++++++++++++ .../xcschemes/Auth_EarlGreyTests.xcscheme | 13 +++++++++++++ .../xcshareddata/xcschemes/Core_Tests_tvOS.xcscheme | 13 +++++++++++++ .../xcschemes/Database_Tests_iOS.xcscheme | 2 +- .../xcschemes/Database_Tests_tvOS.xcscheme | 13 +++++++++++++ .../xcschemes/DynamicLinks_Tests_iOS.xcscheme | 12 ++++++++++++ .../FDLBuilderTestAppObjCEarlGrey.xcscheme | 13 +++++++++++++ .../xcschemes/Storage_Tests_tvOS.xcscheme | 13 +++++++++++++ 9 files changed, 93 insertions(+), 3 deletions(-) diff --git a/Example/Firebase.xcodeproj/project.pbxproj b/Example/Firebase.xcodeproj/project.pbxproj index aaa16c4df2d..c8d99572c96 100644 --- a/Example/Firebase.xcodeproj/project.pbxproj +++ b/Example/Firebase.xcodeproj/project.pbxproj @@ -5739,7 +5739,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 4ANB9W7R3P; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = $SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist; + INFOPLIST_FILE = "$SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; @@ -5773,7 +5773,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 4ANB9W7R3P; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = $SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist; + INFOPLIST_FILE = "$SRCROOT/DynamicLinks/FDLBuilderTestAppObjC/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; diff --git a/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Auth_ApiTests.xcscheme b/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Auth_ApiTests.xcscheme index aa10028b16b..743e93966e9 100644 --- a/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Auth_ApiTests.xcscheme +++ b/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Auth_ApiTests.xcscheme @@ -5,6 +5,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Database_Tests_tvOS.xcscheme b/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Database_Tests_tvOS.xcscheme index 11746316e5c..220851e9c26 100644 --- a/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Database_Tests_tvOS.xcscheme +++ b/Example/Firebase.xcodeproj/xcshareddata/xcschemes/Database_Tests_tvOS.xcscheme @@ -5,6 +5,19 @@ + + + + + + + + + + + + + + + + + + + + + + + + Date: Wed, 24 Oct 2018 15:58:14 -0700 Subject: [PATCH 024/102] Remove warning (#1999) --- Firestore/Source/Local/FSTMemoryPersistence.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firestore/Source/Local/FSTMemoryPersistence.mm b/Firestore/Source/Local/FSTMemoryPersistence.mm index f396ed8b84d..b4c4effbb72 100644 --- a/Firestore/Source/Local/FSTMemoryPersistence.mm +++ b/Firestore/Source/Local/FSTMemoryPersistence.mm @@ -246,7 +246,7 @@ - (int)removeOrphanedDocumentsThroughSequenceNumber:(ListenSequenceNumber)upperB for (const auto &key : removed) { _sequenceNumbers.erase(key); } - return removed.size(); + return static_cast(removed.size()); } - (void)addReference:(const DocumentKey &)key { From 648976a9f4eb33ad22d8b3a78325818b151745a0 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Wed, 24 Oct 2018 21:28:54 -0700 Subject: [PATCH 025/102] Add InAppMessaging to Carthage template (#2006) --- Carthage.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Carthage.md b/Carthage.md index f06c2d16b69..b36aa614a92 100644 --- a/Carthage.md +++ b/Carthage.md @@ -39,6 +39,8 @@ binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseDatabaseBinary.js binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseDynamicLinksBinary.json" binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseFirestoreBinary.json" binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseFunctionsBinary.json" +binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseInAppMessagingBinary.json" +binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseInAppMessagingDisplayBinary.json" binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseInvitesBinary.json" binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseMessagingBinary.json" binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseMLModelInterpreterBinary.json" From fc2c234b593e65c87cab9de5b500956163144091 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Thu, 25 Oct 2018 09:42:45 -0700 Subject: [PATCH 026/102] Restore SafariServices framework (#2002) * SafariServices not available on tvOS and not used on osx --- Firebase/Auth/CHANGELOG.md | 11 +++++++++-- FirebaseAuth.podspec | 2 +- FirebaseCore.podspec | 4 +--- FirebaseDatabase.podspec | 2 +- FirebaseDynamicLinks.podspec | 6 +----- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Firebase/Auth/CHANGELOG.md b/Firebase/Auth/CHANGELOG.md index 2709831f9fd..ecd670288c2 100644 --- a/Firebase/Auth/CHANGELOG.md +++ b/Firebase/Auth/CHANGELOG.md @@ -1,6 +1,13 @@ -# v5.1.0 -- Adds `FIRAuthErrorCodeMalformedJWT`, which is raised on JWT token parsing +# v5.0.5 +- Restore SafariServices framework dependency (#2002). + +# v5.0.4 +- Fix analyzer issues (#1740). + +# v5.0.3 +- Adds `FIRAuthErrorCodeMalformedJWT`, which is raised on JWT token parsing. failures during auth operations (#1436). +- Migrate to use FirebaseAuthInterop interfaces to access FirebaseAuth (#1501). # v5.0.2 - Fix an issue where JWT date timestamps weren't parsed correctly. (#1319) diff --git a/FirebaseAuth.podspec b/FirebaseAuth.podspec index f2a09204103..d0d65969d24 100644 --- a/FirebaseAuth.podspec +++ b/FirebaseAuth.podspec @@ -60,8 +60,8 @@ supports email and password accounts, as well as several 3rd party authenticatio 'FIRAuth_VERSION=' + s.version.to_s + ' FIRAuth_MINOR_VERSION=' + s.version.to_s.split(".")[0] + "." + s.version.to_s.split(".")[1] } - s.framework = 'SafariServices' s.framework = 'Security' + s.ios.framework = 'SafariServices' s.dependency 'FirebaseAuthInterop', '~> 1.0' s.dependency 'FirebaseCore', '~> 5.1' s.dependency 'GoogleUtilities/Environment', '~> 5.2' diff --git a/FirebaseCore.podspec b/FirebaseCore.podspec index 1bd82207b14..5d8ce232f08 100644 --- a/FirebaseCore.podspec +++ b/FirebaseCore.podspec @@ -27,9 +27,7 @@ Firebase Core includes FIRApp and FIROptions which provide central configuration s.source_files = 'Firebase/Core/**/*.[mh]' s.public_header_files = 'Firebase/Core/Public/*.h', 'Firebase/Core/Private/*.h' s.private_header_files = 'Firebase/Core/Private/*.h' - s.frameworks = [ - 'Foundation' - ] + s.framework = 'Foundation' s.dependency 'GoogleUtilities/Logger', '~> 5.2' s.pod_target_xcconfig = { 'GCC_C_LANGUAGE_STANDARD' => 'c99', diff --git a/FirebaseDatabase.podspec b/FirebaseDatabase.podspec index 876ecda29e3..f3677c201c4 100644 --- a/FirebaseDatabase.podspec +++ b/FirebaseDatabase.podspec @@ -30,7 +30,7 @@ Simplify your iOS development, grow your user base, and monetize more effectivel base_dir + 'third_party/SocketRocket/fbase64.c' s.public_header_files = base_dir + 'Public/*.h' s.libraries = ['c++', 'icucore'] - s.frameworks = ['CFNetwork', 'Security', 'SystemConfiguration'] + s.frameworks = 'CFNetwork', 'Security', 'SystemConfiguration' s.dependency 'leveldb-library', '~> 1.18' s.dependency 'FirebaseCore', '~> 5.0' s.pod_target_xcconfig = { diff --git a/FirebaseDynamicLinks.podspec b/FirebaseDynamicLinks.podspec index 38d7f980f15..57244a1b6bf 100644 --- a/FirebaseDynamicLinks.podspec +++ b/FirebaseDynamicLinks.podspec @@ -24,11 +24,7 @@ Firebase Dynamic Links are deep links that enhance user experience and increase s.source_files = 'Firebase/DynamicLinks/**/*.[mh]' s.public_header_files = 'Firebase/DynamicLinks/Public/*.h' - s.frameworks = [ - 'AssetsLibrary', - 'MessageUI', - 'QuartzCore', - ] + s.frameworks = 'AssetsLibrary', 'MessageUI', 'QuartzCore' s.weak_framework = 'WebKit' s.dependency 'FirebaseCore', '~> 5.1' s.ios.dependency 'FirebaseAnalytics', '~> 5.1' From 7d5add30ed6ec3b24c83932cbf68407e6b59475a Mon Sep 17 00:00:00 2001 From: Gil Date: Thu, 25 Oct 2018 10:59:42 -0700 Subject: [PATCH 027/102] Force Firestore to conform to C99 and C++11. (#2001) Note that c++0x is how Xcode spells c++11. Also fix an issue where we were accidentally using a C++14 feature. --- FirebaseFirestore.podspec | 1 + .../Example/Firestore.xcodeproj/project.pbxproj | 12 +++++------- Firestore/Source/Core/FSTFirestoreClient.mm | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/FirebaseFirestore.podspec b/FirebaseFirestore.podspec index 268484854b1..6802b0adb74 100644 --- a/FirebaseFirestore.podspec +++ b/FirebaseFirestore.podspec @@ -60,6 +60,7 @@ Google Cloud Firestore is a NoSQL document database built for automatic scaling, s.frameworks = 'MobileCoreServices', 'SystemConfiguration' s.library = 'c++' s.pod_target_xcconfig = { + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++0x', 'GCC_C_LANGUAGE_STANDARD' => 'c99', 'GCC_PREPROCESSOR_DEFINITIONS' => "FIRFirestore_VERSION=#{s.version} " + diff --git a/Firestore/Example/Firestore.xcodeproj/project.pbxproj b/Firestore/Example/Firestore.xcodeproj/project.pbxproj index 26cf2fffc4e..bfb19ac134c 100644 --- a/Firestore/Example/Firestore.xcodeproj/project.pbxproj +++ b/Firestore/Example/Firestore.xcodeproj/project.pbxproj @@ -543,7 +543,7 @@ B79CA87A1A01FC5329031C9B /* Pods_Firestore_FuzzTests_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_FuzzTests_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B9C261C26C5D311E1E3C0CB9 /* query_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = query_test.cc; sourceTree = ""; }; BB92EB03E3F92485023F64ED /* Pods_Firestore_Example_iOS_Firestore_SwiftTests_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_Example_iOS_Firestore_SwiftTests_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C8522DE226C467C54E6788D8 /* mutation_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = mutation_test.cc; sourceTree = ""; }; + C8522DE226C467C54E6788D8 /* mutation_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = mutation_test.cc; sourceTree = ""; }; D3CC3DC5338DCAF43A211155 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; D5B2593BCB52957D62F1C9D3 /* perf_spec_test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = perf_spec_test.json; sourceTree = ""; }; DE03B2E91F2149D600A30B9C /* Firestore_IntegrationTests_iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Firestore_IntegrationTests_iOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -2095,7 +2095,6 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -2134,7 +2133,6 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -2338,7 +2336,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -2353,7 +2351,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -2380,7 +2378,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -2395,7 +2393,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; diff --git a/Firestore/Source/Core/FSTFirestoreClient.mm b/Firestore/Source/Core/FSTFirestoreClient.mm index ecd288c4a0f..5b07b54912b 100644 --- a/Firestore/Source/Core/FSTFirestoreClient.mm +++ b/Firestore/Source/Core/FSTFirestoreClient.mm @@ -128,9 +128,10 @@ - (instancetype)initWithDatabaseInfo:(const DatabaseInfo &)databaseInfo _workerDispatchQueue = workerDispatchQueue; auto userPromise = std::make_shared>(); + bool initialized = false; __weak __typeof__(self) weakSelf = self; - auto credentialChangeListener = [initialized = false, userPromise, weakSelf, + auto credentialChangeListener = [initialized, userPromise, weakSelf, workerDispatchQueue](User user) mutable { __typeof__(self) strongSelf = weakSelf; if (!strongSelf) return; From b032cccdf14f83e4f2d9183ecda0e08982fee20d Mon Sep 17 00:00:00 2001 From: davidair Date: Thu, 25 Oct 2018 15:02:23 -0400 Subject: [PATCH 028/102] Changing the internal testing repo (#2003) --- Example/Podfile | 2 +- Firestore/Example/Podfile | 2 +- Releases/update-versions.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Example/Podfile b/Example/Podfile index fc24e5b7b37..9c1f3b3bacf 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,5 +1,5 @@ # Uncomment the next two lines for pre-release testing -#source 'sso://cpdc-internal/spec' +#source 'sso://cpdc-internal/firebase' #source 'https://github.com/CocoaPods/Specs.git' use_frameworks! diff --git a/Firestore/Example/Podfile b/Firestore/Example/Podfile index e2488583a53..b065d61f8ef 100644 --- a/Firestore/Example/Podfile +++ b/Firestore/Example/Podfile @@ -1,5 +1,5 @@ # Uncomment the next two lines for pre-release testing -#source 'sso://cpdc-internal/spec' +#source 'sso://cpdc-internal/firebase' #source 'https://github.com/CocoaPods/Specs.git' use_frameworks! diff --git a/Releases/update-versions.py b/Releases/update-versions.py index 1c325323701..ef3dbb65086 100755 --- a/Releases/update-versions.py +++ b/Releases/update-versions.py @@ -188,11 +188,11 @@ def UpdateTags(version_data, firebase_version, first=False): def GetCpdcInternal(): - """Find the cpdc-internal repo. + """Find the firebase repo. """ tmp_file = tempfile.mktemp() - os.system('pod repo list | grep -B2 sso://cpdc-internal | head -1 > {}' + os.system('pod repo list | grep -B2 sso://cpdc-internal/firebase | head -1 > {}' .format(tmp_file)) with open(tmp_file,'r') as o: output_var = ''.join(o.readlines()).strip() @@ -201,7 +201,7 @@ def GetCpdcInternal(): def PushPodspecs(version_data): - """Push podspecs to cpdc-internal. + """Push podspecs to cpdc-firebase. Args: version_data: dictionary of versions to be updated. From b86911573f6dac5dd5f0a3721a82ec472048d91f Mon Sep 17 00:00:00 2001 From: zxu Date: Thu, 25 Oct 2018 17:10:44 -0400 Subject: [PATCH 029/102] Clean up test. The issue has already been fixed and we are now running integration test with actual server instead of hexa. (#2007) --- Firestore/Example/Tests/Integration/API/FIRQueryTests.mm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm b/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm index 47786567e76..83127b550b5 100644 --- a/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm +++ b/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm @@ -257,11 +257,6 @@ - (void)testQueriesFireFromCacheWhenOffline { querySnap = [self.eventAccumulator awaitEventWithName:@"offline event with isFromCache=YES"]; XCTAssertEqual(querySnap.metadata.isFromCache, YES); - // TODO(b/70631617): There's currently a backend bug that prevents us from using a resume token - // right away (against hexa at least). So we sleep. :-( :-( Anything over ~10ms seems to be - // sufficient. - [NSThread sleepForTimeInterval:0.2f]; - [self enableNetwork]; querySnap = [self.eventAccumulator awaitEventWithName:@"back online event with isFromCache=NO"]; XCTAssertEqual(querySnap.metadata.isFromCache, NO); From a514bd957a9576aa708d575cdf7ed05e63b1192a Mon Sep 17 00:00:00 2001 From: Konstantin Varlamov Date: Thu, 25 Oct 2018 20:13:03 -0400 Subject: [PATCH 030/102] gRPC: replace Objective-C implementation with the new C++ implementation (#1968) * add support for SSL disabled to `GrpcConnection` (unfortunately, there currently is no way to verify this change actually works); * make gRPC calls using the C++ implementation: * make `FSTRemoteStore` create C++ streams instead of their Objective-C counterparts; * port https://github.com/firebase/firebase-js-sdk/pull/1041: streams are now never recreated, only restarted; * make `FSTDatastore` delegate server calls to the C++ implementation; * port `MockWatchStream` and `MockWriteStream` to C++ (`FSTMockDatastore` is still in place, because `Datastore` is not fully ported yet); * no longer generate Objective-C gRPC service definitions from protos; * remove all references to Objective-C gRPC client; * check in gRPC root certificates file and load it at runtime (the check-in part is temporary until gRPC-C++.podspec provides the certificate). This makes SSL work. --- FirebaseFirestore.podspec | 5 +- .../Firestore.xcodeproj/project.pbxproj | 86 +- .../Tests/Integration/FSTDatastoreTests.mm | 8 +- .../Tests/Integration/FSTStreamTests.mm | 403 -- .../Example/Tests/Remote/FSTDatastoreTests.mm | 1 - .../Tests/Remote/FSTSerializerBetaTests.mm | 1 - .../Tests/SpecTests/FSTMockDatastore.h | 9 - .../Tests/SpecTests/FSTMockDatastore.mm | 477 +- .../Example/Tests/SpecTests/FSTSpecTests.mm | 1 - .../SpecTests/FSTSyncEngineTestDriver.mm | 1 - .../Tests/Util/FSTIntegrationTestCase.mm | 11 +- Firestore/Protos/CMakeLists.txt | 5 - Firestore/Protos/build_protos.py | 11 +- .../firestore/v1beta1/Firestore.pbrpc.h | 268 - .../firestore/v1beta1/Firestore.pbrpc.m | 306 -- Firestore/Source/API/FIRDocumentReference.mm | 2 - Firestore/Source/Core/FSTSyncEngine.mm | 2 - Firestore/Source/Core/FSTTransaction.mm | 2 - Firestore/Source/Remote/FSTBufferedWriter.h | 44 - Firestore/Source/Remote/FSTBufferedWriter.mm | 134 - Firestore/Source/Remote/FSTDatastore.h | 27 +- Firestore/Source/Remote/FSTDatastore.mm | 229 +- .../Source/Remote/FSTExponentialBackoff.h | 84 - .../Source/Remote/FSTExponentialBackoff.mm | 128 - Firestore/Source/Remote/FSTRemoteStore.mm | 185 +- Firestore/Source/Remote/FSTSerializerBeta.mm | 2 - Firestore/Source/Remote/FSTStream.h | 249 +- Firestore/Source/Remote/FSTStream.mm | 823 ---- Firestore/Source/Util/FSTDispatchQueue.h | 4 +- Firestore/Source/Util/FSTDispatchQueue.mm | 5 +- .../firestore/remote/grpc_connection.h | 24 +- .../firestore/remote/grpc_connection.mm | 109 +- .../remote/grpc_root_certificate_finder.h | 39 + .../grpc_root_certificate_finder_apple.mm | 50 + .../src/firebase/firestore/remote/stream.h | 12 +- .../firebase/firestore/remote/watch_stream.h | 5 +- .../firebase/firestore/remote/write_stream.h | 13 +- .../firestore/remote/grpc_stream_test.cc | 6 +- Firestore/etc/roots.pem | 4342 +++++++++++++++++ 39 files changed, 4947 insertions(+), 3166 deletions(-) delete mode 100644 Firestore/Example/Tests/Integration/FSTStreamTests.mm delete mode 100644 Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h delete mode 100644 Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m delete mode 100644 Firestore/Source/Remote/FSTBufferedWriter.h delete mode 100644 Firestore/Source/Remote/FSTBufferedWriter.mm delete mode 100644 Firestore/Source/Remote/FSTExponentialBackoff.h delete mode 100644 Firestore/Source/Remote/FSTExponentialBackoff.mm delete mode 100644 Firestore/Source/Remote/FSTStream.mm create mode 100644 Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h create mode 100644 Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm create mode 100644 Firestore/etc/roots.pem diff --git a/FirebaseFirestore.podspec b/FirebaseFirestore.podspec index 6802b0adb74..aaf4b4a3e0c 100644 --- a/FirebaseFirestore.podspec +++ b/FirebaseFirestore.podspec @@ -49,9 +49,12 @@ Google Cloud Firestore is a NoSQL document database built for automatic scaling, ] s.public_header_files = 'Firestore/Source/Public/*.h' + # TODO(varconst): remove once https://github.com/grpc/grpc/pull/16962 makes it + # into a release. + s.resource_bundles = { 'gRPCCertificates' => ['Firestore/etc/roots.pem'] } + s.dependency 'FirebaseAuthInterop', '~> 1.0' s.dependency 'FirebaseCore', '~> 5.1' - s.dependency 'gRPC-ProtoRPC', '~> 1.0' s.dependency 'gRPC-C++', '~> 0.0.3' s.dependency 'leveldb-library', '~> 1.20' s.dependency 'Protobuf', '~> 3.1' diff --git a/Firestore/Example/Firestore.xcodeproj/project.pbxproj b/Firestore/Example/Firestore.xcodeproj/project.pbxproj index bfb19ac134c..234d364f27a 100644 --- a/Firestore/Example/Firestore.xcodeproj/project.pbxproj +++ b/Firestore/Example/Firestore.xcodeproj/project.pbxproj @@ -82,7 +82,6 @@ 5492E07A202154D600B64F25 /* FIRTypeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E071202154D600B64F25 /* FIRTypeTests.mm */; }; 5492E07F202154EC00B64F25 /* FSTTransactionTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */; }; 5492E080202154EC00B64F25 /* FSTSmokeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */; }; - 5492E081202154EC00B64F25 /* FSTStreamTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07D202154EB00B64F25 /* FSTStreamTests.mm */; }; 5492E082202154EC00B64F25 /* FSTDatastoreTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */; }; 5492E09D2021552D00B64F25 /* FSTLocalStoreTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0832021552A00B64F25 /* FSTLocalStoreTests.mm */; }; 5492E09F2021552D00B64F25 /* FSTLevelDBMigrationsTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0862021552A00B64F25 /* FSTLevelDBMigrationsTests.mm */; }; @@ -361,7 +360,6 @@ 5492E071202154D600B64F25 /* FIRTypeTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FIRTypeTests.mm; sourceTree = ""; }; 5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTTransactionTests.mm; sourceTree = ""; }; 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTSmokeTests.mm; sourceTree = ""; }; - 5492E07D202154EB00B64F25 /* FSTStreamTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTStreamTests.mm; sourceTree = ""; }; 5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDatastoreTests.mm; sourceTree = ""; }; 5492E0832021552A00B64F25 /* FSTLocalStoreTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTLocalStoreTests.mm; sourceTree = ""; }; 5492E0852021552A00B64F25 /* FSTRemoteDocumentCacheTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSTRemoteDocumentCacheTests.h; sourceTree = ""; }; @@ -1234,7 +1232,6 @@ DE03B3621F215E1600A30B9C /* CAcert.pem */, 5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */, 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */, - 5492E07D202154EB00B64F25 /* FSTStreamTests.mm */, 5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */, ); path = Integration; @@ -1270,6 +1267,7 @@ 54C9EDEE2040E16300A969CD /* Frameworks */, 54C9EDEF2040E16300A969CD /* Resources */, EA424838F4A5DD7B337F57AB /* [CP] Embed Pods Frameworks */, + DE5C36328822481F6EB6EF16 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1310,6 +1308,7 @@ 6003F587195388D20070C39A /* Frameworks */, 6003F588195388D20070C39A /* Resources */, 1EE692C7509A98D7EB03CA51 /* [CP] Embed Pods Frameworks */, + 1E7DAED3207D01F1744EA227 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1510,6 +1509,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 1E7DAED3207D01F1744EA227 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS/Pods-Firestore_Example_iOS-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseFirestore/gRPCCertificates.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS/Pods-Firestore_Example_iOS-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 1EE692C7509A98D7EB03CA51 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1521,11 +1538,8 @@ "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", "${BUILT_PRODUCTS_DIR}/Protobuf-iOS8.0/Protobuf.framework", - "${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework", "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework", "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", - "${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework", - "${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework", "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", ); @@ -1535,11 +1549,8 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", ); @@ -1757,6 +1768,24 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + DE5C36328822481F6EB6EF16 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseFirestore/gRPCCertificates.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; EA424838F4A5DD7B337F57AB /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1768,11 +1797,8 @@ "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", "${BUILT_PRODUCTS_DIR}/Protobuf-iOS8.0/Protobuf.framework", - "${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework", "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework", "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", - "${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework", - "${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework", "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", ); @@ -1782,11 +1808,8 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", ); @@ -2006,7 +2029,6 @@ 5492E0422021440500B64F25 /* FSTHelpers.mm in Sources */, 5491BC731FB44593008B3588 /* FSTIntegrationTestCase.mm in Sources */, 5492E080202154EC00B64F25 /* FSTSmokeTests.mm in Sources */, - 5492E081202154EC00B64F25 /* FSTStreamTests.mm in Sources */, 5492E07F202154EC00B64F25 /* FSTTransactionTests.mm in Sources */, 5492E0442021457E00B64F25 /* XCTestCase+Await.mm in Sources */, B67BF44A216EB43000CA9097 /* create_noop_connectivity_monitor.cc in Sources */, @@ -2219,14 +2241,6 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", - "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", @@ -2303,14 +2317,6 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", - "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", @@ -2512,14 +2518,6 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", - "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", @@ -2597,14 +2595,6 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", - "-iquote", - "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", - "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", diff --git a/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm b/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm index 67842b93e0a..e931e185277 100644 --- a/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm +++ b/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm @@ -17,8 +17,6 @@ #import #import -#import -#import #import #import "Firestore/Source/API/FIRDocumentReference+Internal.h" @@ -52,6 +50,7 @@ using firebase::firestore::model::DocumentKeySet; using firebase::firestore::model::Precondition; using firebase::firestore::model::TargetId; +using firebase::firestore::remote::GrpcConnection; NS_ASSUME_NONNULL_BEGIN @@ -162,7 +161,7 @@ - (void)setUp { NSString *projectID = [FSTIntegrationTestCase projectID]; FIRFirestoreSettings *settings = [FSTIntegrationTestCase settings]; if (!settings.sslEnabled) { - [GRPCCall useInsecureConnectionsForHost:settings.host]; + GrpcConnection::UseInsecureChannel(util::MakeString(settings.host)); } DatabaseId database_id(util::MakeString(projectID), DatabaseId::kDefault); @@ -222,6 +221,9 @@ - (void)testStreamingWrite { mutations:@[ mutation ]]; [_testWorkerQueue dispatchAsync:^{ [_remoteStore addBatchToWritePipeline:batch]; + // The added batch won't be written immediately because write stream wasn't yet open -- + // trigger its opening. + [_remoteStore fillWritePipeline]; }]; [self awaitExpectations]; diff --git a/Firestore/Example/Tests/Integration/FSTStreamTests.mm b/Firestore/Example/Tests/Integration/FSTStreamTests.mm deleted file mode 100644 index 5186657a64a..00000000000 --- a/Firestore/Example/Tests/Integration/FSTStreamTests.mm +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import - -#import -#import - -#include - -#import "Firestore/Example/Tests/Util/FSTHelpers.h" -#import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h" -#import "Firestore/Source/Remote/FSTDatastore.h" -#import "Firestore/Source/Remote/FSTStream.h" - -#include "Firestore/core/src/firebase/firestore/auth/empty_credentials_provider.h" -#include "Firestore/core/src/firebase/firestore/core/database_info.h" -#include "Firestore/core/src/firebase/firestore/model/database_id.h" -#include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" -#include "Firestore/core/src/firebase/firestore/util/hard_assert.h" -#include "Firestore/core/src/firebase/firestore/util/string_apple.h" - -namespace util = firebase::firestore::util; -using firebase::firestore::auth::EmptyCredentialsProvider; -using firebase::firestore::core::DatabaseInfo; -using firebase::firestore::model::DatabaseId; -using firebase::firestore::model::SnapshotVersion; - -/** Exposes otherwise private methods for testing. */ -@interface FSTStream (Testing) -@property(nonatomic, strong, readwrite) id callbackFilter; -@end - -/** - * Implements FSTWatchStreamDelegate and FSTWriteStreamDelegate and supports waiting on callbacks - * via `fulfillOnCallback`. - */ -@interface FSTStreamStatusDelegate : NSObject - -- (instancetype)initWithTestCase:(XCTestCase *)testCase - queue:(FSTDispatchQueue *)dispatchQueue NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@property(nonatomic, weak, readonly) XCTestCase *testCase; -@property(nonatomic, strong, readonly) FSTDispatchQueue *dispatchQueue; -@property(nonatomic, readonly) NSMutableArray *states; -@property(nonatomic, strong) XCTestExpectation *expectation; - -@end - -@implementation FSTStreamStatusDelegate - -- (instancetype)initWithTestCase:(XCTestCase *)testCase queue:(FSTDispatchQueue *)dispatchQueue { - if (self = [super init]) { - _testCase = testCase; - _dispatchQueue = dispatchQueue; - _states = [NSMutableArray new]; - } - - return self; -} - -- (void)watchStreamDidOpen { - [_states addObject:@"watchStreamDidOpen"]; - [_expectation fulfill]; - _expectation = nil; -} - -- (void)writeStreamDidOpen { - [_states addObject:@"writeStreamDidOpen"]; - [_expectation fulfill]; - _expectation = nil; -} - -- (void)writeStreamDidCompleteHandshake { - [_states addObject:@"writeStreamDidCompleteHandshake"]; - [_expectation fulfill]; - _expectation = nil; -} - -- (void)writeStreamWasInterruptedWithError:(nullable NSError *)error { - [_states addObject:@"writeStreamWasInterrupted"]; - [_expectation fulfill]; - _expectation = nil; -} - -- (void)watchStreamWasInterruptedWithError:(nullable NSError *)error { - [_states addObject:@"watchStreamWasInterrupted"]; - [_expectation fulfill]; - _expectation = nil; -} - -- (void)watchStreamDidChange:(FSTWatchChange *)change - snapshotVersion:(const SnapshotVersion &)snapshotVersion { - [_states addObject:@"watchStreamDidChange"]; - [_expectation fulfill]; - _expectation = nil; -} - -- (void)writeStreamDidReceiveResponseWithVersion:(const SnapshotVersion &)commitVersion - mutationResults:(NSArray *)results { - [_states addObject:@"writeStreamDidReceiveResponseWithVersion"]; - [_expectation fulfill]; - _expectation = nil; -} - -/** - * Executes 'block' using the provided FSTDispatchQueue and waits for any callback on this delegate - * to be called. - */ -- (void)awaitNotificationFromBlock:(void (^)(void))block { - HARD_ASSERT(_expectation == nil, "Previous expectation still active"); - XCTestExpectation *expectation = - [self.testCase expectationWithDescription:@"awaitCallbackInBlock"]; - _expectation = expectation; - [self.dispatchQueue dispatchAsync:block]; - [self.testCase awaitExpectations]; -} - -@end - -@interface FSTStreamTests : XCTestCase - -@end - -@implementation FSTStreamTests { - dispatch_queue_t _testQueue; - FSTDispatchQueue *_workerDispatchQueue; - DatabaseInfo _databaseInfo; - EmptyCredentialsProvider _credentials; - FSTStreamStatusDelegate *_delegate; - - /** Single mutation to send to the write stream. */ - NSArray *_mutations; -} - -- (void)setUp { - [super setUp]; - - FIRFirestoreSettings *settings = [FSTIntegrationTestCase settings]; - DatabaseId database_id(util::MakeString([FSTIntegrationTestCase projectID]), - DatabaseId::kDefault); - - _testQueue = dispatch_queue_create("FSTStreamTestWorkerQueue", DISPATCH_QUEUE_SERIAL); - _workerDispatchQueue = [[FSTDispatchQueue alloc] initWithQueue:_testQueue]; - - _databaseInfo = - DatabaseInfo(database_id, "test-key", util::MakeString(settings.host), settings.sslEnabled); - - _delegate = [[FSTStreamStatusDelegate alloc] initWithTestCase:self queue:_workerDispatchQueue]; - - _mutations = @[ FSTTestSetMutation(@"foo/bar", @{}) ]; -} - -- (FSTWriteStream *)setUpWriteStream { - FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo - workerDispatchQueue:_workerDispatchQueue - credentials:&_credentials]; - return [datastore createWriteStream]; -} - -- (FSTWatchStream *)setUpWatchStream { - FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo - workerDispatchQueue:_workerDispatchQueue - credentials:&_credentials]; - return [datastore createWatchStream]; -} - -/** - * Drains the test queue and asserts that all the observed callbacks (up to this point) match - * 'expectedStates'. Clears the list of observed callbacks on completion. - */ -- (void)verifyDelegateObservedStates:(NSArray *)expectedStates { - // Drain queue - dispatch_sync(_testQueue, ^{ - }); - - XCTAssertEqualObjects(_delegate.states, expectedStates); - [_delegate.states removeAllObjects]; -} - -/** Verifies that the watch stream does not issue an onClose callback after a call to stop(). */ -- (void)testWatchStreamStopBeforeHandshake { - FSTWatchStream *watchStream = [self setUpWatchStream]; - - [_delegate awaitNotificationFromBlock:^{ - [watchStream startWithDelegate:_delegate]; - }]; - - // Stop must not call watchStreamDidClose because the full implementation of the delegate could - // attempt to restart the stream in the event it had pending watches. - [_workerDispatchQueue dispatchAsync:^{ - [watchStream stop]; - }]; - - // Simulate a final callback from GRPC - [_workerDispatchQueue dispatchAsync:^{ - [watchStream.callbackFilter writesFinishedWithError:nil]; - }]; - - [self verifyDelegateObservedStates:@[ @"watchStreamDidOpen" ]]; -} - -/** Verifies that the write stream does not issue an onClose callback after a call to stop(). */ -- (void)testWriteStreamStopBeforeHandshake { - FSTWriteStream *writeStream = [self setUpWriteStream]; - - [_delegate awaitNotificationFromBlock:^{ - [writeStream startWithDelegate:_delegate]; - }]; - - // Don't start the handshake. - - // Stop must not call watchStreamDidClose because the full implementation of the delegate could - // attempt to restart the stream in the event it had pending watches. - [_workerDispatchQueue dispatchAsync:^{ - [writeStream stop]; - }]; - - // Simulate a final callback from GRPC - [_workerDispatchQueue dispatchAsync:^{ - [writeStream.callbackFilter writesFinishedWithError:nil]; - }]; - - [self verifyDelegateObservedStates:@[ @"writeStreamDidOpen" ]]; -} - -- (void)testWriteStreamStopAfterHandshake { - FSTWriteStream *writeStream = [self setUpWriteStream]; - - [_delegate awaitNotificationFromBlock:^{ - [writeStream startWithDelegate:_delegate]; - }]; - - // Writing before the handshake should throw - [_workerDispatchQueue dispatchSync:^{ - XCTAssertThrows([writeStream writeMutations:_mutations]); - }]; - - [_delegate awaitNotificationFromBlock:^{ - [writeStream writeHandshake]; - }]; - - // Now writes should succeed - [_delegate awaitNotificationFromBlock:^{ - [writeStream writeMutations:_mutations]; - }]; - - [_workerDispatchQueue dispatchAsync:^{ - [writeStream stop]; - }]; - - [self verifyDelegateObservedStates:@[ - @"writeStreamDidOpen", @"writeStreamDidCompleteHandshake", - @"writeStreamDidReceiveResponseWithVersion" - ]]; -} - -- (void)testStreamClosesWhenIdle { - FSTWriteStream *writeStream = [self setUpWriteStream]; - - [_delegate awaitNotificationFromBlock:^{ - [writeStream startWithDelegate:_delegate]; - }]; - - [_delegate awaitNotificationFromBlock:^{ - [writeStream writeHandshake]; - }]; - - [_workerDispatchQueue dispatchAsync:^{ - [writeStream markIdle]; - XCTAssertTrue( - [_workerDispatchQueue containsDelayedCallbackWithTimerID:FSTTimerIDWriteStreamIdle]); - }]; - - [_workerDispatchQueue runDelayedCallbacksUntil:FSTTimerIDWriteStreamIdle]; - - [_workerDispatchQueue dispatchSync:^{ - XCTAssertFalse([writeStream isOpen]); - }]; - - [self verifyDelegateObservedStates:@[ - @"writeStreamDidOpen", @"writeStreamDidCompleteHandshake", @"writeStreamWasInterrupted" - ]]; -} - -- (void)testStreamCancelsIdleOnWrite { - FSTWriteStream *writeStream = [self setUpWriteStream]; - - [_delegate awaitNotificationFromBlock:^{ - [writeStream startWithDelegate:_delegate]; - }]; - - [_delegate awaitNotificationFromBlock:^{ - [writeStream writeHandshake]; - }]; - - // Mark the stream idle, but immediately cancel the idle timer by issuing another write. - [_delegate awaitNotificationFromBlock:^{ - [writeStream markIdle]; - XCTAssertTrue( - [_workerDispatchQueue containsDelayedCallbackWithTimerID:FSTTimerIDWriteStreamIdle]); - [writeStream writeMutations:_mutations]; - XCTAssertFalse( - [_workerDispatchQueue containsDelayedCallbackWithTimerID:FSTTimerIDWriteStreamIdle]); - }]; - - [_workerDispatchQueue dispatchSync:^{ - XCTAssertTrue([writeStream isOpen]); - }]; - - [self verifyDelegateObservedStates:@[ - @"writeStreamDidOpen", @"writeStreamDidCompleteHandshake", - @"writeStreamDidReceiveResponseWithVersion" - ]]; -} - -class MockCredentialsProvider : public firebase::firestore::auth::EmptyCredentialsProvider { - public: - MockCredentialsProvider() { - observed_states_ = [NSMutableArray new]; - } - - void GetToken(firebase::firestore::auth::TokenListener completion) override { - [observed_states_ addObject:@"GetToken"]; - EmptyCredentialsProvider::GetToken(std::move(completion)); - } - - void InvalidateToken() override { - [observed_states_ addObject:@"InvalidateToken"]; - EmptyCredentialsProvider::InvalidateToken(); - } - - NSMutableArray *observed_states() const { - return observed_states_; - } - - private: - NSMutableArray *observed_states_; -}; - -- (void)testStreamRefreshesTokenUponExpiration { - MockCredentialsProvider credentials; - FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo - workerDispatchQueue:_workerDispatchQueue - credentials:&credentials]; - FSTWatchStream *watchStream = [datastore createWatchStream]; - - [_delegate awaitNotificationFromBlock:^{ - [watchStream startWithDelegate:_delegate]; - }]; - - // Simulate callback from GRPC with an unauthenticated error -- this should invalidate the token. - NSError *unauthenticatedError = [NSError errorWithDomain:FIRFirestoreErrorDomain - code:FIRFirestoreErrorCodeUnauthenticated - userInfo:nil]; - dispatch_async(_testQueue, ^{ - [watchStream.callbackFilter writesFinishedWithError:unauthenticatedError]; - }); - // Drain the queue. - dispatch_sync(_testQueue, ^{ - }); - - // Try reconnecting. - [_delegate awaitNotificationFromBlock:^{ - [watchStream startWithDelegate:_delegate]; - }]; - // Simulate a different error -- token should not be invalidated this time. - NSError *unavailableError = [NSError errorWithDomain:FIRFirestoreErrorDomain - code:FIRFirestoreErrorCodeUnavailable - userInfo:nil]; - dispatch_async(_testQueue, ^{ - [watchStream.callbackFilter writesFinishedWithError:unavailableError]; - }); - dispatch_sync(_testQueue, ^{ - }); - - [_delegate awaitNotificationFromBlock:^{ - [watchStream startWithDelegate:_delegate]; - }]; - dispatch_sync(_testQueue, ^{ - }); - - NSArray *expected = @[ @"GetToken", @"InvalidateToken", @"GetToken", @"GetToken" ]; - XCTAssertEqualObjects(credentials.observed_states(), expected); -} - -@end diff --git a/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm b/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm index 3e384a47b1b..84a85d4555b 100644 --- a/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm +++ b/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm @@ -17,7 +17,6 @@ #import "Firestore/Source/Remote/FSTDatastore.h" #import -#import #import @interface FSTDatastoreTests : XCTestCase diff --git a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm index a705d8b88ed..139ff0a245d 100644 --- a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm +++ b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm @@ -21,7 +21,6 @@ #import #import #import -#import #import #include diff --git a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h index 9f7fd02c2f0..86a0796d4f3 100644 --- a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h +++ b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h @@ -39,15 +39,6 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Watch Stream manipulation. -/** Injects an Added WatchChange containing the given targetIDs. */ -- (void)writeWatchTargetAddedWithTargetIDs:(NSArray *)targetIDs; - -/** Injects an Added WatchChange that marks the given targetIDs current. */ -- (void)writeWatchCurrentWithTargetIDs:(NSArray *)targetIDs - snapshotVersion: - (const firebase::firestore::model::SnapshotVersion &)snapshotVersion - resumeToken:(NSData *)resumeToken; - /** Injects a WatchChange as though it had come from the backend. */ - (void)writeWatchChange:(FSTWatchChange *)change snapshotVersion:(const firebase::firestore::model::SnapshotVersion &)snap; diff --git a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm index c9ec20e5441..440117519cd 100644 --- a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm +++ b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm @@ -16,11 +16,17 @@ #import "Firestore/Example/Tests/SpecTests/FSTMockDatastore.h" +#include +#include +#include +#include + #import "Firestore/Source/Core/FSTQuery.h" #import "Firestore/Source/Local/FSTQueryData.h" #import "Firestore/Source/Model/FSTMutation.h" #import "Firestore/Source/Remote/FSTSerializerBeta.h" #import "Firestore/Source/Remote/FSTStream.h" +#import "Firestore/Source/Util/FSTDispatchQueue.h" #import "Firestore/Example/Tests/Remote/FSTWatchChange+Testing.h" @@ -28,8 +34,14 @@ #include "Firestore/core/src/firebase/firestore/auth/empty_credentials_provider.h" #include "Firestore/core/src/firebase/firestore/core/database_info.h" #include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "Firestore/core/src/firebase/firestore/remote/connectivity_monitor.h" +#include "Firestore/core/src/firebase/firestore/remote/grpc_connection.h" +#include "Firestore/core/src/firebase/firestore/remote/stream.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_apple.h" +#include "Firestore/core/test/firebase/firestore/util/create_noop_connectivity_monitor.h" +#include "absl/memory/memory.h" +#include "grpcpp/completion_queue.h" using firebase::firestore::auth::CredentialsProvider; using firebase::firestore::auth::EmptyCredentialsProvider; @@ -37,254 +49,204 @@ using firebase::firestore::model::DatabaseId; using firebase::firestore::model::SnapshotVersion; using firebase::firestore::model::TargetId; - -@class GRPCProtoCall; +using firebase::firestore::remote::ConnectivityMonitor; +using firebase::firestore::remote::GrpcConnection; +using firebase::firestore::remote::WatchStream; +using firebase::firestore::remote::WriteStream; +using firebase::firestore::util::AsyncQueue; +using firebase::firestore::util::CreateNoOpConnectivityMonitor; NS_ASSUME_NONNULL_BEGIN #pragma mark - FSTMockWatchStream -@interface FSTMockWatchStream : FSTWatchStream - -- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer NS_UNAVAILABLE; - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; - -@property(nonatomic, assign) BOOL open; -@property(nonatomic, strong, readonly) FSTMockDatastore *datastore; -@property(nonatomic, strong, readonly) - NSMutableDictionary *activeTargets; -@property(nonatomic, weak, readwrite, nullable) id delegate; - -@end - -@implementation FSTMockWatchStream - -- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer { - self = [super initWithDatabase:datastore.databaseInfo - workerDispatchQueue:workerDispatchQueue - credentials:credentials - serializer:serializer]; - if (self) { - HARD_ASSERT(datastore, "Datastore must not be nil"); - _datastore = datastore; - _activeTargets = [NSMutableDictionary dictionary]; +namespace firebase { +namespace firestore { +namespace remote { + +class MockWatchStream : public WatchStream { + public: + MockWatchStream(AsyncQueue *worker_queue, + CredentialsProvider *credentials_provider, + FSTSerializerBeta *serializer, + GrpcConnection *grpc_connection, + id delegate, + FSTMockDatastore *datastore) + : WatchStream{worker_queue, credentials_provider, serializer, grpc_connection, delegate}, + datastore_{datastore}, + delegate_{delegate} { + active_targets_ = [NSMutableDictionary dictionary]; } - return self; -} -#pragma mark - Overridden FSTWatchStream methods. - -- (void)startWithDelegate:(id)delegate { - HARD_ASSERT(!self.open, "Trying to start already started watch stream"); - self.open = YES; - self.delegate = delegate; - [self notifyStreamOpen]; -} - -- (void)stop { - [self.activeTargets removeAllObjects]; - self.delegate = nil; -} + NSDictionary *ActiveTargets() const { + return [active_targets_ copy]; + } -- (BOOL)isOpen { - return self.open; -} + void Start() override { + HARD_ASSERT(!open_, "Trying to start already started watch stream"); + open_ = true; + [delegate_ watchStreamDidOpen]; + } -- (BOOL)isStarted { - return self.open; -} + void Stop() override { + WatchStream::Stop(); + open_ = false; + [active_targets_ removeAllObjects]; + } -- (void)notifyStreamOpen { - [self.delegate watchStreamDidOpen]; -} + bool IsStarted() const override { + return open_; + } + bool IsOpen() const override { + return open_; + } -- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { - [self.delegate watchStreamWasInterruptedWithError:error]; -} + void WatchQuery(FSTQueryData *query) override { + LOG_DEBUG("WatchQuery: %s: %s, %s", query.targetID, query.query, query.resumeToken); -- (void)watchQuery:(FSTQueryData *)query { - LOG_DEBUG("watchQuery: %s: %s", query.targetID, query.query); - self.datastore.watchStreamRequestCount += 1; - // Snapshot version is ignored on the wire - FSTQueryData *sentQueryData = [query queryDataByReplacingSnapshotVersion:SnapshotVersion::None() - resumeToken:query.resumeToken - sequenceNumber:query.sequenceNumber]; - self.activeTargets[@(query.targetID)] = sentQueryData; -} + // Snapshot version is ignored on the wire + FSTQueryData *sentQueryData = [query queryDataByReplacingSnapshotVersion:SnapshotVersion::None() + resumeToken:query.resumeToken + sequenceNumber:query.sequenceNumber]; + datastore_.watchStreamRequestCount += 1; + active_targets_[@(query.targetID)] = sentQueryData; + } -- (void)unwatchTargetID:(TargetId)targetID { - LOG_DEBUG("unwatchTargetID: %s", targetID); - [self.activeTargets removeObjectForKey:@(targetID)]; -} + void UnwatchTargetId(model::TargetId target_id) override { + LOG_DEBUG("UnwatchTargetId: %s", target_id); + [active_targets_ removeObjectForKey:@(target_id)]; + } -- (void)failStreamWithError:(NSError *)error { - self.open = NO; - [self notifyStreamInterruptedWithError:error]; -} + void FailStreamWithError(NSError *error) { + open_ = false; + [delegate_ watchStreamWasInterruptedWithError:error]; + } -#pragma mark - Helper methods. - -- (void)writeWatchChange:(FSTWatchChange *)change snapshotVersion:(SnapshotVersion)snap { - if ([change isKindOfClass:[FSTWatchTargetChange class]]) { - FSTWatchTargetChange *targetChange = (FSTWatchTargetChange *)change; - if (targetChange.cause) { - for (NSNumber *targetID in targetChange.targetIDs) { - if (!self.activeTargets[targetID]) { - // Technically removing an unknown target is valid (e.g. it could race with a - // server-side removal), but we want to pay extra careful attention in tests - // that we only remove targets we listened too. - HARD_FAIL("Removing a non-active target"); + void WriteWatchChange(FSTWatchChange *change, SnapshotVersion snap) { + if ([change isKindOfClass:[FSTWatchTargetChange class]]) { + FSTWatchTargetChange *targetChange = (FSTWatchTargetChange *)change; + if (targetChange.cause) { + for (NSNumber *target_id in targetChange.targetIDs) { + if (!active_targets_[target_id]) { + // Technically removing an unknown target is valid (e.g. it could race with a + // server-side removal), but we want to pay extra careful attention in tests + // that we only remove targets we listened to. + HARD_FAIL("Removing a non-active target"); + } + + [active_targets_ removeObjectForKey:target_id]; } - [self.activeTargets removeObjectForKey:targetID]; } - } - if ([targetChange.targetIDs count] != 0) { - // If the list of target IDs is not empty, we reset the snapshot version to NONE as - // done in `FSTSerializerBeta.versionFromListenResponse:`. - snap = SnapshotVersion::None(); - } - } - [self.delegate watchStreamDidChange:change snapshotVersion:snap]; -} - -@end - -#pragma mark - FSTMockWriteStream - -@interface FSTWriteStream () - -@property(nonatomic, weak, readwrite, nullable) id delegate; - -- (void)notifyStreamOpen; -- (void)notifyStreamInterruptedWithError:(nullable NSError *)error; - -@end - -@interface FSTMockWriteStream : FSTWriteStream -- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer NS_UNAVAILABLE; - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; - -@property(nonatomic, strong, readonly) FSTMockDatastore *datastore; -@property(nonatomic, assign) BOOL open; -@property(nonatomic, strong, readonly) NSMutableArray *> *sentMutations; + if ([targetChange.targetIDs count] != 0) { + // If the list of target IDs is not empty, we reset the snapshot version to NONE as + // done in `FSTSerializerBeta.versionFromListenResponse:`. + snap = SnapshotVersion::None(); + } + } -@end + [delegate_ watchStreamDidChange:change snapshotVersion:snap]; + } -@implementation FSTMockWriteStream - -- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer { - self = [super initWithDatabase:datastore.databaseInfo - workerDispatchQueue:workerDispatchQueue - credentials:credentials - serializer:serializer]; - if (self) { - HARD_ASSERT(datastore, "Datastore must not be nil"); - _datastore = datastore; - _sentMutations = [NSMutableArray array]; + private: + bool open_ = false; + NSMutableDictionary *active_targets_ = nullptr; + FSTMockDatastore *datastore_ = nullptr; + id delegate_ = nullptr; +}; + +class MockWriteStream : public WriteStream { + public: + MockWriteStream(AsyncQueue *worker_queue, + CredentialsProvider *credentials_provider, + FSTSerializerBeta *serializer, + GrpcConnection *grpc_connection, + id delegate, + FSTMockDatastore *datastore) + : WriteStream{worker_queue, credentials_provider, serializer, grpc_connection, delegate}, + datastore_{datastore}, + delegate_{delegate} { } - return self; -} -#pragma mark - Overridden FSTWriteStream methods. + void Start() override { + HARD_ASSERT(!open_, "Trying to start already started write stream"); + open_ = true; + sent_mutations_ = {}; + [delegate_ writeStreamDidOpen]; + } -- (void)startWithDelegate:(id)delegate { - HARD_ASSERT(!self.open, "Trying to start already started write stream"); - self.open = YES; - [self.sentMutations removeAllObjects]; - self.delegate = delegate; - [self notifyStreamOpen]; -} + void Stop() override { + datastore_.writeStreamRequestCount += 1; + WriteStream::Stop(); -- (BOOL)isOpen { - return self.open; -} + sent_mutations_ = {}; + open_ = false; + SetHandshakeComplete(false); + } -- (BOOL)isStarted { - return self.open; -} + bool IsStarted() const override { + return open_; + } + bool IsOpen() const override { + return open_; + } -- (void)writeHandshake { - self.datastore.writeStreamRequestCount += 1; - self.handshakeComplete = YES; - [self.delegate writeStreamDidCompleteHandshake]; -} + void WriteHandshake() override { + datastore_.writeStreamRequestCount += 1; + SetHandshakeComplete(); + [delegate_ writeStreamDidCompleteHandshake]; + } -- (void)writeMutations:(NSArray *)mutations { - self.datastore.writeStreamRequestCount += 1; - [self.sentMutations addObject:mutations]; -} + void WriteMutations(NSArray *mutations) override { + datastore_.writeStreamRequestCount += 1; + sent_mutations_.push(mutations); + } -#pragma mark - Helper methods. + /** Injects a write ack as though it had come from the backend in response to a write. */ + void AckWrite(const SnapshotVersion &commitVersion, NSArray *results) { + [delegate_ writeStreamDidReceiveResponseWithVersion:commitVersion mutationResults:results]; + } -/** Injects a write ack as though it had come from the backend in response to a write. */ -- (void)ackWriteWithVersion:(const SnapshotVersion &)commitVersion - mutationResults:(NSArray *)results { - [self.delegate writeStreamDidReceiveResponseWithVersion:commitVersion mutationResults:results]; -} + /** Injects a failed write response as though it had come from the backend. */ + void FailStreamWithError(NSError *error) { + open_ = false; + [delegate_ writeStreamWasInterruptedWithError:error]; + } -/** Injects a failed write response as though it had come from the backend. */ -- (void)failStreamWithError:(NSError *)error { - self.open = NO; - [self notifyStreamInterruptedWithError:error]; -} + /** + * Returns the next write that was "sent to the backend", failing if there are no queued sent + */ + NSArray *NextSentWrite() { + HARD_ASSERT(!sent_mutations_.empty(), + "Writes need to happen before you can call NextSentWrite."); + NSArray *result = std::move(sent_mutations_.front()); + sent_mutations_.pop(); + return result; + } -/** - * Returns the next write that was "sent to the backend", failing if there are no queued sent - */ -- (NSArray *)nextSentWrite { - HARD_ASSERT(self.sentMutations.count > 0, - "Writes need to happen before you can call nextSentWrite."); - NSArray *result = [self.sentMutations objectAtIndex:0]; - [self.sentMutations removeObjectAtIndex:0]; - return result; -} + /** + * Returns the number of mutations that have been sent to the backend but not retrieved via + * nextSentWrite yet. + */ + int sent_mutations_count() const { + return static_cast(sent_mutations_.size()); + } -/** - * Returns the number of mutations that have been sent to the backend but not retrieved via - * nextSentWrite yet. - */ -- (int)sentMutationsCount { - return (int)self.sentMutations.count; -} + private: + bool open_ = false; + std::queue *> sent_mutations_; + FSTMockDatastore *datastore_ = nullptr; + id delegate_ = nullptr; +}; -@end +} // namespace remote +} // namespace firestore +} // namespace firebase -#pragma mark - FSTMockDatastore +using firebase::firestore::remote::MockWatchStream; +using firebase::firestore::remote::MockWriteStream; @interface FSTMockDatastore () -@property(nonatomic, strong, nullable) FSTMockWatchStream *watchStream; -@property(nonatomic, strong, nullable) FSTMockWriteStream *writeStream; /** Properties implemented in FSTDatastore that are nonpublic. */ @property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue; @@ -292,85 +254,84 @@ @interface FSTMockDatastore () @end -@implementation FSTMockDatastore +@implementation FSTMockDatastore { + std::shared_ptr _watchStream; + std::shared_ptr _writeStream; + + std::unique_ptr _connectivityMonitor; + grpc::CompletionQueue _grpcQueue; + std::unique_ptr _grpcConnection; +} #pragma mark - Overridden FSTDatastore methods. -- (FSTWatchStream *)createWatchStream { - self.watchStream = [[FSTMockWatchStream alloc] - initWithDatastore:self - workerDispatchQueue:self.workerDispatchQueue - credentials:self.credentials - serializer:[[FSTSerializerBeta alloc] - initWithDatabaseID:&self.databaseInfo->database_id()]]; - return self.watchStream; +- (instancetype)initWithDatabaseInfo:(const DatabaseInfo *)databaseInfo + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials { + if (self = [super initWithDatabaseInfo:databaseInfo + workerDispatchQueue:workerDispatchQueue + credentials:credentials]) { + _workerDispatchQueue = workerDispatchQueue; + _credentials = credentials; + _connectivityMonitor = CreateNoOpConnectivityMonitor(); + _grpcConnection = + absl::make_unique(*databaseInfo, [workerDispatchQueue implementation], + &_grpcQueue, _connectivityMonitor.get()); + } + return self; } -- (FSTWriteStream *)createWriteStream { - self.writeStream = [[FSTMockWriteStream alloc] - initWithDatastore:self - workerDispatchQueue:self.workerDispatchQueue - credentials:self.credentials - serializer:[[FSTSerializerBeta alloc] - initWithDatabaseID:&self.databaseInfo->database_id()]]; - return self.writeStream; +- (std::shared_ptr)createWatchStreamWithDelegate:(id)delegate { + _watchStream = std::make_shared( + [self.workerDispatchQueue implementation], self.credentials, + [[FSTSerializerBeta alloc] initWithDatabaseID:&self.databaseInfo->database_id()], + _grpcConnection.get(), delegate, self); + + return _watchStream; } -- (void)authorizeAndStartRPC:(GRPCProtoCall *)rpc completion:(FSTVoidErrorBlock)completion { - HARD_FAIL("FSTMockDatastore shouldn't be starting any RPCs."); +- (std::shared_ptr)createWriteStreamWithDelegate:(id)delegate { + _writeStream = std::make_shared( + [self.workerDispatchQueue implementation], self.credentials, + [[FSTSerializerBeta alloc] initWithDatabaseID:&self.databaseInfo->database_id()], + _grpcConnection.get(), delegate, self); + + return _writeStream; } #pragma mark - Method exposed for tests to call. - (NSArray *)nextSentWrite { - return [self.writeStream nextSentWrite]; + return _writeStream->NextSentWrite(); } - (int)writesSent { - return [self.writeStream sentMutationsCount]; + return _writeStream->sent_mutations_count(); } -- (void)ackWriteWithVersion:(const SnapshotVersion &)commitVersion +- (void)ackWriteWithVersion:(const SnapshotVersion &)version mutationResults:(NSArray *)results { - [self.writeStream ackWriteWithVersion:commitVersion mutationResults:results]; + _writeStream->AckWrite(version, results); } - (void)failWriteWithError:(NSError *_Nullable)error { - [self.writeStream failStreamWithError:error]; -} - -- (void)writeWatchTargetAddedWithTargetIDs:(NSArray *)targetIDs { - FSTWatchTargetChange *change = - [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateAdded - targetIDs:targetIDs - cause:nil]; - [self writeWatchChange:change snapshotVersion:SnapshotVersion::None()]; -} - -- (void)writeWatchCurrentWithTargetIDs:(NSArray *)targetIDs - snapshotVersion:(const SnapshotVersion &)snapshotVersion - resumeToken:(NSData *)resumeToken { - FSTWatchTargetChange *change = - [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateCurrent - targetIDs:targetIDs - resumeToken:resumeToken]; - [self writeWatchChange:change snapshotVersion:snapshotVersion]; + _writeStream->FailStreamWithError(error); } - (void)writeWatchChange:(FSTWatchChange *)change snapshotVersion:(const SnapshotVersion &)snap { - [self.watchStream writeWatchChange:change snapshotVersion:snap]; + _watchStream->WriteWatchChange(change, snap); } - (void)failWatchStreamWithError:(NSError *)error { - [self.watchStream failStreamWithError:error]; + _watchStream->FailStreamWithError(error); } - (NSDictionary *)activeTargets { - return [self.watchStream.activeTargets copy]; + return _watchStream->ActiveTargets(); } - (BOOL)isWatchStreamOpen { - return self.watchStream.isOpen; + return _watchStream->IsOpen(); } @end diff --git a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm index 6100ef1b305..a8b4ff392cf 100644 --- a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm +++ b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm @@ -17,7 +17,6 @@ #import "Firestore/Example/Tests/SpecTests/FSTSpecTests.h" #import -#import #include #include diff --git a/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm b/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm index 7107d6183f9..330dc25fbe8 100644 --- a/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm +++ b/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm @@ -17,7 +17,6 @@ #import "Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.h" #import -#import #include #include diff --git a/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm b/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm index 9cf85ae4e38..e1b06e686e1 100644 --- a/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm +++ b/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm @@ -27,8 +27,6 @@ #import #import #import -#import -#import #include #include @@ -98,10 +96,6 @@ - (void)tearDown { [self shutdownFirestore:firestore]; } } @finally { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [GRPCCall closeOpenConnections]; -#pragma clang diagnostic pop _firestores = nil; [super tearDown]; } @@ -165,9 +159,8 @@ + (void)setUpDefaults { "Alternatively, if you're a Googler with a Hexa preproduction environment, run " "setup_integration_tests.py to properly configure testing SSL certificates."); } - [GRPCCall useTestCertsPath:certsPath testName:@"test_cert_2" forHost:defaultSettings.host]; - GrpcConnection::UseTestCertificate([certsPath cStringUsingEncoding:NSASCIIStringEncoding], - "test_cert_2"); + GrpcConnection::UseTestCertificate(util::MakeString(defaultSettings.host), + Path::FromNSString(certsPath), "test_cert_2"); } + (NSString *)projectID { diff --git a/Firestore/Protos/CMakeLists.txt b/Firestore/Protos/CMakeLists.txt index ae418a2ad23..59d357c0b11 100644 --- a/Firestore/Protos/CMakeLists.txt +++ b/Firestore/Protos/CMakeLists.txt @@ -111,9 +111,6 @@ endfunction() # # Libprotobuf Objective-C also includes the well-known protos so they must be # omitted here. -# -# The Objective-C client also uses the generated gRPC stubs for the Firestore -# service. set( PROTOBUF_OBJC_GENERATED_SOURCES ${OUTPUT_DIR}/objc/google/firestore/v1beta1/Firestore.pbrpc.h @@ -284,12 +281,10 @@ add_custom_command( ${CMAKE_CURRENT_SOURCE_DIR}/build_protos.py --objc --protoc=$ - --protoc_gen_grpc=$ --output_dir=${OUTPUT_DIR} ${PROTO_INCLUDES} VERBATIM DEPENDS - grpc_objective_c_plugin protoc ${CMAKE_CURRENT_SOURCE_DIR}/build_protos.py ${PROTO_FILES} diff --git a/Firestore/Protos/build_protos.py b/Firestore/Protos/build_protos.py index 997537731d1..7d305094993 100755 --- a/Firestore/Protos/build_protos.py +++ b/Firestore/Protos/build_protos.py @@ -78,9 +78,6 @@ def main(): parser.add_argument( '--include', '-I', action='append', default=[], help='Adds INCLUDE to the proto path.') - parser.add_argument( - '--protoc_gen_grpc', - help='Location of the gRPC generator executable.') args = parser.parse_args() if args.nanopb is None and args.cpp is None and args.objc is None: @@ -165,14 +162,10 @@ def run(self): ) def __run_generator(self, out_dir): - """Invokes protoc using the objc and grpc plugins.""" + """Invokes protoc using the objc plugin.""" cmd = protoc_command(self.args) - gen = self.args.protoc_gen_grpc - if gen is not None: - cmd.append('--plugin=protoc-gen-grpc=%s' % gen) - - cmd.extend(['--objc_out=' + out_dir, '--grpc_out=' + out_dir]) + cmd.extend(['--objc_out=' + out_dir]) cmd.extend(self.proto_files) run_protoc(self.args, cmd) diff --git a/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h b/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h deleted file mode 100644 index 63e75b1afa4..00000000000 --- a/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright 2018 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !defined(GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO) || !GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO -#import "Firestore.pbobjc.h" -#endif - -#if !defined(GPB_GRPC_PROTOCOL_ONLY) || !GPB_GRPC_PROTOCOL_ONLY -#import -#import -#import -#import -#endif - -@class GCFSBatchGetDocumentsRequest; -@class GCFSBatchGetDocumentsResponse; -@class GCFSBeginTransactionRequest; -@class GCFSBeginTransactionResponse; -@class GCFSCommitRequest; -@class GCFSCommitResponse; -@class GCFSCreateDocumentRequest; -@class GCFSDeleteDocumentRequest; -@class GCFSDocument; -@class GCFSGetDocumentRequest; -@class GCFSListCollectionIdsRequest; -@class GCFSListCollectionIdsResponse; -@class GCFSListDocumentsRequest; -@class GCFSListDocumentsResponse; -@class GCFSListenRequest; -@class GCFSListenResponse; -@class GCFSRollbackRequest; -@class GCFSRunQueryRequest; -@class GCFSRunQueryResponse; -@class GCFSUpdateDocumentRequest; -@class GCFSWriteRequest; -@class GCFSWriteResponse; -@class GPBEmpty; - -#if !defined(GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO) || !GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO - #import "Annotations.pbobjc.h" - #import "Common.pbobjc.h" - #import "Document.pbobjc.h" - #import "Query.pbobjc.h" - #import "Write.pbobjc.h" -#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS - #import -#else - #import "Empty.pbobjc.h" -#endif -#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS - #import -#else - #import "Timestamp.pbobjc.h" -#endif - #import "Status.pbobjc.h" -#endif - -@class GRPCProtoCall; - - -NS_ASSUME_NONNULL_BEGIN - -@protocol GCFSFirestore - -#pragma mark GetDocument(GetDocumentRequest) returns (Document) - -/** - * Gets a single document. - */ -- (void)getDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; - -/** - * Gets a single document. - */ -- (GRPCProtoCall *)RPCToGetDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark ListDocuments(ListDocumentsRequest) returns (ListDocumentsResponse) - -/** - * Lists documents. - */ -- (void)listDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler; - -/** - * Lists documents. - */ -- (GRPCProtoCall *)RPCToListDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark CreateDocument(CreateDocumentRequest) returns (Document) - -/** - * Creates a new document. - */ -- (void)createDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; - -/** - * Creates a new document. - */ -- (GRPCProtoCall *)RPCToCreateDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark UpdateDocument(UpdateDocumentRequest) returns (Document) - -/** - * Updates or inserts a document. - */ -- (void)updateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; - -/** - * Updates or inserts a document. - */ -- (GRPCProtoCall *)RPCToUpdateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark DeleteDocument(DeleteDocumentRequest) returns (Empty) - -/** - * Deletes a document. - */ -- (void)deleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; - -/** - * Deletes a document. - */ -- (GRPCProtoCall *)RPCToDeleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark BatchGetDocuments(BatchGetDocumentsRequest) returns (stream BatchGetDocumentsResponse) - -/** - * Gets multiple documents. - * - * Documents returned by this method are not guaranteed to be returned in the - * same order that they were requested. - */ -- (void)batchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler; - -/** - * Gets multiple documents. - * - * Documents returned by this method are not guaranteed to be returned in the - * same order that they were requested. - */ -- (GRPCProtoCall *)RPCToBatchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler; - - -#pragma mark BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) - -/** - * Starts a new transaction. - */ -- (void)beginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler; - -/** - * Starts a new transaction. - */ -- (GRPCProtoCall *)RPCToBeginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark Commit(CommitRequest) returns (CommitResponse) - -/** - * Commits a transaction, while optionally updating documents. - */ -- (void)commitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler; - -/** - * Commits a transaction, while optionally updating documents. - */ -- (GRPCProtoCall *)RPCToCommitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark Rollback(RollbackRequest) returns (Empty) - -/** - * Rolls back a transaction. - */ -- (void)rollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; - -/** - * Rolls back a transaction. - */ -- (GRPCProtoCall *)RPCToRollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; - - -#pragma mark RunQuery(RunQueryRequest) returns (stream RunQueryResponse) - -/** - * Runs a query. - */ -- (void)runQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler; - -/** - * Runs a query. - */ -- (GRPCProtoCall *)RPCToRunQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler; - - -#pragma mark Write(stream WriteRequest) returns (stream WriteResponse) - -/** - * Streams batches of document updates and deletes, in order. - */ -- (void)writeWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler; - -/** - * Streams batches of document updates and deletes, in order. - */ -- (GRPCProtoCall *)RPCToWriteWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler; - - -#pragma mark Listen(stream ListenRequest) returns (stream ListenResponse) - -/** - * Listens to changes. - */ -- (void)listenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler; - -/** - * Listens to changes. - */ -- (GRPCProtoCall *)RPCToListenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler; - - -#pragma mark ListCollectionIds(ListCollectionIdsRequest) returns (ListCollectionIdsResponse) - -/** - * Lists all the collection IDs underneath a document. - */ -- (void)listCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler; - -/** - * Lists all the collection IDs underneath a document. - */ -- (GRPCProtoCall *)RPCToListCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler; - - -@end - - -#if !defined(GPB_GRPC_PROTOCOL_ONLY) || !GPB_GRPC_PROTOCOL_ONLY -/** - * Basic service implementation, over gRPC, that only does - * marshalling and parsing. - */ -@interface GCFSFirestore : GRPCProtoService -- (instancetype)initWithHost:(NSString *)host NS_DESIGNATED_INITIALIZER; -+ (instancetype)serviceWithHost:(NSString *)host; -@end -#endif - -NS_ASSUME_NONNULL_END - diff --git a/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m b/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m deleted file mode 100644 index be4fea3df97..00000000000 --- a/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright 2018 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !defined(GPB_GRPC_PROTOCOL_ONLY) || !GPB_GRPC_PROTOCOL_ONLY -#import "Firestore.pbrpc.h" -#import "Firestore.pbobjc.h" -#import -#import - -#import "Annotations.pbobjc.h" -#import "Common.pbobjc.h" -#import "Document.pbobjc.h" -#import "Query.pbobjc.h" -#import "Write.pbobjc.h" -#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS -#import -#else -#import "Empty.pbobjc.h" -#endif -#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS -#import -#else -#import "Timestamp.pbobjc.h" -#endif -#import "Status.pbobjc.h" - -@implementation GCFSFirestore - -// Designated initializer -- (instancetype)initWithHost:(NSString *)host { - self = [super initWithHost:host - packageName:@"google.firestore.v1beta1" - serviceName:@"Firestore"]; - return self; -} - -// Override superclass initializer to disallow different package and service names. -- (instancetype)initWithHost:(NSString *)host - packageName:(NSString *)packageName - serviceName:(NSString *)serviceName { - return [self initWithHost:host]; -} - -#pragma mark - Class Methods - -+ (instancetype)serviceWithHost:(NSString *)host { - return [[self alloc] initWithHost:host]; -} - -#pragma mark - Method Implementations - -#pragma mark GetDocument(GetDocumentRequest) returns (Document) - -/** - * Gets a single document. - */ -- (void)getDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToGetDocumentWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Gets a single document. - */ -- (GRPCProtoCall *)RPCToGetDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"GetDocument" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSDocument class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark ListDocuments(ListDocumentsRequest) returns (ListDocumentsResponse) - -/** - * Lists documents. - */ -- (void)listDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToListDocumentsWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Lists documents. - */ -- (GRPCProtoCall *)RPCToListDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"ListDocuments" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSListDocumentsResponse class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark CreateDocument(CreateDocumentRequest) returns (Document) - -/** - * Creates a new document. - */ -- (void)createDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToCreateDocumentWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Creates a new document. - */ -- (GRPCProtoCall *)RPCToCreateDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"CreateDocument" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSDocument class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark UpdateDocument(UpdateDocumentRequest) returns (Document) - -/** - * Updates or inserts a document. - */ -- (void)updateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToUpdateDocumentWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Updates or inserts a document. - */ -- (GRPCProtoCall *)RPCToUpdateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"UpdateDocument" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSDocument class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark DeleteDocument(DeleteDocumentRequest) returns (Empty) - -/** - * Deletes a document. - */ -- (void)deleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToDeleteDocumentWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Deletes a document. - */ -- (GRPCProtoCall *)RPCToDeleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"DeleteDocument" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GPBEmpty class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark BatchGetDocuments(BatchGetDocumentsRequest) returns (stream BatchGetDocumentsResponse) - -/** - * Gets multiple documents. - * - * Documents returned by this method are not guaranteed to be returned in the - * same order that they were requested. - */ -- (void)batchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - [[self RPCToBatchGetDocumentsWithRequest:request eventHandler:eventHandler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Gets multiple documents. - * - * Documents returned by this method are not guaranteed to be returned in the - * same order that they were requested. - */ -- (GRPCProtoCall *)RPCToBatchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - return [self RPCToMethod:@"BatchGetDocuments" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSBatchGetDocumentsResponse class] - responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; -} -#pragma mark BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) - -/** - * Starts a new transaction. - */ -- (void)beginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToBeginTransactionWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Starts a new transaction. - */ -- (GRPCProtoCall *)RPCToBeginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"BeginTransaction" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSBeginTransactionResponse class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark Commit(CommitRequest) returns (CommitResponse) - -/** - * Commits a transaction, while optionally updating documents. - */ -- (void)commitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToCommitWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Commits a transaction, while optionally updating documents. - */ -- (GRPCProtoCall *)RPCToCommitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"Commit" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSCommitResponse class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark Rollback(RollbackRequest) returns (Empty) - -/** - * Rolls back a transaction. - */ -- (void)rollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToRollbackWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Rolls back a transaction. - */ -- (GRPCProtoCall *)RPCToRollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"Rollback" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GPBEmpty class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -#pragma mark RunQuery(RunQueryRequest) returns (stream RunQueryResponse) - -/** - * Runs a query. - */ -- (void)runQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - [[self RPCToRunQueryWithRequest:request eventHandler:eventHandler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Runs a query. - */ -- (GRPCProtoCall *)RPCToRunQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - return [self RPCToMethod:@"RunQuery" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSRunQueryResponse class] - responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; -} -#pragma mark Write(stream WriteRequest) returns (stream WriteResponse) - -/** - * Streams batches of document updates and deletes, in order. - */ -- (void)writeWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - [[self RPCToWriteWithRequestsWriter:requestWriter eventHandler:eventHandler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Streams batches of document updates and deletes, in order. - */ -- (GRPCProtoCall *)RPCToWriteWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - return [self RPCToMethod:@"Write" - requestsWriter:requestWriter - responseClass:[GCFSWriteResponse class] - responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; -} -#pragma mark Listen(stream ListenRequest) returns (stream ListenResponse) - -/** - * Listens to changes. - */ -- (void)listenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - [[self RPCToListenWithRequestsWriter:requestWriter eventHandler:eventHandler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Listens to changes. - */ -- (GRPCProtoCall *)RPCToListenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler{ - return [self RPCToMethod:@"Listen" - requestsWriter:requestWriter - responseClass:[GCFSListenResponse class] - responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; -} -#pragma mark ListCollectionIds(ListCollectionIdsRequest) returns (ListCollectionIdsResponse) - -/** - * Lists all the collection IDs underneath a document. - */ -- (void)listCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCToListCollectionIdsWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -/** - * Lists all the collection IDs underneath a document. - */ -- (GRPCProtoCall *)RPCToListCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"ListCollectionIds" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GCFSListCollectionIdsResponse class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -@end -#endif diff --git a/Firestore/Source/API/FIRDocumentReference.mm b/Firestore/Source/API/FIRDocumentReference.mm index 54d9c73d640..d502a51c98b 100644 --- a/Firestore/Source/API/FIRDocumentReference.mm +++ b/Firestore/Source/API/FIRDocumentReference.mm @@ -16,8 +16,6 @@ #import "FIRDocumentReference.h" -#import - #include #include diff --git a/Firestore/Source/Core/FSTSyncEngine.mm b/Firestore/Source/Core/FSTSyncEngine.mm index 0bf10880963..6851fb43809 100644 --- a/Firestore/Source/Core/FSTSyncEngine.mm +++ b/Firestore/Source/Core/FSTSyncEngine.mm @@ -16,8 +16,6 @@ #import "Firestore/Source/Core/FSTSyncEngine.h" -#import - #include #include #include diff --git a/Firestore/Source/Core/FSTTransaction.mm b/Firestore/Source/Core/FSTTransaction.mm index 84166632c52..ba9ae00ad4f 100644 --- a/Firestore/Source/Core/FSTTransaction.mm +++ b/Firestore/Source/Core/FSTTransaction.mm @@ -16,8 +16,6 @@ #import "Firestore/Source/Core/FSTTransaction.h" -#import - #include #include #include diff --git a/Firestore/Source/Remote/FSTBufferedWriter.h b/Firestore/Source/Remote/FSTBufferedWriter.h deleted file mode 100644 index 83fada69f0e..00000000000 --- a/Firestore/Source/Remote/FSTBufferedWriter.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * A buffered GRXWriter. - * - * GRPC only allows a single message to be written to a channel at a time. While the channel is - * sending, GRPC sets the state of the GRXWriter representing the request stream to - * GRXWriterStatePaused. Once the channel is ready to accept more messages GRPC sets the state of - * the writer to GRXWriterStateStarted. - * - * This class is NOT thread safe, even though it is accessed from multiple threads. To conform with - * the contract GRPC uses, all method calls on the FSTBufferedWriter must be @synchronized on the - * receiver. - */ -@interface FSTBufferedWriter : GRXWriter - -/** - * Writes a message into the buffer. Must be called inside an @synchronized block on the receiver. - */ -- (void)writeValue:(id)value; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTBufferedWriter.mm b/Firestore/Source/Remote/FSTBufferedWriter.mm deleted file mode 100644 index 47dbb21c0fc..00000000000 --- a/Firestore/Source/Remote/FSTBufferedWriter.mm +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "Firestore/Source/Remote/FSTBufferedWriter.h" - -NS_ASSUME_NONNULL_BEGIN - -@implementation FSTBufferedWriter { - GRXWriterState _state; - NSMutableArray *_queue; - - id _writeable; -} - -- (instancetype)init { - if (self = [super init]) { - _state = GRXWriterStateNotStarted; - _queue = [[NSMutableArray alloc] init]; - } - return self; -} - -#pragma mark - GRXWriteable implementation - -/** Push the next value of the sequence to the receiving object. */ -- (void)writeValue:(id)value { - if (_state == GRXWriterStateStarted && _queue.count == 0) { - // Skip the queue. - [_writeable writeValue:value]; - } else { - // Buffer the new value. Note that the value is assumed to be transient and doesn't need to - // be copied. - [_queue addObject:value]; - } -} - -/** - * Signal that the sequence is completed, or that an error ocurred. After this message is sent to - * the receiver, neither it nor writeValue: may be called again. - */ -- (void)writesFinishedWithError:(nullable NSError *)error { - // Unimplemented. If we ever wanted to implement sender-side initiated half close we could do so - // by buffering (or sending) and error. - [self doesNotRecognizeSelector:_cmd]; -} - -#pragma mark GRXWriter implementation -// The GRXWriter implementation defines the send side of the RPC stream. Once the RPC is ready it -// will call startWithWriteable passing a GRXWriteable into which requests can be written but only -// when the GRXWriter is in the started state. - -/** - * Called by GRPCCall when it is ready to accept for the first request. Requests should be written - * to the passed writeable. - * - * GRPCCall will synchronize on the receiver around this call. - */ -- (void)startWithWriteable:(id)writeable { - _state = GRXWriterStateStarted; - _writeable = writeable; -} - -/** - * Called by GRPCCall to implement flow control on the sending side of the stream. After each - * writeValue: on the requestsWriteable, GRPCCall will call setState:GRXWriterStatePaused to apply - * backpressure. Once the stream is ready to accept another message, GRPCCall will call - * setState:GRXWriterStateStarted. - * - * GRPCCall will synchronize on the receiver around this call. - */ -- (void)setState:(GRXWriterState)newState { - // Manual transitions are only allowed from the started or paused states. - if (_state == GRXWriterStateNotStarted || _state == GRXWriterStateFinished) { - return; - } - - switch (newState) { - case GRXWriterStateFinished: - _state = newState; - // Per GRXWriter's contract, setting the state to Finished manually means one doesn't wish the - // writeable to be messaged anymore. - _queue = nil; - _writeable = nil; - return; - case GRXWriterStatePaused: - _state = newState; - return; - case GRXWriterStateStarted: - if (_state == GRXWriterStatePaused) { - _state = newState; - [self writeBufferedMessages]; - } - return; - case GRXWriterStateNotStarted: - return; - } -} - -- (void)finishWithError:(nullable NSError *)error { - [_writeable writesFinishedWithError:error]; - self.state = GRXWriterStateFinished; -} - -- (void)writeBufferedMessages { - while (_state == GRXWriterStateStarted && _queue.count > 0) { - id value = _queue[0]; - [_queue removeObjectAtIndex:0]; - - // In addition to writing the value here GRPC will apply backpressure by pausing the GRXWriter - // wrapping this buffer. That writer must call -pauseMessages which will cause this loop to - // exit. Synchronization is not required since the callback happens within the body of the - // writeValue implementation. - [_writeable writeValue:value]; - } -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTDatastore.h b/Firestore/Source/Remote/FSTDatastore.h index da14b6e1b90..b5f31840940 100644 --- a/Firestore/Source/Remote/FSTDatastore.h +++ b/Firestore/Source/Remote/FSTDatastore.h @@ -16,14 +16,19 @@ #import +#include #include #import "Firestore/Source/Core/FSTTypes.h" +#include "Firestore/core/src/firebase/firestore//remote/watch_stream.h" +#include "Firestore/core/src/firebase/firestore//remote/write_stream.h" #include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h" #include "Firestore/core/src/firebase/firestore/core/database_info.h" #include "Firestore/core/src/firebase/firestore/model/database_id.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" +#include "Firestore/core/src/firebase/firestore/remote/datastore.h" +#include "absl/memory/memory.h" #include "absl/strings/string_view.h" @class FSTDispatchQueue; @@ -32,10 +37,6 @@ @class FSTQueryData; @class FSTSerializerBeta; @class FSTWatchChange; -@class FSTWatchStream; -@class FSTWriteStream; -@class GRPCCall; -@class GRXWriter; NS_ASSUME_NONNULL_BEGIN @@ -67,12 +68,7 @@ NS_ASSUME_NONNULL_BEGIN credentials // no passing ownership NS_DESIGNATED_INITIALIZER; -/** - * Takes a dictionary of (HTTP) response headers and returns the set of whitelisted headers - * (for logging purposes). - */ -+ (NSDictionary *)extractWhiteListedHeaders: - (NSDictionary *)header; +- (void)shutdown; /** Converts the error to a FIRFirestoreErrorDomain error. */ + (NSError *)firestoreErrorForError:(NSError *)error; @@ -83,11 +79,6 @@ NS_ASSUME_NONNULL_BEGIN /** Returns YES if the given error indicates the RPC associated with it may not be retried. */ + (BOOL)isPermanentWriteError:(NSError *)error; -/** Adds headers to the RPC including any OAuth access token if provided .*/ -+ (void)prepareHeadersForRPC:(GRPCCall *)rpc - databaseID:(const firebase::firestore::model::DatabaseId *)databaseID - token:(const absl::string_view)token; - /** Looks up a list of documents in datastore. */ - (void)lookupDocuments:(const std::vector &)keys completion:(FSTVoidMaybeDocumentArrayErrorBlock)completion; @@ -97,10 +88,12 @@ NS_ASSUME_NONNULL_BEGIN completion:(FSTVoidErrorBlock)completion; /** Creates a new watch stream. */ -- (FSTWatchStream *)createWatchStream; +- (std::shared_ptr)createWatchStreamWithDelegate: + (id)delegate; /** Creates a new write stream. */ -- (FSTWriteStream *)createWriteStream; +- (std::shared_ptr)createWriteStreamWithDelegate: + (id)delegate; /** The name of the database and the backend. */ // Does not own this DatabaseInfo. diff --git a/Firestore/Source/Remote/FSTDatastore.mm b/Firestore/Source/Remote/FSTDatastore.mm index 33d29e9861e..2d0a710f947 100644 --- a/Firestore/Source/Remote/FSTDatastore.mm +++ b/Firestore/Source/Remote/FSTDatastore.mm @@ -16,9 +16,6 @@ #import "Firestore/Source/Remote/FSTDatastore.h" -#import -#import - #include #include #include @@ -33,8 +30,6 @@ #import "Firestore/Source/Remote/FSTStream.h" #import "Firestore/Source/Util/FSTDispatchQueue.h" -#import "Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h" - #include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h" #include "Firestore/core/src/firebase/firestore/auth/token.h" #include "Firestore/core/src/firebase/firestore/core/database_info.h" @@ -44,37 +39,31 @@ #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_apple.h" +#include "absl/memory/memory.h" +#include "grpcpp/support/status_code_enum.h" namespace util = firebase::firestore::util; using firebase::firestore::auth::CredentialsProvider; using firebase::firestore::auth::Token; using firebase::firestore::core::DatabaseInfo; -using firebase::firestore::model::DatabaseId; using firebase::firestore::model::DocumentKey; +using firebase::firestore::model::DatabaseId; +using firebase::firestore::remote::Datastore; +using firebase::firestore::remote::GrpcConnection; +using firebase::firestore::remote::WatchStream; +using firebase::firestore::remote::WriteStream; NS_ASSUME_NONNULL_BEGIN -// GRPC does not publicly declare a means of disabling SSL, which we need for testing. Firestore -// directly exposes an sslEnabled setting so this is required to plumb that through. Note that our -// own tests depend on this working so we'll know if this changes upstream. -@interface GRPCHost -+ (nullable instancetype)hostWithAddress:(NSString *)address; -@property(nonatomic, getter=isSecure) BOOL secure; -@end - -static NSString *const kXGoogAPIClientHeader = @"x-goog-api-client"; -static NSString *const kGoogleCloudResourcePrefix = @"google-cloud-resource-prefix"; - -/** Function typedef used to create RPCs. */ -typedef GRPCProtoCall * (^RPCFactory)(void); +// TODO(varconst): this is the only leftover from the dependency on gRPC +// Objective-C client (where this constant is declared in `GRPCCall.h`). Remove +// this once error handling is fully translated to C++. +NSString *const kGRPCErrorDomain = @"io.grpc"; #pragma mark - FSTDatastore @interface FSTDatastore () -/** The GRPC service for Firestore. */ -@property(nonatomic, strong, readonly) GCFSFirestore *service; - @property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue; /** @@ -87,7 +76,9 @@ @interface FSTDatastore () @end -@implementation FSTDatastore +@implementation FSTDatastore { + std::shared_ptr _datastore; +} + (instancetype)datastoreWithDatabase:(const DatabaseInfo *)databaseInfo workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue @@ -102,19 +93,24 @@ - (instancetype)initWithDatabaseInfo:(const DatabaseInfo *)databaseInfo credentials:(CredentialsProvider *)credentials { if (self = [super init]) { _databaseInfo = databaseInfo; - NSString *host = util::WrapNSString(databaseInfo->host()); - if (!databaseInfo->ssl_enabled()) { - GRPCHost *hostConfig = [GRPCHost hostWithAddress:host]; - hostConfig.secure = NO; - } - _service = [GCFSFirestore serviceWithHost:host]; _workerDispatchQueue = workerDispatchQueue; _credentials = credentials; _serializer = [[FSTSerializerBeta alloc] initWithDatabaseID:&databaseInfo->database_id()]; + + _datastore = std::make_shared(*_databaseInfo, [_workerDispatchQueue implementation], + _credentials, _serializer); + _datastore->Start(); + if (!databaseInfo->ssl_enabled()) { + GrpcConnection::UseInsecureChannel(databaseInfo->host()); + } } return self; } +- (void)shutdown { + _datastore->Shutdown(); +} + - (NSString *)description { return [NSString stringWithFormat:@">", self.databaseInfo->database_id().database_id().c_str(), @@ -130,7 +126,7 @@ + (NSError *)firestoreErrorForError:(NSError *)error { } else if ([error.domain isEqualToString:FIRFirestoreErrorDomain]) { return error; } else if ([error.domain isEqualToString:kGRPCErrorDomain]) { - HARD_ASSERT(error.code >= GRPCErrorCodeCancelled && error.code <= GRPCErrorCodeUnauthenticated, + HARD_ASSERT(error.code >= grpc::CANCELLED && error.code <= grpc::UNAUTHENTICATED, "Unknown GRPC error code: %s", error.code); return [NSError errorWithDomain:FIRFirestoreErrorDomain code:error.code userInfo:error.userInfo]; @@ -179,183 +175,22 @@ + (BOOL)isPermanentWriteError:(NSError *)error { } } -/** Returns the string to be used as x-goog-api-client header value. */ -+ (NSString *)googAPIClientHeaderValue { - // TODO(dimond): This should ideally also include the grpc version, however, gRPC defines the - // version as a macro, so it would be hardcoded based on version we have at compile time of - // the Firestore library, rather than the version available at runtime/at compile time by the - // user of the library. - return [NSString stringWithFormat:@"gl-objc/ fire/%s grpc/", FIRFirestoreVersionString]; -} - -/** Returns the string to be used as google-cloud-resource-prefix header value. */ -+ (NSString *)googleCloudResourcePrefixForDatabaseID:(const DatabaseId *)databaseID { - return [NSString stringWithFormat:@"projects/%s/databases/%s", databaseID->project_id().c_str(), - databaseID->database_id().c_str()]; -} -/** - * Takes a dictionary of (HTTP) response headers and returns the set of whitelisted headers - * (for logging purposes). - */ -+ (NSDictionary *)extractWhiteListedHeaders: - (NSDictionary *)headers { - NSMutableDictionary *whiteListedHeaders = - [NSMutableDictionary dictionary]; - NSArray *whiteList = @[ - @"date", @"x-google-backends", @"x-google-netmon-label", @"x-google-service", - @"x-google-gfe-request-trace" - ]; - [headers - enumerateKeysAndObjectsUsingBlock:^(NSString *headerName, NSString *headerValue, BOOL *stop) { - if ([whiteList containsObject:[headerName lowercaseString]]) { - whiteListedHeaders[headerName] = headerValue; - } - }]; - return whiteListedHeaders; -} - -/** Logs the (whitelisted) headers returned for an GRPCProtoCall RPC. */ -+ (void)logHeadersForRPC:(GRPCProtoCall *)rpc RPCName:(NSString *)rpcName { - if ([FIRFirestore isLoggingEnabled]) { - LOG_DEBUG("RPC %s returned headers (whitelisted): %s", rpcName, - [FSTDatastore extractWhiteListedHeaders:rpc.responseHeaders]); - } -} - - (void)commitMutations:(NSArray *)mutations completion:(FSTVoidErrorBlock)completion { - GCFSCommitRequest *request = [GCFSCommitRequest message]; - request.database = [self.serializer encodedDatabaseID]; - - NSMutableArray *mutationProtos = [NSMutableArray array]; - for (FSTMutation *mutation in mutations) { - [mutationProtos addObject:[self.serializer encodedMutation:mutation]]; - } - request.writesArray = mutationProtos; - - RPCFactory rpcFactory = ^GRPCProtoCall * { - __block GRPCProtoCall *rpc = [self.service - RPCToCommitWithRequest:request - handler:^(GCFSCommitResponse *response, NSError *_Nullable error) { - error = [FSTDatastore firestoreErrorForError:error]; - [self.workerDispatchQueue dispatchAsync:^{ - if (error != nil && error.code == FIRFirestoreErrorCodeUnauthenticated) { - self->_credentials->InvalidateToken(); - } - LOG_DEBUG("RPC CommitRequest completed. Error: %s", error); - [FSTDatastore logHeadersForRPC:rpc RPCName:@"CommitRequest"]; - completion(error); - }]; - }]; - return rpc; - }; - - [self invokeRPCWithFactory:rpcFactory errorHandler:completion]; + _datastore->CommitMutations(mutations, completion); } - (void)lookupDocuments:(const std::vector &)keys completion:(FSTVoidMaybeDocumentArrayErrorBlock)completion { - GCFSBatchGetDocumentsRequest *request = [GCFSBatchGetDocumentsRequest message]; - request.database = [self.serializer encodedDatabaseID]; - for (const DocumentKey &key : keys) { - [request.documentsArray addObject:[self.serializer encodedDocumentKey:key]]; - } - - struct Closure { - std::map results; - }; - - __block std::shared_ptr closure = std::make_shared(Closure{}); - RPCFactory rpcFactory = ^GRPCProtoCall * { - __block GRPCProtoCall *rpc = [self.service - RPCToBatchGetDocumentsWithRequest:request - eventHandler:^(BOOL done, - GCFSBatchGetDocumentsResponse *_Nullable response, - NSError *_Nullable error) { - error = [FSTDatastore firestoreErrorForError:error]; - [self.workerDispatchQueue dispatchAsync:^{ - if (error) { - LOG_DEBUG("RPC BatchGetDocuments completed. Error: %s", error); - if (error.code == FIRFirestoreErrorCodeUnauthenticated) { - self->_credentials->InvalidateToken(); - } - [FSTDatastore logHeadersForRPC:rpc RPCName:@"BatchGetDocuments"]; - completion(nil, error); - return; - } - - if (!done) { - // Streaming response, accumulate result - FSTMaybeDocument *doc = - [self.serializer decodedMaybeDocumentFromBatch:response]; - closure->results.insert({doc.key, doc}); - } else { - // Streaming response is done, call completion - LOG_DEBUG("RPC BatchGetDocuments completed successfully."); - [FSTDatastore logHeadersForRPC:rpc RPCName:@"BatchGetDocuments"]; - HARD_ASSERT(!response, "Got response after done."); - NSMutableArray *docs = - [NSMutableArray arrayWithCapacity:closure->results.size()]; - for (auto &&entry : closure->results) { - FSTMaybeDocument *doc = entry.second; - [docs addObject:doc]; - } - completion(docs, nil); - } - }]; - }]; - return rpc; - }; - - [self invokeRPCWithFactory:rpcFactory - errorHandler:^(NSError *_Nonnull error) { - error = [FSTDatastore firestoreErrorForError:error]; - completion(nil, error); - }]; -} - -- (void)invokeRPCWithFactory:(GRPCProtoCall * (^)(void))rpcFactory - errorHandler:(FSTVoidErrorBlock)errorHandler { - _credentials->GetToken([self, rpcFactory, errorHandler](util::StatusOr result) { - [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{ - if (!result.ok()) { - errorHandler(util::MakeNSError(result.status())); - } else { - GRPCProtoCall *rpc = rpcFactory(); - const Token &token = result.ValueOrDie(); - [FSTDatastore prepareHeadersForRPC:rpc - databaseID:&self.databaseInfo->database_id() - token:(token.user().is_authenticated() ? token.token() - : absl::string_view())]; - [rpc start]; - } - }]; - }); -} - -- (FSTWatchStream *)createWatchStream { - return [[FSTWatchStream alloc] initWithDatabase:_databaseInfo - workerDispatchQueue:_workerDispatchQueue - credentials:_credentials - serializer:_serializer]; + _datastore->LookupDocuments(keys, completion); } -- (FSTWriteStream *)createWriteStream { - return [[FSTWriteStream alloc] initWithDatabase:_databaseInfo - workerDispatchQueue:_workerDispatchQueue - credentials:_credentials - serializer:_serializer]; +- (std::shared_ptr)createWatchStreamWithDelegate:(id)delegate { + return _datastore->CreateWatchStream(delegate); } -/** Adds headers to the RPC including any OAuth access token if provided .*/ -+ (void)prepareHeadersForRPC:(GRPCCall *)rpc - databaseID:(const DatabaseId *)databaseID - token:(const absl::string_view)token { - rpc.oauth2AccessToken = token.data() == nullptr ? nil : util::WrapNSString(token); - rpc.requestHeaders[kXGoogAPIClientHeader] = [FSTDatastore googAPIClientHeaderValue]; - // This header is used to improve routing and project isolation by the backend. - rpc.requestHeaders[kGoogleCloudResourcePrefix] = - [FSTDatastore googleCloudResourcePrefixForDatabaseID:databaseID]; +- (std::shared_ptr)createWriteStreamWithDelegate:(id)delegate { + return _datastore->CreateWriteStream(delegate); } @end diff --git a/Firestore/Source/Remote/FSTExponentialBackoff.h b/Firestore/Source/Remote/FSTExponentialBackoff.h deleted file mode 100644 index 3beafbf1a6a..00000000000 --- a/Firestore/Source/Remote/FSTExponentialBackoff.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "Firestore/Source/Util/FSTDispatchQueue.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * Helper to implement exponential backoff. - * - * In general, call -reset after each successful round-trip. Call -backoffAndRunBlock before - * retrying after an error. Each backoffAndRunBlock will increase the delay between retries. - */ -@interface FSTExponentialBackoff : NSObject - -/** - * Initializes a helper for running delayed tasks following an exponential backoff curve - * between attempts. - * - * Each delay is made up of a "base" delay which follows the exponential backoff curve, and a - * +/- 50% "jitter" that is calculated and added to the base delay. This prevents clients from - * accidentally synchronizing their delays causing spikes of load to the backend. - * - * @param dispatchQueue The dispatch queue to run tasks on. - * @param timerID The ID to use when scheduling backoff operations on the FSTDispatchQueue. - * @param initialDelay The initial delay (used as the base delay on the first retry attempt). - * Note that jitter will still be applied, so the actual delay could be as little as - * 0.5*initialDelay. - * @param backoffFactor The multiplier to use to determine the extended base delay after each - * attempt. - * @param maxDelay The maximum base delay after which no further backoff is performed. Note that - * jitter will still be applied, so the actual delay could be as much as 1.5*maxDelay. - */ -- (instancetype)initWithDispatchQueue:(FSTDispatchQueue *)dispatchQueue - timerID:(FSTTimerID)timerID - initialDelay:(NSTimeInterval)initialDelay - backoffFactor:(double)backoffFactor - maxDelay:(NSTimeInterval)maxDelay NS_DESIGNATED_INITIALIZER; - -- (instancetype)init NS_UNAVAILABLE; - -/** - * Resets the backoff delay. - * - * The very next backoffAndRunBlock: will have no delay. If it is called again (i.e. due to an - * error), initialDelay (plus jitter) will be used, and subsequent ones will increase according - * to the backoffFactor. - */ -- (void)reset; - -/** - * Resets the backoff to the maximum delay (e.g. for use after a RESOURCE_EXHAUSTED error). - */ -- (void)resetToMax; - -/** - * Waits for currentDelay seconds, increases the delay and runs the specified block. If there was - * a pending block waiting to be run already, it will be canceled. - * - * @param block The block to run. - */ -- (void)backoffAndRunBlock:(void (^)(void))block; - -/** Cancels any pending backoff block scheduled via backoffAndRunBlock:. */ -- (void)cancel; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTExponentialBackoff.mm b/Firestore/Source/Remote/FSTExponentialBackoff.mm deleted file mode 100644 index 67032e0177b..00000000000 --- a/Firestore/Source/Remote/FSTExponentialBackoff.mm +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "Firestore/Source/Remote/FSTExponentialBackoff.h" - -#include - -#import "Firestore/Source/Util/FSTClasses.h" -#import "Firestore/Source/Util/FSTDispatchQueue.h" - -#include "Firestore/core/src/firebase/firestore/util/log.h" -#include "Firestore/core/src/firebase/firestore/util/secure_random.h" - -using firebase::firestore::util::SecureRandom; - -@interface FSTExponentialBackoff () - -@property(nonatomic, strong) FSTDispatchQueue *dispatchQueue; -@property(nonatomic, assign, readonly) FSTTimerID timerID; -@property(nonatomic) double backoffFactor; -@property(nonatomic) NSTimeInterval initialDelay; -@property(nonatomic) NSTimeInterval maxDelay; -@property(nonatomic) NSTimeInterval currentBase; -@property(nonatomic) NSTimeInterval lastAttemptTime; -@property(nonatomic, strong, nullable) FSTDelayedCallback *timerCallback; -@end - -@implementation FSTExponentialBackoff { - SecureRandom _secureRandom; -} - -- (instancetype)initWithDispatchQueue:(FSTDispatchQueue *)dispatchQueue - timerID:(FSTTimerID)timerID - initialDelay:(NSTimeInterval)initialDelay - backoffFactor:(double)backoffFactor - maxDelay:(NSTimeInterval)maxDelay { - if (self = [super init]) { - _dispatchQueue = dispatchQueue; - _timerID = timerID; - _initialDelay = initialDelay; - _backoffFactor = backoffFactor; - _maxDelay = maxDelay; - _lastAttemptTime = [[NSDate date] timeIntervalSince1970]; - - [self reset]; - } - return self; -} - -- (void)reset { - _currentBase = 0; -} - -- (void)resetToMax { - _currentBase = _maxDelay; -} - -- (void)backoffAndRunBlock:(void (^)(void))block { - [self cancel]; - - // First schedule the block using the current base (which may be 0 and should be honored as such). - NSTimeInterval desiredDelayWithJitter = _currentBase + [self jitterDelay]; - - // Guard against lastAttemptTime being in the future due to a clock change. - NSTimeInterval delaySoFar = MAX(0, [[NSDate date] timeIntervalSince1970] - self.lastAttemptTime); - - // Guard against the backoff delay already being past. - NSTimeInterval remainingDelay = MAX(0, desiredDelayWithJitter - delaySoFar); - - if (_currentBase > 0) { - LOG_DEBUG( - "Backing off for %s seconds (" - "base delay: %s seconds, " - "delay with jitter: %s seconds, " - "last attempt: %s seconds ago)", - remainingDelay, _currentBase, desiredDelayWithJitter, delaySoFar); - } - - FSTWeakify(self); - self.timerCallback = [self.dispatchQueue - dispatchAfterDelay:remainingDelay - timerID:self.timerID - block:^{ - FSTStrongify(self); - if (self) { - self.lastAttemptTime = [[NSDate date] timeIntervalSince1970]; - block(); - } - }]; - - // Apply backoff factor to determine next delay and ensure it is within bounds. - _currentBase *= _backoffFactor; - if (_currentBase < _initialDelay) { - _currentBase = _initialDelay; - } - if (_currentBase > _maxDelay) { - _currentBase = _maxDelay; - } -} - -- (void)cancel { - if (self.timerCallback) { - [self.timerCallback cancel]; - self.timerCallback = nil; - } -} - -/** Returns a random value in the range [-currentBase/2, currentBase/2] */ -- (NSTimeInterval)jitterDelay { - std::uniform_real_distribution dist; - double random_double = dist(_secureRandom); - return (random_double - 0.5) * _currentBase; -} - -@end diff --git a/Firestore/Source/Remote/FSTRemoteStore.mm b/Firestore/Source/Remote/FSTRemoteStore.mm index 98d972a4740..c9041dc278f 100644 --- a/Firestore/Source/Remote/FSTRemoteStore.mm +++ b/Firestore/Source/Remote/FSTRemoteStore.mm @@ -17,6 +17,7 @@ #import "Firestore/Source/Remote/FSTRemoteStore.h" #include +#include #import "Firestore/Source/Core/FSTQuery.h" #import "Firestore/Source/Core/FSTTransaction.h" @@ -35,9 +36,11 @@ #include "Firestore/core/src/firebase/firestore/auth/user.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" #include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" +#include "Firestore/core/src/firebase/firestore/remote/stream.h" #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_apple.h" +#include "absl/memory/memory.h" namespace util = firebase::firestore::util; using firebase::firestore::auth::User; @@ -46,7 +49,10 @@ using firebase::firestore::model::DocumentKeySet; using firebase::firestore::model::OnlineState; using firebase::firestore::model::SnapshotVersion; +using firebase::firestore::model::DocumentKeySet; using firebase::firestore::model::TargetId; +using firebase::firestore::remote::WatchStream; +using firebase::firestore::remote::WriteStream; NS_ASSUME_NONNULL_BEGIN @@ -70,9 +76,6 @@ @interface FSTRemoteStore () @property(nonatomic, strong, readonly) FSTDatastore *datastore; #pragma mark Watch Stream -// The watchStream is null when the network is disabled. The non-null check is performed by -// isNetworkEnabled. -@property(nonatomic, strong, nullable) FSTWatchStream *watchStream; /** * A mapping of watched targets that the client cares about tracking and the @@ -89,11 +92,6 @@ @interface FSTRemoteStore () @property(nonatomic, strong, nullable) FSTWatchChangeAggregator *watchChangeAggregator; -#pragma mark Write Stream -// The writeStream is null when the network is disabled. The non-null check is performed by -// isNetworkEnabled. -@property(nonatomic, strong, nullable) FSTWriteStream *writeStream; - /** * A list of up to kMaxPendingWrites writes that we have fetched from the LocalStore via * fillWritePipeline and have or will send to the write stream. @@ -111,7 +109,15 @@ @interface FSTRemoteStore () @property(nonatomic, strong, readonly) NSMutableArray *writePipeline; @end -@implementation FSTRemoteStore +@implementation FSTRemoteStore { + std::shared_ptr _watchStream; + std::shared_ptr _writeStream; + /** + * Set to YES by 'enableNetwork:' and NO by 'disableNetworkInternal:' and + * indicates the user-preferred network state. + */ + BOOL _isNetworkEnabled; +} - (instancetype)initWithLocalStore:(FSTLocalStore *)localStore datastore:(FSTDatastore *)datastore @@ -123,6 +129,12 @@ - (instancetype)initWithLocalStore:(FSTLocalStore *)localStore _writePipeline = [NSMutableArray array]; _onlineStateTracker = [[FSTOnlineStateTracker alloc] initWithWorkerDispatchQueue:queue]; + + // Create streams (but note they're not started yet) + _watchStream = [self.datastore createWatchStreamWithDelegate:self]; + _writeStream = [self.datastore createWriteStreamWithDelegate:self]; + + _isNetworkEnabled = NO; } return self; } @@ -144,76 +156,71 @@ - (void)setOnlineStateDelegate:(nullable id)delegate { #pragma mark Online/Offline state -- (BOOL)isNetworkEnabled { - HARD_ASSERT((self.watchStream == nil) == (self.writeStream == nil), - "WatchStream and WriteStream should both be null or non-null"); - return self.watchStream != nil; +- (BOOL)canUseNetwork { + // PORTING NOTE: This method exists mostly because web also has to take into + // account primary vs. secondary state. + return _isNetworkEnabled; } - (void)enableNetwork { - if ([self isNetworkEnabled]) { - return; - } + _isNetworkEnabled = YES; - // Create new streams (but note they're not started yet). - self.watchStream = [self.datastore createWatchStream]; - self.writeStream = [self.datastore createWriteStream]; + if ([self canUseNetwork]) { + // Load any saved stream token from persistent storage + _writeStream->SetLastStreamToken([self.localStore lastStreamToken]); - // Load any saved stream token from persistent storage - self.writeStream.lastStreamToken = [self.localStore lastStreamToken]; + if ([self shouldStartWatchStream]) { + [self startWatchStream]; + } else { + [self.onlineStateTracker updateState:OnlineState::Unknown]; + } - if ([self shouldStartWatchStream]) { - [self startWatchStream]; - } else { - [self.onlineStateTracker updateState:OnlineState::Unknown]; + // This will start the write stream if necessary. + [self fillWritePipeline]; } - - [self fillWritePipeline]; // This may start the writeStream. } - (void)disableNetwork { + _isNetworkEnabled = NO; [self disableNetworkInternal]; + // Set the OnlineState to Offline so get()s return from cache, etc. [self.onlineStateTracker updateState:OnlineState::Offline]; } /** Disables the network, setting the OnlineState to the specified targetOnlineState. */ - (void)disableNetworkInternal { - if ([self isNetworkEnabled]) { - // NOTE: We're guaranteed not to get any further events from these streams (not even a close - // event). - [self.watchStream stop]; - [self.writeStream stop]; - - [self cleanUpWatchStreamState]; - - if (self.writePipeline.count > 0) { - LOG_DEBUG("Stopping write stream with %lu pending writes", - (unsigned long)self.writePipeline.count); - [self.writePipeline removeAllObjects]; - } + _watchStream->Stop(); + _writeStream->Stop(); - self.writeStream = nil; - self.watchStream = nil; + if (self.writePipeline.count > 0) { + LOG_DEBUG("Stopping write stream with %lu pending writes", + (unsigned long)self.writePipeline.count); + [self.writePipeline removeAllObjects]; } + + [self cleanUpWatchStreamState]; } #pragma mark Shutdown - (void)shutdown { LOG_DEBUG("FSTRemoteStore %s shutting down", (__bridge void *)self); + _isNetworkEnabled = NO; [self disableNetworkInternal]; // Set the OnlineState to Unknown (rather than Offline) to avoid potentially triggering // spurious listener events with cached data, etc. [self.onlineStateTracker updateState:OnlineState::Unknown]; + [self.datastore shutdown]; } - (void)credentialDidChange { - if ([self isNetworkEnabled]) { + if ([self canUseNetwork]) { // Tear down and re-create our network streams. This will ensure we get a fresh auth token // for the new user and re-fill the write pipeline with new mutations from the LocalStore // (since mutations are per-user). LOG_DEBUG("FSTRemoteStore %s restarting streams for new credential", (__bridge void *)self); + _isNetworkEnabled = NO; [self disableNetworkInternal]; [self.onlineStateTracker updateState:OnlineState::Unknown]; [self enableNetwork]; @@ -226,7 +233,8 @@ - (void)startWatchStream { HARD_ASSERT([self shouldStartWatchStream], "startWatchStream: called when shouldStartWatchStream: is false."); _watchChangeAggregator = [[FSTWatchChangeAggregator alloc] initWithTargetMetadataProvider:self]; - [self.watchStream startWithDelegate:self]; + _watchStream->Start(); + [self.onlineStateTracker handleWatchStreamStart]; } @@ -239,14 +247,14 @@ - (void)listenToTargetWithQueryData:(FSTQueryData *)queryData { if ([self shouldStartWatchStream]) { [self startWatchStream]; - } else if ([self isNetworkEnabled] && [self.watchStream isOpen]) { + } else if (_watchStream->IsOpen()) { [self sendWatchRequestWithQueryData:queryData]; } } - (void)sendWatchRequestWithQueryData:(FSTQueryData *)queryData { [self.watchChangeAggregator recordTargetRequest:@(queryData.targetID)]; - [self.watchStream watchQuery:queryData]; + _watchStream->WatchQuery(queryData); } - (void)stopListeningToTargetID:(TargetId)targetID { @@ -255,26 +263,24 @@ - (void)stopListeningToTargetID:(TargetId)targetID { HARD_ASSERT(queryData, "stopListeningToTargetID: target not currently watched: %s", targetKey); [self.listenTargets removeObjectForKey:targetKey]; - if ([self isNetworkEnabled] && [self.watchStream isOpen]) { + if (_watchStream->IsOpen()) { [self sendUnwatchRequestForTargetID:targetKey]; } if ([self.listenTargets count] == 0) { - if ([self isNetworkEnabled]) { - if ([self.watchStream isOpen]) { - [self.watchStream markIdle]; - } else { - // Revert to OnlineState::Unknown if the watch stream is not open and we have no listeners, - // since without any listens to send we cannot confirm if the stream is healthy and upgrade - // to OnlineState::Online. - [self.onlineStateTracker updateState:OnlineState::Unknown]; - } + if (_watchStream->IsOpen()) { + _watchStream->MarkIdle(); + } else if ([self canUseNetwork]) { + // Revert to OnlineState::Unknown if the watch stream is not open and we have no listeners, + // since without any listens to send we cannot confirm if the stream is healthy and upgrade + // to OnlineState::Online. + [self.onlineStateTracker updateState:OnlineState::Unknown]; } } } - (void)sendUnwatchRequestForTargetID:(FSTBoxedTargetID *)targetID { [self.watchChangeAggregator recordTargetRequest:targetID]; - [self.watchStream unwatchTargetID:[targetID intValue]]; + _watchStream->UnwatchTargetId([targetID intValue]); } /** @@ -282,7 +288,7 @@ - (void)sendUnwatchRequestForTargetID:(FSTBoxedTargetID *)targetID { * active watch targets. */ - (BOOL)shouldStartWatchStream { - return [self isNetworkEnabled] && ![self.watchStream isStarted] && self.listenTargets.count > 0; + return [self canUseNetwork] && !_watchStream->IsStarted() && self.listenTargets.count > 0; } - (void)cleanUpWatchStreamState { @@ -326,20 +332,18 @@ - (void)watchStreamDidChange:(FSTWatchChange *)change } - (void)watchStreamWasInterruptedWithError:(nullable NSError *)error { - HARD_ASSERT([self isNetworkEnabled], - "watchStreamWasInterruptedWithError: should only be called when the network is " - "enabled"); + if (!error) { + // Graceful stop (due to Stop() or idle timeout). Make sure that's desirable. + HARD_ASSERT(![self shouldStartWatchStream], + "Watch stream was stopped gracefully while still needed."); + } [self cleanUpWatchStreamState]; - // If the watch stream closed due to an error, retry the connection if there are any active - // watch targets. + // If we still need the watch stream, retry the connection. if ([self shouldStartWatchStream]) { - if (error) { - // There should generally be an error if the watch stream was closed when it's still needed, - // but it's not quite worth asserting. - [self.onlineStateTracker handleWatchStreamFailure:error]; - } + [self.onlineStateTracker handleWatchStreamFailure:error]; + [self startWatchStream]; } else { // We don't need to restart the watch stream because there are no active targets. The online @@ -440,14 +444,13 @@ - (nullable FSTQueryData *)queryDataForTarget:(FSTBoxedTargetID *)targetID { * pending writes. */ - (BOOL)shouldStartWriteStream { - return [self isNetworkEnabled] && ![self.writeStream isStarted] && self.writePipeline.count > 0; + return [self canUseNetwork] && !_writeStream->IsStarted() && self.writePipeline.count > 0; } - (void)startWriteStream { HARD_ASSERT([self shouldStartWriteStream], "startWriteStream: called when shouldStartWriteStream: is false."); - - [self.writeStream startWithDelegate:self]; + _writeStream->Start(); } /** @@ -465,7 +468,7 @@ - (void)fillWritePipeline { FSTMutationBatch *batch = [self.localStore nextMutationBatchAfterBatchID:lastBatchIDRetrieved]; if (!batch) { if (self.writePipeline.count == 0) { - [self.writeStream markIdle]; + _writeStream->MarkIdle(); } break; } @@ -482,28 +485,25 @@ - (void)fillWritePipeline { * Returns YES if we can add to the write pipeline (i.e. it is not full and the network is enabled). */ - (BOOL)canAddToWritePipeline { - return [self isNetworkEnabled] && self.writePipeline.count < kMaxPendingWrites; + return [self canUseNetwork] && self.writePipeline.count < kMaxPendingWrites; } /** * Queues additional writes to be sent to the write stream, sending them immediately if the write - * stream is established, else starting the write stream if it is not yet started. + * stream is established. */ - (void)addBatchToWritePipeline:(FSTMutationBatch *)batch { - HARD_ASSERT([self canAddToWritePipeline], - "addBatchToWritePipeline called when mutations can't be written"); + HARD_ASSERT([self canAddToWritePipeline], "addBatchToWritePipeline called when pipeline is full"); [self.writePipeline addObject:batch]; - if ([self shouldStartWriteStream]) { - [self startWriteStream]; - } else if ([self isNetworkEnabled] && self.writeStream.handshakeComplete) { - [self.writeStream writeMutations:batch.mutations]; + if (_writeStream->IsOpen() && _writeStream->handshake_complete()) { + _writeStream->WriteMutations(batch.mutations); } } - (void)writeStreamDidOpen { - [self.writeStream writeHandshake]; + _writeStream->WriteHandshake(); } /** @@ -512,11 +512,11 @@ - (void)writeStreamDidOpen { */ - (void)writeStreamDidCompleteHandshake { // Record the stream token. - [self.localStore setLastStreamToken:self.writeStream.lastStreamToken]; + [self.localStore setLastStreamToken:_writeStream->GetLastStreamToken()]; // Send the write pipeline now that the stream is established. for (FSTMutationBatch *write in self.writePipeline) { - [self.writeStream writeMutations:write.mutations]; + _writeStream->WriteMutations(write.mutations); } } @@ -533,7 +533,7 @@ - (void)writeStreamDidReceiveResponseWithVersion:(const SnapshotVersion &)commit [FSTMutationBatchResult resultWithBatch:batch commitVersion:commitVersion mutationResults:results - streamToken:self.writeStream.lastStreamToken]; + streamToken:_writeStream->GetLastStreamToken()]; [self.syncEngine applySuccessfulWriteWithResult:batchResult]; // It's possible that with the completion of this mutation another slot has freed up. @@ -545,13 +545,16 @@ - (void)writeStreamDidReceiveResponseWithVersion:(const SnapshotVersion &)commit * has been terminated by the client or the server. */ - (void)writeStreamWasInterruptedWithError:(nullable NSError *)error { - HARD_ASSERT([self isNetworkEnabled], - "writeStreamDidClose: should only be called when the network is enabled"); + if (!error) { + // Graceful stop (due to Stop() or idle timeout). Make sure that's desirable. + HARD_ASSERT(![self shouldStartWriteStream], + "Write stream was stopped gracefully while still needed."); + } // If the write stream closed due to an error, invoke the error callbacks if there are pending // writes. if (error != nil && self.writePipeline.count > 0) { - if (self.writeStream.handshakeComplete) { + if (_writeStream->handshake_complete()) { // This error affects the actual writes. [self handleWriteError:error]; } else { @@ -568,18 +571,20 @@ - (void)writeStreamWasInterruptedWithError:(nullable NSError *)error { } - (void)handleHandshakeError:(NSError *)error { + HARD_ASSERT(error, "Handling write error with status OK."); // Reset the token if it's a permanent error or the error code is ABORTED, signaling the write // stream is no longer valid. if ([FSTDatastore isPermanentWriteError:error] || [FSTDatastore isAbortedError:error]) { - NSString *token = [self.writeStream.lastStreamToken base64EncodedStringWithOptions:0]; + NSString *token = [_writeStream->GetLastStreamToken() base64EncodedStringWithOptions:0]; LOG_DEBUG("FSTRemoteStore %s error before completed handshake; resetting stream token %s: %s", (__bridge void *)self, token, error); - self.writeStream.lastStreamToken = nil; + _writeStream->SetLastStreamToken(nil); [self.localStore setLastStreamToken:nil]; } } - (void)handleWriteError:(NSError *)error { + HARD_ASSERT(error, "Handling write error with status OK."); // Only handle permanent error. If it's transient, just let the retry logic kick in. if (![FSTDatastore isPermanentWriteError:error]) { return; @@ -592,7 +597,7 @@ - (void)handleWriteError:(NSError *)error { // In this case it's also unlikely that the server itself is melting down--this was just a // bad request so inhibit backoff on the next restart. - [self.writeStream inhibitBackoff]; + _writeStream->InhibitBackoff(); [self.syncEngine rejectFailedWriteWithBatchID:batch.batchID error:error]; diff --git a/Firestore/Source/Remote/FSTSerializerBeta.mm b/Firestore/Source/Remote/FSTSerializerBeta.mm index 05cd80ba220..ded669bc29f 100644 --- a/Firestore/Source/Remote/FSTSerializerBeta.mm +++ b/Firestore/Source/Remote/FSTSerializerBeta.mm @@ -16,8 +16,6 @@ #import "Firestore/Source/Remote/FSTSerializerBeta.h" -#import - #include #include #include diff --git a/Firestore/Source/Remote/FSTStream.h b/Firestore/Source/Remote/FSTStream.h index ab70b740cc5..00dcab37f7f 100644 --- a/Firestore/Source/Remote/FSTStream.h +++ b/Firestore/Source/Remote/FSTStream.h @@ -16,158 +16,14 @@ #import -#import "Firestore/Source/Util/FSTDispatchQueue.h" - -#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h" -#include "Firestore/core/src/firebase/firestore/core/database_info.h" #include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" -#include "Firestore/core/src/firebase/firestore/model/types.h" -@class FSTDispatchQueue; -@class FSTMutation; @class FSTMutationResult; -@class FSTQueryData; -@class FSTSerializerBeta; @class FSTWatchChange; -@class FSTWatchStream; -@class FSTWriteStream; -@class GRPCCall; -@class GRXWriter; - -@protocol FSTWatchStreamDelegate; -@protocol FSTWriteStreamDelegate; NS_ASSUME_NONNULL_BEGIN -/** - * An FSTStream is an abstract base class that represents a restartable streaming RPC to the - * Firestore backend. It's built on top of GRPC's own support for streaming RPCs, and adds several - * critical features for our clients: - * - * - Restarting a stream is allowed (after failure) - * - Exponential backoff on failure (independent of the underlying channel) - * - Authentication via CredentialsProvider - * - Dispatching all callbacks into the shared worker queue - * - * Subclasses of FSTStream implement serialization of models to and from bytes (via protocol - * buffers) for a specific streaming RPC and emit events specific to the stream. - * - * ## Starting and Stopping - * - * Streaming RPCs are stateful and need to be started before messages can be sent and received. - * The FSTStream will call its delegate's specific streamDidOpen method once the stream is ready - * to accept requests. - * - * Should a `start` fail, FSTStream will call its delegate's specific streamDidClose method with an - * NSError indicating what went wrong. The delegate is free to call start again. - * - * An FSTStream can also be explicitly stopped which indicates that the caller has discarded the - * stream and no further events should be emitted. Once explicitly stopped, a stream cannot be - * restarted. - * - * ## Subclassing Notes - * - * An implementation of FSTStream needs to implement the following methods: - * - `createRPCWithRequestsWriter`, should create the specific RPC (a GRPCCall object). - * - `handleStreamMessage`, receives protocol buffer responses from GRPC and must deserialize and - * delegate to some stream specific response method. - * - `notifyStreamOpen`, should call through to the stream-specific streamDidOpen method. - * - `notifyStreamInterrupted`, calls through to the stream-specific streamWasInterrupted method. - * - * Additionally, beyond these required methods, subclasses will want to implement methods that - * take request models, serialize them, and write them to using writeRequest:. Implementation - * specific cleanup logic can be added to tearDown:. - * - * ## RPC Message Type - * - * FSTStream intentionally uses the GRPCCall interface to GRPC directly, bypassing both GRPCProtoRPC - * and GRXBufferedPipe for sending data. This has been done to avoid race conditions that come out - * of a loosely specified locking contract on GRXWriter. There's essentially no way to safely use - * any of the wrapper objects for GRXWriter (that perform buffering or conversion to/from protos). - * - * See https://github.com/grpc/grpc/issues/10957 for the kinds of things we're trying to avoid. - */ -@interface FSTStream<__covariant FSTStreamDelegate> : NSObject - -- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - connectionTimerID:(FSTTimerID)connectionTimerID - idleTimerID:(FSTTimerID)idleTimerID - credentials:(firebase::firestore::auth::CredentialsProvider *) - credentials // no passing ownership - responseMessageClass:(Class)responseMessageClass NS_DESIGNATED_INITIALIZER; - -- (instancetype)init NS_UNAVAILABLE; - -/** - * An abstract method used by `start` to create a streaming RPC specific to this type of stream. - * The RPC should be created such that requests are taken from `self`. - * - * Note that the returned GRPCCall must not be a GRPCProtoRPC, since the rest of the streaming - * mechanism assumes it is dealing in bytes-level requests and responses. - */ -- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter; - -/** - * Returns YES if `start` has been called and no error has occurred. YES indicates the stream is - * open or in the process of opening (which encompasses respecting backoff, getting auth tokens, - * and starting the actual RPC). Use `isOpen` to determine if the stream is open and ready for - * outbound requests. - */ -- (BOOL)isStarted; - -/** Returns YES if the underlying RPC is open and the stream is ready for outbound requests. */ -- (BOOL)isOpen; - -/** - * Starts the RPC. Only allowed if isStarted returns NO. The stream is not immediately ready for - * use: the delegate's watchStreamDidOpen method will be invoked when the RPC is ready for outbound - * requests, at which point `isOpen` will return YES. - * - * When start returns, -isStarted will return YES. - */ -- (void)startWithDelegate:(id)delegate; - -/** - * Stops the RPC. This call is idempotent and allowed regardless of the current isStarted state. - * - * Unlike a transient stream close, stopping a stream is permanent. This is guaranteed NOT to emit - * any further events on the stream-specific delegate, including the streamDidClose method. - * - * NOTE: This no-events contract may seem counter-intuitive but allows the caller to - * straightforwardly sequence stream tear-down without having to worry about when the delegate's - * streamDidClose methods will get called. For example if the stream must be exchanged for another - * during a user change this allows `stop` to be called eagerly without worrying about the - * streamDidClose method accidentally restarting the stream before the new one is ready. - * - * When stop returns, -isStarted and -isOpen will both return NO. - */ -- (void)stop; - -/** - * Marks this stream as idle. If no further actions are performed on the stream for one minute, the - * stream will automatically close itself and notify the stream's close handler. The stream will - * then be in a non-started state, requiring the caller to start the stream again before further - * use. - * - * Only streams that are in state 'Open' can be marked idle, as all other states imply pending - * network operations. - */ -- (void)markIdle; - -/** - * After an error the stream will usually back off on the next attempt to start it. If the error - * warrants an immediate restart of the stream, the sender can use this to indicate that the - * receiver should not back off. - * - * Each error will call the stream-specific streamDidClose method. That method can decide to - * inhibit backoff if required. - */ -- (void)inhibitBackoff; - -@end - -#pragma mark - FSTWatchStream +#pragma mark - FSTWatchStreamDelegate /** A protocol defining the events that can be emitted by the FSTWatchStream. */ @protocol FSTWatchStreamDelegate @@ -194,47 +50,7 @@ NS_ASSUME_NONNULL_BEGIN @end -/** - * An FSTStream that implements the StreamingWatch RPC. - * - * Once the FSTWatchStream has called the streamDidOpen method, any number of watchQuery and - * unwatchTargetId calls can be sent to control what changes will be sent from the server for - * WatchChanges. - */ -@interface FSTWatchStream : FSTStream - -/** - * Initializes the watch stream with its dependencies. - */ -- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(firebase::firestore::auth::CredentialsProvider *) - credentials // no passsing ownership - serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; - -- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - connectionTimerID:(FSTTimerID)connectionTimerID - idleTimerID:(FSTTimerID)idleTimerID - credentials:(firebase::firestore::auth::CredentialsProvider *) - credentials // no passing ownership - responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; - -- (instancetype)init NS_UNAVAILABLE; - -/** - * Registers interest in the results of the given query. If the query includes a resumeToken it - * will be included in the request. Results that affect the query will be streamed back as - * WatchChange messages that reference the targetID included in |query|. - */ -- (void)watchQuery:(FSTQueryData *)query; - -/** Unregisters interest in the results of the query associated with the given target ID. */ -- (void)unwatchTargetID:(firebase::firestore::model::TargetId)targetID; - -@end - -#pragma mark - FSTWriteStream +#pragma mark - FSTWriteStreamDelegate @protocol FSTWriteStreamDelegate @@ -267,65 +83,4 @@ NS_ASSUME_NONNULL_BEGIN @end -/** - * An FSTStream that implements the StreamingWrite RPC. - * - * The StreamingWrite RPC requires the caller to maintain special `streamToken` state in between - * calls, to help the server understand which responses the client has processed by the time the - * next request is made. Every response may contain a `streamToken`; this value must be passed to - * the next request. - * - * After calling `start` on this stream, the next request must be a handshake, containing whatever - * streamToken is on hand. Once a response to this request is received, all pending mutations may - * be submitted. When submitting multiple batches of mutations at the same time, it's okay to use - * the same streamToken for the calls to `writeMutations:`. - */ -@interface FSTWriteStream : FSTStream - -/** - * Initializes the write stream with its dependencies. - */ -- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(firebase::firestore::auth::CredentialsProvider *) - credentials // no passing ownership - serializer:(FSTSerializerBeta *)serializer; - -- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - connectionTimerID:(FSTTimerID)connectionTimerID - idleTimerID:(FSTTimerID)idleTimerID - credentials:(firebase::firestore::auth::CredentialsProvider *) - credentials // no passing ownership - responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; - -- (instancetype)init NS_UNAVAILABLE; - -/** - * Sends an initial streamToken to the server, performing the handshake required to make the - * StreamingWrite RPC work. Subsequent `writeMutations:` calls should wait until a response has - * been delivered to the delegate's writeStreamDidCompleteHandshake method. - */ -- (void)writeHandshake; - -/** Sends a group of mutations to the Firestore backend to apply. */ -- (void)writeMutations:(NSArray *)mutations; - -/** - * Tracks whether or not a handshake has been successfully exchanged and the stream is ready to - * accept mutations. - */ -@property(nonatomic, assign, readwrite, getter=isHandshakeComplete) BOOL handshakeComplete; - -/** - * The last received stream token from the server, used to acknowledge which responses the client - * has processed. Stream tokens are opaque checkpoint markers whose only real value is their - * inclusion in the next request. - * - * FSTWriteStream manages propagating this value from responses to the next request. - */ -@property(nonatomic, strong, nullable) NSData *lastStreamToken; - -@end - NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTStream.mm b/Firestore/Source/Remote/FSTStream.mm deleted file mode 100644 index dbeceef15bf..00000000000 --- a/Firestore/Source/Remote/FSTStream.mm +++ /dev/null @@ -1,823 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import -#import - -#import "FIRFirestoreErrors.h" -#import "Firestore/Source/API/FIRFirestore+Internal.h" -#import "Firestore/Source/Local/FSTQueryData.h" -#import "Firestore/Source/Model/FSTMutation.h" -#import "Firestore/Source/Remote/FSTBufferedWriter.h" -#import "Firestore/Source/Remote/FSTDatastore.h" -#import "Firestore/Source/Remote/FSTExponentialBackoff.h" -#import "Firestore/Source/Remote/FSTSerializerBeta.h" -#import "Firestore/Source/Remote/FSTStream.h" -#import "Firestore/Source/Util/FSTClasses.h" -#import "Firestore/Source/Util/FSTDispatchQueue.h" - -#import "Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h" - -#include "Firestore/core/src/firebase/firestore/auth/token.h" -#include "Firestore/core/src/firebase/firestore/core/database_info.h" -#include "Firestore/core/src/firebase/firestore/model/database_id.h" -#include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" -#include "Firestore/core/src/firebase/firestore/util/error_apple.h" -#include "Firestore/core/src/firebase/firestore/util/hard_assert.h" -#include "Firestore/core/src/firebase/firestore/util/log.h" -#include "Firestore/core/src/firebase/firestore/util/string_apple.h" - -namespace util = firebase::firestore::util; -using firebase::firestore::auth::CredentialsProvider; -using firebase::firestore::auth::Token; -using firebase::firestore::core::DatabaseInfo; -using firebase::firestore::model::DatabaseId; -using firebase::firestore::model::SnapshotVersion; -using firebase::firestore::model::TargetId; - -/** - * Initial backoff time in seconds after an error. - * Set to 1s according to https://cloud.google.com/apis/design/errors. - */ -static const NSTimeInterval kBackoffInitialDelay = 1; -static const NSTimeInterval kBackoffMaxDelay = 60.0; -static const double kBackoffFactor = 1.5; - -#pragma mark - FSTStream - -/** The state of a stream. */ -typedef NS_ENUM(NSInteger, FSTStreamState) { - /** - * The streaming RPC is not running and there's no error condition. Calling `start` will - * start the stream immediately without backoff. While in this state -isStarted will return NO. - */ - FSTStreamStateInitial = 0, - - /** - * The stream is starting, and is waiting for an auth token to attach to the initial request. - * While in this state, isStarted will return YES but isOpen will return NO. - */ - FSTStreamStateAuth, - - /** - * The streaming RPC is up and running. Requests and responses can flow freely. Both - * isStarted and isOpen will return YES. - */ - FSTStreamStateOpen, - - /** - * The stream encountered an error. The next start attempt will back off. While in this state - * -isStarted will return NO. - */ - FSTStreamStateError, - - /** - * An in-between state after an error where the stream is waiting before re-starting. After - * waiting is complete, the stream will try to open. While in this state -isStarted will - * return YES but isOpen will return NO. - */ - FSTStreamStateBackoff, - - /** - * The stream has been explicitly stopped; no further events will be emitted. - */ - FSTStreamStateStopped, -}; - -// We need to declare these classes first so that Datastore can alloc them. - -@interface FSTWatchStream () - -/** - * Initializes the watch stream with its dependencies. - */ -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; - -@end - -@interface FSTStream () - -@property(nonatomic, assign, readonly) FSTTimerID idleTimerID; -@property(nonatomic, strong, nullable) FSTDelayedCallback *idleTimerCallback; -@property(nonatomic, weak, readwrite, nullable) id delegate; - -@end - -@interface FSTStream () - -// Does not own this DatabaseInfo. -@property(nonatomic, assign, readonly) const DatabaseInfo *databaseInfo; -@property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue; -@property(nonatomic, assign, readonly) CredentialsProvider *credentials; -@property(nonatomic, unsafe_unretained, readonly) Class responseMessageClass; -@property(nonatomic, strong, readonly) FSTExponentialBackoff *backoff; - -/** A flag tracking whether the stream received a message from the backend. */ -@property(nonatomic, assign) BOOL messageReceived; - -/** - * Stream state as exposed to consumers of FSTStream. This differs from GRXWriter's notion of the - * state of the stream. - */ -@property(nonatomic, assign) FSTStreamState state; - -/** The RPC handle. Used for cancellation. */ -@property(nonatomic, strong, nullable) GRPCCall *rpc; - -/** - * The send-side of the RPC stream in which to submit requests, but only once the underlying RPC has - * started. - */ -@property(nonatomic, strong, nullable) FSTBufferedWriter *requestsWriter; - -@end - -#pragma mark - FSTCallbackFilter - -/** - * Implements callbacks from gRPC via the GRXWriteable protocol. This is separate from the main - * FSTStream to allow the stream to be stopped externally (either by the user or via idle timer) - * and be able to completely prevent any subsequent events from gRPC from calling back into the - * FSTSTream. - */ -@interface FSTCallbackFilter : NSObject - -- (instancetype)initWithStream:(FSTStream *)stream NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@property(atomic, readwrite) BOOL callbacksEnabled; -@property(nonatomic, strong, readonly) FSTStream *stream; - -@end - -@implementation FSTCallbackFilter - -- (instancetype)initWithStream:(FSTStream *)stream { - if (self = [super init]) { - _callbacksEnabled = YES; - _stream = stream; - } - return self; -} - -- (void)suppressCallbacks { - _callbacksEnabled = NO; -} - -- (void)writeValue:(id)value { - if (_callbacksEnabled) { - [self.stream writeValue:value]; - } -} - -- (void)writesFinishedWithError:(NSError *)errorOrNil { - if (_callbacksEnabled) { - [self.stream writesFinishedWithError:errorOrNil]; - } -} - -@end - -#pragma mark - FSTStream - -@interface FSTStream () - -@property(nonatomic, strong, readwrite) FSTCallbackFilter *callbackFilter; - -@end - -@implementation FSTStream - -/** The time a stream stays open after it is marked idle. */ -static const NSTimeInterval kIdleTimeout = 60.0; - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - connectionTimerID:(FSTTimerID)connectionTimerID - idleTimerID:(FSTTimerID)idleTimerID - credentials:(CredentialsProvider *)credentials - responseMessageClass:(Class)responseMessageClass { - if (self = [super init]) { - _databaseInfo = database; - _workerDispatchQueue = workerDispatchQueue; - _idleTimerID = idleTimerID; - _credentials = credentials; - _responseMessageClass = responseMessageClass; - - _backoff = [[FSTExponentialBackoff alloc] initWithDispatchQueue:workerDispatchQueue - timerID:connectionTimerID - initialDelay:kBackoffInitialDelay - backoffFactor:kBackoffFactor - maxDelay:kBackoffMaxDelay]; - _state = FSTStreamStateInitial; - } - return self; -} - -- (BOOL)isStarted { - [self.workerDispatchQueue verifyIsCurrentQueue]; - FSTStreamState state = self.state; - return state == FSTStreamStateBackoff || state == FSTStreamStateAuth || - state == FSTStreamStateOpen; -} - -- (BOOL)isOpen { - [self.workerDispatchQueue verifyIsCurrentQueue]; - return self.state == FSTStreamStateOpen; -} - -- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { - @throw FSTAbstractMethodException(); // NOLINT -} - -- (void)startWithDelegate:(id)delegate { - [self.workerDispatchQueue verifyIsCurrentQueue]; - - if (self.state == FSTStreamStateError) { - [self performBackoffWithDelegate:delegate]; - return; - } - - LOG_DEBUG("%s %s start", NSStringFromClass([self class]), (__bridge void *)self); - HARD_ASSERT(self.state == FSTStreamStateInitial, "Already started"); - - self.state = FSTStreamStateAuth; - HARD_ASSERT(_delegate == nil, "Delegate must be nil"); - _delegate = delegate; - - _credentials->GetToken([self](util::StatusOr result) { - [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{ - [self resumeStartWithToken:result]; - }]; - }); -} - -/** Add an access token to our RPC, after obtaining one from the credentials provider. */ -- (void)resumeStartWithToken:(const util::StatusOr &)result { - [self.workerDispatchQueue verifyIsCurrentQueue]; - - if (self.state == FSTStreamStateStopped) { - // Streams can be stopped while waiting for authorization. - return; - } - HARD_ASSERT(self.state == FSTStreamStateAuth, "State should still be auth (was %s)", self.state); - - if (!result.ok()) { - // RPC has not been started yet, so just invoke higher-level close handler. - [self handleStreamClose:util::MakeNSError(result.status())]; - return; - } - - self.requestsWriter = [[FSTBufferedWriter alloc] init]; - _rpc = [self createRPCWithRequestsWriter:self.requestsWriter]; - [_rpc setResponseDispatchQueue:self.workerDispatchQueue.queue]; - - const Token &token = result.ValueOrDie(); - [FSTDatastore - prepareHeadersForRPC:_rpc - databaseID:&self.databaseInfo->database_id() - token:(token.user().is_authenticated() ? token.token() : absl::string_view())]; - HARD_ASSERT(_callbackFilter == nil, "GRX Filter must be nil"); - _callbackFilter = [[FSTCallbackFilter alloc] initWithStream:self]; - [_rpc startWithWriteable:_callbackFilter]; - - self.state = FSTStreamStateOpen; - [self notifyStreamOpen]; -} - -/** Backs off after an error. */ -- (void)performBackoffWithDelegate:(id)delegate { - LOG_DEBUG("%s %s backoff", NSStringFromClass([self class]), (__bridge void *)self); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - HARD_ASSERT(self.state == FSTStreamStateError, "Should only perform backoff in an error case"); - self.state = FSTStreamStateBackoff; - - FSTWeakify(self); - [self.backoff backoffAndRunBlock:^{ - FSTStrongify(self); - [self resumeStartFromBackoffWithDelegate:delegate]; - }]; -} - -/** Resumes stream start after backing off. */ -- (void)resumeStartFromBackoffWithDelegate:(id)delegate { - if (self.state == FSTStreamStateStopped) { - // We should have canceled the backoff timer when the stream was closed, but just in case we - // make this a no-op. - return; - } - - // In order to have performed a backoff the stream must have been in an error state just prior - // to entering the backoff state. If we weren't stopped we must be in the backoff state. - HARD_ASSERT(self.state == FSTStreamStateBackoff, "State should still be backoff (was %s)", - self.state); - - // Momentarily set state to FSTStreamStateInitial as `start` expects it. - self.state = FSTStreamStateInitial; - [self startWithDelegate:delegate]; - HARD_ASSERT([self isStarted], "Stream should have started."); -} - -/** - * Can be overridden to perform additional cleanup before the stream is closed. Calling - * [super tearDown] is not required. - */ -- (void)tearDown { -} - -/** - * Closes the stream and cleans up as necessary: - * - * * closes the underlying GRPC stream; - * * calls the onClose handler with the given 'error'; - * * sets internal stream state to 'finalState'; - * * adjusts the backoff timer based on the error - * - * A new stream can be opened by calling `start` unless `finalState` is set to - * `FSTStreamStateStopped`. - * - * @param finalState the intended state of the stream after closing. - * @param error the NSError the connection was closed with. - */ -- (void)closeWithFinalState:(FSTStreamState)finalState error:(nullable NSError *)error { - HARD_ASSERT(finalState == FSTStreamStateError || error == nil, - "Can't provide an error when not in an error state."); - - [self.workerDispatchQueue verifyIsCurrentQueue]; - - // The stream will be closed so we don't need our idle close timer anymore. - [self cancelIdleCheck]; - - // Ensure we don't leave a pending backoff operation queued (in case close() - // was called while we were waiting to reconnect). - [self.backoff cancel]; - - if (finalState != FSTStreamStateError) { - // If this is an intentional close ensure we don't delay our next connection attempt. - [self.backoff reset]; - } else if (error != nil && error.code == FIRFirestoreErrorCodeResourceExhausted) { - LOG_DEBUG("%s %s Using maximum backoff delay to prevent overloading the backend.", [self class], - (__bridge void *)self); - [self.backoff resetToMax]; - } else if (error != nil && error.code == FIRFirestoreErrorCodeUnauthenticated) { - // "unauthenticated" error means the token was rejected. Try force refreshing it in case it just - // expired. - _credentials->InvalidateToken(); - } - - if (finalState != FSTStreamStateError) { - LOG_DEBUG("%s %s Performing stream teardown", [self class], (__bridge void *)self); - [self tearDown]; - } - - if (self.requestsWriter) { - // Clean up the underlying RPC. If this close: is in response to an error, don't attempt to - // call half-close to avoid secondary failures. - if (finalState != FSTStreamStateError) { - LOG_DEBUG("%s %s Closing stream client-side", [self class], (__bridge void *)self); - @synchronized(self.requestsWriter) { - [self.requestsWriter finishWithError:nil]; - } - } - _requestsWriter = nil; - } - - // This state must be assigned before calling `notifyStreamInterrupted` to allow the callback to - // inhibit backoff or otherwise manipulate the state in its non-started state. - self.state = finalState; - - [self.callbackFilter suppressCallbacks]; - _callbackFilter = nil; - - // Clean up remaining state. - _messageReceived = NO; - _rpc = nil; - - // If the caller explicitly requested a stream stop, don't notify them of a closing stream (it - // could trigger undesirable recovery logic, etc.). - if (finalState != FSTStreamStateStopped) { - [self notifyStreamInterruptedWithError:error]; - } - - // PORTING NOTE: notifyStreamInterruptedWithError may have restarted the stream with a new - // delegate so we do /not/ want to clear the delegate here. And since we've already suppressed - // callbacks via our callbackFilter, there is no worry about bleed through of events from GRPC. -} - -- (void)stop { - LOG_DEBUG("%s %s stop", NSStringFromClass([self class]), (__bridge void *)self); - if ([self isStarted]) { - [self closeWithFinalState:FSTStreamStateStopped error:nil]; - } -} - -- (void)inhibitBackoff { - HARD_ASSERT(![self isStarted], "Can only inhibit backoff after an error (was %s)", self.state); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - // Clear the error condition. - self.state = FSTStreamStateInitial; - [self.backoff reset]; -} - -/** Called by the idle timer when the stream should close due to inactivity. */ -- (void)handleIdleCloseTimer { - [self.workerDispatchQueue verifyIsCurrentQueue]; - if ([self isOpen]) { - // When timing out an idle stream there's no reason to force the stream into backoff when - // it restarts so set the stream state to Initial instead of Error. - [self closeWithFinalState:FSTStreamStateInitial error:nil]; - } -} - -- (void)markIdle { - [self.workerDispatchQueue verifyIsCurrentQueue]; - // Starts the idle timer if we are in state 'Open' and are not yet already running a timer (in - // which case the previous idle timeout still applies). - if ([self isOpen] && !self.idleTimerCallback) { - self.idleTimerCallback = [self.workerDispatchQueue dispatchAfterDelay:kIdleTimeout - timerID:self.idleTimerID - block:^() { - [self handleIdleCloseTimer]; - }]; - } -} - -- (void)cancelIdleCheck { - [self.workerDispatchQueue verifyIsCurrentQueue]; - if (self.idleTimerCallback) { - [self.idleTimerCallback cancel]; - self.idleTimerCallback = nil; - } -} - -/** - * Parses a protocol buffer response from the server. If the message fails to parse, generates - * an error and closes the stream. - * - * @param protoClass A protocol buffer message class object, that responds to parseFromData:error:. - * @param data The bytes in the response as returned from GRPC. - * @return An instance of the protocol buffer message, parsed from the data if parsing was - * successful, or nil otherwise. - */ -- (nullable id)parseProto:(Class)protoClass data:(NSData *)data error:(NSError **)error { - NSError *parseError; - id parsed = [protoClass parseFromData:data error:&parseError]; - if (parsed) { - *error = nil; - return parsed; - } else { - NSDictionary *info = @{ - NSLocalizedDescriptionKey : @"Unable to parse response from the server", - NSUnderlyingErrorKey : parseError, - @"Expected class" : protoClass, - @"Received value" : data, - }; - *error = [NSError errorWithDomain:FIRFirestoreErrorDomain - code:FIRFirestoreErrorCodeInternal - userInfo:info]; - return nil; - } -} - -/** - * Writes a request proto into the stream. - */ -- (void)writeRequest:(GPBMessage *)request { - NSData *data = [request data]; - - [self cancelIdleCheck]; - - FSTBufferedWriter *requestsWriter = self.requestsWriter; - @synchronized(requestsWriter) { - [requestsWriter writeValue:data]; - } -} - -#pragma mark Template methods for subclasses - -/** - * Called by the stream after the stream has opened. - * - * Subclasses should relay to their stream-specific delegate. Calling [super notifyStreamOpen] is - * not required. - */ -- (void)notifyStreamOpen { -} - -/** - * Called by the stream after the stream has been unexpectedly interrupted, either due to an error - * or due to idleness. - * - * Subclasses should relay to their stream-specific delegate. Calling [super - * notifyStreamInterrupted] is not required. - */ -- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { -} - -/** - * Called by the stream for each incoming protocol message coming from the server. - * - * Subclasses should implement this to deserialize the value and relay to their stream-specific - * delegate, if appropriate. Calling [super handleStreamMessage] is not required. - */ -- (void)handleStreamMessage:(id)value { -} - -/** - * Called by the stream when the underlying RPC has been closed for whatever reason. - */ -- (void)handleStreamClose:(nullable NSError *)error { - LOG_DEBUG("%s %s close: %s", NSStringFromClass([self class]), (__bridge void *)self, error); - HARD_ASSERT([self isStarted], "handleStreamClose: called for non-started stream."); - - // In theory the stream could close cleanly, however, in our current model we never expect this - // to happen because if we stop a stream ourselves, this callback will never be called. To - // prevent cases where we retry without a backoff accidentally, we set the stream to error - // in all cases. - [self closeWithFinalState:FSTStreamStateError error:error]; -} - -#pragma mark GRXWriteable implementation -// The GRXWriteable implementation defines the receive side of the RPC stream. - -/** - * Called by GRPC when it publishes a value. - * - * GRPC must be configured to use our worker queue by calling - * `[call setResponseDispatchQueue:self.workerDispatchQueue.queue]` on the GRPCCall before starting - * the RPC. - */ -- (void)writeValue:(id)value { - [self.workerDispatchQueue enterCheckedOperation:^{ - HARD_ASSERT([self isStarted], "writeValue: called for stopped stream."); - - if (!self.messageReceived) { - self.messageReceived = YES; - if ([FIRFirestore isLoggingEnabled]) { - LOG_DEBUG("%s %s headers (whitelisted): %s", NSStringFromClass([self class]), - (__bridge void *)self, - [FSTDatastore extractWhiteListedHeaders:self.rpc.responseHeaders]); - } - } - NSError *error; - id proto = [self parseProto:self.responseMessageClass data:value error:&error]; - if (proto) { - [self handleStreamMessage:proto]; - } else { - [self.rpc finishWithError:error]; - } - }]; -} - -/** - * Called by GRPC when it closed the stream with an error representing the final state of the - * stream. - * - * GRPC must be configured to use our worker queue by calling - * `[call setResponseDispatchQueue:self.workerDispatchQueue.queue]` on the GRPCCall before starting - * the RPC. - * - * Do not call directly. Call handleStreamClose to directly inform stream-specific logic, or call - * stop to tear down the stream. - */ -- (void)writesFinishedWithError:(nullable NSError *)error __used { - error = [FSTDatastore firestoreErrorForError:error]; - [self.workerDispatchQueue enterCheckedOperation:^{ - HARD_ASSERT([self isStarted], "writesFinishedWithError: called for stopped stream."); - - [self handleStreamClose:error]; - }]; -} - -@end - -#pragma mark - FSTWatchStream - -@interface FSTWatchStream () - -@property(nonatomic, strong, readonly) FSTSerializerBeta *serializer; - -@end - -@implementation FSTWatchStream - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer { - self = [super initWithDatabase:database - workerDispatchQueue:workerDispatchQueue - connectionTimerID:FSTTimerIDListenStreamConnectionBackoff - idleTimerID:FSTTimerIDListenStreamIdle - credentials:credentials - responseMessageClass:[GCFSListenResponse class]]; - if (self) { - _serializer = serializer; - } - return self; -} - -- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { - return [[GRPCCall alloc] initWithHost:util::WrapNSString(self.databaseInfo->host()) - path:@"/google.firestore.v1beta1.Firestore/Listen" - requestsWriter:requestsWriter]; -} - -- (void)notifyStreamOpen { - [self.delegate watchStreamDidOpen]; -} - -- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { - id delegate = self.delegate; - self.delegate = nil; - [delegate watchStreamWasInterruptedWithError:error]; -} - -- (void)watchQuery:(FSTQueryData *)query { - HARD_ASSERT([self isOpen], "Not yet open"); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - GCFSListenRequest *request = [GCFSListenRequest message]; - request.database = [_serializer encodedDatabaseID]; - request.addTarget = [_serializer encodedTarget:query]; - request.labels = [_serializer encodedListenRequestLabelsForQueryData:query]; - - LOG_DEBUG("FSTWatchStream %s watch: %s", (__bridge void *)self, request); - [self writeRequest:request]; -} - -- (void)unwatchTargetID:(TargetId)targetID { - HARD_ASSERT([self isOpen], "Not yet open"); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - GCFSListenRequest *request = [GCFSListenRequest message]; - request.database = [_serializer encodedDatabaseID]; - request.removeTarget = targetID; - - LOG_DEBUG("FSTWatchStream %s unwatch: %s", (__bridge void *)self, request); - [self writeRequest:request]; -} - -/** - * Receives an inbound message from GRPC, deserializes, and then passes that on to the delegate's - * watchStreamDidChange:snapshotVersion: callback. - */ -- (void)handleStreamMessage:(GCFSListenResponse *)proto { - LOG_DEBUG("FSTWatchStream %s response: %s", (__bridge void *)self, proto); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - // A successful response means the stream is healthy. - [self.backoff reset]; - - FSTWatchChange *change = [_serializer decodedWatchChange:proto]; - SnapshotVersion snap = [_serializer versionFromListenResponse:proto]; - [self.delegate watchStreamDidChange:change snapshotVersion:snap]; -} - -@end - -#pragma mark - FSTWriteStream - -@interface FSTWriteStream () - -@property(nonatomic, strong, readonly) FSTSerializerBeta *serializer; - -@end - -@implementation FSTWriteStream - -- (instancetype)initWithDatabase:(const DatabaseInfo *)database - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials - serializer:(FSTSerializerBeta *)serializer { - self = [super initWithDatabase:database - workerDispatchQueue:workerDispatchQueue - connectionTimerID:FSTTimerIDWriteStreamConnectionBackoff - idleTimerID:FSTTimerIDWriteStreamIdle - credentials:credentials - responseMessageClass:[GCFSWriteResponse class]]; - if (self) { - _serializer = serializer; - } - return self; -} - -- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { - return [[GRPCCall alloc] initWithHost:util::WrapNSString(self.databaseInfo->host()) - path:@"/google.firestore.v1beta1.Firestore/Write" - requestsWriter:requestsWriter]; -} - -- (void)startWithDelegate:(id)delegate { - self.handshakeComplete = NO; - [super startWithDelegate:delegate]; -} - -- (void)notifyStreamOpen { - [self.delegate writeStreamDidOpen]; -} - -- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { - id delegate = self.delegate; - self.delegate = nil; - [delegate writeStreamWasInterruptedWithError:error]; -} - -- (void)tearDown { - if ([self isHandshakeComplete]) { - // Send an empty write request to the backend to indicate imminent stream closure. This allows - // the backend to clean up resources. - [self writeMutations:@[]]; - } -} - -- (void)writeHandshake { - // The initial request cannot contain mutations, but must contain a projectID. - HARD_ASSERT([self isOpen], "Not yet open"); - HARD_ASSERT(!self.handshakeComplete, "Handshake sent out of turn"); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - GCFSWriteRequest *request = [GCFSWriteRequest message]; - request.database = [_serializer encodedDatabaseID]; - // TODO(dimond): Support stream resumption. We intentionally do not set the stream token on the - // handshake, ignoring any stream token we might have. - - LOG_DEBUG("FSTWriteStream %s initial request: %s", (__bridge void *)self, request); - [self writeRequest:request]; -} - -- (void)writeMutations:(NSArray *)mutations { - HARD_ASSERT([self isOpen], "Not yet open"); - HARD_ASSERT(self.handshakeComplete, "Mutations sent out of turn"); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - NSMutableArray *protos = [NSMutableArray arrayWithCapacity:mutations.count]; - for (FSTMutation *mutation in mutations) { - [protos addObject:[_serializer encodedMutation:mutation]]; - }; - - GCFSWriteRequest *request = [GCFSWriteRequest message]; - request.writesArray = protos; - request.streamToken = self.lastStreamToken; - - LOG_DEBUG("FSTWriteStream %s mutation request: %s", (__bridge void *)self, request); - [self writeRequest:request]; -} - -/** - * Implements GRXWriteable to receive an inbound message from GRPC, deserialize, and then pass - * that on to the mutationResultsHandler. - */ -- (void)handleStreamMessage:(GCFSWriteResponse *)response { - LOG_DEBUG("FSTWriteStream %s response: %s", (__bridge void *)self, response); - [self.workerDispatchQueue verifyIsCurrentQueue]; - - // Always capture the last stream token. - self.lastStreamToken = response.streamToken; - - if (!self.isHandshakeComplete) { - // The first response is the handshake response - self.handshakeComplete = YES; - - [self.delegate writeStreamDidCompleteHandshake]; - } else { - // A successful first write response means the stream is healthy. - // Note that we could consider a successful handshake healthy, however, the write itself - // might be causing an error we want to back off from. - [self.backoff reset]; - - SnapshotVersion commitVersion = [_serializer decodedVersion:response.commitTime]; - NSMutableArray *protos = response.writeResultsArray; - NSMutableArray *results = [NSMutableArray arrayWithCapacity:protos.count]; - for (GCFSWriteResult *proto in protos) { - [results addObject:[_serializer decodedMutationResult:proto commitVersion:commitVersion]]; - }; - - [self.delegate writeStreamDidReceiveResponseWithVersion:commitVersion mutationResults:results]; - } -} - -@end diff --git a/Firestore/Source/Util/FSTDispatchQueue.h b/Firestore/Source/Util/FSTDispatchQueue.h index 7f9d6f2a9a6..7e7b04abecb 100644 --- a/Firestore/Source/Util/FSTDispatchQueue.h +++ b/Firestore/Source/Util/FSTDispatchQueue.h @@ -16,7 +16,7 @@ #import -#include "Firestore/core/src/firebase/firestore/model/types.h" +#include "Firestore/core/src/firebase/firestore/util/async_queue.h" NS_ASSUME_NONNULL_BEGIN @@ -144,6 +144,8 @@ typedef NS_ENUM(NSInteger, FSTTimerID) { /** The underlying wrapped dispatch_queue_t */ @property(nonatomic, strong, readonly) dispatch_queue_t queue; +- (firebase::firestore::util::AsyncQueue *)implementation; + @end NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Util/FSTDispatchQueue.mm b/Firestore/Source/Util/FSTDispatchQueue.mm index b921484f84a..76ea32194b6 100644 --- a/Firestore/Source/Util/FSTDispatchQueue.mm +++ b/Firestore/Source/Util/FSTDispatchQueue.mm @@ -21,7 +21,6 @@ #import "Firestore/Source/Util/FSTDispatchQueue.h" -#include "Firestore/core/src/firebase/firestore/util/async_queue.h" #include "Firestore/core/src/firebase/firestore/util/executor_libdispatch.h" #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "absl/memory/memory.h" @@ -63,6 +62,10 @@ @implementation FSTDispatchQueue { std::unique_ptr _impl; } +- (AsyncQueue *)implementation { + return _impl.get(); +} + + (TimerId)convertTimerId:(FSTTimerID)objcTimerID { const TimerId converted = static_cast(objcTimerID); switch (converted) { diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_connection.h b/Firestore/core/src/firebase/firestore/remote/grpc_connection.h index f440c3817c5..21b854b046a 100644 --- a/Firestore/core/src/firebase/firestore/remote/grpc_connection.h +++ b/Firestore/core/src/firebase/firestore/remote/grpc_connection.h @@ -19,6 +19,7 @@ #include #include +#include #include #include "Firestore/core/src/firebase/firestore/auth/token.h" @@ -29,6 +30,7 @@ #include "Firestore/core/src/firebase/firestore/remote/grpc_stream_observer.h" #include "Firestore/core/src/firebase/firestore/remote/grpc_streaming_reader.h" #include "Firestore/core/src/firebase/firestore/remote/grpc_unary_call.h" +#include "Firestore/core/src/firebase/firestore/util/path.h" #include "absl/strings/string_view.h" #include "grpcpp/channel.h" #include "grpcpp/client_context.h" @@ -80,26 +82,20 @@ class GrpcConnection { void Unregister(GrpcCall* call); /** - * For tests only: use a custom root certificate file and the given SSL - * target name for all connections. Call before creating any streams or calls. + * Don't use SSL, send all traffic unencrypted. Call before creating any + * streams or calls. */ - static void UseTestCertificate(absl::string_view certificate_path, - absl::string_view target_name); + static void UseInsecureChannel(const std::string& host); /** - * For tests only: don't use SSL, send all traffic unencrypted. Call before - * creating any streams or calls. Overrides a test certificate. + * For tests only: use a custom root certificate file and the given SSL + * target name for all connections. Call before creating any streams or calls. */ - static void UseInsecureChannel(); + static void UseTestCertificate(const std::string& host, + const util::Path& certificate_path, + const std::string& target_name); private: - struct TestCredentials { - std::string certificate_path; - std::string target_name; - bool use_insecure_channel = false; - }; - static TestCredentials* test_credentials_; - std::unique_ptr CreateContext( const auth::Token& credential) const; std::shared_ptr CreateChannel() const; diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm b/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm index eb77d856248..6c3aa43a5be 100644 --- a/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm +++ b/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm @@ -25,6 +25,7 @@ #include "Firestore/core/include/firebase/firestore/firestore_errors.h" #include "Firestore/core/src/firebase/firestore/auth/token.h" #include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h" #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_format.h" @@ -40,6 +41,7 @@ using auth::Token; using core::DatabaseInfo; using model::DatabaseId; +using util::Path; using util::Status; using util::StringFormat; @@ -52,9 +54,43 @@ return view.data() ? std::string{view.data(), view.size()} : std::string{}; } -} // namespace +std::string LoadCertificate(const Path& path) { + std::ifstream certificate_file{path.native_value()}; + HARD_ASSERT(certificate_file.good(), + StringFormat("Unable to open root certificates at file path %s", + path.ToUtf8String()) + .c_str()); + + std::stringstream buffer; + buffer << certificate_file.rdbuf(); + return buffer.str(); +} + +std::shared_ptr CreateSslCredentials( + const Path& certificate_path) { + grpc::SslCredentialsOptions options; + options.pem_root_certs = LoadCertificate(certificate_path); + return grpc::SslCredentials(options); +} + +struct HostConfig { + util::Path certificate_path; + std::string target_name; + bool use_insecure_channel = false; +}; + +using ConfigByHost = std::unordered_map; + +ConfigByHost& Config() { + static ConfigByHost config_by_host_; + return config_by_host_; +} -GrpcConnection::TestCredentials* GrpcConnection::test_credentials_ = nullptr; +bool HasSpecialConfig(const std::string& host) { + return Config().find(host) != Config().end(); +} + +} // namespace GrpcConnection::GrpcConnection(const DatabaseInfo& database_info, util::AsyncQueue* worker_queue, @@ -87,7 +123,7 @@ context->set_credentials(grpc::AccessTokenCredentials(MakeString(token))); } - // TODO(dimond): This should ideally also include the grpc version, however, + // TODO(dimond): This should ideally also include the gRPC version, however, // gRPC defines the version as a macro, so it would be hardcoded based on // version we have at compile time of the Firestore library, rather than the // version available at runtime/at compile time by the user of the library. @@ -120,31 +156,26 @@ } std::shared_ptr GrpcConnection::CreateChannel() const { - if (!test_credentials_) { - return grpc::CreateChannel( - database_info_->host(), - grpc::SslCredentials(grpc::SslCredentialsOptions())); - } + const std::string& host = database_info_->host(); - if (test_credentials_->use_insecure_channel) { - return grpc::CreateChannel(database_info_->host(), - grpc::InsecureChannelCredentials()); + if (!HasSpecialConfig(host)) { + Path root_certificate_path = FindGrpcRootCertificate(); + return grpc::CreateChannel(host, + CreateSslCredentials(root_certificate_path)); } - std::ifstream cert_file{test_credentials_->certificate_path}; - HARD_ASSERT(cert_file.good(), - StringFormat("Unable to open root certificates at file path %s", - test_credentials_->certificate_path) - .c_str()); - std::stringstream cert_buffer; - cert_buffer << cert_file.rdbuf(); - grpc::SslCredentialsOptions options; - options.pem_root_certs = cert_buffer.str(); + const HostConfig& host_config = Config()[host]; + + // For the case when `Settings.sslEnabled == false`. + if (host_config.use_insecure_channel) { + return grpc::CreateChannel(host, grpc::InsecureChannelCredentials()); + } + // For tests only grpc::ChannelArguments args; - args.SetSslTargetNameOverride(test_credentials_->target_name); - return grpc::CreateCustomChannel(database_info_->host(), - grpc::SslCredentials(options), args); + args.SetSslTargetNameOverride(host_config.target_name); + return grpc::CreateCustomChannel( + host, CreateSslCredentials(host_config.certificate_path), args); } std::unique_ptr GrpcConnection::CreateStream( @@ -210,30 +241,24 @@ } /*static*/ void GrpcConnection::UseTestCertificate( - absl::string_view certificate_path, absl::string_view target_name) { - HARD_ASSERT(!certificate_path.empty(), "Empty path to test certificate"); + const std::string& host, + const Path& certificate_path, + const std::string& target_name) { + HARD_ASSERT(!host.empty(), "Empty host name"); + HARD_ASSERT(!certificate_path.native_value().empty(), + "Empty path to test certificate"); HARD_ASSERT(!target_name.empty(), "Empty SSL target name"); - if (!test_credentials_) { - // Deliberately never deleted. - test_credentials_ = new TestCredentials{}; - } - - test_credentials_->certificate_path = - std::string{certificate_path.data(), certificate_path.size()}; - test_credentials_->target_name = - std::string{target_name.data(), target_name.size()}; - // TODO(varconst): hostname if necessary. + HostConfig& host_config = Config()[host]; + host_config.certificate_path = certificate_path; + host_config.target_name = target_name; } -/*static*/ void GrpcConnection::UseInsecureChannel() { - if (!test_credentials_) { - // Deliberately never deleted. - test_credentials_ = new TestCredentials{}; - } +/*static*/ void GrpcConnection::UseInsecureChannel(const std::string& host) { + HARD_ASSERT(!host.empty(), "Empty host name"); - test_credentials_->use_insecure_channel = true; - // TODO(varconst): hostname if necessary. + HostConfig& host_config = Config()[host]; + host_config.use_insecure_channel = true; } } // namespace remote diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h b/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h new file mode 100644 index 00000000000..9fd97406284 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h @@ -0,0 +1,39 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_REMOTE_GRPC_ROOT_CERTIFICATE_FINDER_H_ +#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_REMOTE_GRPC_ROOT_CERTIFICATE_FINDER_H_ + +#include + +#include "Firestore/core/src/firebase/firestore/util/path.h" + +namespace firebase { +namespace firestore { +namespace remote { + +/** + * Finds the file containing gRPC root certificates (`roots.pem`, must be among + * resources accessible by Firestore) and returns its path. Will trigger + * assertion failure if the file cannot be found. + */ +util::Path FindGrpcRootCertificate(); + +} // namespace remote +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_REMOTE_GRPC_ROOT_CERTIFICATE_FINDER_H_ diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm b/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm new file mode 100644 index 00000000000..07e813b1869 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h" + +#include "Firestore/core/src/firebase/firestore/util/hard_assert.h" +#include "Firestore/core/src/firebase/firestore/util/string_apple.h" + +#import "Firestore/Source/Core/FSTFirestoreClient.h" + +namespace firebase { +namespace firestore { +namespace remote { + +using util::Path; + +Path FindGrpcRootCertificate() { + // TODO(varconst): uncomment these lines once it's possible to load the + // certificate from gRPC-C++ pod. + // NSBundle* bundle = [NSBundle bundleWithIdentifier:@"org.cocoapods.grpcpp"]; + // HARD_ASSERT(bundle, "Could not find grpcpp bundle"); + + // `mainBundle` may be nil in certain cases (e.g., unit tests). + NSBundle* bundle = [NSBundle bundleForClass:FSTFirestoreClient.class]; + HARD_ASSERT(bundle, "Could not find Firestore bundle"); + NSString* path = + [bundle pathForResource:@"gRPCCertificates.bundle/roots" ofType:@"pem"]; + HARD_ASSERT( + path, + "Could not load root certificates from the bundle. SSL won't work."); + + return Path::FromNSString(path); +} + +} // namespace remote +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/remote/stream.h b/Firestore/core/src/firebase/firestore/remote/stream.h index 22a9856bb18..669c3815b0c 100644 --- a/Firestore/core/src/firebase/firestore/remote/stream.h +++ b/Firestore/core/src/firebase/firestore/remote/stream.h @@ -57,6 +57,10 @@ namespace remote { * * Streams are stateful and need to be `Start`ed before messages can * be sent and received. A `Stream` can be started and stopped repeatedly. + * + * All public virtual methods exist only for the sake of tests; the methods that + * are expected to be implemented by "normal" derived classes are pure virtual + * and private. */ class Stream : public GrpcStreamObserver, public std::enable_shared_from_this { @@ -129,7 +133,7 @@ class Stream : public GrpcStreamObserver, * * When start returns, `IsStarted` will return true. */ - void Start(); + virtual void Start(); /** * Stops the stream. This call is idempotent and allowed regardless of the @@ -137,7 +141,7 @@ class Stream : public GrpcStreamObserver, * * When stop returns, `IsStarted` and `IsOpen` will both return false. */ - void Stop(); + virtual void Stop(); /** * Returns true if `Start` has been called and no error has occurred. True @@ -146,13 +150,13 @@ class Stream : public GrpcStreamObserver, * actual stream). Use `IsOpen` to determine if the stream is open and ready * for outbound requests. */ - bool IsStarted() const; + virtual bool IsStarted() const; /** * Returns true if the underlying stream is open (`OnStreamStart` has been * called) and the stream is ready for outbound requests. */ - bool IsOpen() const; + virtual bool IsOpen() const; /** * After an error, the stream will usually back off on the next attempt to diff --git a/Firestore/core/src/firebase/firestore/remote/watch_stream.h b/Firestore/core/src/firebase/firestore/remote/watch_stream.h index 010bbe07288..43b1ef32f7f 100644 --- a/Firestore/core/src/firebase/firestore/remote/watch_stream.h +++ b/Firestore/core/src/firebase/firestore/remote/watch_stream.h @@ -62,13 +62,14 @@ class WatchStream : public Stream { * query will be streamed back as WatchChange messages that reference the * target ID included in `query`. */ - void WatchQuery(FSTQueryData* query); + virtual /*virtual for tests only*/ void WatchQuery(FSTQueryData* query); /** * Unregisters interest in the results of the query associated with the given * `target_id`. */ - void UnwatchTargetId(model::TargetId target_id); + virtual /*virtual for tests only*/ void UnwatchTargetId( + model::TargetId target_id); private: std::unique_ptr CreateGrpcStream( diff --git a/Firestore/core/src/firebase/firestore/remote/write_stream.h b/Firestore/core/src/firebase/firestore/remote/write_stream.h index 4231d2bf14f..8e34e3eac25 100644 --- a/Firestore/core/src/firebase/firestore/remote/write_stream.h +++ b/Firestore/core/src/firebase/firestore/remote/write_stream.h @@ -55,6 +55,9 @@ namespace remote { * request is received, all pending mutations may be submitted. When * submitting multiple batches of mutations at the same time, it's * okay to use the same stream token for the calls to `WriteMutations`. + * + * This class is not intended as a base class; all virtual methods exist only + * for the sake of tests. */ class WriteStream : public Stream { public: @@ -87,10 +90,16 @@ class WriteStream : public Stream { * Sends an initial stream token to the server, performing the handshake * required to make the StreamingWrite RPC work. */ - void WriteHandshake(); + virtual void WriteHandshake(); /** Sends a group of mutations to the Firestore backend to apply. */ - void WriteMutations(NSArray* mutations); + virtual void WriteMutations(NSArray* mutations); + + protected: + // For tests only + void SetHandshakeComplete(bool value = true) { + handshake_complete_ = value; + } private: std::unique_ptr CreateGrpcStream( diff --git a/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc b/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc index 52d20041951..7d07b94920b 100644 --- a/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc +++ b/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc @@ -300,11 +300,7 @@ TEST_F(GrpcStreamTest, WriteAndFinish) { KeepPollingGrpcQueue(); worker_queue.EnqueueBlocking([&] { - bool did_last_write = stream->WriteAndFinish({}); - // Canceling gRPC context is not used in this test, so the write operation - // won't come back from the completion queue. - EXPECT_FALSE(did_last_write); - + // Ignore the returned result; last write may or may not finish fast enough EXPECT_EQ(observed_states(), States({"OnStreamStart"})); }); } diff --git a/Firestore/etc/roots.pem b/Firestore/etc/roots.pem new file mode 100644 index 00000000000..3e6bbcd76ea --- /dev/null +++ b/Firestore/etc/roots.pem @@ -0,0 +1,4342 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Label: "NetLock Arany (Class Gold) Főtanúsítvány" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- From 03a0b0b2d156a8eb144a7779f2cd9c981d25ace1 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Fri, 26 Oct 2018 00:02:31 -0400 Subject: [PATCH 031/102] Add component system documentation. --- Interop/Firebase Component System.md | 449 +++++++++++++++++++++++++++ 1 file changed, 449 insertions(+) create mode 100644 Interop/Firebase Component System.md diff --git a/Interop/Firebase Component System.md b/Interop/Firebase Component System.md new file mode 100644 index 00000000000..3c965ea080d --- /dev/null +++ b/Interop/Firebase Component System.md @@ -0,0 +1,449 @@ +# Using Core's Component System + +FirebaseCore has a dependency injection system (referred to as "Interop") used to depend on +functionalities provided by other Firebase SDKs. This gives the ability to depend on a typesafe +interface-only API to consume without depending on the entire SDK and simulate optional dependencies + - depending on the definition but not the implementing SDK and only functioning when the +implementing SDK is included. + +//TODO(ryanwilson): Table of Contents + +## Overview + +When a Firebase SDK wants to provide functionality to another Firebase SDK, it must be done through +the Interop system. Both SDKs depend on a shared protocol that describes the functionality provided +by one SDK and required by the other. Let's use `A` and `B`, where `B` depends on functionality +provided by `A` and the functionality is described by protocol `AInterop`. + +During configuration, `A` tells Core that it provides functionality for `AInterop` and `B` tells +Core it would like functionality `AInterop` (and specifies whether it is required or optional) as +well as how to instantiate an instance of `B`. When a developer requests `B`, FirebaseCore +instantiates `B` and passes a container that contains the instance of `A` that provides `AInterop`. + +`B` has no idea what class `A` is, and it doesn't need to. All `B` needs to know is that it has an +instance of an object that conforms to `AInterop` and provides the functionality it needs. + +This system allows Firebase SDKs to depend on each other in a typesafe way and allows us to +explicitly declare version dependencies on the interfaces required instead of the SDK version. + +## Protocol Only Frameworks + +In order to share protocols between two SDKs, we introduced header only frameworks that declare the +desired protocol(s). + +The naming convention for the framework should be `Interop` but the protocols don't have a +strict naming guideline other than having a `FIR` prefix in Objective-C. + +Both the implementing and dependent SDK will have a required dependency on this `Interop` +framework: the implementing SDK must conform to the protocols defined and register it with Core, +while the dependent SDK will use the protocol definition to use methods defined by it. + +An Interop framework can have multiple protocols, but all should be implemented by the SDK it is +named after. + +Protocols *can not* declare class methods. This is an intentional decision to ensure all interfaces +interact properly based on the `FIRApp` that's used. + +## Types and Core API + +For the rest of the documentation, it's important to be familiar with the various classes and API +provided by Core. Since the SDKs are written in Objective-C, we'll use the Objective-C names. The +Swift names are identical but dropping the `FIR` prefix. + +- `@class FIRDependency` + - A dependency on a specific protocol's functionality. Created with the factory method + `[FIRDependency dependencyWithProtocol:isRequired:]` +- `@class FIRComponent` + - A component to register with Core to be consumed by other SDKs. It declares the protocol + offered, dependencies, and a block for Core to instantiate it. +- `@class FIRComponentContainer` + - A container that holds different components that are registered with Core. +- `@protocol FIRComponentRegistrant` + - Describes functionality for SDKs registering components in the `FIRComponentContainer`. It + allows Core to fetch components lazily from the SDK. +- `#define FIR_COMPONENT(protocol, container)` (macro) + - The macro to request an instance conforming to a given protocol from a container. Due to + Objective-C's lightweight generic system, the safest and most readable API is provided by a + macro that uses internal types to give compiler warnings if a developer tries to assign the + result to a variable with the incorrect type. + +## Registering with Core + +Each Firebase SDK should register with Core in the `+load` method of the class conforming to +`FIRComponentRegistrant`. This needs to happen at `+load` time because Core needs to resolve any +dependencies before a class has a chance to be called by a developer (if called at all). + +``` +#import +#import + +@interface FIRFoo +@end + +@implementation FIRFoo + ++ (void)load { + // Register with Core's container. + [FIRComponentContainer registerAsComponentRegistrant:self]; +} + +// TODO: Conform to `FIRComponentRegistrant`. See later sections for more information. + +@end +``` + +### Singletons and Instance Management + +All Firebase SDKs provide singleton access for convenience that map to a specific `FIRApp`: +`[FIRAuth auth]`, `[FIRFunctions functionsForApp:]`, etc. Some SDKs can also have multiple instances +per `FIRApp` such as Storage: `[FIRStorage storageForApp:URL:]`. + +These instances must be created and managed by Core through the component system. This allows the +`FIRApp` lifecycle to control the lifecycle of instances associated with itself. There are different +ways to do so depending on the SDK's situation. + +#### Single Instance per `FIRApp` + +The registration for a single instance per `FIRApp` changes if the SDK provides functionality to +other SDKs or not. + +##### SDK does not provide functionality (example: Functions) + +In this case, the SDK is a "leaf node" since no SDKs depend on it. It has a private, empty protocol +that it uses to register with the container. Using Functions as an example: + +``` +// FIRFunctions.h + +/// Empty protocol to register Functions as a component with Core. +@protocol FIRFunctionsInstanceProvider +@end + +/// Privately conform to the protocol for component registration. +@interface FIRFunctions () +@end + +@implementation FIRFunctions + ++ (void)load { + [FIRComponentContainer registerAsComponentRegistrant:self]; +} + +/// The array of components to register with Core. Since Functions is a leaf node and +/// doesn't provide any functionality to other SDKs, it should use Core for instance +/// management only. ++ (NSArray *)componentsToRegister { + // Each component needs a block for Core to call in order to instantiate instances of the + // desired class. + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + // We want the same instance to be returned when requested from the container, enable + // `isCacheable`. + *isCacheable = YES; + + // Use an appropriate initializer and inject anything required from the container. + return [[FIRFunctions alloc] initWithApp:container.app]; + }; + + // Create the component that can create instances of `FIRFunctions`. + FIRComponent *internalProvider = + [FIRComponent componentWithProtocol:@protocol(FIRFunctionsInstanceProvider) + creationBlock:creationBlock]; + + // Return the array of components, in this case only the internal instance provider. + return @[ internalProvider ]; +} + ++ (FIRFunctions *)functionsWithApp:(FIRApp *)app { + // Get the instance from the `FIRApp`'s container. This will create a new instance the + // first time it is called, and since `isCacheable` is set in the component creation + // block, it will return the existing instance on subsequent calls. + id instance = + FIR_COMPONENT(FIRFunctionsInstanceProvider, app.container); + + // In the component creation block, we return an instance of `FIRFunctions`. Cast it and + // return it. + return (FIRFunctions *)instance; +} + +// ... Other `FIRFunctions` methods. + +@end +``` + +##### SDK provides functionality to other SDKs (example: Auth) + +This example will be very similar to the one above, but let's define a simple protocol that Auth +could conform to and provide to other SDKs: + +``` +// FIRAuthInterop.h in the FirebaseAuthInterop framework. + +@protocol FIRAuthInterop +/// Get the current Auth user's UID. Returns nil if there is no user signed in. +- (nullable NSString *)getUserID; +@end +``` + +``` +// FIRAuth.m in the FirebaseAuth framework. + +/// Privately conform to the protocol for interop and component registration. +@interface FIRAuth () +@end + +/// The components to register with Core. ++ (NSArray *)componentsToRegister { + // Provide a component that will return an instance of `FIRAuth`. + FIRComponentCreationBlock authCreationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + // Cache so the same `FIRAuth` instance is returned each time. + *isCacheable = YES; + return [[FIRAuth alloc] initWithApp:container.app]; + }; + FIRComponent *authInterop = + [FIRComponent componentWithProtocol:@protocol(FIRAuthInteroperable) + creationBlock:authCreationBlock]; + return @[authInterop]; +} + ++ (FIRAuth *)authWithApp:(FIRApp *)app { + // Use the instance from the provided app's container. + id auth = FIR_COMPONENT(FIRAuthInteroperable, app.container); + return (FIRAuth *)auth; +} +``` + +#### Multiple Instances per `FIRApp` + +Instead of directly providing an instance from the container, Firestore and similar SDKs should +create a "provider" that stores and creates instances with the required parameters. This means a +single provider per `FIRApp`, but multiple instances are possible per provider. + +``` +/// Provider protocol to register with Core. +@protocol FSTFirestoreMultiDBProvider + +/// Cached instances of Firestore objects. +@property(nonatomic, strong) NSMutableDictionary *instances; + +/// Firestore can be initialized with an app as well as a database. The instance provider is already +/// associated with a `FIRApp` so pass in any other required parameters (in this case, just the +/// database string). +- (FIRFirestore *)firestoreForDatabase:(NSString *)database; + +@end +``` + +Instead of the Firestore class conforming to `FSTInstanceProvider`, the work can be done in a +separate class to keep `Firestore.m` cleaner. + +``` +/// A concrete implementation for FSTFirestoreMultiDBProvider to create Firestore instances. +@interface FSTFirestoreComponent : NSObject + +/// The `FIRApp` that instances will be set up with. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Cached instances of Firestore objects. +@property(nonatomic, strong) NSMutableDictionary *instances; + +/// Default method for retrieving a Firestore instance, or creating one if it doesn't exist. +- (FIRFirestore *)firestoreForDatabase:(NSString *)database; + +/// Default initializer. +- (instancetype)initWithApp:(FIRApp *)app NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; +@end + +@implementation FSTFirestoreInstanceProvider + +// Explicitly @synthesize because instances is part of the FSTInstanceProvider protocol. +@synthesize instances = _instances; + ++ (void)load { + // Don't forget to register! + [FIRComponentContainer registerAsComponentRegistrant:self]; +} + +- (instancetype)initWithApp:(FIRApp *)app { + self = [super init]; + if (self) { + _instances = [[NSMutableDictionary alloc] init]; + _app = app; + } + return self; +} + +/// `FSTFirestoreMultiDBProvider` conformance. +- (FIRFirestore *)firestoreForDatabase:(NSString *)database { + // Regular initialization code to create Firestore instances with required parameters... +} + +// `FIRComponentRegistrant` conformance. ++ (NSArray *)componentsToRegister { + // Ignore any dependencies for simplicity in this example. + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + *isCacheable = YES; + + // NOTE: Instead of returning an instance of Firestore, return an instance of the + // instance provider. + return [[FIRFirestoreComponent alloc] initWithApp:container.app]; + }; + FIRComponent *firestoreProvider = + [FIRComponent componentWithProtocol:@protocol(FSTFirestoreMultiDBProvider) + creationBlock:creationBlock]; + return @[ firestoreProvider ]; +} + +@end +``` + +All `Firestore.m` needs to do now is call the component container from the singleton calls: + +``` ++ (instancetype)firestoreForApp:(FIRApp *)app database:(NSString *)database { + id provider = + FIR_COMPONENT(FSTFirestoreMultiDBProvider, app.container); + return [provider firestoreForDatabase:database]; +} +``` + +### Depending on Functionality from Another SDK + +*If you haven't already read [Registering with Core](#registering-with-core), please do so until you +get back to this spot as it lays the groundwork necessary to understand this section.* + +Adding dependencies is easy once components are registered with Core. Let's take the example from +Functions above and add a dependency to `FIRAuthInterop` defined above. + +**Important**: You will also need to add a dependency on the `FirebaseAuthInterop` pod to your SDK's + podspec and any package manager supported. + +Before adding the dependency on `FIRAuthInterop`. + +``` ++ (NSArray *)componentsToRegister { + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + *isCacheable = YES; + return [[FIRFunctions alloc] initWithApp:container.app]; + }; + + FIRComponent *internalProvider = + [FIRComponent componentWithProtocol:@protocol(FIRFunctionsInstanceProvider) + creationBlock:creationBlock]; + + return @[ internalProvider ]; +} +``` + +After adding the dependency on `FIRAuthInterop`. See comments with "ADDED:". + +``` ++ (NSArray *)componentsToRegister { + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + *isCacheable = YES; + + // ADDED: Retrieve an instance that conforms to `FIRAuthInterop` from the container. + id auth = FIR_COMPONENT(FIRAuthInterop, container); + + // ADDED: Note the constructor has a new parameter: auth. It's good practice to inject + // the instance needed in the constructor instead of pulling it from the app + // passed in. This allows for better unit testing with fakes since any object + // can conform to `FIRAuthInterop` and be verified easily. + return [[FIRFunctions alloc] initWithApp:container.app auth:auth]; + }; + + // ADDED: Define a dependency on the `FIRAuthInteroperable` protocol. Declare if the + // dependency is required or not. + FIRDependency *auth = + [FIRDependency dependencyWithProtocol:@protocol(FIRAuthInteroperable) + isRequired:NO]; + + // ADDED: A longer constructor is used to instantiate the `FIRComponent`; this time + // it includes instantiation timing and an array of dependencies. The timing + // allows components to be initialized upon configure time or lazily, when + // it is requested from the container. Pass in the `auth` dependency created + // above. + FIRComponent *internalProvider = + [FIRComponent componentWithProtocol:@protocol(FIRFunctionsInstanceProvider) + instantiationTiming:FIRInstantiationTimingLazy + dependencies:@[ auth ] + creationBlock:creationBlock]; + + return @[ internalProvider ]; +} +``` + +Based on the new constructor, Functions can now use the `auth` instance as defined by the +protocol: + +``` +NSString *userID = [auth getUserID]; +if (userID) { + // Auth is available and a user is signed in! +} +``` + +## Advanced Use Cases + +### Providing Multiple Components and Sharing Instances + +Consider a situation where an SDK wants to offer functionality defined in multiple protocols +with the same instance. For example, Auth could provide `FIRAuthUserInterop` and +`FIRAuthSignInInterop`. If a single Auth instance should be shared between those two protocols, the +system currently doesn't work. + +In order to alleviate this, Auth could create a third (internal only) protocol +(`FIRAuthCombinedInterop`) that conforms to both `FIRAuthUserInterop` and `FIRAuthSignInInterop` and +becomes a dependency for each of those two components and returned in the component creation block. +An abbreviated code sample: + +``` + ++ (NSArray *)componentsToRegister { + // Standard creation block to get an instance of Auth. + FIRComponentCreationBlock authBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + *isCacheable = YES; + return [[FIRAuth alloc] initWithApp:container.app]; + }; + + FIRComponentCreationBlock combinedBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + // No need to cache, let it use the cached value from the combined component. + return FIR_COMPONENT(FIRAuthCombinedInterop, container); + }; + + // Declare a self dependency on the combined interop component. + FIRDependency *auth = + [FIRDependency dependencyWithProtocol:@protocol(FIRAuthCombinedInterop) + isRequired:YES]; + + // Declare the three components provided. + FIRComponent *authComponent = + [FIRComponent componentWithProtocol:@protocol(FIRAuthCombinedInterop) + creationBlock:authBlock]; + + // Both the user and sign in components depend on the previous component as + // declared in the dependency above. + + FIRComponent *userComponent = + [FIRComponent componentWithProtocol:@protocol(FIRAuthUserInterop) + instantiationTiming:FIRInstantiationTimingLazy + dependencies:@[ auth ] + creationBlock:combinedBlock]; + + FIRComponent *signInComponent = + [FIRComponent componentWithProtocol:@protocol(FIRAuthSignInInterop) + instantiationTiming:FIRInstantiationTimingLazy + dependencies:@[ auth ] + creationBlock:combinedBlock]; + + return @[ authComponent, userComponent, signInComponent ]; +} +``` From 049ba691e550fbd6e77a3973a9e5cf0c2a04a3c1 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Fri, 26 Oct 2018 00:15:29 -0400 Subject: [PATCH 032/102] Fixed markdown layout issue. --- Interop/Firebase Component System.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Interop/Firebase Component System.md b/Interop/Firebase Component System.md index 3c965ea080d..796efe324b7 100644 --- a/Interop/Firebase Component System.md +++ b/Interop/Firebase Component System.md @@ -2,9 +2,9 @@ FirebaseCore has a dependency injection system (referred to as "Interop") used to depend on functionalities provided by other Firebase SDKs. This gives the ability to depend on a typesafe -interface-only API to consume without depending on the entire SDK and simulate optional dependencies - - depending on the definition but not the implementing SDK and only functioning when the -implementing SDK is included. +interface-only API to consume without depending on the entire SDK and simulates optional +dependencies - depending on the definition but not the implementing SDK and only functioning when +the implementing SDK is included. //TODO(ryanwilson): Table of Contents From 44d5a0e57e913248f0da3b35deca44592022eae9 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Fri, 26 Oct 2018 09:12:50 -0400 Subject: [PATCH 033/102] Remove trailing whitespaces. --- Interop/Firebase Component System.md | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Interop/Firebase Component System.md b/Interop/Firebase Component System.md index 3c965ea080d..02b53371b83 100644 --- a/Interop/Firebase Component System.md +++ b/Interop/Firebase Component System.md @@ -15,7 +15,7 @@ the Interop system. Both SDKs depend on a shared protocol that describes the fun by one SDK and required by the other. Let's use `A` and `B`, where `B` depends on functionality provided by `A` and the functionality is described by protocol `AInterop`. -During configuration, `A` tells Core that it provides functionality for `AInterop` and `B` tells +During configuration, `A` tells Core that it provides functionality for `AInterop` and `B` tells Core it would like functionality `AInterop` (and specifies whether it is required or optional) as well as how to instantiate an instance of `B`. When a developer requests `B`, FirebaseCore instantiates `B` and passes a container that contains the instance of `A` that provides `AInterop`. @@ -126,7 +126,7 @@ that it uses to register with the container. Using Functions as an example: @implementation FIRFunctions + (void)load { - [FIRComponentContainer registerAsComponentRegistrant:self]; + [FIRComponentContainer registerAsComponentRegistrant:self]; } /// The array of components to register with Core. Since Functions is a leaf node and @@ -146,7 +146,7 @@ that it uses to register with the container. Using Functions as an example: }; // Create the component that can create instances of `FIRFunctions`. - FIRComponent *internalProvider = + FIRComponent *internalProvider = [FIRComponent componentWithProtocol:@protocol(FIRFunctionsInstanceProvider) creationBlock:creationBlock]; @@ -158,13 +158,13 @@ that it uses to register with the container. Using Functions as an example: // Get the instance from the `FIRApp`'s container. This will create a new instance the // first time it is called, and since `isCacheable` is set in the component creation // block, it will return the existing instance on subsequent calls. - id instance = + id instance = FIR_COMPONENT(FIRFunctionsInstanceProvider, app.container); // In the component creation block, we return an instance of `FIRFunctions`. Cast it and // return it. return (FIRFunctions *)instance; -} +} // ... Other `FIRFunctions` methods. @@ -201,7 +201,7 @@ could conform to and provide to other SDKs: *isCacheable = YES; return [[FIRAuth alloc] initWithApp:container.app]; }; - FIRComponent *authInterop = + FIRComponent *authInterop = [FIRComponent componentWithProtocol:@protocol(FIRAuthInteroperable) creationBlock:authCreationBlock]; return @[authInterop]; @@ -264,7 +264,7 @@ separate class to keep `Firestore.m` cleaner. + (void)load { // Don't forget to register! - [FIRComponentContainer registerAsComponentRegistrant:self]; + [FIRComponentContainer registerAsComponentRegistrant:self]; } - (instancetype)initWithApp:(FIRApp *)app { @@ -332,12 +332,12 @@ Before adding the dependency on `FIRAuthInterop`. return [[FIRFunctions alloc] initWithApp:container.app]; }; - FIRComponent *internalProvider = + FIRComponent *internalProvider = [FIRComponent componentWithProtocol:@protocol(FIRFunctionsInstanceProvider) creationBlock:creationBlock]; return @[ internalProvider ]; -} +} ``` After adding the dependency on `FIRAuthInterop`. See comments with "ADDED:". @@ -350,7 +350,7 @@ After adding the dependency on `FIRAuthInterop`. See comments with "ADDED:". // ADDED: Retrieve an instance that conforms to `FIRAuthInterop` from the container. id auth = FIR_COMPONENT(FIRAuthInterop, container); - + // ADDED: Note the constructor has a new parameter: auth. It's good practice to inject // the instance needed in the constructor instead of pulling it from the app // passed in. This allows for better unit testing with fakes since any object @@ -360,7 +360,7 @@ After adding the dependency on `FIRAuthInterop`. See comments with "ADDED:". // ADDED: Define a dependency on the `FIRAuthInteroperable` protocol. Declare if the // dependency is required or not. - FIRDependency *auth = + FIRDependency *auth = [FIRDependency dependencyWithProtocol:@protocol(FIRAuthInteroperable) isRequired:NO]; @@ -376,7 +376,7 @@ After adding the dependency on `FIRAuthInterop`. See comments with "ADDED:". creationBlock:creationBlock]; return @[ internalProvider ]; -} +} ``` Based on the new constructor, Functions can now use the `auth` instance as defined by the @@ -420,7 +420,7 @@ An abbreviated code sample: }; // Declare a self dependency on the combined interop component. - FIRDependency *auth = + FIRDependency *auth = [FIRDependency dependencyWithProtocol:@protocol(FIRAuthCombinedInterop) isRequired:YES]; @@ -431,13 +431,13 @@ An abbreviated code sample: // Both the user and sign in components depend on the previous component as // declared in the dependency above. - + FIRComponent *userComponent = [FIRComponent componentWithProtocol:@protocol(FIRAuthUserInterop) instantiationTiming:FIRInstantiationTimingLazy dependencies:@[ auth ] creationBlock:combinedBlock]; - + FIRComponent *signInComponent = [FIRComponent componentWithProtocol:@protocol(FIRAuthSignInInterop) instantiationTiming:FIRInstantiationTimingLazy @@ -445,5 +445,5 @@ An abbreviated code sample: creationBlock:combinedBlock]; return @[ authComponent, userComponent, signInComponent ]; -} +} ``` From 07b7ed8ef5cdbe5cd7b56b6b66e6082ded6e05b1 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Fri, 26 Oct 2018 09:52:50 -0400 Subject: [PATCH 034/102] Add table of contents. --- Interop/Firebase Component System.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Interop/Firebase Component System.md b/Interop/Firebase Component System.md index efe80eba930..da295d7a219 100644 --- a/Interop/Firebase Component System.md +++ b/Interop/Firebase Component System.md @@ -6,7 +6,21 @@ interface-only API to consume without depending on the entire SDK and simulates dependencies - depending on the definition but not the implementing SDK and only functioning when the implementing SDK is included. -//TODO(ryanwilson): Table of Contents +## Table of Contents + +- [Overview](#overview) +- [Protocol Only Frameworks](#protocol-only-frameworks) +- [Types and Core API](#types-and-core-api) +- [Registering with Core](#registering-with-core) + - [Singletons and Instance Management](#singletons-and-instance-management) + - [Single Instance per `FIRApp`](#single-instance-per-firapp) + - [SDK does not provide functionality (example: Functions)](#sdk-does-not-provide-functionality-\(example:-functions\)) + - [SDK provides functionality to other SDKs (example: Auth)](#sdk-provides-functionality-to-other-SDKs-\(example:-auth\)) + - [Multiple Instances per FIRApp](#multiple-instances-per-firapp) + - [Depending on Functionality from Another SDK](#depending-on-functionality-from-another-sdk) +- [Advanced Use Cases](#advanced-use-cases) + - [Providing Multiple Components and Sharing Instances](#providing-multiple-components-and-sharing-instances) + ## Overview From c8c7a0430f0a630704c688a25abee453a9aaa72f Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Fri, 26 Oct 2018 09:55:36 -0400 Subject: [PATCH 035/102] Remove extra parentheses from TOC. --- Interop/Firebase Component System.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Interop/Firebase Component System.md b/Interop/Firebase Component System.md index da295d7a219..de5283cf544 100644 --- a/Interop/Firebase Component System.md +++ b/Interop/Firebase Component System.md @@ -14,8 +14,8 @@ the implementing SDK is included. - [Registering with Core](#registering-with-core) - [Singletons and Instance Management](#singletons-and-instance-management) - [Single Instance per `FIRApp`](#single-instance-per-firapp) - - [SDK does not provide functionality (example: Functions)](#sdk-does-not-provide-functionality-\(example:-functions\)) - - [SDK provides functionality to other SDKs (example: Auth)](#sdk-provides-functionality-to-other-SDKs-\(example:-auth\)) + - [SDK does not provide functionality (example: Functions)](#sdk-does-not-provide-functionality-(example:-functions)) + - [SDK provides functionality to other SDKs (example: Auth)](#sdk-provides-functionality-to-other-SDKs-(example:-auth)) - [Multiple Instances per FIRApp](#multiple-instances-per-firapp) - [Depending on Functionality from Another SDK](#depending-on-functionality-from-another-sdk) - [Advanced Use Cases](#advanced-use-cases) From b2ba18522dc5f59d86fee06510f91bd1f3855b32 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Fri, 26 Oct 2018 11:04:03 -0400 Subject: [PATCH 036/102] Renamed SDKs to frameworks and products for accuracy. --- Interop/Firebase Component System.md | 94 +++++++++++++++------------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/Interop/Firebase Component System.md b/Interop/Firebase Component System.md index de5283cf544..d12f8a0fe6e 100644 --- a/Interop/Firebase Component System.md +++ b/Interop/Firebase Component System.md @@ -1,10 +1,11 @@ # Using Core's Component System FirebaseCore has a dependency injection system (referred to as "Interop") used to depend on -functionalities provided by other Firebase SDKs. This gives the ability to depend on a typesafe -interface-only API to consume without depending on the entire SDK and simulates optional -dependencies - depending on the definition but not the implementing SDK and only functioning when -the implementing SDK is included. +functionalities provided by other Firebase products (specifically, the frameworks that offer those +products). This gives the ability to depend on a typesafe interface-only API to consume without +depending on the entire product and simulates optional dependencies - depending on the definition +but not the product itself and only functioning when the product implementing that definition is +included. ## Table of Contents @@ -14,20 +15,21 @@ the implementing SDK is included. - [Registering with Core](#registering-with-core) - [Singletons and Instance Management](#singletons-and-instance-management) - [Single Instance per `FIRApp`](#single-instance-per-firapp) - - [SDK does not provide functionality (example: Functions)](#sdk-does-not-provide-functionality-(example:-functions)) - - [SDK provides functionality to other SDKs (example: Auth)](#sdk-provides-functionality-to-other-SDKs-(example:-auth)) + - [Framework does not provide functionality (example: Functions)](#framework-does-not-provide-functionality-(example:-functions)) + - [Framework provides functionality to other Frameworks (example: Auth)](#framework-provides-functionality-to-other-frameworks-(example:-auth)) - [Multiple Instances per FIRApp](#multiple-instances-per-firapp) - - [Depending on Functionality from Another SDK](#depending-on-functionality-from-another-sdk) + - [Depending on Functionality from Another Framework](#depending-on-functionality-from-another-framework) - [Advanced Use Cases](#advanced-use-cases) - [Providing Multiple Components and Sharing Instances](#providing-multiple-components-and-sharing-instances) ## Overview -When a Firebase SDK wants to provide functionality to another Firebase SDK, it must be done through -the Interop system. Both SDKs depend on a shared protocol that describes the functionality provided -by one SDK and required by the other. Let's use `A` and `B`, where `B` depends on functionality -provided by `A` and the functionality is described by protocol `AInterop`. +When a Firebase framework wants to provide functionality to another Firebase framework, it must be +done through the Interop system. Both frameworks depend on a shared protocol in a separate framework +that describes the functionality provided by one framework and required by the other. Let's use `A` +and `B`, where `B` depends on functionality provided by `A` and the functionality is described by +protocol `AInterop`. During configuration, `A` tells Core that it provides functionality for `AInterop` and `B` tells Core it would like functionality `AInterop` (and specifies whether it is required or optional) as @@ -37,23 +39,24 @@ instantiates `B` and passes a container that contains the instance of `A` that p `B` has no idea what class `A` is, and it doesn't need to. All `B` needs to know is that it has an instance of an object that conforms to `AInterop` and provides the functionality it needs. -This system allows Firebase SDKs to depend on each other in a typesafe way and allows us to -explicitly declare version dependencies on the interfaces required instead of the SDK version. +This system allows Firebase frameworks to depend on each other in a typesafe way and allows us to +explicitly declare version dependencies on the interfaces required instead of the product's version. ## Protocol Only Frameworks -In order to share protocols between two SDKs, we introduced header only frameworks that declare the -desired protocol(s). +In order to share protocols between two frameworks, we introduced header only frameworks that +declare the desired protocol(s). -The naming convention for the framework should be `Interop` but the protocols don't have a -strict naming guideline other than having a `FIR` prefix in Objective-C. +The naming convention for the framework should be `Interop` but the protocols don't +have a strict naming guideline other than having a `FIR` prefix in Objective-C. -Both the implementing and dependent SDK will have a required dependency on this `Interop` -framework: the implementing SDK must conform to the protocols defined and register it with Core, -while the dependent SDK will use the protocol definition to use methods defined by it. +Both the implementing and dependent framework will have a required dependency on this +`Interop` framework: the implementing framework must conform to the protocols defined +and register it with Core, while the dependent framework will use the protocol definition to use +methods defined by it. -An Interop framework can have multiple protocols, but all should be implemented by the SDK it is -named after. +An Interop framework can have multiple protocols, but all should be implemented by the product it +is named after. Protocols *can not* declare class methods. This is an intentional decision to ensure all interfaces interact properly based on the `FIRApp` that's used. @@ -61,20 +64,20 @@ interact properly based on the `FIRApp` that's used. ## Types and Core API For the rest of the documentation, it's important to be familiar with the various classes and API -provided by Core. Since the SDKs are written in Objective-C, we'll use the Objective-C names. The -Swift names are identical but dropping the `FIR` prefix. +provided by Core. Since the frameworks are written in Objective-C, we'll use the Objective-C names. +The Swift names are identical but dropping the `FIR` prefix. - `@class FIRDependency` - A dependency on a specific protocol's functionality. Created with the factory method `[FIRDependency dependencyWithProtocol:isRequired:]` - `@class FIRComponent` - - A component to register with Core to be consumed by other SDKs. It declares the protocol + - A component to register with Core to be consumed by other frameworks. It declares the protocol offered, dependencies, and a block for Core to instantiate it. - `@class FIRComponentContainer` - A container that holds different components that are registered with Core. - `@protocol FIRComponentRegistrant` - - Describes functionality for SDKs registering components in the `FIRComponentContainer`. It - allows Core to fetch components lazily from the SDK. + - Describes functionality for frameworks registering components in the `FIRComponentContainer`. It + allows Core to fetch components lazily from the implementing framework. - `#define FIR_COMPONENT(protocol, container)` (macro) - The macro to request an instance conforming to a given protocol from a container. Due to Objective-C's lightweight generic system, the safest and most readable API is provided by a @@ -83,7 +86,7 @@ Swift names are identical but dropping the `FIR` prefix. ## Registering with Core -Each Firebase SDK should register with Core in the `+load` method of the class conforming to +Each Firebase framework should register with Core in the `+load` method of the class conforming to `FIRComponentRegistrant`. This needs to happen at `+load` time because Core needs to resolve any dependencies before a class has a chance to be called by a developer (if called at all). @@ -108,23 +111,24 @@ dependencies before a class has a chance to be called by a developer (if called ### Singletons and Instance Management -All Firebase SDKs provide singleton access for convenience that map to a specific `FIRApp`: -`[FIRAuth auth]`, `[FIRFunctions functionsForApp:]`, etc. Some SDKs can also have multiple instances -per `FIRApp` such as Storage: `[FIRStorage storageForApp:URL:]`. +All Firebase frameworks provide singleton access for convenience that map to a specific `FIRApp`: +`[FIRAuth auth]`, `[FIRFunctions functionsForApp:]`, etc. Some frameworks can also have multiple +instances per `FIRApp` such as Storage: `[FIRStorage storageForApp:URL:]`. These instances must be created and managed by Core through the component system. This allows the `FIRApp` lifecycle to control the lifecycle of instances associated with itself. There are different -ways to do so depending on the SDK's situation. +ways to do so depending on the product's offerings. #### Single Instance per `FIRApp` -The registration for a single instance per `FIRApp` changes if the SDK provides functionality to -other SDKs or not. +The registration for a single instance per `FIRApp` changes if the framwork provides functionality +to other frameworks or not. -##### SDK does not provide functionality (example: Functions) +##### Framework does not provide functionality (example: Functions) -In this case, the SDK is a "leaf node" since no SDKs depend on it. It has a private, empty protocol -that it uses to register with the container. Using Functions as an example: +In this case, the framework is a "leaf node" since no other frameworks depend on functionality from +it. It has a private, empty protocol that it uses to register with the container. Using Functions as +an example: ``` // FIRFunctions.h @@ -144,7 +148,7 @@ that it uses to register with the container. Using Functions as an example: } /// The array of components to register with Core. Since Functions is a leaf node and -/// doesn't provide any functionality to other SDKs, it should use Core for instance +/// doesn't provide any functionality to other frameworks, it should use Core for instance /// management only. + (NSArray *)componentsToRegister { // Each component needs a block for Core to call in order to instantiate instances of the @@ -185,10 +189,10 @@ that it uses to register with the container. Using Functions as an example: @end ``` -##### SDK provides functionality to other SDKs (example: Auth) +##### Framework provides functionality to other Frameworks (example: Auth) This example will be very similar to the one above, but let's define a simple protocol that Auth -could conform to and provide to other SDKs: +could conform to and provide to other frameworks: ``` // FIRAuthInterop.h in the FirebaseAuthInterop framework. @@ -230,7 +234,7 @@ could conform to and provide to other SDKs: #### Multiple Instances per `FIRApp` -Instead of directly providing an instance from the container, Firestore and similar SDKs should +Instead of directly providing an instance from the container, Firestore and similar products should create a "provider" that stores and creates instances with the required parameters. This means a single provider per `FIRApp`, but multiple instances are possible per provider. @@ -325,7 +329,7 @@ All `Firestore.m` needs to do now is call the component container from the singl } ``` -### Depending on Functionality from Another SDK +### Depending on Functionality from Another Framework *If you haven't already read [Registering with Core](#registering-with-core), please do so until you get back to this spot as it lays the groundwork necessary to understand this section.* @@ -333,8 +337,8 @@ get back to this spot as it lays the groundwork necessary to understand this sec Adding dependencies is easy once components are registered with Core. Let's take the example from Functions above and add a dependency to `FIRAuthInterop` defined above. -**Important**: You will also need to add a dependency on the `FirebaseAuthInterop` pod to your SDK's - podspec and any package manager supported. +**Important**: You will also need to add a dependency on the `FirebaseAuthInterop` pod to your + product's podspec and any package manager supported. Before adding the dependency on `FIRAuthInterop`. @@ -407,7 +411,7 @@ if (userID) { ### Providing Multiple Components and Sharing Instances -Consider a situation where an SDK wants to offer functionality defined in multiple protocols +Consider a situation where a framework wants to offer functionality defined in multiple protocols with the same instance. For example, Auth could provide `FIRAuthUserInterop` and `FIRAuthSignInInterop`. If a single Auth instance should be shared between those two protocols, the system currently doesn't work. From 5a15cf9e7f08011eb15a5903be11f4e299b6cf86 Mon Sep 17 00:00:00 2001 From: Claudio Date: Fri, 26 Oct 2018 17:03:24 +0100 Subject: [PATCH 037/102] Updated the Carthage installation instructions (#2012) --- Carthage.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Carthage.md b/Carthage.md index b36aa614a92..9e8773c5c20 100644 --- a/Carthage.md +++ b/Carthage.md @@ -28,7 +28,7 @@ more details and additional installation methods. - Create a Cartfile with a **subset** of the following components - choosing the Firebase components that you want to include in your app. Note that -**FirebaseAnalytics** must always be included. +**FirebaseAnalyticsBinary** must always be included. ``` binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseABTestingBinary.json" binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAdMobBinary.json" @@ -57,8 +57,8 @@ binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseStorageBinary.jso - Use Finder to open `Carthage/Build/iOS`. - Copy the contents into the top level of your Xcode project and make sure they're added to the right build target(s). -- Add the -ObjC flag to "Other Linker Flags". -- Make sure that the build target(s) includes your project's `GoogleService-Info.plist`. +- Add `$(OTHER_LDFLAGS) -ObjC` flag to "Other Linker Flags" in "Build Settings". +- Make sure that the build target(s) includes your project's `GoogleService-Info.plist` ([how to download config file](https://support.google.com/firebase/answer/7015592)) - [Delete Firebase.framework from the Link Binary With Libraries Build Phase](https://github.com/firebase/firebase-ios-sdk/issues/911#issuecomment-372455235). - If you're including a Firebase component that has resources, copy its bundles into the Xcode project and make sure they're added to the From f54b981b7fc03e389b7eab519bc60280d5f88a34 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Fri, 26 Oct 2018 14:37:54 -0700 Subject: [PATCH 038/102] Add Rome instructions (#2014) --- Carthage.md | 9 +++--- README.md | 7 ++++- Rome.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 Rome.md diff --git a/Carthage.md b/Carthage.md index 9e8773c5c20..0009c173e3a 100644 --- a/Carthage.md +++ b/Carthage.md @@ -3,13 +3,12 @@ ## Context This page introduces and provides instructions for an **experimental** Firebase -[Carthage](https://github.com/Carthage/Carthage) implementation. Based on -feedback and usage, the Firebase team may decide to make the Carthage -distribution official. +[Carthage](https://github.com/Carthage/Carthage) distribution. Based on +feedback and usage, the Firebase team may decide to [make the Carthage +distribution official](https://github.com/firebase/firebase-ios-sdk/issues/1862). Please [let us know](https://github.com/firebase/firebase-ios-sdk/issues) if you -have suggestions about how best to distribute Carthage binaries that include -resource bundles. +have suggestions or questions. ## Carthage Installation diff --git a/README.md b/README.md index eb6ea333f83..00e6ade973a 100644 --- a/README.md +++ b/README.md @@ -60,9 +60,14 @@ pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' ### Carthage (iOS only) -An experimental Carthage distribution is now available. See +Instructions for the experimental Carthage distribution are at [Carthage](Carthage.md). +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + ## Development Follow the subsequent instructions to develop, debug, unit test, run integration diff --git a/Rome.md b/Rome.md new file mode 100644 index 00000000000..61ba99a8678 --- /dev/null +++ b/Rome.md @@ -0,0 +1,90 @@ +# Firebase Rome + +## Context + +This page introduces and provides instructions for using Firebase via a +[Rome](https://github.com/CocoaPods/Rome) distribution. Based on +feedback and usage, the Firebase team may decide to make the Rome +support official. + +Please [let us know](https://github.com/firebase/firebase-ios-sdk/issues) if you +have suggestions or questions. + +## Introduction + +Unlike regular CocoaPods, Rome does not touch the Xcode project file. It +installs and builds all of the frameworks and leaves the project integration to +you. + +As a result, with Rome, the installed frameworks are all binary whether the +CocoaPod itself was source or binary. + +In comparison to Carthage, Rome supports subspecs. Therefore, you can install +exactly the right frameworks customized for your requirements. + +## Rome Installation + +```bash +$ gem install cocoapods-rome +``` + +## Firebase Installation + +1. Copy the [template Podfile](Rome/Podfile) to your project directory +1. Delete any Firebase pods that you don't need +1. Run `pod install` +1. With the Finder `open Rome` +1. Make sure you have an Xcode project open in Xcode. +1. In Xcode, hit `⌘-1` to open the Project Navigator pane. It will open on + left side of the Xcode window if it wasn't already open. +1. Drag each framework from the Finder window into Project + Navigator pane. In the dialog box that appears, make sure the target you + want the framework to be added to has a checkmark next to it, and that + you've selected "Copy items if needed". +1. Find the dynamic frameworks: In a shell type: + `file Rome/*/* | grep universal | grep dynamic` +1. Drag each dynamic framework to the "Embed Frameworks" section on the + Xcode Build Target's "General" page. +1. If you're using FirebaseML, FirebaseInAppMessaging, FirebaseFirestore, or + FirebaseInvites, find + the resources to the project: `ls -ld Pods/*/Resources/*`. More details on + this below. +1. Drag all of those resources into the Project Navigator, just + like the frameworks, again making sure that the target you want to add these + resources to has a checkmark next to it, and that you've selected "Copy items + if needed". +1. Add the -ObjC flag to "Other Linker Settings": + a. In your project settings, open the Settings panel for your target + b. Go to the Build Settings tab and find the "Other Linker Flags" setting + in the Linking section. + c. Double-click the setting, click the '+' button, and add "-ObjC" (without + quotes) +1. Add Firebase.h and module support: + a. In your project settings, open the Settings panel for your target + b. Go to the Build Settings tab and find the "User Header Search Paths" + setting in the Search Paths section. + c. Double-click the setting, click the '+' button, and add + `Pods/Firebase/CoreOnly/Sources` +1. Make sure that the build target(s) includes your project's + `GoogleService-Info.plist` + ([how to download config file](https://support.google.com/firebase/answer/7015592)). +1. You're done! Compile your target and start using Firebase. + +## Firebase Resource Details +- If you're including a Firebase component that has resources, copy its bundles + into the Xcode project and make sure they're added to the + `Copy Bundle Resources` Build Phase : + - For Firestore: + - ./Rome/GRPCClient.framework/gRPCCertificates.bundle + - For InAppMessagingDisplay: + - ./Rome/FirebaseInAppMessagingDisplay.framework/InAppMessagingDisplayResources.bundle + - For Invites: + - ./Pods/FirebaseInvites/Resources/GINInviteResources.bundle + - ./Pods/FirebaseInvites/Resources/GPPACLPickerResources.bundle + - ./Pods/GoogleSignIn/Resources/GoogleSignIn.bundle + - For FirebaseMLVisionFaceModel: + - ./Pods/GoogleMobileVision/FaceDetector/Resources/GoogleMVFaceDetectorResources + - For FirebaseMLVisionTextModel: + - ./Pods/GoogleMobileVision/TextDetector/Resources/GoogleMVTextDetectorResources +- For the FirebaseML resources, a bundle needs to be created. TBD better + instructions here. From 5e37beb4819eb8d81ecb51df2ed7654a2fd72e60 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Mon, 29 Oct 2018 07:00:58 -0700 Subject: [PATCH 039/102] Attempt to fix frequent Auth Unit Test flake on OSX (#2017) --- Example/Auth/Tests/FIRAuthDispatcherTests.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example/Auth/Tests/FIRAuthDispatcherTests.m b/Example/Auth/Tests/FIRAuthDispatcherTests.m index 9eeb2391afa..09776803720 100644 --- a/Example/Auth/Tests/FIRAuthDispatcherTests.m +++ b/Example/Auth/Tests/FIRAuthDispatcherTests.m @@ -22,7 +22,7 @@ @brief The maximum difference between time intervals (in seconds), after which they will be considered different. */ -static const NSTimeInterval kMaxDifferenceBetweenTimeIntervals = 0.1; +static const NSTimeInterval kMaxDifferenceBetweenTimeIntervals = 0.3; /** @var kTestDelay @brief Fake time delay before tasks are dispatched. @@ -32,7 +32,7 @@ /** @var kExpectationTimeout @brief The maximum time waiting for expectations to fulfill. */ -static const NSTimeInterval kExpectationTimeout = 3; +static const NSTimeInterval kExpectationTimeout = 2; id testWorkQueue; From 92a57d7e63e189ee655f0cf8a0b25e50d0410747 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Mon, 29 Oct 2018 07:48:40 -0700 Subject: [PATCH 040/102] Increase timeouts in attempt to eliminate travis flakes (#2016) --- .../InAppMessagingDisplayImageOnlyViewUITests.swift | 8 ++++---- .../InAppMessagingDisplayUITestsBase.swift | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayImageOnlyViewUITests.swift b/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayImageOnlyViewUITests.swift index ca3caf02547..075884f1eae 100644 --- a/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayImageOnlyViewUITests.swift +++ b/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayImageOnlyViewUITests.swift @@ -76,7 +76,7 @@ class InAppMessagingImageOnlyViewUITests: InAppMessagingDisplayUITestsBase { app.buttons["High Dimension Image"].tap() // wait time longer due to large image - waitForElementToAppear(closeButton, 10) + waitForElementToAppear(closeButton, 30) XCTAssert(isElementExistentAndHavingSize(imageView)) XCTAssert(isUIElementWithinUIWindow(imageView)) @@ -101,7 +101,7 @@ class InAppMessagingImageOnlyViewUITests: InAppMessagingDisplayUITestsBase { app.buttons["Low Dimension Image"].tap() // wait time longer due to large image - waitForElementToAppear(closeButton, 10) + waitForElementToAppear(closeButton, 30) XCTAssert(isElementExistentAndHavingSize(imageView)) XCTAssert(isUIElementWithinUIWindow(imageView)) @@ -123,7 +123,7 @@ class InAppMessagingImageOnlyViewUITests: InAppMessagingDisplayUITestsBase { app.buttons["Wide Image"].tap() // wait time longer due to large image - waitForElementToAppear(closeButton, 10) + waitForElementToAppear(closeButton, 30) XCTAssert(isElementExistentAndHavingSize(imageView)) XCTAssert(isUIElementWithinUIWindow(imageView)) @@ -145,7 +145,7 @@ class InAppMessagingImageOnlyViewUITests: InAppMessagingDisplayUITestsBase { app.buttons["Narrow Image"].tap() // wait time longer due to large image - waitForElementToAppear(closeButton, 10) + waitForElementToAppear(closeButton, 30) XCTAssert(isElementExistentAndHavingSize(imageView)) XCTAssert(isUIElementWithinUIWindow(imageView)) diff --git a/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayUITestsBase.swift b/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayUITestsBase.swift index 5d5715e0f44..cca8a66ae09 100644 --- a/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayUITestsBase.swift +++ b/InAppMessagingDisplay/Example/InAppMessagingDisplay-UITests/InAppMessagingDisplayUITestsBase.swift @@ -19,13 +19,13 @@ import Foundation import XCTest class InAppMessagingDisplayUITestsBase: XCTestCase { - func waitForElementToAppear(_ element: XCUIElement, _ timeoutInSeconds: TimeInterval = 5) { + func waitForElementToAppear(_ element: XCUIElement, _ timeoutInSeconds: TimeInterval = 20) { let existsPredicate = NSPredicate(format: "exists == true") expectation(for: existsPredicate, evaluatedWith: element, handler: nil) waitForExpectations(timeout: timeoutInSeconds, handler: nil) } - func waitForElementToDisappear(_ element: XCUIElement, _ timeoutInSeconds: TimeInterval = 5) { + func waitForElementToDisappear(_ element: XCUIElement, _ timeoutInSeconds: TimeInterval = 20) { let existsPredicate = NSPredicate(format: "exists == false") expectation(for: existsPredicate, evaluatedWith: element, handler: nil) waitForExpectations(timeout: timeoutInSeconds, handler: nil) From ea076e38a630ec69be3d40fa6d0e7e4dec7986e9 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Mon, 29 Oct 2018 13:15:20 -0700 Subject: [PATCH 041/102] Don't rely on test always being in foreground (#2021) --- Example/Messaging/Tests/FIRMessagingAnalyticsTest.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example/Messaging/Tests/FIRMessagingAnalyticsTest.m b/Example/Messaging/Tests/FIRMessagingAnalyticsTest.m index 760f4a3874c..2a60efa5362 100644 --- a/Example/Messaging/Tests/FIRMessagingAnalyticsTest.m +++ b/Example/Messaging/Tests/FIRMessagingAnalyticsTest.m @@ -112,7 +112,7 @@ + (void)logUserPropertyForConversionTracking:(NSDictionary *)notification + (void)logOpenNotification:(NSDictionary *)notification toAnalytics:(id _Nullable)analytics; + (void)logForegroundNotification:(NSDictionary *)notification - toAnalytics:(id _Nullable)analytics ;; + toAnalytics:(id _Nullable)analytics; + (void)logEvent:(NSString *)event withNotification:(NSDictionary *)notification toAnalytics:(id _Nullable)analytics ;; @@ -398,7 +398,7 @@ - (void)testLogMessage { @"google.c.a.e" : @"1", }; [FIRMessagingAnalytics logMessage:notification toAnalytics:nil]; - OCMVerify([self.logClassMock logForegroundNotification:notification toAnalytics:nil]); + OCMVerify([self.logClassMock logEvent:OCMOCK_ANY withNotification:notification toAnalytics:nil]); } - (void)testLogOpenNotification { From dd369900960c02e6e7ae69e69e1c827d25034f49 Mon Sep 17 00:00:00 2001 From: Konstantin Varlamov Date: Tue, 30 Oct 2018 00:15:22 -0400 Subject: [PATCH 042/102] Fix log overflow in continuous fuzz testing (#2020) Prevent generating too many "Unrecognized selector" console messages that eventually make Travis kill the job due to log exceeding limits. --- .../FuzzingTargets/FSTFuzzTestFieldPath.mm | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/Firestore/Example/FuzzTests/FuzzingTargets/FSTFuzzTestFieldPath.mm b/Firestore/Example/FuzzTests/FuzzingTargets/FSTFuzzTestFieldPath.mm index 78428bff409..38bf4f15935 100644 --- a/Firestore/Example/FuzzTests/FuzzingTargets/FSTFuzzTestFieldPath.mm +++ b/Firestore/Example/FuzzTests/FuzzingTargets/FSTFuzzTestFieldPath.mm @@ -31,6 +31,11 @@ int FuzzTestFieldPath(const uint8_t *data, size_t size) { // Convert the raw bytes to a string with UTF-8 format. NSData *d = [NSData dataWithBytes:data length:size]; NSString *str = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding]; + if (!str) { + // TODO(varconst): this happens when `NSData` doesn't happen to contain valid UTF-8, perhaps + // find a way to still convert it to a string. + return 0; + } // Create a FieldPath object from a string. @try { @@ -42,7 +47,7 @@ int FuzzTestFieldPath(const uint8_t *data, size_t size) { // Fuzz test creating a FieldPath from an array with a single string. NSArray *str_arr1 = [NSArray arrayWithObjects:str, nil]; @try { - [[FIRFieldPath alloc] initWithFields:str_arr1]; + (void)[[FIRFieldPath alloc] initWithFields:str_arr1]; } @catch (...) { // Caught exceptions are ignored because they are not what we are after in // fuzz testing. @@ -52,7 +57,7 @@ int FuzzTestFieldPath(const uint8_t *data, size_t size) { NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@" .,/_"]; NSArray *str_arr2 = [str componentsSeparatedByCharactersInSet:set]; @try { - [[FIRFieldPath alloc] initWithFields:str_arr2]; + (void)[[FIRFieldPath alloc] initWithFields:str_arr2]; } @catch (...) { // Ignore caught exceptions. } @@ -62,9 +67,25 @@ int FuzzTestFieldPath(const uint8_t *data, size_t size) { // created as mutable objects. Returns nil if there is a parsing error. NSArray *str_arr3 = [NSJSONSerialization JSONObjectWithData:d options:NSJSONReadingMutableContainers error:nil]; + NSMutableArray *mutable_array = [[NSMutableArray alloc] initWithArray:str_arr3]; + if (str_arr3) { + for (int i = 0; i < str_arr3.count; ++i) { + NSObject *value = str_arr3[i]; + // `FIRFieldPath initWithFields:` relies on all members having `length` attribute. + if (![value isKindOfClass:[NSString class]]) { + if ([value isKindOfClass:[NSNumber class]]) { + mutable_array[i] = [[NSString alloc] initWithFormat:@"%@", (NSNumber *)value]; + } else { + // TODO(varconst): convert to string recursively. + return 0; + } + } + } + } + @try { - if (str_arr3) { - [[FIRFieldPath alloc] initWithFields:str_arr3]; + if (mutable_array) { + (void)[[FIRFieldPath alloc] initWithFields:mutable_array]; } } @catch (...) { // Ignore caught exceptions. From c0631471c4f8a2e62a025fc2c59904368b82bbb5 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Tue, 30 Oct 2018 14:35:03 -0400 Subject: [PATCH 043/102] Assign the default app before posting notifications. (#2024) Although SDKs being configured should access the app through the dictionary being passed in (and soon the `FIRCoreConfigurable` protocol), the default app should be assigned before notifying SDKs that Core is ready. --- Firebase/Core/FIRApp.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Firebase/Core/FIRApp.m b/Firebase/Core/FIRApp.m index bc956aa4b4d..ca61abf823e 100644 --- a/Firebase/Core/FIRApp.m +++ b/Firebase/Core/FIRApp.m @@ -178,12 +178,12 @@ + (void)configureWithName:(NSString *)name options:(FIROptions *)options { @synchronized(self) { FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; - [FIRApp addAppToAppDictionary:app]; - [FIRApp sendNotificationsToSDKs:app]; - if (app.isDefaultApp) { sDefaultApp = app; } + + [FIRApp addAppToAppDictionary:app]; + [FIRApp sendNotificationsToSDKs:app]; } } From 9df8ea0e32a090825598aaf6a8b0a62dfa67b107 Mon Sep 17 00:00:00 2001 From: Gil Date: Wed, 31 Oct 2018 06:36:34 -0700 Subject: [PATCH 044/102] Update CHANGELOG for Firestore v0.14.0 (#2025) --- Firestore/CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Firestore/CHANGELOG.md b/Firestore/CHANGELOG.md index af24029e866..dc7e148d3b3 100644 --- a/Firestore/CHANGELOG.md +++ b/Firestore/CHANGELOG.md @@ -1,5 +1,14 @@ # Unreleased +# v0.14.0 +- [fixed] Fixed compilation in C99 and C++11 modes without GNU extensions. +- [changed] Moved from Objective-C gRPC framework to gRPC C++. If you're + manually tracking dependencies, the `gRPC`, `gRPC-ProtoRPC`, and + `gRPC-RxLibrary` frameworks have been replaced with `gRPC-C++`. While we + don't anticipate any issues, please [report any issues with network + behavior](https://github.com/firebase/firebase-ios-sdk/issues/new) you + experience. (#1968) + # v0.13.6 - [changed] Internal improvements. From 0b054d0902324957aa9d8ec97be58bc3b1744a1d Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Wed, 31 Oct 2018 07:09:17 -0700 Subject: [PATCH 045/102] M37 Core release notes (#2027) --- Firebase/Core/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Firebase/Core/CHANGELOG.md b/Firebase/Core/CHANGELOG.md index 0d1688dcc81..90cf11eb3fc 100644 --- a/Firebase/Core/CHANGELOG.md +++ b/Firebase/Core/CHANGELOG.md @@ -1,5 +1,10 @@ # Unreleased +# 2018-10-31 -- v5.1.7 -- M37 +- [changed] Assign the default app before posting notifications. (#2024) +- [changed] Remove unnecessary notification flag. (#1993) +- [changed] Wrap diagnostics notification in collection flag check. (#1979) + # 2018-08-28 -- v5.1.2 -- M32 - [fixed] Clarified wording in `FirebaseAnalytics not available` log message. (#1653) From 043df0807f44fa30e6913a080e4b6560d935ef82 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Wed, 31 Oct 2018 11:01:48 -0700 Subject: [PATCH 046/102] Add changelog to GoogleUtilities --- GoogleUtilities/CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 GoogleUtilities/CHANGELOG.md diff --git a/GoogleUtilities/CHANGELOG.md b/GoogleUtilities/CHANGELOG.md new file mode 100644 index 00000000000..e3047d700b5 --- /dev/null +++ b/GoogleUtilities/CHANGELOG.md @@ -0,0 +1,9 @@ +# Unreleased + +# 5.3.4 +- Fixed a crash caused by unprotected access to sessions in + `GULNetworkURLSession` (#1964). + +# 5.3.3 +- Fixed an issue where GoogleUtilities would leak instances of `NSURLSession`. + (#1917) From 7e5ba607eed62ae4f4a39ef7abfef11426184e60 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Thu, 1 Nov 2018 10:41:48 -0400 Subject: [PATCH 047/102] Fix static analysis warning in Core. (#2034) Explicitly check for `nil` instead of using the `!` operator on the pointer. --- Firebase/Core/FIRApp.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firebase/Core/FIRApp.m b/Firebase/Core/FIRApp.m index ca61abf823e..3b352fa7d18 100644 --- a/Firebase/Core/FIRApp.m +++ b/Firebase/Core/FIRApp.m @@ -106,7 +106,7 @@ + (void)configure { // Read the Info.plist to see if the flag is set. At this point we can't check any user defaults // since the app isn't configured at all, so only rely on the Info.plist value. NSNumber *collectionEnabledPlistValue = [[self class] readDataCollectionSwitchFromPlist]; - if (!collectionEnabledPlistValue || [collectionEnabledPlistValue boolValue]) { + if (collectionEnabledPlistValue == nil || [collectionEnabledPlistValue boolValue]) { [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppDiagnosticsNotification object:nil From f16cd0ed21b809a9a4a43d3630d0aab1c0dad13d Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Thu, 1 Nov 2018 11:31:51 -0400 Subject: [PATCH 048/102] Update CHANGELOG.md for #2034 (#2035) --- Firebase/Core/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Firebase/Core/CHANGELOG.md b/Firebase/Core/CHANGELOG.md index 90cf11eb3fc..b0cf267766a 100644 --- a/Firebase/Core/CHANGELOG.md +++ b/Firebase/Core/CHANGELOG.md @@ -1,4 +1,5 @@ # Unreleased +- [fixed] Fixed static analysis warning for improper `nil` comparison. (#2034) # 2018-10-31 -- v5.1.7 -- M37 - [changed] Assign the default app before posting notifications. (#2024) From ea567dca47e44bce27c3fe66862aad90371ecaec Mon Sep 17 00:00:00 2001 From: Gil Date: Thu, 1 Nov 2018 08:37:32 -0700 Subject: [PATCH 049/102] Revert "gRPC: replace Objective-C implementation with the new C++ implementation (#1968)" (#2030) This reverts commit a514bd957a9576aa708d575cdf7ed05e63b1192a. --- FirebaseFirestore.podspec | 5 +- .../Firestore.xcodeproj/project.pbxproj | 86 +- .../Tests/Integration/FSTDatastoreTests.mm | 8 +- .../Tests/Integration/FSTStreamTests.mm | 403 ++ .../Example/Tests/Remote/FSTDatastoreTests.mm | 1 + .../Tests/Remote/FSTSerializerBetaTests.mm | 1 + .../Tests/SpecTests/FSTMockDatastore.h | 9 + .../Tests/SpecTests/FSTMockDatastore.mm | 477 +- .../Example/Tests/SpecTests/FSTSpecTests.mm | 1 + .../SpecTests/FSTSyncEngineTestDriver.mm | 1 + .../Tests/Util/FSTIntegrationTestCase.mm | 11 +- Firestore/Protos/CMakeLists.txt | 5 + Firestore/Protos/build_protos.py | 11 +- .../firestore/v1beta1/Firestore.pbrpc.h | 268 + .../firestore/v1beta1/Firestore.pbrpc.m | 306 ++ Firestore/Source/API/FIRDocumentReference.mm | 2 + Firestore/Source/Core/FSTSyncEngine.mm | 2 + Firestore/Source/Core/FSTTransaction.mm | 2 + Firestore/Source/Remote/FSTBufferedWriter.h | 44 + Firestore/Source/Remote/FSTBufferedWriter.mm | 134 + Firestore/Source/Remote/FSTDatastore.h | 27 +- Firestore/Source/Remote/FSTDatastore.mm | 229 +- .../Source/Remote/FSTExponentialBackoff.h | 84 + .../Source/Remote/FSTExponentialBackoff.mm | 128 + Firestore/Source/Remote/FSTRemoteStore.mm | 185 +- Firestore/Source/Remote/FSTSerializerBeta.mm | 2 + Firestore/Source/Remote/FSTStream.h | 249 +- Firestore/Source/Remote/FSTStream.mm | 823 ++++ Firestore/Source/Util/FSTDispatchQueue.h | 4 +- Firestore/Source/Util/FSTDispatchQueue.mm | 5 +- .../firestore/remote/grpc_connection.h | 24 +- .../firestore/remote/grpc_connection.mm | 109 +- .../remote/grpc_root_certificate_finder.h | 39 - .../grpc_root_certificate_finder_apple.mm | 50 - .../src/firebase/firestore/remote/stream.h | 12 +- .../firebase/firestore/remote/watch_stream.h | 5 +- .../firebase/firestore/remote/write_stream.h | 13 +- .../firestore/remote/grpc_stream_test.cc | 6 +- Firestore/etc/roots.pem | 4342 ----------------- 39 files changed, 3166 insertions(+), 4947 deletions(-) create mode 100644 Firestore/Example/Tests/Integration/FSTStreamTests.mm create mode 100644 Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h create mode 100644 Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m create mode 100644 Firestore/Source/Remote/FSTBufferedWriter.h create mode 100644 Firestore/Source/Remote/FSTBufferedWriter.mm create mode 100644 Firestore/Source/Remote/FSTExponentialBackoff.h create mode 100644 Firestore/Source/Remote/FSTExponentialBackoff.mm create mode 100644 Firestore/Source/Remote/FSTStream.mm delete mode 100644 Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h delete mode 100644 Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm delete mode 100644 Firestore/etc/roots.pem diff --git a/FirebaseFirestore.podspec b/FirebaseFirestore.podspec index aaf4b4a3e0c..6802b0adb74 100644 --- a/FirebaseFirestore.podspec +++ b/FirebaseFirestore.podspec @@ -49,12 +49,9 @@ Google Cloud Firestore is a NoSQL document database built for automatic scaling, ] s.public_header_files = 'Firestore/Source/Public/*.h' - # TODO(varconst): remove once https://github.com/grpc/grpc/pull/16962 makes it - # into a release. - s.resource_bundles = { 'gRPCCertificates' => ['Firestore/etc/roots.pem'] } - s.dependency 'FirebaseAuthInterop', '~> 1.0' s.dependency 'FirebaseCore', '~> 5.1' + s.dependency 'gRPC-ProtoRPC', '~> 1.0' s.dependency 'gRPC-C++', '~> 0.0.3' s.dependency 'leveldb-library', '~> 1.20' s.dependency 'Protobuf', '~> 3.1' diff --git a/Firestore/Example/Firestore.xcodeproj/project.pbxproj b/Firestore/Example/Firestore.xcodeproj/project.pbxproj index 234d364f27a..bfb19ac134c 100644 --- a/Firestore/Example/Firestore.xcodeproj/project.pbxproj +++ b/Firestore/Example/Firestore.xcodeproj/project.pbxproj @@ -82,6 +82,7 @@ 5492E07A202154D600B64F25 /* FIRTypeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E071202154D600B64F25 /* FIRTypeTests.mm */; }; 5492E07F202154EC00B64F25 /* FSTTransactionTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */; }; 5492E080202154EC00B64F25 /* FSTSmokeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */; }; + 5492E081202154EC00B64F25 /* FSTStreamTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07D202154EB00B64F25 /* FSTStreamTests.mm */; }; 5492E082202154EC00B64F25 /* FSTDatastoreTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */; }; 5492E09D2021552D00B64F25 /* FSTLocalStoreTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0832021552A00B64F25 /* FSTLocalStoreTests.mm */; }; 5492E09F2021552D00B64F25 /* FSTLevelDBMigrationsTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0862021552A00B64F25 /* FSTLevelDBMigrationsTests.mm */; }; @@ -360,6 +361,7 @@ 5492E071202154D600B64F25 /* FIRTypeTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FIRTypeTests.mm; sourceTree = ""; }; 5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTTransactionTests.mm; sourceTree = ""; }; 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTSmokeTests.mm; sourceTree = ""; }; + 5492E07D202154EB00B64F25 /* FSTStreamTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTStreamTests.mm; sourceTree = ""; }; 5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDatastoreTests.mm; sourceTree = ""; }; 5492E0832021552A00B64F25 /* FSTLocalStoreTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTLocalStoreTests.mm; sourceTree = ""; }; 5492E0852021552A00B64F25 /* FSTRemoteDocumentCacheTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSTRemoteDocumentCacheTests.h; sourceTree = ""; }; @@ -1232,6 +1234,7 @@ DE03B3621F215E1600A30B9C /* CAcert.pem */, 5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */, 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */, + 5492E07D202154EB00B64F25 /* FSTStreamTests.mm */, 5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */, ); path = Integration; @@ -1267,7 +1270,6 @@ 54C9EDEE2040E16300A969CD /* Frameworks */, 54C9EDEF2040E16300A969CD /* Resources */, EA424838F4A5DD7B337F57AB /* [CP] Embed Pods Frameworks */, - DE5C36328822481F6EB6EF16 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1308,7 +1310,6 @@ 6003F587195388D20070C39A /* Frameworks */, 6003F588195388D20070C39A /* Resources */, 1EE692C7509A98D7EB03CA51 /* [CP] Embed Pods Frameworks */, - 1E7DAED3207D01F1744EA227 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1509,24 +1510,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1E7DAED3207D01F1744EA227 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS/Pods-Firestore_Example_iOS-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseFirestore/gRPCCertificates.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS/Pods-Firestore_Example_iOS-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 1EE692C7509A98D7EB03CA51 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1538,8 +1521,11 @@ "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", "${BUILT_PRODUCTS_DIR}/Protobuf-iOS8.0/Protobuf.framework", + "${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework", "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework", "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework", "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", ); @@ -1549,8 +1535,11 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", ); @@ -1768,24 +1757,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - DE5C36328822481F6EB6EF16 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseFirestore/gRPCCertificates.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; EA424838F4A5DD7B337F57AB /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1797,8 +1768,11 @@ "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", "${BUILT_PRODUCTS_DIR}/Protobuf-iOS8.0/Protobuf.framework", + "${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework", "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework", "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework", "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", ); @@ -1808,8 +1782,11 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", ); @@ -2029,6 +2006,7 @@ 5492E0422021440500B64F25 /* FSTHelpers.mm in Sources */, 5491BC731FB44593008B3588 /* FSTIntegrationTestCase.mm in Sources */, 5492E080202154EC00B64F25 /* FSTSmokeTests.mm in Sources */, + 5492E081202154EC00B64F25 /* FSTStreamTests.mm in Sources */, 5492E07F202154EC00B64F25 /* FSTTransactionTests.mm in Sources */, 5492E0442021457E00B64F25 /* XCTestCase+Await.mm in Sources */, B67BF44A216EB43000CA9097 /* create_noop_connectivity_monitor.cc in Sources */, @@ -2241,6 +2219,14 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", + "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", @@ -2317,6 +2303,14 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", + "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", @@ -2518,6 +2512,14 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", + "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", @@ -2595,6 +2597,14 @@ "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"", "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"", + "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"", "-iquote", "\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"", diff --git a/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm b/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm index e931e185277..67842b93e0a 100644 --- a/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm +++ b/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm @@ -17,6 +17,8 @@ #import #import +#import +#import #import #import "Firestore/Source/API/FIRDocumentReference+Internal.h" @@ -50,7 +52,6 @@ using firebase::firestore::model::DocumentKeySet; using firebase::firestore::model::Precondition; using firebase::firestore::model::TargetId; -using firebase::firestore::remote::GrpcConnection; NS_ASSUME_NONNULL_BEGIN @@ -161,7 +162,7 @@ - (void)setUp { NSString *projectID = [FSTIntegrationTestCase projectID]; FIRFirestoreSettings *settings = [FSTIntegrationTestCase settings]; if (!settings.sslEnabled) { - GrpcConnection::UseInsecureChannel(util::MakeString(settings.host)); + [GRPCCall useInsecureConnectionsForHost:settings.host]; } DatabaseId database_id(util::MakeString(projectID), DatabaseId::kDefault); @@ -221,9 +222,6 @@ - (void)testStreamingWrite { mutations:@[ mutation ]]; [_testWorkerQueue dispatchAsync:^{ [_remoteStore addBatchToWritePipeline:batch]; - // The added batch won't be written immediately because write stream wasn't yet open -- - // trigger its opening. - [_remoteStore fillWritePipeline]; }]; [self awaitExpectations]; diff --git a/Firestore/Example/Tests/Integration/FSTStreamTests.mm b/Firestore/Example/Tests/Integration/FSTStreamTests.mm new file mode 100644 index 00000000000..5186657a64a --- /dev/null +++ b/Firestore/Example/Tests/Integration/FSTStreamTests.mm @@ -0,0 +1,403 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import + +#import +#import + +#include + +#import "Firestore/Example/Tests/Util/FSTHelpers.h" +#import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h" +#import "Firestore/Source/Remote/FSTDatastore.h" +#import "Firestore/Source/Remote/FSTStream.h" + +#include "Firestore/core/src/firebase/firestore/auth/empty_credentials_provider.h" +#include "Firestore/core/src/firebase/firestore/core/database_info.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" +#include "Firestore/core/src/firebase/firestore/util/hard_assert.h" +#include "Firestore/core/src/firebase/firestore/util/string_apple.h" + +namespace util = firebase::firestore::util; +using firebase::firestore::auth::EmptyCredentialsProvider; +using firebase::firestore::core::DatabaseInfo; +using firebase::firestore::model::DatabaseId; +using firebase::firestore::model::SnapshotVersion; + +/** Exposes otherwise private methods for testing. */ +@interface FSTStream (Testing) +@property(nonatomic, strong, readwrite) id callbackFilter; +@end + +/** + * Implements FSTWatchStreamDelegate and FSTWriteStreamDelegate and supports waiting on callbacks + * via `fulfillOnCallback`. + */ +@interface FSTStreamStatusDelegate : NSObject + +- (instancetype)initWithTestCase:(XCTestCase *)testCase + queue:(FSTDispatchQueue *)dispatchQueue NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; + +@property(nonatomic, weak, readonly) XCTestCase *testCase; +@property(nonatomic, strong, readonly) FSTDispatchQueue *dispatchQueue; +@property(nonatomic, readonly) NSMutableArray *states; +@property(nonatomic, strong) XCTestExpectation *expectation; + +@end + +@implementation FSTStreamStatusDelegate + +- (instancetype)initWithTestCase:(XCTestCase *)testCase queue:(FSTDispatchQueue *)dispatchQueue { + if (self = [super init]) { + _testCase = testCase; + _dispatchQueue = dispatchQueue; + _states = [NSMutableArray new]; + } + + return self; +} + +- (void)watchStreamDidOpen { + [_states addObject:@"watchStreamDidOpen"]; + [_expectation fulfill]; + _expectation = nil; +} + +- (void)writeStreamDidOpen { + [_states addObject:@"writeStreamDidOpen"]; + [_expectation fulfill]; + _expectation = nil; +} + +- (void)writeStreamDidCompleteHandshake { + [_states addObject:@"writeStreamDidCompleteHandshake"]; + [_expectation fulfill]; + _expectation = nil; +} + +- (void)writeStreamWasInterruptedWithError:(nullable NSError *)error { + [_states addObject:@"writeStreamWasInterrupted"]; + [_expectation fulfill]; + _expectation = nil; +} + +- (void)watchStreamWasInterruptedWithError:(nullable NSError *)error { + [_states addObject:@"watchStreamWasInterrupted"]; + [_expectation fulfill]; + _expectation = nil; +} + +- (void)watchStreamDidChange:(FSTWatchChange *)change + snapshotVersion:(const SnapshotVersion &)snapshotVersion { + [_states addObject:@"watchStreamDidChange"]; + [_expectation fulfill]; + _expectation = nil; +} + +- (void)writeStreamDidReceiveResponseWithVersion:(const SnapshotVersion &)commitVersion + mutationResults:(NSArray *)results { + [_states addObject:@"writeStreamDidReceiveResponseWithVersion"]; + [_expectation fulfill]; + _expectation = nil; +} + +/** + * Executes 'block' using the provided FSTDispatchQueue and waits for any callback on this delegate + * to be called. + */ +- (void)awaitNotificationFromBlock:(void (^)(void))block { + HARD_ASSERT(_expectation == nil, "Previous expectation still active"); + XCTestExpectation *expectation = + [self.testCase expectationWithDescription:@"awaitCallbackInBlock"]; + _expectation = expectation; + [self.dispatchQueue dispatchAsync:block]; + [self.testCase awaitExpectations]; +} + +@end + +@interface FSTStreamTests : XCTestCase + +@end + +@implementation FSTStreamTests { + dispatch_queue_t _testQueue; + FSTDispatchQueue *_workerDispatchQueue; + DatabaseInfo _databaseInfo; + EmptyCredentialsProvider _credentials; + FSTStreamStatusDelegate *_delegate; + + /** Single mutation to send to the write stream. */ + NSArray *_mutations; +} + +- (void)setUp { + [super setUp]; + + FIRFirestoreSettings *settings = [FSTIntegrationTestCase settings]; + DatabaseId database_id(util::MakeString([FSTIntegrationTestCase projectID]), + DatabaseId::kDefault); + + _testQueue = dispatch_queue_create("FSTStreamTestWorkerQueue", DISPATCH_QUEUE_SERIAL); + _workerDispatchQueue = [[FSTDispatchQueue alloc] initWithQueue:_testQueue]; + + _databaseInfo = + DatabaseInfo(database_id, "test-key", util::MakeString(settings.host), settings.sslEnabled); + + _delegate = [[FSTStreamStatusDelegate alloc] initWithTestCase:self queue:_workerDispatchQueue]; + + _mutations = @[ FSTTestSetMutation(@"foo/bar", @{}) ]; +} + +- (FSTWriteStream *)setUpWriteStream { + FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo + workerDispatchQueue:_workerDispatchQueue + credentials:&_credentials]; + return [datastore createWriteStream]; +} + +- (FSTWatchStream *)setUpWatchStream { + FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo + workerDispatchQueue:_workerDispatchQueue + credentials:&_credentials]; + return [datastore createWatchStream]; +} + +/** + * Drains the test queue and asserts that all the observed callbacks (up to this point) match + * 'expectedStates'. Clears the list of observed callbacks on completion. + */ +- (void)verifyDelegateObservedStates:(NSArray *)expectedStates { + // Drain queue + dispatch_sync(_testQueue, ^{ + }); + + XCTAssertEqualObjects(_delegate.states, expectedStates); + [_delegate.states removeAllObjects]; +} + +/** Verifies that the watch stream does not issue an onClose callback after a call to stop(). */ +- (void)testWatchStreamStopBeforeHandshake { + FSTWatchStream *watchStream = [self setUpWatchStream]; + + [_delegate awaitNotificationFromBlock:^{ + [watchStream startWithDelegate:_delegate]; + }]; + + // Stop must not call watchStreamDidClose because the full implementation of the delegate could + // attempt to restart the stream in the event it had pending watches. + [_workerDispatchQueue dispatchAsync:^{ + [watchStream stop]; + }]; + + // Simulate a final callback from GRPC + [_workerDispatchQueue dispatchAsync:^{ + [watchStream.callbackFilter writesFinishedWithError:nil]; + }]; + + [self verifyDelegateObservedStates:@[ @"watchStreamDidOpen" ]]; +} + +/** Verifies that the write stream does not issue an onClose callback after a call to stop(). */ +- (void)testWriteStreamStopBeforeHandshake { + FSTWriteStream *writeStream = [self setUpWriteStream]; + + [_delegate awaitNotificationFromBlock:^{ + [writeStream startWithDelegate:_delegate]; + }]; + + // Don't start the handshake. + + // Stop must not call watchStreamDidClose because the full implementation of the delegate could + // attempt to restart the stream in the event it had pending watches. + [_workerDispatchQueue dispatchAsync:^{ + [writeStream stop]; + }]; + + // Simulate a final callback from GRPC + [_workerDispatchQueue dispatchAsync:^{ + [writeStream.callbackFilter writesFinishedWithError:nil]; + }]; + + [self verifyDelegateObservedStates:@[ @"writeStreamDidOpen" ]]; +} + +- (void)testWriteStreamStopAfterHandshake { + FSTWriteStream *writeStream = [self setUpWriteStream]; + + [_delegate awaitNotificationFromBlock:^{ + [writeStream startWithDelegate:_delegate]; + }]; + + // Writing before the handshake should throw + [_workerDispatchQueue dispatchSync:^{ + XCTAssertThrows([writeStream writeMutations:_mutations]); + }]; + + [_delegate awaitNotificationFromBlock:^{ + [writeStream writeHandshake]; + }]; + + // Now writes should succeed + [_delegate awaitNotificationFromBlock:^{ + [writeStream writeMutations:_mutations]; + }]; + + [_workerDispatchQueue dispatchAsync:^{ + [writeStream stop]; + }]; + + [self verifyDelegateObservedStates:@[ + @"writeStreamDidOpen", @"writeStreamDidCompleteHandshake", + @"writeStreamDidReceiveResponseWithVersion" + ]]; +} + +- (void)testStreamClosesWhenIdle { + FSTWriteStream *writeStream = [self setUpWriteStream]; + + [_delegate awaitNotificationFromBlock:^{ + [writeStream startWithDelegate:_delegate]; + }]; + + [_delegate awaitNotificationFromBlock:^{ + [writeStream writeHandshake]; + }]; + + [_workerDispatchQueue dispatchAsync:^{ + [writeStream markIdle]; + XCTAssertTrue( + [_workerDispatchQueue containsDelayedCallbackWithTimerID:FSTTimerIDWriteStreamIdle]); + }]; + + [_workerDispatchQueue runDelayedCallbacksUntil:FSTTimerIDWriteStreamIdle]; + + [_workerDispatchQueue dispatchSync:^{ + XCTAssertFalse([writeStream isOpen]); + }]; + + [self verifyDelegateObservedStates:@[ + @"writeStreamDidOpen", @"writeStreamDidCompleteHandshake", @"writeStreamWasInterrupted" + ]]; +} + +- (void)testStreamCancelsIdleOnWrite { + FSTWriteStream *writeStream = [self setUpWriteStream]; + + [_delegate awaitNotificationFromBlock:^{ + [writeStream startWithDelegate:_delegate]; + }]; + + [_delegate awaitNotificationFromBlock:^{ + [writeStream writeHandshake]; + }]; + + // Mark the stream idle, but immediately cancel the idle timer by issuing another write. + [_delegate awaitNotificationFromBlock:^{ + [writeStream markIdle]; + XCTAssertTrue( + [_workerDispatchQueue containsDelayedCallbackWithTimerID:FSTTimerIDWriteStreamIdle]); + [writeStream writeMutations:_mutations]; + XCTAssertFalse( + [_workerDispatchQueue containsDelayedCallbackWithTimerID:FSTTimerIDWriteStreamIdle]); + }]; + + [_workerDispatchQueue dispatchSync:^{ + XCTAssertTrue([writeStream isOpen]); + }]; + + [self verifyDelegateObservedStates:@[ + @"writeStreamDidOpen", @"writeStreamDidCompleteHandshake", + @"writeStreamDidReceiveResponseWithVersion" + ]]; +} + +class MockCredentialsProvider : public firebase::firestore::auth::EmptyCredentialsProvider { + public: + MockCredentialsProvider() { + observed_states_ = [NSMutableArray new]; + } + + void GetToken(firebase::firestore::auth::TokenListener completion) override { + [observed_states_ addObject:@"GetToken"]; + EmptyCredentialsProvider::GetToken(std::move(completion)); + } + + void InvalidateToken() override { + [observed_states_ addObject:@"InvalidateToken"]; + EmptyCredentialsProvider::InvalidateToken(); + } + + NSMutableArray *observed_states() const { + return observed_states_; + } + + private: + NSMutableArray *observed_states_; +}; + +- (void)testStreamRefreshesTokenUponExpiration { + MockCredentialsProvider credentials; + FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo + workerDispatchQueue:_workerDispatchQueue + credentials:&credentials]; + FSTWatchStream *watchStream = [datastore createWatchStream]; + + [_delegate awaitNotificationFromBlock:^{ + [watchStream startWithDelegate:_delegate]; + }]; + + // Simulate callback from GRPC with an unauthenticated error -- this should invalidate the token. + NSError *unauthenticatedError = [NSError errorWithDomain:FIRFirestoreErrorDomain + code:FIRFirestoreErrorCodeUnauthenticated + userInfo:nil]; + dispatch_async(_testQueue, ^{ + [watchStream.callbackFilter writesFinishedWithError:unauthenticatedError]; + }); + // Drain the queue. + dispatch_sync(_testQueue, ^{ + }); + + // Try reconnecting. + [_delegate awaitNotificationFromBlock:^{ + [watchStream startWithDelegate:_delegate]; + }]; + // Simulate a different error -- token should not be invalidated this time. + NSError *unavailableError = [NSError errorWithDomain:FIRFirestoreErrorDomain + code:FIRFirestoreErrorCodeUnavailable + userInfo:nil]; + dispatch_async(_testQueue, ^{ + [watchStream.callbackFilter writesFinishedWithError:unavailableError]; + }); + dispatch_sync(_testQueue, ^{ + }); + + [_delegate awaitNotificationFromBlock:^{ + [watchStream startWithDelegate:_delegate]; + }]; + dispatch_sync(_testQueue, ^{ + }); + + NSArray *expected = @[ @"GetToken", @"InvalidateToken", @"GetToken", @"GetToken" ]; + XCTAssertEqualObjects(credentials.observed_states(), expected); +} + +@end diff --git a/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm b/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm index 84a85d4555b..3e384a47b1b 100644 --- a/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm +++ b/Firestore/Example/Tests/Remote/FSTDatastoreTests.mm @@ -17,6 +17,7 @@ #import "Firestore/Source/Remote/FSTDatastore.h" #import +#import #import @interface FSTDatastoreTests : XCTestCase diff --git a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm index 139ff0a245d..a705d8b88ed 100644 --- a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm +++ b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm @@ -21,6 +21,7 @@ #import #import #import +#import #import #include diff --git a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h index 86a0796d4f3..9f7fd02c2f0 100644 --- a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h +++ b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.h @@ -39,6 +39,15 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Watch Stream manipulation. +/** Injects an Added WatchChange containing the given targetIDs. */ +- (void)writeWatchTargetAddedWithTargetIDs:(NSArray *)targetIDs; + +/** Injects an Added WatchChange that marks the given targetIDs current. */ +- (void)writeWatchCurrentWithTargetIDs:(NSArray *)targetIDs + snapshotVersion: + (const firebase::firestore::model::SnapshotVersion &)snapshotVersion + resumeToken:(NSData *)resumeToken; + /** Injects a WatchChange as though it had come from the backend. */ - (void)writeWatchChange:(FSTWatchChange *)change snapshotVersion:(const firebase::firestore::model::SnapshotVersion &)snap; diff --git a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm index 440117519cd..c9ec20e5441 100644 --- a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm +++ b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm @@ -16,17 +16,11 @@ #import "Firestore/Example/Tests/SpecTests/FSTMockDatastore.h" -#include -#include -#include -#include - #import "Firestore/Source/Core/FSTQuery.h" #import "Firestore/Source/Local/FSTQueryData.h" #import "Firestore/Source/Model/FSTMutation.h" #import "Firestore/Source/Remote/FSTSerializerBeta.h" #import "Firestore/Source/Remote/FSTStream.h" -#import "Firestore/Source/Util/FSTDispatchQueue.h" #import "Firestore/Example/Tests/Remote/FSTWatchChange+Testing.h" @@ -34,14 +28,8 @@ #include "Firestore/core/src/firebase/firestore/auth/empty_credentials_provider.h" #include "Firestore/core/src/firebase/firestore/core/database_info.h" #include "Firestore/core/src/firebase/firestore/model/database_id.h" -#include "Firestore/core/src/firebase/firestore/remote/connectivity_monitor.h" -#include "Firestore/core/src/firebase/firestore/remote/grpc_connection.h" -#include "Firestore/core/src/firebase/firestore/remote/stream.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_apple.h" -#include "Firestore/core/test/firebase/firestore/util/create_noop_connectivity_monitor.h" -#include "absl/memory/memory.h" -#include "grpcpp/completion_queue.h" using firebase::firestore::auth::CredentialsProvider; using firebase::firestore::auth::EmptyCredentialsProvider; @@ -49,204 +37,254 @@ using firebase::firestore::model::DatabaseId; using firebase::firestore::model::SnapshotVersion; using firebase::firestore::model::TargetId; -using firebase::firestore::remote::ConnectivityMonitor; -using firebase::firestore::remote::GrpcConnection; -using firebase::firestore::remote::WatchStream; -using firebase::firestore::remote::WriteStream; -using firebase::firestore::util::AsyncQueue; -using firebase::firestore::util::CreateNoOpConnectivityMonitor; + +@class GRPCProtoCall; NS_ASSUME_NONNULL_BEGIN #pragma mark - FSTMockWatchStream -namespace firebase { -namespace firestore { -namespace remote { - -class MockWatchStream : public WatchStream { - public: - MockWatchStream(AsyncQueue *worker_queue, - CredentialsProvider *credentials_provider, - FSTSerializerBeta *serializer, - GrpcConnection *grpc_connection, - id delegate, - FSTMockDatastore *datastore) - : WatchStream{worker_queue, credentials_provider, serializer, grpc_connection, delegate}, - datastore_{datastore}, - delegate_{delegate} { - active_targets_ = [NSMutableDictionary dictionary]; - } +@interface FSTMockWatchStream : FSTWatchStream - NSDictionary *ActiveTargets() const { - return [active_targets_ copy]; - } +- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; - void Start() override { - HARD_ASSERT(!open_, "Trying to start already started watch stream"); - open_ = true; - [delegate_ watchStreamDidOpen]; - } +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer NS_UNAVAILABLE; - void Stop() override { - WatchStream::Stop(); - open_ = false; - [active_targets_ removeAllObjects]; - } +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; - bool IsStarted() const override { - return open_; - } - bool IsOpen() const override { - return open_; - } +@property(nonatomic, assign) BOOL open; +@property(nonatomic, strong, readonly) FSTMockDatastore *datastore; +@property(nonatomic, strong, readonly) + NSMutableDictionary *activeTargets; +@property(nonatomic, weak, readwrite, nullable) id delegate; - void WatchQuery(FSTQueryData *query) override { - LOG_DEBUG("WatchQuery: %s: %s, %s", query.targetID, query.query, query.resumeToken); +@end - // Snapshot version is ignored on the wire - FSTQueryData *sentQueryData = [query queryDataByReplacingSnapshotVersion:SnapshotVersion::None() - resumeToken:query.resumeToken - sequenceNumber:query.sequenceNumber]; - datastore_.watchStreamRequestCount += 1; - active_targets_[@(query.targetID)] = sentQueryData; +@implementation FSTMockWatchStream + +- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer { + self = [super initWithDatabase:datastore.databaseInfo + workerDispatchQueue:workerDispatchQueue + credentials:credentials + serializer:serializer]; + if (self) { + HARD_ASSERT(datastore, "Datastore must not be nil"); + _datastore = datastore; + _activeTargets = [NSMutableDictionary dictionary]; } + return self; +} - void UnwatchTargetId(model::TargetId target_id) override { - LOG_DEBUG("UnwatchTargetId: %s", target_id); - [active_targets_ removeObjectForKey:@(target_id)]; - } +#pragma mark - Overridden FSTWatchStream methods. - void FailStreamWithError(NSError *error) { - open_ = false; - [delegate_ watchStreamWasInterruptedWithError:error]; - } +- (void)startWithDelegate:(id)delegate { + HARD_ASSERT(!self.open, "Trying to start already started watch stream"); + self.open = YES; + self.delegate = delegate; + [self notifyStreamOpen]; +} - void WriteWatchChange(FSTWatchChange *change, SnapshotVersion snap) { - if ([change isKindOfClass:[FSTWatchTargetChange class]]) { - FSTWatchTargetChange *targetChange = (FSTWatchTargetChange *)change; - if (targetChange.cause) { - for (NSNumber *target_id in targetChange.targetIDs) { - if (!active_targets_[target_id]) { - // Technically removing an unknown target is valid (e.g. it could race with a - // server-side removal), but we want to pay extra careful attention in tests - // that we only remove targets we listened to. - HARD_FAIL("Removing a non-active target"); - } - - [active_targets_ removeObjectForKey:target_id]; - } - } +- (void)stop { + [self.activeTargets removeAllObjects]; + self.delegate = nil; +} - if ([targetChange.targetIDs count] != 0) { - // If the list of target IDs is not empty, we reset the snapshot version to NONE as - // done in `FSTSerializerBeta.versionFromListenResponse:`. - snap = SnapshotVersion::None(); +- (BOOL)isOpen { + return self.open; +} + +- (BOOL)isStarted { + return self.open; +} + +- (void)notifyStreamOpen { + [self.delegate watchStreamDidOpen]; +} + +- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { + [self.delegate watchStreamWasInterruptedWithError:error]; +} + +- (void)watchQuery:(FSTQueryData *)query { + LOG_DEBUG("watchQuery: %s: %s", query.targetID, query.query); + self.datastore.watchStreamRequestCount += 1; + // Snapshot version is ignored on the wire + FSTQueryData *sentQueryData = [query queryDataByReplacingSnapshotVersion:SnapshotVersion::None() + resumeToken:query.resumeToken + sequenceNumber:query.sequenceNumber]; + self.activeTargets[@(query.targetID)] = sentQueryData; +} + +- (void)unwatchTargetID:(TargetId)targetID { + LOG_DEBUG("unwatchTargetID: %s", targetID); + [self.activeTargets removeObjectForKey:@(targetID)]; +} + +- (void)failStreamWithError:(NSError *)error { + self.open = NO; + [self notifyStreamInterruptedWithError:error]; +} + +#pragma mark - Helper methods. + +- (void)writeWatchChange:(FSTWatchChange *)change snapshotVersion:(SnapshotVersion)snap { + if ([change isKindOfClass:[FSTWatchTargetChange class]]) { + FSTWatchTargetChange *targetChange = (FSTWatchTargetChange *)change; + if (targetChange.cause) { + for (NSNumber *targetID in targetChange.targetIDs) { + if (!self.activeTargets[targetID]) { + // Technically removing an unknown target is valid (e.g. it could race with a + // server-side removal), but we want to pay extra careful attention in tests + // that we only remove targets we listened too. + HARD_FAIL("Removing a non-active target"); + } + [self.activeTargets removeObjectForKey:targetID]; } } - - [delegate_ watchStreamDidChange:change snapshotVersion:snap]; + if ([targetChange.targetIDs count] != 0) { + // If the list of target IDs is not empty, we reset the snapshot version to NONE as + // done in `FSTSerializerBeta.versionFromListenResponse:`. + snap = SnapshotVersion::None(); + } } + [self.delegate watchStreamDidChange:change snapshotVersion:snap]; +} - private: - bool open_ = false; - NSMutableDictionary *active_targets_ = nullptr; - FSTMockDatastore *datastore_ = nullptr; - id delegate_ = nullptr; -}; - -class MockWriteStream : public WriteStream { - public: - MockWriteStream(AsyncQueue *worker_queue, - CredentialsProvider *credentials_provider, - FSTSerializerBeta *serializer, - GrpcConnection *grpc_connection, - id delegate, - FSTMockDatastore *datastore) - : WriteStream{worker_queue, credentials_provider, serializer, grpc_connection, delegate}, - datastore_{datastore}, - delegate_{delegate} { - } +@end - void Start() override { - HARD_ASSERT(!open_, "Trying to start already started write stream"); - open_ = true; - sent_mutations_ = {}; - [delegate_ writeStreamDidOpen]; - } +#pragma mark - FSTMockWriteStream - void Stop() override { - datastore_.writeStreamRequestCount += 1; - WriteStream::Stop(); +@interface FSTWriteStream () - sent_mutations_ = {}; - open_ = false; - SetHandshakeComplete(false); - } +@property(nonatomic, weak, readwrite, nullable) id delegate; - bool IsStarted() const override { - return open_; - } - bool IsOpen() const override { - return open_; - } +- (void)notifyStreamOpen; +- (void)notifyStreamInterruptedWithError:(nullable NSError *)error; - void WriteHandshake() override { - datastore_.writeStreamRequestCount += 1; - SetHandshakeComplete(); - [delegate_ writeStreamDidCompleteHandshake]; - } +@end - void WriteMutations(NSArray *mutations) override { - datastore_.writeStreamRequestCount += 1; - sent_mutations_.push(mutations); - } +@interface FSTMockWriteStream : FSTWriteStream - /** Injects a write ack as though it had come from the backend in response to a write. */ - void AckWrite(const SnapshotVersion &commitVersion, NSArray *results) { - [delegate_ writeStreamDidReceiveResponseWithVersion:commitVersion mutationResults:results]; - } +- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; - /** Injects a failed write response as though it had come from the backend. */ - void FailStreamWithError(NSError *error) { - open_ = false; - [delegate_ writeStreamWasInterruptedWithError:error]; - } +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer NS_UNAVAILABLE; - /** - * Returns the next write that was "sent to the backend", failing if there are no queued sent - */ - NSArray *NextSentWrite() { - HARD_ASSERT(!sent_mutations_.empty(), - "Writes need to happen before you can call NextSentWrite."); - NSArray *result = std::move(sent_mutations_.front()); - sent_mutations_.pop(); - return result; - } +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; + +@property(nonatomic, strong, readonly) FSTMockDatastore *datastore; +@property(nonatomic, assign) BOOL open; +@property(nonatomic, strong, readonly) NSMutableArray *> *sentMutations; - /** - * Returns the number of mutations that have been sent to the backend but not retrieved via - * nextSentWrite yet. - */ - int sent_mutations_count() const { - return static_cast(sent_mutations_.size()); +@end + +@implementation FSTMockWriteStream + +- (instancetype)initWithDatastore:(FSTMockDatastore *)datastore + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer { + self = [super initWithDatabase:datastore.databaseInfo + workerDispatchQueue:workerDispatchQueue + credentials:credentials + serializer:serializer]; + if (self) { + HARD_ASSERT(datastore, "Datastore must not be nil"); + _datastore = datastore; + _sentMutations = [NSMutableArray array]; } + return self; +} + +#pragma mark - Overridden FSTWriteStream methods. + +- (void)startWithDelegate:(id)delegate { + HARD_ASSERT(!self.open, "Trying to start already started write stream"); + self.open = YES; + [self.sentMutations removeAllObjects]; + self.delegate = delegate; + [self notifyStreamOpen]; +} + +- (BOOL)isOpen { + return self.open; +} - private: - bool open_ = false; - std::queue *> sent_mutations_; - FSTMockDatastore *datastore_ = nullptr; - id delegate_ = nullptr; -}; +- (BOOL)isStarted { + return self.open; +} -} // namespace remote -} // namespace firestore -} // namespace firebase +- (void)writeHandshake { + self.datastore.writeStreamRequestCount += 1; + self.handshakeComplete = YES; + [self.delegate writeStreamDidCompleteHandshake]; +} -using firebase::firestore::remote::MockWatchStream; -using firebase::firestore::remote::MockWriteStream; +- (void)writeMutations:(NSArray *)mutations { + self.datastore.writeStreamRequestCount += 1; + [self.sentMutations addObject:mutations]; +} + +#pragma mark - Helper methods. + +/** Injects a write ack as though it had come from the backend in response to a write. */ +- (void)ackWriteWithVersion:(const SnapshotVersion &)commitVersion + mutationResults:(NSArray *)results { + [self.delegate writeStreamDidReceiveResponseWithVersion:commitVersion mutationResults:results]; +} + +/** Injects a failed write response as though it had come from the backend. */ +- (void)failStreamWithError:(NSError *)error { + self.open = NO; + [self notifyStreamInterruptedWithError:error]; +} + +/** + * Returns the next write that was "sent to the backend", failing if there are no queued sent + */ +- (NSArray *)nextSentWrite { + HARD_ASSERT(self.sentMutations.count > 0, + "Writes need to happen before you can call nextSentWrite."); + NSArray *result = [self.sentMutations objectAtIndex:0]; + [self.sentMutations removeObjectAtIndex:0]; + return result; +} + +/** + * Returns the number of mutations that have been sent to the backend but not retrieved via + * nextSentWrite yet. + */ +- (int)sentMutationsCount { + return (int)self.sentMutations.count; +} + +@end + +#pragma mark - FSTMockDatastore @interface FSTMockDatastore () +@property(nonatomic, strong, nullable) FSTMockWatchStream *watchStream; +@property(nonatomic, strong, nullable) FSTMockWriteStream *writeStream; /** Properties implemented in FSTDatastore that are nonpublic. */ @property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue; @@ -254,84 +292,85 @@ @interface FSTMockDatastore () @end -@implementation FSTMockDatastore { - std::shared_ptr _watchStream; - std::shared_ptr _writeStream; - - std::unique_ptr _connectivityMonitor; - grpc::CompletionQueue _grpcQueue; - std::unique_ptr _grpcConnection; -} +@implementation FSTMockDatastore #pragma mark - Overridden FSTDatastore methods. -- (instancetype)initWithDatabaseInfo:(const DatabaseInfo *)databaseInfo - workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue - credentials:(CredentialsProvider *)credentials { - if (self = [super initWithDatabaseInfo:databaseInfo - workerDispatchQueue:workerDispatchQueue - credentials:credentials]) { - _workerDispatchQueue = workerDispatchQueue; - _credentials = credentials; - _connectivityMonitor = CreateNoOpConnectivityMonitor(); - _grpcConnection = - absl::make_unique(*databaseInfo, [workerDispatchQueue implementation], - &_grpcQueue, _connectivityMonitor.get()); - } - return self; +- (FSTWatchStream *)createWatchStream { + self.watchStream = [[FSTMockWatchStream alloc] + initWithDatastore:self + workerDispatchQueue:self.workerDispatchQueue + credentials:self.credentials + serializer:[[FSTSerializerBeta alloc] + initWithDatabaseID:&self.databaseInfo->database_id()]]; + return self.watchStream; } -- (std::shared_ptr)createWatchStreamWithDelegate:(id)delegate { - _watchStream = std::make_shared( - [self.workerDispatchQueue implementation], self.credentials, - [[FSTSerializerBeta alloc] initWithDatabaseID:&self.databaseInfo->database_id()], - _grpcConnection.get(), delegate, self); - - return _watchStream; +- (FSTWriteStream *)createWriteStream { + self.writeStream = [[FSTMockWriteStream alloc] + initWithDatastore:self + workerDispatchQueue:self.workerDispatchQueue + credentials:self.credentials + serializer:[[FSTSerializerBeta alloc] + initWithDatabaseID:&self.databaseInfo->database_id()]]; + return self.writeStream; } -- (std::shared_ptr)createWriteStreamWithDelegate:(id)delegate { - _writeStream = std::make_shared( - [self.workerDispatchQueue implementation], self.credentials, - [[FSTSerializerBeta alloc] initWithDatabaseID:&self.databaseInfo->database_id()], - _grpcConnection.get(), delegate, self); - - return _writeStream; +- (void)authorizeAndStartRPC:(GRPCProtoCall *)rpc completion:(FSTVoidErrorBlock)completion { + HARD_FAIL("FSTMockDatastore shouldn't be starting any RPCs."); } #pragma mark - Method exposed for tests to call. - (NSArray *)nextSentWrite { - return _writeStream->NextSentWrite(); + return [self.writeStream nextSentWrite]; } - (int)writesSent { - return _writeStream->sent_mutations_count(); + return [self.writeStream sentMutationsCount]; } -- (void)ackWriteWithVersion:(const SnapshotVersion &)version +- (void)ackWriteWithVersion:(const SnapshotVersion &)commitVersion mutationResults:(NSArray *)results { - _writeStream->AckWrite(version, results); + [self.writeStream ackWriteWithVersion:commitVersion mutationResults:results]; } - (void)failWriteWithError:(NSError *_Nullable)error { - _writeStream->FailStreamWithError(error); + [self.writeStream failStreamWithError:error]; +} + +- (void)writeWatchTargetAddedWithTargetIDs:(NSArray *)targetIDs { + FSTWatchTargetChange *change = + [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateAdded + targetIDs:targetIDs + cause:nil]; + [self writeWatchChange:change snapshotVersion:SnapshotVersion::None()]; +} + +- (void)writeWatchCurrentWithTargetIDs:(NSArray *)targetIDs + snapshotVersion:(const SnapshotVersion &)snapshotVersion + resumeToken:(NSData *)resumeToken { + FSTWatchTargetChange *change = + [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateCurrent + targetIDs:targetIDs + resumeToken:resumeToken]; + [self writeWatchChange:change snapshotVersion:snapshotVersion]; } - (void)writeWatchChange:(FSTWatchChange *)change snapshotVersion:(const SnapshotVersion &)snap { - _watchStream->WriteWatchChange(change, snap); + [self.watchStream writeWatchChange:change snapshotVersion:snap]; } - (void)failWatchStreamWithError:(NSError *)error { - _watchStream->FailStreamWithError(error); + [self.watchStream failStreamWithError:error]; } - (NSDictionary *)activeTargets { - return _watchStream->ActiveTargets(); + return [self.watchStream.activeTargets copy]; } - (BOOL)isWatchStreamOpen { - return _watchStream->IsOpen(); + return self.watchStream.isOpen; } @end diff --git a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm index a8b4ff392cf..6100ef1b305 100644 --- a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm +++ b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm @@ -17,6 +17,7 @@ #import "Firestore/Example/Tests/SpecTests/FSTSpecTests.h" #import +#import #include #include diff --git a/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm b/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm index 330dc25fbe8..7107d6183f9 100644 --- a/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm +++ b/Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm @@ -17,6 +17,7 @@ #import "Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.h" #import +#import #include #include diff --git a/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm b/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm index e1b06e686e1..9cf85ae4e38 100644 --- a/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm +++ b/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm @@ -27,6 +27,8 @@ #import #import #import +#import +#import #include #include @@ -96,6 +98,10 @@ - (void)tearDown { [self shutdownFirestore:firestore]; } } @finally { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [GRPCCall closeOpenConnections]; +#pragma clang diagnostic pop _firestores = nil; [super tearDown]; } @@ -159,8 +165,9 @@ + (void)setUpDefaults { "Alternatively, if you're a Googler with a Hexa preproduction environment, run " "setup_integration_tests.py to properly configure testing SSL certificates."); } - GrpcConnection::UseTestCertificate(util::MakeString(defaultSettings.host), - Path::FromNSString(certsPath), "test_cert_2"); + [GRPCCall useTestCertsPath:certsPath testName:@"test_cert_2" forHost:defaultSettings.host]; + GrpcConnection::UseTestCertificate([certsPath cStringUsingEncoding:NSASCIIStringEncoding], + "test_cert_2"); } + (NSString *)projectID { diff --git a/Firestore/Protos/CMakeLists.txt b/Firestore/Protos/CMakeLists.txt index 59d357c0b11..ae418a2ad23 100644 --- a/Firestore/Protos/CMakeLists.txt +++ b/Firestore/Protos/CMakeLists.txt @@ -111,6 +111,9 @@ endfunction() # # Libprotobuf Objective-C also includes the well-known protos so they must be # omitted here. +# +# The Objective-C client also uses the generated gRPC stubs for the Firestore +# service. set( PROTOBUF_OBJC_GENERATED_SOURCES ${OUTPUT_DIR}/objc/google/firestore/v1beta1/Firestore.pbrpc.h @@ -281,10 +284,12 @@ add_custom_command( ${CMAKE_CURRENT_SOURCE_DIR}/build_protos.py --objc --protoc=$ + --protoc_gen_grpc=$ --output_dir=${OUTPUT_DIR} ${PROTO_INCLUDES} VERBATIM DEPENDS + grpc_objective_c_plugin protoc ${CMAKE_CURRENT_SOURCE_DIR}/build_protos.py ${PROTO_FILES} diff --git a/Firestore/Protos/build_protos.py b/Firestore/Protos/build_protos.py index 7d305094993..997537731d1 100755 --- a/Firestore/Protos/build_protos.py +++ b/Firestore/Protos/build_protos.py @@ -78,6 +78,9 @@ def main(): parser.add_argument( '--include', '-I', action='append', default=[], help='Adds INCLUDE to the proto path.') + parser.add_argument( + '--protoc_gen_grpc', + help='Location of the gRPC generator executable.') args = parser.parse_args() if args.nanopb is None and args.cpp is None and args.objc is None: @@ -162,10 +165,14 @@ def run(self): ) def __run_generator(self, out_dir): - """Invokes protoc using the objc plugin.""" + """Invokes protoc using the objc and grpc plugins.""" cmd = protoc_command(self.args) - cmd.extend(['--objc_out=' + out_dir]) + gen = self.args.protoc_gen_grpc + if gen is not None: + cmd.append('--plugin=protoc-gen-grpc=%s' % gen) + + cmd.extend(['--objc_out=' + out_dir, '--grpc_out=' + out_dir]) cmd.extend(self.proto_files) run_protoc(self.args, cmd) diff --git a/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h b/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h new file mode 100644 index 00000000000..63e75b1afa4 --- /dev/null +++ b/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h @@ -0,0 +1,268 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO) || !GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO +#import "Firestore.pbobjc.h" +#endif + +#if !defined(GPB_GRPC_PROTOCOL_ONLY) || !GPB_GRPC_PROTOCOL_ONLY +#import +#import +#import +#import +#endif + +@class GCFSBatchGetDocumentsRequest; +@class GCFSBatchGetDocumentsResponse; +@class GCFSBeginTransactionRequest; +@class GCFSBeginTransactionResponse; +@class GCFSCommitRequest; +@class GCFSCommitResponse; +@class GCFSCreateDocumentRequest; +@class GCFSDeleteDocumentRequest; +@class GCFSDocument; +@class GCFSGetDocumentRequest; +@class GCFSListCollectionIdsRequest; +@class GCFSListCollectionIdsResponse; +@class GCFSListDocumentsRequest; +@class GCFSListDocumentsResponse; +@class GCFSListenRequest; +@class GCFSListenResponse; +@class GCFSRollbackRequest; +@class GCFSRunQueryRequest; +@class GCFSRunQueryResponse; +@class GCFSUpdateDocumentRequest; +@class GCFSWriteRequest; +@class GCFSWriteResponse; +@class GPBEmpty; + +#if !defined(GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO) || !GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO + #import "Annotations.pbobjc.h" + #import "Common.pbobjc.h" + #import "Document.pbobjc.h" + #import "Query.pbobjc.h" + #import "Write.pbobjc.h" +#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS + #import +#else + #import "Empty.pbobjc.h" +#endif +#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS + #import +#else + #import "Timestamp.pbobjc.h" +#endif + #import "Status.pbobjc.h" +#endif + +@class GRPCProtoCall; + + +NS_ASSUME_NONNULL_BEGIN + +@protocol GCFSFirestore + +#pragma mark GetDocument(GetDocumentRequest) returns (Document) + +/** + * Gets a single document. + */ +- (void)getDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; + +/** + * Gets a single document. + */ +- (GRPCProtoCall *)RPCToGetDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark ListDocuments(ListDocumentsRequest) returns (ListDocumentsResponse) + +/** + * Lists documents. + */ +- (void)listDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler; + +/** + * Lists documents. + */ +- (GRPCProtoCall *)RPCToListDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark CreateDocument(CreateDocumentRequest) returns (Document) + +/** + * Creates a new document. + */ +- (void)createDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; + +/** + * Creates a new document. + */ +- (GRPCProtoCall *)RPCToCreateDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark UpdateDocument(UpdateDocumentRequest) returns (Document) + +/** + * Updates or inserts a document. + */ +- (void)updateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; + +/** + * Updates or inserts a document. + */ +- (GRPCProtoCall *)RPCToUpdateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark DeleteDocument(DeleteDocumentRequest) returns (Empty) + +/** + * Deletes a document. + */ +- (void)deleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; + +/** + * Deletes a document. + */ +- (GRPCProtoCall *)RPCToDeleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark BatchGetDocuments(BatchGetDocumentsRequest) returns (stream BatchGetDocumentsResponse) + +/** + * Gets multiple documents. + * + * Documents returned by this method are not guaranteed to be returned in the + * same order that they were requested. + */ +- (void)batchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler; + +/** + * Gets multiple documents. + * + * Documents returned by this method are not guaranteed to be returned in the + * same order that they were requested. + */ +- (GRPCProtoCall *)RPCToBatchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler; + + +#pragma mark BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) + +/** + * Starts a new transaction. + */ +- (void)beginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler; + +/** + * Starts a new transaction. + */ +- (GRPCProtoCall *)RPCToBeginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark Commit(CommitRequest) returns (CommitResponse) + +/** + * Commits a transaction, while optionally updating documents. + */ +- (void)commitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler; + +/** + * Commits a transaction, while optionally updating documents. + */ +- (GRPCProtoCall *)RPCToCommitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark Rollback(RollbackRequest) returns (Empty) + +/** + * Rolls back a transaction. + */ +- (void)rollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; + +/** + * Rolls back a transaction. + */ +- (GRPCProtoCall *)RPCToRollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark RunQuery(RunQueryRequest) returns (stream RunQueryResponse) + +/** + * Runs a query. + */ +- (void)runQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler; + +/** + * Runs a query. + */ +- (GRPCProtoCall *)RPCToRunQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler; + + +#pragma mark Write(stream WriteRequest) returns (stream WriteResponse) + +/** + * Streams batches of document updates and deletes, in order. + */ +- (void)writeWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler; + +/** + * Streams batches of document updates and deletes, in order. + */ +- (GRPCProtoCall *)RPCToWriteWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler; + + +#pragma mark Listen(stream ListenRequest) returns (stream ListenResponse) + +/** + * Listens to changes. + */ +- (void)listenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler; + +/** + * Listens to changes. + */ +- (GRPCProtoCall *)RPCToListenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler; + + +#pragma mark ListCollectionIds(ListCollectionIdsRequest) returns (ListCollectionIdsResponse) + +/** + * Lists all the collection IDs underneath a document. + */ +- (void)listCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler; + +/** + * Lists all the collection IDs underneath a document. + */ +- (GRPCProtoCall *)RPCToListCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler; + + +@end + + +#if !defined(GPB_GRPC_PROTOCOL_ONLY) || !GPB_GRPC_PROTOCOL_ONLY +/** + * Basic service implementation, over gRPC, that only does + * marshalling and parsing. + */ +@interface GCFSFirestore : GRPCProtoService +- (instancetype)initWithHost:(NSString *)host NS_DESIGNATED_INITIALIZER; ++ (instancetype)serviceWithHost:(NSString *)host; +@end +#endif + +NS_ASSUME_NONNULL_END + diff --git a/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m b/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m new file mode 100644 index 00000000000..be4fea3df97 --- /dev/null +++ b/Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.m @@ -0,0 +1,306 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(GPB_GRPC_PROTOCOL_ONLY) || !GPB_GRPC_PROTOCOL_ONLY +#import "Firestore.pbrpc.h" +#import "Firestore.pbobjc.h" +#import +#import + +#import "Annotations.pbobjc.h" +#import "Common.pbobjc.h" +#import "Document.pbobjc.h" +#import "Query.pbobjc.h" +#import "Write.pbobjc.h" +#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS +#import +#else +#import "Empty.pbobjc.h" +#endif +#if defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS) && GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS +#import +#else +#import "Timestamp.pbobjc.h" +#endif +#import "Status.pbobjc.h" + +@implementation GCFSFirestore + +// Designated initializer +- (instancetype)initWithHost:(NSString *)host { + self = [super initWithHost:host + packageName:@"google.firestore.v1beta1" + serviceName:@"Firestore"]; + return self; +} + +// Override superclass initializer to disallow different package and service names. +- (instancetype)initWithHost:(NSString *)host + packageName:(NSString *)packageName + serviceName:(NSString *)serviceName { + return [self initWithHost:host]; +} + +#pragma mark - Class Methods + ++ (instancetype)serviceWithHost:(NSString *)host { + return [[self alloc] initWithHost:host]; +} + +#pragma mark - Method Implementations + +#pragma mark GetDocument(GetDocumentRequest) returns (Document) + +/** + * Gets a single document. + */ +- (void)getDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToGetDocumentWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Gets a single document. + */ +- (GRPCProtoCall *)RPCToGetDocumentWithRequest:(GCFSGetDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"GetDocument" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSDocument class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark ListDocuments(ListDocumentsRequest) returns (ListDocumentsResponse) + +/** + * Lists documents. + */ +- (void)listDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToListDocumentsWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Lists documents. + */ +- (GRPCProtoCall *)RPCToListDocumentsWithRequest:(GCFSListDocumentsRequest *)request handler:(void(^)(GCFSListDocumentsResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"ListDocuments" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSListDocumentsResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark CreateDocument(CreateDocumentRequest) returns (Document) + +/** + * Creates a new document. + */ +- (void)createDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToCreateDocumentWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Creates a new document. + */ +- (GRPCProtoCall *)RPCToCreateDocumentWithRequest:(GCFSCreateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"CreateDocument" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSDocument class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark UpdateDocument(UpdateDocumentRequest) returns (Document) + +/** + * Updates or inserts a document. + */ +- (void)updateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToUpdateDocumentWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Updates or inserts a document. + */ +- (GRPCProtoCall *)RPCToUpdateDocumentWithRequest:(GCFSUpdateDocumentRequest *)request handler:(void(^)(GCFSDocument *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"UpdateDocument" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSDocument class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark DeleteDocument(DeleteDocumentRequest) returns (Empty) + +/** + * Deletes a document. + */ +- (void)deleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToDeleteDocumentWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Deletes a document. + */ +- (GRPCProtoCall *)RPCToDeleteDocumentWithRequest:(GCFSDeleteDocumentRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"DeleteDocument" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GPBEmpty class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark BatchGetDocuments(BatchGetDocumentsRequest) returns (stream BatchGetDocumentsResponse) + +/** + * Gets multiple documents. + * + * Documents returned by this method are not guaranteed to be returned in the + * same order that they were requested. + */ +- (void)batchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + [[self RPCToBatchGetDocumentsWithRequest:request eventHandler:eventHandler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Gets multiple documents. + * + * Documents returned by this method are not guaranteed to be returned in the + * same order that they were requested. + */ +- (GRPCProtoCall *)RPCToBatchGetDocumentsWithRequest:(GCFSBatchGetDocumentsRequest *)request eventHandler:(void(^)(BOOL done, GCFSBatchGetDocumentsResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + return [self RPCToMethod:@"BatchGetDocuments" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSBatchGetDocumentsResponse class] + responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; +} +#pragma mark BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) + +/** + * Starts a new transaction. + */ +- (void)beginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToBeginTransactionWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Starts a new transaction. + */ +- (GRPCProtoCall *)RPCToBeginTransactionWithRequest:(GCFSBeginTransactionRequest *)request handler:(void(^)(GCFSBeginTransactionResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"BeginTransaction" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSBeginTransactionResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark Commit(CommitRequest) returns (CommitResponse) + +/** + * Commits a transaction, while optionally updating documents. + */ +- (void)commitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToCommitWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Commits a transaction, while optionally updating documents. + */ +- (GRPCProtoCall *)RPCToCommitWithRequest:(GCFSCommitRequest *)request handler:(void(^)(GCFSCommitResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"Commit" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSCommitResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark Rollback(RollbackRequest) returns (Empty) + +/** + * Rolls back a transaction. + */ +- (void)rollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToRollbackWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Rolls back a transaction. + */ +- (GRPCProtoCall *)RPCToRollbackWithRequest:(GCFSRollbackRequest *)request handler:(void(^)(GPBEmpty *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"Rollback" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GPBEmpty class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +#pragma mark RunQuery(RunQueryRequest) returns (stream RunQueryResponse) + +/** + * Runs a query. + */ +- (void)runQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + [[self RPCToRunQueryWithRequest:request eventHandler:eventHandler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Runs a query. + */ +- (GRPCProtoCall *)RPCToRunQueryWithRequest:(GCFSRunQueryRequest *)request eventHandler:(void(^)(BOOL done, GCFSRunQueryResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + return [self RPCToMethod:@"RunQuery" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSRunQueryResponse class] + responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; +} +#pragma mark Write(stream WriteRequest) returns (stream WriteResponse) + +/** + * Streams batches of document updates and deletes, in order. + */ +- (void)writeWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + [[self RPCToWriteWithRequestsWriter:requestWriter eventHandler:eventHandler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Streams batches of document updates and deletes, in order. + */ +- (GRPCProtoCall *)RPCToWriteWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSWriteResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + return [self RPCToMethod:@"Write" + requestsWriter:requestWriter + responseClass:[GCFSWriteResponse class] + responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; +} +#pragma mark Listen(stream ListenRequest) returns (stream ListenResponse) + +/** + * Listens to changes. + */ +- (void)listenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + [[self RPCToListenWithRequestsWriter:requestWriter eventHandler:eventHandler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Listens to changes. + */ +- (GRPCProtoCall *)RPCToListenWithRequestsWriter:(GRXWriter *)requestWriter eventHandler:(void(^)(BOOL done, GCFSListenResponse *_Nullable response, NSError *_Nullable error))eventHandler{ + return [self RPCToMethod:@"Listen" + requestsWriter:requestWriter + responseClass:[GCFSListenResponse class] + responsesWriteable:[GRXWriteable writeableWithEventHandler:eventHandler]]; +} +#pragma mark ListCollectionIds(ListCollectionIdsRequest) returns (ListCollectionIdsResponse) + +/** + * Lists all the collection IDs underneath a document. + */ +- (void)listCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCToListCollectionIdsWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +/** + * Lists all the collection IDs underneath a document. + */ +- (GRPCProtoCall *)RPCToListCollectionIdsWithRequest:(GCFSListCollectionIdsRequest *)request handler:(void(^)(GCFSListCollectionIdsResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"ListCollectionIds" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GCFSListCollectionIdsResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +@end +#endif diff --git a/Firestore/Source/API/FIRDocumentReference.mm b/Firestore/Source/API/FIRDocumentReference.mm index d502a51c98b..54d9c73d640 100644 --- a/Firestore/Source/API/FIRDocumentReference.mm +++ b/Firestore/Source/API/FIRDocumentReference.mm @@ -16,6 +16,8 @@ #import "FIRDocumentReference.h" +#import + #include #include diff --git a/Firestore/Source/Core/FSTSyncEngine.mm b/Firestore/Source/Core/FSTSyncEngine.mm index 6851fb43809..0bf10880963 100644 --- a/Firestore/Source/Core/FSTSyncEngine.mm +++ b/Firestore/Source/Core/FSTSyncEngine.mm @@ -16,6 +16,8 @@ #import "Firestore/Source/Core/FSTSyncEngine.h" +#import + #include #include #include diff --git a/Firestore/Source/Core/FSTTransaction.mm b/Firestore/Source/Core/FSTTransaction.mm index ba9ae00ad4f..84166632c52 100644 --- a/Firestore/Source/Core/FSTTransaction.mm +++ b/Firestore/Source/Core/FSTTransaction.mm @@ -16,6 +16,8 @@ #import "Firestore/Source/Core/FSTTransaction.h" +#import + #include #include #include diff --git a/Firestore/Source/Remote/FSTBufferedWriter.h b/Firestore/Source/Remote/FSTBufferedWriter.h new file mode 100644 index 00000000000..83fada69f0e --- /dev/null +++ b/Firestore/Source/Remote/FSTBufferedWriter.h @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * A buffered GRXWriter. + * + * GRPC only allows a single message to be written to a channel at a time. While the channel is + * sending, GRPC sets the state of the GRXWriter representing the request stream to + * GRXWriterStatePaused. Once the channel is ready to accept more messages GRPC sets the state of + * the writer to GRXWriterStateStarted. + * + * This class is NOT thread safe, even though it is accessed from multiple threads. To conform with + * the contract GRPC uses, all method calls on the FSTBufferedWriter must be @synchronized on the + * receiver. + */ +@interface FSTBufferedWriter : GRXWriter + +/** + * Writes a message into the buffer. Must be called inside an @synchronized block on the receiver. + */ +- (void)writeValue:(id)value; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTBufferedWriter.mm b/Firestore/Source/Remote/FSTBufferedWriter.mm new file mode 100644 index 00000000000..47dbb21c0fc --- /dev/null +++ b/Firestore/Source/Remote/FSTBufferedWriter.mm @@ -0,0 +1,134 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "Firestore/Source/Remote/FSTBufferedWriter.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FSTBufferedWriter { + GRXWriterState _state; + NSMutableArray *_queue; + + id _writeable; +} + +- (instancetype)init { + if (self = [super init]) { + _state = GRXWriterStateNotStarted; + _queue = [[NSMutableArray alloc] init]; + } + return self; +} + +#pragma mark - GRXWriteable implementation + +/** Push the next value of the sequence to the receiving object. */ +- (void)writeValue:(id)value { + if (_state == GRXWriterStateStarted && _queue.count == 0) { + // Skip the queue. + [_writeable writeValue:value]; + } else { + // Buffer the new value. Note that the value is assumed to be transient and doesn't need to + // be copied. + [_queue addObject:value]; + } +} + +/** + * Signal that the sequence is completed, or that an error ocurred. After this message is sent to + * the receiver, neither it nor writeValue: may be called again. + */ +- (void)writesFinishedWithError:(nullable NSError *)error { + // Unimplemented. If we ever wanted to implement sender-side initiated half close we could do so + // by buffering (or sending) and error. + [self doesNotRecognizeSelector:_cmd]; +} + +#pragma mark GRXWriter implementation +// The GRXWriter implementation defines the send side of the RPC stream. Once the RPC is ready it +// will call startWithWriteable passing a GRXWriteable into which requests can be written but only +// when the GRXWriter is in the started state. + +/** + * Called by GRPCCall when it is ready to accept for the first request. Requests should be written + * to the passed writeable. + * + * GRPCCall will synchronize on the receiver around this call. + */ +- (void)startWithWriteable:(id)writeable { + _state = GRXWriterStateStarted; + _writeable = writeable; +} + +/** + * Called by GRPCCall to implement flow control on the sending side of the stream. After each + * writeValue: on the requestsWriteable, GRPCCall will call setState:GRXWriterStatePaused to apply + * backpressure. Once the stream is ready to accept another message, GRPCCall will call + * setState:GRXWriterStateStarted. + * + * GRPCCall will synchronize on the receiver around this call. + */ +- (void)setState:(GRXWriterState)newState { + // Manual transitions are only allowed from the started or paused states. + if (_state == GRXWriterStateNotStarted || _state == GRXWriterStateFinished) { + return; + } + + switch (newState) { + case GRXWriterStateFinished: + _state = newState; + // Per GRXWriter's contract, setting the state to Finished manually means one doesn't wish the + // writeable to be messaged anymore. + _queue = nil; + _writeable = nil; + return; + case GRXWriterStatePaused: + _state = newState; + return; + case GRXWriterStateStarted: + if (_state == GRXWriterStatePaused) { + _state = newState; + [self writeBufferedMessages]; + } + return; + case GRXWriterStateNotStarted: + return; + } +} + +- (void)finishWithError:(nullable NSError *)error { + [_writeable writesFinishedWithError:error]; + self.state = GRXWriterStateFinished; +} + +- (void)writeBufferedMessages { + while (_state == GRXWriterStateStarted && _queue.count > 0) { + id value = _queue[0]; + [_queue removeObjectAtIndex:0]; + + // In addition to writing the value here GRPC will apply backpressure by pausing the GRXWriter + // wrapping this buffer. That writer must call -pauseMessages which will cause this loop to + // exit. Synchronization is not required since the callback happens within the body of the + // writeValue implementation. + [_writeable writeValue:value]; + } +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTDatastore.h b/Firestore/Source/Remote/FSTDatastore.h index b5f31840940..da14b6e1b90 100644 --- a/Firestore/Source/Remote/FSTDatastore.h +++ b/Firestore/Source/Remote/FSTDatastore.h @@ -16,19 +16,14 @@ #import -#include #include #import "Firestore/Source/Core/FSTTypes.h" -#include "Firestore/core/src/firebase/firestore//remote/watch_stream.h" -#include "Firestore/core/src/firebase/firestore//remote/write_stream.h" #include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h" #include "Firestore/core/src/firebase/firestore/core/database_info.h" #include "Firestore/core/src/firebase/firestore/model/database_id.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" -#include "Firestore/core/src/firebase/firestore/remote/datastore.h" -#include "absl/memory/memory.h" #include "absl/strings/string_view.h" @class FSTDispatchQueue; @@ -37,6 +32,10 @@ @class FSTQueryData; @class FSTSerializerBeta; @class FSTWatchChange; +@class FSTWatchStream; +@class FSTWriteStream; +@class GRPCCall; +@class GRXWriter; NS_ASSUME_NONNULL_BEGIN @@ -68,7 +67,12 @@ NS_ASSUME_NONNULL_BEGIN credentials // no passing ownership NS_DESIGNATED_INITIALIZER; -- (void)shutdown; +/** + * Takes a dictionary of (HTTP) response headers and returns the set of whitelisted headers + * (for logging purposes). + */ ++ (NSDictionary *)extractWhiteListedHeaders: + (NSDictionary *)header; /** Converts the error to a FIRFirestoreErrorDomain error. */ + (NSError *)firestoreErrorForError:(NSError *)error; @@ -79,6 +83,11 @@ NS_ASSUME_NONNULL_BEGIN /** Returns YES if the given error indicates the RPC associated with it may not be retried. */ + (BOOL)isPermanentWriteError:(NSError *)error; +/** Adds headers to the RPC including any OAuth access token if provided .*/ ++ (void)prepareHeadersForRPC:(GRPCCall *)rpc + databaseID:(const firebase::firestore::model::DatabaseId *)databaseID + token:(const absl::string_view)token; + /** Looks up a list of documents in datastore. */ - (void)lookupDocuments:(const std::vector &)keys completion:(FSTVoidMaybeDocumentArrayErrorBlock)completion; @@ -88,12 +97,10 @@ NS_ASSUME_NONNULL_BEGIN completion:(FSTVoidErrorBlock)completion; /** Creates a new watch stream. */ -- (std::shared_ptr)createWatchStreamWithDelegate: - (id)delegate; +- (FSTWatchStream *)createWatchStream; /** Creates a new write stream. */ -- (std::shared_ptr)createWriteStreamWithDelegate: - (id)delegate; +- (FSTWriteStream *)createWriteStream; /** The name of the database and the backend. */ // Does not own this DatabaseInfo. diff --git a/Firestore/Source/Remote/FSTDatastore.mm b/Firestore/Source/Remote/FSTDatastore.mm index 2d0a710f947..33d29e9861e 100644 --- a/Firestore/Source/Remote/FSTDatastore.mm +++ b/Firestore/Source/Remote/FSTDatastore.mm @@ -16,6 +16,9 @@ #import "Firestore/Source/Remote/FSTDatastore.h" +#import +#import + #include #include #include @@ -30,6 +33,8 @@ #import "Firestore/Source/Remote/FSTStream.h" #import "Firestore/Source/Util/FSTDispatchQueue.h" +#import "Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h" + #include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h" #include "Firestore/core/src/firebase/firestore/auth/token.h" #include "Firestore/core/src/firebase/firestore/core/database_info.h" @@ -39,31 +44,37 @@ #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_apple.h" -#include "absl/memory/memory.h" -#include "grpcpp/support/status_code_enum.h" namespace util = firebase::firestore::util; using firebase::firestore::auth::CredentialsProvider; using firebase::firestore::auth::Token; using firebase::firestore::core::DatabaseInfo; -using firebase::firestore::model::DocumentKey; using firebase::firestore::model::DatabaseId; -using firebase::firestore::remote::Datastore; -using firebase::firestore::remote::GrpcConnection; -using firebase::firestore::remote::WatchStream; -using firebase::firestore::remote::WriteStream; +using firebase::firestore::model::DocumentKey; NS_ASSUME_NONNULL_BEGIN -// TODO(varconst): this is the only leftover from the dependency on gRPC -// Objective-C client (where this constant is declared in `GRPCCall.h`). Remove -// this once error handling is fully translated to C++. -NSString *const kGRPCErrorDomain = @"io.grpc"; +// GRPC does not publicly declare a means of disabling SSL, which we need for testing. Firestore +// directly exposes an sslEnabled setting so this is required to plumb that through. Note that our +// own tests depend on this working so we'll know if this changes upstream. +@interface GRPCHost ++ (nullable instancetype)hostWithAddress:(NSString *)address; +@property(nonatomic, getter=isSecure) BOOL secure; +@end + +static NSString *const kXGoogAPIClientHeader = @"x-goog-api-client"; +static NSString *const kGoogleCloudResourcePrefix = @"google-cloud-resource-prefix"; + +/** Function typedef used to create RPCs. */ +typedef GRPCProtoCall * (^RPCFactory)(void); #pragma mark - FSTDatastore @interface FSTDatastore () +/** The GRPC service for Firestore. */ +@property(nonatomic, strong, readonly) GCFSFirestore *service; + @property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue; /** @@ -76,9 +87,7 @@ @interface FSTDatastore () @end -@implementation FSTDatastore { - std::shared_ptr _datastore; -} +@implementation FSTDatastore + (instancetype)datastoreWithDatabase:(const DatabaseInfo *)databaseInfo workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue @@ -93,24 +102,19 @@ - (instancetype)initWithDatabaseInfo:(const DatabaseInfo *)databaseInfo credentials:(CredentialsProvider *)credentials { if (self = [super init]) { _databaseInfo = databaseInfo; + NSString *host = util::WrapNSString(databaseInfo->host()); + if (!databaseInfo->ssl_enabled()) { + GRPCHost *hostConfig = [GRPCHost hostWithAddress:host]; + hostConfig.secure = NO; + } + _service = [GCFSFirestore serviceWithHost:host]; _workerDispatchQueue = workerDispatchQueue; _credentials = credentials; _serializer = [[FSTSerializerBeta alloc] initWithDatabaseID:&databaseInfo->database_id()]; - - _datastore = std::make_shared(*_databaseInfo, [_workerDispatchQueue implementation], - _credentials, _serializer); - _datastore->Start(); - if (!databaseInfo->ssl_enabled()) { - GrpcConnection::UseInsecureChannel(databaseInfo->host()); - } } return self; } -- (void)shutdown { - _datastore->Shutdown(); -} - - (NSString *)description { return [NSString stringWithFormat:@">", self.databaseInfo->database_id().database_id().c_str(), @@ -126,7 +130,7 @@ + (NSError *)firestoreErrorForError:(NSError *)error { } else if ([error.domain isEqualToString:FIRFirestoreErrorDomain]) { return error; } else if ([error.domain isEqualToString:kGRPCErrorDomain]) { - HARD_ASSERT(error.code >= grpc::CANCELLED && error.code <= grpc::UNAUTHENTICATED, + HARD_ASSERT(error.code >= GRPCErrorCodeCancelled && error.code <= GRPCErrorCodeUnauthenticated, "Unknown GRPC error code: %s", error.code); return [NSError errorWithDomain:FIRFirestoreErrorDomain code:error.code userInfo:error.userInfo]; @@ -175,22 +179,183 @@ + (BOOL)isPermanentWriteError:(NSError *)error { } } +/** Returns the string to be used as x-goog-api-client header value. */ ++ (NSString *)googAPIClientHeaderValue { + // TODO(dimond): This should ideally also include the grpc version, however, gRPC defines the + // version as a macro, so it would be hardcoded based on version we have at compile time of + // the Firestore library, rather than the version available at runtime/at compile time by the + // user of the library. + return [NSString stringWithFormat:@"gl-objc/ fire/%s grpc/", FIRFirestoreVersionString]; +} + +/** Returns the string to be used as google-cloud-resource-prefix header value. */ ++ (NSString *)googleCloudResourcePrefixForDatabaseID:(const DatabaseId *)databaseID { + return [NSString stringWithFormat:@"projects/%s/databases/%s", databaseID->project_id().c_str(), + databaseID->database_id().c_str()]; +} +/** + * Takes a dictionary of (HTTP) response headers and returns the set of whitelisted headers + * (for logging purposes). + */ ++ (NSDictionary *)extractWhiteListedHeaders: + (NSDictionary *)headers { + NSMutableDictionary *whiteListedHeaders = + [NSMutableDictionary dictionary]; + NSArray *whiteList = @[ + @"date", @"x-google-backends", @"x-google-netmon-label", @"x-google-service", + @"x-google-gfe-request-trace" + ]; + [headers + enumerateKeysAndObjectsUsingBlock:^(NSString *headerName, NSString *headerValue, BOOL *stop) { + if ([whiteList containsObject:[headerName lowercaseString]]) { + whiteListedHeaders[headerName] = headerValue; + } + }]; + return whiteListedHeaders; +} + +/** Logs the (whitelisted) headers returned for an GRPCProtoCall RPC. */ ++ (void)logHeadersForRPC:(GRPCProtoCall *)rpc RPCName:(NSString *)rpcName { + if ([FIRFirestore isLoggingEnabled]) { + LOG_DEBUG("RPC %s returned headers (whitelisted): %s", rpcName, + [FSTDatastore extractWhiteListedHeaders:rpc.responseHeaders]); + } +} + - (void)commitMutations:(NSArray *)mutations completion:(FSTVoidErrorBlock)completion { - _datastore->CommitMutations(mutations, completion); + GCFSCommitRequest *request = [GCFSCommitRequest message]; + request.database = [self.serializer encodedDatabaseID]; + + NSMutableArray *mutationProtos = [NSMutableArray array]; + for (FSTMutation *mutation in mutations) { + [mutationProtos addObject:[self.serializer encodedMutation:mutation]]; + } + request.writesArray = mutationProtos; + + RPCFactory rpcFactory = ^GRPCProtoCall * { + __block GRPCProtoCall *rpc = [self.service + RPCToCommitWithRequest:request + handler:^(GCFSCommitResponse *response, NSError *_Nullable error) { + error = [FSTDatastore firestoreErrorForError:error]; + [self.workerDispatchQueue dispatchAsync:^{ + if (error != nil && error.code == FIRFirestoreErrorCodeUnauthenticated) { + self->_credentials->InvalidateToken(); + } + LOG_DEBUG("RPC CommitRequest completed. Error: %s", error); + [FSTDatastore logHeadersForRPC:rpc RPCName:@"CommitRequest"]; + completion(error); + }]; + }]; + return rpc; + }; + + [self invokeRPCWithFactory:rpcFactory errorHandler:completion]; } - (void)lookupDocuments:(const std::vector &)keys completion:(FSTVoidMaybeDocumentArrayErrorBlock)completion { - _datastore->LookupDocuments(keys, completion); + GCFSBatchGetDocumentsRequest *request = [GCFSBatchGetDocumentsRequest message]; + request.database = [self.serializer encodedDatabaseID]; + for (const DocumentKey &key : keys) { + [request.documentsArray addObject:[self.serializer encodedDocumentKey:key]]; + } + + struct Closure { + std::map results; + }; + + __block std::shared_ptr closure = std::make_shared(Closure{}); + RPCFactory rpcFactory = ^GRPCProtoCall * { + __block GRPCProtoCall *rpc = [self.service + RPCToBatchGetDocumentsWithRequest:request + eventHandler:^(BOOL done, + GCFSBatchGetDocumentsResponse *_Nullable response, + NSError *_Nullable error) { + error = [FSTDatastore firestoreErrorForError:error]; + [self.workerDispatchQueue dispatchAsync:^{ + if (error) { + LOG_DEBUG("RPC BatchGetDocuments completed. Error: %s", error); + if (error.code == FIRFirestoreErrorCodeUnauthenticated) { + self->_credentials->InvalidateToken(); + } + [FSTDatastore logHeadersForRPC:rpc RPCName:@"BatchGetDocuments"]; + completion(nil, error); + return; + } + + if (!done) { + // Streaming response, accumulate result + FSTMaybeDocument *doc = + [self.serializer decodedMaybeDocumentFromBatch:response]; + closure->results.insert({doc.key, doc}); + } else { + // Streaming response is done, call completion + LOG_DEBUG("RPC BatchGetDocuments completed successfully."); + [FSTDatastore logHeadersForRPC:rpc RPCName:@"BatchGetDocuments"]; + HARD_ASSERT(!response, "Got response after done."); + NSMutableArray *docs = + [NSMutableArray arrayWithCapacity:closure->results.size()]; + for (auto &&entry : closure->results) { + FSTMaybeDocument *doc = entry.second; + [docs addObject:doc]; + } + completion(docs, nil); + } + }]; + }]; + return rpc; + }; + + [self invokeRPCWithFactory:rpcFactory + errorHandler:^(NSError *_Nonnull error) { + error = [FSTDatastore firestoreErrorForError:error]; + completion(nil, error); + }]; +} + +- (void)invokeRPCWithFactory:(GRPCProtoCall * (^)(void))rpcFactory + errorHandler:(FSTVoidErrorBlock)errorHandler { + _credentials->GetToken([self, rpcFactory, errorHandler](util::StatusOr result) { + [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{ + if (!result.ok()) { + errorHandler(util::MakeNSError(result.status())); + } else { + GRPCProtoCall *rpc = rpcFactory(); + const Token &token = result.ValueOrDie(); + [FSTDatastore prepareHeadersForRPC:rpc + databaseID:&self.databaseInfo->database_id() + token:(token.user().is_authenticated() ? token.token() + : absl::string_view())]; + [rpc start]; + } + }]; + }); +} + +- (FSTWatchStream *)createWatchStream { + return [[FSTWatchStream alloc] initWithDatabase:_databaseInfo + workerDispatchQueue:_workerDispatchQueue + credentials:_credentials + serializer:_serializer]; } -- (std::shared_ptr)createWatchStreamWithDelegate:(id)delegate { - return _datastore->CreateWatchStream(delegate); +- (FSTWriteStream *)createWriteStream { + return [[FSTWriteStream alloc] initWithDatabase:_databaseInfo + workerDispatchQueue:_workerDispatchQueue + credentials:_credentials + serializer:_serializer]; } -- (std::shared_ptr)createWriteStreamWithDelegate:(id)delegate { - return _datastore->CreateWriteStream(delegate); +/** Adds headers to the RPC including any OAuth access token if provided .*/ ++ (void)prepareHeadersForRPC:(GRPCCall *)rpc + databaseID:(const DatabaseId *)databaseID + token:(const absl::string_view)token { + rpc.oauth2AccessToken = token.data() == nullptr ? nil : util::WrapNSString(token); + rpc.requestHeaders[kXGoogAPIClientHeader] = [FSTDatastore googAPIClientHeaderValue]; + // This header is used to improve routing and project isolation by the backend. + rpc.requestHeaders[kGoogleCloudResourcePrefix] = + [FSTDatastore googleCloudResourcePrefixForDatabaseID:databaseID]; } @end diff --git a/Firestore/Source/Remote/FSTExponentialBackoff.h b/Firestore/Source/Remote/FSTExponentialBackoff.h new file mode 100644 index 00000000000..3beafbf1a6a --- /dev/null +++ b/Firestore/Source/Remote/FSTExponentialBackoff.h @@ -0,0 +1,84 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "Firestore/Source/Util/FSTDispatchQueue.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Helper to implement exponential backoff. + * + * In general, call -reset after each successful round-trip. Call -backoffAndRunBlock before + * retrying after an error. Each backoffAndRunBlock will increase the delay between retries. + */ +@interface FSTExponentialBackoff : NSObject + +/** + * Initializes a helper for running delayed tasks following an exponential backoff curve + * between attempts. + * + * Each delay is made up of a "base" delay which follows the exponential backoff curve, and a + * +/- 50% "jitter" that is calculated and added to the base delay. This prevents clients from + * accidentally synchronizing their delays causing spikes of load to the backend. + * + * @param dispatchQueue The dispatch queue to run tasks on. + * @param timerID The ID to use when scheduling backoff operations on the FSTDispatchQueue. + * @param initialDelay The initial delay (used as the base delay on the first retry attempt). + * Note that jitter will still be applied, so the actual delay could be as little as + * 0.5*initialDelay. + * @param backoffFactor The multiplier to use to determine the extended base delay after each + * attempt. + * @param maxDelay The maximum base delay after which no further backoff is performed. Note that + * jitter will still be applied, so the actual delay could be as much as 1.5*maxDelay. + */ +- (instancetype)initWithDispatchQueue:(FSTDispatchQueue *)dispatchQueue + timerID:(FSTTimerID)timerID + initialDelay:(NSTimeInterval)initialDelay + backoffFactor:(double)backoffFactor + maxDelay:(NSTimeInterval)maxDelay NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Resets the backoff delay. + * + * The very next backoffAndRunBlock: will have no delay. If it is called again (i.e. due to an + * error), initialDelay (plus jitter) will be used, and subsequent ones will increase according + * to the backoffFactor. + */ +- (void)reset; + +/** + * Resets the backoff to the maximum delay (e.g. for use after a RESOURCE_EXHAUSTED error). + */ +- (void)resetToMax; + +/** + * Waits for currentDelay seconds, increases the delay and runs the specified block. If there was + * a pending block waiting to be run already, it will be canceled. + * + * @param block The block to run. + */ +- (void)backoffAndRunBlock:(void (^)(void))block; + +/** Cancels any pending backoff block scheduled via backoffAndRunBlock:. */ +- (void)cancel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTExponentialBackoff.mm b/Firestore/Source/Remote/FSTExponentialBackoff.mm new file mode 100644 index 00000000000..67032e0177b --- /dev/null +++ b/Firestore/Source/Remote/FSTExponentialBackoff.mm @@ -0,0 +1,128 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Firestore/Source/Remote/FSTExponentialBackoff.h" + +#include + +#import "Firestore/Source/Util/FSTClasses.h" +#import "Firestore/Source/Util/FSTDispatchQueue.h" + +#include "Firestore/core/src/firebase/firestore/util/log.h" +#include "Firestore/core/src/firebase/firestore/util/secure_random.h" + +using firebase::firestore::util::SecureRandom; + +@interface FSTExponentialBackoff () + +@property(nonatomic, strong) FSTDispatchQueue *dispatchQueue; +@property(nonatomic, assign, readonly) FSTTimerID timerID; +@property(nonatomic) double backoffFactor; +@property(nonatomic) NSTimeInterval initialDelay; +@property(nonatomic) NSTimeInterval maxDelay; +@property(nonatomic) NSTimeInterval currentBase; +@property(nonatomic) NSTimeInterval lastAttemptTime; +@property(nonatomic, strong, nullable) FSTDelayedCallback *timerCallback; +@end + +@implementation FSTExponentialBackoff { + SecureRandom _secureRandom; +} + +- (instancetype)initWithDispatchQueue:(FSTDispatchQueue *)dispatchQueue + timerID:(FSTTimerID)timerID + initialDelay:(NSTimeInterval)initialDelay + backoffFactor:(double)backoffFactor + maxDelay:(NSTimeInterval)maxDelay { + if (self = [super init]) { + _dispatchQueue = dispatchQueue; + _timerID = timerID; + _initialDelay = initialDelay; + _backoffFactor = backoffFactor; + _maxDelay = maxDelay; + _lastAttemptTime = [[NSDate date] timeIntervalSince1970]; + + [self reset]; + } + return self; +} + +- (void)reset { + _currentBase = 0; +} + +- (void)resetToMax { + _currentBase = _maxDelay; +} + +- (void)backoffAndRunBlock:(void (^)(void))block { + [self cancel]; + + // First schedule the block using the current base (which may be 0 and should be honored as such). + NSTimeInterval desiredDelayWithJitter = _currentBase + [self jitterDelay]; + + // Guard against lastAttemptTime being in the future due to a clock change. + NSTimeInterval delaySoFar = MAX(0, [[NSDate date] timeIntervalSince1970] - self.lastAttemptTime); + + // Guard against the backoff delay already being past. + NSTimeInterval remainingDelay = MAX(0, desiredDelayWithJitter - delaySoFar); + + if (_currentBase > 0) { + LOG_DEBUG( + "Backing off for %s seconds (" + "base delay: %s seconds, " + "delay with jitter: %s seconds, " + "last attempt: %s seconds ago)", + remainingDelay, _currentBase, desiredDelayWithJitter, delaySoFar); + } + + FSTWeakify(self); + self.timerCallback = [self.dispatchQueue + dispatchAfterDelay:remainingDelay + timerID:self.timerID + block:^{ + FSTStrongify(self); + if (self) { + self.lastAttemptTime = [[NSDate date] timeIntervalSince1970]; + block(); + } + }]; + + // Apply backoff factor to determine next delay and ensure it is within bounds. + _currentBase *= _backoffFactor; + if (_currentBase < _initialDelay) { + _currentBase = _initialDelay; + } + if (_currentBase > _maxDelay) { + _currentBase = _maxDelay; + } +} + +- (void)cancel { + if (self.timerCallback) { + [self.timerCallback cancel]; + self.timerCallback = nil; + } +} + +/** Returns a random value in the range [-currentBase/2, currentBase/2] */ +- (NSTimeInterval)jitterDelay { + std::uniform_real_distribution dist; + double random_double = dist(_secureRandom); + return (random_double - 0.5) * _currentBase; +} + +@end diff --git a/Firestore/Source/Remote/FSTRemoteStore.mm b/Firestore/Source/Remote/FSTRemoteStore.mm index c9041dc278f..98d972a4740 100644 --- a/Firestore/Source/Remote/FSTRemoteStore.mm +++ b/Firestore/Source/Remote/FSTRemoteStore.mm @@ -17,7 +17,6 @@ #import "Firestore/Source/Remote/FSTRemoteStore.h" #include -#include #import "Firestore/Source/Core/FSTQuery.h" #import "Firestore/Source/Core/FSTTransaction.h" @@ -36,11 +35,9 @@ #include "Firestore/core/src/firebase/firestore/auth/user.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" #include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" -#include "Firestore/core/src/firebase/firestore/remote/stream.h" #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_apple.h" -#include "absl/memory/memory.h" namespace util = firebase::firestore::util; using firebase::firestore::auth::User; @@ -49,10 +46,7 @@ using firebase::firestore::model::DocumentKeySet; using firebase::firestore::model::OnlineState; using firebase::firestore::model::SnapshotVersion; -using firebase::firestore::model::DocumentKeySet; using firebase::firestore::model::TargetId; -using firebase::firestore::remote::WatchStream; -using firebase::firestore::remote::WriteStream; NS_ASSUME_NONNULL_BEGIN @@ -76,6 +70,9 @@ @interface FSTRemoteStore () @property(nonatomic, strong, readonly) FSTDatastore *datastore; #pragma mark Watch Stream +// The watchStream is null when the network is disabled. The non-null check is performed by +// isNetworkEnabled. +@property(nonatomic, strong, nullable) FSTWatchStream *watchStream; /** * A mapping of watched targets that the client cares about tracking and the @@ -92,6 +89,11 @@ @interface FSTRemoteStore () @property(nonatomic, strong, nullable) FSTWatchChangeAggregator *watchChangeAggregator; +#pragma mark Write Stream +// The writeStream is null when the network is disabled. The non-null check is performed by +// isNetworkEnabled. +@property(nonatomic, strong, nullable) FSTWriteStream *writeStream; + /** * A list of up to kMaxPendingWrites writes that we have fetched from the LocalStore via * fillWritePipeline and have or will send to the write stream. @@ -109,15 +111,7 @@ @interface FSTRemoteStore () @property(nonatomic, strong, readonly) NSMutableArray *writePipeline; @end -@implementation FSTRemoteStore { - std::shared_ptr _watchStream; - std::shared_ptr _writeStream; - /** - * Set to YES by 'enableNetwork:' and NO by 'disableNetworkInternal:' and - * indicates the user-preferred network state. - */ - BOOL _isNetworkEnabled; -} +@implementation FSTRemoteStore - (instancetype)initWithLocalStore:(FSTLocalStore *)localStore datastore:(FSTDatastore *)datastore @@ -129,12 +123,6 @@ - (instancetype)initWithLocalStore:(FSTLocalStore *)localStore _writePipeline = [NSMutableArray array]; _onlineStateTracker = [[FSTOnlineStateTracker alloc] initWithWorkerDispatchQueue:queue]; - - // Create streams (but note they're not started yet) - _watchStream = [self.datastore createWatchStreamWithDelegate:self]; - _writeStream = [self.datastore createWriteStreamWithDelegate:self]; - - _isNetworkEnabled = NO; } return self; } @@ -156,71 +144,76 @@ - (void)setOnlineStateDelegate:(nullable id)delegate { #pragma mark Online/Offline state -- (BOOL)canUseNetwork { - // PORTING NOTE: This method exists mostly because web also has to take into - // account primary vs. secondary state. - return _isNetworkEnabled; +- (BOOL)isNetworkEnabled { + HARD_ASSERT((self.watchStream == nil) == (self.writeStream == nil), + "WatchStream and WriteStream should both be null or non-null"); + return self.watchStream != nil; } - (void)enableNetwork { - _isNetworkEnabled = YES; + if ([self isNetworkEnabled]) { + return; + } - if ([self canUseNetwork]) { - // Load any saved stream token from persistent storage - _writeStream->SetLastStreamToken([self.localStore lastStreamToken]); + // Create new streams (but note they're not started yet). + self.watchStream = [self.datastore createWatchStream]; + self.writeStream = [self.datastore createWriteStream]; - if ([self shouldStartWatchStream]) { - [self startWatchStream]; - } else { - [self.onlineStateTracker updateState:OnlineState::Unknown]; - } + // Load any saved stream token from persistent storage + self.writeStream.lastStreamToken = [self.localStore lastStreamToken]; - // This will start the write stream if necessary. - [self fillWritePipeline]; + if ([self shouldStartWatchStream]) { + [self startWatchStream]; + } else { + [self.onlineStateTracker updateState:OnlineState::Unknown]; } + + [self fillWritePipeline]; // This may start the writeStream. } - (void)disableNetwork { - _isNetworkEnabled = NO; [self disableNetworkInternal]; - // Set the OnlineState to Offline so get()s return from cache, etc. [self.onlineStateTracker updateState:OnlineState::Offline]; } /** Disables the network, setting the OnlineState to the specified targetOnlineState. */ - (void)disableNetworkInternal { - _watchStream->Stop(); - _writeStream->Stop(); + if ([self isNetworkEnabled]) { + // NOTE: We're guaranteed not to get any further events from these streams (not even a close + // event). + [self.watchStream stop]; + [self.writeStream stop]; + + [self cleanUpWatchStreamState]; + + if (self.writePipeline.count > 0) { + LOG_DEBUG("Stopping write stream with %lu pending writes", + (unsigned long)self.writePipeline.count); + [self.writePipeline removeAllObjects]; + } - if (self.writePipeline.count > 0) { - LOG_DEBUG("Stopping write stream with %lu pending writes", - (unsigned long)self.writePipeline.count); - [self.writePipeline removeAllObjects]; + self.writeStream = nil; + self.watchStream = nil; } - - [self cleanUpWatchStreamState]; } #pragma mark Shutdown - (void)shutdown { LOG_DEBUG("FSTRemoteStore %s shutting down", (__bridge void *)self); - _isNetworkEnabled = NO; [self disableNetworkInternal]; // Set the OnlineState to Unknown (rather than Offline) to avoid potentially triggering // spurious listener events with cached data, etc. [self.onlineStateTracker updateState:OnlineState::Unknown]; - [self.datastore shutdown]; } - (void)credentialDidChange { - if ([self canUseNetwork]) { + if ([self isNetworkEnabled]) { // Tear down and re-create our network streams. This will ensure we get a fresh auth token // for the new user and re-fill the write pipeline with new mutations from the LocalStore // (since mutations are per-user). LOG_DEBUG("FSTRemoteStore %s restarting streams for new credential", (__bridge void *)self); - _isNetworkEnabled = NO; [self disableNetworkInternal]; [self.onlineStateTracker updateState:OnlineState::Unknown]; [self enableNetwork]; @@ -233,8 +226,7 @@ - (void)startWatchStream { HARD_ASSERT([self shouldStartWatchStream], "startWatchStream: called when shouldStartWatchStream: is false."); _watchChangeAggregator = [[FSTWatchChangeAggregator alloc] initWithTargetMetadataProvider:self]; - _watchStream->Start(); - + [self.watchStream startWithDelegate:self]; [self.onlineStateTracker handleWatchStreamStart]; } @@ -247,14 +239,14 @@ - (void)listenToTargetWithQueryData:(FSTQueryData *)queryData { if ([self shouldStartWatchStream]) { [self startWatchStream]; - } else if (_watchStream->IsOpen()) { + } else if ([self isNetworkEnabled] && [self.watchStream isOpen]) { [self sendWatchRequestWithQueryData:queryData]; } } - (void)sendWatchRequestWithQueryData:(FSTQueryData *)queryData { [self.watchChangeAggregator recordTargetRequest:@(queryData.targetID)]; - _watchStream->WatchQuery(queryData); + [self.watchStream watchQuery:queryData]; } - (void)stopListeningToTargetID:(TargetId)targetID { @@ -263,24 +255,26 @@ - (void)stopListeningToTargetID:(TargetId)targetID { HARD_ASSERT(queryData, "stopListeningToTargetID: target not currently watched: %s", targetKey); [self.listenTargets removeObjectForKey:targetKey]; - if (_watchStream->IsOpen()) { + if ([self isNetworkEnabled] && [self.watchStream isOpen]) { [self sendUnwatchRequestForTargetID:targetKey]; } if ([self.listenTargets count] == 0) { - if (_watchStream->IsOpen()) { - _watchStream->MarkIdle(); - } else if ([self canUseNetwork]) { - // Revert to OnlineState::Unknown if the watch stream is not open and we have no listeners, - // since without any listens to send we cannot confirm if the stream is healthy and upgrade - // to OnlineState::Online. - [self.onlineStateTracker updateState:OnlineState::Unknown]; + if ([self isNetworkEnabled]) { + if ([self.watchStream isOpen]) { + [self.watchStream markIdle]; + } else { + // Revert to OnlineState::Unknown if the watch stream is not open and we have no listeners, + // since without any listens to send we cannot confirm if the stream is healthy and upgrade + // to OnlineState::Online. + [self.onlineStateTracker updateState:OnlineState::Unknown]; + } } } } - (void)sendUnwatchRequestForTargetID:(FSTBoxedTargetID *)targetID { [self.watchChangeAggregator recordTargetRequest:targetID]; - _watchStream->UnwatchTargetId([targetID intValue]); + [self.watchStream unwatchTargetID:[targetID intValue]]; } /** @@ -288,7 +282,7 @@ - (void)sendUnwatchRequestForTargetID:(FSTBoxedTargetID *)targetID { * active watch targets. */ - (BOOL)shouldStartWatchStream { - return [self canUseNetwork] && !_watchStream->IsStarted() && self.listenTargets.count > 0; + return [self isNetworkEnabled] && ![self.watchStream isStarted] && self.listenTargets.count > 0; } - (void)cleanUpWatchStreamState { @@ -332,18 +326,20 @@ - (void)watchStreamDidChange:(FSTWatchChange *)change } - (void)watchStreamWasInterruptedWithError:(nullable NSError *)error { - if (!error) { - // Graceful stop (due to Stop() or idle timeout). Make sure that's desirable. - HARD_ASSERT(![self shouldStartWatchStream], - "Watch stream was stopped gracefully while still needed."); - } + HARD_ASSERT([self isNetworkEnabled], + "watchStreamWasInterruptedWithError: should only be called when the network is " + "enabled"); [self cleanUpWatchStreamState]; - // If we still need the watch stream, retry the connection. + // If the watch stream closed due to an error, retry the connection if there are any active + // watch targets. if ([self shouldStartWatchStream]) { - [self.onlineStateTracker handleWatchStreamFailure:error]; - + if (error) { + // There should generally be an error if the watch stream was closed when it's still needed, + // but it's not quite worth asserting. + [self.onlineStateTracker handleWatchStreamFailure:error]; + } [self startWatchStream]; } else { // We don't need to restart the watch stream because there are no active targets. The online @@ -444,13 +440,14 @@ - (nullable FSTQueryData *)queryDataForTarget:(FSTBoxedTargetID *)targetID { * pending writes. */ - (BOOL)shouldStartWriteStream { - return [self canUseNetwork] && !_writeStream->IsStarted() && self.writePipeline.count > 0; + return [self isNetworkEnabled] && ![self.writeStream isStarted] && self.writePipeline.count > 0; } - (void)startWriteStream { HARD_ASSERT([self shouldStartWriteStream], "startWriteStream: called when shouldStartWriteStream: is false."); - _writeStream->Start(); + + [self.writeStream startWithDelegate:self]; } /** @@ -468,7 +465,7 @@ - (void)fillWritePipeline { FSTMutationBatch *batch = [self.localStore nextMutationBatchAfterBatchID:lastBatchIDRetrieved]; if (!batch) { if (self.writePipeline.count == 0) { - _writeStream->MarkIdle(); + [self.writeStream markIdle]; } break; } @@ -485,25 +482,28 @@ - (void)fillWritePipeline { * Returns YES if we can add to the write pipeline (i.e. it is not full and the network is enabled). */ - (BOOL)canAddToWritePipeline { - return [self canUseNetwork] && self.writePipeline.count < kMaxPendingWrites; + return [self isNetworkEnabled] && self.writePipeline.count < kMaxPendingWrites; } /** * Queues additional writes to be sent to the write stream, sending them immediately if the write - * stream is established. + * stream is established, else starting the write stream if it is not yet started. */ - (void)addBatchToWritePipeline:(FSTMutationBatch *)batch { - HARD_ASSERT([self canAddToWritePipeline], "addBatchToWritePipeline called when pipeline is full"); + HARD_ASSERT([self canAddToWritePipeline], + "addBatchToWritePipeline called when mutations can't be written"); [self.writePipeline addObject:batch]; - if (_writeStream->IsOpen() && _writeStream->handshake_complete()) { - _writeStream->WriteMutations(batch.mutations); + if ([self shouldStartWriteStream]) { + [self startWriteStream]; + } else if ([self isNetworkEnabled] && self.writeStream.handshakeComplete) { + [self.writeStream writeMutations:batch.mutations]; } } - (void)writeStreamDidOpen { - _writeStream->WriteHandshake(); + [self.writeStream writeHandshake]; } /** @@ -512,11 +512,11 @@ - (void)writeStreamDidOpen { */ - (void)writeStreamDidCompleteHandshake { // Record the stream token. - [self.localStore setLastStreamToken:_writeStream->GetLastStreamToken()]; + [self.localStore setLastStreamToken:self.writeStream.lastStreamToken]; // Send the write pipeline now that the stream is established. for (FSTMutationBatch *write in self.writePipeline) { - _writeStream->WriteMutations(write.mutations); + [self.writeStream writeMutations:write.mutations]; } } @@ -533,7 +533,7 @@ - (void)writeStreamDidReceiveResponseWithVersion:(const SnapshotVersion &)commit [FSTMutationBatchResult resultWithBatch:batch commitVersion:commitVersion mutationResults:results - streamToken:_writeStream->GetLastStreamToken()]; + streamToken:self.writeStream.lastStreamToken]; [self.syncEngine applySuccessfulWriteWithResult:batchResult]; // It's possible that with the completion of this mutation another slot has freed up. @@ -545,16 +545,13 @@ - (void)writeStreamDidReceiveResponseWithVersion:(const SnapshotVersion &)commit * has been terminated by the client or the server. */ - (void)writeStreamWasInterruptedWithError:(nullable NSError *)error { - if (!error) { - // Graceful stop (due to Stop() or idle timeout). Make sure that's desirable. - HARD_ASSERT(![self shouldStartWriteStream], - "Write stream was stopped gracefully while still needed."); - } + HARD_ASSERT([self isNetworkEnabled], + "writeStreamDidClose: should only be called when the network is enabled"); // If the write stream closed due to an error, invoke the error callbacks if there are pending // writes. if (error != nil && self.writePipeline.count > 0) { - if (_writeStream->handshake_complete()) { + if (self.writeStream.handshakeComplete) { // This error affects the actual writes. [self handleWriteError:error]; } else { @@ -571,20 +568,18 @@ - (void)writeStreamWasInterruptedWithError:(nullable NSError *)error { } - (void)handleHandshakeError:(NSError *)error { - HARD_ASSERT(error, "Handling write error with status OK."); // Reset the token if it's a permanent error or the error code is ABORTED, signaling the write // stream is no longer valid. if ([FSTDatastore isPermanentWriteError:error] || [FSTDatastore isAbortedError:error]) { - NSString *token = [_writeStream->GetLastStreamToken() base64EncodedStringWithOptions:0]; + NSString *token = [self.writeStream.lastStreamToken base64EncodedStringWithOptions:0]; LOG_DEBUG("FSTRemoteStore %s error before completed handshake; resetting stream token %s: %s", (__bridge void *)self, token, error); - _writeStream->SetLastStreamToken(nil); + self.writeStream.lastStreamToken = nil; [self.localStore setLastStreamToken:nil]; } } - (void)handleWriteError:(NSError *)error { - HARD_ASSERT(error, "Handling write error with status OK."); // Only handle permanent error. If it's transient, just let the retry logic kick in. if (![FSTDatastore isPermanentWriteError:error]) { return; @@ -597,7 +592,7 @@ - (void)handleWriteError:(NSError *)error { // In this case it's also unlikely that the server itself is melting down--this was just a // bad request so inhibit backoff on the next restart. - _writeStream->InhibitBackoff(); + [self.writeStream inhibitBackoff]; [self.syncEngine rejectFailedWriteWithBatchID:batch.batchID error:error]; diff --git a/Firestore/Source/Remote/FSTSerializerBeta.mm b/Firestore/Source/Remote/FSTSerializerBeta.mm index ded669bc29f..05cd80ba220 100644 --- a/Firestore/Source/Remote/FSTSerializerBeta.mm +++ b/Firestore/Source/Remote/FSTSerializerBeta.mm @@ -16,6 +16,8 @@ #import "Firestore/Source/Remote/FSTSerializerBeta.h" +#import + #include #include #include diff --git a/Firestore/Source/Remote/FSTStream.h b/Firestore/Source/Remote/FSTStream.h index 00dcab37f7f..ab70b740cc5 100644 --- a/Firestore/Source/Remote/FSTStream.h +++ b/Firestore/Source/Remote/FSTStream.h @@ -16,14 +16,158 @@ #import +#import "Firestore/Source/Util/FSTDispatchQueue.h" + +#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h" +#include "Firestore/core/src/firebase/firestore/core/database_info.h" #include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" +#include "Firestore/core/src/firebase/firestore/model/types.h" +@class FSTDispatchQueue; +@class FSTMutation; @class FSTMutationResult; +@class FSTQueryData; +@class FSTSerializerBeta; @class FSTWatchChange; +@class FSTWatchStream; +@class FSTWriteStream; +@class GRPCCall; +@class GRXWriter; + +@protocol FSTWatchStreamDelegate; +@protocol FSTWriteStreamDelegate; NS_ASSUME_NONNULL_BEGIN -#pragma mark - FSTWatchStreamDelegate +/** + * An FSTStream is an abstract base class that represents a restartable streaming RPC to the + * Firestore backend. It's built on top of GRPC's own support for streaming RPCs, and adds several + * critical features for our clients: + * + * - Restarting a stream is allowed (after failure) + * - Exponential backoff on failure (independent of the underlying channel) + * - Authentication via CredentialsProvider + * - Dispatching all callbacks into the shared worker queue + * + * Subclasses of FSTStream implement serialization of models to and from bytes (via protocol + * buffers) for a specific streaming RPC and emit events specific to the stream. + * + * ## Starting and Stopping + * + * Streaming RPCs are stateful and need to be started before messages can be sent and received. + * The FSTStream will call its delegate's specific streamDidOpen method once the stream is ready + * to accept requests. + * + * Should a `start` fail, FSTStream will call its delegate's specific streamDidClose method with an + * NSError indicating what went wrong. The delegate is free to call start again. + * + * An FSTStream can also be explicitly stopped which indicates that the caller has discarded the + * stream and no further events should be emitted. Once explicitly stopped, a stream cannot be + * restarted. + * + * ## Subclassing Notes + * + * An implementation of FSTStream needs to implement the following methods: + * - `createRPCWithRequestsWriter`, should create the specific RPC (a GRPCCall object). + * - `handleStreamMessage`, receives protocol buffer responses from GRPC and must deserialize and + * delegate to some stream specific response method. + * - `notifyStreamOpen`, should call through to the stream-specific streamDidOpen method. + * - `notifyStreamInterrupted`, calls through to the stream-specific streamWasInterrupted method. + * + * Additionally, beyond these required methods, subclasses will want to implement methods that + * take request models, serialize them, and write them to using writeRequest:. Implementation + * specific cleanup logic can be added to tearDown:. + * + * ## RPC Message Type + * + * FSTStream intentionally uses the GRPCCall interface to GRPC directly, bypassing both GRPCProtoRPC + * and GRXBufferedPipe for sending data. This has been done to avoid race conditions that come out + * of a loosely specified locking contract on GRXWriter. There's essentially no way to safely use + * any of the wrapper objects for GRXWriter (that perform buffering or conversion to/from protos). + * + * See https://github.com/grpc/grpc/issues/10957 for the kinds of things we're trying to avoid. + */ +@interface FSTStream<__covariant FSTStreamDelegate> : NSObject + +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + connectionTimerID:(FSTTimerID)connectionTimerID + idleTimerID:(FSTTimerID)idleTimerID + credentials:(firebase::firestore::auth::CredentialsProvider *) + credentials // no passing ownership + responseMessageClass:(Class)responseMessageClass NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * An abstract method used by `start` to create a streaming RPC specific to this type of stream. + * The RPC should be created such that requests are taken from `self`. + * + * Note that the returned GRPCCall must not be a GRPCProtoRPC, since the rest of the streaming + * mechanism assumes it is dealing in bytes-level requests and responses. + */ +- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter; + +/** + * Returns YES if `start` has been called and no error has occurred. YES indicates the stream is + * open or in the process of opening (which encompasses respecting backoff, getting auth tokens, + * and starting the actual RPC). Use `isOpen` to determine if the stream is open and ready for + * outbound requests. + */ +- (BOOL)isStarted; + +/** Returns YES if the underlying RPC is open and the stream is ready for outbound requests. */ +- (BOOL)isOpen; + +/** + * Starts the RPC. Only allowed if isStarted returns NO. The stream is not immediately ready for + * use: the delegate's watchStreamDidOpen method will be invoked when the RPC is ready for outbound + * requests, at which point `isOpen` will return YES. + * + * When start returns, -isStarted will return YES. + */ +- (void)startWithDelegate:(id)delegate; + +/** + * Stops the RPC. This call is idempotent and allowed regardless of the current isStarted state. + * + * Unlike a transient stream close, stopping a stream is permanent. This is guaranteed NOT to emit + * any further events on the stream-specific delegate, including the streamDidClose method. + * + * NOTE: This no-events contract may seem counter-intuitive but allows the caller to + * straightforwardly sequence stream tear-down without having to worry about when the delegate's + * streamDidClose methods will get called. For example if the stream must be exchanged for another + * during a user change this allows `stop` to be called eagerly without worrying about the + * streamDidClose method accidentally restarting the stream before the new one is ready. + * + * When stop returns, -isStarted and -isOpen will both return NO. + */ +- (void)stop; + +/** + * Marks this stream as idle. If no further actions are performed on the stream for one minute, the + * stream will automatically close itself and notify the stream's close handler. The stream will + * then be in a non-started state, requiring the caller to start the stream again before further + * use. + * + * Only streams that are in state 'Open' can be marked idle, as all other states imply pending + * network operations. + */ +- (void)markIdle; + +/** + * After an error the stream will usually back off on the next attempt to start it. If the error + * warrants an immediate restart of the stream, the sender can use this to indicate that the + * receiver should not back off. + * + * Each error will call the stream-specific streamDidClose method. That method can decide to + * inhibit backoff if required. + */ +- (void)inhibitBackoff; + +@end + +#pragma mark - FSTWatchStream /** A protocol defining the events that can be emitted by the FSTWatchStream. */ @protocol FSTWatchStreamDelegate @@ -50,7 +194,47 @@ NS_ASSUME_NONNULL_BEGIN @end -#pragma mark - FSTWriteStreamDelegate +/** + * An FSTStream that implements the StreamingWatch RPC. + * + * Once the FSTWatchStream has called the streamDidOpen method, any number of watchQuery and + * unwatchTargetId calls can be sent to control what changes will be sent from the server for + * WatchChanges. + */ +@interface FSTWatchStream : FSTStream + +/** + * Initializes the watch stream with its dependencies. + */ +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(firebase::firestore::auth::CredentialsProvider *) + credentials // no passsing ownership + serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + connectionTimerID:(FSTTimerID)connectionTimerID + idleTimerID:(FSTTimerID)idleTimerID + credentials:(firebase::firestore::auth::CredentialsProvider *) + credentials // no passing ownership + responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Registers interest in the results of the given query. If the query includes a resumeToken it + * will be included in the request. Results that affect the query will be streamed back as + * WatchChange messages that reference the targetID included in |query|. + */ +- (void)watchQuery:(FSTQueryData *)query; + +/** Unregisters interest in the results of the query associated with the given target ID. */ +- (void)unwatchTargetID:(firebase::firestore::model::TargetId)targetID; + +@end + +#pragma mark - FSTWriteStream @protocol FSTWriteStreamDelegate @@ -83,4 +267,65 @@ NS_ASSUME_NONNULL_BEGIN @end +/** + * An FSTStream that implements the StreamingWrite RPC. + * + * The StreamingWrite RPC requires the caller to maintain special `streamToken` state in between + * calls, to help the server understand which responses the client has processed by the time the + * next request is made. Every response may contain a `streamToken`; this value must be passed to + * the next request. + * + * After calling `start` on this stream, the next request must be a handshake, containing whatever + * streamToken is on hand. Once a response to this request is received, all pending mutations may + * be submitted. When submitting multiple batches of mutations at the same time, it's okay to use + * the same streamToken for the calls to `writeMutations:`. + */ +@interface FSTWriteStream : FSTStream + +/** + * Initializes the write stream with its dependencies. + */ +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(firebase::firestore::auth::CredentialsProvider *) + credentials // no passing ownership + serializer:(FSTSerializerBeta *)serializer; + +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + connectionTimerID:(FSTTimerID)connectionTimerID + idleTimerID:(FSTTimerID)idleTimerID + credentials:(firebase::firestore::auth::CredentialsProvider *) + credentials // no passing ownership + responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Sends an initial streamToken to the server, performing the handshake required to make the + * StreamingWrite RPC work. Subsequent `writeMutations:` calls should wait until a response has + * been delivered to the delegate's writeStreamDidCompleteHandshake method. + */ +- (void)writeHandshake; + +/** Sends a group of mutations to the Firestore backend to apply. */ +- (void)writeMutations:(NSArray *)mutations; + +/** + * Tracks whether or not a handshake has been successfully exchanged and the stream is ready to + * accept mutations. + */ +@property(nonatomic, assign, readwrite, getter=isHandshakeComplete) BOOL handshakeComplete; + +/** + * The last received stream token from the server, used to acknowledge which responses the client + * has processed. Stream tokens are opaque checkpoint markers whose only real value is their + * inclusion in the next request. + * + * FSTWriteStream manages propagating this value from responses to the next request. + */ +@property(nonatomic, strong, nullable) NSData *lastStreamToken; + +@end + NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Remote/FSTStream.mm b/Firestore/Source/Remote/FSTStream.mm new file mode 100644 index 00000000000..dbeceef15bf --- /dev/null +++ b/Firestore/Source/Remote/FSTStream.mm @@ -0,0 +1,823 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +#import "FIRFirestoreErrors.h" +#import "Firestore/Source/API/FIRFirestore+Internal.h" +#import "Firestore/Source/Local/FSTQueryData.h" +#import "Firestore/Source/Model/FSTMutation.h" +#import "Firestore/Source/Remote/FSTBufferedWriter.h" +#import "Firestore/Source/Remote/FSTDatastore.h" +#import "Firestore/Source/Remote/FSTExponentialBackoff.h" +#import "Firestore/Source/Remote/FSTSerializerBeta.h" +#import "Firestore/Source/Remote/FSTStream.h" +#import "Firestore/Source/Util/FSTClasses.h" +#import "Firestore/Source/Util/FSTDispatchQueue.h" + +#import "Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h" + +#include "Firestore/core/src/firebase/firestore/auth/token.h" +#include "Firestore/core/src/firebase/firestore/core/database_info.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "Firestore/core/src/firebase/firestore/model/snapshot_version.h" +#include "Firestore/core/src/firebase/firestore/util/error_apple.h" +#include "Firestore/core/src/firebase/firestore/util/hard_assert.h" +#include "Firestore/core/src/firebase/firestore/util/log.h" +#include "Firestore/core/src/firebase/firestore/util/string_apple.h" + +namespace util = firebase::firestore::util; +using firebase::firestore::auth::CredentialsProvider; +using firebase::firestore::auth::Token; +using firebase::firestore::core::DatabaseInfo; +using firebase::firestore::model::DatabaseId; +using firebase::firestore::model::SnapshotVersion; +using firebase::firestore::model::TargetId; + +/** + * Initial backoff time in seconds after an error. + * Set to 1s according to https://cloud.google.com/apis/design/errors. + */ +static const NSTimeInterval kBackoffInitialDelay = 1; +static const NSTimeInterval kBackoffMaxDelay = 60.0; +static const double kBackoffFactor = 1.5; + +#pragma mark - FSTStream + +/** The state of a stream. */ +typedef NS_ENUM(NSInteger, FSTStreamState) { + /** + * The streaming RPC is not running and there's no error condition. Calling `start` will + * start the stream immediately without backoff. While in this state -isStarted will return NO. + */ + FSTStreamStateInitial = 0, + + /** + * The stream is starting, and is waiting for an auth token to attach to the initial request. + * While in this state, isStarted will return YES but isOpen will return NO. + */ + FSTStreamStateAuth, + + /** + * The streaming RPC is up and running. Requests and responses can flow freely. Both + * isStarted and isOpen will return YES. + */ + FSTStreamStateOpen, + + /** + * The stream encountered an error. The next start attempt will back off. While in this state + * -isStarted will return NO. + */ + FSTStreamStateError, + + /** + * An in-between state after an error where the stream is waiting before re-starting. After + * waiting is complete, the stream will try to open. While in this state -isStarted will + * return YES but isOpen will return NO. + */ + FSTStreamStateBackoff, + + /** + * The stream has been explicitly stopped; no further events will be emitted. + */ + FSTStreamStateStopped, +}; + +// We need to declare these classes first so that Datastore can alloc them. + +@interface FSTWatchStream () + +/** + * Initializes the watch stream with its dependencies. + */ +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; + +@end + +@interface FSTStream () + +@property(nonatomic, assign, readonly) FSTTimerID idleTimerID; +@property(nonatomic, strong, nullable) FSTDelayedCallback *idleTimerCallback; +@property(nonatomic, weak, readwrite, nullable) id delegate; + +@end + +@interface FSTStream () + +// Does not own this DatabaseInfo. +@property(nonatomic, assign, readonly) const DatabaseInfo *databaseInfo; +@property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue; +@property(nonatomic, assign, readonly) CredentialsProvider *credentials; +@property(nonatomic, unsafe_unretained, readonly) Class responseMessageClass; +@property(nonatomic, strong, readonly) FSTExponentialBackoff *backoff; + +/** A flag tracking whether the stream received a message from the backend. */ +@property(nonatomic, assign) BOOL messageReceived; + +/** + * Stream state as exposed to consumers of FSTStream. This differs from GRXWriter's notion of the + * state of the stream. + */ +@property(nonatomic, assign) FSTStreamState state; + +/** The RPC handle. Used for cancellation. */ +@property(nonatomic, strong, nullable) GRPCCall *rpc; + +/** + * The send-side of the RPC stream in which to submit requests, but only once the underlying RPC has + * started. + */ +@property(nonatomic, strong, nullable) FSTBufferedWriter *requestsWriter; + +@end + +#pragma mark - FSTCallbackFilter + +/** + * Implements callbacks from gRPC via the GRXWriteable protocol. This is separate from the main + * FSTStream to allow the stream to be stopped externally (either by the user or via idle timer) + * and be able to completely prevent any subsequent events from gRPC from calling back into the + * FSTSTream. + */ +@interface FSTCallbackFilter : NSObject + +- (instancetype)initWithStream:(FSTStream *)stream NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; + +@property(atomic, readwrite) BOOL callbacksEnabled; +@property(nonatomic, strong, readonly) FSTStream *stream; + +@end + +@implementation FSTCallbackFilter + +- (instancetype)initWithStream:(FSTStream *)stream { + if (self = [super init]) { + _callbacksEnabled = YES; + _stream = stream; + } + return self; +} + +- (void)suppressCallbacks { + _callbacksEnabled = NO; +} + +- (void)writeValue:(id)value { + if (_callbacksEnabled) { + [self.stream writeValue:value]; + } +} + +- (void)writesFinishedWithError:(NSError *)errorOrNil { + if (_callbacksEnabled) { + [self.stream writesFinishedWithError:errorOrNil]; + } +} + +@end + +#pragma mark - FSTStream + +@interface FSTStream () + +@property(nonatomic, strong, readwrite) FSTCallbackFilter *callbackFilter; + +@end + +@implementation FSTStream + +/** The time a stream stays open after it is marked idle. */ +static const NSTimeInterval kIdleTimeout = 60.0; + +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + connectionTimerID:(FSTTimerID)connectionTimerID + idleTimerID:(FSTTimerID)idleTimerID + credentials:(CredentialsProvider *)credentials + responseMessageClass:(Class)responseMessageClass { + if (self = [super init]) { + _databaseInfo = database; + _workerDispatchQueue = workerDispatchQueue; + _idleTimerID = idleTimerID; + _credentials = credentials; + _responseMessageClass = responseMessageClass; + + _backoff = [[FSTExponentialBackoff alloc] initWithDispatchQueue:workerDispatchQueue + timerID:connectionTimerID + initialDelay:kBackoffInitialDelay + backoffFactor:kBackoffFactor + maxDelay:kBackoffMaxDelay]; + _state = FSTStreamStateInitial; + } + return self; +} + +- (BOOL)isStarted { + [self.workerDispatchQueue verifyIsCurrentQueue]; + FSTStreamState state = self.state; + return state == FSTStreamStateBackoff || state == FSTStreamStateAuth || + state == FSTStreamStateOpen; +} + +- (BOOL)isOpen { + [self.workerDispatchQueue verifyIsCurrentQueue]; + return self.state == FSTStreamStateOpen; +} + +- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { + @throw FSTAbstractMethodException(); // NOLINT +} + +- (void)startWithDelegate:(id)delegate { + [self.workerDispatchQueue verifyIsCurrentQueue]; + + if (self.state == FSTStreamStateError) { + [self performBackoffWithDelegate:delegate]; + return; + } + + LOG_DEBUG("%s %s start", NSStringFromClass([self class]), (__bridge void *)self); + HARD_ASSERT(self.state == FSTStreamStateInitial, "Already started"); + + self.state = FSTStreamStateAuth; + HARD_ASSERT(_delegate == nil, "Delegate must be nil"); + _delegate = delegate; + + _credentials->GetToken([self](util::StatusOr result) { + [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{ + [self resumeStartWithToken:result]; + }]; + }); +} + +/** Add an access token to our RPC, after obtaining one from the credentials provider. */ +- (void)resumeStartWithToken:(const util::StatusOr &)result { + [self.workerDispatchQueue verifyIsCurrentQueue]; + + if (self.state == FSTStreamStateStopped) { + // Streams can be stopped while waiting for authorization. + return; + } + HARD_ASSERT(self.state == FSTStreamStateAuth, "State should still be auth (was %s)", self.state); + + if (!result.ok()) { + // RPC has not been started yet, so just invoke higher-level close handler. + [self handleStreamClose:util::MakeNSError(result.status())]; + return; + } + + self.requestsWriter = [[FSTBufferedWriter alloc] init]; + _rpc = [self createRPCWithRequestsWriter:self.requestsWriter]; + [_rpc setResponseDispatchQueue:self.workerDispatchQueue.queue]; + + const Token &token = result.ValueOrDie(); + [FSTDatastore + prepareHeadersForRPC:_rpc + databaseID:&self.databaseInfo->database_id() + token:(token.user().is_authenticated() ? token.token() : absl::string_view())]; + HARD_ASSERT(_callbackFilter == nil, "GRX Filter must be nil"); + _callbackFilter = [[FSTCallbackFilter alloc] initWithStream:self]; + [_rpc startWithWriteable:_callbackFilter]; + + self.state = FSTStreamStateOpen; + [self notifyStreamOpen]; +} + +/** Backs off after an error. */ +- (void)performBackoffWithDelegate:(id)delegate { + LOG_DEBUG("%s %s backoff", NSStringFromClass([self class]), (__bridge void *)self); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + HARD_ASSERT(self.state == FSTStreamStateError, "Should only perform backoff in an error case"); + self.state = FSTStreamStateBackoff; + + FSTWeakify(self); + [self.backoff backoffAndRunBlock:^{ + FSTStrongify(self); + [self resumeStartFromBackoffWithDelegate:delegate]; + }]; +} + +/** Resumes stream start after backing off. */ +- (void)resumeStartFromBackoffWithDelegate:(id)delegate { + if (self.state == FSTStreamStateStopped) { + // We should have canceled the backoff timer when the stream was closed, but just in case we + // make this a no-op. + return; + } + + // In order to have performed a backoff the stream must have been in an error state just prior + // to entering the backoff state. If we weren't stopped we must be in the backoff state. + HARD_ASSERT(self.state == FSTStreamStateBackoff, "State should still be backoff (was %s)", + self.state); + + // Momentarily set state to FSTStreamStateInitial as `start` expects it. + self.state = FSTStreamStateInitial; + [self startWithDelegate:delegate]; + HARD_ASSERT([self isStarted], "Stream should have started."); +} + +/** + * Can be overridden to perform additional cleanup before the stream is closed. Calling + * [super tearDown] is not required. + */ +- (void)tearDown { +} + +/** + * Closes the stream and cleans up as necessary: + * + * * closes the underlying GRPC stream; + * * calls the onClose handler with the given 'error'; + * * sets internal stream state to 'finalState'; + * * adjusts the backoff timer based on the error + * + * A new stream can be opened by calling `start` unless `finalState` is set to + * `FSTStreamStateStopped`. + * + * @param finalState the intended state of the stream after closing. + * @param error the NSError the connection was closed with. + */ +- (void)closeWithFinalState:(FSTStreamState)finalState error:(nullable NSError *)error { + HARD_ASSERT(finalState == FSTStreamStateError || error == nil, + "Can't provide an error when not in an error state."); + + [self.workerDispatchQueue verifyIsCurrentQueue]; + + // The stream will be closed so we don't need our idle close timer anymore. + [self cancelIdleCheck]; + + // Ensure we don't leave a pending backoff operation queued (in case close() + // was called while we were waiting to reconnect). + [self.backoff cancel]; + + if (finalState != FSTStreamStateError) { + // If this is an intentional close ensure we don't delay our next connection attempt. + [self.backoff reset]; + } else if (error != nil && error.code == FIRFirestoreErrorCodeResourceExhausted) { + LOG_DEBUG("%s %s Using maximum backoff delay to prevent overloading the backend.", [self class], + (__bridge void *)self); + [self.backoff resetToMax]; + } else if (error != nil && error.code == FIRFirestoreErrorCodeUnauthenticated) { + // "unauthenticated" error means the token was rejected. Try force refreshing it in case it just + // expired. + _credentials->InvalidateToken(); + } + + if (finalState != FSTStreamStateError) { + LOG_DEBUG("%s %s Performing stream teardown", [self class], (__bridge void *)self); + [self tearDown]; + } + + if (self.requestsWriter) { + // Clean up the underlying RPC. If this close: is in response to an error, don't attempt to + // call half-close to avoid secondary failures. + if (finalState != FSTStreamStateError) { + LOG_DEBUG("%s %s Closing stream client-side", [self class], (__bridge void *)self); + @synchronized(self.requestsWriter) { + [self.requestsWriter finishWithError:nil]; + } + } + _requestsWriter = nil; + } + + // This state must be assigned before calling `notifyStreamInterrupted` to allow the callback to + // inhibit backoff or otherwise manipulate the state in its non-started state. + self.state = finalState; + + [self.callbackFilter suppressCallbacks]; + _callbackFilter = nil; + + // Clean up remaining state. + _messageReceived = NO; + _rpc = nil; + + // If the caller explicitly requested a stream stop, don't notify them of a closing stream (it + // could trigger undesirable recovery logic, etc.). + if (finalState != FSTStreamStateStopped) { + [self notifyStreamInterruptedWithError:error]; + } + + // PORTING NOTE: notifyStreamInterruptedWithError may have restarted the stream with a new + // delegate so we do /not/ want to clear the delegate here. And since we've already suppressed + // callbacks via our callbackFilter, there is no worry about bleed through of events from GRPC. +} + +- (void)stop { + LOG_DEBUG("%s %s stop", NSStringFromClass([self class]), (__bridge void *)self); + if ([self isStarted]) { + [self closeWithFinalState:FSTStreamStateStopped error:nil]; + } +} + +- (void)inhibitBackoff { + HARD_ASSERT(![self isStarted], "Can only inhibit backoff after an error (was %s)", self.state); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + // Clear the error condition. + self.state = FSTStreamStateInitial; + [self.backoff reset]; +} + +/** Called by the idle timer when the stream should close due to inactivity. */ +- (void)handleIdleCloseTimer { + [self.workerDispatchQueue verifyIsCurrentQueue]; + if ([self isOpen]) { + // When timing out an idle stream there's no reason to force the stream into backoff when + // it restarts so set the stream state to Initial instead of Error. + [self closeWithFinalState:FSTStreamStateInitial error:nil]; + } +} + +- (void)markIdle { + [self.workerDispatchQueue verifyIsCurrentQueue]; + // Starts the idle timer if we are in state 'Open' and are not yet already running a timer (in + // which case the previous idle timeout still applies). + if ([self isOpen] && !self.idleTimerCallback) { + self.idleTimerCallback = [self.workerDispatchQueue dispatchAfterDelay:kIdleTimeout + timerID:self.idleTimerID + block:^() { + [self handleIdleCloseTimer]; + }]; + } +} + +- (void)cancelIdleCheck { + [self.workerDispatchQueue verifyIsCurrentQueue]; + if (self.idleTimerCallback) { + [self.idleTimerCallback cancel]; + self.idleTimerCallback = nil; + } +} + +/** + * Parses a protocol buffer response from the server. If the message fails to parse, generates + * an error and closes the stream. + * + * @param protoClass A protocol buffer message class object, that responds to parseFromData:error:. + * @param data The bytes in the response as returned from GRPC. + * @return An instance of the protocol buffer message, parsed from the data if parsing was + * successful, or nil otherwise. + */ +- (nullable id)parseProto:(Class)protoClass data:(NSData *)data error:(NSError **)error { + NSError *parseError; + id parsed = [protoClass parseFromData:data error:&parseError]; + if (parsed) { + *error = nil; + return parsed; + } else { + NSDictionary *info = @{ + NSLocalizedDescriptionKey : @"Unable to parse response from the server", + NSUnderlyingErrorKey : parseError, + @"Expected class" : protoClass, + @"Received value" : data, + }; + *error = [NSError errorWithDomain:FIRFirestoreErrorDomain + code:FIRFirestoreErrorCodeInternal + userInfo:info]; + return nil; + } +} + +/** + * Writes a request proto into the stream. + */ +- (void)writeRequest:(GPBMessage *)request { + NSData *data = [request data]; + + [self cancelIdleCheck]; + + FSTBufferedWriter *requestsWriter = self.requestsWriter; + @synchronized(requestsWriter) { + [requestsWriter writeValue:data]; + } +} + +#pragma mark Template methods for subclasses + +/** + * Called by the stream after the stream has opened. + * + * Subclasses should relay to their stream-specific delegate. Calling [super notifyStreamOpen] is + * not required. + */ +- (void)notifyStreamOpen { +} + +/** + * Called by the stream after the stream has been unexpectedly interrupted, either due to an error + * or due to idleness. + * + * Subclasses should relay to their stream-specific delegate. Calling [super + * notifyStreamInterrupted] is not required. + */ +- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { +} + +/** + * Called by the stream for each incoming protocol message coming from the server. + * + * Subclasses should implement this to deserialize the value and relay to their stream-specific + * delegate, if appropriate. Calling [super handleStreamMessage] is not required. + */ +- (void)handleStreamMessage:(id)value { +} + +/** + * Called by the stream when the underlying RPC has been closed for whatever reason. + */ +- (void)handleStreamClose:(nullable NSError *)error { + LOG_DEBUG("%s %s close: %s", NSStringFromClass([self class]), (__bridge void *)self, error); + HARD_ASSERT([self isStarted], "handleStreamClose: called for non-started stream."); + + // In theory the stream could close cleanly, however, in our current model we never expect this + // to happen because if we stop a stream ourselves, this callback will never be called. To + // prevent cases where we retry without a backoff accidentally, we set the stream to error + // in all cases. + [self closeWithFinalState:FSTStreamStateError error:error]; +} + +#pragma mark GRXWriteable implementation +// The GRXWriteable implementation defines the receive side of the RPC stream. + +/** + * Called by GRPC when it publishes a value. + * + * GRPC must be configured to use our worker queue by calling + * `[call setResponseDispatchQueue:self.workerDispatchQueue.queue]` on the GRPCCall before starting + * the RPC. + */ +- (void)writeValue:(id)value { + [self.workerDispatchQueue enterCheckedOperation:^{ + HARD_ASSERT([self isStarted], "writeValue: called for stopped stream."); + + if (!self.messageReceived) { + self.messageReceived = YES; + if ([FIRFirestore isLoggingEnabled]) { + LOG_DEBUG("%s %s headers (whitelisted): %s", NSStringFromClass([self class]), + (__bridge void *)self, + [FSTDatastore extractWhiteListedHeaders:self.rpc.responseHeaders]); + } + } + NSError *error; + id proto = [self parseProto:self.responseMessageClass data:value error:&error]; + if (proto) { + [self handleStreamMessage:proto]; + } else { + [self.rpc finishWithError:error]; + } + }]; +} + +/** + * Called by GRPC when it closed the stream with an error representing the final state of the + * stream. + * + * GRPC must be configured to use our worker queue by calling + * `[call setResponseDispatchQueue:self.workerDispatchQueue.queue]` on the GRPCCall before starting + * the RPC. + * + * Do not call directly. Call handleStreamClose to directly inform stream-specific logic, or call + * stop to tear down the stream. + */ +- (void)writesFinishedWithError:(nullable NSError *)error __used { + error = [FSTDatastore firestoreErrorForError:error]; + [self.workerDispatchQueue enterCheckedOperation:^{ + HARD_ASSERT([self isStarted], "writesFinishedWithError: called for stopped stream."); + + [self handleStreamClose:error]; + }]; +} + +@end + +#pragma mark - FSTWatchStream + +@interface FSTWatchStream () + +@property(nonatomic, strong, readonly) FSTSerializerBeta *serializer; + +@end + +@implementation FSTWatchStream + +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer { + self = [super initWithDatabase:database + workerDispatchQueue:workerDispatchQueue + connectionTimerID:FSTTimerIDListenStreamConnectionBackoff + idleTimerID:FSTTimerIDListenStreamIdle + credentials:credentials + responseMessageClass:[GCFSListenResponse class]]; + if (self) { + _serializer = serializer; + } + return self; +} + +- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { + return [[GRPCCall alloc] initWithHost:util::WrapNSString(self.databaseInfo->host()) + path:@"/google.firestore.v1beta1.Firestore/Listen" + requestsWriter:requestsWriter]; +} + +- (void)notifyStreamOpen { + [self.delegate watchStreamDidOpen]; +} + +- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { + id delegate = self.delegate; + self.delegate = nil; + [delegate watchStreamWasInterruptedWithError:error]; +} + +- (void)watchQuery:(FSTQueryData *)query { + HARD_ASSERT([self isOpen], "Not yet open"); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + GCFSListenRequest *request = [GCFSListenRequest message]; + request.database = [_serializer encodedDatabaseID]; + request.addTarget = [_serializer encodedTarget:query]; + request.labels = [_serializer encodedListenRequestLabelsForQueryData:query]; + + LOG_DEBUG("FSTWatchStream %s watch: %s", (__bridge void *)self, request); + [self writeRequest:request]; +} + +- (void)unwatchTargetID:(TargetId)targetID { + HARD_ASSERT([self isOpen], "Not yet open"); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + GCFSListenRequest *request = [GCFSListenRequest message]; + request.database = [_serializer encodedDatabaseID]; + request.removeTarget = targetID; + + LOG_DEBUG("FSTWatchStream %s unwatch: %s", (__bridge void *)self, request); + [self writeRequest:request]; +} + +/** + * Receives an inbound message from GRPC, deserializes, and then passes that on to the delegate's + * watchStreamDidChange:snapshotVersion: callback. + */ +- (void)handleStreamMessage:(GCFSListenResponse *)proto { + LOG_DEBUG("FSTWatchStream %s response: %s", (__bridge void *)self, proto); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + // A successful response means the stream is healthy. + [self.backoff reset]; + + FSTWatchChange *change = [_serializer decodedWatchChange:proto]; + SnapshotVersion snap = [_serializer versionFromListenResponse:proto]; + [self.delegate watchStreamDidChange:change snapshotVersion:snap]; +} + +@end + +#pragma mark - FSTWriteStream + +@interface FSTWriteStream () + +@property(nonatomic, strong, readonly) FSTSerializerBeta *serializer; + +@end + +@implementation FSTWriteStream + +- (instancetype)initWithDatabase:(const DatabaseInfo *)database + workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue + credentials:(CredentialsProvider *)credentials + serializer:(FSTSerializerBeta *)serializer { + self = [super initWithDatabase:database + workerDispatchQueue:workerDispatchQueue + connectionTimerID:FSTTimerIDWriteStreamConnectionBackoff + idleTimerID:FSTTimerIDWriteStreamIdle + credentials:credentials + responseMessageClass:[GCFSWriteResponse class]]; + if (self) { + _serializer = serializer; + } + return self; +} + +- (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { + return [[GRPCCall alloc] initWithHost:util::WrapNSString(self.databaseInfo->host()) + path:@"/google.firestore.v1beta1.Firestore/Write" + requestsWriter:requestsWriter]; +} + +- (void)startWithDelegate:(id)delegate { + self.handshakeComplete = NO; + [super startWithDelegate:delegate]; +} + +- (void)notifyStreamOpen { + [self.delegate writeStreamDidOpen]; +} + +- (void)notifyStreamInterruptedWithError:(nullable NSError *)error { + id delegate = self.delegate; + self.delegate = nil; + [delegate writeStreamWasInterruptedWithError:error]; +} + +- (void)tearDown { + if ([self isHandshakeComplete]) { + // Send an empty write request to the backend to indicate imminent stream closure. This allows + // the backend to clean up resources. + [self writeMutations:@[]]; + } +} + +- (void)writeHandshake { + // The initial request cannot contain mutations, but must contain a projectID. + HARD_ASSERT([self isOpen], "Not yet open"); + HARD_ASSERT(!self.handshakeComplete, "Handshake sent out of turn"); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + GCFSWriteRequest *request = [GCFSWriteRequest message]; + request.database = [_serializer encodedDatabaseID]; + // TODO(dimond): Support stream resumption. We intentionally do not set the stream token on the + // handshake, ignoring any stream token we might have. + + LOG_DEBUG("FSTWriteStream %s initial request: %s", (__bridge void *)self, request); + [self writeRequest:request]; +} + +- (void)writeMutations:(NSArray *)mutations { + HARD_ASSERT([self isOpen], "Not yet open"); + HARD_ASSERT(self.handshakeComplete, "Mutations sent out of turn"); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + NSMutableArray *protos = [NSMutableArray arrayWithCapacity:mutations.count]; + for (FSTMutation *mutation in mutations) { + [protos addObject:[_serializer encodedMutation:mutation]]; + }; + + GCFSWriteRequest *request = [GCFSWriteRequest message]; + request.writesArray = protos; + request.streamToken = self.lastStreamToken; + + LOG_DEBUG("FSTWriteStream %s mutation request: %s", (__bridge void *)self, request); + [self writeRequest:request]; +} + +/** + * Implements GRXWriteable to receive an inbound message from GRPC, deserialize, and then pass + * that on to the mutationResultsHandler. + */ +- (void)handleStreamMessage:(GCFSWriteResponse *)response { + LOG_DEBUG("FSTWriteStream %s response: %s", (__bridge void *)self, response); + [self.workerDispatchQueue verifyIsCurrentQueue]; + + // Always capture the last stream token. + self.lastStreamToken = response.streamToken; + + if (!self.isHandshakeComplete) { + // The first response is the handshake response + self.handshakeComplete = YES; + + [self.delegate writeStreamDidCompleteHandshake]; + } else { + // A successful first write response means the stream is healthy. + // Note that we could consider a successful handshake healthy, however, the write itself + // might be causing an error we want to back off from. + [self.backoff reset]; + + SnapshotVersion commitVersion = [_serializer decodedVersion:response.commitTime]; + NSMutableArray *protos = response.writeResultsArray; + NSMutableArray *results = [NSMutableArray arrayWithCapacity:protos.count]; + for (GCFSWriteResult *proto in protos) { + [results addObject:[_serializer decodedMutationResult:proto commitVersion:commitVersion]]; + }; + + [self.delegate writeStreamDidReceiveResponseWithVersion:commitVersion mutationResults:results]; + } +} + +@end diff --git a/Firestore/Source/Util/FSTDispatchQueue.h b/Firestore/Source/Util/FSTDispatchQueue.h index 7e7b04abecb..7f9d6f2a9a6 100644 --- a/Firestore/Source/Util/FSTDispatchQueue.h +++ b/Firestore/Source/Util/FSTDispatchQueue.h @@ -16,7 +16,7 @@ #import -#include "Firestore/core/src/firebase/firestore/util/async_queue.h" +#include "Firestore/core/src/firebase/firestore/model/types.h" NS_ASSUME_NONNULL_BEGIN @@ -144,8 +144,6 @@ typedef NS_ENUM(NSInteger, FSTTimerID) { /** The underlying wrapped dispatch_queue_t */ @property(nonatomic, strong, readonly) dispatch_queue_t queue; -- (firebase::firestore::util::AsyncQueue *)implementation; - @end NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Util/FSTDispatchQueue.mm b/Firestore/Source/Util/FSTDispatchQueue.mm index 76ea32194b6..b921484f84a 100644 --- a/Firestore/Source/Util/FSTDispatchQueue.mm +++ b/Firestore/Source/Util/FSTDispatchQueue.mm @@ -21,6 +21,7 @@ #import "Firestore/Source/Util/FSTDispatchQueue.h" +#include "Firestore/core/src/firebase/firestore/util/async_queue.h" #include "Firestore/core/src/firebase/firestore/util/executor_libdispatch.h" #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "absl/memory/memory.h" @@ -62,10 +63,6 @@ @implementation FSTDispatchQueue { std::unique_ptr _impl; } -- (AsyncQueue *)implementation { - return _impl.get(); -} - + (TimerId)convertTimerId:(FSTTimerID)objcTimerID { const TimerId converted = static_cast(objcTimerID); switch (converted) { diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_connection.h b/Firestore/core/src/firebase/firestore/remote/grpc_connection.h index 21b854b046a..f440c3817c5 100644 --- a/Firestore/core/src/firebase/firestore/remote/grpc_connection.h +++ b/Firestore/core/src/firebase/firestore/remote/grpc_connection.h @@ -19,7 +19,6 @@ #include #include -#include #include #include "Firestore/core/src/firebase/firestore/auth/token.h" @@ -30,7 +29,6 @@ #include "Firestore/core/src/firebase/firestore/remote/grpc_stream_observer.h" #include "Firestore/core/src/firebase/firestore/remote/grpc_streaming_reader.h" #include "Firestore/core/src/firebase/firestore/remote/grpc_unary_call.h" -#include "Firestore/core/src/firebase/firestore/util/path.h" #include "absl/strings/string_view.h" #include "grpcpp/channel.h" #include "grpcpp/client_context.h" @@ -82,20 +80,26 @@ class GrpcConnection { void Unregister(GrpcCall* call); /** - * Don't use SSL, send all traffic unencrypted. Call before creating any - * streams or calls. + * For tests only: use a custom root certificate file and the given SSL + * target name for all connections. Call before creating any streams or calls. */ - static void UseInsecureChannel(const std::string& host); + static void UseTestCertificate(absl::string_view certificate_path, + absl::string_view target_name); /** - * For tests only: use a custom root certificate file and the given SSL - * target name for all connections. Call before creating any streams or calls. + * For tests only: don't use SSL, send all traffic unencrypted. Call before + * creating any streams or calls. Overrides a test certificate. */ - static void UseTestCertificate(const std::string& host, - const util::Path& certificate_path, - const std::string& target_name); + static void UseInsecureChannel(); private: + struct TestCredentials { + std::string certificate_path; + std::string target_name; + bool use_insecure_channel = false; + }; + static TestCredentials* test_credentials_; + std::unique_ptr CreateContext( const auth::Token& credential) const; std::shared_ptr CreateChannel() const; diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm b/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm index 6c3aa43a5be..eb77d856248 100644 --- a/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm +++ b/Firestore/core/src/firebase/firestore/remote/grpc_connection.mm @@ -25,7 +25,6 @@ #include "Firestore/core/include/firebase/firestore/firestore_errors.h" #include "Firestore/core/src/firebase/firestore/auth/token.h" #include "Firestore/core/src/firebase/firestore/model/database_id.h" -#include "Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h" #include "Firestore/core/src/firebase/firestore/util/hard_assert.h" #include "Firestore/core/src/firebase/firestore/util/log.h" #include "Firestore/core/src/firebase/firestore/util/string_format.h" @@ -41,7 +40,6 @@ using auth::Token; using core::DatabaseInfo; using model::DatabaseId; -using util::Path; using util::Status; using util::StringFormat; @@ -54,44 +52,10 @@ return view.data() ? std::string{view.data(), view.size()} : std::string{}; } -std::string LoadCertificate(const Path& path) { - std::ifstream certificate_file{path.native_value()}; - HARD_ASSERT(certificate_file.good(), - StringFormat("Unable to open root certificates at file path %s", - path.ToUtf8String()) - .c_str()); - - std::stringstream buffer; - buffer << certificate_file.rdbuf(); - return buffer.str(); -} - -std::shared_ptr CreateSslCredentials( - const Path& certificate_path) { - grpc::SslCredentialsOptions options; - options.pem_root_certs = LoadCertificate(certificate_path); - return grpc::SslCredentials(options); -} - -struct HostConfig { - util::Path certificate_path; - std::string target_name; - bool use_insecure_channel = false; -}; - -using ConfigByHost = std::unordered_map; - -ConfigByHost& Config() { - static ConfigByHost config_by_host_; - return config_by_host_; -} - -bool HasSpecialConfig(const std::string& host) { - return Config().find(host) != Config().end(); -} - } // namespace +GrpcConnection::TestCredentials* GrpcConnection::test_credentials_ = nullptr; + GrpcConnection::GrpcConnection(const DatabaseInfo& database_info, util::AsyncQueue* worker_queue, grpc::CompletionQueue* grpc_queue, @@ -123,7 +87,7 @@ bool HasSpecialConfig(const std::string& host) { context->set_credentials(grpc::AccessTokenCredentials(MakeString(token))); } - // TODO(dimond): This should ideally also include the gRPC version, however, + // TODO(dimond): This should ideally also include the grpc version, however, // gRPC defines the version as a macro, so it would be hardcoded based on // version we have at compile time of the Firestore library, rather than the // version available at runtime/at compile time by the user of the library. @@ -156,26 +120,31 @@ bool HasSpecialConfig(const std::string& host) { } std::shared_ptr GrpcConnection::CreateChannel() const { - const std::string& host = database_info_->host(); - - if (!HasSpecialConfig(host)) { - Path root_certificate_path = FindGrpcRootCertificate(); - return grpc::CreateChannel(host, - CreateSslCredentials(root_certificate_path)); + if (!test_credentials_) { + return grpc::CreateChannel( + database_info_->host(), + grpc::SslCredentials(grpc::SslCredentialsOptions())); } - const HostConfig& host_config = Config()[host]; - - // For the case when `Settings.sslEnabled == false`. - if (host_config.use_insecure_channel) { - return grpc::CreateChannel(host, grpc::InsecureChannelCredentials()); + if (test_credentials_->use_insecure_channel) { + return grpc::CreateChannel(database_info_->host(), + grpc::InsecureChannelCredentials()); } - // For tests only + std::ifstream cert_file{test_credentials_->certificate_path}; + HARD_ASSERT(cert_file.good(), + StringFormat("Unable to open root certificates at file path %s", + test_credentials_->certificate_path) + .c_str()); + std::stringstream cert_buffer; + cert_buffer << cert_file.rdbuf(); + grpc::SslCredentialsOptions options; + options.pem_root_certs = cert_buffer.str(); + grpc::ChannelArguments args; - args.SetSslTargetNameOverride(host_config.target_name); - return grpc::CreateCustomChannel( - host, CreateSslCredentials(host_config.certificate_path), args); + args.SetSslTargetNameOverride(test_credentials_->target_name); + return grpc::CreateCustomChannel(database_info_->host(), + grpc::SslCredentials(options), args); } std::unique_ptr GrpcConnection::CreateStream( @@ -241,24 +210,30 @@ bool HasSpecialConfig(const std::string& host) { } /*static*/ void GrpcConnection::UseTestCertificate( - const std::string& host, - const Path& certificate_path, - const std::string& target_name) { - HARD_ASSERT(!host.empty(), "Empty host name"); - HARD_ASSERT(!certificate_path.native_value().empty(), - "Empty path to test certificate"); + absl::string_view certificate_path, absl::string_view target_name) { + HARD_ASSERT(!certificate_path.empty(), "Empty path to test certificate"); HARD_ASSERT(!target_name.empty(), "Empty SSL target name"); - HostConfig& host_config = Config()[host]; - host_config.certificate_path = certificate_path; - host_config.target_name = target_name; + if (!test_credentials_) { + // Deliberately never deleted. + test_credentials_ = new TestCredentials{}; + } + + test_credentials_->certificate_path = + std::string{certificate_path.data(), certificate_path.size()}; + test_credentials_->target_name = + std::string{target_name.data(), target_name.size()}; + // TODO(varconst): hostname if necessary. } -/*static*/ void GrpcConnection::UseInsecureChannel(const std::string& host) { - HARD_ASSERT(!host.empty(), "Empty host name"); +/*static*/ void GrpcConnection::UseInsecureChannel() { + if (!test_credentials_) { + // Deliberately never deleted. + test_credentials_ = new TestCredentials{}; + } - HostConfig& host_config = Config()[host]; - host_config.use_insecure_channel = true; + test_credentials_->use_insecure_channel = true; + // TODO(varconst): hostname if necessary. } } // namespace remote diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h b/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h deleted file mode 100644 index 9fd97406284..00000000000 --- a/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2018 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_REMOTE_GRPC_ROOT_CERTIFICATE_FINDER_H_ -#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_REMOTE_GRPC_ROOT_CERTIFICATE_FINDER_H_ - -#include - -#include "Firestore/core/src/firebase/firestore/util/path.h" - -namespace firebase { -namespace firestore { -namespace remote { - -/** - * Finds the file containing gRPC root certificates (`roots.pem`, must be among - * resources accessible by Firestore) and returns its path. Will trigger - * assertion failure if the file cannot be found. - */ -util::Path FindGrpcRootCertificate(); - -} // namespace remote -} // namespace firestore -} // namespace firebase - -#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_REMOTE_GRPC_ROOT_CERTIFICATE_FINDER_H_ diff --git a/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm b/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm deleted file mode 100644 index 07e813b1869..00000000000 --- a/Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder_apple.mm +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2018 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Firestore/core/src/firebase/firestore/remote/grpc_root_certificate_finder.h" - -#include "Firestore/core/src/firebase/firestore/util/hard_assert.h" -#include "Firestore/core/src/firebase/firestore/util/string_apple.h" - -#import "Firestore/Source/Core/FSTFirestoreClient.h" - -namespace firebase { -namespace firestore { -namespace remote { - -using util::Path; - -Path FindGrpcRootCertificate() { - // TODO(varconst): uncomment these lines once it's possible to load the - // certificate from gRPC-C++ pod. - // NSBundle* bundle = [NSBundle bundleWithIdentifier:@"org.cocoapods.grpcpp"]; - // HARD_ASSERT(bundle, "Could not find grpcpp bundle"); - - // `mainBundle` may be nil in certain cases (e.g., unit tests). - NSBundle* bundle = [NSBundle bundleForClass:FSTFirestoreClient.class]; - HARD_ASSERT(bundle, "Could not find Firestore bundle"); - NSString* path = - [bundle pathForResource:@"gRPCCertificates.bundle/roots" ofType:@"pem"]; - HARD_ASSERT( - path, - "Could not load root certificates from the bundle. SSL won't work."); - - return Path::FromNSString(path); -} - -} // namespace remote -} // namespace firestore -} // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/remote/stream.h b/Firestore/core/src/firebase/firestore/remote/stream.h index 669c3815b0c..22a9856bb18 100644 --- a/Firestore/core/src/firebase/firestore/remote/stream.h +++ b/Firestore/core/src/firebase/firestore/remote/stream.h @@ -57,10 +57,6 @@ namespace remote { * * Streams are stateful and need to be `Start`ed before messages can * be sent and received. A `Stream` can be started and stopped repeatedly. - * - * All public virtual methods exist only for the sake of tests; the methods that - * are expected to be implemented by "normal" derived classes are pure virtual - * and private. */ class Stream : public GrpcStreamObserver, public std::enable_shared_from_this { @@ -133,7 +129,7 @@ class Stream : public GrpcStreamObserver, * * When start returns, `IsStarted` will return true. */ - virtual void Start(); + void Start(); /** * Stops the stream. This call is idempotent and allowed regardless of the @@ -141,7 +137,7 @@ class Stream : public GrpcStreamObserver, * * When stop returns, `IsStarted` and `IsOpen` will both return false. */ - virtual void Stop(); + void Stop(); /** * Returns true if `Start` has been called and no error has occurred. True @@ -150,13 +146,13 @@ class Stream : public GrpcStreamObserver, * actual stream). Use `IsOpen` to determine if the stream is open and ready * for outbound requests. */ - virtual bool IsStarted() const; + bool IsStarted() const; /** * Returns true if the underlying stream is open (`OnStreamStart` has been * called) and the stream is ready for outbound requests. */ - virtual bool IsOpen() const; + bool IsOpen() const; /** * After an error, the stream will usually back off on the next attempt to diff --git a/Firestore/core/src/firebase/firestore/remote/watch_stream.h b/Firestore/core/src/firebase/firestore/remote/watch_stream.h index 43b1ef32f7f..010bbe07288 100644 --- a/Firestore/core/src/firebase/firestore/remote/watch_stream.h +++ b/Firestore/core/src/firebase/firestore/remote/watch_stream.h @@ -62,14 +62,13 @@ class WatchStream : public Stream { * query will be streamed back as WatchChange messages that reference the * target ID included in `query`. */ - virtual /*virtual for tests only*/ void WatchQuery(FSTQueryData* query); + void WatchQuery(FSTQueryData* query); /** * Unregisters interest in the results of the query associated with the given * `target_id`. */ - virtual /*virtual for tests only*/ void UnwatchTargetId( - model::TargetId target_id); + void UnwatchTargetId(model::TargetId target_id); private: std::unique_ptr CreateGrpcStream( diff --git a/Firestore/core/src/firebase/firestore/remote/write_stream.h b/Firestore/core/src/firebase/firestore/remote/write_stream.h index 8e34e3eac25..4231d2bf14f 100644 --- a/Firestore/core/src/firebase/firestore/remote/write_stream.h +++ b/Firestore/core/src/firebase/firestore/remote/write_stream.h @@ -55,9 +55,6 @@ namespace remote { * request is received, all pending mutations may be submitted. When * submitting multiple batches of mutations at the same time, it's * okay to use the same stream token for the calls to `WriteMutations`. - * - * This class is not intended as a base class; all virtual methods exist only - * for the sake of tests. */ class WriteStream : public Stream { public: @@ -90,16 +87,10 @@ class WriteStream : public Stream { * Sends an initial stream token to the server, performing the handshake * required to make the StreamingWrite RPC work. */ - virtual void WriteHandshake(); + void WriteHandshake(); /** Sends a group of mutations to the Firestore backend to apply. */ - virtual void WriteMutations(NSArray* mutations); - - protected: - // For tests only - void SetHandshakeComplete(bool value = true) { - handshake_complete_ = value; - } + void WriteMutations(NSArray* mutations); private: std::unique_ptr CreateGrpcStream( diff --git a/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc b/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc index 7d07b94920b..52d20041951 100644 --- a/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc +++ b/Firestore/core/test/firebase/firestore/remote/grpc_stream_test.cc @@ -300,7 +300,11 @@ TEST_F(GrpcStreamTest, WriteAndFinish) { KeepPollingGrpcQueue(); worker_queue.EnqueueBlocking([&] { - // Ignore the returned result; last write may or may not finish fast enough + bool did_last_write = stream->WriteAndFinish({}); + // Canceling gRPC context is not used in this test, so the write operation + // won't come back from the completion queue. + EXPECT_FALSE(did_last_write); + EXPECT_EQ(observed_states(), States({"OnStreamStart"})); }); } diff --git a/Firestore/etc/roots.pem b/Firestore/etc/roots.pem deleted file mode 100644 index 3e6bbcd76ea..00000000000 --- a/Firestore/etc/roots.pem +++ /dev/null @@ -1,4342 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Label: "NetLock Arany (Class Gold) Főtanúsítvány" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes -# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes -# Label: "EC-ACC" -# Serial: -23701579247955709139626555126524820479 -# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 -# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 -# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB -8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy -dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 -YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 -dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh -IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD -LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG -EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g -KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD -ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu -bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg -ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R -85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm -4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV -HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd -QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t -lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB -o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 -opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo -dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW -ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN -AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y -/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k -SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy -Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS -Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl -nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL -BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV -BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw -MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B -LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F -ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem -hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 -EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn -Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 -zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ -96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m -j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g -DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ -8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j -X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH -hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB -KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 -Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT -+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL -BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 -BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO -jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 -loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c -qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ -2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ -JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre -zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf -LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ -x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 -oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- From b2437b80f61b031496c0c9bd7a1cc871b9a3a6b9 Mon Sep 17 00:00:00 2001 From: Gil Date: Thu, 1 Nov 2018 08:37:43 -0700 Subject: [PATCH 050/102] Partially revert "Update CHANGELOG for Firestore v0.14.0 (#2025)" (#2031) This removes the changelog entry that describes our migration to gRPC-C++. --- Firestore/CHANGELOG.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Firestore/CHANGELOG.md b/Firestore/CHANGELOG.md index dc7e148d3b3..6b13477c5ba 100644 --- a/Firestore/CHANGELOG.md +++ b/Firestore/CHANGELOG.md @@ -2,12 +2,6 @@ # v0.14.0 - [fixed] Fixed compilation in C99 and C++11 modes without GNU extensions. -- [changed] Moved from Objective-C gRPC framework to gRPC C++. If you're - manually tracking dependencies, the `gRPC`, `gRPC-ProtoRPC`, and - `gRPC-RxLibrary` frameworks have been replaced with `gRPC-C++`. While we - don't anticipate any issues, please [report any issues with network - behavior](https://github.com/firebase/firebase-ios-sdk/issues/new) you - experience. (#1968) # v0.13.6 - [changed] Internal improvements. From 6be1ddb4db7c6c0f6e50658fc1a7736ee52ac8ea Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Thu, 1 Nov 2018 08:45:56 -0700 Subject: [PATCH 051/102] Move #2034 into 5.12.0 (#2036) --- Firebase/Core/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firebase/Core/CHANGELOG.md b/Firebase/Core/CHANGELOG.md index b0cf267766a..aa3d88ef2c4 100644 --- a/Firebase/Core/CHANGELOG.md +++ b/Firebase/Core/CHANGELOG.md @@ -1,7 +1,7 @@ # Unreleased -- [fixed] Fixed static analysis warning for improper `nil` comparison. (#2034) # 2018-10-31 -- v5.1.7 -- M37 +- [fixed] Fixed static analysis warning for improper `nil` comparison. (#2034) - [changed] Assign the default app before posting notifications. (#2024) - [changed] Remove unnecessary notification flag. (#1993) - [changed] Wrap diagnostics notification in collection flag check. (#1979) From 5bc4cc55a604bbca7db0b349715158fa3df6a7cf Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Thu, 1 Nov 2018 09:44:30 -0700 Subject: [PATCH 052/102] Remove Held Write Acks (#2029) * Drop acknowledged mutations in schema migration (#1818) Drop acknowledged mutations in schema migration as part of removing held write acks. Port of firebase/firebase-js-sdk#1149 * Change removeMutationBatch to remove a single batch (#1955) * Update Firestore Generated Protos * Adding UnknownDocument and hasCommittedMutations (#1971) * Removing held write batch handling from LocalStore (#1997) * View changes for held write acks (#2004) * Held Write Acks Unit Test Fixes (#2008) * Held Write Ack Removal Spec Tests (#2018) * Fix integration test --- .../Tests/API/FIRQuerySnapshotTests.mm | 16 +- Firestore/Example/Tests/API/FSTAPIHelpers.mm | 30 +- .../Tests/Core/FSTQueryListenerTests.mm | 74 +- Firestore/Example/Tests/Core/FSTQueryTests.mm | 183 +- .../Example/Tests/Core/FSTViewSnapshotTest.mm | 29 +- Firestore/Example/Tests/Core/FSTViewTests.mm | 260 +- .../Tests/Integration/API/FIRDatabaseTests.mm | 26 + .../Local/FSTLRUGarbageCollectorTests.mm | 5 +- .../Tests/Local/FSTLevelDBMigrationsTests.mm | 109 +- .../Tests/Local/FSTLocalSerializerTests.mm | 19 +- .../Example/Tests/Local/FSTLocalStoreTests.mm | 401 +- .../Tests/Local/FSTMutationQueueTests.mm | 33 +- .../Local/FSTRemoteDocumentCacheTests.mm | 12 +- .../Tests/Model/FSTDocumentSetTests.mm | 10 +- .../Example/Tests/Model/FSTDocumentTests.mm | 28 +- .../Example/Tests/Model/FSTMutationTests.mm | 107 +- .../Tests/Remote/FSTRemoteEventTests.mm | 63 +- .../Tests/Remote/FSTSerializerBetaTests.mm | 6 +- .../Tests/Remote/FSTWatchChangeTests.mm | 2 +- .../Example/Tests/SpecTests/FSTSpecTests.mm | 56 +- .../SpecTests/json/collection_spec_test.json | 46 +- .../json/existence_filter_spec_test.json | 576 +- .../Tests/SpecTests/json/limbo_spec_test.json | 943 +- .../Tests/SpecTests/json/limit_spec_test.json | 1414 +- .../SpecTests/json/listen_spec_test.json | 3430 +- .../SpecTests/json/offline_spec_test.json | 123 +- .../SpecTests/json/orderby_spec_test.json | 137 +- .../Tests/SpecTests/json/perf_spec_test.json | 89735 ++++++++++------ .../SpecTests/json/persistence_spec_test.json | 240 +- .../json/remote_store_spec_test.json | 161 +- .../json/resume_token_spec_test.json | 79 +- .../Tests/SpecTests/json/write_spec_test.json | 4911 +- Firestore/Example/Tests/Util/FSTHelpers.h | 9 +- Firestore/Example/Tests/Util/FSTHelpers.mm | 15 +- Firestore/Source/API/FIRDocumentChange.mm | 22 +- Firestore/Source/API/FIRDocumentReference.mm | 7 +- .../Source/API/FIRDocumentSnapshot+Internal.h | 3 +- Firestore/Source/API/FIRDocumentSnapshot.mm | 31 +- Firestore/Source/API/FIRQuerySnapshot.mm | 11 +- Firestore/Source/API/FIRTransaction.mm | 20 +- Firestore/Source/Core/FSTEventManager.mm | 4 +- Firestore/Source/Core/FSTFirestoreClient.mm | 15 +- Firestore/Source/Core/FSTSyncEngine.mm | 5 +- Firestore/Source/Core/FSTTransaction.mm | 9 +- Firestore/Source/Core/FSTView.mm | 80 +- Firestore/Source/Core/FSTViewSnapshot.h | 9 +- Firestore/Source/Core/FSTViewSnapshot.mm | 19 +- .../Source/Local/FSTLevelDBMutationQueue.mm | 28 +- .../Source/Local/FSTLevelDBQueryCache.mm | 2 +- .../Source/Local/FSTLocalDocumentsView.mm | 10 +- Firestore/Source/Local/FSTLocalSerializer.mm | 56 +- Firestore/Source/Local/FSTLocalStore.mm | 144 +- .../Source/Local/FSTMemoryMutationQueue.mm | 59 +- Firestore/Source/Local/FSTMutationQueue.h | 7 +- Firestore/Source/Local/FSTReferenceSet.h | 2 +- Firestore/Source/Local/FSTReferenceSet.mm | 5 +- Firestore/Source/Model/FSTDocument.h | 30 +- Firestore/Source/Model/FSTDocument.mm | 107 +- Firestore/Source/Model/FSTMutation.h | 100 +- Firestore/Source/Model/FSTMutation.mm | 210 +- Firestore/Source/Remote/FSTRemoteEvent.mm | 13 +- Firestore/Source/Remote/FSTSerializerBeta.mm | 9 +- .../firebase/firestore/local/leveldb_key.cc | 2 +- .../firebase/firestore/local/leveldb_key.h | 11 +- .../firestore/local/leveldb_migrations.cc | 75 +- .../firebase/firestore/model/precondition.cc | 9 +- 66 files changed, 66977 insertions(+), 37425 deletions(-) diff --git a/Firestore/Example/Tests/API/FIRQuerySnapshotTests.mm b/Firestore/Example/Tests/API/FIRQuerySnapshotTests.mm index d3bee109b95..fd91013eebc 100644 --- a/Firestore/Example/Tests/API/FIRQuerySnapshotTests.mm +++ b/Firestore/Example/Tests/API/FIRQuerySnapshotTests.mm @@ -73,11 +73,11 @@ - (void)testEquals { } - (void)testIncludeMetadataChanges { - FSTDocument *doc1Old = FSTTestDoc("foo/bar", 1, @{@"a" : @"b"}, YES); - FSTDocument *doc1New = FSTTestDoc("foo/bar", 1, @{@"a" : @"b"}, NO); + FSTDocument *doc1Old = FSTTestDoc("foo/bar", 1, @{@"a" : @"b"}, FSTDocumentStateLocalMutations); + FSTDocument *doc1New = FSTTestDoc("foo/bar", 1, @{@"a" : @"b"}, FSTDocumentStateSynced); - FSTDocument *doc2Old = FSTTestDoc("foo/baz", 1, @{@"a" : @"b"}, NO); - FSTDocument *doc2New = FSTTestDoc("foo/baz", 1, @{@"a" : @"c"}, NO); + FSTDocument *doc2Old = FSTTestDoc("foo/baz", 1, @{@"a" : @"b"}, FSTDocumentStateSynced); + FSTDocument *doc2New = FSTTestDoc("foo/baz", 1, @{@"a" : @"c"}, FSTDocumentStateSynced); FSTDocumentSet *oldDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[ doc1Old, doc2Old ]); FSTDocumentSet *newDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[ doc2New, doc2New ]); @@ -93,7 +93,7 @@ - (void)testIncludeMetadataChanges { oldDocuments:oldDocuments documentChanges:documentChanges fromCache:NO - hasPendingWrites:NO + mutatedKeys:DocumentKeySet {} syncStateChanged:YES]; FIRSnapshotMetadata *metadata = [FIRSnapshotMetadata snapshotMetadataWithPendingWrites:NO fromCache:NO]; @@ -105,11 +105,13 @@ - (void)testIncludeMetadataChanges { FIRQueryDocumentSnapshot *doc1Snap = [FIRQueryDocumentSnapshot snapshotWithFirestore:firestore documentKey:doc1New.key document:doc1New - fromCache:NO]; + fromCache:NO + hasPendingWrites:NO]; FIRQueryDocumentSnapshot *doc2Snap = [FIRQueryDocumentSnapshot snapshotWithFirestore:firestore documentKey:doc2New.key document:doc2New - fromCache:NO]; + fromCache:NO + hasPendingWrites:NO]; NSArray *changesWithoutMetadata = @[ [[FIRDocumentChange alloc] initWithType:FIRDocumentChangeTypeModified diff --git a/Firestore/Example/Tests/API/FSTAPIHelpers.mm b/Firestore/Example/Tests/API/FSTAPIHelpers.mm index e9f1aea3e8d..bd0b084cf1d 100644 --- a/Firestore/Example/Tests/API/FSTAPIHelpers.mm +++ b/Firestore/Example/Tests/API/FSTAPIHelpers.mm @@ -63,11 +63,15 @@ NSDictionary *_Nullable data, BOOL hasMutations, BOOL fromCache) { - FSTDocument *doc = data ? FSTTestDoc(path, version, data, hasMutations) : nil; + FSTDocument *doc = + data ? FSTTestDoc(path, version, data, + hasMutations ? FSTDocumentStateLocalMutations : FSTDocumentStateSynced) + : nil; return [FIRDocumentSnapshot snapshotWithFirestore:FSTTestFirestore() documentKey:testutil::Key(path) document:doc - fromCache:fromCache]; + fromCache:fromCache + hasPendingWrites:hasMutations]; } FIRCollectionReference *FSTTestCollectionRef(const absl::string_view path) { @@ -90,28 +94,40 @@ FIRSnapshotMetadata *metadata = [FIRSnapshotMetadata snapshotMetadataWithPendingWrites:hasPendingWrites fromCache:fromCache]; FSTDocumentSet *oldDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[]); + DocumentKeySet mutatedKeys; for (NSString *key in oldDocs) { - oldDocuments = - [oldDocuments documentSetByAddingDocument:FSTTestDoc(util::StringFormat("%s/%s", path, key), - 1, oldDocs[key], hasPendingWrites)]; + oldDocuments = [oldDocuments + documentSetByAddingDocument:FSTTestDoc(util::StringFormat("%s/%s", path, key), 1, + oldDocs[key], + hasPendingWrites ? FSTDocumentStateLocalMutations + : FSTDocumentStateSynced)]; + if (hasPendingWrites) { + const absl::string_view documentKey = util::StringFormat("%s/%s", path, key); + mutatedKeys = mutatedKeys.insert(testutil::Key(documentKey)); + } } FSTDocumentSet *newDocuments = oldDocuments; NSArray *documentChanges = [NSArray array]; for (NSString *key in docsToAdd) { FSTDocument *docToAdd = - FSTTestDoc(util::StringFormat("%s/%s", path, key), 1, docsToAdd[key], hasPendingWrites); + FSTTestDoc(util::StringFormat("%s/%s", path, key), 1, docsToAdd[key], + hasPendingWrites ? FSTDocumentStateLocalMutations : FSTDocumentStateSynced); newDocuments = [newDocuments documentSetByAddingDocument:docToAdd]; documentChanges = [documentChanges arrayByAddingObject:[FSTDocumentViewChange changeWithDocument:docToAdd type:FSTDocumentViewChangeTypeAdded]]; + if (hasPendingWrites) { + const absl::string_view documentKey = util::StringFormat("%s/%s", path, key); + mutatedKeys = mutatedKeys.insert(testutil::Key(documentKey)); + } } FSTViewSnapshot *viewSnapshot = [[FSTViewSnapshot alloc] initWithQuery:FSTTestQuery(path) documents:newDocuments oldDocuments:oldDocuments documentChanges:documentChanges fromCache:fromCache - hasPendingWrites:hasPendingWrites + mutatedKeys:mutatedKeys syncStateChanged:YES]; return [FIRQuerySnapshot snapshotWithFirestore:FSTTestFirestore() originalQuery:FSTTestQuery(path) diff --git a/Firestore/Example/Tests/Core/FSTQueryListenerTests.mm b/Firestore/Example/Tests/Core/FSTQueryListenerTests.mm index 63087c944f4..0ee08f7a293 100644 --- a/Firestore/Example/Tests/Core/FSTQueryListenerTests.mm +++ b/Firestore/Example/Tests/Core/FSTQueryListenerTests.mm @@ -56,10 +56,10 @@ - (void)testRaisesCollectionEvents { NSMutableArray *otherAccum = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, NO); - FSTDocument *doc2prime = - FSTTestDoc("rooms/Hades", 3, @{@"name" : @"Hades", @"owner" : @"Jonny"}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateSynced); + FSTDocument *doc2prime = FSTTestDoc("rooms/Hades", 3, @{@"name" : @"Hades", @"owner" : @"Jonny"}, + FSTDocumentStateSynced); FSTQueryListener *listener = [self listenToQuery:query accumulatingSnapshots:accum]; FSTQueryListener *otherListener = [self listenToQuery:query accumulatingSnapshots:otherAccum]; @@ -91,7 +91,7 @@ - (void)testRaisesCollectionEvents { oldDocuments:[FSTDocumentSet documentSetWithComparator:snap2.query.comparator] documentChanges:@[ change1, change4 ] fromCache:snap2.fromCache - hasPendingWrites:snap2.hasPendingWrites + mutatedKeys:snap2.mutatedKeys syncStateChanged:YES]; XCTAssertEqualObjects(otherAccum, (@[ expectedSnap2 ])); } @@ -133,8 +133,8 @@ - (void)testMutingAsyncListenerPreventsAllSubsequentEvents { NSMutableArray *accum = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms/Eros"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 3, @{@"name" : @"Eros"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/Eros", 4, @{@"name" : @"Eros2"}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 3, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/Eros", 4, @{@"name" : @"Eros2"}, FSTDocumentStateSynced); __block FSTAsyncQueryListener *listener = [[FSTAsyncQueryListener alloc] initWithExecutor:_executor.get() @@ -171,8 +171,8 @@ - (void)testDoesNotRaiseEventsForMetadataChangesUnlessSpecified { NSMutableArray *fullAccum = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateSynced); FSTListenOptions *options = [[FSTListenOptions alloc] initWithIncludeQueryMetadataChanges:YES includeDocumentMetadataChanges:NO @@ -207,10 +207,12 @@ - (void)testRaisesDocumentMetadataEventsOnlyWhenSpecified { NSMutableArray *fullAccum = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, YES); - FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, NO); - FSTDocument *doc1Prime = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/Other", 3, @{@"name" : @"Other"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateLocalMutations); + FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateSynced); + FSTDocument *doc1Prime = + FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("rooms/Other", 3, @{@"name" : @"Other"}, FSTDocumentStateSynced); FSTListenOptions *options = [[FSTListenOptions alloc] initWithIncludeQueryMetadataChanges:NO includeDocumentMetadataChanges:YES @@ -256,11 +258,15 @@ - (void)testRaisesQueryMetadataEventsOnlyWhenHasPendingWritesOnTheQueryChanges { NSMutableArray *fullAccum = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, YES); - FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, YES); - FSTDocument *doc1Prime = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, NO); - FSTDocument *doc2Prime = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/Other", 3, @{@"name" : @"Other"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateLocalMutations); + FSTDocument *doc2 = + FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateLocalMutations); + FSTDocument *doc1Prime = + FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc2Prime = + FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("rooms/Other", 3, @{@"name" : @"Other"}, FSTDocumentStateSynced); FSTListenOptions *options = [[FSTListenOptions alloc] initWithIncludeQueryMetadataChanges:YES includeDocumentMetadataChanges:NO @@ -284,7 +290,7 @@ - (void)testRaisesQueryMetadataEventsOnlyWhenHasPendingWritesOnTheQueryChanges { oldDocuments:snap3.documents documentChanges:@[] fromCache:snap4.fromCache - hasPendingWrites:NO + mutatedKeys:snap4.mutatedKeys syncStateChanged:snap4.syncStateChanged]; XCTAssertEqualObjects(fullAccum, (@[ snap1, snap3, expectedSnap4 ])); } @@ -293,10 +299,12 @@ - (void)testMetadataOnlyDocumentChangesAreFilteredOutWhenIncludeDocumentMetadata NSMutableArray *filteredAccum = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, YES); - FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, NO); - FSTDocument *doc1Prime = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/Other", 3, @{@"name" : @"Other"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateLocalMutations); + FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateSynced); + FSTDocument *doc1Prime = + FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("rooms/Other", 3, @{@"name" : @"Other"}, FSTDocumentStateSynced); FSTQueryListener *filteredListener = [self listenToQuery:query accumulatingSnapshots:filteredAccum]; @@ -316,7 +324,7 @@ - (void)testMetadataOnlyDocumentChangesAreFilteredOutWhenIncludeDocumentMetadata oldDocuments:snap1.documents documentChanges:@[ change3 ] fromCache:snap2.isFromCache - hasPendingWrites:snap2.hasPendingWrites + mutatedKeys:snap2.mutatedKeys syncStateChanged:snap2.syncStateChanged]; XCTAssertEqualObjects(filteredAccum, (@[ snap1, expectedSnap2 ])); } @@ -325,8 +333,8 @@ - (void)testWillWaitForSyncIfOnline { NSMutableArray *events = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateSynced); FSTQueryListener *listener = [self listenToQuery:query options:[[FSTListenOptions alloc] initWithIncludeQueryMetadataChanges:NO @@ -357,7 +365,7 @@ - (void)testWillWaitForSyncIfOnline { oldDocuments:[FSTDocumentSet documentSetWithComparator:snap3.query.comparator] documentChanges:@[ change1, change2 ] fromCache:NO - hasPendingWrites:NO + mutatedKeys:snap3.mutatedKeys syncStateChanged:YES]; XCTAssertEqualObjects(events, (@[ expectedSnap ])); } @@ -366,8 +374,8 @@ - (void)testWillRaiseInitialEventWhenGoingOffline { NSMutableArray *events = [NSMutableArray array]; FSTQuery *query = FSTTestQuery("rooms"); - FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/Eros", 1, @{@"name" : @"Eros"}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/Hades", 2, @{@"name" : @"Hades"}, FSTDocumentStateSynced); FSTQueryListener *listener = [self listenToQuery:query options:[[FSTListenOptions alloc] initWithIncludeQueryMetadataChanges:NO @@ -396,14 +404,14 @@ - (void)testWillRaiseInitialEventWhenGoingOffline { oldDocuments:[FSTDocumentSet documentSetWithComparator:snap1.query.comparator] documentChanges:@[ change1 ] fromCache:YES - hasPendingWrites:NO + mutatedKeys:snap1.mutatedKeys syncStateChanged:YES]; FSTViewSnapshot *expectedSnap2 = [[FSTViewSnapshot alloc] initWithQuery:query documents:snap2.documents oldDocuments:snap1.documents documentChanges:@[ change2 ] fromCache:YES - hasPendingWrites:NO + mutatedKeys:snap2.mutatedKeys syncStateChanged:NO]; XCTAssertEqualObjects(events, (@[ expectedSnap1, expectedSnap2 ])); } @@ -429,7 +437,7 @@ - (void)testWillRaiseInitialEventWhenGoingOfflineAndThereAreNoDocs { oldDocuments:[FSTDocumentSet documentSetWithComparator:snap1.query.comparator] documentChanges:@[] fromCache:YES - hasPendingWrites:NO + mutatedKeys:snap1.mutatedKeys syncStateChanged:YES]; XCTAssertEqualObjects(events, (@[ expectedSnap ])); } @@ -454,7 +462,7 @@ - (void)testWillRaiseInitialEventWhenStartingOfflineAndThereAreNoDocs { oldDocuments:[FSTDocumentSet documentSetWithComparator:snap1.query.comparator] documentChanges:@[] fromCache:YES - hasPendingWrites:NO + mutatedKeys:snap1.mutatedKeys syncStateChanged:YES]; XCTAssertEqualObjects(events, (@[ expectedSnap ])); } diff --git a/Firestore/Example/Tests/Core/FSTQueryTests.mm b/Firestore/Example/Tests/Core/FSTQueryTests.mm index e3e391a6763..9ad357eb981 100644 --- a/Firestore/Example/Tests/Core/FSTQueryTests.mm +++ b/Firestore/Example/Tests/Core/FSTQueryTests.mm @@ -88,9 +88,12 @@ - (void)testOrderBy { } - (void)testMatchesBasedOnDocumentKey { - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/other/messages/1", 0, @{@"text" : @"msg3"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, FSTDocumentStateSynced); + FSTDocument *doc2 = + FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, FSTDocumentStateSynced); + FSTDocument *doc3 = + FSTTestDoc("rooms/other/messages/1", 0, @{@"text" : @"msg3"}, FSTDocumentStateSynced); // document query FSTQuery *query = FSTTestQuery("rooms/eros/messages/1"); @@ -100,10 +103,14 @@ - (void)testMatchesBasedOnDocumentKey { } - (void)testMatchesCorrectlyForShallowAncestorQuery { - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, NO); - FSTDocument *doc1Meta = FSTTestDoc("rooms/eros/messages/1/meta/1", 0, @{@"meta" : @"mv"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/other/messages/1", 0, @{@"text" : @"msg3"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, FSTDocumentStateSynced); + FSTDocument *doc1Meta = + FSTTestDoc("rooms/eros/messages/1/meta/1", 0, @{@"meta" : @"mv"}, FSTDocumentStateSynced); + FSTDocument *doc2 = + FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, FSTDocumentStateSynced); + FSTDocument *doc3 = + FSTTestDoc("rooms/other/messages/1", 0, @{@"text" : @"msg3"}, FSTDocumentStateSynced); // shallow ancestor query FSTQuery *query = FSTTestQuery("rooms/eros/messages"); @@ -114,8 +121,9 @@ - (void)testMatchesCorrectlyForShallowAncestorQuery { } - (void)testEmptyFieldsAreAllowedForQueries { - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{}, FSTDocumentStateSynced); FSTQuery *query = [FSTTestQuery("rooms/eros/messages") queryByAddingFilter:FSTTestFilter("text", @"==", @"msg1")]; @@ -129,12 +137,12 @@ - (void)testMatchesPrimitiveValuesForFilters { FSTQuery *query2 = [FSTTestQuery("collection") queryByAddingFilter:FSTTestFilter("sort", @"<=", @(2))]; - FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @1}, NO); - FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @2}, NO); - FSTDocument *doc3 = FSTTestDoc("collection/3", 0, @{@"sort" : @3}, NO); - FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @NO}, NO); - FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @"string"}, NO); - FSTDocument *doc6 = FSTTestDoc("collection/6", 0, @{}, NO); + FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @1}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("collection/3", 0, @{@"sort" : @3}, FSTDocumentStateSynced); + FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @NO}, FSTDocumentStateSynced); + FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @"string"}, FSTDocumentStateSynced); + FSTDocument *doc6 = FSTTestDoc("collection/6", 0, @{}, FSTDocumentStateSynced); XCTAssertFalse([query1 matchesDocument:doc1]); XCTAssertTrue([query1 matchesDocument:doc2]); @@ -156,11 +164,11 @@ - (void)testArrayContainsFilter { queryByAddingFilter:FSTTestFilter("array", @"array_contains", @42)]; // not an array. - FSTDocument *doc = FSTTestDoc("collection/1", 0, @{@"array" : @1}, NO); + FSTDocument *doc = FSTTestDoc("collection/1", 0, @{@"array" : @1}, FSTDocumentStateSynced); XCTAssertFalse([query matchesDocument:doc]); // empty array. - doc = FSTTestDoc("collection/1", 0, @{@"array" : @[]}, NO); + doc = FSTTestDoc("collection/1", 0, @{@"array" : @[]}, FSTDocumentStateSynced); XCTAssertFalse([query matchesDocument:doc]); // array without element (and make sure it doesn't match in a nested field or a different field). @@ -170,11 +178,14 @@ - (void)testArrayContainsFilter { @{@"a" : @42, @"b" : @[ @42 ]} ], @"different" : @[ @42 ]}, - NO); + FSTDocumentStateSynced); XCTAssertFalse([query matchesDocument:doc]); // array with element. - doc = FSTTestDoc("collection/1", 0, @{@"array" : @[ @1, @"2", @42, @{@"a" : @1} ]}, NO); + doc = FSTTestDoc("collection/1", 0, + @{@"array" : @[ @1, @"2", @42, + @{@"a" : @1} ]}, + FSTDocumentStateSynced); XCTAssertTrue([query matchesDocument:doc]); } @@ -194,22 +205,26 @@ - (void)testArrayContainsFilterWithObjectValue { @"b" : @42} ] }, - NO); + FSTDocumentStateSynced); XCTAssertFalse([query matchesDocument:doc]); // array with element. - doc = FSTTestDoc("collection/1", 0, @{@"array" : @[ @1, @"2", @42, @{@"a" : @[ @42 ]} ]}, NO); + doc = FSTTestDoc("collection/1", 0, + @{@"array" : @[ @1, @"2", @42, + @{@"a" : @[ @42 ]} ]}, + FSTDocumentStateSynced); XCTAssertTrue([query matchesDocument:doc]); } - (void)testNullFilter { FSTQuery *query = [FSTTestQuery("collection") queryByAddingFilter:FSTTestFilter("sort", @"==", [NSNull null])]; - FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : [NSNull null]}, NO); - FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @2}, NO); - FSTDocument *doc3 = FSTTestDoc("collection/2", 0, @{@"sort" : @3.1}, NO); - FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @NO}, NO); - FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @"string"}, NO); + FSTDocument *doc1 = + FSTTestDoc("collection/1", 0, @{@"sort" : [NSNull null]}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("collection/2", 0, @{@"sort" : @3.1}, FSTDocumentStateSynced); + FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @NO}, FSTDocumentStateSynced); + FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @"string"}, FSTDocumentStateSynced); XCTAssertTrue([query matchesDocument:doc1]); XCTAssertFalse([query matchesDocument:doc2]); @@ -221,11 +236,11 @@ - (void)testNullFilter { - (void)testNanFilter { FSTQuery *query = [FSTTestQuery("collection") queryByAddingFilter:FSTTestFilter("sort", @"==", @(NAN))]; - FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @(NAN)}, NO); - FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @2}, NO); - FSTDocument *doc3 = FSTTestDoc("collection/2", 0, @{@"sort" : @3.1}, NO); - FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @NO}, NO); - FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @"string"}, NO); + FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @(NAN)}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("collection/2", 0, @{@"sort" : @3.1}, FSTDocumentStateSynced); + FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @NO}, FSTDocumentStateSynced); + FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @"string"}, FSTDocumentStateSynced); XCTAssertTrue([query matchesDocument:doc1]); XCTAssertFalse([query matchesDocument:doc2]); @@ -240,13 +255,17 @@ - (void)testDoesNotMatchComplexObjectsForFilters { FSTQuery *query2 = [FSTTestQuery("collection") queryByAddingFilter:FSTTestFilter("sort", @">=", @(2))]; - FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @2}, NO); - FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @[]}, NO); - FSTDocument *doc3 = FSTTestDoc("collection/3", 0, @{@"sort" : @[ @1 ]}, NO); - FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @{@"foo" : @2}}, NO); - FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @{@"foo" : @"bar"}}, NO); - FSTDocument *doc6 = FSTTestDoc("collection/6", 0, @{@"sort" : @{}}, NO); // no sort field - FSTDocument *doc7 = FSTTestDoc("collection/7", 0, @{@"sort" : @[ @3, @1 ]}, NO); + FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @[]}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("collection/3", 0, @{@"sort" : @[ @1 ]}, FSTDocumentStateSynced); + FSTDocument *doc4 = FSTTestDoc("collection/4", 0, + @{@"sort" : @{@"foo" : @2}}, FSTDocumentStateSynced); + FSTDocument *doc5 = FSTTestDoc("collection/5", 0, + @{@"sort" : @{@"foo" : @"bar"}}, FSTDocumentStateSynced); + FSTDocument *doc6 = FSTTestDoc("collection/6", 0, + @{@"sort" : @{}}, FSTDocumentStateSynced); // no sort field + FSTDocument *doc7 = FSTTestDoc("collection/7", 0, + @{@"sort" : @[ @3, @1 ]}, FSTDocumentStateSynced); XCTAssertTrue([query1 matchesDocument:doc1]); XCTAssertFalse([query1 matchesDocument:doc2]); @@ -270,12 +289,14 @@ - (void)testDoesntRemoveComplexObjectsWithOrderBy { queryByAddingSortOrder:[FSTSortOrder sortOrderWithFieldPath:testutil::Field("sort") ascending:YES]]; - FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @2}, NO); - FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @[]}, NO); - FSTDocument *doc3 = FSTTestDoc("collection/3", 0, @{@"sort" : @[ @1 ]}, NO); - FSTDocument *doc4 = FSTTestDoc("collection/4", 0, @{@"sort" : @{@"foo" : @2}}, NO); - FSTDocument *doc5 = FSTTestDoc("collection/5", 0, @{@"sort" : @{@"foo" : @"bar"}}, NO); - FSTDocument *doc6 = FSTTestDoc("collection/6", 0, @{}, NO); + FSTDocument *doc1 = FSTTestDoc("collection/1", 0, @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("collection/2", 0, @{@"sort" : @[]}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("collection/3", 0, @{@"sort" : @[ @1 ]}, FSTDocumentStateSynced); + FSTDocument *doc4 = FSTTestDoc("collection/4", 0, + @{@"sort" : @{@"foo" : @2}}, FSTDocumentStateSynced); + FSTDocument *doc5 = FSTTestDoc("collection/5", 0, + @{@"sort" : @{@"foo" : @"bar"}}, FSTDocumentStateSynced); + FSTDocument *doc6 = FSTTestDoc("collection/6", 0, @{}, FSTDocumentStateSynced); XCTAssertTrue([query1 matchesDocument:doc1]); XCTAssertTrue([query1 matchesDocument:doc2]); @@ -287,7 +308,8 @@ - (void)testDoesntRemoveComplexObjectsWithOrderBy { - (void)testFiltersBasedOnArrayValue { FSTQuery *baseQuery = FSTTestQuery("collection"); - FSTDocument *doc1 = FSTTestDoc("collection/doc", 0, @{@"tags" : @[ @"foo", @1, @YES ]}, NO); + FSTDocument *doc1 = FSTTestDoc("collection/doc", 0, + @{@"tags" : @[ @"foo", @1, @YES ]}, FSTDocumentStateSynced); NSArray *matchingFilters = @[ FSTTestFilter("tags", @"==", @[ @"foo", @1, @YES ]) ]; @@ -310,7 +332,8 @@ - (void)testFiltersBasedOnObjectValue { FSTQuery *baseQuery = FSTTestQuery("collection"); FSTDocument *doc1 = FSTTestDoc("collection/doc", 0, - @{@"tags" : @{@"foo" : @"foo", @"a" : @0, @"b" : @YES, @"c" : @(NAN)}}, NO); + @{@"tags" : @{@"foo" : @"foo", @"a" : @0, @"b" : @YES, @"c" : @(NAN)}}, + FSTDocumentStateSynced); NSArray *matchingFilters = @[ FSTTestFilter("tags", @"==", @@ -365,21 +388,21 @@ - (void)testSortsDocumentsInTheCorrectOrder { // clang-format off NSArray *docs = @[ - FSTTestDoc("collection/1", 0, @{@"sort": [NSNull null]}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @NO}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @YES}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @1}, NO), - FSTTestDoc("collection/2", 0, @{@"sort": @1}, NO), // by key - FSTTestDoc("collection/3", 0, @{@"sort": @1}, NO), // by key - FSTTestDoc("collection/1", 0, @{@"sort": @1.9}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @2}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @2.1}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @""}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @"a"}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @"ab"}, NO), - FSTTestDoc("collection/1", 0, @{@"sort": @"b"}, NO), + FSTTestDoc("collection/1", 0, @{@"sort": [NSNull null]}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @NO}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @YES}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @1}, FSTDocumentStateSynced), + FSTTestDoc("collection/2", 0, @{@"sort": @1}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/3", 0, @{@"sort": @1}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/1", 0, @{@"sort": @1.9}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @2}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @2.1}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @""}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @"a"}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @"ab"}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort": @"b"}, FSTDocumentStateSynced), FSTTestDoc("collection/1", 0, @{@"sort": - FSTTestRef("project", DatabaseId::kDefault, @"collection/id1")}, NO), + FSTTestRef("project", DatabaseId::kDefault, @"collection/id1")}, FSTDocumentStateSynced), ]; // clang-format on @@ -397,16 +420,16 @@ - (void)testSortsDocumentsUsingMultipleFields { // clang-format off NSArray *docs = - @[FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @1}, NO), - FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @2}, NO), - FSTTestDoc("collection/2", 0, @{@"sort1": @1, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/3", 0, @{@"sort1": @1, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @3}, NO), - FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @1}, NO), - FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @2}, NO), - FSTTestDoc("collection/2", 0, @{@"sort1": @2, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/3", 0, @{@"sort1": @2, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @3}, NO), + @[FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @1}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @2}, FSTDocumentStateSynced), + FSTTestDoc("collection/2", 0, @{@"sort1": @1, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/3", 0, @{@"sort1": @1, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @3}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @1}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @2}, FSTDocumentStateSynced), + FSTTestDoc("collection/2", 0, @{@"sort1": @2, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/3", 0, @{@"sort1": @2, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @3}, FSTDocumentStateSynced), ]; // clang-format on @@ -424,16 +447,16 @@ - (void)testSortsDocumentsWithDescendingToo { // clang-format off NSArray *docs = - @[FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @3}, NO), - FSTTestDoc("collection/3", 0, @{@"sort1": @2, @"sort2": @2}, NO), - FSTTestDoc("collection/2", 0, @{@"sort1": @2, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @1}, NO), - FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @3}, NO), - FSTTestDoc("collection/3", 0, @{@"sort1": @1, @"sort2": @2}, NO), - FSTTestDoc("collection/2", 0, @{@"sort1": @1, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @2}, NO), // by key - FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @1}, NO), + @[FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @3}, FSTDocumentStateSynced), + FSTTestDoc("collection/3", 0, @{@"sort1": @2, @"sort2": @2}, FSTDocumentStateSynced), + FSTTestDoc("collection/2", 0, @{@"sort1": @2, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/1", 0, @{@"sort1": @2, @"sort2": @1}, FSTDocumentStateSynced), + FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @3}, FSTDocumentStateSynced), + FSTTestDoc("collection/3", 0, @{@"sort1": @1, @"sort2": @2}, FSTDocumentStateSynced), + FSTTestDoc("collection/2", 0, @{@"sort1": @1, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @2}, FSTDocumentStateSynced), // by key + FSTTestDoc("collection/1", 0, @{@"sort1": @1, @"sort2": @1}, FSTDocumentStateSynced), ]; // clang-format on diff --git a/Firestore/Example/Tests/Core/FSTViewSnapshotTest.mm b/Firestore/Example/Tests/Core/FSTViewSnapshotTest.mm index ca8954e95e1..a6cc2f8811f 100644 --- a/Firestore/Example/Tests/Core/FSTViewSnapshotTest.mm +++ b/Firestore/Example/Tests/Core/FSTViewSnapshotTest.mm @@ -32,7 +32,7 @@ @interface FSTViewSnapshotTests : XCTestCase @implementation FSTViewSnapshotTests - (void)testDocumentChangeConstructor { - FSTDocument *doc = FSTTestDoc("a/b", 0, @{}, NO); + FSTDocument *doc = FSTTestDoc("a/b", 0, @{}, FSTDocumentStateSynced); FSTDocumentViewChangeType type = FSTDocumentViewChangeTypeModified; FSTDocumentViewChange *change = [FSTDocumentViewChange changeWithDocument:doc type:type]; XCTAssertEqual(change.document, doc); @@ -42,15 +42,15 @@ - (void)testDocumentChangeConstructor { - (void)testTrack { FSTDocumentViewChangeSet *set = [FSTDocumentViewChangeSet changeSet]; - FSTDocument *docAdded = FSTTestDoc("a/1", 0, @{}, NO); - FSTDocument *docRemoved = FSTTestDoc("a/2", 0, @{}, NO); - FSTDocument *docModified = FSTTestDoc("a/3", 0, @{}, NO); + FSTDocument *docAdded = FSTTestDoc("a/1", 0, @{}, FSTDocumentStateSynced); + FSTDocument *docRemoved = FSTTestDoc("a/2", 0, @{}, FSTDocumentStateSynced); + FSTDocument *docModified = FSTTestDoc("a/3", 0, @{}, FSTDocumentStateSynced); - FSTDocument *docAddedThenModified = FSTTestDoc("b/1", 0, @{}, NO); - FSTDocument *docAddedThenRemoved = FSTTestDoc("b/2", 0, @{}, NO); - FSTDocument *docRemovedThenAdded = FSTTestDoc("b/3", 0, @{}, NO); - FSTDocument *docModifiedThenRemoved = FSTTestDoc("b/4", 0, @{}, NO); - FSTDocument *docModifiedThenModified = FSTTestDoc("b/5", 0, @{}, NO); + FSTDocument *docAddedThenModified = FSTTestDoc("b/1", 0, @{}, FSTDocumentStateSynced); + FSTDocument *docAddedThenRemoved = FSTTestDoc("b/2", 0, @{}, FSTDocumentStateSynced); + FSTDocument *docRemovedThenAdded = FSTTestDoc("b/3", 0, @{}, FSTDocumentStateSynced); + FSTDocument *docModifiedThenRemoved = FSTTestDoc("b/4", 0, @{}, FSTDocumentStateSynced); + FSTDocument *docModifiedThenModified = FSTTestDoc("b/5", 0, @{}, FSTDocumentStateSynced); [set addChange:[FSTDocumentViewChange changeWithDocument:docAdded type:FSTDocumentViewChangeTypeAdded]]; @@ -109,13 +109,14 @@ - (void)testViewSnapshotConstructor { FSTQuery *query = FSTTestQuery("a"); FSTDocumentSet *documents = [FSTDocumentSet documentSetWithComparator:FSTDocumentComparatorByKey]; FSTDocumentSet *oldDocuments = documents; - documents = [documents documentSetByAddingDocument:FSTTestDoc("c/a", 1, @{}, NO)]; + documents = + [documents documentSetByAddingDocument:FSTTestDoc("c/a", 1, @{}, FSTDocumentStateSynced)]; NSArray *documentChanges = - @[ [FSTDocumentViewChange changeWithDocument:FSTTestDoc("c/a", 1, @{}, NO) + @[ [FSTDocumentViewChange changeWithDocument:FSTTestDoc("c/a", 1, @{}, FSTDocumentStateSynced) type:FSTDocumentViewChangeTypeAdded] ]; BOOL fromCache = YES; - BOOL hasPendingWrites = NO; + DocumentKeySet mutatedKeys; BOOL syncStateChanged = YES; FSTViewSnapshot *snapshot = [[FSTViewSnapshot alloc] initWithQuery:query @@ -123,7 +124,7 @@ - (void)testViewSnapshotConstructor { oldDocuments:oldDocuments documentChanges:documentChanges fromCache:fromCache - hasPendingWrites:hasPendingWrites + mutatedKeys:mutatedKeys syncStateChanged:syncStateChanged]; XCTAssertEqual(snapshot.query, query); @@ -131,7 +132,7 @@ - (void)testViewSnapshotConstructor { XCTAssertEqual(snapshot.oldDocuments, oldDocuments); XCTAssertEqual(snapshot.documentChanges, documentChanges); XCTAssertEqual(snapshot.fromCache, fromCache); - XCTAssertEqual(snapshot.hasPendingWrites, hasPendingWrites); + XCTAssertEqual(snapshot.mutatedKeys, mutatedKeys); XCTAssertEqual(snapshot.syncStateChanged, syncStateChanged); } diff --git a/Firestore/Example/Tests/Core/FSTViewTests.mm b/Firestore/Example/Tests/Core/FSTViewTests.mm index 50c47068cfd..9ca3cea1a75 100644 --- a/Firestore/Example/Tests/Core/FSTViewTests.mm +++ b/Firestore/Example/Tests/Core/FSTViewTests.mm @@ -52,9 +52,12 @@ - (void)testAddsDocumentsBasedOnQuery { FSTQuery *query = [self queryForMessages]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/other/messages/1", 0, @{@"text" : @"msg3"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, FSTDocumentStateSynced); + FSTDocument *doc2 = + FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, FSTDocumentStateSynced); + FSTDocument *doc3 = + FSTTestDoc("rooms/other/messages/1", 0, @{@"text" : @"msg3"}, FSTDocumentStateSynced); FSTViewSnapshot *_Nullable snapshot = FSTTestApplyChanges( view, @[ doc1, doc2, doc3 ], FSTTestTargetChangeAckDocuments({doc1.key, doc2.key, doc3.key})); @@ -78,16 +81,19 @@ - (void)testRemovesDocuments { FSTQuery *query = [self queryForMessages]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, @{@"text" : @"msg3"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, FSTDocumentStateSynced); + FSTDocument *doc2 = + FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, FSTDocumentStateSynced); + FSTDocument *doc3 = + FSTTestDoc("rooms/eros/messages/3", 0, @{@"text" : @"msg3"}, FSTDocumentStateSynced); // initial state FSTTestApplyChanges(view, @[ doc1, doc2 ], nil); // delete doc2, add doc3 FSTViewSnapshot *snapshot = - FSTTestApplyChanges(view, @[ FSTTestDeletedDoc("rooms/eros/messages/2", 0), doc3 ], + FSTTestApplyChanges(view, @[ FSTTestDeletedDoc("rooms/eros/messages/2", 0, NO), doc3 ], FSTTestTargetChangeAckDocuments({doc1.key, doc3.key})); XCTAssertEqual(snapshot.query, query); @@ -108,8 +114,10 @@ - (void)testReturnsNilIfThereAreNoChanges { FSTQuery *query = [self queryForMessages]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, FSTDocumentStateSynced); + FSTDocument *doc2 = + FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, FSTDocumentStateSynced); // initial state FSTTestApplyChanges(view, @[ doc1, doc2 ], nil); @@ -136,11 +144,16 @@ - (void)testFiltersDocumentsBasedOnQueryWithFilter { query = [query queryByAddingFilter:filter]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"sort" : @1}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"sort" : @2}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, @{@"sort" : @3}, NO); - FSTDocument *doc4 = FSTTestDoc("rooms/eros/messages/4", 0, @{}, NO); // no sort, no match - FSTDocument *doc5 = FSTTestDoc("rooms/eros/messages/5", 0, @{@"sort" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, + @{@"sort" : @1}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, + @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, + @{@"sort" : @3}, FSTDocumentStateSynced); + FSTDocument *doc4 = + FSTTestDoc("rooms/eros/messages/4", 0, @{}, FSTDocumentStateSynced); // no sort, no match + FSTDocument *doc5 = FSTTestDoc("rooms/eros/messages/5", 0, + @{@"sort" : @1}, FSTDocumentStateSynced); FSTViewSnapshot *snapshot = FSTTestApplyChanges(view, @[ doc1, doc2, doc3, doc4, doc5 ], nil); @@ -168,10 +181,13 @@ - (void)testUpdatesDocumentsBasedOnQueryWithFilter { query = [query queryByAddingFilter:filter]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"sort" : @1}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"sort" : @3}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, @{@"sort" : @2}, NO); - FSTDocument *doc4 = FSTTestDoc("rooms/eros/messages/4", 0, @{}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, + @{@"sort" : @1}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, + @{@"sort" : @3}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, + @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *doc4 = FSTTestDoc("rooms/eros/messages/4", 0, @{}, FSTDocumentStateSynced); FSTViewSnapshot *snapshot = FSTTestApplyChanges(view, @[ doc1, doc2, doc3, doc4 ], nil); @@ -179,9 +195,12 @@ - (void)testUpdatesDocumentsBasedOnQueryWithFilter { XCTAssertEqualObjects(snapshot.documents.arrayValue, (@[ doc1, doc3 ])); - FSTDocument *newDoc2 = FSTTestDoc("rooms/eros/messages/2", 1, @{@"sort" : @2}, NO); - FSTDocument *newDoc3 = FSTTestDoc("rooms/eros/messages/3", 1, @{@"sort" : @3}, NO); - FSTDocument *newDoc4 = FSTTestDoc("rooms/eros/messages/4", 1, @{@"sort" : @0}, NO); + FSTDocument *newDoc2 = FSTTestDoc("rooms/eros/messages/2", 1, + @{@"sort" : @2}, FSTDocumentStateSynced); + FSTDocument *newDoc3 = FSTTestDoc("rooms/eros/messages/3", 1, + @{@"sort" : @3}, FSTDocumentStateSynced); + FSTDocument *newDoc4 = FSTTestDoc("rooms/eros/messages/4", 1, + @{@"sort" : @0}, FSTDocumentStateSynced); snapshot = FSTTestApplyChanges(view, @[ newDoc2, newDoc3, newDoc4 ], nil); @@ -205,9 +224,12 @@ - (void)testRemovesDocumentsForQueryWithLimit { query = [query queryBySettingLimit:2]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, @{@"text" : @"msg3"}, NO); + FSTDocument *doc1 = + FSTTestDoc("rooms/eros/messages/1", 0, @{@"text" : @"msg1"}, FSTDocumentStateSynced); + FSTDocument *doc2 = + FSTTestDoc("rooms/eros/messages/2", 0, @{@"text" : @"msg2"}, FSTDocumentStateSynced); + FSTDocument *doc3 = + FSTTestDoc("rooms/eros/messages/3", 0, @{@"text" : @"msg3"}, FSTDocumentStateSynced); // initial state FSTTestApplyChanges(view, @[ doc1, doc3 ], nil); @@ -237,10 +259,14 @@ - (void)testDoesntReportChangesForDocumentBeyondLimitOfQuery { query = [query queryBySettingLimit:2]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, @{@"num" : @1}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, @{@"num" : @2}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, @{@"num" : @3}, NO); - FSTDocument *doc4 = FSTTestDoc("rooms/eros/messages/4", 0, @{@"num" : @4}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/1", 0, + @{@"num" : @1}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/2", 0, + @{@"num" : @2}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/3", 0, + @{@"num" : @3}, FSTDocumentStateSynced); + FSTDocument *doc4 = FSTTestDoc("rooms/eros/messages/4", 0, + @{@"num" : @4}, FSTDocumentStateSynced); // initial state FSTTestApplyChanges(view, @[ doc1, doc2 ], nil); @@ -249,7 +275,7 @@ - (void)testDoesntReportChangesForDocumentBeyondLimitOfQuery { // doc2 will be modified + removed = removed // doc3 will be added // doc4 will be added + removed = nothing - doc2 = FSTTestDoc("rooms/eros/messages/2", 1, @{@"num" : @5}, NO); + doc2 = FSTTestDoc("rooms/eros/messages/2", 1, @{@"num" : @5}, FSTDocumentStateSynced); FSTViewDocumentChanges *viewDocChanges = [view computeChangesWithDocuments:FSTTestDocUpdates(@[ doc2, doc3, doc4 ])]; XCTAssertTrue(viewDocChanges.needsRefill); @@ -280,9 +306,9 @@ - (void)testKeepsTrackOfLimboDocuments { FSTQuery *query = [self queryForMessages]; FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/0", 0, @{}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/1", 0, @{}, NO); - FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/2", 0, @{}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/0", 0, @{}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/1", 0, @{}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("rooms/eros/messages/2", 0, @{}, FSTDocumentStateSynced); FSTViewChange *change = [view applyChangesToDocuments:[view computeChangesWithDocuments:FSTTestDocUpdates(@[ doc1 ])]]; @@ -312,8 +338,7 @@ - (void)testKeepsTrackOfLimboDocuments { @[ [FSTLimboDocumentChange changeWithType:FSTLimboDocumentChangeTypeAdded key:doc3.key] ]); change = [view applyChangesToDocuments:[view computeChangesWithDocuments:FSTTestDocUpdates(@[ - FSTTestDeletedDoc("rooms/eros/messages/2", - 1) + FSTTestDeletedDoc("rooms/eros/messages/2", 1, NO) ])]]; // remove XCTAssertEqualObjects( change.limboChanges, @@ -323,8 +348,8 @@ - (void)testKeepsTrackOfLimboDocuments { - (void)testResumingQueryCreatesNoLimbos { FSTQuery *query = [self queryForMessages]; - FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/0", 0, @{}, NO); - FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/1", 0, @{}, NO); + FSTDocument *doc1 = FSTTestDoc("rooms/eros/messages/0", 0, @{}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("rooms/eros/messages/1", 0, @{}, FSTDocumentStateSynced); // Unlike other cases, here the view is initialized with a set of previously synced documents // which happens when listening to a previously listened-to query. @@ -346,8 +371,8 @@ - (void)assertDocSet:(FSTDocumentSet *)docSet containsDocs:(NSArray *initialData = diff --git a/Firestore/Example/Tests/Local/FSTLRUGarbageCollectorTests.mm b/Firestore/Example/Tests/Local/FSTLRUGarbageCollectorTests.mm index 999238d7c5b..e84dd974c0f 100644 --- a/Firestore/Example/Tests/Local/FSTLRUGarbageCollectorTests.mm +++ b/Firestore/Example/Tests/Local/FSTLRUGarbageCollectorTests.mm @@ -220,11 +220,10 @@ - (DocumentKey)nextTestDocKey { - (FSTDocument *)nextTestDocumentWithValue:(FSTObjectValue *)value { DocumentKey key = [self nextTestDocKey]; FSTTestSnapshotVersion version = 2; - BOOL hasMutations = NO; return [FSTDocument documentWithData:value key:key version:testutil::Version(version) - hasLocalMutations:hasMutations]; + state:FSTDocumentStateSynced]; } - (FSTDocument *)nextTestDocument { @@ -612,7 +611,7 @@ - (void)testRemoveTargetsThenGC { FSTDocument *doc = [FSTDocument documentWithData:_testValue key:middleDocToUpdate version:testutil::Version(version) - hasLocalMutations:NO]; + state:FSTDocumentStateSynced]; [_documentCache addEntry:doc]; [self updateTargetInTransaction:middleTarget]; }); diff --git a/Firestore/Example/Tests/Local/FSTLevelDBMigrationsTests.mm b/Firestore/Example/Tests/Local/FSTLevelDBMigrationsTests.mm index 468b0895159..d1cd59ba6a3 100644 --- a/Firestore/Example/Tests/Local/FSTLevelDBMigrationsTests.mm +++ b/Firestore/Example/Tests/Local/FSTLevelDBMigrationsTests.mm @@ -20,6 +20,7 @@ #include #include +#import "Firestore/Protos/objc/firestore/local/Mutation.pbobjc.h" #import "Firestore/Protos/objc/firestore/local/Target.pbobjc.h" #import "Firestore/Source/Local/FSTLevelDB.h" #import "Firestore/Source/Local/FSTLevelDBMutationQueue.h" @@ -27,10 +28,7 @@ #include "Firestore/core/src/firebase/firestore/local/leveldb_key.h" #include "Firestore/core/src/firebase/firestore/local/leveldb_migrations.h" -#include "Firestore/core/src/firebase/firestore/model/document_key.h" -#include "Firestore/core/src/firebase/firestore/model/types.h" #include "Firestore/core/src/firebase/firestore/util/ordered_code.h" -#include "Firestore/core/src/firebase/firestore/util/status.h" #include "Firestore/core/test/firebase/firestore/testutil/testutil.h" #include "absl/strings/match.h" #include "leveldb/db.h" @@ -40,6 +38,7 @@ NS_ASSUME_NONNULL_BEGIN using firebase::firestore::FirestoreErrorCode; +using firebase::firestore::local::LevelDbDocumentMutationKey; using firebase::firestore::local::LevelDbDocumentTargetKey; using firebase::firestore::local::LevelDbMigrations; using firebase::firestore::local::LevelDbMutationKey; @@ -263,6 +262,110 @@ - (void)testAddsSentinelRows { } } +- (void)testRemovesMutationBatches { + std::string emptyBuffer; + DocumentKey testWriteFoo = DocumentKey::FromPathString("docs/foo"); + DocumentKey testWriteBar = DocumentKey::FromPathString("docs/bar"); + DocumentKey testWriteBaz = DocumentKey::FromPathString("docs/baz"); + DocumentKey testWritePending = DocumentKey::FromPathString("docs/pending"); + // Do everything up until the mutation batch migration. + LevelDbMigrations::RunMigrations(_db.get(), 3); + // Set up data + { + LevelDbTransaction transaction(_db.get(), "Setup Foo"); + // User 'foo' has two acknowledged mutations and one that is pending. + FSTPBMutationQueue *fooQueue = [[FSTPBMutationQueue alloc] init]; + fooQueue.lastAcknowledgedBatchId = 2; + std::string fooKey = LevelDbMutationQueueKey::Key("foo"); + transaction.Put(fooKey, fooQueue); + + FSTPBWriteBatch *fooBatch1 = [[FSTPBWriteBatch alloc] init]; + fooBatch1.batchId = 1; + std::string fooBatchKey1 = LevelDbMutationKey::Key("foo", 1); + transaction.Put(fooBatchKey1, fooBatch1); + transaction.Put(LevelDbDocumentMutationKey::Key("foo", testWriteFoo, 1), emptyBuffer); + + FSTPBWriteBatch *fooBatch2 = [[FSTPBWriteBatch alloc] init]; + fooBatch2.batchId = 2; + std::string fooBatchKey2 = LevelDbMutationKey::Key("foo", 2); + transaction.Put(fooBatchKey2, fooBatch2); + transaction.Put(LevelDbDocumentMutationKey::Key("foo", testWriteFoo, 2), emptyBuffer); + + FSTPBWriteBatch *fooBatch3 = [[FSTPBWriteBatch alloc] init]; + fooBatch3.batchId = 5; + std::string fooBatchKey3 = LevelDbMutationKey::Key("foo", 5); + transaction.Put(fooBatchKey3, fooBatch3); + transaction.Put(LevelDbDocumentMutationKey::Key("foo", testWritePending, 5), emptyBuffer); + + transaction.Commit(); + } + + { + LevelDbTransaction transaction(_db.get(), "Setup Bar"); + // User 'bar' has one acknowledged mutation and one that is pending + FSTPBMutationQueue *barQueue = [[FSTPBMutationQueue alloc] init]; + barQueue.lastAcknowledgedBatchId = 3; + std::string barKey = LevelDbMutationQueueKey::Key("bar"); + transaction.Put(barKey, barQueue); + + FSTPBWriteBatch *barBatch1 = [[FSTPBWriteBatch alloc] init]; + barBatch1.batchId = 3; + std::string barBatchKey1 = LevelDbMutationKey::Key("bar", 3); + transaction.Put(barBatchKey1, barBatch1); + transaction.Put(LevelDbDocumentMutationKey::Key("bar", testWriteBar, 3), emptyBuffer); + transaction.Put(LevelDbDocumentMutationKey::Key("bar", testWriteBaz, 3), emptyBuffer); + + FSTPBWriteBatch *barBatch2 = [[FSTPBWriteBatch alloc] init]; + barBatch2.batchId = 4; + std::string barBatchKey2 = LevelDbMutationKey::Key("bar", 4); + transaction.Put(barBatchKey2, barBatch2); + transaction.Put(LevelDbDocumentMutationKey::Key("bar", testWritePending, 4), emptyBuffer); + + transaction.Commit(); + } + + { + LevelDbTransaction transaction(_db.get(), "Setup Empty"); + // User 'empty' has no mutations + FSTPBMutationQueue *emptyQueue = [[FSTPBMutationQueue alloc] init]; + emptyQueue.lastAcknowledgedBatchId = -1; + std::string emptyKey = LevelDbMutationQueueKey::Key("empty"); + transaction.Put(emptyKey, emptyQueue); + transaction.Commit(); + } + + LevelDbMigrations::RunMigrations(_db.get(), 5); + + { + // Verify + std::string buffer; + LevelDbTransaction transaction(_db.get(), "Verify"); + auto it = transaction.NewIterator(); + // verify that we deleted the correct batches + XCTAssertTrue(transaction.Get(LevelDbMutationKey::Key("foo", 1), &buffer).IsNotFound()); + XCTAssertTrue(transaction.Get(LevelDbMutationKey::Key("foo", 2), &buffer).IsNotFound()); + XCTAssertTrue(transaction.Get(LevelDbMutationKey::Key("foo", 5), &buffer).ok()); + + XCTAssertTrue(transaction.Get(LevelDbMutationKey::Key("bar", 3), &buffer).IsNotFound()); + XCTAssertTrue(transaction.Get(LevelDbMutationKey::Key("bar", 4), &buffer).ok()); + + // verify document associations have been removed + XCTAssertTrue(transaction.Get(LevelDbDocumentMutationKey::Key("foo", testWriteFoo, 1), &buffer) + .IsNotFound()); + XCTAssertTrue(transaction.Get(LevelDbDocumentMutationKey::Key("foo", testWriteFoo, 2), &buffer) + .IsNotFound()); + XCTAssertTrue( + transaction.Get(LevelDbDocumentMutationKey::Key("foo", testWritePending, 5), &buffer).ok()); + + XCTAssertTrue(transaction.Get(LevelDbDocumentMutationKey::Key("bar", testWriteBar, 3), &buffer) + .IsNotFound()); + XCTAssertTrue(transaction.Get(LevelDbDocumentMutationKey::Key("bar", testWriteBaz, 3), &buffer) + .IsNotFound()); + XCTAssertTrue( + transaction.Get(LevelDbDocumentMutationKey::Key("bar", testWritePending, 4), &buffer).ok()); + } +} + /** * Creates the name of a dummy entry to make sure the iteration is correctly bounded. */ diff --git a/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm b/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm index 7c80f5fb2b9..284bd2d12af 100644 --- a/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm +++ b/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm @@ -130,7 +130,7 @@ - (void)testEncodesMutationBatch { } - (void)testEncodesDocumentAsMaybeDocument { - FSTDocument *doc = FSTTestDoc("some/path", 42, @{@"foo" : @"bar"}, NO); + FSTDocument *doc = FSTTestDoc("some/path", 42, @{@"foo" : @"bar"}, FSTDocumentStateSynced); FSTPBMaybeDocument *maybeDocProto = [FSTPBMaybeDocument message]; maybeDocProto.document = [GCFSDocument message]; @@ -146,8 +146,23 @@ - (void)testEncodesDocumentAsMaybeDocument { XCTAssertEqualObjects(decoded, doc); } +- (void)testEncodesUnknownDocumentAsMaybeDocument { + FSTUnknownDocument *doc = FSTTestUnknownDoc("some/path", 42); + + FSTPBMaybeDocument *maybeDocProto = [FSTPBMaybeDocument message]; + maybeDocProto.unknownDocument = [FSTPBUnknownDocument message]; + maybeDocProto.unknownDocument.name = @"projects/p/databases/d/documents/some/path"; + maybeDocProto.unknownDocument.version.seconds = 0; + maybeDocProto.unknownDocument.version.nanos = 42000; + maybeDocProto.hasCommittedMutations = true; + + XCTAssertEqualObjects([self.serializer encodedMaybeDocument:doc], maybeDocProto); + FSTMaybeDocument *decoded = [self.serializer decodedMaybeDocument:maybeDocProto]; + XCTAssertEqualObjects(decoded, doc); +} + - (void)testEncodesDeletedDocumentAsMaybeDocument { - FSTDeletedDocument *deletedDoc = FSTTestDeletedDoc("some/path", 42); + FSTDeletedDocument *deletedDoc = FSTTestDeletedDoc("some/path", 42, false); FSTPBMaybeDocument *maybeDocProto = [FSTPBMaybeDocument message]; maybeDocProto.noDocument = [FSTPBNoDocument message]; diff --git a/Firestore/Example/Tests/Local/FSTLocalStoreTests.mm b/Firestore/Example/Tests/Local/FSTLocalStoreTests.mm index 2ed0f621369..e5399fb8e31 100644 --- a/Firestore/Example/Tests/Local/FSTLocalStoreTests.mm +++ b/Firestore/Example/Tests/Local/FSTLocalStoreTests.mm @@ -221,16 +221,19 @@ - (void)testHandlesSetMutation { if ([self isTestBaseClass]) return; [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"bar"})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); [self acknowledgeMutationWithVersion:0]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, NO) ]); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations) ]); if ([self gcIsEager]) { // Nothing is pinning this anymore, as it has been acknowledged and there are no targets active. FSTAssertNotContains(@"foo/bar"); } else { - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, NO)); + FSTAssertContains( + FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations)); } } @@ -238,17 +241,19 @@ - (void)testHandlesSetMutationThenDocument { if ([self isTestBaseClass]) return; [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"bar"})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self - applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, YES)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, + FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); } - (void)testHandlesAckThenRejectThenRemoteEvent { @@ -259,27 +264,38 @@ - (void)testHandlesAckThenRejectThenRemoteEvent { TargetId targetID = [self allocateQuery:query]; [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"bar"})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); // The last seen version is zero, so this ack must be held. [self acknowledgeMutationWithVersion:1]; - FSTAssertChanged(@[]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations) ]); + + // Under eager GC, there is no longer a reference for the document, and it should be + // deleted. + if ([self gcIsEager]) { + FSTAssertNotContains(@"foo/bar"); + } else { + FSTAssertContains( + FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations)); + } [self writeMutation:FSTTestSetMutation(@"bar/baz", @{@"bar" : @"baz"})]; - FSTAssertChanged(@[ FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, YES) ]); - FSTAssertContains(FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, FSTDocumentStateLocalMutations)); [self rejectMutation]; FSTAssertRemoved(@[ @"bar/baz" ]); FSTAssertNotContains(@"bar/baz"); - [self - applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, NO), - @[ @(targetID) ])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, NO)); + [self applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, + FSTDocumentStateSynced), + @[ @(targetID) ])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, FSTDocumentStateSynced) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"it" : @"changed"}, FSTDocumentStateSynced)); FSTAssertNotContains(@"bar/baz"); } @@ -289,27 +305,29 @@ - (void)testHandlesDeletedDocumentThenSetMutationThenAck { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDeletedDoc("foo/bar", 2), @[ @(targetID) ], - @[])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDeletedDoc("foo/bar", 2, NO), + @[ @(targetID) ], @[])]; FSTAssertRemoved(@[ @"foo/bar" ]); // Under eager GC, there is no longer a reference for the document, and it should be // deleted. if (![self gcIsEager]) { - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 2)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 2, NO)); } else { FSTAssertNotContains(@"foo/bar"); } [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"bar"})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); // Can now remove the target, since we have a mutation pinning the document [self.localStore releaseQuery:query]; // Verify we didn't lose anything - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); [self acknowledgeMutationWithVersion:3]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, NO) ]); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 3, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations) ]); // It has been acknowledged, and should no longer be retained as there is no target and mutation if ([self gcIsEager]) { FSTAssertNotContains(@"foo/bar"); @@ -323,12 +341,14 @@ - (void)testHandlesSetMutationThenDeletedDocument { TargetId targetID = [self allocateQuery:query]; [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"bar"})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDeletedDoc("foo/bar", 2), @[ @(targetID) ], - @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDeletedDoc("foo/bar", 2, NO), + @[ @(targetID) ], @[])]; + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); } - (void)testHandlesDocumentThenSetMutationThenAckThenDocument { @@ -338,25 +358,29 @@ - (void)testHandlesDocumentThenSetMutationThenAckThenDocument { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/bar", 2, @{@"it" : @"base"}, NO), - @[ @(targetID) ])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 2, @{@"it" : @"base"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"it" : @"base"}, NO)); + [self applyRemoteEvent:FSTTestAddedRemoteEvent( + FSTTestDoc("foo/bar", 2, @{@"it" : @"base"}, FSTDocumentStateSynced), + @[ @(targetID) ])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 2, @{@"it" : @"base"}, FSTDocumentStateSynced) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"it" : @"base"}, FSTDocumentStateSynced)); [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"bar"})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); [self acknowledgeMutationWithVersion:3]; // we haven't seen the remote event yet, so the write is still held. - FSTAssertChanged(@[]); - FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 3, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations) ]); + FSTAssertContains( + FSTTestDoc("foo/bar", 3, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations)); - [self - applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, NO)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, + FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, FSTDocumentStateSynced) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, FSTDocumentStateSynced)); } - (void)testHandlesPatchWithoutPriorDocument { @@ -367,8 +391,12 @@ - (void)testHandlesPatchWithoutPriorDocument { FSTAssertNotContains(@"foo/bar"); [self acknowledgeMutationWithVersion:1]; - FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertNotContains(@"foo/bar"); + FSTAssertChanged(@[ FSTTestUnknownDoc("foo/bar", 1) ]); + if ([self gcIsEager]) { + FSTAssertNotContains(@"foo/bar"); + } else { + FSTAssertContains(FSTTestUnknownDoc("foo/bar", 1)); + } } - (void)testHandlesPatchMutationThenDocumentThenAck { @@ -381,23 +409,31 @@ - (void)testHandlesPatchMutationThenDocumentThenAck { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO), - @[ @(targetID) ])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar", @"it" : @"base"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar", @"it" : @"base"}, YES)); + [self applyRemoteEvent:FSTTestAddedRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced), + @[ @(targetID) ])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar", @"it" : @"base"}, + FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar", @"it" : @"base"}, + FSTDocumentStateLocalMutations)); [self acknowledgeMutationWithVersion:2]; // We still haven't seen the remote events for the patch, so the local changes remain, and there // are no changes - FSTAssertChanged(@[]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar", @"it" : @"base"}, YES)); + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar", @"it" : @"base"}, + FSTDocumentStateCommittedMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar", @"it" : @"base"}, + FSTDocumentStateCommittedMutations)); [self applyRemoteEvent:FSTTestUpdateRemoteEvent( - FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar", @"it" : @"base"}, NO), @[], - @[])]; + FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar", @"it" : @"base"}, + FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar", @"it" : @"base"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar", @"it" : @"base"}, NO)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar", @"it" : @"base"}, FSTDocumentStateSynced) ]); + FSTAssertContains( + FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar", @"it" : @"base"}, FSTDocumentStateSynced)); } - (void)testHandlesPatchMutationThenAckThenDocument { @@ -408,16 +444,23 @@ - (void)testHandlesPatchMutationThenAckThenDocument { FSTAssertNotContains(@"foo/bar"); [self acknowledgeMutationWithVersion:1]; - FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertNotContains(@"foo/bar"); + FSTAssertChanged(@[ FSTTestUnknownDoc("foo/bar", 1) ]); + + // There's no target pinning the doc, and we've ack'd the mutation. + if ([self gcIsEager]) { + FSTAssertNotContains(@"foo/bar"); + } else { + FSTAssertContains(FSTTestUnknownDoc("foo/bar", 1)); + } FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced)); } - (void)testHandlesDeleteMutationThenAck { @@ -425,7 +468,7 @@ - (void)testHandlesDeleteMutationThenAck { [self writeMutation:FSTTestDeleteMutation(@"foo/bar")]; FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0, NO)); [self acknowledgeMutationWithVersion:1]; FSTAssertRemoved(@[ @"foo/bar" ]); @@ -441,14 +484,15 @@ - (void)testHandlesDocumentThenDeleteMutationThenAck { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced)); [self writeMutation:FSTTestDeleteMutation(@"foo/bar")]; FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0, NO)); // Remove the target so only the mutation is pinning the document [self.localStore releaseQuery:query]; @@ -469,13 +513,14 @@ - (void)testHandlesDeleteMutationThenDocumentThenAck { [self writeMutation:FSTTestDeleteMutation(@"foo/bar")]; FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0, NO)); // Add the document to a target so it will remain in persistence even when ack'd - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO), - @[ @(targetID) ], @[])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0, NO)); // Don't need to keep it pinned anymore [self.localStore releaseQuery:query]; @@ -495,54 +540,64 @@ - (void)testHandlesDocumentThenDeletedDocumentThenDocument { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced)); - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDeletedDoc("foo/bar", 2), @[ @(targetID) ], - @[])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDeletedDoc("foo/bar", 2, NO), + @[ @(targetID) ], @[])]; FSTAssertRemoved(@[ @"foo/bar" ]); if (![self gcIsEager]) { - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 2)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 2, NO)); } - [self - applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, NO) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, NO)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, + FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertChanged(@[ FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, FSTDocumentStateSynced) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 3, @{@"it" : @"changed"}, FSTDocumentStateSynced)); } - (void)testHandlesSetMutationThenPatchMutationThenDocumentThenAckThenAck { if ([self isTestBaseClass]) return; [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"old"})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, FSTDocumentStateLocalMutations)); [self writeMutation:FSTTestPatchMutation("foo/bar", @{@"foo" : @"bar"}, {})]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, YES)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"it" : @"base"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); [self.localStore releaseQuery:query]; [self acknowledgeMutationWithVersion:2]; // delete mutation - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); [self acknowledgeMutationWithVersion:3]; // patch mutation - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, NO) ]); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 3, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations) ]); if ([self gcIsEager]) { // we've ack'd all of the mutations, nothing is keeping this pinned anymore FSTAssertNotContains(@"foo/bar"); + } else { + FSTAssertContains( + FSTTestDoc("foo/bar", 3, @{@"foo" : @"bar"}, FSTDocumentStateCommittedMutations)); } } @@ -554,8 +609,9 @@ - (void)testHandlesSetMutationAndPatchMutationTogether { FSTTestPatchMutation("foo/bar", @{@"foo" : @"bar"}, {}) ]]; - FSTAssertChanged(@[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); + FSTAssertChanged( + @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ]); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); } - (void)testHandlesSetMutationThenPatchMutationThenReject { @@ -563,7 +619,7 @@ - (void)testHandlesSetMutationThenPatchMutationThenReject { if (![self gcIsEager]) return; [self writeMutation:FSTTestSetMutation(@"foo/bar", @{@"foo" : @"old"})]; - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, YES)); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, FSTDocumentStateLocalMutations)); [self acknowledgeMutationWithVersion:1]; FSTAssertNotContains(@"foo/bar"); @@ -585,11 +641,11 @@ - (void)testHandlesSetMutationsAndPatchMutationOfJustOneTogether { ]]; FSTAssertChanged((@[ - FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, YES), - FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) + FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, FSTDocumentStateLocalMutations), + FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations) ])); - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); - FSTAssertContains(FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, YES)); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); + FSTAssertContains(FSTTestDoc("bar/baz", 0, @{@"bar" : @"baz"}, FSTDocumentStateLocalMutations)); } - (void)testHandlesDeleteMutationThenPatchMutationThenAckThenAck { @@ -597,21 +653,23 @@ - (void)testHandlesDeleteMutationThenPatchMutationThenAckThenAck { [self writeMutation:FSTTestDeleteMutation(@"foo/bar")]; FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0, NO)); [self writeMutation:FSTTestPatchMutation("foo/bar", @{@"foo" : @"bar"}, {})]; FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0, NO)); [self acknowledgeMutationWithVersion:2]; // delete mutation FSTAssertRemoved(@[ @"foo/bar" ]); - FSTAssertContains(FSTTestDeletedDoc("foo/bar", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/bar", 2, YES)); [self acknowledgeMutationWithVersion:3]; // patch mutation - FSTAssertRemoved(@[ @"foo/bar" ]); + FSTAssertChanged(@[ FSTTestUnknownDoc("foo/bar", 3) ]); if ([self gcIsEager]) { // There are no more pending mutations, the doc has been dropped FSTAssertNotContains(@"foo/bar"); + } else { + FSTAssertContains(FSTTestUnknownDoc("foo/bar", 3)); } } @@ -619,12 +677,13 @@ - (void)testCollectsGarbageAfterChangeBatchWithNoTargetIDs { if ([self isTestBaseClass]) return; if (![self gcIsEager]) return; - [self applyRemoteEvent:FSTTestUpdateRemoteEventWithLimboTargets(FSTTestDeletedDoc("foo/bar", 2), - @[], @[], @[ @1 ])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEventWithLimboTargets( + FSTTestDeletedDoc("foo/bar", 2, NO), @[], @[], @[ @1 ])]; FSTAssertNotContains(@"foo/bar"); [self applyRemoteEvent:FSTTestUpdateRemoteEventWithLimboTargets( - FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, NO), @[], @[], @[ @1 ])]; + FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateSynced), + @[], @[], @[ @1 ])]; FSTAssertNotContains(@"foo/bar"); } @@ -635,12 +694,14 @@ - (void)testCollectsGarbageAfterChangeBatch { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, NO), - @[ @(targetID) ])]; - FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, NO)); + [self applyRemoteEvent:FSTTestAddedRemoteEvent( + FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateSynced), + @[ @(targetID) ])]; + FSTAssertContains(FSTTestDoc("foo/bar", 2, @{@"foo" : @"bar"}, FSTDocumentStateSynced)); - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 2, @{@"foo" : @"baz"}, NO), - @[], @[ @(targetID) ])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 2, @{@"foo" : @"baz"}, FSTDocumentStateSynced), + @[], @[ @(targetID) ])]; FSTAssertNotContains(@"foo/bar"); } @@ -652,27 +713,28 @@ - (void)testCollectsGarbageAfterAcknowledgedMutation { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, NO), - @[ @(targetID) ], @[])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; [self writeMutation:FSTTestPatchMutation("foo/bar", @{@"foo" : @"bar"}, {})]; // Release the query so that our target count goes back to 0 and we are considered up-to-date. [self.localStore releaseQuery:query]; [self writeMutation:FSTTestSetMutation(@"foo/bah", @{@"foo" : @"bah"})]; [self writeMutation:FSTTestDeleteMutation(@"foo/baz")]; - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); - FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, YES)); - FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0)); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); + FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, FSTDocumentStateLocalMutations)); + FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0, NO)); [self acknowledgeMutationWithVersion:3]; FSTAssertNotContains(@"foo/bar"); - FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, YES)); - FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0)); + FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, FSTDocumentStateLocalMutations)); + FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0, NO)); [self acknowledgeMutationWithVersion:4]; FSTAssertNotContains(@"foo/bar"); FSTAssertNotContains(@"foo/bah"); - FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0, NO)); [self acknowledgeMutationWithVersion:5]; FSTAssertNotContains(@"foo/bar"); @@ -687,27 +749,28 @@ - (void)testCollectsGarbageAfterRejectedMutation { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, NO), - @[ @(targetID) ], @[])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 0, @{@"foo" : @"old"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; [self writeMutation:FSTTestPatchMutation("foo/bar", @{@"foo" : @"bar"}, {})]; // Release the query so that our target count goes back to 0 and we are considered up-to-date. [self.localStore releaseQuery:query]; [self writeMutation:FSTTestSetMutation(@"foo/bah", @{@"foo" : @"bah"})]; [self writeMutation:FSTTestDeleteMutation(@"foo/baz")]; - FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES)); - FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, YES)); - FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0)); + FSTAssertContains(FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations)); + FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, FSTDocumentStateLocalMutations)); + FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0, NO)); [self rejectMutation]; // patch mutation FSTAssertNotContains(@"foo/bar"); - FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, YES)); - FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0)); + FSTAssertContains(FSTTestDoc("foo/bah", 0, @{@"foo" : @"bah"}, FSTDocumentStateLocalMutations)); + FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0, NO)); [self rejectMutation]; // set mutation FSTAssertNotContains(@"foo/bar"); FSTAssertNotContains(@"foo/bah"); - FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0)); + FSTAssertContains(FSTTestDeletedDoc("foo/baz", 0, NO)); [self rejectMutation]; // delete mutation FSTAssertNotContains(@"foo/bar"); @@ -722,23 +785,26 @@ - (void)testPinsDocumentsInTheLocalView { FSTQuery *query = FSTTestQuery("foo"); TargetId targetID = [self allocateQuery:query]; - [self applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, NO), - @[ @(targetID) ])]; + [self applyRemoteEvent:FSTTestAddedRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateSynced), + @[ @(targetID) ])]; [self writeMutation:FSTTestSetMutation(@"foo/baz", @{@"foo" : @"baz"})]; - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, NO)); - FSTAssertContains(FSTTestDoc("foo/baz", 0, @{@"foo" : @"baz"}, YES)); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateSynced)); + FSTAssertContains(FSTTestDoc("foo/baz", 0, @{@"foo" : @"baz"}, FSTDocumentStateLocalMutations)); [self notifyLocalViewChanges:FSTTestViewChanges(targetID, @[ @"foo/bar", @"foo/baz" ], @[])]; - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, NO)); - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, NO), - @[], @[ @(targetID) ])]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, NO), - @[ @(targetID) ], @[])]; - FSTAssertContains(FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, YES)); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateSynced)); + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateSynced), + @[], @[ @(targetID) ])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, FSTDocumentStateSynced), + @[ @(targetID) ], @[])]; + FSTAssertContains(FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, FSTDocumentStateLocalMutations)); [self acknowledgeMutationWithVersion:2]; - FSTAssertContains(FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, NO)); - FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, NO)); - FSTAssertContains(FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, NO)); + FSTAssertContains(FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, FSTDocumentStateSynced)); + FSTAssertContains(FSTTestDoc("foo/bar", 1, @{@"foo" : @"bar"}, FSTDocumentStateSynced)); + FSTAssertContains(FSTTestDoc("foo/baz", 2, @{@"foo" : @"baz"}, FSTDocumentStateSynced)); [self notifyLocalViewChanges:FSTTestViewChanges(targetID, @[], @[ @"foo/bar", @"foo/baz" ])]; [self.localStore releaseQuery:query]; @@ -752,8 +818,9 @@ - (void)testThrowsAwayDocumentsWithUnknownTargetIDsImmediately { if (![self gcIsEager]) return; TargetId targetID = 321; - [self applyRemoteEvent:FSTTestUpdateRemoteEventWithLimboTargets(FSTTestDoc("foo/bar", 1, @{}, NO), - @[], @[], @[ @(targetID) ])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEventWithLimboTargets( + FSTTestDoc("foo/bar", 1, @{}, FSTDocumentStateSynced), @[], @[], + @[ @(targetID) ])]; FSTAssertNotContains(@"foo/bar"); } @@ -768,7 +835,8 @@ - (void)testCanExecuteDocumentQueries { ]]; FSTQuery *query = FSTTestQuery("foo/bar"); FSTDocumentDictionary *docs = [self.localStore executeQuery:query]; - XCTAssertEqualObjects([docs values], @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES) ]); + XCTAssertEqualObjects([docs values], @[ FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, + FSTDocumentStateLocalMutations) ]); } - (void)testCanExecuteCollectionQueries { @@ -783,10 +851,11 @@ - (void)testCanExecuteCollectionQueries { ]]; FSTQuery *query = FSTTestQuery("foo"); FSTDocumentDictionary *docs = [self.localStore executeQuery:query]; - XCTAssertEqualObjects([docs values], (@[ - FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, YES), - FSTTestDoc("foo/baz", 0, @{@"foo" : @"baz"}, YES) - ])); + XCTAssertEqualObjects( + [docs values], (@[ + FSTTestDoc("foo/bar", 0, @{@"foo" : @"bar"}, FSTDocumentStateLocalMutations), + FSTTestDoc("foo/baz", 0, @{@"foo" : @"baz"}, FSTDocumentStateLocalMutations) + ])); } - (void)testCanExecuteMixedCollectionQueries { @@ -796,18 +865,20 @@ - (void)testCanExecuteMixedCollectionQueries { [self allocateQuery:query]; FSTAssertTargetID(2); - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/baz", 10, @{@"a" : @"b"}, NO), - @[ @2 ], @[])]; - [self applyRemoteEvent:FSTTestUpdateRemoteEvent(FSTTestDoc("foo/bar", 20, @{@"a" : @"b"}, NO), - @[ @2 ], @[])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/baz", 10, @{@"a" : @"b"}, FSTDocumentStateSynced), + @[ @2 ], @[])]; + [self applyRemoteEvent:FSTTestUpdateRemoteEvent( + FSTTestDoc("foo/bar", 20, @{@"a" : @"b"}, FSTDocumentStateSynced), + @[ @2 ], @[])]; [self.localStore locallyWriteMutations:@[ FSTTestSetMutation(@"foo/bonk", @{@"a" : @"b"}) ]]; FSTDocumentDictionary *docs = [self.localStore executeQuery:query]; XCTAssertEqualObjects([docs values], (@[ - FSTTestDoc("foo/bar", 20, @{@"a" : @"b"}, NO), - FSTTestDoc("foo/baz", 10, @{@"a" : @"b"}, NO), - FSTTestDoc("foo/bonk", 0, @{@"a" : @"b"}, YES) + FSTTestDoc("foo/bar", 20, @{@"a" : @"b"}, FSTDocumentStateSynced), + FSTTestDoc("foo/baz", 10, @{@"a" : @"b"}, FSTDocumentStateSynced), + FSTTestDoc("foo/bonk", 0, @{@"a" : @"b"}, FSTDocumentStateLocalMutations) ])); } @@ -856,10 +927,12 @@ - (void)testRemoteDocumentKeysForTarget { [self allocateQuery:query]; FSTAssertTargetID(2); - [self applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/baz", 10, @{@"a" : @"b"}, NO), - @[ @2 ])]; - [self applyRemoteEvent:FSTTestAddedRemoteEvent(FSTTestDoc("foo/bar", 20, @{@"a" : @"b"}, NO), - @[ @2 ])]; + [self applyRemoteEvent:FSTTestAddedRemoteEvent( + FSTTestDoc("foo/baz", 10, @{@"a" : @"b"}, FSTDocumentStateSynced), + @[ @2 ])]; + [self applyRemoteEvent:FSTTestAddedRemoteEvent( + FSTTestDoc("foo/bar", 20, @{@"a" : @"b"}, FSTDocumentStateSynced), + @[ @2 ])]; [self.localStore locallyWriteMutations:@[ FSTTestSetMutation(@"foo/bonk", @{@"a" : @"b"}) ]]; diff --git a/Firestore/Example/Tests/Local/FSTMutationQueueTests.mm b/Firestore/Example/Tests/Local/FSTMutationQueueTests.mm index f7ec3b43843..e898d987096 100644 --- a/Firestore/Example/Tests/Local/FSTMutationQueueTests.mm +++ b/Firestore/Example/Tests/Local/FSTMutationQueueTests.mm @@ -71,10 +71,10 @@ - (void)testCountBatches { FSTMutationBatch *batch2 = [self addMutationBatch]; XCTAssertEqual(2, [self batchCount]); - [self.mutationQueue removeMutationBatches:@[ batch2 ]]; + [self.mutationQueue removeMutationBatch:batch2]; XCTAssertEqual(1, [self batchCount]); - [self.mutationQueue removeMutationBatches:@[ batch1 ]]; + [self.mutationQueue removeMutationBatch:batch1]; XCTAssertEqual(0, [self batchCount]); XCTAssertTrue([self.mutationQueue isEmpty]); }); @@ -101,14 +101,14 @@ - (void)testAcknowledgeBatchID { [self.mutationQueue acknowledgeBatch:batch2 streamToken:nil]; XCTAssertEqual([self.mutationQueue highestAcknowledgedBatchID], batch2.batchID); - [self.mutationQueue removeMutationBatches:@[ batch1 ]]; + [self.mutationQueue removeMutationBatch:batch1]; XCTAssertEqual([self.mutationQueue highestAcknowledgedBatchID], batch2.batchID); - [self.mutationQueue removeMutationBatches:@[ batch2 ]]; + [self.mutationQueue removeMutationBatch:batch2]; XCTAssertEqual([self.mutationQueue highestAcknowledgedBatchID], batch2.batchID); // Batch 3 never acknowledged. - [self.mutationQueue removeMutationBatches:@[ batch3 ]]; + [self.mutationQueue removeMutationBatch:batch3]; XCTAssertEqual([self.mutationQueue highestAcknowledgedBatchID], batch2.batchID); }); } @@ -120,7 +120,7 @@ - (void)testAcknowledgeThenRemove { FSTMutationBatch *batch1 = [self addMutationBatch]; [self.mutationQueue acknowledgeBatch:batch1 streamToken:nil]; - [self.mutationQueue removeMutationBatches:@[ batch1 ]]; + [self.mutationQueue removeMutationBatch:batch1]; XCTAssertEqual([self batchCount], 0); XCTAssertEqual([self.mutationQueue highestAcknowledgedBatchID], batch1.batchID); @@ -142,7 +142,8 @@ - (void)testHighestAcknowledgedBatchIDNeverExceedsNextBatchID { [self.mutationQueue acknowledgeBatch:batch2 streamToken:nil]; XCTAssertEqual([self.mutationQueue highestAcknowledgedBatchID], batch2.batchID); - [self.mutationQueue removeMutationBatches:@[ batch1, batch2 ]]; + [self.mutationQueue removeMutationBatch:batch1]; + [self.mutationQueue removeMutationBatch:batch2]; XCTAssertEqual([self.mutationQueue highestAcknowledgedBatchID], batch2.batchID); }); @@ -439,7 +440,7 @@ - (void)testRemoveMutationBatches { self.persistence.run("testRemoveMutationBatches", [&]() { NSMutableArray *batches = [self createBatches:10]; - [self.mutationQueue removeMutationBatches:@[ batches[0] ]]; + [self.mutationQueue removeMutationBatch:batches[0]]; [batches removeObjectAtIndex:0]; FSTMutationBatch *last = batches[batches.count - 1]; @@ -451,7 +452,9 @@ - (void)testRemoveMutationBatches { XCTAssertEqualObjects(found, batches); XCTAssertEqual(found.count, 9); - [self.mutationQueue removeMutationBatches:@[ batches[0], batches[1], batches[2] ]]; + [self.mutationQueue removeMutationBatch:batches[0]]; + [self.mutationQueue removeMutationBatch:batches[1]]; + [self.mutationQueue removeMutationBatch:batches[2]]; [batches removeObjectsInRange:NSMakeRange(0, 3)]; XCTAssertEqual([self batchCount], 6); @@ -459,7 +462,7 @@ - (void)testRemoveMutationBatches { XCTAssertEqualObjects(found, batches); XCTAssertEqual(found.count, 6); - [self.mutationQueue removeMutationBatches:@[ batches[batches.count - 1] ]]; + [self.mutationQueue removeMutationBatch:batches[batches.count - 1]]; [batches removeObjectAtIndex:batches.count - 1]; XCTAssertEqual([self batchCount], 5); @@ -467,11 +470,11 @@ - (void)testRemoveMutationBatches { XCTAssertEqualObjects(found, batches); XCTAssertEqual(found.count, 5); - [self.mutationQueue removeMutationBatches:@[ batches[3] ]]; + [self.mutationQueue removeMutationBatch:batches[3]]; [batches removeObjectAtIndex:3]; XCTAssertEqual([self batchCount], 4); - [self.mutationQueue removeMutationBatches:@[ batches[1] ]]; + [self.mutationQueue removeMutationBatch:batches[1]]; [batches removeObjectAtIndex:1]; XCTAssertEqual([self batchCount], 3); @@ -480,7 +483,9 @@ - (void)testRemoveMutationBatches { XCTAssertEqual(found.count, 3); XCTAssertFalse([self.mutationQueue isEmpty]); - [self.mutationQueue removeMutationBatches:batches]; + for (FSTMutationBatch *batch in batches) { + [self.mutationQueue removeMutationBatch:batch]; + } found = [self.mutationQueue allMutationBatchesThroughBatchID:last.batchID]; XCTAssertEqualObjects(found, @[]); XCTAssertEqual(found.count, 0); @@ -562,7 +567,7 @@ - (NSUInteger)batchCount { for (NSUInteger i = 0; i < holes.count; i++) { NSUInteger index = holes[i].unsignedIntegerValue - i; FSTMutationBatch *batch = batches[index]; - [self.mutationQueue removeMutationBatches:@[ batch ]]; + [self.mutationQueue removeMutationBatch:batch]; [batches removeObjectAtIndex:index]; [removed addObject:batch]; diff --git a/Firestore/Example/Tests/Local/FSTRemoteDocumentCacheTests.mm b/Firestore/Example/Tests/Local/FSTRemoteDocumentCacheTests.mm index 6e2369fdcb0..4714aa4c8dd 100644 --- a/Firestore/Example/Tests/Local/FSTRemoteDocumentCacheTests.mm +++ b/Firestore/Example/Tests/Local/FSTRemoteDocumentCacheTests.mm @@ -85,7 +85,7 @@ - (void)testSetAndReadDeletedDocument { if (!self.remoteDocumentCache) return; self.persistence.run("testSetAndReadDeletedDocument", [&]() { - FSTDeletedDocument *deletedDoc = FSTTestDeletedDoc(kDocPath, kVersion); + FSTDeletedDocument *deletedDoc = FSTTestDeletedDoc(kDocPath, kVersion, NO); [self.remoteDocumentCache addEntry:deletedDoc]; XCTAssertEqualObjects([self.remoteDocumentCache entryForKey:testutil::Key(kDocPath)], @@ -98,7 +98,7 @@ - (void)testSetDocumentToNewValue { self.persistence.run("testSetDocumentToNewValue", [&]() { [self setTestDocumentAtPath:kDocPath]; - FSTDocument *newDoc = FSTTestDoc(kDocPath, kVersion, @{@"data" : @2}, NO); + FSTDocument *newDoc = FSTTestDoc(kDocPath, kVersion, @{@"data" : @2}, FSTDocumentStateSynced); [self.remoteDocumentCache addEntry:newDoc]; XCTAssertEqualObjects([self.remoteDocumentCache entryForKey:testutil::Key(kDocPath)], newDoc); }); @@ -138,8 +138,10 @@ - (void)testDocumentsMatchingQuery { FSTQuery *query = FSTTestQuery("b"); FSTDocumentDictionary *results = [self.remoteDocumentCache documentsMatchingQuery:query]; - NSArray *expected = - @[ FSTTestDoc("b/1", kVersion, _kDocData, NO), FSTTestDoc("b/2", kVersion, _kDocData, NO) ]; + NSArray *expected = @[ + FSTTestDoc("b/1", kVersion, _kDocData, FSTDocumentStateSynced), + FSTTestDoc("b/2", kVersion, _kDocData, FSTDocumentStateSynced) + ]; XCTAssertEqual([results count], [expected count]); for (FSTDocument *doc in expected) { XCTAssertEqualObjects([results objectForKey:doc.key], doc); @@ -151,7 +153,7 @@ - (void)testDocumentsMatchingQuery { // TODO(gsoltis): reevaluate if any of these helpers are still needed - (FSTDocument *)setTestDocumentAtPath:(const absl::string_view)path { - FSTDocument *doc = FSTTestDoc(path, kVersion, _kDocData, NO); + FSTDocument *doc = FSTTestDoc(path, kVersion, _kDocData, FSTDocumentStateSynced); [self.remoteDocumentCache addEntry:doc]; return doc; } diff --git a/Firestore/Example/Tests/Model/FSTDocumentSetTests.mm b/Firestore/Example/Tests/Model/FSTDocumentSetTests.mm index 566ef2e6be7..05be1b7eeab 100644 --- a/Firestore/Example/Tests/Model/FSTDocumentSetTests.mm +++ b/Firestore/Example/Tests/Model/FSTDocumentSetTests.mm @@ -38,9 +38,9 @@ - (void)setUp { [super setUp]; _comp = FSTTestDocComparator("sort"); - _doc1 = FSTTestDoc("docs/1", 0, @{@"sort" : @2}, NO); - _doc2 = FSTTestDoc("docs/2", 0, @{@"sort" : @3}, NO); - _doc3 = FSTTestDoc("docs/3", 0, @{@"sort" : @1}, NO); + _doc1 = FSTTestDoc("docs/1", 0, @{@"sort" : @2}, FSTDocumentStateSynced); + _doc2 = FSTTestDoc("docs/2", 0, @{@"sort" : @3}, FSTDocumentStateSynced); + _doc3 = FSTTestDoc("docs/3", 0, @{@"sort" : @1}, FSTDocumentStateSynced); } - (void)testCount { @@ -97,7 +97,7 @@ - (void)testDeletes { - (void)testUpdates { FSTDocumentSet *set = FSTTestDocSet(_comp, @[ _doc1, _doc2, _doc3 ]); - FSTDocument *doc2Prime = FSTTestDoc("docs/2", 0, @{@"sort" : @9}, NO); + FSTDocument *doc2Prime = FSTTestDoc("docs/2", 0, @{@"sort" : @9}, FSTDocumentStateSynced); set = [set documentSetByAddingDocument:doc2Prime]; XCTAssertEqual([set count], 3); @@ -106,7 +106,7 @@ - (void)testUpdates { } - (void)testAddsDocsWithEqualComparisonValues { - FSTDocument *doc4 = FSTTestDoc("docs/4", 0, @{@"sort" : @2}, NO); + FSTDocument *doc4 = FSTTestDoc("docs/4", 0, @{@"sort" : @2}, FSTDocumentStateSynced); FSTDocumentSet *set = FSTTestDocSet(_comp, @[ _doc1, doc4 ]); XCTAssertEqualObjects([[set documentEnumerator] allObjects], (@[ _doc1, doc4 ])); diff --git a/Firestore/Example/Tests/Model/FSTDocumentTests.mm b/Firestore/Example/Tests/Model/FSTDocumentTests.mm index db00fd3cfbc..7867396c3a1 100644 --- a/Firestore/Example/Tests/Model/FSTDocumentTests.mm +++ b/Firestore/Example/Tests/Model/FSTDocumentTests.mm @@ -41,7 +41,7 @@ - (void)testConstructor { SnapshotVersion version = testutil::Version(1); FSTObjectValue *data = FSTTestObjectValue(@{@"a" : @1}); FSTDocument *doc = - [FSTDocument documentWithData:data key:key version:version hasLocalMutations:NO]; + [FSTDocument documentWithData:data key:key version:version state:FSTDocumentStateSynced]; XCTAssertEqualObjects(doc.key, FSTTestDocKey(@"messages/first")); XCTAssertEqual(doc.version, version); @@ -57,7 +57,7 @@ - (void)testExtractsFields { @"owner" : @{@"name" : @"Jonny", @"title" : @"scallywag"} }); FSTDocument *doc = - [FSTDocument documentWithData:data key:key version:version hasLocalMutations:NO]; + [FSTDocument documentWithData:data key:key version:version state:FSTDocumentStateSynced]; XCTAssertEqualObjects([doc fieldForPath:testutil::Field("desc")], [FSTStringValue stringValue:@"Discuss all the project related stuff"]); @@ -67,30 +67,30 @@ - (void)testExtractsFields { - (void)testIsEqual { XCTAssertEqualObjects(FSTTestDoc("messages/first", 1, - @{@"a" : @1}, NO), + @{@"a" : @1}, FSTDocumentStateSynced), FSTTestDoc("messages/first", 1, - @{@"a" : @1}, NO)); + @{@"a" : @1}, FSTDocumentStateSynced)); XCTAssertNotEqualObjects(FSTTestDoc("messages/first", 1, - @{@"a" : @1}, NO), + @{@"a" : @1}, FSTDocumentStateSynced), FSTTestDoc("messages/first", 1, - @{@"b" : @1}, NO)); + @{@"b" : @1}, FSTDocumentStateSynced)); XCTAssertNotEqualObjects(FSTTestDoc("messages/first", 1, - @{@"a" : @1}, NO), + @{@"a" : @1}, FSTDocumentStateSynced), FSTTestDoc("messages/second", 1, - @{@"b" : @1}, NO)); + @{@"b" : @1}, FSTDocumentStateSynced)); XCTAssertNotEqualObjects(FSTTestDoc("messages/first", 1, - @{@"a" : @1}, NO), + @{@"a" : @1}, FSTDocumentStateSynced), FSTTestDoc("messages/first", 2, - @{@"a" : @1}, NO)); + @{@"a" : @1}, FSTDocumentStateSynced)); XCTAssertNotEqualObjects(FSTTestDoc("messages/first", 1, - @{@"a" : @1}, NO), + @{@"a" : @1}, FSTDocumentStateSynced), FSTTestDoc("messages/first", 1, - @{@"a" : @1}, YES)); + @{@"a" : @1}, FSTDocumentStateLocalMutations)); XCTAssertEqualObjects(FSTTestDoc("messages/first", 1, - @{@"a" : @1}, YES), + @{@"a" : @1}, FSTDocumentStateLocalMutations), FSTTestDoc("messages/first", 1, - @{@"a" : @1}, 5)); + @{@"a" : @1}, FSTDocumentStateLocalMutations)); } @end diff --git a/Firestore/Example/Tests/Model/FSTMutationTests.mm b/Firestore/Example/Tests/Model/FSTMutationTests.mm index 4d00c16ef5d..878668fe817 100644 --- a/Firestore/Example/Tests/Model/FSTMutationTests.mm +++ b/Firestore/Example/Tests/Model/FSTMutationTests.mm @@ -57,31 +57,33 @@ - (void)setUp { - (void)testAppliesSetsToDocuments { NSDictionary *docData = @{@"foo" : @"foo-value", @"baz" : @"baz-value"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *set = FSTTestSetMutation(@"collection/key", @{@"bar" : @"bar-value"}); FSTMaybeDocument *setDoc = [set applyToLocalDocument:baseDoc baseDocument:baseDoc localWriteTime:_timestamp]; NSDictionary *expectedData = @{@"bar" : @"bar-value"}; - XCTAssertEqualObjects(setDoc, FSTTestDoc("collection/key", 0, expectedData, YES)); + XCTAssertEqualObjects( + setDoc, FSTTestDoc("collection/key", 0, expectedData, FSTDocumentStateLocalMutations)); } - (void)testAppliesPatchesToDocuments { NSDictionary *docData = @{@"foo" : @{@"bar" : @"bar-value"}, @"baz" : @"baz-value"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *patch = FSTTestPatchMutation("collection/key", @{@"foo.bar" : @"new-bar-value"}, {}); FSTMaybeDocument *patchedDoc = [patch applyToLocalDocument:baseDoc baseDocument:baseDoc localWriteTime:_timestamp]; NSDictionary *expectedData = @{@"foo" : @{@"bar" : @"new-bar-value"}, @"baz" : @"baz-value"}; - XCTAssertEqualObjects(patchedDoc, FSTTestDoc("collection/key", 0, expectedData, YES)); + XCTAssertEqualObjects( + patchedDoc, FSTTestDoc("collection/key", 0, expectedData, FSTDocumentStateLocalMutations)); } - (void)testDeletesValuesFromTheFieldMask { NSDictionary *docData = @{@"foo" : @{@"bar" : @"bar-value", @"baz" : @"baz-value"}}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); DocumentKey key = testutil::Key("collection/key"); FSTMutation *patch = [[FSTPatchMutation alloc] initWithKey:key @@ -92,23 +94,25 @@ - (void)testDeletesValuesFromTheFieldMask { [patch applyToLocalDocument:baseDoc baseDocument:baseDoc localWriteTime:_timestamp]; NSDictionary *expectedData = @{@"foo" : @{@"baz" : @"baz-value"}}; - XCTAssertEqualObjects(patchedDoc, FSTTestDoc("collection/key", 0, expectedData, YES)); + XCTAssertEqualObjects( + patchedDoc, FSTTestDoc("collection/key", 0, expectedData, FSTDocumentStateLocalMutations)); } - (void)testPatchesPrimitiveValue { NSDictionary *docData = @{@"foo" : @"foo-value", @"baz" : @"baz-value"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *patch = FSTTestPatchMutation("collection/key", @{@"foo.bar" : @"new-bar-value"}, {}); FSTMaybeDocument *patchedDoc = [patch applyToLocalDocument:baseDoc baseDocument:baseDoc localWriteTime:_timestamp]; NSDictionary *expectedData = @{@"foo" : @{@"bar" : @"new-bar-value"}, @"baz" : @"baz-value"}; - XCTAssertEqualObjects(patchedDoc, FSTTestDoc("collection/key", 0, expectedData, YES)); + XCTAssertEqualObjects( + patchedDoc, FSTTestDoc("collection/key", 0, expectedData, FSTDocumentStateLocalMutations)); } - (void)testPatchingDeletedDocumentsDoesNothing { - FSTMaybeDocument *baseDoc = FSTTestDeletedDoc("collection/key", 0); + FSTMaybeDocument *baseDoc = FSTTestDeletedDoc("collection/key", 0, NO); FSTMutation *patch = FSTTestPatchMutation("collection/key", @{@"foo" : @"bar"}, {}); FSTMaybeDocument *patchedDoc = [patch applyToLocalDocument:baseDoc baseDocument:baseDoc localWriteTime:_timestamp]; @@ -117,7 +121,7 @@ - (void)testPatchingDeletedDocumentsDoesNothing { - (void)testAppliesLocalServerTimestampTransformToDocuments { NSDictionary *docData = @{@"foo" : @{@"bar" : @"bar-value"}, @"baz" : @"baz-value"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *transform = FSTTestTransformMutation( @"collection/key", @{@"foo.bar" : [FIRFieldValue fieldValueForServerTimestamp]}); @@ -137,7 +141,7 @@ - (void)testAppliesLocalServerTimestampTransformToDocuments { FSTDocument *expectedDoc = [FSTDocument documentWithData:expectedData key:FSTTestDocKey(@"collection/key") version:testutil::Version(0) - hasLocalMutations:YES]; + state:FSTDocumentStateLocalMutations]; XCTAssertEqualObjects(transformedDoc, expectedDoc); } @@ -293,7 +297,7 @@ - (void)testAppliesLocalArrayRemoveTransformWithNonPrimitiveElements { - (void)transformBaseDoc:(NSDictionary *)baseData with:(NSDictionary *)transformData expecting:(NSDictionary *)expectedData { - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, baseData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, baseData, FSTDocumentStateSynced); FSTMutation *transform = FSTTestTransformMutation(@"collection/key", transformData); @@ -303,14 +307,14 @@ - (void)transformBaseDoc:(NSDictionary *)baseData FSTDocument *expectedDoc = [FSTDocument documentWithData:FSTTestObjectValue(expectedData) key:FSTTestDocKey(@"collection/key") version:testutil::Version(0) - hasLocalMutations:YES]; + state:FSTDocumentStateLocalMutations]; XCTAssertEqualObjects(transformedDoc, expectedDoc); } - (void)testAppliesServerAckedServerTimestampTransformToDocuments { NSDictionary *docData = @{@"foo" : @{@"bar" : @"bar-value"}, @"baz" : @"baz-value"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *transform = FSTTestTransformMutation( @"collection/key", @{@"foo.bar" : [FIRFieldValue fieldValueForServerTimestamp]}); @@ -323,12 +327,13 @@ - (void)testAppliesServerAckedServerTimestampTransformToDocuments { [transform applyToRemoteDocument:baseDoc mutationResult:mutationResult]; NSDictionary *expectedData = @{@"foo" : @{@"bar" : _timestamp.dateValue}, @"baz" : @"baz-value"}; - XCTAssertEqualObjects(transformedDoc, FSTTestDoc("collection/key", 0, expectedData, NO)); + XCTAssertEqualObjects(transformedDoc, FSTTestDoc("collection/key", 1, expectedData, + FSTDocumentStateCommittedMutations)); } - (void)testAppliesServerAckedArrayTransformsToDocuments { NSDictionary *docData = @{@"array_1" : @[ @1, @2 ], @"array_2" : @[ @"a", @"b" ]}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *transform = FSTTestTransformMutation(@"collection/key", @{ @"array_1" : [FIRFieldValue fieldValueForArrayUnion:@[ @2, @3 ]], @@ -344,22 +349,23 @@ - (void)testAppliesServerAckedArrayTransformsToDocuments { [transform applyToRemoteDocument:baseDoc mutationResult:mutationResult]; NSDictionary *expectedData = @{@"array_1" : @[ @1, @2, @3 ], @"array_2" : @[ @"b" ]}; - XCTAssertEqualObjects(transformedDoc, FSTTestDoc("collection/key", 0, expectedData, NO)); + XCTAssertEqualObjects(transformedDoc, FSTTestDoc("collection/key", 1, expectedData, + FSTDocumentStateCommittedMutations)); } - (void)testDeleteDeletes { NSDictionary *docData = @{@"foo" : @"bar"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *mutation = FSTTestDeleteMutation(@"collection/key"); FSTMaybeDocument *result = [mutation applyToLocalDocument:baseDoc baseDocument:baseDoc localWriteTime:_timestamp]; - XCTAssertEqualObjects(result, FSTTestDeletedDoc("collection/key", 0)); + XCTAssertEqualObjects(result, FSTTestDeletedDoc("collection/key", 0, NO)); } - (void)testSetWithMutationResult { NSDictionary *docData = @{@"foo" : @"bar"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *set = FSTTestSetMutation(@"collection/key", @{@"foo" : @"new-bar"}); FSTMutationResult *mutationResult = @@ -367,12 +373,13 @@ - (void)testSetWithMutationResult { FSTMaybeDocument *setDoc = [set applyToRemoteDocument:baseDoc mutationResult:mutationResult]; NSDictionary *expectedData = @{@"foo" : @"new-bar"}; - XCTAssertEqualObjects(setDoc, FSTTestDoc("collection/key", 0, expectedData, NO)); + XCTAssertEqualObjects( + setDoc, FSTTestDoc("collection/key", 4, expectedData, FSTDocumentStateCommittedMutations)); } - (void)testPatchWithMutationResult { NSDictionary *docData = @{@"foo" : @"bar"}; - FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, NO); + FSTDocument *baseDoc = FSTTestDoc("collection/key", 0, docData, FSTDocumentStateSynced); FSTMutation *patch = FSTTestPatchMutation("collection/key", @{@"foo" : @"new-bar"}, {}); FSTMutationResult *mutationResult = @@ -381,43 +388,53 @@ - (void)testPatchWithMutationResult { [patch applyToRemoteDocument:baseDoc mutationResult:mutationResult]; NSDictionary *expectedData = @{@"foo" : @"new-bar"}; - XCTAssertEqualObjects(patchedDoc, FSTTestDoc("collection/key", 0, expectedData, NO)); + XCTAssertEqualObjects(patchedDoc, FSTTestDoc("collection/key", 4, expectedData, + FSTDocumentStateCommittedMutations)); } -#define ASSERT_VERSION_TRANSITION(mutation, base, expected) \ - do { \ - FSTMutationResult *mutationResult = \ - [[FSTMutationResult alloc] initWithVersion:testutil::Version(0) transformResults:nil]; \ - FSTMaybeDocument *actual = \ - [mutation applyToRemoteDocument:base mutationResult:mutationResult]; \ - XCTAssertEqualObjects(actual, expected); \ +#define ASSERT_VERSION_TRANSITION(mutation, base, result, expected) \ + do { \ + FSTMaybeDocument *actual = [mutation applyToRemoteDocument:base mutationResult:result]; \ + XCTAssertEqualObjects(actual, expected); \ } while (0); /** * Tests the transition table documented in FSTMutation.h. */ - (void)testTransitions { - FSTDocument *docV0 = FSTTestDoc("collection/key", 0, @{}, NO); - FSTDeletedDocument *deletedV0 = FSTTestDeletedDoc("collection/key", 0); - - FSTDocument *docV3 = FSTTestDoc("collection/key", 3, @{}, NO); - FSTDeletedDocument *deletedV3 = FSTTestDeletedDoc("collection/key", 3); + FSTDocument *docV3 = FSTTestDoc("collection/key", 3, @{}, FSTDocumentStateSynced); + FSTDeletedDocument *deletedV3 = FSTTestDeletedDoc("collection/key", 3, NO); FSTMutation *setMutation = FSTTestSetMutation(@"collection/key", @{}); - FSTMutation *patchMutation = FSTTestPatchMutation("collection/key", {}, {}); + FSTMutation *patchMutation = FSTTestPatchMutation("collection/key", @{}, {}); + FSTMutation *transformMutation = FSTTestTransformMutation(@"collection/key", @{}); FSTMutation *deleteMutation = FSTTestDeleteMutation(@"collection/key"); - ASSERT_VERSION_TRANSITION(setMutation, docV3, docV3); - ASSERT_VERSION_TRANSITION(setMutation, deletedV3, docV0); - ASSERT_VERSION_TRANSITION(setMutation, nil, docV0); + FSTDeletedDocument *docV7Deleted = FSTTestDeletedDoc("collection/key", 7, YES); + FSTDocument *docV7Committed = + FSTTestDoc("collection/key", 7, @{}, FSTDocumentStateCommittedMutations); + FSTUnknownDocument *docV7Unknown = FSTTestUnknownDoc("collection/key", 7); + + FSTMutationResult *mutationResult = + [[FSTMutationResult alloc] initWithVersion:testutil::Version(7) transformResults:nil]; + FSTMutationResult *transformResult = + [[FSTMutationResult alloc] initWithVersion:testutil::Version(7) transformResults:@[]]; + + ASSERT_VERSION_TRANSITION(setMutation, docV3, mutationResult, docV7Committed); + ASSERT_VERSION_TRANSITION(setMutation, deletedV3, mutationResult, docV7Committed); + ASSERT_VERSION_TRANSITION(setMutation, nil, mutationResult, docV7Committed); + + ASSERT_VERSION_TRANSITION(patchMutation, docV3, mutationResult, docV7Committed); + ASSERT_VERSION_TRANSITION(patchMutation, deletedV3, mutationResult, docV7Unknown); + ASSERT_VERSION_TRANSITION(patchMutation, nil, mutationResult, docV7Unknown); - ASSERT_VERSION_TRANSITION(patchMutation, docV3, docV3); - ASSERT_VERSION_TRANSITION(patchMutation, deletedV3, deletedV3); - ASSERT_VERSION_TRANSITION(patchMutation, nil, nil); + ASSERT_VERSION_TRANSITION(transformMutation, docV3, transformResult, docV7Committed); + ASSERT_VERSION_TRANSITION(transformMutation, deletedV3, transformResult, docV7Unknown); + ASSERT_VERSION_TRANSITION(transformMutation, nil, transformResult, docV7Unknown); - ASSERT_VERSION_TRANSITION(deleteMutation, docV3, deletedV0); - ASSERT_VERSION_TRANSITION(deleteMutation, deletedV3, deletedV0); - ASSERT_VERSION_TRANSITION(deleteMutation, nil, deletedV0); + ASSERT_VERSION_TRANSITION(deleteMutation, docV3, mutationResult, docV7Deleted); + ASSERT_VERSION_TRANSITION(deleteMutation, deletedV3, mutationResult, docV7Deleted); + ASSERT_VERSION_TRANSITION(deleteMutation, nil, mutationResult, docV7Deleted); } #undef ASSERT_TRANSITION diff --git a/Firestore/Example/Tests/Remote/FSTRemoteEventTests.mm b/Firestore/Example/Tests/Remote/FSTRemoteEventTests.mm index 8c9d1333e72..948cafb8fd6 100644 --- a/Firestore/Example/Tests/Remote/FSTRemoteEventTests.mm +++ b/Firestore/Example/Tests/Remote/FSTRemoteEventTests.mm @@ -179,13 +179,13 @@ - (void)testWillAccumulateDocumentAddedAndRemovedEvents { NSDictionary *targetMap = [self queryDataForTargets:@[ @1, @2, @3, @4, @5, @6 ]]; - FSTDocument *existingDoc = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *existingDoc = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1, @2, @3 ] removedTargetIDs:@[ @4, @5, @6 ] documentKey:existingDoc.key document:existingDoc]; - FSTDocument *newDoc = FSTTestDoc("docs/2", 2, @{@"value" : @2}, NO); + FSTDocument *newDoc = FSTTestDoc("docs/2", 2, @{@"value" : @2}, FSTDocumentStateSynced); FSTWatchChange *change2 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1, @4 ] removedTargetIDs:@[ @2, @6 ] documentKey:newDoc.key @@ -238,7 +238,7 @@ - (void)testWillAccumulateDocumentAddedAndRemovedEvents { - (void)testWillIgnoreEventsForPendingTargets { NSDictionary *targetMap = [self queryDataForTargets:@[ @1 ]]; - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc1.key @@ -252,7 +252,7 @@ - (void)testWillIgnoreEventsForPendingTargets { targetIDs:@[ @1 ] cause:nil]; - FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, NO); + FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, FSTDocumentStateSynced); FSTWatchChange *change4 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc2.key @@ -279,7 +279,7 @@ - (void)testWillIgnoreEventsForPendingTargets { - (void)testWillIgnoreEventsForRemovedTargets { NSDictionary *targetMap = [self queryDataForTargets:@[]]; - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc1.key @@ -308,7 +308,7 @@ - (void)testWillIgnoreEventsForRemovedTargets { - (void)testWillKeepResetMappingEvenWithUpdates { NSDictionary *targetMap = [self queryDataForTargets:@[ @1 ]]; - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc1.key @@ -319,13 +319,13 @@ - (void)testWillKeepResetMappingEvenWithUpdates { cause:nil]; // Add doc2, doc3 - FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, NO); + FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, FSTDocumentStateSynced); FSTWatchChange *change3 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc2.key document:doc2]; - FSTDocument *doc3 = FSTTestDoc("docs/3", 3, @{@"value" : @3}, NO); + FSTDocument *doc3 = FSTTestDoc("docs/3", 3, @{@"value" : @3}, FSTDocumentStateSynced); FSTWatchChange *change4 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc3.key @@ -387,13 +387,13 @@ - (void)testWillHandleTargetAddAndRemovalInSameBatch { NSDictionary *targetMap = [self queryDataForTargets:@[ @1, @2 ]]; - FSTDocument *doc1a = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1a = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[ @2 ] documentKey:doc1a.key document:doc1a]; - FSTDocument *doc1b = FSTTestDoc("docs/1", 1, @{@"value" : @2}, NO); + FSTDocument *doc1b = FSTTestDoc("docs/1", 1, @{@"value" : @2}, FSTDocumentStateSynced); FSTWatchChange *change2 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @2 ] removedTargetIDs:@[ @1 ] documentKey:doc1b.key @@ -444,7 +444,7 @@ - (void)testTargetAddedChangeWillResetPreviousState { NSDictionary *targetMap = [self queryDataForTargets:@[ @1, @3 ]]; - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1, @3 ] removedTargetIDs:@[ @2 ] documentKey:doc1.key @@ -466,7 +466,7 @@ - (void)testTargetAddedChangeWillResetPreviousState { targetIDs:@[ @1 ] cause:nil]; - FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, NO); + FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, FSTDocumentStateSynced); FSTWatchChange *change6 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[ @3 ] documentKey:doc2.key @@ -531,13 +531,13 @@ - (void)testExistenceFilterMismatchClearsTarget { NSDictionary *targetMap = [self queryDataForTargets:@[ @1, @2 ]]; - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc1.key document:doc1]; - FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, NO); + FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, FSTDocumentStateSynced); FSTWatchChange *change2 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc2.key @@ -602,7 +602,7 @@ - (void)testExistenceFilterMismatchRemovesCurrentChanges { resumeToken:_resumeToken1]; [aggregator handleTargetChange:markCurrent]; - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTDocumentWatchChange *addDoc = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc1.key @@ -633,13 +633,13 @@ - (void)testExistenceFilterMismatchRemovesCurrentChanges { - (void)testDocumentUpdate { NSDictionary *targetMap = [self queryDataForTargets:@[ @1 ]]; - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"value" : @1}, FSTDocumentStateSynced); FSTWatchChange *change1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc1.key document:doc1]; - FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, NO); + FSTDocument *doc2 = FSTTestDoc("docs/2", 2, @{@"value" : @2}, FSTDocumentStateSynced); FSTWatchChange *change2 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:doc2.key @@ -660,8 +660,9 @@ - (void)testDocumentUpdate { [_targetMetadataProvider setSyncedKeys:DocumentKeySet{doc1.key, doc2.key} forQueryData:targetMap[@1]]; - FSTDeletedDocument *deletedDoc1 = - [FSTDeletedDocument documentWithKey:doc1.key version:testutil::Version(3)]; + FSTDeletedDocument *deletedDoc1 = [FSTDeletedDocument documentWithKey:doc1.key + version:testutil::Version(3) + hasCommittedMutations:NO]; FSTDocumentWatchChange *change3 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[] removedTargetIDs:@[ @1 ] @@ -669,7 +670,7 @@ - (void)testDocumentUpdate { document:deletedDoc1]; [aggregator handleDocumentChange:change3]; - FSTDocument *updatedDoc2 = FSTTestDoc("docs/2", 3, @{@"value" : @2}, NO); + FSTDocument *updatedDoc2 = FSTTestDoc("docs/2", 3, @{@"value" : @2}, FSTDocumentStateSynced); FSTDocumentWatchChange *change4 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] @@ -677,7 +678,7 @@ - (void)testDocumentUpdate { document:updatedDoc2]; [aggregator handleDocumentChange:change4]; - FSTDocument *doc3 = FSTTestDoc("docs/3", 3, @{@"value" : @3}, NO); + FSTDocument *doc3 = FSTTestDoc("docs/3", 3, @{@"value" : @3}, FSTDocumentStateSynced); FSTDocumentWatchChange *change5 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] @@ -795,8 +796,9 @@ - (void)testSynthesizeDeletes { existingKeys:DocumentKeySet {} changes:@[ resolveLimboTarget ]]; - FSTDeletedDocument *expected = - [FSTDeletedDocument documentWithKey:limboKey version:event.snapshotVersion]; + FSTDeletedDocument *expected = [FSTDeletedDocument documentWithKey:limboKey + version:event.snapshotVersion + hasCommittedMutations:NO]; XCTAssertEqualObjects(event.documentUpdates.at(limboKey), expected); XCTAssertTrue(event.limboDocumentChanges.contains(limboKey)); } @@ -840,27 +842,28 @@ - (void)testSeparatesDocumentUpdates { NSDictionary *targetMap = [self queryDataForLimboTargets:@[ @1 ]]; - FSTDocument *newDoc = FSTTestDoc("docs/new", 1, @{@"key" : @"value"}, NO); + FSTDocument *newDoc = FSTTestDoc("docs/new", 1, @{@"key" : @"value"}, FSTDocumentStateSynced); FSTWatchChange *newDocChange = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:newDoc.key document:newDoc]; - FSTDocument *existingDoc = FSTTestDoc("docs/existing", 1, @{@"some" : @"data"}, NO); + FSTDocument *existingDoc = + FSTTestDoc("docs/existing", 1, @{@"some" : @"data"}, FSTDocumentStateSynced); FSTWatchChange *existingDocChange = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1 ] removedTargetIDs:@[] documentKey:existingDoc.key document:existingDoc]; - FSTDeletedDocument *deletedDoc = FSTTestDeletedDoc("docs/deleted", 1); + FSTDeletedDocument *deletedDoc = FSTTestDeletedDoc("docs/deleted", 1, NO); FSTWatchChange *deletedDocChange = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[] removedTargetIDs:@[ @1 ] documentKey:deletedDoc.key document:deletedDoc]; - FSTDeletedDocument *missingDoc = FSTTestDeletedDoc("docs/missing", 1); + FSTDeletedDocument *missingDoc = FSTTestDeletedDoc("docs/missing", 1, NO); FSTWatchChange *missingDocChange = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[] removedTargetIDs:@[ @1 ] @@ -890,9 +893,9 @@ - (void)testTracksLimboDocuments { [targetMap addEntriesFromDictionary:[self queryDataForLimboTargets:@[ @2 ]]]; // Add 3 docs: 1 is limbo and non-limbo, 2 is limbo-only, 3 is non-limbo - FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"key" : @"value"}, NO); - FSTDocument *doc2 = FSTTestDoc("docs/2", 1, @{@"key" : @"value"}, NO); - FSTDocument *doc3 = FSTTestDoc("docs/3", 1, @{@"key" : @"value"}, NO); + FSTDocument *doc1 = FSTTestDoc("docs/1", 1, @{@"key" : @"value"}, FSTDocumentStateSynced); + FSTDocument *doc2 = FSTTestDoc("docs/2", 1, @{@"key" : @"value"}, FSTDocumentStateSynced); + FSTDocument *doc3 = FSTTestDoc("docs/3", 1, @{@"key" : @"value"}, FSTDocumentStateSynced); // Target 2 is a limbo target FSTWatchChange *docChange1 = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1, @2 ] diff --git a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm index a705d8b88ed..017e5857b08 100644 --- a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm +++ b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm @@ -832,7 +832,7 @@ - (void)testConvertsDocumentChangeWithTargetIds { initWithUpdatedTargetIDs:@[ @1, @2 ] removedTargetIDs:@[] documentKey:FSTTestDocKey(@"coll/1") - document:FSTTestDoc("coll/1", 5, @{@"foo" : @"bar"}, NO)]; + document:FSTTestDoc("coll/1", 5, @{@"foo" : @"bar"}, FSTDocumentStateSynced)]; GCFSListenResponse *listenResponse = [GCFSListenResponse message]; listenResponse.documentChange.document.name = @"projects/p/databases/d/documents/coll/1"; listenResponse.documentChange.document.updateTime.nanos = 5000; @@ -851,7 +851,7 @@ - (void)testConvertsDocumentChangeWithRemovedTargetIds { initWithUpdatedTargetIDs:@[ @2 ] removedTargetIDs:@[ @1 ] documentKey:FSTTestDocKey(@"coll/1") - document:FSTTestDoc("coll/1", 5, @{@"foo" : @"bar"}, NO)]; + document:FSTTestDoc("coll/1", 5, @{@"foo" : @"bar"}, FSTDocumentStateSynced)]; GCFSListenResponse *listenResponse = [GCFSListenResponse message]; listenResponse.documentChange.document.name = @"projects/p/databases/d/documents/coll/1"; listenResponse.documentChange.document.updateTime.nanos = 5000; @@ -870,7 +870,7 @@ - (void)testConvertsDocumentChangeWithDeletions { [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[] removedTargetIDs:@[ @1, @2 ] documentKey:FSTTestDocKey(@"coll/1") - document:FSTTestDeletedDoc("coll/1", 5)]; + document:FSTTestDeletedDoc("coll/1", 5, NO)]; GCFSListenResponse *listenResponse = [GCFSListenResponse message]; listenResponse.documentDelete.document = @"projects/p/databases/d/documents/coll/1"; listenResponse.documentDelete.readTime.nanos = 5000; diff --git a/Firestore/Example/Tests/Remote/FSTWatchChangeTests.mm b/Firestore/Example/Tests/Remote/FSTWatchChangeTests.mm index d707e3cc987..99017ffb354 100644 --- a/Firestore/Example/Tests/Remote/FSTWatchChangeTests.mm +++ b/Firestore/Example/Tests/Remote/FSTWatchChangeTests.mm @@ -32,7 +32,7 @@ @interface FSTWatchChangeTests : XCTestCase @implementation FSTWatchChangeTests - (void)testDocumentChange { - FSTMaybeDocument *doc = FSTTestDoc("a/b", 1, @{}, NO); + FSTMaybeDocument *doc = FSTTestDoc("a/b", 1, @{}, FSTDocumentStateSynced); FSTDocumentWatchChange *change = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:@[ @1, @2, @3 ] removedTargetIDs:@[ @4, @5 ] diff --git a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm index 6100ef1b305..bf9371e6ac5 100644 --- a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm +++ b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm @@ -174,17 +174,19 @@ - (SnapshotVersion)parseVersion:(NSNumber *_Nullable)version { return testutil::Version(version.longLongValue); } -- (FSTDocumentViewChange *)parseChange:(NSArray *)change ofType:(FSTDocumentViewChangeType)type { - BOOL hasMutations = NO; - for (NSUInteger i = 3; i < change.count; ++i) { - if ([change[i] isEqual:@"local"]) { - hasMutations = YES; - } - } - NSNumber *version = change[1]; - XCTAssert([change[0] isKindOfClass:[NSString class]]); - FSTDocument *doc = FSTTestDoc(util::MakeString((NSString *)change[0]), version.longLongValue, - change[2], hasMutations); +- (FSTDocumentViewChange *)parseChange:(NSDictionary *)jsonDoc + ofType:(FSTDocumentViewChangeType)type { + NSNumber *version = jsonDoc[@"version"]; + NSDictionary *options = jsonDoc[@"options"]; + FSTDocumentState documentState = [options[@"hasLocalMutations"] isEqualToNumber:@YES] + ? FSTDocumentStateLocalMutations + : ([options[@"hasCommittedMutations"] isEqualToNumber:@YES] + ? FSTDocumentStateCommittedMutations + : FSTDocumentStateSynced); + + XCTAssert([jsonDoc[@"key"] isKindOfClass:[NSString class]]); + FSTDocument *doc = FSTTestDoc(util::MakeString((NSString *)jsonDoc[@"key"]), + version.longLongValue, jsonDoc[@"value"], documentState); return [FSTDocumentViewChange changeWithDocument:doc type:type]; } @@ -269,17 +271,19 @@ - (void)doWatchEntity:(NSDictionary *)watchEntity { [self doWatchEntity:watchSpec]; } } else if (watchEntity[@"doc"]) { - NSArray *docSpec = watchEntity[@"doc"]; - FSTDocumentKey *key = FSTTestDocKey(docSpec[0]); - FSTObjectValue *_Nullable value = - [docSpec[2] isKindOfClass:[NSNull class]] ? nil : FSTTestObjectValue(docSpec[2]); - SnapshotVersion version = [self parseVersion:docSpec[1]]; - FSTMaybeDocument *doc = - value ? [FSTDocument documentWithData:value - key:key - version:std::move(version) - hasLocalMutations:NO] - : [FSTDeletedDocument documentWithKey:key version:std::move(version)]; + NSDictionary *docSpec = watchEntity[@"doc"]; + FSTDocumentKey *key = FSTTestDocKey(docSpec[@"key"]); + FSTObjectValue *_Nullable value = [docSpec[@"value"] isKindOfClass:[NSNull class]] + ? nil + : FSTTestObjectValue(docSpec[@"value"]); + SnapshotVersion version = [self parseVersion:docSpec[@"version"]]; + FSTMaybeDocument *doc = value ? [FSTDocument documentWithData:value + key:key + version:std::move(version) + state:FSTDocumentStateSynced] + : [FSTDeletedDocument documentWithKey:key + version:std::move(version) + hasCommittedMutations:NO]; FSTWatchChange *change = [[FSTDocumentWatchChange alloc] initWithUpdatedTargetIDs:watchEntity[@"targets"] removedTargetIDs:watchEntity[@"removedTargets"] @@ -491,22 +495,22 @@ - (void)validateEvent:(FSTQueryEvent *)actual matches:(NSDictionary *)expected { } else { NSMutableArray *expectedChanges = [NSMutableArray array]; NSMutableArray *removed = expected[@"removed"]; - for (NSArray *changeSpec in removed) { + for (NSDictionary *changeSpec in removed) { [expectedChanges addObject:[self parseChange:changeSpec ofType:FSTDocumentViewChangeTypeRemoved]]; } NSMutableArray *added = expected[@"added"]; - for (NSArray *changeSpec in added) { + for (NSDictionary *changeSpec in added) { [expectedChanges addObject:[self parseChange:changeSpec ofType:FSTDocumentViewChangeTypeAdded]]; } NSMutableArray *modified = expected[@"modified"]; - for (NSArray *changeSpec in modified) { + for (NSDictionary *changeSpec in modified) { [expectedChanges addObject:[self parseChange:changeSpec ofType:FSTDocumentViewChangeTypeModified]]; } NSMutableArray *metadata = expected[@"metadata"]; - for (NSArray *changeSpec in metadata) { + for (NSDictionary *changeSpec in metadata) { [expectedChanges addObject:[self parseChange:changeSpec ofType:FSTDocumentViewChangeTypeMetadata]]; } diff --git a/Firestore/Example/Tests/SpecTests/json/collection_spec_test.json b/Firestore/Example/Tests/SpecTests/json/collection_spec_test.json index 667eac2546e..3f7caafd004 100644 --- a/Firestore/Example/Tests/SpecTests/json/collection_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/collection_spec_test.json @@ -38,13 +38,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -61,7 +65,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -71,13 +76,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -133,14 +142,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, diff --git a/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json b/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json index 88e6b0bfd4b..9eaf185ca4a 100644 --- a/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json @@ -38,13 +38,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -61,7 +65,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -71,13 +76,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -95,7 +104,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] } } ] @@ -146,7 +156,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -164,13 +175,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 2000, - { + { + "key": "collection/1", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -187,7 +202,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -197,13 +213,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 2000, - { + { + "key": "collection/1", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -259,7 +279,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -284,7 +305,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -340,13 +362,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 2000, - { + { + "key": "collection/1", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -363,7 +389,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -373,13 +400,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 2000, - { + { + "key": "collection/1", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -429,13 +460,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 2000, - { + { + "key": "collection/1", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -472,7 +507,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -528,20 +564,28 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 1000, - { + }, + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -558,7 +602,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -568,20 +613,28 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 1000, - { + }, + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -599,7 +652,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -641,13 +695,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -664,7 +722,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -705,7 +764,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -728,13 +788,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/2", - 1000, - { + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -783,20 +847,28 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 1000, - { + }, + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -813,7 +885,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -823,20 +896,28 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 1000, - { + }, + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -880,7 +961,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -922,13 +1004,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -945,7 +1031,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -986,7 +1073,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -1009,13 +1097,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/2", - 1000, - { + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1064,13 +1156,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1087,7 +1183,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1097,13 +1194,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1123,13 +1224,17 @@ { "watchEntity": { "docs": [ - [ - "collection/3", - 3000, - { + { + "key": "collection/3", + "version": 3000, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1138,7 +1243,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1148,13 +1254,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3", - 3000, - { + { + "key": "collection/3", + "version": 3000, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1189,27 +1299,39 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 2000, - { + }, + { + "key": "collection/2", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 3000, - { + }, + { + "key": "collection/3", + "version": 3000, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1226,7 +1348,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "expect": [ { @@ -1236,13 +1359,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2", - 2000, - { + { + "key": "collection/2", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1291,13 +1418,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1314,7 +1445,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1324,13 +1456,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1347,7 +1483,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1357,13 +1494,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1412,20 +1553,28 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 1000, - { + }, + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1442,7 +1591,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1452,20 +1602,28 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 1000, - { + }, + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1483,7 +1641,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1525,13 +1684,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 1000, - { + { + "key": "collection/1", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1548,7 +1711,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -1604,13 +1768,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/2", - 1000, - { + { + "key": "collection/2", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, diff --git a/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json b/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json index f793b1c4b5c..88ed8dcad4a 100644 --- a/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json @@ -38,13 +38,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -61,7 +65,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -71,13 +76,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -100,7 +109,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -153,7 +163,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -176,13 +187,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -231,13 +246,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -254,7 +273,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -264,13 +284,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -293,7 +317,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -353,7 +378,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -376,13 +402,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -443,13 +473,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -466,7 +500,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -482,13 +517,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -511,7 +550,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -569,13 +609,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 1 @@ -592,7 +636,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -627,13 +672,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -694,13 +743,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -717,7 +770,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -733,13 +787,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -810,7 +868,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -887,13 +946,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 1, @@ -911,7 +974,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -960,13 +1024,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -985,13 +1053,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1009,7 +1081,8 @@ }, { "watchSnapshot": { - "version": 1003 + "version": 1003, + "targetIds": [] } } ] @@ -1053,20 +1126,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1083,7 +1164,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "expect": [ { @@ -1093,20 +1175,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1124,7 +1214,8 @@ }, { "watchSnapshot": { - "version": 1003 + "version": 1003, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -1177,7 +1268,8 @@ }, { "watchSnapshot": { - "version": 1004 + "version": 1004, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -1200,13 +1292,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1255,22 +1351,30 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1287,7 +1391,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1297,22 +1402,30 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1383,14 +1496,18 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1406,14 +1523,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -1430,7 +1551,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1474,24 +1596,32 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1000, - { + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1537,14 +1667,18 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1000, - { + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 1 @@ -1553,7 +1687,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] } }, { @@ -1566,20 +1701,25 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] } }, { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removedTargets": [ 4 @@ -1589,14 +1729,18 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1000, - { + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -1605,7 +1749,8 @@ }, { "watchSnapshot": { - "version": 4000 + "version": 4000, + "targetIds": [] }, "expect": [ { @@ -1688,22 +1833,30 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1720,7 +1873,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1730,22 +1884,30 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1816,14 +1978,18 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1839,14 +2005,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -1863,7 +2033,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1907,24 +2078,32 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1000, - { + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1969,7 +2148,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] } }, { @@ -1982,7 +2162,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -2019,14 +2200,18 @@ "orderBys": [] }, "removed": [ - [ - "collection/b", - 1000, - { + { + "key": "collection/b", + "version": 1000, + "value": { "include": true, "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2037,14 +2222,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "include": true, "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removedTargets": [ 4 @@ -2053,7 +2242,8 @@ }, { "watchSnapshot": { - "version": 4000 + "version": 4000, + "targetIds": [] } } ] @@ -2128,20 +2318,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2160,7 +2358,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "clientIndex": 0 }, @@ -2174,20 +2373,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2211,7 +2418,8 @@ }, { "watchSnapshot": { - "version": 1003 + "version": 1003, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -2275,7 +2483,8 @@ }, { "watchSnapshot": { - "version": 1004 + "version": 1004, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -2302,13 +2511,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2389,20 +2602,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2421,7 +2642,8 @@ }, { "watchSnapshot": { - "version": 1000000 + "version": 1000000, + "targetIds": [] }, "clientIndex": 0 }, @@ -2435,20 +2657,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2472,7 +2702,8 @@ }, { "watchSnapshot": { - "version": 2000000 + "version": 2000000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -2566,7 +2797,8 @@ }, { "watchSnapshot": { - "version": 3000000 + "version": 3000000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -2610,7 +2842,8 @@ }, { "watchSnapshot": { - "version": 4000000 + "version": 4000000, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -2633,13 +2866,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2700,27 +2937,39 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1002, - { + }, + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2739,7 +2988,8 @@ }, { "watchSnapshot": { - "version": 1000000 + "version": 1000000, + "targetIds": [] }, "expect": [ { @@ -2749,27 +2999,39 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1002, - { + }, + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2798,7 +3060,8 @@ }, { "watchSnapshot": { - "version": 2000000 + "version": 2000000, + "targetIds": [] }, "expect": [ { @@ -2923,7 +3186,8 @@ }, { "watchSnapshot": { - "version": 3000000 + "version": 3000000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -2976,7 +3240,8 @@ }, { "watchSnapshot": { - "version": 3000000 + "version": 3000000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -3013,13 +3278,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3073,7 +3342,8 @@ }, { "watchSnapshot": { - "version": 5000000 + "version": 5000000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -3117,7 +3387,8 @@ }, { "watchSnapshot": { - "version": 6000000 + "version": 6000000, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -3140,13 +3411,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, diff --git a/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json b/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json index bc49d7629c7..e387bf071c4 100644 --- a/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json @@ -40,20 +40,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -70,7 +78,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -81,20 +90,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -105,13 +122,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -121,13 +142,17 @@ { "watchEntity": { "docs": [ - [ - "collection/c", - 1001, - { + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removedTargets": [ 2 @@ -136,7 +161,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "expect": [ { @@ -147,28 +173,241 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/c", - 1001, - { + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + } + ] + }, + "Documents outside of limit don't raise hasPendingWrites": { + "describeName": "Limits:", + "itName": "Documents outside of limit don't raise hasPendingWrites", + "tags": [], + "config": { + "useGarbageCollection": false, + "numClients": 1 + }, + "steps": [ + { + "userListen": [ + 2, + { + "path": "collection", + "limit": 2, + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "limit": 2, + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + } + }, + { + "watchAck": [ + 2 + ] + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + }, + { + "key": "collection/b", + "version": 1000, + "value": { + "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-1000" + ] + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "limit": 2, + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + }, + { + "key": "collection/b", + "version": 1000, + "value": { + "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, "hasPendingWrites": false } ] + }, + { + "userUnlisten": [ + 2, + { + "path": "collection", + "limit": 2, + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": {} + } + }, + { + "userSet": [ + "collection/c", + { + "key": "c" + } + ] + }, + { + "userListen": [ + 2, + { + "path": "collection", + "limit": 2, + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "limit": 2, + "filters": [], + "orderBys": [] + }, + "resumeToken": "resume-token-1000" + } + } + }, + "expect": [ + { + "query": { + "path": "collection", + "limit": 2, + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + }, + { + "key": "collection/b", + "version": 1000, + "value": { + "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": false + } + ] } ] }, @@ -213,20 +452,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -243,7 +490,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "expect": [ { @@ -254,20 +502,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -283,20 +539,28 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1002, - { + }, + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -313,7 +577,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -368,7 +633,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -393,22 +659,30 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -459,20 +733,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -489,7 +771,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -500,20 +783,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -524,13 +815,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -547,7 +842,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -572,22 +868,30 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/c", - 1001, - { + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -676,20 +980,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -699,20 +1011,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -737,7 +1057,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -748,20 +1069,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -775,20 +1104,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -799,13 +1136,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2, @@ -823,7 +1164,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -857,22 +1199,30 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/c", - 1001, - { + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -886,13 +1236,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -943,20 +1297,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -973,7 +1335,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -984,20 +1347,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1043,20 +1414,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1072,48 +1451,72 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1002, - { + }, + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/d", - 1003, - { + }, + { + "key": "collection/d", + "version": 1003, + "value": { "key": "d" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/e", - 1004, - { + }, + { + "key": "collection/e", + "version": 1004, + "value": { "key": "e" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/f", - 1005, - { + }, + { + "key": "collection/f", + "version": 1005, + "value": { "key": "f" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -1130,7 +1533,8 @@ }, { "watchSnapshot": { - "version": 1005 + "version": 1005, + "targetIds": [] }, "expect": [ { @@ -1140,34 +1544,50 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/d", - 1003, - { + }, + { + "key": "collection/d", + "version": 1003, + "value": { "key": "d" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/e", - 1004, - { + }, + { + "key": "collection/e", + "version": 1004, + "value": { "key": "e" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/f", - 1005, - { + }, + { + "key": "collection/f", + "version": 1005, + "value": { "key": "f" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1183,20 +1603,28 @@ { "watchEntity": { "docs": [ - [ - "collection/e", - 1004, - { + { + "key": "collection/e", + "version": 1004, + "value": { "key": "e" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/f", - 1005, - { + }, + { + "key": "collection/f", + "version": 1005, + "value": { "key": "f" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1213,7 +1641,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -1285,7 +1714,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -1336,13 +1766,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1356,22 +1790,30 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1401,7 +1843,8 @@ }, { "watchSnapshot": { - "version": 2001 + "version": 2001, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -1452,13 +1895,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1472,22 +1919,30 @@ "orderBys": [] }, "added": [ - [ - "collection/d", - 1003, - { + { + "key": "collection/d", + "version": 1003, + "value": { "key": "d" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1517,7 +1972,8 @@ }, { "watchSnapshot": { - "version": 2002 + "version": 2002, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -1559,13 +2015,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1579,22 +2039,30 @@ "orderBys": [] }, "added": [ - [ - "collection/e", - 1004, - { + { + "key": "collection/e", + "version": 1004, + "value": { "key": "e" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1624,7 +2092,8 @@ }, { "watchSnapshot": { - "version": 2003 + "version": 2003, + "targetIds": [] }, "stateExpect": { "limboDocs": [], @@ -1656,13 +2125,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/d", - 1003, - { + { + "key": "collection/d", + "version": 1003, + "value": { "key": "d" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1676,22 +2149,30 @@ "orderBys": [] }, "added": [ - [ - "collection/f", - 1005, - { + { + "key": "collection/f", + "version": 1005, + "value": { "key": "f" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/d", - 1003, - { + { + "key": "collection/d", + "version": 1003, + "value": { "key": "d" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1784,20 +2265,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1816,7 +2305,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "clientIndex": 0 }, @@ -1831,20 +2321,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1001, - { + }, + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1860,13 +2358,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1877,13 +2379,17 @@ { "watchEntity": { "docs": [ - [ - "collection/c", - 1001, - { + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removedTargets": [ 2 @@ -1893,7 +2399,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "clientIndex": 0 }, @@ -1908,22 +2415,30 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1002, - { + { + "key": "collection/b", + "version": 1002, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removed": [ - [ - "collection/c", - 1001, - { + { + "key": "collection/c", + "version": 1001, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2010,20 +2525,28 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1002, - { + }, + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2042,7 +2565,8 @@ }, { "watchSnapshot": { - "version": 1002 + "version": 1002, + "targetIds": [] }, "clientIndex": 0 }, @@ -2057,20 +2581,28 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 1002, - { + }, + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2103,23 +2635,30 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "key": "a" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "removed": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2141,13 +2680,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1003, - { + { + "key": "collection/a", + "version": 1003, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2158,13 +2701,17 @@ { "watchEntity": { "docs": [ - [ - "collection/c", - 1002, - { + { + "key": "collection/c", + "version": 1002, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removedTargets": [ 2 @@ -2174,7 +2721,8 @@ }, { "watchSnapshot": { - "version": 1003 + "version": 1003, + "targetIds": [] }, "clientIndex": 0 }, @@ -2189,13 +2737,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a", - 1003, - { + { + "key": "collection/a", + "version": 1003, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, diff --git a/Firestore/Example/Tests/SpecTests/json/listen_spec_test.json b/Firestore/Example/Tests/SpecTests/json/listen_spec_test.json index 0c17a572694..ff17545ce7b 100644 --- a/Firestore/Example/Tests/SpecTests/json/listen_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/listen_spec_test.json @@ -41,13 +41,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -64,7 +68,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -74,13 +79,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -164,13 +173,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -187,7 +200,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -197,13 +211,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -214,13 +232,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -229,7 +251,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -239,13 +262,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -375,13 +402,17 @@ { "watchEntity": { "docs": [ - [ - "collection2/a", - 1000, - { + { + "key": "collection2/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -395,7 +426,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -415,19 +447,255 @@ "orderBys": [] }, "added": [ - [ - "collection2/a", - 1000, - { + { + "key": "collection2/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": false + } + ] + } + ] + }, + "Doesn't include unknown documents in cached result": { + "describeName": "Listens:", + "itName": "Doesn't include unknown documents in cached result", + "tags": [], + "config": { + "useGarbageCollection": true, + "numClients": 1 + }, + "steps": [ + { + "userSet": [ + "collection/exists", + { + "key": "a" + } + ] + }, + { + "userPatch": [ + "collection/unknown", + { + "key": "b" + } + ] + }, + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/exists", + "version": 0, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, + "hasPendingWrites": true + } + ] + } + ] + }, + "Doesn't raise 'hasPendingWrites' for deletes": { + "describeName": "Listens:", + "itName": "Doesn't raise 'hasPendingWrites' for deletes", + "tags": [], + "config": { + "useGarbageCollection": true, + "numClients": 1 + }, + "steps": [ + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + } + }, + { + "watchAck": [ + 2 + ] + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 0, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-1000" + ] + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 0, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + }, + { + "userDelete": "collection/a", + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "removed": [ + { + "key": "collection/a", + "version": 0, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, "hasPendingWrites": false } ] + }, + { + "writeAck": { + "version": 2000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/a" + ], + "rejectedDocs": [] + } + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 2000, + "value": null + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + } } ] }, @@ -473,20 +741,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "a": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "b": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -503,7 +779,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -513,13 +790,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "a": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -567,13 +848,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "a": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -622,11 +907,11 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - null - ] + { + "key": "collection/a", + "version": 1000, + "value": null + } ], "removedTargets": [ 2 @@ -635,7 +920,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] } }, { @@ -648,7 +934,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -834,7 +1121,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -925,13 +1213,17 @@ { "watchEntity": { "docs": [ - [ - "collection1/a", - 1000, - { + { + "key": "collection1/a", + "version": 1000, + "value": { "a": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -941,13 +1233,17 @@ { "watchEntity": { "docs": [ - [ - "collection2/a", - 1001, - { + { + "key": "collection2/a", + "version": 1001, + "value": { "b": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -998,7 +1294,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1008,13 +1305,17 @@ "orderBys": [] }, "added": [ - [ - "collection2/a", - 1001, - { + { + "key": "collection2/a", + "version": 1001, + "value": { "b": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1063,13 +1364,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1086,7 +1391,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1096,13 +1402,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1113,13 +1423,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1128,7 +1442,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1138,13 +1453,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1201,13 +1520,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1223,13 +1546,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1246,19 +1573,24 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] } }, { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1267,7 +1599,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1325,13 +1658,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1348,7 +1685,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1358,13 +1696,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1375,13 +1717,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1390,7 +1736,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1400,13 +1747,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1450,13 +1801,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1472,13 +1827,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1495,19 +1854,24 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] } }, { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1516,7 +1880,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1584,14 +1949,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000", "visible": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1608,7 +1977,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1624,14 +1994,18 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000", "visible": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1694,14 +2068,18 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000", "visible": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1717,14 +2095,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 3000, - { + { + "key": "collection/a", + "version": 3000, + "value": { "v": "v3000", "visible": false + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -1741,7 +2123,8 @@ }, { "watchSnapshot": { - "version": 4000 + "version": 4000, + "targetIds": [] }, "expect": [ { @@ -1751,14 +2134,18 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 3000, - { + { + "key": "collection/a", + "version": 3000, + "value": { "v": "v3000", "visible": false + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1828,14 +2215,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000", "visible": false + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removedTargets": [ 2 @@ -1852,7 +2243,8 @@ }, { "watchSnapshot": { - "version": 5000 + "version": 5000, + "targetIds": [] }, "expect": [ { @@ -1928,14 +2320,18 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 3000, - { + { + "key": "collection/a", + "version": 3000, + "value": { "v": "v3000", "visible": false + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -1966,7 +2362,8 @@ }, { "watchSnapshot": { - "version": 6000 + "version": 6000, + "targetIds": [] }, "expect": [ { @@ -2034,14 +2431,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000", "visible": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2058,7 +2459,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -2074,14 +2476,18 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000", "visible": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2144,14 +2550,18 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000", "visible": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -2167,11 +2577,11 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 3000, - null - ] + { + "key": "collection/a", + "version": 3000, + "value": null + } ], "removedTargets": [ 4 @@ -2188,7 +2598,8 @@ }, { "watchSnapshot": { - "version": 4000 + "version": 4000, + "targetIds": [] }, "expect": [ { @@ -2198,14 +2609,18 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": "v1000", "visible": true + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2275,14 +2690,18 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": "v2000", "visible": false + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "removedTargets": [ 2 @@ -2299,7 +2718,8 @@ }, { "watchSnapshot": { - "version": 5000 + "version": 5000, + "targetIds": [] }, "expect": [ { @@ -2391,7 +2811,8 @@ }, { "watchSnapshot": { - "version": 6000 + "version": 6000, + "targetIds": [] }, "expect": [ { @@ -2408,12 +2829,12 @@ } ] }, - "Deleted documents in cache are fixed": { + "Waits until Watch catches up to local deletes ": { "describeName": "Listens:", - "itName": "Deleted documents in cache are fixed", + "itName": "Waits until Watch catches up to local deletes ", "tags": [], "config": { - "useGarbageCollection": false, + "useGarbageCollection": true, "numClients": 1 }, "steps": [ @@ -2422,13 +2843,7 @@ 2, { "path": "collection", - "filters": [ - [ - "key", - "==", - "a" - ] - ], + "filters": [], "orderBys": [] } ], @@ -2437,13 +2852,7 @@ "2": { "query": { "path": "collection", - "filters": [ - [ - "key", - "==", - "a" - ] - ], + "filters": [], "orderBys": [] }, "resumeToken": "" @@ -2459,13 +2868,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { - "key": "a" + { + "key": "collection/a", + "version": 1000, + "value": { + "v": "1" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2482,29 +2895,56 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { "query": { "path": "collection", - "filters": [ - [ - "key", - "==", - "a" - ] - ], + "filters": [], "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { - "key": "a" + { + "key": "collection/a", + "version": 1000, + "value": { + "v": "1" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + }, + { + "userDelete": "collection/a", + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "removed": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "v": "1" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -2515,13 +2955,19 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - null - ] + { + "key": "collection/a", + "version": 2000, + "value": { + "v": "2" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } ], - "removedTargets": [ + "targets": [ 2 ] } @@ -2529,46 +2975,112 @@ { "watchSnapshot": { "version": 2000, - "targetIds": [ + "targetIds": [] + } + }, + { + "writeAck": { + "version": 4000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/a" + ], + "rejectedDocs": [] + } + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 3000, + "value": { + "v": "3" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ 2 + ] + } + }, + { + "watchSnapshot": { + "version": 3000, + "targetIds": [] + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 5000, + "value": { + "v": "5" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } ], - "resumeToken": "resume-token-2000" + "targets": [ + 2 + ] } }, { "watchSnapshot": { - "version": 2000 + "version": 5000, + "targetIds": [] }, "expect": [ { "query": { "path": "collection", - "filters": [ - [ - "key", - "==", - "a" - ] - ], + "filters": [], "orderBys": [] }, - "removed": [ - [ - "collection/a", - 1000, - { - "key": "a" + "added": [ + { + "key": "collection/a", + "version": 5000, + "value": { + "v": "5" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, "hasPendingWrites": false } ] - }, + } + ] + }, + "Deleted documents in cache are fixed": { + "describeName": "Listens:", + "itName": "Deleted documents in cache are fixed", + "tags": [], + "config": { + "useGarbageCollection": false, + "numClients": 1 + }, + "steps": [ { - "userUnlisten": [ + "userListen": [ 2, { "path": "collection", @@ -2582,32 +3094,18 @@ "orderBys": [] } ], - "stateExpect": { - "activeTargets": {} - } - }, - { - "watchRemove": { - "targetIds": [ - 2 - ] - } - }, - { - "userListen": [ - 4, - { - "path": "collection", - "filters": [], - "orderBys": [] - } - ], "stateExpect": { "activeTargets": { - "4": { + "2": { "query": { "path": "collection", - "filters": [], + "filters": [ + [ + "key", + "==", + "a" + ] + ], "orderBys": [] }, "resumeToken": "" @@ -2617,53 +3115,240 @@ }, { "watchAck": [ - 4 + 2 ] }, { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ - 4 + 2 ] } }, { "watchCurrent": [ [ - 4 + 2 ], - "resume-token-3000" + "resume-token-1000" ] }, { "watchSnapshot": { - "version": 3000 + "version": 1000, + "targetIds": [] }, "expect": [ { "query": { "path": "collection", - "filters": [], + "filters": [ + [ + "key", + "==", + "a" + ] + ], "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 2000, + "value": null + } + ], + "removedTargets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [ + 2 + ], + "resumeToken": "resume-token-2000" + } + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [ + [ + "key", + "==", + "a" + ] + ], + "orderBys": [] + }, + "removed": [ + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + }, + { + "userUnlisten": [ + 2, + { + "path": "collection", + "filters": [ + [ + "key", + "==", + "a" ] ], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": {} + } + }, + { + "watchRemove": { + "targetIds": [ + 2 + ] + } + }, + { + "userListen": [ + 4, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "4": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + } + }, + { + "watchAck": [ + 4 + ] + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 4 + ] + } + }, + { + "watchCurrent": [ + [ + 4 + ], + "resume-token-3000" + ] + }, + { + "watchSnapshot": { + "version": 3000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], "errorCode": 0, "fromCache": false, "hasPendingWrites": false @@ -2712,13 +3397,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2735,7 +3424,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -2745,13 +3435,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2802,13 +3496,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2825,7 +3523,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -2835,13 +3534,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2890,20 +3593,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2920,7 +3631,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -2930,20 +3642,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3000,20 +3720,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1000, - { + }, + { + "key": "collection/b", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3063,13 +3791,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3092,7 +3824,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -3102,13 +3835,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3165,13 +3902,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 1000, - { + { + "key": "collection/b", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3220,13 +3961,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3243,7 +3988,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -3253,13 +3999,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3316,13 +4066,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3338,11 +4092,11 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - null - ] + { + "key": "collection/a", + "version": 2000, + "value": null + } ], "removedTargets": [ 2 @@ -3359,7 +4113,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -3369,13 +4124,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3424,13 +4183,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3447,7 +4210,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -3457,13 +4221,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3487,13 +4255,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3502,7 +4274,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] } }, { @@ -3541,13 +4314,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3596,13 +4373,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3611,7 +4392,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -3621,13 +4403,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3645,7 +4431,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -3702,13 +4489,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -3819,7 +4610,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -3890,7 +4682,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -3908,13 +4701,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3932,7 +4729,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -3942,13 +4740,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4005,13 +4807,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -4042,7 +4848,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "expect": [ { @@ -4098,13 +4905,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -4121,7 +4932,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -4131,13 +4943,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4201,13 +5017,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -4230,7 +5050,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "expect": [ { @@ -4288,13 +5109,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -4311,7 +5136,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -4321,13 +5147,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4378,13 +5208,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -4407,7 +5241,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "expect": [ { @@ -4465,13 +5300,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -4488,7 +5327,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -4498,13 +5338,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4555,13 +5399,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -4584,7 +5432,8 @@ }, { "watchSnapshot": { - "version": 300002000 + "version": 300002000, + "targetIds": [] }, "expect": [ { @@ -4674,13 +5523,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -4690,7 +5543,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -4704,13 +5558,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -4734,7 +5592,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 0 }, @@ -4809,13 +5668,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -4834,7 +5697,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -4844,13 +5708,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4892,13 +5760,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4940,13 +5812,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4962,13 +5838,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -4978,7 +5858,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -4988,13 +5869,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5013,13 +5898,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5038,13 +5927,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5125,13 +6018,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5150,7 +6047,8 @@ }, { "watchSnapshot": { - "version": 100 + "version": 100, + "targetIds": [] }, "clientIndex": 0 }, @@ -5164,13 +6062,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5186,13 +6088,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5202,7 +6108,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 0 }, @@ -5235,20 +6142,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 2000, - { + }, + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5260,13 +6175,17 @@ { "watchEntity": { "docs": [ - [ - "collection/c", - 3000, - { + { + "key": "collection/c", + "version": 3000, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5276,7 +6195,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "expect": [ { @@ -5286,13 +6206,17 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 3000, - { + { + "key": "collection/c", + "version": 3000, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5311,13 +6235,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5330,13 +6258,17 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 3000, - { + { + "key": "collection/c", + "version": 3000, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5451,13 +6383,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5476,7 +6412,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -5494,13 +6431,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5519,13 +6460,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5589,13 +6534,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5614,7 +6563,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -5624,13 +6574,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5672,13 +6626,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5717,13 +6675,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5733,7 +6695,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 0 }, @@ -5747,13 +6710,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5858,13 +6825,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5883,7 +6854,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -5897,13 +6869,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5974,13 +6950,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -6014,13 +6994,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -6039,7 +7023,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 0 }, @@ -6053,13 +7038,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -6325,7 +7314,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -6437,7 +7427,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -6531,7 +7522,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 0 }, @@ -6617,7 +7609,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -6844,7 +7837,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -6982,7 +7976,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 2 }, @@ -7110,7 +8105,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -7145,13 +8141,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -7161,7 +8161,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 0 }, @@ -7175,13 +8176,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7389,13 +8394,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -7414,7 +8423,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -7428,13 +8438,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7476,13 +8490,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7533,13 +8551,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -7558,7 +8580,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -7568,13 +8591,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7593,13 +8620,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7660,13 +8691,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -7685,7 +8720,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -7695,13 +8731,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7747,13 +8787,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7804,13 +8848,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -7829,7 +8877,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 1 }, @@ -7843,13 +8892,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7910,13 +8963,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -7935,7 +8992,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -7945,13 +9003,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7993,13 +9055,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -8036,13 +9102,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -8061,7 +9131,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -8071,13 +9142,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -8097,13 +9172,17 @@ { "watchEntity": { "docs": [ - [ - "collection/c", - 3000, - { + { + "key": "collection/c", + "version": 3000, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -8113,7 +9192,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "expect": [ { @@ -8123,13 +9203,17 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 3000, - { + { + "key": "collection/c", + "version": 3000, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -8155,20 +9239,368 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/c", - 3000, - { + }, + { + "key": "collection/c", + "version": 3000, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 0 + } + ] + }, + "Query bounces between primaries": { + "describeName": "Listens:", + "itName": "Query bounces between primaries", + "tags": [ + "multi-client" + ], + "config": { + "useGarbageCollection": false, + "numClients": 3 + }, + "steps": [ + { + "drainQueue": true, + "stateExpect": { + "isPrimary": true + }, + "clientIndex": 1 + }, + { + "drainQueue": true, + "clientIndex": 0 + }, + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "clientIndex": 0 + }, + { + "drainQueue": true, + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "clientIndex": 1 + }, + { + "watchAck": [ + 2 + ], + "clientIndex": 1 + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + }, + "clientIndex": 1 + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-1000" + ], + "clientIndex": 1 + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, + "clientIndex": 1 + }, + { + "drainQueue": true, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 0 + }, + { + "drainQueue": true, + "clientIndex": 2 + }, + { + "applyClientState": { + "primary": true + }, + "stateExpect": { + "isPrimary": true, + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "resume-token-1000" + } + } + }, + "clientIndex": 2 + }, + { + "drainQueue": true, + "clientIndex": 1 + }, + { + "runTimer": "client_metadata_refresh", + "stateExpect": { + "isPrimary": false + }, + "clientIndex": 1 + }, + { + "drainQueue": true, + "clientIndex": 2 + }, + { + "watchAck": [ + 2 + ], + "clientIndex": 2 + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/b", + "version": 2000, + "value": { + "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + }, + "clientIndex": 2 + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-2000" + ], + "clientIndex": 2 + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, + "clientIndex": 2 + }, + { + "drainQueue": true, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/b", + "version": 2000, + "value": { + "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 0 + }, + { + "drainQueue": true, + "clientIndex": 1 + }, + { + "applyClientState": { + "primary": true + }, + "stateExpect": { + "isPrimary": true, + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "resume-token-2000" + } + } + }, + "clientIndex": 1 + }, + { + "watchAck": [ + 2 + ], + "clientIndex": 1 + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/c", + "version": 3000, + "value": { + "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + }, + "clientIndex": 1 + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-2000" + ], + "clientIndex": 1 + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, + "clientIndex": 1 + }, + { + "drainQueue": true, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/c", + "version": 3000, + "value": { + "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -8266,13 +9698,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -8291,7 +9727,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -8320,13 +9757,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -8345,7 +9786,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -8355,13 +9797,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -8442,13 +9888,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -8467,7 +9917,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "clientIndex": 0 }, @@ -8481,13 +9932,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -8534,13 +9989,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -8559,7 +10018,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "clientIndex": 2 }, @@ -8573,13 +10033,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -8589,5 +10053,211 @@ "clientIndex": 1 } ] + }, + "Previous primary immediately regains primary lease": { + "describeName": "Listens:", + "itName": "Previous primary immediately regains primary lease", + "tags": [ + "multi-client" + ], + "config": { + "useGarbageCollection": false, + "numClients": 2 + }, + "steps": [ + { + "drainQueue": true, + "clientIndex": 0 + }, + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "clientIndex": 0 + }, + { + "watchAck": [ + 2 + ], + "clientIndex": 0 + }, + { + "watchEntity": { + "docs": [], + "targets": [ + 2 + ] + }, + "clientIndex": 0 + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-1000" + ], + "clientIndex": 0 + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 0 + }, + { + "drainQueue": true, + "clientIndex": 1 + }, + { + "applyClientState": { + "primary": true + }, + "stateExpect": { + "isPrimary": true, + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "resume-token-1000" + } + } + }, + "clientIndex": 1 + }, + { + "watchAck": [ + 2 + ], + "clientIndex": 1 + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 2000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + }, + "clientIndex": 1 + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-2000" + ], + "clientIndex": 1 + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, + "clientIndex": 1 + }, + { + "shutdown": true, + "stateExpect": { + "activeTargets": {}, + "limboDocs": [] + }, + "clientIndex": 1 + }, + { + "drainQueue": true, + "stateExpect": { + "isPrimary": true + }, + "clientIndex": 0 + }, + { + "runTimer": "client_metadata_refresh", + "stateExpect": { + "isPrimary": true, + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "resume-token-2000" + } + } + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 2000, + "value": { + "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 0 + } + ] } } diff --git a/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json b/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json index 1f02f28d2ce..6dc71cfeada 100644 --- a/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json @@ -318,13 +318,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -341,7 +345,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -351,13 +356,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -430,7 +439,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -486,13 +496,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -509,7 +523,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -519,13 +534,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -548,7 +567,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "stateExpect": { "limboDocs": [ @@ -647,7 +667,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] } }, { @@ -673,7 +694,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -683,13 +705,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -784,13 +810,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -807,7 +837,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -817,13 +848,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1061,7 +1096,9 @@ "Queries return from cache when network disabled": { "describeName": "Offline:", "itName": "Queries return from cache when network disabled", - "tags": ["eager-gc"], + "tags": [ + "eager-gc" + ], "config": { "useGarbageCollection": true, "numClients": 1 diff --git a/Firestore/Example/Tests/SpecTests/json/orderby_spec_test.json b/Firestore/Example/Tests/SpecTests/json/orderby_spec_test.json index 19b726a17ad..5bb59c4ee13 100644 --- a/Firestore/Example/Tests/SpecTests/json/orderby_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/orderby_spec_test.json @@ -77,15 +77,18 @@ ] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "key": "a", "sort": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -101,13 +104,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -124,7 +131,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -139,15 +147,18 @@ ] }, "added": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b", "sort": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -206,22 +217,30 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "key": "a", "sort": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 1001, - { + }, + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b", "sort": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -238,7 +257,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -253,22 +273,30 @@ ] }, "added": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b", "sort": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/a", - 0, - { + }, + { + "key": "collection/a", + "version": 0, + "value": { "key": "a", "sort": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -345,22 +373,30 @@ ] }, "added": [ - [ - "collection/b", - 1001, - { + { + "key": "collection/b", + "version": 1001, + "value": { "key": "b", "sort": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/a", - 0, - { + }, + { + "key": "collection/a", + "version": 0, + "value": { "key": "a", "sort": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -391,7 +427,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { diff --git a/Firestore/Example/Tests/SpecTests/json/perf_spec_test.json b/Firestore/Example/Tests/SpecTests/json/perf_spec_test.json index 27090a6133a..7dfb3e1fa71 100644 --- a/Firestore/Example/Tests/SpecTests/json/perf_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/perf_spec_test.json @@ -270,14 +270,17 @@ "orderBys": [] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "doc": 0 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -306,13 +309,17 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 2, - { + { + "key": "collection/0", + "version": 2, + "value": { "doc": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -329,7 +336,8 @@ }, { "watchSnapshot": { - "version": 4 + "version": 4, + "targetIds": [] }, "expect": [ { @@ -339,13 +347,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/0", - 2, - { + { + "key": "collection/0", + "version": 2, + "value": { "doc": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -410,14 +422,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1", - 0, - { + { + "key": "collection/1", + "version": 0, + "value": { "doc": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -446,13 +461,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1", - 5, - { + { + "key": "collection/1", + "version": 5, + "value": { "doc": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -469,7 +488,8 @@ }, { "watchSnapshot": { - "version": 7 + "version": 7, + "targetIds": [] }, "expect": [ { @@ -479,13 +499,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/1", - 5, - { + { + "key": "collection/1", + "version": 5, + "value": { "doc": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -550,14 +574,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2", - 0, - { + { + "key": "collection/2", + "version": 0, + "value": { "doc": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -586,13 +613,17 @@ { "watchEntity": { "docs": [ - [ - "collection/2", - 8, - { + { + "key": "collection/2", + "version": 8, + "value": { "doc": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 6 @@ -609,7 +640,8 @@ }, { "watchSnapshot": { - "version": 10 + "version": 10, + "targetIds": [] }, "expect": [ { @@ -619,13 +651,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/2", - 8, - { + { + "key": "collection/2", + "version": 8, + "value": { "doc": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -690,14 +726,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3", - 0, - { + { + "key": "collection/3", + "version": 0, + "value": { "doc": 3 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -726,13 +765,17 @@ { "watchEntity": { "docs": [ - [ - "collection/3", - 11, - { + { + "key": "collection/3", + "version": 11, + "value": { "doc": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 8 @@ -749,7 +792,8 @@ }, { "watchSnapshot": { - "version": 13 + "version": 13, + "targetIds": [] }, "expect": [ { @@ -759,13 +803,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/3", - 11, - { + { + "key": "collection/3", + "version": 11, + "value": { "doc": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -830,14 +878,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4", - 0, - { + { + "key": "collection/4", + "version": 0, + "value": { "doc": 4 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -866,13 +917,17 @@ { "watchEntity": { "docs": [ - [ - "collection/4", - 14, - { + { + "key": "collection/4", + "version": 14, + "value": { "doc": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 10 @@ -889,7 +944,8 @@ }, { "watchSnapshot": { - "version": 16 + "version": 16, + "targetIds": [] }, "expect": [ { @@ -899,13 +955,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/4", - 14, - { + { + "key": "collection/4", + "version": 14, + "value": { "doc": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -970,14 +1030,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5", - 0, - { + { + "key": "collection/5", + "version": 0, + "value": { "doc": 5 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1006,13 +1069,17 @@ { "watchEntity": { "docs": [ - [ - "collection/5", - 17, - { + { + "key": "collection/5", + "version": 17, + "value": { "doc": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 12 @@ -1029,7 +1096,8 @@ }, { "watchSnapshot": { - "version": 19 + "version": 19, + "targetIds": [] }, "expect": [ { @@ -1039,13 +1107,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/5", - 17, - { + { + "key": "collection/5", + "version": 17, + "value": { "doc": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1110,14 +1182,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6", - 0, - { + { + "key": "collection/6", + "version": 0, + "value": { "doc": 6 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1146,13 +1221,17 @@ { "watchEntity": { "docs": [ - [ - "collection/6", - 20, - { + { + "key": "collection/6", + "version": 20, + "value": { "doc": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 14 @@ -1169,7 +1248,8 @@ }, { "watchSnapshot": { - "version": 22 + "version": 22, + "targetIds": [] }, "expect": [ { @@ -1179,13 +1259,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/6", - 20, - { + { + "key": "collection/6", + "version": 20, + "value": { "doc": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1250,14 +1334,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7", - 0, - { + { + "key": "collection/7", + "version": 0, + "value": { "doc": 7 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1286,13 +1373,17 @@ { "watchEntity": { "docs": [ - [ - "collection/7", - 23, - { + { + "key": "collection/7", + "version": 23, + "value": { "doc": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 16 @@ -1309,7 +1400,8 @@ }, { "watchSnapshot": { - "version": 25 + "version": 25, + "targetIds": [] }, "expect": [ { @@ -1319,13 +1411,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/7", - 23, - { + { + "key": "collection/7", + "version": 23, + "value": { "doc": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1390,14 +1486,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8", - 0, - { + { + "key": "collection/8", + "version": 0, + "value": { "doc": 8 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1426,13 +1525,17 @@ { "watchEntity": { "docs": [ - [ - "collection/8", - 26, - { + { + "key": "collection/8", + "version": 26, + "value": { "doc": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 18 @@ -1449,7 +1552,8 @@ }, { "watchSnapshot": { - "version": 28 + "version": 28, + "targetIds": [] }, "expect": [ { @@ -1459,13 +1563,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/8", - 26, - { + { + "key": "collection/8", + "version": 26, + "value": { "doc": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1530,14 +1638,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9", - 0, - { + { + "key": "collection/9", + "version": 0, + "value": { "doc": 9 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1566,13 +1677,17 @@ { "watchEntity": { "docs": [ - [ - "collection/9", - 29, - { + { + "key": "collection/9", + "version": 29, + "value": { "doc": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 20 @@ -1589,7 +1704,8 @@ }, { "watchSnapshot": { - "version": 31 + "version": 31, + "targetIds": [] }, "expect": [ { @@ -1599,13 +1715,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/9", - 29, - { + { + "key": "collection/9", + "version": 29, + "value": { "doc": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2490,806 +2610,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3359,806 +3779,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4228,806 +4948,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5097,806 +6117,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5966,806 +7286,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -6835,806 +8455,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -7704,806 +9624,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8573,806 +10793,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -9442,806 +11962,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { "v": 19 }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -10311,806 +13131,1106 @@ ] }, "added": [ - [ - "collection/0", - 0, - { + { + "key": "collection/0", + "version": 0, + "value": { "v": 0 }, - "local" - ], - [ - "collection/1", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/1", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/2", + "version": 0, + "value": { "v": 2 }, - "local" - ], - [ - "collection/3", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/3", + "version": 0, + "value": { "v": 3 }, - "local" - ], - [ - "collection/4", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4", + "version": 0, + "value": { "v": 4 }, - "local" - ], - [ - "collection/5", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/5", + "version": 0, + "value": { "v": 5 }, - "local" - ], - [ - "collection/6", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/6", + "version": 0, + "value": { "v": 6 }, - "local" - ], - [ - "collection/7", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/7", + "version": 0, + "value": { "v": 7 }, - "local" - ], - [ - "collection/8", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/8", + "version": 0, + "value": { "v": 8 }, - "local" - ], - [ - "collection/9", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/9", + "version": 0, + "value": { "v": 9 }, - "local" - ], - [ - "collection/10", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/10", + "version": 0, + "value": { "v": 10 }, - "local" - ], - [ - "collection/11", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/11", + "version": 0, + "value": { "v": 11 }, - "local" - ], - [ - "collection/12", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/12", + "version": 0, + "value": { "v": 12 }, - "local" - ], - [ - "collection/13", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/13", + "version": 0, + "value": { "v": 13 }, - "local" - ], - [ - "collection/14", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/14", + "version": 0, + "value": { "v": 14 }, - "local" - ], - [ - "collection/15", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/15", + "version": 0, + "value": { "v": 15 }, - "local" - ], - [ - "collection/16", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/16", + "version": 0, + "value": { "v": 16 }, - "local" - ], - [ - "collection/17", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/17", + "version": 0, + "value": { "v": 17 }, - "local" - ], - [ - "collection/18", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/18", + "version": 0, + "value": { "v": 18 }, - "local" - ], - [ - "collection/19", - 0, - { - "v": 19 - }, - "local" - ], - [ - "collection/20", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/19", + "version": 0, + "value": { + "v": 19 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/20", + "version": 0, + "value": { "v": 20 }, - "local" - ], - [ - "collection/21", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/21", + "version": 0, + "value": { "v": 21 }, - "local" - ], - [ - "collection/22", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/22", + "version": 0, + "value": { "v": 22 }, - "local" - ], - [ - "collection/23", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/23", + "version": 0, + "value": { "v": 23 }, - "local" - ], - [ - "collection/24", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/24", + "version": 0, + "value": { "v": 24 }, - "local" - ], - [ - "collection/25", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/25", + "version": 0, + "value": { "v": 25 }, - "local" - ], - [ - "collection/26", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/26", + "version": 0, + "value": { "v": 26 }, - "local" - ], - [ - "collection/27", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/27", + "version": 0, + "value": { "v": 27 }, - "local" - ], - [ - "collection/28", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/28", + "version": 0, + "value": { "v": 28 }, - "local" - ], - [ - "collection/29", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/29", + "version": 0, + "value": { "v": 29 }, - "local" - ], - [ - "collection/30", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/30", + "version": 0, + "value": { "v": 30 }, - "local" - ], - [ - "collection/31", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/31", + "version": 0, + "value": { "v": 31 }, - "local" - ], - [ - "collection/32", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/32", + "version": 0, + "value": { "v": 32 }, - "local" - ], - [ - "collection/33", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/33", + "version": 0, + "value": { "v": 33 }, - "local" - ], - [ - "collection/34", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/34", + "version": 0, + "value": { "v": 34 }, - "local" - ], - [ - "collection/35", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/35", + "version": 0, + "value": { "v": 35 }, - "local" - ], - [ - "collection/36", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/36", + "version": 0, + "value": { "v": 36 }, - "local" - ], - [ - "collection/37", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/37", + "version": 0, + "value": { "v": 37 }, - "local" - ], - [ - "collection/38", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/38", + "version": 0, + "value": { "v": 38 }, - "local" - ], - [ - "collection/39", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/39", + "version": 0, + "value": { "v": 39 }, - "local" - ], - [ - "collection/40", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/40", + "version": 0, + "value": { "v": 40 }, - "local" - ], - [ - "collection/41", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/41", + "version": 0, + "value": { "v": 41 }, - "local" - ], - [ - "collection/42", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/42", + "version": 0, + "value": { "v": 42 }, - "local" - ], - [ - "collection/43", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/43", + "version": 0, + "value": { "v": 43 }, - "local" - ], - [ - "collection/44", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/44", + "version": 0, + "value": { "v": 44 }, - "local" - ], - [ - "collection/45", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/45", + "version": 0, + "value": { "v": 45 }, - "local" - ], - [ - "collection/46", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/46", + "version": 0, + "value": { "v": 46 }, - "local" - ], - [ - "collection/47", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/47", + "version": 0, + "value": { "v": 47 }, - "local" - ], - [ - "collection/48", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/48", + "version": 0, + "value": { "v": 48 }, - "local" - ], - [ - "collection/49", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/49", + "version": 0, + "value": { "v": 49 }, - "local" - ], - [ - "collection/50", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/50", + "version": 0, + "value": { "v": 50 }, - "local" - ], - [ - "collection/51", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/51", + "version": 0, + "value": { "v": 51 }, - "local" - ], - [ - "collection/52", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/52", + "version": 0, + "value": { "v": 52 }, - "local" - ], - [ - "collection/53", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/53", + "version": 0, + "value": { "v": 53 }, - "local" - ], - [ - "collection/54", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/54", + "version": 0, + "value": { "v": 54 }, - "local" - ], - [ - "collection/55", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/55", + "version": 0, + "value": { "v": 55 }, - "local" - ], - [ - "collection/56", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/56", + "version": 0, + "value": { "v": 56 }, - "local" - ], - [ - "collection/57", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/57", + "version": 0, + "value": { "v": 57 }, - "local" - ], - [ - "collection/58", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/58", + "version": 0, + "value": { "v": 58 }, - "local" - ], - [ - "collection/59", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/59", + "version": 0, + "value": { "v": 59 }, - "local" - ], - [ - "collection/60", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/60", + "version": 0, + "value": { "v": 60 }, - "local" - ], - [ - "collection/61", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/61", + "version": 0, + "value": { "v": 61 }, - "local" - ], - [ - "collection/62", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/62", + "version": 0, + "value": { "v": 62 }, - "local" - ], - [ - "collection/63", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/63", + "version": 0, + "value": { "v": 63 }, - "local" - ], - [ - "collection/64", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/64", + "version": 0, + "value": { "v": 64 }, - "local" - ], - [ - "collection/65", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/65", + "version": 0, + "value": { "v": 65 }, - "local" - ], - [ - "collection/66", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/66", + "version": 0, + "value": { "v": 66 }, - "local" - ], - [ - "collection/67", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/67", + "version": 0, + "value": { "v": 67 }, - "local" - ], - [ - "collection/68", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/68", + "version": 0, + "value": { "v": 68 }, - "local" - ], - [ - "collection/69", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/69", + "version": 0, + "value": { "v": 69 }, - "local" - ], - [ - "collection/70", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/70", + "version": 0, + "value": { "v": 70 }, - "local" - ], - [ - "collection/71", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/71", + "version": 0, + "value": { "v": 71 }, - "local" - ], - [ - "collection/72", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/72", + "version": 0, + "value": { "v": 72 }, - "local" - ], - [ - "collection/73", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/73", + "version": 0, + "value": { "v": 73 }, - "local" - ], - [ - "collection/74", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/74", + "version": 0, + "value": { "v": 74 }, - "local" - ], - [ - "collection/75", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/75", + "version": 0, + "value": { "v": 75 }, - "local" - ], - [ - "collection/76", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/76", + "version": 0, + "value": { "v": 76 }, - "local" - ], - [ - "collection/77", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/77", + "version": 0, + "value": { "v": 77 }, - "local" - ], - [ - "collection/78", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/78", + "version": 0, + "value": { "v": 78 }, - "local" - ], - [ - "collection/79", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/79", + "version": 0, + "value": { "v": 79 }, - "local" - ], - [ - "collection/80", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/80", + "version": 0, + "value": { "v": 80 }, - "local" - ], - [ - "collection/81", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/81", + "version": 0, + "value": { "v": 81 }, - "local" - ], - [ - "collection/82", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/82", + "version": 0, + "value": { "v": 82 }, - "local" - ], - [ - "collection/83", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/83", + "version": 0, + "value": { "v": 83 }, - "local" - ], - [ - "collection/84", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/84", + "version": 0, + "value": { "v": 84 }, - "local" - ], - [ - "collection/85", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/85", + "version": 0, + "value": { "v": 85 }, - "local" - ], - [ - "collection/86", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/86", + "version": 0, + "value": { "v": 86 }, - "local" - ], - [ - "collection/87", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/87", + "version": 0, + "value": { "v": 87 }, - "local" - ], - [ - "collection/88", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/88", + "version": 0, + "value": { "v": 88 }, - "local" - ], - [ - "collection/89", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/89", + "version": 0, + "value": { "v": 89 }, - "local" - ], - [ - "collection/90", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/90", + "version": 0, + "value": { "v": 90 }, - "local" - ], - [ - "collection/91", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/91", + "version": 0, + "value": { "v": 91 }, - "local" - ], - [ - "collection/92", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/92", + "version": 0, + "value": { "v": 92 }, - "local" - ], - [ - "collection/93", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/93", + "version": 0, + "value": { "v": 93 }, - "local" - ], - [ - "collection/94", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/94", + "version": 0, + "value": { "v": 94 }, - "local" - ], - [ - "collection/95", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/95", + "version": 0, + "value": { "v": 95 }, - "local" - ], - [ - "collection/96", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/96", + "version": 0, + "value": { "v": 96 }, - "local" - ], - [ - "collection/97", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/97", + "version": 0, + "value": { "v": 97 }, - "local" - ], - [ - "collection/98", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/98", + "version": 0, + "value": { "v": 98 }, - "local" - ], - [ - "collection/99", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/99", + "version": 0, + "value": { "v": 99 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -11417,14 +14537,17 @@ "orderBys": [] }, "added": [ - [ - "collection/doc", - 0, - { + { + "key": "collection/doc", + "version": 0, + "value": { "v": 0 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -11453,13 +14576,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 2, - { + { + "key": "collection/doc", + "version": 2, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -11476,7 +14603,8 @@ }, { "watchSnapshot": { - "version": 4 + "version": 4, + "targetIds": [] }, "expect": [ { @@ -11486,13 +14614,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 2, - { + { + "key": "collection/doc", + "version": 2, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -11515,14 +14647,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 2, - { + { + "key": "collection/doc", + "version": 2, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -11546,13 +14681,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 5, - { + { + "key": "collection/doc", + "version": 5, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -11561,7 +14700,8 @@ }, { "watchSnapshot": { - "version": 7 + "version": 7, + "targetIds": [] }, "expect": [ { @@ -11571,13 +14711,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 5, - { + { + "key": "collection/doc", + "version": 5, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -11600,14 +14744,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 5, - { + { + "key": "collection/doc", + "version": 5, + "value": { "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -11631,13 +14778,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 8, - { + { + "key": "collection/doc", + "version": 8, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -11646,7 +14797,8 @@ }, { "watchSnapshot": { - "version": 10 + "version": 10, + "targetIds": [] }, "expect": [ { @@ -11656,13 +14808,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 8, - { + { + "key": "collection/doc", + "version": 8, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -11685,14 +14841,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 8, - { + { + "key": "collection/doc", + "version": 8, + "value": { "v": 3 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -11716,13 +14875,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 11, - { + { + "key": "collection/doc", + "version": 11, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -11731,7 +14894,8 @@ }, { "watchSnapshot": { - "version": 13 + "version": 13, + "targetIds": [] }, "expect": [ { @@ -11741,13 +14905,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 11, - { + { + "key": "collection/doc", + "version": 11, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -11770,14 +14938,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 11, - { + { + "key": "collection/doc", + "version": 11, + "value": { "v": 4 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -11801,13 +14972,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 14, - { + { + "key": "collection/doc", + "version": 14, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -11816,7 +14991,8 @@ }, { "watchSnapshot": { - "version": 16 + "version": 16, + "targetIds": [] }, "expect": [ { @@ -11826,13 +15002,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 14, - { + { + "key": "collection/doc", + "version": 14, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -11855,14 +15035,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 14, - { + { + "key": "collection/doc", + "version": 14, + "value": { "v": 5 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -11886,13 +15069,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 17, - { + { + "key": "collection/doc", + "version": 17, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -11901,7 +15088,8 @@ }, { "watchSnapshot": { - "version": 19 + "version": 19, + "targetIds": [] }, "expect": [ { @@ -11911,13 +15099,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 17, - { + { + "key": "collection/doc", + "version": 17, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -11940,14 +15132,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 17, - { + { + "key": "collection/doc", + "version": 17, + "value": { "v": 6 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -11971,13 +15166,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 20, - { + { + "key": "collection/doc", + "version": 20, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -11986,7 +15185,8 @@ }, { "watchSnapshot": { - "version": 22 + "version": 22, + "targetIds": [] }, "expect": [ { @@ -11996,13 +15196,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 20, - { + { + "key": "collection/doc", + "version": 20, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -12025,14 +15229,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 20, - { + { + "key": "collection/doc", + "version": 20, + "value": { "v": 7 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -12056,13 +15263,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 23, - { + { + "key": "collection/doc", + "version": 23, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -12071,7 +15282,8 @@ }, { "watchSnapshot": { - "version": 25 + "version": 25, + "targetIds": [] }, "expect": [ { @@ -12081,13 +15293,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 23, - { + { + "key": "collection/doc", + "version": 23, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -12110,14 +15326,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 23, - { + { + "key": "collection/doc", + "version": 23, + "value": { "v": 8 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -12141,13 +15360,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 26, - { + { + "key": "collection/doc", + "version": 26, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -12156,7 +15379,8 @@ }, { "watchSnapshot": { - "version": 28 + "version": 28, + "targetIds": [] }, "expect": [ { @@ -12166,13 +15390,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 26, - { + { + "key": "collection/doc", + "version": 26, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -12195,14 +15423,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 26, - { + { + "key": "collection/doc", + "version": 26, + "value": { "v": 9 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -12226,13 +15457,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 29, - { + { + "key": "collection/doc", + "version": 29, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -12241,7 +15476,8 @@ }, { "watchSnapshot": { - "version": 31 + "version": 31, + "targetIds": [] }, "expect": [ { @@ -12251,13 +15487,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 29, - { + { + "key": "collection/doc", + "version": 29, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -12280,14 +15520,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 29, - { + { + "key": "collection/doc", + "version": 29, + "value": { "v": 10 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -12311,13 +15554,17 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 32, - { + { + "key": "collection/doc", + "version": 32, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -12326,7 +15573,8 @@ }, { "watchSnapshot": { - "version": 34 + "version": 34, + "targetIds": [] }, "expect": [ { @@ -12336,13 +15584,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 32, - { + { + "key": "collection/doc", + "version": 32, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -12418,7 +15670,8 @@ }, { "watchSnapshot": { - "version": 1 + "version": 1, + "targetIds": [] }, "expect": [ { @@ -12441,706 +15694,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 2, - { + { + "key": "collection/0", + "version": 2, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 3, - { + }, + { + "key": "collection/1", + "version": 3, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 4, - { + }, + { + "key": "collection/2", + "version": 4, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 5, - { + }, + { + "key": "collection/3", + "version": 5, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 6, - { + }, + { + "key": "collection/4", + "version": 6, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 7, - { + }, + { + "key": "collection/5", + "version": 7, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 8, - { + }, + { + "key": "collection/6", + "version": 8, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 9, - { + }, + { + "key": "collection/7", + "version": 9, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 10, - { + }, + { + "key": "collection/8", + "version": 10, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 11, - { + }, + { + "key": "collection/9", + "version": 11, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 12, - { + }, + { + "key": "collection/10", + "version": 12, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 13, - { + }, + { + "key": "collection/11", + "version": 13, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 14, - { + }, + { + "key": "collection/12", + "version": 14, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 15, - { + }, + { + "key": "collection/13", + "version": 15, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 16, - { + }, + { + "key": "collection/14", + "version": 16, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 17, - { + }, + { + "key": "collection/15", + "version": 17, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 18, - { + }, + { + "key": "collection/16", + "version": 18, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 19, - { + }, + { + "key": "collection/17", + "version": 19, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 20, - { + }, + { + "key": "collection/18", + "version": 20, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 21, - { + }, + { + "key": "collection/19", + "version": 21, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 22, - { + }, + { + "key": "collection/20", + "version": 22, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 23, - { + }, + { + "key": "collection/21", + "version": 23, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 24, - { + }, + { + "key": "collection/22", + "version": 24, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 25, - { + }, + { + "key": "collection/23", + "version": 25, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 26, - { + }, + { + "key": "collection/24", + "version": 26, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 27, - { + }, + { + "key": "collection/25", + "version": 27, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 28, - { + }, + { + "key": "collection/26", + "version": 28, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 29, - { + }, + { + "key": "collection/27", + "version": 29, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 30, - { + }, + { + "key": "collection/28", + "version": 30, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 31, - { + }, + { + "key": "collection/29", + "version": 31, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 32, - { + }, + { + "key": "collection/30", + "version": 32, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 33, - { + }, + { + "key": "collection/31", + "version": 33, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 34, - { + }, + { + "key": "collection/32", + "version": 34, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 35, - { + }, + { + "key": "collection/33", + "version": 35, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 36, - { + }, + { + "key": "collection/34", + "version": 36, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 37, - { + }, + { + "key": "collection/35", + "version": 37, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 38, - { + }, + { + "key": "collection/36", + "version": 38, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 39, - { + }, + { + "key": "collection/37", + "version": 39, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 40, - { + }, + { + "key": "collection/38", + "version": 40, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 41, - { + }, + { + "key": "collection/39", + "version": 41, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 42, - { + }, + { + "key": "collection/40", + "version": 42, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 43, - { + }, + { + "key": "collection/41", + "version": 43, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 44, - { + }, + { + "key": "collection/42", + "version": 44, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 45, - { + }, + { + "key": "collection/43", + "version": 45, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 46, - { + }, + { + "key": "collection/44", + "version": 46, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 47, - { + }, + { + "key": "collection/45", + "version": 47, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 48, - { + }, + { + "key": "collection/46", + "version": 48, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 49, - { + }, + { + "key": "collection/47", + "version": 49, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 50, - { + }, + { + "key": "collection/48", + "version": 50, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 51, - { + }, + { + "key": "collection/49", + "version": 51, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 52, - { + }, + { + "key": "collection/50", + "version": 52, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 53, - { + }, + { + "key": "collection/51", + "version": 53, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 54, - { + }, + { + "key": "collection/52", + "version": 54, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 55, - { + }, + { + "key": "collection/53", + "version": 55, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 56, - { + }, + { + "key": "collection/54", + "version": 56, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 57, - { + }, + { + "key": "collection/55", + "version": 57, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 58, - { + }, + { + "key": "collection/56", + "version": 58, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 59, - { + }, + { + "key": "collection/57", + "version": 59, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 60, - { + }, + { + "key": "collection/58", + "version": 60, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 61, - { + }, + { + "key": "collection/59", + "version": 61, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 62, - { + }, + { + "key": "collection/60", + "version": 62, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 63, - { + }, + { + "key": "collection/61", + "version": 63, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 64, - { + }, + { + "key": "collection/62", + "version": 64, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 65, - { + }, + { + "key": "collection/63", + "version": 65, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 66, - { + }, + { + "key": "collection/64", + "version": 66, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 67, - { + }, + { + "key": "collection/65", + "version": 67, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 68, - { + }, + { + "key": "collection/66", + "version": 68, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 69, - { + }, + { + "key": "collection/67", + "version": 69, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 70, - { + }, + { + "key": "collection/68", + "version": 70, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 71, - { + }, + { + "key": "collection/69", + "version": 71, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 72, - { + }, + { + "key": "collection/70", + "version": 72, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 73, - { + }, + { + "key": "collection/71", + "version": 73, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 74, - { + }, + { + "key": "collection/72", + "version": 74, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 75, - { + }, + { + "key": "collection/73", + "version": 75, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 76, - { + }, + { + "key": "collection/74", + "version": 76, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 77, - { + }, + { + "key": "collection/75", + "version": 77, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 78, - { + }, + { + "key": "collection/76", + "version": 78, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 79, - { + }, + { + "key": "collection/77", + "version": 79, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 80, - { + }, + { + "key": "collection/78", + "version": 80, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 81, - { + }, + { + "key": "collection/79", + "version": 81, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 82, - { + }, + { + "key": "collection/80", + "version": 82, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 83, - { + }, + { + "key": "collection/81", + "version": 83, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 84, - { + }, + { + "key": "collection/82", + "version": 84, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 85, - { + }, + { + "key": "collection/83", + "version": 85, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 86, - { + }, + { + "key": "collection/84", + "version": 86, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 87, - { + }, + { + "key": "collection/85", + "version": 87, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 88, - { + }, + { + "key": "collection/86", + "version": 88, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 89, - { + }, + { + "key": "collection/87", + "version": 89, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 90, - { + }, + { + "key": "collection/88", + "version": 90, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 91, - { + }, + { + "key": "collection/89", + "version": 91, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 92, - { + }, + { + "key": "collection/90", + "version": 92, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 93, - { + }, + { + "key": "collection/91", + "version": 93, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 94, - { + }, + { + "key": "collection/92", + "version": 94, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 95, - { + }, + { + "key": "collection/93", + "version": 95, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 96, - { + }, + { + "key": "collection/94", + "version": 96, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 97, - { + }, + { + "key": "collection/95", + "version": 97, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 98, - { + }, + { + "key": "collection/96", + "version": 98, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 99, - { + }, + { + "key": "collection/97", + "version": 99, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 100, - { + }, + { + "key": "collection/98", + "version": 100, + "value": { "v": 100 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 101, - { + }, + { + "key": "collection/99", + "version": 101, + "value": { "v": 101 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -13149,7 +16802,8 @@ }, { "watchSnapshot": { - "version": 102 + "version": 102, + "targetIds": [] }, "expect": [ { @@ -13164,706 +16818,1106 @@ ] }, "added": [ - [ - "collection/0", - 2, - { + { + "key": "collection/0", + "version": 2, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 3, - { + }, + { + "key": "collection/1", + "version": 3, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 4, - { + }, + { + "key": "collection/2", + "version": 4, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 5, - { + }, + { + "key": "collection/3", + "version": 5, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 6, - { + }, + { + "key": "collection/4", + "version": 6, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 7, - { + }, + { + "key": "collection/5", + "version": 7, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 8, - { + }, + { + "key": "collection/6", + "version": 8, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 9, - { + }, + { + "key": "collection/7", + "version": 9, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 10, - { + }, + { + "key": "collection/8", + "version": 10, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 11, - { + }, + { + "key": "collection/9", + "version": 11, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 12, - { + }, + { + "key": "collection/10", + "version": 12, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 13, - { + }, + { + "key": "collection/11", + "version": 13, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 14, - { + }, + { + "key": "collection/12", + "version": 14, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 15, - { + }, + { + "key": "collection/13", + "version": 15, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 16, - { + }, + { + "key": "collection/14", + "version": 16, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 17, - { + }, + { + "key": "collection/15", + "version": 17, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 18, - { + }, + { + "key": "collection/16", + "version": 18, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 19, - { + }, + { + "key": "collection/17", + "version": 19, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 20, - { + }, + { + "key": "collection/18", + "version": 20, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 21, - { + }, + { + "key": "collection/19", + "version": 21, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 22, - { + }, + { + "key": "collection/20", + "version": 22, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 23, - { + }, + { + "key": "collection/21", + "version": 23, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 24, - { + }, + { + "key": "collection/22", + "version": 24, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 25, - { + }, + { + "key": "collection/23", + "version": 25, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 26, - { + }, + { + "key": "collection/24", + "version": 26, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 27, - { + }, + { + "key": "collection/25", + "version": 27, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 28, - { + }, + { + "key": "collection/26", + "version": 28, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 29, - { + }, + { + "key": "collection/27", + "version": 29, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 30, - { + }, + { + "key": "collection/28", + "version": 30, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 31, - { + }, + { + "key": "collection/29", + "version": 31, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 32, - { + }, + { + "key": "collection/30", + "version": 32, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 33, - { + }, + { + "key": "collection/31", + "version": 33, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 34, - { + }, + { + "key": "collection/32", + "version": 34, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 35, - { + }, + { + "key": "collection/33", + "version": 35, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 36, - { + }, + { + "key": "collection/34", + "version": 36, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 37, - { + }, + { + "key": "collection/35", + "version": 37, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 38, - { + }, + { + "key": "collection/36", + "version": 38, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 39, - { + }, + { + "key": "collection/37", + "version": 39, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 40, - { + }, + { + "key": "collection/38", + "version": 40, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 41, - { + }, + { + "key": "collection/39", + "version": 41, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 42, - { + }, + { + "key": "collection/40", + "version": 42, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 43, - { + }, + { + "key": "collection/41", + "version": 43, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 44, - { + }, + { + "key": "collection/42", + "version": 44, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 45, - { + }, + { + "key": "collection/43", + "version": 45, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 46, - { + }, + { + "key": "collection/44", + "version": 46, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 47, - { + }, + { + "key": "collection/45", + "version": 47, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 48, - { + }, + { + "key": "collection/46", + "version": 48, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 49, - { + }, + { + "key": "collection/47", + "version": 49, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 50, - { + }, + { + "key": "collection/48", + "version": 50, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 51, - { + }, + { + "key": "collection/49", + "version": 51, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 52, - { + }, + { + "key": "collection/50", + "version": 52, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 53, - { + }, + { + "key": "collection/51", + "version": 53, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 54, - { + }, + { + "key": "collection/52", + "version": 54, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 55, - { + }, + { + "key": "collection/53", + "version": 55, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 56, - { + }, + { + "key": "collection/54", + "version": 56, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 57, - { + }, + { + "key": "collection/55", + "version": 57, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 58, - { + }, + { + "key": "collection/56", + "version": 58, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 59, - { + }, + { + "key": "collection/57", + "version": 59, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 60, - { + }, + { + "key": "collection/58", + "version": 60, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 61, - { + }, + { + "key": "collection/59", + "version": 61, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 62, - { + }, + { + "key": "collection/60", + "version": 62, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 63, - { + }, + { + "key": "collection/61", + "version": 63, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 64, - { + }, + { + "key": "collection/62", + "version": 64, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 65, - { + }, + { + "key": "collection/63", + "version": 65, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 66, - { + }, + { + "key": "collection/64", + "version": 66, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 67, - { + }, + { + "key": "collection/65", + "version": 67, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 68, - { + }, + { + "key": "collection/66", + "version": 68, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 69, - { + }, + { + "key": "collection/67", + "version": 69, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 70, - { + }, + { + "key": "collection/68", + "version": 70, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 71, - { + }, + { + "key": "collection/69", + "version": 71, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 72, - { + }, + { + "key": "collection/70", + "version": 72, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 73, - { + }, + { + "key": "collection/71", + "version": 73, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 74, - { + }, + { + "key": "collection/72", + "version": 74, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 75, - { + }, + { + "key": "collection/73", + "version": 75, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 76, - { + }, + { + "key": "collection/74", + "version": 76, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 77, - { + }, + { + "key": "collection/75", + "version": 77, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 78, - { + }, + { + "key": "collection/76", + "version": 78, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 79, - { + }, + { + "key": "collection/77", + "version": 79, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 80, - { + }, + { + "key": "collection/78", + "version": 80, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 81, - { + }, + { + "key": "collection/79", + "version": 81, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 82, - { + }, + { + "key": "collection/80", + "version": 82, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 83, - { + }, + { + "key": "collection/81", + "version": 83, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 84, - { + }, + { + "key": "collection/82", + "version": 84, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 85, - { + }, + { + "key": "collection/83", + "version": 85, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 86, - { + }, + { + "key": "collection/84", + "version": 86, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 87, - { + }, + { + "key": "collection/85", + "version": 87, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 88, - { + }, + { + "key": "collection/86", + "version": 88, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 89, - { + }, + { + "key": "collection/87", + "version": 89, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 90, - { + }, + { + "key": "collection/88", + "version": 90, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 91, - { + }, + { + "key": "collection/89", + "version": 91, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 92, - { + }, + { + "key": "collection/90", + "version": 92, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 93, - { + }, + { + "key": "collection/91", + "version": 93, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 94, - { + }, + { + "key": "collection/92", + "version": 94, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 95, - { + }, + { + "key": "collection/93", + "version": 95, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 96, - { + }, + { + "key": "collection/94", + "version": 96, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 97, - { + }, + { + "key": "collection/95", + "version": 97, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 98, - { + }, + { + "key": "collection/96", + "version": 98, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 99, - { + }, + { + "key": "collection/97", + "version": 99, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 100, - { + }, + { + "key": "collection/98", + "version": 100, + "value": { "v": 100 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 101, - { + }, + { + "key": "collection/99", + "version": 101, + "value": { "v": 101 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -13874,706 +17928,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 103, - { + { + "key": "collection/0", + "version": 103, + "value": { "v": 103 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 104, - { + }, + { + "key": "collection/1", + "version": 104, + "value": { "v": 104 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 105, - { + }, + { + "key": "collection/2", + "version": 105, + "value": { "v": 105 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 106, - { + }, + { + "key": "collection/3", + "version": 106, + "value": { "v": 106 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 107, - { + }, + { + "key": "collection/4", + "version": 107, + "value": { "v": 107 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 108, - { + }, + { + "key": "collection/5", + "version": 108, + "value": { "v": 108 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 109, - { + }, + { + "key": "collection/6", + "version": 109, + "value": { "v": 109 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 110, - { + }, + { + "key": "collection/7", + "version": 110, + "value": { "v": 110 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 111, - { + }, + { + "key": "collection/8", + "version": 111, + "value": { "v": 111 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 112, - { + }, + { + "key": "collection/9", + "version": 112, + "value": { "v": 112 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 113, - { + }, + { + "key": "collection/10", + "version": 113, + "value": { "v": 113 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 114, - { + }, + { + "key": "collection/11", + "version": 114, + "value": { "v": 114 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 115, - { + }, + { + "key": "collection/12", + "version": 115, + "value": { "v": 115 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 116, - { + }, + { + "key": "collection/13", + "version": 116, + "value": { "v": 116 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 117, - { + }, + { + "key": "collection/14", + "version": 117, + "value": { "v": 117 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 118, - { + }, + { + "key": "collection/15", + "version": 118, + "value": { "v": 118 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 119, - { + }, + { + "key": "collection/16", + "version": 119, + "value": { "v": 119 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 120, - { + }, + { + "key": "collection/17", + "version": 120, + "value": { "v": 120 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 121, - { + }, + { + "key": "collection/18", + "version": 121, + "value": { "v": 121 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 122, - { + }, + { + "key": "collection/19", + "version": 122, + "value": { "v": 122 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 123, - { + }, + { + "key": "collection/20", + "version": 123, + "value": { "v": 123 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 124, - { + }, + { + "key": "collection/21", + "version": 124, + "value": { "v": 124 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 125, - { + }, + { + "key": "collection/22", + "version": 125, + "value": { "v": 125 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 126, - { + }, + { + "key": "collection/23", + "version": 126, + "value": { "v": 126 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 127, - { + }, + { + "key": "collection/24", + "version": 127, + "value": { "v": 127 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 128, - { + }, + { + "key": "collection/25", + "version": 128, + "value": { "v": 128 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 129, - { + }, + { + "key": "collection/26", + "version": 129, + "value": { "v": 129 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 130, - { + }, + { + "key": "collection/27", + "version": 130, + "value": { "v": 130 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 131, - { + }, + { + "key": "collection/28", + "version": 131, + "value": { "v": 131 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 132, - { + }, + { + "key": "collection/29", + "version": 132, + "value": { "v": 132 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 133, - { + }, + { + "key": "collection/30", + "version": 133, + "value": { "v": 133 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 134, - { + }, + { + "key": "collection/31", + "version": 134, + "value": { "v": 134 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 135, - { + }, + { + "key": "collection/32", + "version": 135, + "value": { "v": 135 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 136, - { + }, + { + "key": "collection/33", + "version": 136, + "value": { "v": 136 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 137, - { + }, + { + "key": "collection/34", + "version": 137, + "value": { "v": 137 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 138, - { + }, + { + "key": "collection/35", + "version": 138, + "value": { "v": 138 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 139, - { + }, + { + "key": "collection/36", + "version": 139, + "value": { "v": 139 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 140, - { + }, + { + "key": "collection/37", + "version": 140, + "value": { "v": 140 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 141, - { + }, + { + "key": "collection/38", + "version": 141, + "value": { "v": 141 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 142, - { + }, + { + "key": "collection/39", + "version": 142, + "value": { "v": 142 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 143, - { + }, + { + "key": "collection/40", + "version": 143, + "value": { "v": 143 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 144, - { + }, + { + "key": "collection/41", + "version": 144, + "value": { "v": 144 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 145, - { + }, + { + "key": "collection/42", + "version": 145, + "value": { "v": 145 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 146, - { + }, + { + "key": "collection/43", + "version": 146, + "value": { "v": 146 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 147, - { + }, + { + "key": "collection/44", + "version": 147, + "value": { "v": 147 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 148, - { + }, + { + "key": "collection/45", + "version": 148, + "value": { "v": 148 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 149, - { + }, + { + "key": "collection/46", + "version": 149, + "value": { "v": 149 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 150, - { + }, + { + "key": "collection/47", + "version": 150, + "value": { "v": 150 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 151, - { + }, + { + "key": "collection/48", + "version": 151, + "value": { "v": 151 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 152, - { + }, + { + "key": "collection/49", + "version": 152, + "value": { "v": 152 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 153, - { + }, + { + "key": "collection/50", + "version": 153, + "value": { "v": 153 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 154, - { + }, + { + "key": "collection/51", + "version": 154, + "value": { "v": 154 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 155, - { + }, + { + "key": "collection/52", + "version": 155, + "value": { "v": 155 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 156, - { + }, + { + "key": "collection/53", + "version": 156, + "value": { "v": 156 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 157, - { + }, + { + "key": "collection/54", + "version": 157, + "value": { "v": 157 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 158, - { + }, + { + "key": "collection/55", + "version": 158, + "value": { "v": 158 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 159, - { + }, + { + "key": "collection/56", + "version": 159, + "value": { "v": 159 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 160, - { + }, + { + "key": "collection/57", + "version": 160, + "value": { "v": 160 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 161, - { + }, + { + "key": "collection/58", + "version": 161, + "value": { "v": 161 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 162, - { + }, + { + "key": "collection/59", + "version": 162, + "value": { "v": 162 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 163, - { + }, + { + "key": "collection/60", + "version": 163, + "value": { "v": 163 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 164, - { + }, + { + "key": "collection/61", + "version": 164, + "value": { "v": 164 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 165, - { + }, + { + "key": "collection/62", + "version": 165, + "value": { "v": 165 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 166, - { + }, + { + "key": "collection/63", + "version": 166, + "value": { "v": 166 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 167, - { + }, + { + "key": "collection/64", + "version": 167, + "value": { "v": 167 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 168, - { + }, + { + "key": "collection/65", + "version": 168, + "value": { "v": 168 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 169, - { + }, + { + "key": "collection/66", + "version": 169, + "value": { "v": 169 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 170, - { + }, + { + "key": "collection/67", + "version": 170, + "value": { "v": 170 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 171, - { + }, + { + "key": "collection/68", + "version": 171, + "value": { "v": 171 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 172, - { + }, + { + "key": "collection/69", + "version": 172, + "value": { "v": 172 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 173, - { + }, + { + "key": "collection/70", + "version": 173, + "value": { "v": 173 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 174, - { + }, + { + "key": "collection/71", + "version": 174, + "value": { "v": 174 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 175, - { + }, + { + "key": "collection/72", + "version": 175, + "value": { "v": 175 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 176, - { + }, + { + "key": "collection/73", + "version": 176, + "value": { "v": 176 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 177, - { + }, + { + "key": "collection/74", + "version": 177, + "value": { "v": 177 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 178, - { + }, + { + "key": "collection/75", + "version": 178, + "value": { "v": 178 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 179, - { + }, + { + "key": "collection/76", + "version": 179, + "value": { "v": 179 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 180, - { + }, + { + "key": "collection/77", + "version": 180, + "value": { "v": 180 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 181, - { + }, + { + "key": "collection/78", + "version": 181, + "value": { "v": 181 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 182, - { + }, + { + "key": "collection/79", + "version": 182, + "value": { "v": 182 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 183, - { + }, + { + "key": "collection/80", + "version": 183, + "value": { "v": 183 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 184, - { + }, + { + "key": "collection/81", + "version": 184, + "value": { "v": 184 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 185, - { + }, + { + "key": "collection/82", + "version": 185, + "value": { "v": 185 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 186, - { + }, + { + "key": "collection/83", + "version": 186, + "value": { "v": 186 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 187, - { + }, + { + "key": "collection/84", + "version": 187, + "value": { "v": 187 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 188, - { + }, + { + "key": "collection/85", + "version": 188, + "value": { "v": 188 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 189, - { + }, + { + "key": "collection/86", + "version": 189, + "value": { "v": 189 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 190, - { + }, + { + "key": "collection/87", + "version": 190, + "value": { "v": 190 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 191, - { + }, + { + "key": "collection/88", + "version": 191, + "value": { "v": 191 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 192, - { + }, + { + "key": "collection/89", + "version": 192, + "value": { "v": 192 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 193, - { + }, + { + "key": "collection/90", + "version": 193, + "value": { "v": 193 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 194, - { + }, + { + "key": "collection/91", + "version": 194, + "value": { "v": 194 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 195, - { + }, + { + "key": "collection/92", + "version": 195, + "value": { "v": 195 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 196, - { + }, + { + "key": "collection/93", + "version": 196, + "value": { "v": 196 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 197, - { + }, + { + "key": "collection/94", + "version": 197, + "value": { "v": 197 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 198, - { + }, + { + "key": "collection/95", + "version": 198, + "value": { "v": 198 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 199, - { + }, + { + "key": "collection/96", + "version": 199, + "value": { "v": 199 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 200, - { + }, + { + "key": "collection/97", + "version": 200, + "value": { "v": 200 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 201, - { + }, + { + "key": "collection/98", + "version": 201, + "value": { "v": 201 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 202, - { + }, + { + "key": "collection/99", + "version": 202, + "value": { "v": 202 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -14582,7 +19036,8 @@ }, { "watchSnapshot": { - "version": 203 + "version": 203, + "targetIds": [] }, "expect": [ { @@ -14597,706 +19052,1106 @@ ] }, "modified": [ - [ - "collection/0", - 103, - { + { + "key": "collection/0", + "version": 103, + "value": { "v": 103 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 104, - { + }, + { + "key": "collection/1", + "version": 104, + "value": { "v": 104 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 105, - { + }, + { + "key": "collection/2", + "version": 105, + "value": { "v": 105 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 106, - { + }, + { + "key": "collection/3", + "version": 106, + "value": { "v": 106 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 107, - { + }, + { + "key": "collection/4", + "version": 107, + "value": { "v": 107 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 108, - { + }, + { + "key": "collection/5", + "version": 108, + "value": { "v": 108 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 109, - { + }, + { + "key": "collection/6", + "version": 109, + "value": { "v": 109 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 110, - { + }, + { + "key": "collection/7", + "version": 110, + "value": { "v": 110 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 111, - { + }, + { + "key": "collection/8", + "version": 111, + "value": { "v": 111 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 112, - { + }, + { + "key": "collection/9", + "version": 112, + "value": { "v": 112 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 113, - { + }, + { + "key": "collection/10", + "version": 113, + "value": { "v": 113 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 114, - { + }, + { + "key": "collection/11", + "version": 114, + "value": { "v": 114 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 115, - { + }, + { + "key": "collection/12", + "version": 115, + "value": { "v": 115 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 116, - { + }, + { + "key": "collection/13", + "version": 116, + "value": { "v": 116 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 117, - { + }, + { + "key": "collection/14", + "version": 117, + "value": { "v": 117 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 118, - { + }, + { + "key": "collection/15", + "version": 118, + "value": { "v": 118 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 119, - { + }, + { + "key": "collection/16", + "version": 119, + "value": { "v": 119 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 120, - { + }, + { + "key": "collection/17", + "version": 120, + "value": { "v": 120 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 121, - { + }, + { + "key": "collection/18", + "version": 121, + "value": { "v": 121 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 122, - { + }, + { + "key": "collection/19", + "version": 122, + "value": { "v": 122 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 123, - { + }, + { + "key": "collection/20", + "version": 123, + "value": { "v": 123 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 124, - { + }, + { + "key": "collection/21", + "version": 124, + "value": { "v": 124 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 125, - { + }, + { + "key": "collection/22", + "version": 125, + "value": { "v": 125 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 126, - { + }, + { + "key": "collection/23", + "version": 126, + "value": { "v": 126 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 127, - { + }, + { + "key": "collection/24", + "version": 127, + "value": { "v": 127 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 128, - { + }, + { + "key": "collection/25", + "version": 128, + "value": { "v": 128 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 129, - { + }, + { + "key": "collection/26", + "version": 129, + "value": { "v": 129 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 130, - { + }, + { + "key": "collection/27", + "version": 130, + "value": { "v": 130 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 131, - { + }, + { + "key": "collection/28", + "version": 131, + "value": { "v": 131 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 132, - { + }, + { + "key": "collection/29", + "version": 132, + "value": { "v": 132 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 133, - { + }, + { + "key": "collection/30", + "version": 133, + "value": { "v": 133 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 134, - { + }, + { + "key": "collection/31", + "version": 134, + "value": { "v": 134 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 135, - { + }, + { + "key": "collection/32", + "version": 135, + "value": { "v": 135 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 136, - { + }, + { + "key": "collection/33", + "version": 136, + "value": { "v": 136 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 137, - { + }, + { + "key": "collection/34", + "version": 137, + "value": { "v": 137 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 138, - { + }, + { + "key": "collection/35", + "version": 138, + "value": { "v": 138 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 139, - { + }, + { + "key": "collection/36", + "version": 139, + "value": { "v": 139 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 140, - { + }, + { + "key": "collection/37", + "version": 140, + "value": { "v": 140 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 141, - { + }, + { + "key": "collection/38", + "version": 141, + "value": { "v": 141 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 142, - { + }, + { + "key": "collection/39", + "version": 142, + "value": { "v": 142 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 143, - { + }, + { + "key": "collection/40", + "version": 143, + "value": { "v": 143 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 144, - { + }, + { + "key": "collection/41", + "version": 144, + "value": { "v": 144 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 145, - { + }, + { + "key": "collection/42", + "version": 145, + "value": { "v": 145 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 146, - { + }, + { + "key": "collection/43", + "version": 146, + "value": { "v": 146 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 147, - { + }, + { + "key": "collection/44", + "version": 147, + "value": { "v": 147 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 148, - { + }, + { + "key": "collection/45", + "version": 148, + "value": { "v": 148 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 149, - { + }, + { + "key": "collection/46", + "version": 149, + "value": { "v": 149 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 150, - { + }, + { + "key": "collection/47", + "version": 150, + "value": { "v": 150 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 151, - { + }, + { + "key": "collection/48", + "version": 151, + "value": { "v": 151 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 152, - { + }, + { + "key": "collection/49", + "version": 152, + "value": { "v": 152 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 153, - { + }, + { + "key": "collection/50", + "version": 153, + "value": { "v": 153 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 154, - { + }, + { + "key": "collection/51", + "version": 154, + "value": { "v": 154 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 155, - { + }, + { + "key": "collection/52", + "version": 155, + "value": { "v": 155 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 156, - { + }, + { + "key": "collection/53", + "version": 156, + "value": { "v": 156 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 157, - { + }, + { + "key": "collection/54", + "version": 157, + "value": { "v": 157 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 158, - { + }, + { + "key": "collection/55", + "version": 158, + "value": { "v": 158 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 159, - { + }, + { + "key": "collection/56", + "version": 159, + "value": { "v": 159 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 160, - { + }, + { + "key": "collection/57", + "version": 160, + "value": { "v": 160 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 161, - { + }, + { + "key": "collection/58", + "version": 161, + "value": { "v": 161 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 162, - { + }, + { + "key": "collection/59", + "version": 162, + "value": { "v": 162 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 163, - { + }, + { + "key": "collection/60", + "version": 163, + "value": { "v": 163 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 164, - { + }, + { + "key": "collection/61", + "version": 164, + "value": { "v": 164 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 165, - { + }, + { + "key": "collection/62", + "version": 165, + "value": { "v": 165 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 166, - { + }, + { + "key": "collection/63", + "version": 166, + "value": { "v": 166 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 167, - { + }, + { + "key": "collection/64", + "version": 167, + "value": { "v": 167 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 168, - { + }, + { + "key": "collection/65", + "version": 168, + "value": { "v": 168 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 169, - { + }, + { + "key": "collection/66", + "version": 169, + "value": { "v": 169 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 170, - { + }, + { + "key": "collection/67", + "version": 170, + "value": { "v": 170 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 171, - { + }, + { + "key": "collection/68", + "version": 171, + "value": { "v": 171 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 172, - { + }, + { + "key": "collection/69", + "version": 172, + "value": { "v": 172 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 173, - { + }, + { + "key": "collection/70", + "version": 173, + "value": { "v": 173 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 174, - { + }, + { + "key": "collection/71", + "version": 174, + "value": { "v": 174 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 175, - { + }, + { + "key": "collection/72", + "version": 175, + "value": { "v": 175 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 176, - { + }, + { + "key": "collection/73", + "version": 176, + "value": { "v": 176 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 177, - { + }, + { + "key": "collection/74", + "version": 177, + "value": { "v": 177 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 178, - { + }, + { + "key": "collection/75", + "version": 178, + "value": { "v": 178 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 179, - { + }, + { + "key": "collection/76", + "version": 179, + "value": { "v": 179 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 180, - { + }, + { + "key": "collection/77", + "version": 180, + "value": { "v": 180 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 181, - { + }, + { + "key": "collection/78", + "version": 181, + "value": { "v": 181 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 182, - { + }, + { + "key": "collection/79", + "version": 182, + "value": { "v": 182 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 183, - { + }, + { + "key": "collection/80", + "version": 183, + "value": { "v": 183 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 184, - { + }, + { + "key": "collection/81", + "version": 184, + "value": { "v": 184 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 185, - { + }, + { + "key": "collection/82", + "version": 185, + "value": { "v": 185 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 186, - { + }, + { + "key": "collection/83", + "version": 186, + "value": { "v": 186 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 187, - { + }, + { + "key": "collection/84", + "version": 187, + "value": { "v": 187 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 188, - { + }, + { + "key": "collection/85", + "version": 188, + "value": { "v": 188 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 189, - { + }, + { + "key": "collection/86", + "version": 189, + "value": { "v": 189 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 190, - { + }, + { + "key": "collection/87", + "version": 190, + "value": { "v": 190 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 191, - { + }, + { + "key": "collection/88", + "version": 191, + "value": { "v": 191 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 192, - { + }, + { + "key": "collection/89", + "version": 192, + "value": { "v": 192 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 193, - { + }, + { + "key": "collection/90", + "version": 193, + "value": { "v": 193 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 194, - { + }, + { + "key": "collection/91", + "version": 194, + "value": { "v": 194 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 195, - { + }, + { + "key": "collection/92", + "version": 195, + "value": { "v": 195 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 196, - { + }, + { + "key": "collection/93", + "version": 196, + "value": { "v": 196 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 197, - { + }, + { + "key": "collection/94", + "version": 197, + "value": { "v": 197 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 198, - { + }, + { + "key": "collection/95", + "version": 198, + "value": { "v": 198 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 199, - { + }, + { + "key": "collection/96", + "version": 199, + "value": { "v": 199 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 200, - { + }, + { + "key": "collection/97", + "version": 200, + "value": { "v": 200 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 201, - { + }, + { + "key": "collection/98", + "version": 201, + "value": { "v": 201 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 202, - { + }, + { + "key": "collection/99", + "version": 202, + "value": { "v": 202 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -15307,706 +20162,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 204, - { + { + "key": "collection/0", + "version": 204, + "value": { "v": 204 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 205, - { + }, + { + "key": "collection/1", + "version": 205, + "value": { "v": 205 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 206, - { + }, + { + "key": "collection/2", + "version": 206, + "value": { "v": 206 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 207, - { + }, + { + "key": "collection/3", + "version": 207, + "value": { "v": 207 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 208, - { + }, + { + "key": "collection/4", + "version": 208, + "value": { "v": 208 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 209, - { + }, + { + "key": "collection/5", + "version": 209, + "value": { "v": 209 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 210, - { + }, + { + "key": "collection/6", + "version": 210, + "value": { "v": 210 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 211, - { + }, + { + "key": "collection/7", + "version": 211, + "value": { "v": 211 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 212, - { + }, + { + "key": "collection/8", + "version": 212, + "value": { "v": 212 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 213, - { + }, + { + "key": "collection/9", + "version": 213, + "value": { "v": 213 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 214, - { + }, + { + "key": "collection/10", + "version": 214, + "value": { "v": 214 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 215, - { + }, + { + "key": "collection/11", + "version": 215, + "value": { "v": 215 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 216, - { + }, + { + "key": "collection/12", + "version": 216, + "value": { "v": 216 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 217, - { + }, + { + "key": "collection/13", + "version": 217, + "value": { "v": 217 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 218, - { + }, + { + "key": "collection/14", + "version": 218, + "value": { "v": 218 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 219, - { + }, + { + "key": "collection/15", + "version": 219, + "value": { "v": 219 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 220, - { + }, + { + "key": "collection/16", + "version": 220, + "value": { "v": 220 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 221, - { + }, + { + "key": "collection/17", + "version": 221, + "value": { "v": 221 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 222, - { + }, + { + "key": "collection/18", + "version": 222, + "value": { "v": 222 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 223, - { + }, + { + "key": "collection/19", + "version": 223, + "value": { "v": 223 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 224, - { + }, + { + "key": "collection/20", + "version": 224, + "value": { "v": 224 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 225, - { + }, + { + "key": "collection/21", + "version": 225, + "value": { "v": 225 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 226, - { + }, + { + "key": "collection/22", + "version": 226, + "value": { "v": 226 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 227, - { + }, + { + "key": "collection/23", + "version": 227, + "value": { "v": 227 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 228, - { + }, + { + "key": "collection/24", + "version": 228, + "value": { "v": 228 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 229, - { + }, + { + "key": "collection/25", + "version": 229, + "value": { "v": 229 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 230, - { + }, + { + "key": "collection/26", + "version": 230, + "value": { "v": 230 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 231, - { + }, + { + "key": "collection/27", + "version": 231, + "value": { "v": 231 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 232, - { + }, + { + "key": "collection/28", + "version": 232, + "value": { "v": 232 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 233, - { + }, + { + "key": "collection/29", + "version": 233, + "value": { "v": 233 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 234, - { + }, + { + "key": "collection/30", + "version": 234, + "value": { "v": 234 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 235, - { + }, + { + "key": "collection/31", + "version": 235, + "value": { "v": 235 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 236, - { + }, + { + "key": "collection/32", + "version": 236, + "value": { "v": 236 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 237, - { + }, + { + "key": "collection/33", + "version": 237, + "value": { "v": 237 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 238, - { + }, + { + "key": "collection/34", + "version": 238, + "value": { "v": 238 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 239, - { + }, + { + "key": "collection/35", + "version": 239, + "value": { "v": 239 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 240, - { + }, + { + "key": "collection/36", + "version": 240, + "value": { "v": 240 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 241, - { + }, + { + "key": "collection/37", + "version": 241, + "value": { "v": 241 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 242, - { + }, + { + "key": "collection/38", + "version": 242, + "value": { "v": 242 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 243, - { + }, + { + "key": "collection/39", + "version": 243, + "value": { "v": 243 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 244, - { + }, + { + "key": "collection/40", + "version": 244, + "value": { "v": 244 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 245, - { + }, + { + "key": "collection/41", + "version": 245, + "value": { "v": 245 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 246, - { + }, + { + "key": "collection/42", + "version": 246, + "value": { "v": 246 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 247, - { + }, + { + "key": "collection/43", + "version": 247, + "value": { "v": 247 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 248, - { + }, + { + "key": "collection/44", + "version": 248, + "value": { "v": 248 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 249, - { + }, + { + "key": "collection/45", + "version": 249, + "value": { "v": 249 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 250, - { + }, + { + "key": "collection/46", + "version": 250, + "value": { "v": 250 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 251, - { + }, + { + "key": "collection/47", + "version": 251, + "value": { "v": 251 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 252, - { + }, + { + "key": "collection/48", + "version": 252, + "value": { "v": 252 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 253, - { + }, + { + "key": "collection/49", + "version": 253, + "value": { "v": 253 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 254, - { + }, + { + "key": "collection/50", + "version": 254, + "value": { "v": 254 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 255, - { + }, + { + "key": "collection/51", + "version": 255, + "value": { "v": 255 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 256, - { + }, + { + "key": "collection/52", + "version": 256, + "value": { "v": 256 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 257, - { + }, + { + "key": "collection/53", + "version": 257, + "value": { "v": 257 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 258, - { + }, + { + "key": "collection/54", + "version": 258, + "value": { "v": 258 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 259, - { + }, + { + "key": "collection/55", + "version": 259, + "value": { "v": 259 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 260, - { + }, + { + "key": "collection/56", + "version": 260, + "value": { "v": 260 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 261, - { + }, + { + "key": "collection/57", + "version": 261, + "value": { "v": 261 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 262, - { + }, + { + "key": "collection/58", + "version": 262, + "value": { "v": 262 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 263, - { + }, + { + "key": "collection/59", + "version": 263, + "value": { "v": 263 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 264, - { + }, + { + "key": "collection/60", + "version": 264, + "value": { "v": 264 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 265, - { + }, + { + "key": "collection/61", + "version": 265, + "value": { "v": 265 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 266, - { + }, + { + "key": "collection/62", + "version": 266, + "value": { "v": 266 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 267, - { + }, + { + "key": "collection/63", + "version": 267, + "value": { "v": 267 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 268, - { + }, + { + "key": "collection/64", + "version": 268, + "value": { "v": 268 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 269, - { + }, + { + "key": "collection/65", + "version": 269, + "value": { "v": 269 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 270, - { + }, + { + "key": "collection/66", + "version": 270, + "value": { "v": 270 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 271, - { + }, + { + "key": "collection/67", + "version": 271, + "value": { "v": 271 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 272, - { + }, + { + "key": "collection/68", + "version": 272, + "value": { "v": 272 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 273, - { + }, + { + "key": "collection/69", + "version": 273, + "value": { "v": 273 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 274, - { + }, + { + "key": "collection/70", + "version": 274, + "value": { "v": 274 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 275, - { + }, + { + "key": "collection/71", + "version": 275, + "value": { "v": 275 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 276, - { + }, + { + "key": "collection/72", + "version": 276, + "value": { "v": 276 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 277, - { + }, + { + "key": "collection/73", + "version": 277, + "value": { "v": 277 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 278, - { + }, + { + "key": "collection/74", + "version": 278, + "value": { "v": 278 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 279, - { + }, + { + "key": "collection/75", + "version": 279, + "value": { "v": 279 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 280, - { + }, + { + "key": "collection/76", + "version": 280, + "value": { "v": 280 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 281, - { + }, + { + "key": "collection/77", + "version": 281, + "value": { "v": 281 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 282, - { + }, + { + "key": "collection/78", + "version": 282, + "value": { "v": 282 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 283, - { + }, + { + "key": "collection/79", + "version": 283, + "value": { "v": 283 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 284, - { + }, + { + "key": "collection/80", + "version": 284, + "value": { "v": 284 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 285, - { + }, + { + "key": "collection/81", + "version": 285, + "value": { "v": 285 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 286, - { + }, + { + "key": "collection/82", + "version": 286, + "value": { "v": 286 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 287, - { + }, + { + "key": "collection/83", + "version": 287, + "value": { "v": 287 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 288, - { + }, + { + "key": "collection/84", + "version": 288, + "value": { "v": 288 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 289, - { + }, + { + "key": "collection/85", + "version": 289, + "value": { "v": 289 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 290, - { + }, + { + "key": "collection/86", + "version": 290, + "value": { "v": 290 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 291, - { + }, + { + "key": "collection/87", + "version": 291, + "value": { "v": 291 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 292, - { + }, + { + "key": "collection/88", + "version": 292, + "value": { "v": 292 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 293, - { + }, + { + "key": "collection/89", + "version": 293, + "value": { "v": 293 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 294, - { + }, + { + "key": "collection/90", + "version": 294, + "value": { "v": 294 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 295, - { + }, + { + "key": "collection/91", + "version": 295, + "value": { "v": 295 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 296, - { + }, + { + "key": "collection/92", + "version": 296, + "value": { "v": 296 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 297, - { + }, + { + "key": "collection/93", + "version": 297, + "value": { "v": 297 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 298, - { + }, + { + "key": "collection/94", + "version": 298, + "value": { "v": 298 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 299, - { + }, + { + "key": "collection/95", + "version": 299, + "value": { "v": 299 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 300, - { + }, + { + "key": "collection/96", + "version": 300, + "value": { "v": 300 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 301, - { + }, + { + "key": "collection/97", + "version": 301, + "value": { "v": 301 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 302, - { + }, + { + "key": "collection/98", + "version": 302, + "value": { "v": 302 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 303, - { + }, + { + "key": "collection/99", + "version": 303, + "value": { "v": 303 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -16015,7 +21270,8 @@ }, { "watchSnapshot": { - "version": 304 + "version": 304, + "targetIds": [] }, "expect": [ { @@ -16030,706 +21286,1106 @@ ] }, "modified": [ - [ - "collection/0", - 204, - { + { + "key": "collection/0", + "version": 204, + "value": { "v": 204 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 205, - { + }, + { + "key": "collection/1", + "version": 205, + "value": { "v": 205 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 206, - { + }, + { + "key": "collection/2", + "version": 206, + "value": { "v": 206 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 207, - { + }, + { + "key": "collection/3", + "version": 207, + "value": { "v": 207 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 208, - { + }, + { + "key": "collection/4", + "version": 208, + "value": { "v": 208 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 209, - { + }, + { + "key": "collection/5", + "version": 209, + "value": { "v": 209 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 210, - { + }, + { + "key": "collection/6", + "version": 210, + "value": { "v": 210 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 211, - { + }, + { + "key": "collection/7", + "version": 211, + "value": { "v": 211 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 212, - { + }, + { + "key": "collection/8", + "version": 212, + "value": { "v": 212 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 213, - { + }, + { + "key": "collection/9", + "version": 213, + "value": { "v": 213 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 214, - { + }, + { + "key": "collection/10", + "version": 214, + "value": { "v": 214 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 215, - { + }, + { + "key": "collection/11", + "version": 215, + "value": { "v": 215 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 216, - { + }, + { + "key": "collection/12", + "version": 216, + "value": { "v": 216 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 217, - { + }, + { + "key": "collection/13", + "version": 217, + "value": { "v": 217 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 218, - { + }, + { + "key": "collection/14", + "version": 218, + "value": { "v": 218 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 219, - { + }, + { + "key": "collection/15", + "version": 219, + "value": { "v": 219 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 220, - { + }, + { + "key": "collection/16", + "version": 220, + "value": { "v": 220 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 221, - { + }, + { + "key": "collection/17", + "version": 221, + "value": { "v": 221 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 222, - { + }, + { + "key": "collection/18", + "version": 222, + "value": { "v": 222 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 223, - { + }, + { + "key": "collection/19", + "version": 223, + "value": { "v": 223 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 224, - { + }, + { + "key": "collection/20", + "version": 224, + "value": { "v": 224 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 225, - { + }, + { + "key": "collection/21", + "version": 225, + "value": { "v": 225 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 226, - { + }, + { + "key": "collection/22", + "version": 226, + "value": { "v": 226 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 227, - { + }, + { + "key": "collection/23", + "version": 227, + "value": { "v": 227 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 228, - { + }, + { + "key": "collection/24", + "version": 228, + "value": { "v": 228 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 229, - { + }, + { + "key": "collection/25", + "version": 229, + "value": { "v": 229 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 230, - { + }, + { + "key": "collection/26", + "version": 230, + "value": { "v": 230 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 231, - { + }, + { + "key": "collection/27", + "version": 231, + "value": { "v": 231 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 232, - { + }, + { + "key": "collection/28", + "version": 232, + "value": { "v": 232 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 233, - { + }, + { + "key": "collection/29", + "version": 233, + "value": { "v": 233 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 234, - { + }, + { + "key": "collection/30", + "version": 234, + "value": { "v": 234 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 235, - { + }, + { + "key": "collection/31", + "version": 235, + "value": { "v": 235 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 236, - { + }, + { + "key": "collection/32", + "version": 236, + "value": { "v": 236 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 237, - { + }, + { + "key": "collection/33", + "version": 237, + "value": { "v": 237 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 238, - { + }, + { + "key": "collection/34", + "version": 238, + "value": { "v": 238 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 239, - { + }, + { + "key": "collection/35", + "version": 239, + "value": { "v": 239 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 240, - { + }, + { + "key": "collection/36", + "version": 240, + "value": { "v": 240 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 241, - { + }, + { + "key": "collection/37", + "version": 241, + "value": { "v": 241 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 242, - { + }, + { + "key": "collection/38", + "version": 242, + "value": { "v": 242 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 243, - { + }, + { + "key": "collection/39", + "version": 243, + "value": { "v": 243 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 244, - { + }, + { + "key": "collection/40", + "version": 244, + "value": { "v": 244 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 245, - { + }, + { + "key": "collection/41", + "version": 245, + "value": { "v": 245 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 246, - { + }, + { + "key": "collection/42", + "version": 246, + "value": { "v": 246 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 247, - { + }, + { + "key": "collection/43", + "version": 247, + "value": { "v": 247 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 248, - { + }, + { + "key": "collection/44", + "version": 248, + "value": { "v": 248 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 249, - { + }, + { + "key": "collection/45", + "version": 249, + "value": { "v": 249 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 250, - { + }, + { + "key": "collection/46", + "version": 250, + "value": { "v": 250 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 251, - { + }, + { + "key": "collection/47", + "version": 251, + "value": { "v": 251 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 252, - { + }, + { + "key": "collection/48", + "version": 252, + "value": { "v": 252 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 253, - { + }, + { + "key": "collection/49", + "version": 253, + "value": { "v": 253 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 254, - { + }, + { + "key": "collection/50", + "version": 254, + "value": { "v": 254 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 255, - { + }, + { + "key": "collection/51", + "version": 255, + "value": { "v": 255 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 256, - { + }, + { + "key": "collection/52", + "version": 256, + "value": { "v": 256 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 257, - { + }, + { + "key": "collection/53", + "version": 257, + "value": { "v": 257 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 258, - { + }, + { + "key": "collection/54", + "version": 258, + "value": { "v": 258 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 259, - { + }, + { + "key": "collection/55", + "version": 259, + "value": { "v": 259 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 260, - { + }, + { + "key": "collection/56", + "version": 260, + "value": { "v": 260 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 261, - { + }, + { + "key": "collection/57", + "version": 261, + "value": { "v": 261 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 262, - { + }, + { + "key": "collection/58", + "version": 262, + "value": { "v": 262 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 263, - { + }, + { + "key": "collection/59", + "version": 263, + "value": { "v": 263 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 264, - { + }, + { + "key": "collection/60", + "version": 264, + "value": { "v": 264 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 265, - { + }, + { + "key": "collection/61", + "version": 265, + "value": { "v": 265 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 266, - { + }, + { + "key": "collection/62", + "version": 266, + "value": { "v": 266 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 267, - { + }, + { + "key": "collection/63", + "version": 267, + "value": { "v": 267 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 268, - { + }, + { + "key": "collection/64", + "version": 268, + "value": { "v": 268 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 269, - { + }, + { + "key": "collection/65", + "version": 269, + "value": { "v": 269 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 270, - { + }, + { + "key": "collection/66", + "version": 270, + "value": { "v": 270 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 271, - { + }, + { + "key": "collection/67", + "version": 271, + "value": { "v": 271 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 272, - { + }, + { + "key": "collection/68", + "version": 272, + "value": { "v": 272 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 273, - { + }, + { + "key": "collection/69", + "version": 273, + "value": { "v": 273 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 274, - { + }, + { + "key": "collection/70", + "version": 274, + "value": { "v": 274 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 275, - { + }, + { + "key": "collection/71", + "version": 275, + "value": { "v": 275 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 276, - { + }, + { + "key": "collection/72", + "version": 276, + "value": { "v": 276 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 277, - { + }, + { + "key": "collection/73", + "version": 277, + "value": { "v": 277 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 278, - { + }, + { + "key": "collection/74", + "version": 278, + "value": { "v": 278 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 279, - { + }, + { + "key": "collection/75", + "version": 279, + "value": { "v": 279 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 280, - { + }, + { + "key": "collection/76", + "version": 280, + "value": { "v": 280 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 281, - { + }, + { + "key": "collection/77", + "version": 281, + "value": { "v": 281 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 282, - { + }, + { + "key": "collection/78", + "version": 282, + "value": { "v": 282 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 283, - { + }, + { + "key": "collection/79", + "version": 283, + "value": { "v": 283 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 284, - { + }, + { + "key": "collection/80", + "version": 284, + "value": { "v": 284 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 285, - { + }, + { + "key": "collection/81", + "version": 285, + "value": { "v": 285 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 286, - { + }, + { + "key": "collection/82", + "version": 286, + "value": { "v": 286 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 287, - { + }, + { + "key": "collection/83", + "version": 287, + "value": { "v": 287 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 288, - { + }, + { + "key": "collection/84", + "version": 288, + "value": { "v": 288 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 289, - { + }, + { + "key": "collection/85", + "version": 289, + "value": { "v": 289 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 290, - { + }, + { + "key": "collection/86", + "version": 290, + "value": { "v": 290 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 291, - { + }, + { + "key": "collection/87", + "version": 291, + "value": { "v": 291 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 292, - { + }, + { + "key": "collection/88", + "version": 292, + "value": { "v": 292 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 293, - { + }, + { + "key": "collection/89", + "version": 293, + "value": { "v": 293 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 294, - { + }, + { + "key": "collection/90", + "version": 294, + "value": { "v": 294 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 295, - { + }, + { + "key": "collection/91", + "version": 295, + "value": { "v": 295 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 296, - { + }, + { + "key": "collection/92", + "version": 296, + "value": { "v": 296 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 297, - { + }, + { + "key": "collection/93", + "version": 297, + "value": { "v": 297 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 298, - { + }, + { + "key": "collection/94", + "version": 298, + "value": { "v": 298 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 299, - { + }, + { + "key": "collection/95", + "version": 299, + "value": { "v": 299 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 300, - { + }, + { + "key": "collection/96", + "version": 300, + "value": { "v": 300 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 301, - { + }, + { + "key": "collection/97", + "version": 301, + "value": { "v": 301 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 302, - { + }, + { + "key": "collection/98", + "version": 302, + "value": { "v": 302 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 303, - { + }, + { + "key": "collection/99", + "version": 303, + "value": { "v": 303 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -16740,706 +22396,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 305, - { + { + "key": "collection/0", + "version": 305, + "value": { "v": 305 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 306, - { + }, + { + "key": "collection/1", + "version": 306, + "value": { "v": 306 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 307, - { + }, + { + "key": "collection/2", + "version": 307, + "value": { "v": 307 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 308, - { + }, + { + "key": "collection/3", + "version": 308, + "value": { "v": 308 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 309, - { + }, + { + "key": "collection/4", + "version": 309, + "value": { "v": 309 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 310, - { + }, + { + "key": "collection/5", + "version": 310, + "value": { "v": 310 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 311, - { + }, + { + "key": "collection/6", + "version": 311, + "value": { "v": 311 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 312, - { + }, + { + "key": "collection/7", + "version": 312, + "value": { "v": 312 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 313, - { + }, + { + "key": "collection/8", + "version": 313, + "value": { "v": 313 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 314, - { + }, + { + "key": "collection/9", + "version": 314, + "value": { "v": 314 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 315, - { + }, + { + "key": "collection/10", + "version": 315, + "value": { "v": 315 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 316, - { + }, + { + "key": "collection/11", + "version": 316, + "value": { "v": 316 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 317, - { + }, + { + "key": "collection/12", + "version": 317, + "value": { "v": 317 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 318, - { + }, + { + "key": "collection/13", + "version": 318, + "value": { "v": 318 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 319, - { + }, + { + "key": "collection/14", + "version": 319, + "value": { "v": 319 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 320, - { + }, + { + "key": "collection/15", + "version": 320, + "value": { "v": 320 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 321, - { + }, + { + "key": "collection/16", + "version": 321, + "value": { "v": 321 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 322, - { + }, + { + "key": "collection/17", + "version": 322, + "value": { "v": 322 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 323, - { + }, + { + "key": "collection/18", + "version": 323, + "value": { "v": 323 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 324, - { + }, + { + "key": "collection/19", + "version": 324, + "value": { "v": 324 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 325, - { + }, + { + "key": "collection/20", + "version": 325, + "value": { "v": 325 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 326, - { + }, + { + "key": "collection/21", + "version": 326, + "value": { "v": 326 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 327, - { + }, + { + "key": "collection/22", + "version": 327, + "value": { "v": 327 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 328, - { + }, + { + "key": "collection/23", + "version": 328, + "value": { "v": 328 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 329, - { + }, + { + "key": "collection/24", + "version": 329, + "value": { "v": 329 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 330, - { + }, + { + "key": "collection/25", + "version": 330, + "value": { "v": 330 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 331, - { + }, + { + "key": "collection/26", + "version": 331, + "value": { "v": 331 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 332, - { + }, + { + "key": "collection/27", + "version": 332, + "value": { "v": 332 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 333, - { + }, + { + "key": "collection/28", + "version": 333, + "value": { "v": 333 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 334, - { + }, + { + "key": "collection/29", + "version": 334, + "value": { "v": 334 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 335, - { + }, + { + "key": "collection/30", + "version": 335, + "value": { "v": 335 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 336, - { + }, + { + "key": "collection/31", + "version": 336, + "value": { "v": 336 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 337, - { + }, + { + "key": "collection/32", + "version": 337, + "value": { "v": 337 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 338, - { + }, + { + "key": "collection/33", + "version": 338, + "value": { "v": 338 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 339, - { + }, + { + "key": "collection/34", + "version": 339, + "value": { "v": 339 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 340, - { + }, + { + "key": "collection/35", + "version": 340, + "value": { "v": 340 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 341, - { + }, + { + "key": "collection/36", + "version": 341, + "value": { "v": 341 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 342, - { + }, + { + "key": "collection/37", + "version": 342, + "value": { "v": 342 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 343, - { + }, + { + "key": "collection/38", + "version": 343, + "value": { "v": 343 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 344, - { + }, + { + "key": "collection/39", + "version": 344, + "value": { "v": 344 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 345, - { + }, + { + "key": "collection/40", + "version": 345, + "value": { "v": 345 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 346, - { + }, + { + "key": "collection/41", + "version": 346, + "value": { "v": 346 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 347, - { + }, + { + "key": "collection/42", + "version": 347, + "value": { "v": 347 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 348, - { + }, + { + "key": "collection/43", + "version": 348, + "value": { "v": 348 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 349, - { + }, + { + "key": "collection/44", + "version": 349, + "value": { "v": 349 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 350, - { + }, + { + "key": "collection/45", + "version": 350, + "value": { "v": 350 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 351, - { + }, + { + "key": "collection/46", + "version": 351, + "value": { "v": 351 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 352, - { + }, + { + "key": "collection/47", + "version": 352, + "value": { "v": 352 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 353, - { + }, + { + "key": "collection/48", + "version": 353, + "value": { "v": 353 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 354, - { + }, + { + "key": "collection/49", + "version": 354, + "value": { "v": 354 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 355, - { + }, + { + "key": "collection/50", + "version": 355, + "value": { "v": 355 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 356, - { + }, + { + "key": "collection/51", + "version": 356, + "value": { "v": 356 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 357, - { + }, + { + "key": "collection/52", + "version": 357, + "value": { "v": 357 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 358, - { + }, + { + "key": "collection/53", + "version": 358, + "value": { "v": 358 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 359, - { + }, + { + "key": "collection/54", + "version": 359, + "value": { "v": 359 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 360, - { + }, + { + "key": "collection/55", + "version": 360, + "value": { "v": 360 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 361, - { + }, + { + "key": "collection/56", + "version": 361, + "value": { "v": 361 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 362, - { + }, + { + "key": "collection/57", + "version": 362, + "value": { "v": 362 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 363, - { + }, + { + "key": "collection/58", + "version": 363, + "value": { "v": 363 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 364, - { + }, + { + "key": "collection/59", + "version": 364, + "value": { "v": 364 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 365, - { + }, + { + "key": "collection/60", + "version": 365, + "value": { "v": 365 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 366, - { + }, + { + "key": "collection/61", + "version": 366, + "value": { "v": 366 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 367, - { + }, + { + "key": "collection/62", + "version": 367, + "value": { "v": 367 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 368, - { + }, + { + "key": "collection/63", + "version": 368, + "value": { "v": 368 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 369, - { + }, + { + "key": "collection/64", + "version": 369, + "value": { "v": 369 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 370, - { + }, + { + "key": "collection/65", + "version": 370, + "value": { "v": 370 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 371, - { + }, + { + "key": "collection/66", + "version": 371, + "value": { "v": 371 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 372, - { + }, + { + "key": "collection/67", + "version": 372, + "value": { "v": 372 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 373, - { + }, + { + "key": "collection/68", + "version": 373, + "value": { "v": 373 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 374, - { + }, + { + "key": "collection/69", + "version": 374, + "value": { "v": 374 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 375, - { + }, + { + "key": "collection/70", + "version": 375, + "value": { "v": 375 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 376, - { + }, + { + "key": "collection/71", + "version": 376, + "value": { "v": 376 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 377, - { + }, + { + "key": "collection/72", + "version": 377, + "value": { "v": 377 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 378, - { + }, + { + "key": "collection/73", + "version": 378, + "value": { "v": 378 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 379, - { + }, + { + "key": "collection/74", + "version": 379, + "value": { "v": 379 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 380, - { + }, + { + "key": "collection/75", + "version": 380, + "value": { "v": 380 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 381, - { + }, + { + "key": "collection/76", + "version": 381, + "value": { "v": 381 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 382, - { + }, + { + "key": "collection/77", + "version": 382, + "value": { "v": 382 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 383, - { + }, + { + "key": "collection/78", + "version": 383, + "value": { "v": 383 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 384, - { + }, + { + "key": "collection/79", + "version": 384, + "value": { "v": 384 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 385, - { + }, + { + "key": "collection/80", + "version": 385, + "value": { "v": 385 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 386, - { + }, + { + "key": "collection/81", + "version": 386, + "value": { "v": 386 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 387, - { + }, + { + "key": "collection/82", + "version": 387, + "value": { "v": 387 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 388, - { + }, + { + "key": "collection/83", + "version": 388, + "value": { "v": 388 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 389, - { + }, + { + "key": "collection/84", + "version": 389, + "value": { "v": 389 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 390, - { + }, + { + "key": "collection/85", + "version": 390, + "value": { "v": 390 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 391, - { + }, + { + "key": "collection/86", + "version": 391, + "value": { "v": 391 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 392, - { + }, + { + "key": "collection/87", + "version": 392, + "value": { "v": 392 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 393, - { + }, + { + "key": "collection/88", + "version": 393, + "value": { "v": 393 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 394, - { + }, + { + "key": "collection/89", + "version": 394, + "value": { "v": 394 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 395, - { + }, + { + "key": "collection/90", + "version": 395, + "value": { "v": 395 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 396, - { + }, + { + "key": "collection/91", + "version": 396, + "value": { "v": 396 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 397, - { + }, + { + "key": "collection/92", + "version": 397, + "value": { "v": 397 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 398, - { + }, + { + "key": "collection/93", + "version": 398, + "value": { "v": 398 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 399, - { + }, + { + "key": "collection/94", + "version": 399, + "value": { "v": 399 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 400, - { + }, + { + "key": "collection/95", + "version": 400, + "value": { "v": 400 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 401, - { + }, + { + "key": "collection/96", + "version": 401, + "value": { "v": 401 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 402, - { + }, + { + "key": "collection/97", + "version": 402, + "value": { "v": 402 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 403, - { + }, + { + "key": "collection/98", + "version": 403, + "value": { "v": 403 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 404, - { + }, + { + "key": "collection/99", + "version": 404, + "value": { "v": 404 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -17448,7 +23504,8 @@ }, { "watchSnapshot": { - "version": 405 + "version": 405, + "targetIds": [] }, "expect": [ { @@ -17463,706 +23520,1106 @@ ] }, "modified": [ - [ - "collection/0", - 305, - { + { + "key": "collection/0", + "version": 305, + "value": { "v": 305 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 306, - { + }, + { + "key": "collection/1", + "version": 306, + "value": { "v": 306 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 307, - { + }, + { + "key": "collection/2", + "version": 307, + "value": { "v": 307 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 308, - { + }, + { + "key": "collection/3", + "version": 308, + "value": { "v": 308 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 309, - { + }, + { + "key": "collection/4", + "version": 309, + "value": { "v": 309 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 310, - { + }, + { + "key": "collection/5", + "version": 310, + "value": { "v": 310 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 311, - { + }, + { + "key": "collection/6", + "version": 311, + "value": { "v": 311 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 312, - { + }, + { + "key": "collection/7", + "version": 312, + "value": { "v": 312 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 313, - { + }, + { + "key": "collection/8", + "version": 313, + "value": { "v": 313 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 314, - { + }, + { + "key": "collection/9", + "version": 314, + "value": { "v": 314 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 315, - { + }, + { + "key": "collection/10", + "version": 315, + "value": { "v": 315 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 316, - { + }, + { + "key": "collection/11", + "version": 316, + "value": { "v": 316 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 317, - { + }, + { + "key": "collection/12", + "version": 317, + "value": { "v": 317 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 318, - { + }, + { + "key": "collection/13", + "version": 318, + "value": { "v": 318 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 319, - { + }, + { + "key": "collection/14", + "version": 319, + "value": { "v": 319 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 320, - { + }, + { + "key": "collection/15", + "version": 320, + "value": { "v": 320 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 321, - { + }, + { + "key": "collection/16", + "version": 321, + "value": { "v": 321 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 322, - { + }, + { + "key": "collection/17", + "version": 322, + "value": { "v": 322 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 323, - { + }, + { + "key": "collection/18", + "version": 323, + "value": { "v": 323 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 324, - { + }, + { + "key": "collection/19", + "version": 324, + "value": { "v": 324 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 325, - { + }, + { + "key": "collection/20", + "version": 325, + "value": { "v": 325 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 326, - { + }, + { + "key": "collection/21", + "version": 326, + "value": { "v": 326 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 327, - { + }, + { + "key": "collection/22", + "version": 327, + "value": { "v": 327 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 328, - { + }, + { + "key": "collection/23", + "version": 328, + "value": { "v": 328 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 329, - { + }, + { + "key": "collection/24", + "version": 329, + "value": { "v": 329 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 330, - { + }, + { + "key": "collection/25", + "version": 330, + "value": { "v": 330 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 331, - { + }, + { + "key": "collection/26", + "version": 331, + "value": { "v": 331 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 332, - { + }, + { + "key": "collection/27", + "version": 332, + "value": { "v": 332 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 333, - { + }, + { + "key": "collection/28", + "version": 333, + "value": { "v": 333 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 334, - { + }, + { + "key": "collection/29", + "version": 334, + "value": { "v": 334 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 335, - { + }, + { + "key": "collection/30", + "version": 335, + "value": { "v": 335 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 336, - { + }, + { + "key": "collection/31", + "version": 336, + "value": { "v": 336 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 337, - { + }, + { + "key": "collection/32", + "version": 337, + "value": { "v": 337 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 338, - { + }, + { + "key": "collection/33", + "version": 338, + "value": { "v": 338 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 339, - { + }, + { + "key": "collection/34", + "version": 339, + "value": { "v": 339 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 340, - { + }, + { + "key": "collection/35", + "version": 340, + "value": { "v": 340 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 341, - { + }, + { + "key": "collection/36", + "version": 341, + "value": { "v": 341 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 342, - { + }, + { + "key": "collection/37", + "version": 342, + "value": { "v": 342 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 343, - { + }, + { + "key": "collection/38", + "version": 343, + "value": { "v": 343 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 344, - { + }, + { + "key": "collection/39", + "version": 344, + "value": { "v": 344 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 345, - { + }, + { + "key": "collection/40", + "version": 345, + "value": { "v": 345 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 346, - { + }, + { + "key": "collection/41", + "version": 346, + "value": { "v": 346 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 347, - { + }, + { + "key": "collection/42", + "version": 347, + "value": { "v": 347 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 348, - { + }, + { + "key": "collection/43", + "version": 348, + "value": { "v": 348 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 349, - { + }, + { + "key": "collection/44", + "version": 349, + "value": { "v": 349 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 350, - { + }, + { + "key": "collection/45", + "version": 350, + "value": { "v": 350 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 351, - { + }, + { + "key": "collection/46", + "version": 351, + "value": { "v": 351 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 352, - { + }, + { + "key": "collection/47", + "version": 352, + "value": { "v": 352 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 353, - { + }, + { + "key": "collection/48", + "version": 353, + "value": { "v": 353 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 354, - { + }, + { + "key": "collection/49", + "version": 354, + "value": { "v": 354 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 355, - { + }, + { + "key": "collection/50", + "version": 355, + "value": { "v": 355 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 356, - { + }, + { + "key": "collection/51", + "version": 356, + "value": { "v": 356 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 357, - { + }, + { + "key": "collection/52", + "version": 357, + "value": { "v": 357 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 358, - { + }, + { + "key": "collection/53", + "version": 358, + "value": { "v": 358 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 359, - { + }, + { + "key": "collection/54", + "version": 359, + "value": { "v": 359 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 360, - { + }, + { + "key": "collection/55", + "version": 360, + "value": { "v": 360 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 361, - { + }, + { + "key": "collection/56", + "version": 361, + "value": { "v": 361 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 362, - { + }, + { + "key": "collection/57", + "version": 362, + "value": { "v": 362 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 363, - { + }, + { + "key": "collection/58", + "version": 363, + "value": { "v": 363 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 364, - { + }, + { + "key": "collection/59", + "version": 364, + "value": { "v": 364 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 365, - { + }, + { + "key": "collection/60", + "version": 365, + "value": { "v": 365 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 366, - { + }, + { + "key": "collection/61", + "version": 366, + "value": { "v": 366 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 367, - { + }, + { + "key": "collection/62", + "version": 367, + "value": { "v": 367 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 368, - { + }, + { + "key": "collection/63", + "version": 368, + "value": { "v": 368 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 369, - { + }, + { + "key": "collection/64", + "version": 369, + "value": { "v": 369 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 370, - { + }, + { + "key": "collection/65", + "version": 370, + "value": { "v": 370 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 371, - { + }, + { + "key": "collection/66", + "version": 371, + "value": { "v": 371 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 372, - { + }, + { + "key": "collection/67", + "version": 372, + "value": { "v": 372 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 373, - { + }, + { + "key": "collection/68", + "version": 373, + "value": { "v": 373 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 374, - { + }, + { + "key": "collection/69", + "version": 374, + "value": { "v": 374 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 375, - { + }, + { + "key": "collection/70", + "version": 375, + "value": { "v": 375 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 376, - { + }, + { + "key": "collection/71", + "version": 376, + "value": { "v": 376 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 377, - { + }, + { + "key": "collection/72", + "version": 377, + "value": { "v": 377 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 378, - { + }, + { + "key": "collection/73", + "version": 378, + "value": { "v": 378 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 379, - { + }, + { + "key": "collection/74", + "version": 379, + "value": { "v": 379 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 380, - { + }, + { + "key": "collection/75", + "version": 380, + "value": { "v": 380 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 381, - { + }, + { + "key": "collection/76", + "version": 381, + "value": { "v": 381 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 382, - { + }, + { + "key": "collection/77", + "version": 382, + "value": { "v": 382 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 383, - { + }, + { + "key": "collection/78", + "version": 383, + "value": { "v": 383 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 384, - { + }, + { + "key": "collection/79", + "version": 384, + "value": { "v": 384 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 385, - { + }, + { + "key": "collection/80", + "version": 385, + "value": { "v": 385 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 386, - { + }, + { + "key": "collection/81", + "version": 386, + "value": { "v": 386 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 387, - { + }, + { + "key": "collection/82", + "version": 387, + "value": { "v": 387 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 388, - { + }, + { + "key": "collection/83", + "version": 388, + "value": { "v": 388 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 389, - { + }, + { + "key": "collection/84", + "version": 389, + "value": { "v": 389 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 390, - { + }, + { + "key": "collection/85", + "version": 390, + "value": { "v": 390 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 391, - { + }, + { + "key": "collection/86", + "version": 391, + "value": { "v": 391 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 392, - { + }, + { + "key": "collection/87", + "version": 392, + "value": { "v": 392 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 393, - { + }, + { + "key": "collection/88", + "version": 393, + "value": { "v": 393 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 394, - { + }, + { + "key": "collection/89", + "version": 394, + "value": { "v": 394 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 395, - { + }, + { + "key": "collection/90", + "version": 395, + "value": { "v": 395 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 396, - { + }, + { + "key": "collection/91", + "version": 396, + "value": { "v": 396 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 397, - { + }, + { + "key": "collection/92", + "version": 397, + "value": { "v": 397 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 398, - { + }, + { + "key": "collection/93", + "version": 398, + "value": { "v": 398 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 399, - { + }, + { + "key": "collection/94", + "version": 399, + "value": { "v": 399 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 400, - { + }, + { + "key": "collection/95", + "version": 400, + "value": { "v": 400 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 401, - { + }, + { + "key": "collection/96", + "version": 401, + "value": { "v": 401 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 402, - { + }, + { + "key": "collection/97", + "version": 402, + "value": { "v": 402 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 403, - { + }, + { + "key": "collection/98", + "version": 403, + "value": { "v": 403 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 404, - { + }, + { + "key": "collection/99", + "version": 404, + "value": { "v": 404 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -18173,706 +24630,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 406, - { + { + "key": "collection/0", + "version": 406, + "value": { "v": 406 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 407, - { + }, + { + "key": "collection/1", + "version": 407, + "value": { "v": 407 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 408, - { + }, + { + "key": "collection/2", + "version": 408, + "value": { "v": 408 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 409, - { + }, + { + "key": "collection/3", + "version": 409, + "value": { "v": 409 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 410, - { + }, + { + "key": "collection/4", + "version": 410, + "value": { "v": 410 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 411, - { + }, + { + "key": "collection/5", + "version": 411, + "value": { "v": 411 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 412, - { + }, + { + "key": "collection/6", + "version": 412, + "value": { "v": 412 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 413, - { + }, + { + "key": "collection/7", + "version": 413, + "value": { "v": 413 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 414, - { + }, + { + "key": "collection/8", + "version": 414, + "value": { "v": 414 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 415, - { + }, + { + "key": "collection/9", + "version": 415, + "value": { "v": 415 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 416, - { + }, + { + "key": "collection/10", + "version": 416, + "value": { "v": 416 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 417, - { + }, + { + "key": "collection/11", + "version": 417, + "value": { "v": 417 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 418, - { + }, + { + "key": "collection/12", + "version": 418, + "value": { "v": 418 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 419, - { + }, + { + "key": "collection/13", + "version": 419, + "value": { "v": 419 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 420, - { + }, + { + "key": "collection/14", + "version": 420, + "value": { "v": 420 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 421, - { + }, + { + "key": "collection/15", + "version": 421, + "value": { "v": 421 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 422, - { + }, + { + "key": "collection/16", + "version": 422, + "value": { "v": 422 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 423, - { + }, + { + "key": "collection/17", + "version": 423, + "value": { "v": 423 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 424, - { + }, + { + "key": "collection/18", + "version": 424, + "value": { "v": 424 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 425, - { + }, + { + "key": "collection/19", + "version": 425, + "value": { "v": 425 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 426, - { + }, + { + "key": "collection/20", + "version": 426, + "value": { "v": 426 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 427, - { + }, + { + "key": "collection/21", + "version": 427, + "value": { "v": 427 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 428, - { + }, + { + "key": "collection/22", + "version": 428, + "value": { "v": 428 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 429, - { + }, + { + "key": "collection/23", + "version": 429, + "value": { "v": 429 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 430, - { + }, + { + "key": "collection/24", + "version": 430, + "value": { "v": 430 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 431, - { + }, + { + "key": "collection/25", + "version": 431, + "value": { "v": 431 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 432, - { + }, + { + "key": "collection/26", + "version": 432, + "value": { "v": 432 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 433, - { + }, + { + "key": "collection/27", + "version": 433, + "value": { "v": 433 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 434, - { + }, + { + "key": "collection/28", + "version": 434, + "value": { "v": 434 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 435, - { + }, + { + "key": "collection/29", + "version": 435, + "value": { "v": 435 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 436, - { + }, + { + "key": "collection/30", + "version": 436, + "value": { "v": 436 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 437, - { + }, + { + "key": "collection/31", + "version": 437, + "value": { "v": 437 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 438, - { + }, + { + "key": "collection/32", + "version": 438, + "value": { "v": 438 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 439, - { + }, + { + "key": "collection/33", + "version": 439, + "value": { "v": 439 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 440, - { + }, + { + "key": "collection/34", + "version": 440, + "value": { "v": 440 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 441, - { + }, + { + "key": "collection/35", + "version": 441, + "value": { "v": 441 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 442, - { + }, + { + "key": "collection/36", + "version": 442, + "value": { "v": 442 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 443, - { + }, + { + "key": "collection/37", + "version": 443, + "value": { "v": 443 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 444, - { + }, + { + "key": "collection/38", + "version": 444, + "value": { "v": 444 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 445, - { + }, + { + "key": "collection/39", + "version": 445, + "value": { "v": 445 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 446, - { + }, + { + "key": "collection/40", + "version": 446, + "value": { "v": 446 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 447, - { + }, + { + "key": "collection/41", + "version": 447, + "value": { "v": 447 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 448, - { + }, + { + "key": "collection/42", + "version": 448, + "value": { "v": 448 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 449, - { + }, + { + "key": "collection/43", + "version": 449, + "value": { "v": 449 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 450, - { + }, + { + "key": "collection/44", + "version": 450, + "value": { "v": 450 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 451, - { + }, + { + "key": "collection/45", + "version": 451, + "value": { "v": 451 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 452, - { + }, + { + "key": "collection/46", + "version": 452, + "value": { "v": 452 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 453, - { + }, + { + "key": "collection/47", + "version": 453, + "value": { "v": 453 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 454, - { + }, + { + "key": "collection/48", + "version": 454, + "value": { "v": 454 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 455, - { + }, + { + "key": "collection/49", + "version": 455, + "value": { "v": 455 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 456, - { + }, + { + "key": "collection/50", + "version": 456, + "value": { "v": 456 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 457, - { + }, + { + "key": "collection/51", + "version": 457, + "value": { "v": 457 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 458, - { + }, + { + "key": "collection/52", + "version": 458, + "value": { "v": 458 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 459, - { + }, + { + "key": "collection/53", + "version": 459, + "value": { "v": 459 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 460, - { + }, + { + "key": "collection/54", + "version": 460, + "value": { "v": 460 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 461, - { + }, + { + "key": "collection/55", + "version": 461, + "value": { "v": 461 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 462, - { + }, + { + "key": "collection/56", + "version": 462, + "value": { "v": 462 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 463, - { + }, + { + "key": "collection/57", + "version": 463, + "value": { "v": 463 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 464, - { + }, + { + "key": "collection/58", + "version": 464, + "value": { "v": 464 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 465, - { + }, + { + "key": "collection/59", + "version": 465, + "value": { "v": 465 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 466, - { + }, + { + "key": "collection/60", + "version": 466, + "value": { "v": 466 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 467, - { + }, + { + "key": "collection/61", + "version": 467, + "value": { "v": 467 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 468, - { + }, + { + "key": "collection/62", + "version": 468, + "value": { "v": 468 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 469, - { + }, + { + "key": "collection/63", + "version": 469, + "value": { "v": 469 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 470, - { + }, + { + "key": "collection/64", + "version": 470, + "value": { "v": 470 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 471, - { + }, + { + "key": "collection/65", + "version": 471, + "value": { "v": 471 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 472, - { + }, + { + "key": "collection/66", + "version": 472, + "value": { "v": 472 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 473, - { + }, + { + "key": "collection/67", + "version": 473, + "value": { "v": 473 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 474, - { + }, + { + "key": "collection/68", + "version": 474, + "value": { "v": 474 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 475, - { + }, + { + "key": "collection/69", + "version": 475, + "value": { "v": 475 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 476, - { + }, + { + "key": "collection/70", + "version": 476, + "value": { "v": 476 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 477, - { + }, + { + "key": "collection/71", + "version": 477, + "value": { "v": 477 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 478, - { + }, + { + "key": "collection/72", + "version": 478, + "value": { "v": 478 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 479, - { + }, + { + "key": "collection/73", + "version": 479, + "value": { "v": 479 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 480, - { + }, + { + "key": "collection/74", + "version": 480, + "value": { "v": 480 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 481, - { + }, + { + "key": "collection/75", + "version": 481, + "value": { "v": 481 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 482, - { + }, + { + "key": "collection/76", + "version": 482, + "value": { "v": 482 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 483, - { + }, + { + "key": "collection/77", + "version": 483, + "value": { "v": 483 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 484, - { + }, + { + "key": "collection/78", + "version": 484, + "value": { "v": 484 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 485, - { + }, + { + "key": "collection/79", + "version": 485, + "value": { "v": 485 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 486, - { + }, + { + "key": "collection/80", + "version": 486, + "value": { "v": 486 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 487, - { + }, + { + "key": "collection/81", + "version": 487, + "value": { "v": 487 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 488, - { + }, + { + "key": "collection/82", + "version": 488, + "value": { "v": 488 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 489, - { + }, + { + "key": "collection/83", + "version": 489, + "value": { "v": 489 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 490, - { + }, + { + "key": "collection/84", + "version": 490, + "value": { "v": 490 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 491, - { + }, + { + "key": "collection/85", + "version": 491, + "value": { "v": 491 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 492, - { + }, + { + "key": "collection/86", + "version": 492, + "value": { "v": 492 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 493, - { + }, + { + "key": "collection/87", + "version": 493, + "value": { "v": 493 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 494, - { + }, + { + "key": "collection/88", + "version": 494, + "value": { "v": 494 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 495, - { + }, + { + "key": "collection/89", + "version": 495, + "value": { "v": 495 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 496, - { + }, + { + "key": "collection/90", + "version": 496, + "value": { "v": 496 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 497, - { + }, + { + "key": "collection/91", + "version": 497, + "value": { "v": 497 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 498, - { + }, + { + "key": "collection/92", + "version": 498, + "value": { "v": 498 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 499, - { + }, + { + "key": "collection/93", + "version": 499, + "value": { "v": 499 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 500, - { + }, + { + "key": "collection/94", + "version": 500, + "value": { "v": 500 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 501, - { + }, + { + "key": "collection/95", + "version": 501, + "value": { "v": 501 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 502, - { + }, + { + "key": "collection/96", + "version": 502, + "value": { "v": 502 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 503, - { + }, + { + "key": "collection/97", + "version": 503, + "value": { "v": 503 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 504, - { + }, + { + "key": "collection/98", + "version": 504, + "value": { "v": 504 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 505, - { + }, + { + "key": "collection/99", + "version": 505, + "value": { "v": 505 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -18881,7 +25738,8 @@ }, { "watchSnapshot": { - "version": 506 + "version": 506, + "targetIds": [] }, "expect": [ { @@ -18896,706 +25754,1106 @@ ] }, "modified": [ - [ - "collection/0", - 406, - { + { + "key": "collection/0", + "version": 406, + "value": { "v": 406 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 407, - { + }, + { + "key": "collection/1", + "version": 407, + "value": { "v": 407 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 408, - { + }, + { + "key": "collection/2", + "version": 408, + "value": { "v": 408 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 409, - { + }, + { + "key": "collection/3", + "version": 409, + "value": { "v": 409 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 410, - { + }, + { + "key": "collection/4", + "version": 410, + "value": { "v": 410 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 411, - { + }, + { + "key": "collection/5", + "version": 411, + "value": { "v": 411 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 412, - { + }, + { + "key": "collection/6", + "version": 412, + "value": { "v": 412 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 413, - { + }, + { + "key": "collection/7", + "version": 413, + "value": { "v": 413 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 414, - { + }, + { + "key": "collection/8", + "version": 414, + "value": { "v": 414 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 415, - { + }, + { + "key": "collection/9", + "version": 415, + "value": { "v": 415 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 416, - { + }, + { + "key": "collection/10", + "version": 416, + "value": { "v": 416 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 417, - { + }, + { + "key": "collection/11", + "version": 417, + "value": { "v": 417 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 418, - { + }, + { + "key": "collection/12", + "version": 418, + "value": { "v": 418 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 419, - { + }, + { + "key": "collection/13", + "version": 419, + "value": { "v": 419 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 420, - { + }, + { + "key": "collection/14", + "version": 420, + "value": { "v": 420 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 421, - { + }, + { + "key": "collection/15", + "version": 421, + "value": { "v": 421 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 422, - { + }, + { + "key": "collection/16", + "version": 422, + "value": { "v": 422 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 423, - { + }, + { + "key": "collection/17", + "version": 423, + "value": { "v": 423 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 424, - { + }, + { + "key": "collection/18", + "version": 424, + "value": { "v": 424 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 425, - { + }, + { + "key": "collection/19", + "version": 425, + "value": { "v": 425 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 426, - { + }, + { + "key": "collection/20", + "version": 426, + "value": { "v": 426 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 427, - { + }, + { + "key": "collection/21", + "version": 427, + "value": { "v": 427 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 428, - { + }, + { + "key": "collection/22", + "version": 428, + "value": { "v": 428 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 429, - { + }, + { + "key": "collection/23", + "version": 429, + "value": { "v": 429 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 430, - { + }, + { + "key": "collection/24", + "version": 430, + "value": { "v": 430 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 431, - { + }, + { + "key": "collection/25", + "version": 431, + "value": { "v": 431 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 432, - { + }, + { + "key": "collection/26", + "version": 432, + "value": { "v": 432 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 433, - { + }, + { + "key": "collection/27", + "version": 433, + "value": { "v": 433 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 434, - { + }, + { + "key": "collection/28", + "version": 434, + "value": { "v": 434 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 435, - { + }, + { + "key": "collection/29", + "version": 435, + "value": { "v": 435 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 436, - { + }, + { + "key": "collection/30", + "version": 436, + "value": { "v": 436 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 437, - { + }, + { + "key": "collection/31", + "version": 437, + "value": { "v": 437 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 438, - { + }, + { + "key": "collection/32", + "version": 438, + "value": { "v": 438 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 439, - { + }, + { + "key": "collection/33", + "version": 439, + "value": { "v": 439 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 440, - { + }, + { + "key": "collection/34", + "version": 440, + "value": { "v": 440 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 441, - { + }, + { + "key": "collection/35", + "version": 441, + "value": { "v": 441 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 442, - { + }, + { + "key": "collection/36", + "version": 442, + "value": { "v": 442 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 443, - { + }, + { + "key": "collection/37", + "version": 443, + "value": { "v": 443 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 444, - { + }, + { + "key": "collection/38", + "version": 444, + "value": { "v": 444 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 445, - { + }, + { + "key": "collection/39", + "version": 445, + "value": { "v": 445 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 446, - { + }, + { + "key": "collection/40", + "version": 446, + "value": { "v": 446 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 447, - { + }, + { + "key": "collection/41", + "version": 447, + "value": { "v": 447 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 448, - { + }, + { + "key": "collection/42", + "version": 448, + "value": { "v": 448 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 449, - { + }, + { + "key": "collection/43", + "version": 449, + "value": { "v": 449 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 450, - { + }, + { + "key": "collection/44", + "version": 450, + "value": { "v": 450 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 451, - { + }, + { + "key": "collection/45", + "version": 451, + "value": { "v": 451 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 452, - { + }, + { + "key": "collection/46", + "version": 452, + "value": { "v": 452 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 453, - { + }, + { + "key": "collection/47", + "version": 453, + "value": { "v": 453 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 454, - { + }, + { + "key": "collection/48", + "version": 454, + "value": { "v": 454 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 455, - { + }, + { + "key": "collection/49", + "version": 455, + "value": { "v": 455 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 456, - { + }, + { + "key": "collection/50", + "version": 456, + "value": { "v": 456 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 457, - { + }, + { + "key": "collection/51", + "version": 457, + "value": { "v": 457 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 458, - { + }, + { + "key": "collection/52", + "version": 458, + "value": { "v": 458 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 459, - { + }, + { + "key": "collection/53", + "version": 459, + "value": { "v": 459 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 460, - { + }, + { + "key": "collection/54", + "version": 460, + "value": { "v": 460 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 461, - { + }, + { + "key": "collection/55", + "version": 461, + "value": { "v": 461 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 462, - { + }, + { + "key": "collection/56", + "version": 462, + "value": { "v": 462 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 463, - { + }, + { + "key": "collection/57", + "version": 463, + "value": { "v": 463 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 464, - { + }, + { + "key": "collection/58", + "version": 464, + "value": { "v": 464 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 465, - { + }, + { + "key": "collection/59", + "version": 465, + "value": { "v": 465 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 466, - { + }, + { + "key": "collection/60", + "version": 466, + "value": { "v": 466 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 467, - { + }, + { + "key": "collection/61", + "version": 467, + "value": { "v": 467 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 468, - { + }, + { + "key": "collection/62", + "version": 468, + "value": { "v": 468 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 469, - { + }, + { + "key": "collection/63", + "version": 469, + "value": { "v": 469 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 470, - { + }, + { + "key": "collection/64", + "version": 470, + "value": { "v": 470 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 471, - { + }, + { + "key": "collection/65", + "version": 471, + "value": { "v": 471 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 472, - { + }, + { + "key": "collection/66", + "version": 472, + "value": { "v": 472 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 473, - { + }, + { + "key": "collection/67", + "version": 473, + "value": { "v": 473 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 474, - { + }, + { + "key": "collection/68", + "version": 474, + "value": { "v": 474 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 475, - { + }, + { + "key": "collection/69", + "version": 475, + "value": { "v": 475 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 476, - { + }, + { + "key": "collection/70", + "version": 476, + "value": { "v": 476 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 477, - { + }, + { + "key": "collection/71", + "version": 477, + "value": { "v": 477 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 478, - { + }, + { + "key": "collection/72", + "version": 478, + "value": { "v": 478 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 479, - { + }, + { + "key": "collection/73", + "version": 479, + "value": { "v": 479 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 480, - { + }, + { + "key": "collection/74", + "version": 480, + "value": { "v": 480 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 481, - { + }, + { + "key": "collection/75", + "version": 481, + "value": { "v": 481 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 482, - { + }, + { + "key": "collection/76", + "version": 482, + "value": { "v": 482 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 483, - { + }, + { + "key": "collection/77", + "version": 483, + "value": { "v": 483 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 484, - { + }, + { + "key": "collection/78", + "version": 484, + "value": { "v": 484 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 485, - { + }, + { + "key": "collection/79", + "version": 485, + "value": { "v": 485 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 486, - { + }, + { + "key": "collection/80", + "version": 486, + "value": { "v": 486 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 487, - { + }, + { + "key": "collection/81", + "version": 487, + "value": { "v": 487 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 488, - { + }, + { + "key": "collection/82", + "version": 488, + "value": { "v": 488 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 489, - { + }, + { + "key": "collection/83", + "version": 489, + "value": { "v": 489 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 490, - { + }, + { + "key": "collection/84", + "version": 490, + "value": { "v": 490 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 491, - { + }, + { + "key": "collection/85", + "version": 491, + "value": { "v": 491 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 492, - { + }, + { + "key": "collection/86", + "version": 492, + "value": { "v": 492 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 493, - { + }, + { + "key": "collection/87", + "version": 493, + "value": { "v": 493 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 494, - { + }, + { + "key": "collection/88", + "version": 494, + "value": { "v": 494 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 495, - { + }, + { + "key": "collection/89", + "version": 495, + "value": { "v": 495 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 496, - { + }, + { + "key": "collection/90", + "version": 496, + "value": { "v": 496 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 497, - { + }, + { + "key": "collection/91", + "version": 497, + "value": { "v": 497 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 498, - { + }, + { + "key": "collection/92", + "version": 498, + "value": { "v": 498 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 499, - { + }, + { + "key": "collection/93", + "version": 499, + "value": { "v": 499 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 500, - { + }, + { + "key": "collection/94", + "version": 500, + "value": { "v": 500 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 501, - { + }, + { + "key": "collection/95", + "version": 501, + "value": { "v": 501 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 502, - { + }, + { + "key": "collection/96", + "version": 502, + "value": { "v": 502 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 503, - { + }, + { + "key": "collection/97", + "version": 503, + "value": { "v": 503 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 504, - { + }, + { + "key": "collection/98", + "version": 504, + "value": { "v": 504 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 505, - { + }, + { + "key": "collection/99", + "version": 505, + "value": { "v": 505 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -19606,706 +26864,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 507, - { + { + "key": "collection/0", + "version": 507, + "value": { "v": 507 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 508, - { + }, + { + "key": "collection/1", + "version": 508, + "value": { "v": 508 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 509, - { + }, + { + "key": "collection/2", + "version": 509, + "value": { "v": 509 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 510, - { + }, + { + "key": "collection/3", + "version": 510, + "value": { "v": 510 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 511, - { + }, + { + "key": "collection/4", + "version": 511, + "value": { "v": 511 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 512, - { + }, + { + "key": "collection/5", + "version": 512, + "value": { "v": 512 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 513, - { + }, + { + "key": "collection/6", + "version": 513, + "value": { "v": 513 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 514, - { + }, + { + "key": "collection/7", + "version": 514, + "value": { "v": 514 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 515, - { + }, + { + "key": "collection/8", + "version": 515, + "value": { "v": 515 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 516, - { + }, + { + "key": "collection/9", + "version": 516, + "value": { "v": 516 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 517, - { + }, + { + "key": "collection/10", + "version": 517, + "value": { "v": 517 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 518, - { + }, + { + "key": "collection/11", + "version": 518, + "value": { "v": 518 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 519, - { + }, + { + "key": "collection/12", + "version": 519, + "value": { "v": 519 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 520, - { + }, + { + "key": "collection/13", + "version": 520, + "value": { "v": 520 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 521, - { + }, + { + "key": "collection/14", + "version": 521, + "value": { "v": 521 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 522, - { + }, + { + "key": "collection/15", + "version": 522, + "value": { "v": 522 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 523, - { + }, + { + "key": "collection/16", + "version": 523, + "value": { "v": 523 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 524, - { + }, + { + "key": "collection/17", + "version": 524, + "value": { "v": 524 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 525, - { + }, + { + "key": "collection/18", + "version": 525, + "value": { "v": 525 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 526, - { + }, + { + "key": "collection/19", + "version": 526, + "value": { "v": 526 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 527, - { + }, + { + "key": "collection/20", + "version": 527, + "value": { "v": 527 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 528, - { + }, + { + "key": "collection/21", + "version": 528, + "value": { "v": 528 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 529, - { + }, + { + "key": "collection/22", + "version": 529, + "value": { "v": 529 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 530, - { + }, + { + "key": "collection/23", + "version": 530, + "value": { "v": 530 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 531, - { + }, + { + "key": "collection/24", + "version": 531, + "value": { "v": 531 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 532, - { + }, + { + "key": "collection/25", + "version": 532, + "value": { "v": 532 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 533, - { + }, + { + "key": "collection/26", + "version": 533, + "value": { "v": 533 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 534, - { + }, + { + "key": "collection/27", + "version": 534, + "value": { "v": 534 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 535, - { + }, + { + "key": "collection/28", + "version": 535, + "value": { "v": 535 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 536, - { + }, + { + "key": "collection/29", + "version": 536, + "value": { "v": 536 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 537, - { + }, + { + "key": "collection/30", + "version": 537, + "value": { "v": 537 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 538, - { + }, + { + "key": "collection/31", + "version": 538, + "value": { "v": 538 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 539, - { + }, + { + "key": "collection/32", + "version": 539, + "value": { "v": 539 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 540, - { + }, + { + "key": "collection/33", + "version": 540, + "value": { "v": 540 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 541, - { + }, + { + "key": "collection/34", + "version": 541, + "value": { "v": 541 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 542, - { + }, + { + "key": "collection/35", + "version": 542, + "value": { "v": 542 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 543, - { + }, + { + "key": "collection/36", + "version": 543, + "value": { "v": 543 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 544, - { + }, + { + "key": "collection/37", + "version": 544, + "value": { "v": 544 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 545, - { + }, + { + "key": "collection/38", + "version": 545, + "value": { "v": 545 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 546, - { + }, + { + "key": "collection/39", + "version": 546, + "value": { "v": 546 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 547, - { + }, + { + "key": "collection/40", + "version": 547, + "value": { "v": 547 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 548, - { + }, + { + "key": "collection/41", + "version": 548, + "value": { "v": 548 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 549, - { + }, + { + "key": "collection/42", + "version": 549, + "value": { "v": 549 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 550, - { + }, + { + "key": "collection/43", + "version": 550, + "value": { "v": 550 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 551, - { + }, + { + "key": "collection/44", + "version": 551, + "value": { "v": 551 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 552, - { + }, + { + "key": "collection/45", + "version": 552, + "value": { "v": 552 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 553, - { + }, + { + "key": "collection/46", + "version": 553, + "value": { "v": 553 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 554, - { + }, + { + "key": "collection/47", + "version": 554, + "value": { "v": 554 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 555, - { + }, + { + "key": "collection/48", + "version": 555, + "value": { "v": 555 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 556, - { + }, + { + "key": "collection/49", + "version": 556, + "value": { "v": 556 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 557, - { + }, + { + "key": "collection/50", + "version": 557, + "value": { "v": 557 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 558, - { + }, + { + "key": "collection/51", + "version": 558, + "value": { "v": 558 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 559, - { + }, + { + "key": "collection/52", + "version": 559, + "value": { "v": 559 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 560, - { + }, + { + "key": "collection/53", + "version": 560, + "value": { "v": 560 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 561, - { + }, + { + "key": "collection/54", + "version": 561, + "value": { "v": 561 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 562, - { + }, + { + "key": "collection/55", + "version": 562, + "value": { "v": 562 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 563, - { + }, + { + "key": "collection/56", + "version": 563, + "value": { "v": 563 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 564, - { + }, + { + "key": "collection/57", + "version": 564, + "value": { "v": 564 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 565, - { + }, + { + "key": "collection/58", + "version": 565, + "value": { "v": 565 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 566, - { + }, + { + "key": "collection/59", + "version": 566, + "value": { "v": 566 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 567, - { + }, + { + "key": "collection/60", + "version": 567, + "value": { "v": 567 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 568, - { + }, + { + "key": "collection/61", + "version": 568, + "value": { "v": 568 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 569, - { + }, + { + "key": "collection/62", + "version": 569, + "value": { "v": 569 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 570, - { + }, + { + "key": "collection/63", + "version": 570, + "value": { "v": 570 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 571, - { + }, + { + "key": "collection/64", + "version": 571, + "value": { "v": 571 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 572, - { + }, + { + "key": "collection/65", + "version": 572, + "value": { "v": 572 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 573, - { + }, + { + "key": "collection/66", + "version": 573, + "value": { "v": 573 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 574, - { + }, + { + "key": "collection/67", + "version": 574, + "value": { "v": 574 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 575, - { + }, + { + "key": "collection/68", + "version": 575, + "value": { "v": 575 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 576, - { + }, + { + "key": "collection/69", + "version": 576, + "value": { "v": 576 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 577, - { + }, + { + "key": "collection/70", + "version": 577, + "value": { "v": 577 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 578, - { + }, + { + "key": "collection/71", + "version": 578, + "value": { "v": 578 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 579, - { + }, + { + "key": "collection/72", + "version": 579, + "value": { "v": 579 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 580, - { + }, + { + "key": "collection/73", + "version": 580, + "value": { "v": 580 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 581, - { + }, + { + "key": "collection/74", + "version": 581, + "value": { "v": 581 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 582, - { + }, + { + "key": "collection/75", + "version": 582, + "value": { "v": 582 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 583, - { + }, + { + "key": "collection/76", + "version": 583, + "value": { "v": 583 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 584, - { + }, + { + "key": "collection/77", + "version": 584, + "value": { "v": 584 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 585, - { + }, + { + "key": "collection/78", + "version": 585, + "value": { "v": 585 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 586, - { + }, + { + "key": "collection/79", + "version": 586, + "value": { "v": 586 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 587, - { + }, + { + "key": "collection/80", + "version": 587, + "value": { "v": 587 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 588, - { + }, + { + "key": "collection/81", + "version": 588, + "value": { "v": 588 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 589, - { + }, + { + "key": "collection/82", + "version": 589, + "value": { "v": 589 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 590, - { + }, + { + "key": "collection/83", + "version": 590, + "value": { "v": 590 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 591, - { + }, + { + "key": "collection/84", + "version": 591, + "value": { "v": 591 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 592, - { + }, + { + "key": "collection/85", + "version": 592, + "value": { "v": 592 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 593, - { + }, + { + "key": "collection/86", + "version": 593, + "value": { "v": 593 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 594, - { + }, + { + "key": "collection/87", + "version": 594, + "value": { "v": 594 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 595, - { + }, + { + "key": "collection/88", + "version": 595, + "value": { "v": 595 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 596, - { + }, + { + "key": "collection/89", + "version": 596, + "value": { "v": 596 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 597, - { + }, + { + "key": "collection/90", + "version": 597, + "value": { "v": 597 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 598, - { + }, + { + "key": "collection/91", + "version": 598, + "value": { "v": 598 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 599, - { + }, + { + "key": "collection/92", + "version": 599, + "value": { "v": 599 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 600, - { + }, + { + "key": "collection/93", + "version": 600, + "value": { "v": 600 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 601, - { + }, + { + "key": "collection/94", + "version": 601, + "value": { "v": 601 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 602, - { + }, + { + "key": "collection/95", + "version": 602, + "value": { "v": 602 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 603, - { + }, + { + "key": "collection/96", + "version": 603, + "value": { "v": 603 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 604, - { + }, + { + "key": "collection/97", + "version": 604, + "value": { "v": 604 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 605, - { + }, + { + "key": "collection/98", + "version": 605, + "value": { "v": 605 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 606, - { + }, + { + "key": "collection/99", + "version": 606, + "value": { "v": 606 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -20314,7 +27972,8 @@ }, { "watchSnapshot": { - "version": 607 + "version": 607, + "targetIds": [] }, "expect": [ { @@ -20329,706 +27988,1106 @@ ] }, "modified": [ - [ - "collection/0", - 507, - { + { + "key": "collection/0", + "version": 507, + "value": { "v": 507 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 508, - { + }, + { + "key": "collection/1", + "version": 508, + "value": { "v": 508 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 509, - { + }, + { + "key": "collection/2", + "version": 509, + "value": { "v": 509 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 510, - { + }, + { + "key": "collection/3", + "version": 510, + "value": { "v": 510 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 511, - { + }, + { + "key": "collection/4", + "version": 511, + "value": { "v": 511 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 512, - { + }, + { + "key": "collection/5", + "version": 512, + "value": { "v": 512 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 513, - { + }, + { + "key": "collection/6", + "version": 513, + "value": { "v": 513 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 514, - { + }, + { + "key": "collection/7", + "version": 514, + "value": { "v": 514 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 515, - { + }, + { + "key": "collection/8", + "version": 515, + "value": { "v": 515 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 516, - { + }, + { + "key": "collection/9", + "version": 516, + "value": { "v": 516 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 517, - { + }, + { + "key": "collection/10", + "version": 517, + "value": { "v": 517 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 518, - { + }, + { + "key": "collection/11", + "version": 518, + "value": { "v": 518 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 519, - { + }, + { + "key": "collection/12", + "version": 519, + "value": { "v": 519 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 520, - { + }, + { + "key": "collection/13", + "version": 520, + "value": { "v": 520 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 521, - { + }, + { + "key": "collection/14", + "version": 521, + "value": { "v": 521 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 522, - { + }, + { + "key": "collection/15", + "version": 522, + "value": { "v": 522 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 523, - { + }, + { + "key": "collection/16", + "version": 523, + "value": { "v": 523 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 524, - { + }, + { + "key": "collection/17", + "version": 524, + "value": { "v": 524 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 525, - { + }, + { + "key": "collection/18", + "version": 525, + "value": { "v": 525 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 526, - { + }, + { + "key": "collection/19", + "version": 526, + "value": { "v": 526 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 527, - { + }, + { + "key": "collection/20", + "version": 527, + "value": { "v": 527 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 528, - { + }, + { + "key": "collection/21", + "version": 528, + "value": { "v": 528 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 529, - { + }, + { + "key": "collection/22", + "version": 529, + "value": { "v": 529 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 530, - { + }, + { + "key": "collection/23", + "version": 530, + "value": { "v": 530 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 531, - { + }, + { + "key": "collection/24", + "version": 531, + "value": { "v": 531 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 532, - { + }, + { + "key": "collection/25", + "version": 532, + "value": { "v": 532 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 533, - { + }, + { + "key": "collection/26", + "version": 533, + "value": { "v": 533 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 534, - { + }, + { + "key": "collection/27", + "version": 534, + "value": { "v": 534 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 535, - { + }, + { + "key": "collection/28", + "version": 535, + "value": { "v": 535 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 536, - { + }, + { + "key": "collection/29", + "version": 536, + "value": { "v": 536 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 537, - { + }, + { + "key": "collection/30", + "version": 537, + "value": { "v": 537 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 538, - { + }, + { + "key": "collection/31", + "version": 538, + "value": { "v": 538 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 539, - { + }, + { + "key": "collection/32", + "version": 539, + "value": { "v": 539 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 540, - { + }, + { + "key": "collection/33", + "version": 540, + "value": { "v": 540 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 541, - { + }, + { + "key": "collection/34", + "version": 541, + "value": { "v": 541 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 542, - { + }, + { + "key": "collection/35", + "version": 542, + "value": { "v": 542 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 543, - { + }, + { + "key": "collection/36", + "version": 543, + "value": { "v": 543 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 544, - { + }, + { + "key": "collection/37", + "version": 544, + "value": { "v": 544 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 545, - { + }, + { + "key": "collection/38", + "version": 545, + "value": { "v": 545 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 546, - { + }, + { + "key": "collection/39", + "version": 546, + "value": { "v": 546 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 547, - { + }, + { + "key": "collection/40", + "version": 547, + "value": { "v": 547 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 548, - { + }, + { + "key": "collection/41", + "version": 548, + "value": { "v": 548 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 549, - { + }, + { + "key": "collection/42", + "version": 549, + "value": { "v": 549 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 550, - { + }, + { + "key": "collection/43", + "version": 550, + "value": { "v": 550 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 551, - { + }, + { + "key": "collection/44", + "version": 551, + "value": { "v": 551 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 552, - { + }, + { + "key": "collection/45", + "version": 552, + "value": { "v": 552 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 553, - { + }, + { + "key": "collection/46", + "version": 553, + "value": { "v": 553 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 554, - { + }, + { + "key": "collection/47", + "version": 554, + "value": { "v": 554 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 555, - { + }, + { + "key": "collection/48", + "version": 555, + "value": { "v": 555 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 556, - { + }, + { + "key": "collection/49", + "version": 556, + "value": { "v": 556 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 557, - { + }, + { + "key": "collection/50", + "version": 557, + "value": { "v": 557 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 558, - { + }, + { + "key": "collection/51", + "version": 558, + "value": { "v": 558 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 559, - { + }, + { + "key": "collection/52", + "version": 559, + "value": { "v": 559 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 560, - { + }, + { + "key": "collection/53", + "version": 560, + "value": { "v": 560 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 561, - { + }, + { + "key": "collection/54", + "version": 561, + "value": { "v": 561 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 562, - { + }, + { + "key": "collection/55", + "version": 562, + "value": { "v": 562 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 563, - { + }, + { + "key": "collection/56", + "version": 563, + "value": { "v": 563 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 564, - { + }, + { + "key": "collection/57", + "version": 564, + "value": { "v": 564 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 565, - { + }, + { + "key": "collection/58", + "version": 565, + "value": { "v": 565 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 566, - { + }, + { + "key": "collection/59", + "version": 566, + "value": { "v": 566 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 567, - { + }, + { + "key": "collection/60", + "version": 567, + "value": { "v": 567 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 568, - { + }, + { + "key": "collection/61", + "version": 568, + "value": { "v": 568 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 569, - { + }, + { + "key": "collection/62", + "version": 569, + "value": { "v": 569 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 570, - { + }, + { + "key": "collection/63", + "version": 570, + "value": { "v": 570 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 571, - { + }, + { + "key": "collection/64", + "version": 571, + "value": { "v": 571 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 572, - { + }, + { + "key": "collection/65", + "version": 572, + "value": { "v": 572 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 573, - { + }, + { + "key": "collection/66", + "version": 573, + "value": { "v": 573 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 574, - { + }, + { + "key": "collection/67", + "version": 574, + "value": { "v": 574 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 575, - { + }, + { + "key": "collection/68", + "version": 575, + "value": { "v": 575 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 576, - { + }, + { + "key": "collection/69", + "version": 576, + "value": { "v": 576 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 577, - { + }, + { + "key": "collection/70", + "version": 577, + "value": { "v": 577 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 578, - { + }, + { + "key": "collection/71", + "version": 578, + "value": { "v": 578 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 579, - { + }, + { + "key": "collection/72", + "version": 579, + "value": { "v": 579 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 580, - { + }, + { + "key": "collection/73", + "version": 580, + "value": { "v": 580 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 581, - { + }, + { + "key": "collection/74", + "version": 581, + "value": { "v": 581 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 582, - { + }, + { + "key": "collection/75", + "version": 582, + "value": { "v": 582 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 583, - { + }, + { + "key": "collection/76", + "version": 583, + "value": { "v": 583 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 584, - { + }, + { + "key": "collection/77", + "version": 584, + "value": { "v": 584 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 585, - { + }, + { + "key": "collection/78", + "version": 585, + "value": { "v": 585 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 586, - { + }, + { + "key": "collection/79", + "version": 586, + "value": { "v": 586 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 587, - { + }, + { + "key": "collection/80", + "version": 587, + "value": { "v": 587 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 588, - { + }, + { + "key": "collection/81", + "version": 588, + "value": { "v": 588 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 589, - { + }, + { + "key": "collection/82", + "version": 589, + "value": { "v": 589 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 590, - { + }, + { + "key": "collection/83", + "version": 590, + "value": { "v": 590 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 591, - { + }, + { + "key": "collection/84", + "version": 591, + "value": { "v": 591 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 592, - { + }, + { + "key": "collection/85", + "version": 592, + "value": { "v": 592 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 593, - { + }, + { + "key": "collection/86", + "version": 593, + "value": { "v": 593 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 594, - { + }, + { + "key": "collection/87", + "version": 594, + "value": { "v": 594 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 595, - { + }, + { + "key": "collection/88", + "version": 595, + "value": { "v": 595 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 596, - { + }, + { + "key": "collection/89", + "version": 596, + "value": { "v": 596 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 597, - { + }, + { + "key": "collection/90", + "version": 597, + "value": { "v": 597 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 598, - { + }, + { + "key": "collection/91", + "version": 598, + "value": { "v": 598 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 599, - { + }, + { + "key": "collection/92", + "version": 599, + "value": { "v": 599 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 600, - { + }, + { + "key": "collection/93", + "version": 600, + "value": { "v": 600 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 601, - { + }, + { + "key": "collection/94", + "version": 601, + "value": { "v": 601 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 602, - { + }, + { + "key": "collection/95", + "version": 602, + "value": { "v": 602 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 603, - { + }, + { + "key": "collection/96", + "version": 603, + "value": { "v": 603 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 604, - { + }, + { + "key": "collection/97", + "version": 604, + "value": { "v": 604 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 605, - { + }, + { + "key": "collection/98", + "version": 605, + "value": { "v": 605 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 606, - { + }, + { + "key": "collection/99", + "version": 606, + "value": { "v": 606 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -21039,706 +29098,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 608, - { + { + "key": "collection/0", + "version": 608, + "value": { "v": 608 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 609, - { + }, + { + "key": "collection/1", + "version": 609, + "value": { "v": 609 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 610, - { + }, + { + "key": "collection/2", + "version": 610, + "value": { "v": 610 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 611, - { + }, + { + "key": "collection/3", + "version": 611, + "value": { "v": 611 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 612, - { + }, + { + "key": "collection/4", + "version": 612, + "value": { "v": 612 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 613, - { + }, + { + "key": "collection/5", + "version": 613, + "value": { "v": 613 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 614, - { + }, + { + "key": "collection/6", + "version": 614, + "value": { "v": 614 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 615, - { + }, + { + "key": "collection/7", + "version": 615, + "value": { "v": 615 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 616, - { + }, + { + "key": "collection/8", + "version": 616, + "value": { "v": 616 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 617, - { + }, + { + "key": "collection/9", + "version": 617, + "value": { "v": 617 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 618, - { + }, + { + "key": "collection/10", + "version": 618, + "value": { "v": 618 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 619, - { + }, + { + "key": "collection/11", + "version": 619, + "value": { "v": 619 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 620, - { + }, + { + "key": "collection/12", + "version": 620, + "value": { "v": 620 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 621, - { + }, + { + "key": "collection/13", + "version": 621, + "value": { "v": 621 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 622, - { + }, + { + "key": "collection/14", + "version": 622, + "value": { "v": 622 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 623, - { + }, + { + "key": "collection/15", + "version": 623, + "value": { "v": 623 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 624, - { + }, + { + "key": "collection/16", + "version": 624, + "value": { "v": 624 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 625, - { + }, + { + "key": "collection/17", + "version": 625, + "value": { "v": 625 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 626, - { + }, + { + "key": "collection/18", + "version": 626, + "value": { "v": 626 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 627, - { + }, + { + "key": "collection/19", + "version": 627, + "value": { "v": 627 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 628, - { + }, + { + "key": "collection/20", + "version": 628, + "value": { "v": 628 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 629, - { + }, + { + "key": "collection/21", + "version": 629, + "value": { "v": 629 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 630, - { + }, + { + "key": "collection/22", + "version": 630, + "value": { "v": 630 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 631, - { + }, + { + "key": "collection/23", + "version": 631, + "value": { "v": 631 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 632, - { + }, + { + "key": "collection/24", + "version": 632, + "value": { "v": 632 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 633, - { + }, + { + "key": "collection/25", + "version": 633, + "value": { "v": 633 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 634, - { + }, + { + "key": "collection/26", + "version": 634, + "value": { "v": 634 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 635, - { + }, + { + "key": "collection/27", + "version": 635, + "value": { "v": 635 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 636, - { + }, + { + "key": "collection/28", + "version": 636, + "value": { "v": 636 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 637, - { + }, + { + "key": "collection/29", + "version": 637, + "value": { "v": 637 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 638, - { + }, + { + "key": "collection/30", + "version": 638, + "value": { "v": 638 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 639, - { + }, + { + "key": "collection/31", + "version": 639, + "value": { "v": 639 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 640, - { + }, + { + "key": "collection/32", + "version": 640, + "value": { "v": 640 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 641, - { + }, + { + "key": "collection/33", + "version": 641, + "value": { "v": 641 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 642, - { + }, + { + "key": "collection/34", + "version": 642, + "value": { "v": 642 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 643, - { + }, + { + "key": "collection/35", + "version": 643, + "value": { "v": 643 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 644, - { + }, + { + "key": "collection/36", + "version": 644, + "value": { "v": 644 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 645, - { + }, + { + "key": "collection/37", + "version": 645, + "value": { "v": 645 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 646, - { + }, + { + "key": "collection/38", + "version": 646, + "value": { "v": 646 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 647, - { + }, + { + "key": "collection/39", + "version": 647, + "value": { "v": 647 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 648, - { + }, + { + "key": "collection/40", + "version": 648, + "value": { "v": 648 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 649, - { + }, + { + "key": "collection/41", + "version": 649, + "value": { "v": 649 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 650, - { + }, + { + "key": "collection/42", + "version": 650, + "value": { "v": 650 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 651, - { + }, + { + "key": "collection/43", + "version": 651, + "value": { "v": 651 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 652, - { + }, + { + "key": "collection/44", + "version": 652, + "value": { "v": 652 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 653, - { + }, + { + "key": "collection/45", + "version": 653, + "value": { "v": 653 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 654, - { + }, + { + "key": "collection/46", + "version": 654, + "value": { "v": 654 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 655, - { + }, + { + "key": "collection/47", + "version": 655, + "value": { "v": 655 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 656, - { + }, + { + "key": "collection/48", + "version": 656, + "value": { "v": 656 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 657, - { + }, + { + "key": "collection/49", + "version": 657, + "value": { "v": 657 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 658, - { + }, + { + "key": "collection/50", + "version": 658, + "value": { "v": 658 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 659, - { + }, + { + "key": "collection/51", + "version": 659, + "value": { "v": 659 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 660, - { + }, + { + "key": "collection/52", + "version": 660, + "value": { "v": 660 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 661, - { + }, + { + "key": "collection/53", + "version": 661, + "value": { "v": 661 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 662, - { + }, + { + "key": "collection/54", + "version": 662, + "value": { "v": 662 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 663, - { + }, + { + "key": "collection/55", + "version": 663, + "value": { "v": 663 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 664, - { + }, + { + "key": "collection/56", + "version": 664, + "value": { "v": 664 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 665, - { + }, + { + "key": "collection/57", + "version": 665, + "value": { "v": 665 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 666, - { + }, + { + "key": "collection/58", + "version": 666, + "value": { "v": 666 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 667, - { + }, + { + "key": "collection/59", + "version": 667, + "value": { "v": 667 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 668, - { + }, + { + "key": "collection/60", + "version": 668, + "value": { "v": 668 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 669, - { + }, + { + "key": "collection/61", + "version": 669, + "value": { "v": 669 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 670, - { + }, + { + "key": "collection/62", + "version": 670, + "value": { "v": 670 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 671, - { + }, + { + "key": "collection/63", + "version": 671, + "value": { "v": 671 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 672, - { + }, + { + "key": "collection/64", + "version": 672, + "value": { "v": 672 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 673, - { + }, + { + "key": "collection/65", + "version": 673, + "value": { "v": 673 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 674, - { + }, + { + "key": "collection/66", + "version": 674, + "value": { "v": 674 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 675, - { + }, + { + "key": "collection/67", + "version": 675, + "value": { "v": 675 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 676, - { + }, + { + "key": "collection/68", + "version": 676, + "value": { "v": 676 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 677, - { + }, + { + "key": "collection/69", + "version": 677, + "value": { "v": 677 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 678, - { + }, + { + "key": "collection/70", + "version": 678, + "value": { "v": 678 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 679, - { + }, + { + "key": "collection/71", + "version": 679, + "value": { "v": 679 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 680, - { + }, + { + "key": "collection/72", + "version": 680, + "value": { "v": 680 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 681, - { + }, + { + "key": "collection/73", + "version": 681, + "value": { "v": 681 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 682, - { + }, + { + "key": "collection/74", + "version": 682, + "value": { "v": 682 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 683, - { + }, + { + "key": "collection/75", + "version": 683, + "value": { "v": 683 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 684, - { + }, + { + "key": "collection/76", + "version": 684, + "value": { "v": 684 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 685, - { + }, + { + "key": "collection/77", + "version": 685, + "value": { "v": 685 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 686, - { + }, + { + "key": "collection/78", + "version": 686, + "value": { "v": 686 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 687, - { + }, + { + "key": "collection/79", + "version": 687, + "value": { "v": 687 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 688, - { + }, + { + "key": "collection/80", + "version": 688, + "value": { "v": 688 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 689, - { + }, + { + "key": "collection/81", + "version": 689, + "value": { "v": 689 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 690, - { + }, + { + "key": "collection/82", + "version": 690, + "value": { "v": 690 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 691, - { + }, + { + "key": "collection/83", + "version": 691, + "value": { "v": 691 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 692, - { + }, + { + "key": "collection/84", + "version": 692, + "value": { "v": 692 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 693, - { + }, + { + "key": "collection/85", + "version": 693, + "value": { "v": 693 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 694, - { + }, + { + "key": "collection/86", + "version": 694, + "value": { "v": 694 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 695, - { + }, + { + "key": "collection/87", + "version": 695, + "value": { "v": 695 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 696, - { + }, + { + "key": "collection/88", + "version": 696, + "value": { "v": 696 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 697, - { + }, + { + "key": "collection/89", + "version": 697, + "value": { "v": 697 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 698, - { + }, + { + "key": "collection/90", + "version": 698, + "value": { "v": 698 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 699, - { + }, + { + "key": "collection/91", + "version": 699, + "value": { "v": 699 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 700, - { + }, + { + "key": "collection/92", + "version": 700, + "value": { "v": 700 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 701, - { + }, + { + "key": "collection/93", + "version": 701, + "value": { "v": 701 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 702, - { + }, + { + "key": "collection/94", + "version": 702, + "value": { "v": 702 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 703, - { + }, + { + "key": "collection/95", + "version": 703, + "value": { "v": 703 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 704, - { + }, + { + "key": "collection/96", + "version": 704, + "value": { "v": 704 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 705, - { + }, + { + "key": "collection/97", + "version": 705, + "value": { "v": 705 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 706, - { + }, + { + "key": "collection/98", + "version": 706, + "value": { "v": 706 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 707, - { + }, + { + "key": "collection/99", + "version": 707, + "value": { "v": 707 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -21747,7 +30206,8 @@ }, { "watchSnapshot": { - "version": 708 + "version": 708, + "targetIds": [] }, "expect": [ { @@ -21762,706 +30222,1106 @@ ] }, "modified": [ - [ - "collection/0", - 608, - { + { + "key": "collection/0", + "version": 608, + "value": { "v": 608 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 609, - { + }, + { + "key": "collection/1", + "version": 609, + "value": { "v": 609 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 610, - { + }, + { + "key": "collection/2", + "version": 610, + "value": { "v": 610 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 611, - { + }, + { + "key": "collection/3", + "version": 611, + "value": { "v": 611 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 612, - { + }, + { + "key": "collection/4", + "version": 612, + "value": { "v": 612 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 613, - { + }, + { + "key": "collection/5", + "version": 613, + "value": { "v": 613 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 614, - { + }, + { + "key": "collection/6", + "version": 614, + "value": { "v": 614 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 615, - { + }, + { + "key": "collection/7", + "version": 615, + "value": { "v": 615 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 616, - { + }, + { + "key": "collection/8", + "version": 616, + "value": { "v": 616 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 617, - { + }, + { + "key": "collection/9", + "version": 617, + "value": { "v": 617 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 618, - { + }, + { + "key": "collection/10", + "version": 618, + "value": { "v": 618 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 619, - { + }, + { + "key": "collection/11", + "version": 619, + "value": { "v": 619 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 620, - { + }, + { + "key": "collection/12", + "version": 620, + "value": { "v": 620 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 621, - { + }, + { + "key": "collection/13", + "version": 621, + "value": { "v": 621 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 622, - { + }, + { + "key": "collection/14", + "version": 622, + "value": { "v": 622 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 623, - { + }, + { + "key": "collection/15", + "version": 623, + "value": { "v": 623 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 624, - { + }, + { + "key": "collection/16", + "version": 624, + "value": { "v": 624 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 625, - { + }, + { + "key": "collection/17", + "version": 625, + "value": { "v": 625 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 626, - { + }, + { + "key": "collection/18", + "version": 626, + "value": { "v": 626 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 627, - { + }, + { + "key": "collection/19", + "version": 627, + "value": { "v": 627 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 628, - { + }, + { + "key": "collection/20", + "version": 628, + "value": { "v": 628 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 629, - { + }, + { + "key": "collection/21", + "version": 629, + "value": { "v": 629 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 630, - { + }, + { + "key": "collection/22", + "version": 630, + "value": { "v": 630 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 631, - { + }, + { + "key": "collection/23", + "version": 631, + "value": { "v": 631 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 632, - { + }, + { + "key": "collection/24", + "version": 632, + "value": { "v": 632 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 633, - { + }, + { + "key": "collection/25", + "version": 633, + "value": { "v": 633 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 634, - { + }, + { + "key": "collection/26", + "version": 634, + "value": { "v": 634 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 635, - { + }, + { + "key": "collection/27", + "version": 635, + "value": { "v": 635 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 636, - { + }, + { + "key": "collection/28", + "version": 636, + "value": { "v": 636 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 637, - { + }, + { + "key": "collection/29", + "version": 637, + "value": { "v": 637 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 638, - { + }, + { + "key": "collection/30", + "version": 638, + "value": { "v": 638 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 639, - { + }, + { + "key": "collection/31", + "version": 639, + "value": { "v": 639 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 640, - { + }, + { + "key": "collection/32", + "version": 640, + "value": { "v": 640 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 641, - { + }, + { + "key": "collection/33", + "version": 641, + "value": { "v": 641 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 642, - { + }, + { + "key": "collection/34", + "version": 642, + "value": { "v": 642 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 643, - { + }, + { + "key": "collection/35", + "version": 643, + "value": { "v": 643 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 644, - { + }, + { + "key": "collection/36", + "version": 644, + "value": { "v": 644 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 645, - { + }, + { + "key": "collection/37", + "version": 645, + "value": { "v": 645 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 646, - { + }, + { + "key": "collection/38", + "version": 646, + "value": { "v": 646 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 647, - { + }, + { + "key": "collection/39", + "version": 647, + "value": { "v": 647 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 648, - { + }, + { + "key": "collection/40", + "version": 648, + "value": { "v": 648 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 649, - { + }, + { + "key": "collection/41", + "version": 649, + "value": { "v": 649 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 650, - { + }, + { + "key": "collection/42", + "version": 650, + "value": { "v": 650 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 651, - { + }, + { + "key": "collection/43", + "version": 651, + "value": { "v": 651 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 652, - { + }, + { + "key": "collection/44", + "version": 652, + "value": { "v": 652 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 653, - { + }, + { + "key": "collection/45", + "version": 653, + "value": { "v": 653 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 654, - { + }, + { + "key": "collection/46", + "version": 654, + "value": { "v": 654 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 655, - { + }, + { + "key": "collection/47", + "version": 655, + "value": { "v": 655 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 656, - { + }, + { + "key": "collection/48", + "version": 656, + "value": { "v": 656 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 657, - { + }, + { + "key": "collection/49", + "version": 657, + "value": { "v": 657 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 658, - { + }, + { + "key": "collection/50", + "version": 658, + "value": { "v": 658 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 659, - { + }, + { + "key": "collection/51", + "version": 659, + "value": { "v": 659 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 660, - { + }, + { + "key": "collection/52", + "version": 660, + "value": { "v": 660 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 661, - { + }, + { + "key": "collection/53", + "version": 661, + "value": { "v": 661 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 662, - { + }, + { + "key": "collection/54", + "version": 662, + "value": { "v": 662 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 663, - { + }, + { + "key": "collection/55", + "version": 663, + "value": { "v": 663 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 664, - { + }, + { + "key": "collection/56", + "version": 664, + "value": { "v": 664 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 665, - { + }, + { + "key": "collection/57", + "version": 665, + "value": { "v": 665 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 666, - { + }, + { + "key": "collection/58", + "version": 666, + "value": { "v": 666 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 667, - { + }, + { + "key": "collection/59", + "version": 667, + "value": { "v": 667 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 668, - { + }, + { + "key": "collection/60", + "version": 668, + "value": { "v": 668 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 669, - { + }, + { + "key": "collection/61", + "version": 669, + "value": { "v": 669 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 670, - { + }, + { + "key": "collection/62", + "version": 670, + "value": { "v": 670 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 671, - { + }, + { + "key": "collection/63", + "version": 671, + "value": { "v": 671 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 672, - { + }, + { + "key": "collection/64", + "version": 672, + "value": { "v": 672 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 673, - { + }, + { + "key": "collection/65", + "version": 673, + "value": { "v": 673 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 674, - { + }, + { + "key": "collection/66", + "version": 674, + "value": { "v": 674 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 675, - { + }, + { + "key": "collection/67", + "version": 675, + "value": { "v": 675 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 676, - { + }, + { + "key": "collection/68", + "version": 676, + "value": { "v": 676 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 677, - { + }, + { + "key": "collection/69", + "version": 677, + "value": { "v": 677 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 678, - { + }, + { + "key": "collection/70", + "version": 678, + "value": { "v": 678 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 679, - { + }, + { + "key": "collection/71", + "version": 679, + "value": { "v": 679 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 680, - { + }, + { + "key": "collection/72", + "version": 680, + "value": { "v": 680 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 681, - { + }, + { + "key": "collection/73", + "version": 681, + "value": { "v": 681 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 682, - { + }, + { + "key": "collection/74", + "version": 682, + "value": { "v": 682 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 683, - { + }, + { + "key": "collection/75", + "version": 683, + "value": { "v": 683 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 684, - { + }, + { + "key": "collection/76", + "version": 684, + "value": { "v": 684 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 685, - { + }, + { + "key": "collection/77", + "version": 685, + "value": { "v": 685 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 686, - { + }, + { + "key": "collection/78", + "version": 686, + "value": { "v": 686 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 687, - { + }, + { + "key": "collection/79", + "version": 687, + "value": { "v": 687 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 688, - { + }, + { + "key": "collection/80", + "version": 688, + "value": { "v": 688 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 689, - { + }, + { + "key": "collection/81", + "version": 689, + "value": { "v": 689 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 690, - { + }, + { + "key": "collection/82", + "version": 690, + "value": { "v": 690 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 691, - { + }, + { + "key": "collection/83", + "version": 691, + "value": { "v": 691 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 692, - { + }, + { + "key": "collection/84", + "version": 692, + "value": { "v": 692 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 693, - { + }, + { + "key": "collection/85", + "version": 693, + "value": { "v": 693 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 694, - { + }, + { + "key": "collection/86", + "version": 694, + "value": { "v": 694 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 695, - { + }, + { + "key": "collection/87", + "version": 695, + "value": { "v": 695 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 696, - { + }, + { + "key": "collection/88", + "version": 696, + "value": { "v": 696 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 697, - { + }, + { + "key": "collection/89", + "version": 697, + "value": { "v": 697 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 698, - { + }, + { + "key": "collection/90", + "version": 698, + "value": { "v": 698 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 699, - { + }, + { + "key": "collection/91", + "version": 699, + "value": { "v": 699 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 700, - { + }, + { + "key": "collection/92", + "version": 700, + "value": { "v": 700 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 701, - { + }, + { + "key": "collection/93", + "version": 701, + "value": { "v": 701 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 702, - { + }, + { + "key": "collection/94", + "version": 702, + "value": { "v": 702 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 703, - { + }, + { + "key": "collection/95", + "version": 703, + "value": { "v": 703 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 704, - { + }, + { + "key": "collection/96", + "version": 704, + "value": { "v": 704 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 705, - { + }, + { + "key": "collection/97", + "version": 705, + "value": { "v": 705 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 706, - { + }, + { + "key": "collection/98", + "version": 706, + "value": { "v": 706 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 707, - { + }, + { + "key": "collection/99", + "version": 707, + "value": { "v": 707 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -22472,706 +31332,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 709, - { + { + "key": "collection/0", + "version": 709, + "value": { "v": 709 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 710, - { + }, + { + "key": "collection/1", + "version": 710, + "value": { "v": 710 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 711, - { + }, + { + "key": "collection/2", + "version": 711, + "value": { "v": 711 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 712, - { + }, + { + "key": "collection/3", + "version": 712, + "value": { "v": 712 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 713, - { + }, + { + "key": "collection/4", + "version": 713, + "value": { "v": 713 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 714, - { + }, + { + "key": "collection/5", + "version": 714, + "value": { "v": 714 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 715, - { + }, + { + "key": "collection/6", + "version": 715, + "value": { "v": 715 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 716, - { + }, + { + "key": "collection/7", + "version": 716, + "value": { "v": 716 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 717, - { + }, + { + "key": "collection/8", + "version": 717, + "value": { "v": 717 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 718, - { + }, + { + "key": "collection/9", + "version": 718, + "value": { "v": 718 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 719, - { + }, + { + "key": "collection/10", + "version": 719, + "value": { "v": 719 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 720, - { + }, + { + "key": "collection/11", + "version": 720, + "value": { "v": 720 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 721, - { + }, + { + "key": "collection/12", + "version": 721, + "value": { "v": 721 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 722, - { + }, + { + "key": "collection/13", + "version": 722, + "value": { "v": 722 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 723, - { + }, + { + "key": "collection/14", + "version": 723, + "value": { "v": 723 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 724, - { + }, + { + "key": "collection/15", + "version": 724, + "value": { "v": 724 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 725, - { + }, + { + "key": "collection/16", + "version": 725, + "value": { "v": 725 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 726, - { + }, + { + "key": "collection/17", + "version": 726, + "value": { "v": 726 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 727, - { + }, + { + "key": "collection/18", + "version": 727, + "value": { "v": 727 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 728, - { + }, + { + "key": "collection/19", + "version": 728, + "value": { "v": 728 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 729, - { + }, + { + "key": "collection/20", + "version": 729, + "value": { "v": 729 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 730, - { + }, + { + "key": "collection/21", + "version": 730, + "value": { "v": 730 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 731, - { + }, + { + "key": "collection/22", + "version": 731, + "value": { "v": 731 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 732, - { + }, + { + "key": "collection/23", + "version": 732, + "value": { "v": 732 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 733, - { + }, + { + "key": "collection/24", + "version": 733, + "value": { "v": 733 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 734, - { + }, + { + "key": "collection/25", + "version": 734, + "value": { "v": 734 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 735, - { + }, + { + "key": "collection/26", + "version": 735, + "value": { "v": 735 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 736, - { + }, + { + "key": "collection/27", + "version": 736, + "value": { "v": 736 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 737, - { + }, + { + "key": "collection/28", + "version": 737, + "value": { "v": 737 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 738, - { + }, + { + "key": "collection/29", + "version": 738, + "value": { "v": 738 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 739, - { + }, + { + "key": "collection/30", + "version": 739, + "value": { "v": 739 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 740, - { + }, + { + "key": "collection/31", + "version": 740, + "value": { "v": 740 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 741, - { + }, + { + "key": "collection/32", + "version": 741, + "value": { "v": 741 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 742, - { + }, + { + "key": "collection/33", + "version": 742, + "value": { "v": 742 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 743, - { + }, + { + "key": "collection/34", + "version": 743, + "value": { "v": 743 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 744, - { + }, + { + "key": "collection/35", + "version": 744, + "value": { "v": 744 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 745, - { + }, + { + "key": "collection/36", + "version": 745, + "value": { "v": 745 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 746, - { + }, + { + "key": "collection/37", + "version": 746, + "value": { "v": 746 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 747, - { + }, + { + "key": "collection/38", + "version": 747, + "value": { "v": 747 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 748, - { + }, + { + "key": "collection/39", + "version": 748, + "value": { "v": 748 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 749, - { + }, + { + "key": "collection/40", + "version": 749, + "value": { "v": 749 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 750, - { + }, + { + "key": "collection/41", + "version": 750, + "value": { "v": 750 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 751, - { + }, + { + "key": "collection/42", + "version": 751, + "value": { "v": 751 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 752, - { + }, + { + "key": "collection/43", + "version": 752, + "value": { "v": 752 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 753, - { + }, + { + "key": "collection/44", + "version": 753, + "value": { "v": 753 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 754, - { + }, + { + "key": "collection/45", + "version": 754, + "value": { "v": 754 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 755, - { + }, + { + "key": "collection/46", + "version": 755, + "value": { "v": 755 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 756, - { + }, + { + "key": "collection/47", + "version": 756, + "value": { "v": 756 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 757, - { + }, + { + "key": "collection/48", + "version": 757, + "value": { "v": 757 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 758, - { + }, + { + "key": "collection/49", + "version": 758, + "value": { "v": 758 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 759, - { + }, + { + "key": "collection/50", + "version": 759, + "value": { "v": 759 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 760, - { + }, + { + "key": "collection/51", + "version": 760, + "value": { "v": 760 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 761, - { + }, + { + "key": "collection/52", + "version": 761, + "value": { "v": 761 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 762, - { + }, + { + "key": "collection/53", + "version": 762, + "value": { "v": 762 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 763, - { + }, + { + "key": "collection/54", + "version": 763, + "value": { "v": 763 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 764, - { + }, + { + "key": "collection/55", + "version": 764, + "value": { "v": 764 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 765, - { + }, + { + "key": "collection/56", + "version": 765, + "value": { "v": 765 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 766, - { + }, + { + "key": "collection/57", + "version": 766, + "value": { "v": 766 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 767, - { + }, + { + "key": "collection/58", + "version": 767, + "value": { "v": 767 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 768, - { + }, + { + "key": "collection/59", + "version": 768, + "value": { "v": 768 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 769, - { + }, + { + "key": "collection/60", + "version": 769, + "value": { "v": 769 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 770, - { + }, + { + "key": "collection/61", + "version": 770, + "value": { "v": 770 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 771, - { + }, + { + "key": "collection/62", + "version": 771, + "value": { "v": 771 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 772, - { + }, + { + "key": "collection/63", + "version": 772, + "value": { "v": 772 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 773, - { + }, + { + "key": "collection/64", + "version": 773, + "value": { "v": 773 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 774, - { + }, + { + "key": "collection/65", + "version": 774, + "value": { "v": 774 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 775, - { + }, + { + "key": "collection/66", + "version": 775, + "value": { "v": 775 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 776, - { + }, + { + "key": "collection/67", + "version": 776, + "value": { "v": 776 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 777, - { + }, + { + "key": "collection/68", + "version": 777, + "value": { "v": 777 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 778, - { + }, + { + "key": "collection/69", + "version": 778, + "value": { "v": 778 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 779, - { + }, + { + "key": "collection/70", + "version": 779, + "value": { "v": 779 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 780, - { + }, + { + "key": "collection/71", + "version": 780, + "value": { "v": 780 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 781, - { + }, + { + "key": "collection/72", + "version": 781, + "value": { "v": 781 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 782, - { + }, + { + "key": "collection/73", + "version": 782, + "value": { "v": 782 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 783, - { + }, + { + "key": "collection/74", + "version": 783, + "value": { "v": 783 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 784, - { + }, + { + "key": "collection/75", + "version": 784, + "value": { "v": 784 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 785, - { + }, + { + "key": "collection/76", + "version": 785, + "value": { "v": 785 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 786, - { + }, + { + "key": "collection/77", + "version": 786, + "value": { "v": 786 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 787, - { + }, + { + "key": "collection/78", + "version": 787, + "value": { "v": 787 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 788, - { + }, + { + "key": "collection/79", + "version": 788, + "value": { "v": 788 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 789, - { + }, + { + "key": "collection/80", + "version": 789, + "value": { "v": 789 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 790, - { + }, + { + "key": "collection/81", + "version": 790, + "value": { "v": 790 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 791, - { + }, + { + "key": "collection/82", + "version": 791, + "value": { "v": 791 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 792, - { + }, + { + "key": "collection/83", + "version": 792, + "value": { "v": 792 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 793, - { + }, + { + "key": "collection/84", + "version": 793, + "value": { "v": 793 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 794, - { + }, + { + "key": "collection/85", + "version": 794, + "value": { "v": 794 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 795, - { + }, + { + "key": "collection/86", + "version": 795, + "value": { "v": 795 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 796, - { + }, + { + "key": "collection/87", + "version": 796, + "value": { "v": 796 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 797, - { + }, + { + "key": "collection/88", + "version": 797, + "value": { "v": 797 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 798, - { + }, + { + "key": "collection/89", + "version": 798, + "value": { "v": 798 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 799, - { + }, + { + "key": "collection/90", + "version": 799, + "value": { "v": 799 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 800, - { + }, + { + "key": "collection/91", + "version": 800, + "value": { "v": 800 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 801, - { + }, + { + "key": "collection/92", + "version": 801, + "value": { "v": 801 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 802, - { + }, + { + "key": "collection/93", + "version": 802, + "value": { "v": 802 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 803, - { + }, + { + "key": "collection/94", + "version": 803, + "value": { "v": 803 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 804, - { + }, + { + "key": "collection/95", + "version": 804, + "value": { "v": 804 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 805, - { + }, + { + "key": "collection/96", + "version": 805, + "value": { "v": 805 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 806, - { + }, + { + "key": "collection/97", + "version": 806, + "value": { "v": 806 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 807, - { + }, + { + "key": "collection/98", + "version": 807, + "value": { "v": 807 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 808, - { + }, + { + "key": "collection/99", + "version": 808, + "value": { "v": 808 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -23180,7 +32440,8 @@ }, { "watchSnapshot": { - "version": 809 + "version": 809, + "targetIds": [] }, "expect": [ { @@ -23195,706 +32456,1106 @@ ] }, "modified": [ - [ - "collection/0", - 709, - { + { + "key": "collection/0", + "version": 709, + "value": { "v": 709 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 710, - { + }, + { + "key": "collection/1", + "version": 710, + "value": { "v": 710 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 711, - { + }, + { + "key": "collection/2", + "version": 711, + "value": { "v": 711 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 712, - { + }, + { + "key": "collection/3", + "version": 712, + "value": { "v": 712 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 713, - { + }, + { + "key": "collection/4", + "version": 713, + "value": { "v": 713 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 714, - { + }, + { + "key": "collection/5", + "version": 714, + "value": { "v": 714 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 715, - { + }, + { + "key": "collection/6", + "version": 715, + "value": { "v": 715 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 716, - { + }, + { + "key": "collection/7", + "version": 716, + "value": { "v": 716 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 717, - { + }, + { + "key": "collection/8", + "version": 717, + "value": { "v": 717 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 718, - { + }, + { + "key": "collection/9", + "version": 718, + "value": { "v": 718 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 719, - { + }, + { + "key": "collection/10", + "version": 719, + "value": { "v": 719 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 720, - { + }, + { + "key": "collection/11", + "version": 720, + "value": { "v": 720 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 721, - { + }, + { + "key": "collection/12", + "version": 721, + "value": { "v": 721 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 722, - { + }, + { + "key": "collection/13", + "version": 722, + "value": { "v": 722 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 723, - { + }, + { + "key": "collection/14", + "version": 723, + "value": { "v": 723 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 724, - { + }, + { + "key": "collection/15", + "version": 724, + "value": { "v": 724 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 725, - { + }, + { + "key": "collection/16", + "version": 725, + "value": { "v": 725 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 726, - { + }, + { + "key": "collection/17", + "version": 726, + "value": { "v": 726 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 727, - { + }, + { + "key": "collection/18", + "version": 727, + "value": { "v": 727 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 728, - { + }, + { + "key": "collection/19", + "version": 728, + "value": { "v": 728 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 729, - { + }, + { + "key": "collection/20", + "version": 729, + "value": { "v": 729 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 730, - { + }, + { + "key": "collection/21", + "version": 730, + "value": { "v": 730 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 731, - { + }, + { + "key": "collection/22", + "version": 731, + "value": { "v": 731 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 732, - { + }, + { + "key": "collection/23", + "version": 732, + "value": { "v": 732 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 733, - { + }, + { + "key": "collection/24", + "version": 733, + "value": { "v": 733 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 734, - { + }, + { + "key": "collection/25", + "version": 734, + "value": { "v": 734 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 735, - { + }, + { + "key": "collection/26", + "version": 735, + "value": { "v": 735 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 736, - { + }, + { + "key": "collection/27", + "version": 736, + "value": { "v": 736 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 737, - { + }, + { + "key": "collection/28", + "version": 737, + "value": { "v": 737 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 738, - { + }, + { + "key": "collection/29", + "version": 738, + "value": { "v": 738 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 739, - { + }, + { + "key": "collection/30", + "version": 739, + "value": { "v": 739 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 740, - { + }, + { + "key": "collection/31", + "version": 740, + "value": { "v": 740 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 741, - { + }, + { + "key": "collection/32", + "version": 741, + "value": { "v": 741 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 742, - { + }, + { + "key": "collection/33", + "version": 742, + "value": { "v": 742 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 743, - { + }, + { + "key": "collection/34", + "version": 743, + "value": { "v": 743 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 744, - { + }, + { + "key": "collection/35", + "version": 744, + "value": { "v": 744 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 745, - { + }, + { + "key": "collection/36", + "version": 745, + "value": { "v": 745 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 746, - { + }, + { + "key": "collection/37", + "version": 746, + "value": { "v": 746 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 747, - { + }, + { + "key": "collection/38", + "version": 747, + "value": { "v": 747 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 748, - { + }, + { + "key": "collection/39", + "version": 748, + "value": { "v": 748 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 749, - { + }, + { + "key": "collection/40", + "version": 749, + "value": { "v": 749 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 750, - { + }, + { + "key": "collection/41", + "version": 750, + "value": { "v": 750 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 751, - { + }, + { + "key": "collection/42", + "version": 751, + "value": { "v": 751 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 752, - { + }, + { + "key": "collection/43", + "version": 752, + "value": { "v": 752 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 753, - { + }, + { + "key": "collection/44", + "version": 753, + "value": { "v": 753 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 754, - { + }, + { + "key": "collection/45", + "version": 754, + "value": { "v": 754 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 755, - { + }, + { + "key": "collection/46", + "version": 755, + "value": { "v": 755 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 756, - { + }, + { + "key": "collection/47", + "version": 756, + "value": { "v": 756 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 757, - { + }, + { + "key": "collection/48", + "version": 757, + "value": { "v": 757 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 758, - { + }, + { + "key": "collection/49", + "version": 758, + "value": { "v": 758 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 759, - { + }, + { + "key": "collection/50", + "version": 759, + "value": { "v": 759 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 760, - { + }, + { + "key": "collection/51", + "version": 760, + "value": { "v": 760 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 761, - { + }, + { + "key": "collection/52", + "version": 761, + "value": { "v": 761 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 762, - { + }, + { + "key": "collection/53", + "version": 762, + "value": { "v": 762 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 763, - { + }, + { + "key": "collection/54", + "version": 763, + "value": { "v": 763 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 764, - { + }, + { + "key": "collection/55", + "version": 764, + "value": { "v": 764 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 765, - { + }, + { + "key": "collection/56", + "version": 765, + "value": { "v": 765 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 766, - { + }, + { + "key": "collection/57", + "version": 766, + "value": { "v": 766 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 767, - { + }, + { + "key": "collection/58", + "version": 767, + "value": { "v": 767 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 768, - { + }, + { + "key": "collection/59", + "version": 768, + "value": { "v": 768 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 769, - { + }, + { + "key": "collection/60", + "version": 769, + "value": { "v": 769 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 770, - { + }, + { + "key": "collection/61", + "version": 770, + "value": { "v": 770 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 771, - { + }, + { + "key": "collection/62", + "version": 771, + "value": { "v": 771 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 772, - { + }, + { + "key": "collection/63", + "version": 772, + "value": { "v": 772 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 773, - { + }, + { + "key": "collection/64", + "version": 773, + "value": { "v": 773 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 774, - { + }, + { + "key": "collection/65", + "version": 774, + "value": { "v": 774 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 775, - { + }, + { + "key": "collection/66", + "version": 775, + "value": { "v": 775 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 776, - { + }, + { + "key": "collection/67", + "version": 776, + "value": { "v": 776 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 777, - { + }, + { + "key": "collection/68", + "version": 777, + "value": { "v": 777 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 778, - { + }, + { + "key": "collection/69", + "version": 778, + "value": { "v": 778 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 779, - { + }, + { + "key": "collection/70", + "version": 779, + "value": { "v": 779 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 780, - { + }, + { + "key": "collection/71", + "version": 780, + "value": { "v": 780 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 781, - { + }, + { + "key": "collection/72", + "version": 781, + "value": { "v": 781 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 782, - { + }, + { + "key": "collection/73", + "version": 782, + "value": { "v": 782 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 783, - { + }, + { + "key": "collection/74", + "version": 783, + "value": { "v": 783 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 784, - { + }, + { + "key": "collection/75", + "version": 784, + "value": { "v": 784 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 785, - { + }, + { + "key": "collection/76", + "version": 785, + "value": { "v": 785 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 786, - { + }, + { + "key": "collection/77", + "version": 786, + "value": { "v": 786 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 787, - { + }, + { + "key": "collection/78", + "version": 787, + "value": { "v": 787 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 788, - { + }, + { + "key": "collection/79", + "version": 788, + "value": { "v": 788 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 789, - { + }, + { + "key": "collection/80", + "version": 789, + "value": { "v": 789 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 790, - { + }, + { + "key": "collection/81", + "version": 790, + "value": { "v": 790 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 791, - { + }, + { + "key": "collection/82", + "version": 791, + "value": { "v": 791 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 792, - { + }, + { + "key": "collection/83", + "version": 792, + "value": { "v": 792 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 793, - { + }, + { + "key": "collection/84", + "version": 793, + "value": { "v": 793 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 794, - { + }, + { + "key": "collection/85", + "version": 794, + "value": { "v": 794 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 795, - { + }, + { + "key": "collection/86", + "version": 795, + "value": { "v": 795 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 796, - { + }, + { + "key": "collection/87", + "version": 796, + "value": { "v": 796 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 797, - { + }, + { + "key": "collection/88", + "version": 797, + "value": { "v": 797 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 798, - { + }, + { + "key": "collection/89", + "version": 798, + "value": { "v": 798 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 799, - { + }, + { + "key": "collection/90", + "version": 799, + "value": { "v": 799 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 800, - { + }, + { + "key": "collection/91", + "version": 800, + "value": { "v": 800 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 801, - { + }, + { + "key": "collection/92", + "version": 801, + "value": { "v": 801 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 802, - { + }, + { + "key": "collection/93", + "version": 802, + "value": { "v": 802 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 803, - { + }, + { + "key": "collection/94", + "version": 803, + "value": { "v": 803 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 804, - { + }, + { + "key": "collection/95", + "version": 804, + "value": { "v": 804 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 805, - { + }, + { + "key": "collection/96", + "version": 805, + "value": { "v": 805 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 806, - { + }, + { + "key": "collection/97", + "version": 806, + "value": { "v": 806 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 807, - { + }, + { + "key": "collection/98", + "version": 807, + "value": { "v": 807 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 808, - { + }, + { + "key": "collection/99", + "version": 808, + "value": { "v": 808 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -23905,706 +33566,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 810, - { + { + "key": "collection/0", + "version": 810, + "value": { "v": 810 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 811, - { + }, + { + "key": "collection/1", + "version": 811, + "value": { "v": 811 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 812, - { + }, + { + "key": "collection/2", + "version": 812, + "value": { "v": 812 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 813, - { + }, + { + "key": "collection/3", + "version": 813, + "value": { "v": 813 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 814, - { + }, + { + "key": "collection/4", + "version": 814, + "value": { "v": 814 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 815, - { + }, + { + "key": "collection/5", + "version": 815, + "value": { "v": 815 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 816, - { + }, + { + "key": "collection/6", + "version": 816, + "value": { "v": 816 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 817, - { + }, + { + "key": "collection/7", + "version": 817, + "value": { "v": 817 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 818, - { + }, + { + "key": "collection/8", + "version": 818, + "value": { "v": 818 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 819, - { + }, + { + "key": "collection/9", + "version": 819, + "value": { "v": 819 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 820, - { + }, + { + "key": "collection/10", + "version": 820, + "value": { "v": 820 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 821, - { + }, + { + "key": "collection/11", + "version": 821, + "value": { "v": 821 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 822, - { + }, + { + "key": "collection/12", + "version": 822, + "value": { "v": 822 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 823, - { + }, + { + "key": "collection/13", + "version": 823, + "value": { "v": 823 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 824, - { + }, + { + "key": "collection/14", + "version": 824, + "value": { "v": 824 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 825, - { + }, + { + "key": "collection/15", + "version": 825, + "value": { "v": 825 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 826, - { + }, + { + "key": "collection/16", + "version": 826, + "value": { "v": 826 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 827, - { + }, + { + "key": "collection/17", + "version": 827, + "value": { "v": 827 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 828, - { + }, + { + "key": "collection/18", + "version": 828, + "value": { "v": 828 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 829, - { + }, + { + "key": "collection/19", + "version": 829, + "value": { "v": 829 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 830, - { + }, + { + "key": "collection/20", + "version": 830, + "value": { "v": 830 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 831, - { + }, + { + "key": "collection/21", + "version": 831, + "value": { "v": 831 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 832, - { + }, + { + "key": "collection/22", + "version": 832, + "value": { "v": 832 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 833, - { + }, + { + "key": "collection/23", + "version": 833, + "value": { "v": 833 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 834, - { + }, + { + "key": "collection/24", + "version": 834, + "value": { "v": 834 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 835, - { + }, + { + "key": "collection/25", + "version": 835, + "value": { "v": 835 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 836, - { + }, + { + "key": "collection/26", + "version": 836, + "value": { "v": 836 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 837, - { + }, + { + "key": "collection/27", + "version": 837, + "value": { "v": 837 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 838, - { + }, + { + "key": "collection/28", + "version": 838, + "value": { "v": 838 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 839, - { + }, + { + "key": "collection/29", + "version": 839, + "value": { "v": 839 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 840, - { + }, + { + "key": "collection/30", + "version": 840, + "value": { "v": 840 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 841, - { + }, + { + "key": "collection/31", + "version": 841, + "value": { "v": 841 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 842, - { + }, + { + "key": "collection/32", + "version": 842, + "value": { "v": 842 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 843, - { + }, + { + "key": "collection/33", + "version": 843, + "value": { "v": 843 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 844, - { + }, + { + "key": "collection/34", + "version": 844, + "value": { "v": 844 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 845, - { + }, + { + "key": "collection/35", + "version": 845, + "value": { "v": 845 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 846, - { + }, + { + "key": "collection/36", + "version": 846, + "value": { "v": 846 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 847, - { + }, + { + "key": "collection/37", + "version": 847, + "value": { "v": 847 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 848, - { + }, + { + "key": "collection/38", + "version": 848, + "value": { "v": 848 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 849, - { + }, + { + "key": "collection/39", + "version": 849, + "value": { "v": 849 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 850, - { + }, + { + "key": "collection/40", + "version": 850, + "value": { "v": 850 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 851, - { + }, + { + "key": "collection/41", + "version": 851, + "value": { "v": 851 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 852, - { + }, + { + "key": "collection/42", + "version": 852, + "value": { "v": 852 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 853, - { + }, + { + "key": "collection/43", + "version": 853, + "value": { "v": 853 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 854, - { + }, + { + "key": "collection/44", + "version": 854, + "value": { "v": 854 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 855, - { + }, + { + "key": "collection/45", + "version": 855, + "value": { "v": 855 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 856, - { + }, + { + "key": "collection/46", + "version": 856, + "value": { "v": 856 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 857, - { + }, + { + "key": "collection/47", + "version": 857, + "value": { "v": 857 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 858, - { + }, + { + "key": "collection/48", + "version": 858, + "value": { "v": 858 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 859, - { + }, + { + "key": "collection/49", + "version": 859, + "value": { "v": 859 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 860, - { + }, + { + "key": "collection/50", + "version": 860, + "value": { "v": 860 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 861, - { + }, + { + "key": "collection/51", + "version": 861, + "value": { "v": 861 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 862, - { + }, + { + "key": "collection/52", + "version": 862, + "value": { "v": 862 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 863, - { + }, + { + "key": "collection/53", + "version": 863, + "value": { "v": 863 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 864, - { + }, + { + "key": "collection/54", + "version": 864, + "value": { "v": 864 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 865, - { + }, + { + "key": "collection/55", + "version": 865, + "value": { "v": 865 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 866, - { + }, + { + "key": "collection/56", + "version": 866, + "value": { "v": 866 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 867, - { + }, + { + "key": "collection/57", + "version": 867, + "value": { "v": 867 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 868, - { + }, + { + "key": "collection/58", + "version": 868, + "value": { "v": 868 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 869, - { + }, + { + "key": "collection/59", + "version": 869, + "value": { "v": 869 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 870, - { + }, + { + "key": "collection/60", + "version": 870, + "value": { "v": 870 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 871, - { + }, + { + "key": "collection/61", + "version": 871, + "value": { "v": 871 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 872, - { + }, + { + "key": "collection/62", + "version": 872, + "value": { "v": 872 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 873, - { + }, + { + "key": "collection/63", + "version": 873, + "value": { "v": 873 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 874, - { + }, + { + "key": "collection/64", + "version": 874, + "value": { "v": 874 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 875, - { + }, + { + "key": "collection/65", + "version": 875, + "value": { "v": 875 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 876, - { + }, + { + "key": "collection/66", + "version": 876, + "value": { "v": 876 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 877, - { + }, + { + "key": "collection/67", + "version": 877, + "value": { "v": 877 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 878, - { + }, + { + "key": "collection/68", + "version": 878, + "value": { "v": 878 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 879, - { + }, + { + "key": "collection/69", + "version": 879, + "value": { "v": 879 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 880, - { + }, + { + "key": "collection/70", + "version": 880, + "value": { "v": 880 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 881, - { + }, + { + "key": "collection/71", + "version": 881, + "value": { "v": 881 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 882, - { + }, + { + "key": "collection/72", + "version": 882, + "value": { "v": 882 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 883, - { + }, + { + "key": "collection/73", + "version": 883, + "value": { "v": 883 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 884, - { + }, + { + "key": "collection/74", + "version": 884, + "value": { "v": 884 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 885, - { + }, + { + "key": "collection/75", + "version": 885, + "value": { "v": 885 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 886, - { + }, + { + "key": "collection/76", + "version": 886, + "value": { "v": 886 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 887, - { + }, + { + "key": "collection/77", + "version": 887, + "value": { "v": 887 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 888, - { + }, + { + "key": "collection/78", + "version": 888, + "value": { "v": 888 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 889, - { + }, + { + "key": "collection/79", + "version": 889, + "value": { "v": 889 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 890, - { + }, + { + "key": "collection/80", + "version": 890, + "value": { "v": 890 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 891, - { + }, + { + "key": "collection/81", + "version": 891, + "value": { "v": 891 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 892, - { + }, + { + "key": "collection/82", + "version": 892, + "value": { "v": 892 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 893, - { + }, + { + "key": "collection/83", + "version": 893, + "value": { "v": 893 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 894, - { + }, + { + "key": "collection/84", + "version": 894, + "value": { "v": 894 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 895, - { + }, + { + "key": "collection/85", + "version": 895, + "value": { "v": 895 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 896, - { + }, + { + "key": "collection/86", + "version": 896, + "value": { "v": 896 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 897, - { + }, + { + "key": "collection/87", + "version": 897, + "value": { "v": 897 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 898, - { + }, + { + "key": "collection/88", + "version": 898, + "value": { "v": 898 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 899, - { + }, + { + "key": "collection/89", + "version": 899, + "value": { "v": 899 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 900, - { + }, + { + "key": "collection/90", + "version": 900, + "value": { "v": 900 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 901, - { + }, + { + "key": "collection/91", + "version": 901, + "value": { "v": 901 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 902, - { + }, + { + "key": "collection/92", + "version": 902, + "value": { "v": 902 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 903, - { + }, + { + "key": "collection/93", + "version": 903, + "value": { "v": 903 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 904, - { + }, + { + "key": "collection/94", + "version": 904, + "value": { "v": 904 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 905, - { + }, + { + "key": "collection/95", + "version": 905, + "value": { "v": 905 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 906, - { + }, + { + "key": "collection/96", + "version": 906, + "value": { "v": 906 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 907, - { + }, + { + "key": "collection/97", + "version": 907, + "value": { "v": 907 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 908, - { + }, + { + "key": "collection/98", + "version": 908, + "value": { "v": 908 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 909, - { + }, + { + "key": "collection/99", + "version": 909, + "value": { "v": 909 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -24613,7 +34674,8 @@ }, { "watchSnapshot": { - "version": 910 + "version": 910, + "targetIds": [] }, "expect": [ { @@ -24628,706 +34690,1106 @@ ] }, "modified": [ - [ - "collection/0", - 810, - { + { + "key": "collection/0", + "version": 810, + "value": { "v": 810 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 811, - { + }, + { + "key": "collection/1", + "version": 811, + "value": { "v": 811 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 812, - { + }, + { + "key": "collection/2", + "version": 812, + "value": { "v": 812 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 813, - { + }, + { + "key": "collection/3", + "version": 813, + "value": { "v": 813 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 814, - { + }, + { + "key": "collection/4", + "version": 814, + "value": { "v": 814 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 815, - { + }, + { + "key": "collection/5", + "version": 815, + "value": { "v": 815 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 816, - { + }, + { + "key": "collection/6", + "version": 816, + "value": { "v": 816 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 817, - { + }, + { + "key": "collection/7", + "version": 817, + "value": { "v": 817 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 818, - { + }, + { + "key": "collection/8", + "version": 818, + "value": { "v": 818 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 819, - { + }, + { + "key": "collection/9", + "version": 819, + "value": { "v": 819 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 820, - { + }, + { + "key": "collection/10", + "version": 820, + "value": { "v": 820 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 821, - { + }, + { + "key": "collection/11", + "version": 821, + "value": { "v": 821 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 822, - { + }, + { + "key": "collection/12", + "version": 822, + "value": { "v": 822 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 823, - { + }, + { + "key": "collection/13", + "version": 823, + "value": { "v": 823 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 824, - { + }, + { + "key": "collection/14", + "version": 824, + "value": { "v": 824 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 825, - { + }, + { + "key": "collection/15", + "version": 825, + "value": { "v": 825 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 826, - { + }, + { + "key": "collection/16", + "version": 826, + "value": { "v": 826 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 827, - { + }, + { + "key": "collection/17", + "version": 827, + "value": { "v": 827 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 828, - { + }, + { + "key": "collection/18", + "version": 828, + "value": { "v": 828 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 829, - { + }, + { + "key": "collection/19", + "version": 829, + "value": { "v": 829 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 830, - { + }, + { + "key": "collection/20", + "version": 830, + "value": { "v": 830 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 831, - { + }, + { + "key": "collection/21", + "version": 831, + "value": { "v": 831 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 832, - { + }, + { + "key": "collection/22", + "version": 832, + "value": { "v": 832 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 833, - { + }, + { + "key": "collection/23", + "version": 833, + "value": { "v": 833 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 834, - { + }, + { + "key": "collection/24", + "version": 834, + "value": { "v": 834 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 835, - { + }, + { + "key": "collection/25", + "version": 835, + "value": { "v": 835 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 836, - { + }, + { + "key": "collection/26", + "version": 836, + "value": { "v": 836 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 837, - { + }, + { + "key": "collection/27", + "version": 837, + "value": { "v": 837 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 838, - { + }, + { + "key": "collection/28", + "version": 838, + "value": { "v": 838 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 839, - { + }, + { + "key": "collection/29", + "version": 839, + "value": { "v": 839 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 840, - { + }, + { + "key": "collection/30", + "version": 840, + "value": { "v": 840 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 841, - { + }, + { + "key": "collection/31", + "version": 841, + "value": { "v": 841 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 842, - { + }, + { + "key": "collection/32", + "version": 842, + "value": { "v": 842 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 843, - { + }, + { + "key": "collection/33", + "version": 843, + "value": { "v": 843 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 844, - { + }, + { + "key": "collection/34", + "version": 844, + "value": { "v": 844 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 845, - { + }, + { + "key": "collection/35", + "version": 845, + "value": { "v": 845 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 846, - { + }, + { + "key": "collection/36", + "version": 846, + "value": { "v": 846 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 847, - { + }, + { + "key": "collection/37", + "version": 847, + "value": { "v": 847 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 848, - { + }, + { + "key": "collection/38", + "version": 848, + "value": { "v": 848 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 849, - { + }, + { + "key": "collection/39", + "version": 849, + "value": { "v": 849 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 850, - { + }, + { + "key": "collection/40", + "version": 850, + "value": { "v": 850 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 851, - { + }, + { + "key": "collection/41", + "version": 851, + "value": { "v": 851 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 852, - { + }, + { + "key": "collection/42", + "version": 852, + "value": { "v": 852 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 853, - { + }, + { + "key": "collection/43", + "version": 853, + "value": { "v": 853 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 854, - { + }, + { + "key": "collection/44", + "version": 854, + "value": { "v": 854 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 855, - { + }, + { + "key": "collection/45", + "version": 855, + "value": { "v": 855 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 856, - { + }, + { + "key": "collection/46", + "version": 856, + "value": { "v": 856 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 857, - { + }, + { + "key": "collection/47", + "version": 857, + "value": { "v": 857 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 858, - { + }, + { + "key": "collection/48", + "version": 858, + "value": { "v": 858 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 859, - { + }, + { + "key": "collection/49", + "version": 859, + "value": { "v": 859 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 860, - { + }, + { + "key": "collection/50", + "version": 860, + "value": { "v": 860 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 861, - { + }, + { + "key": "collection/51", + "version": 861, + "value": { "v": 861 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 862, - { + }, + { + "key": "collection/52", + "version": 862, + "value": { "v": 862 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 863, - { + }, + { + "key": "collection/53", + "version": 863, + "value": { "v": 863 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 864, - { + }, + { + "key": "collection/54", + "version": 864, + "value": { "v": 864 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 865, - { + }, + { + "key": "collection/55", + "version": 865, + "value": { "v": 865 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 866, - { + }, + { + "key": "collection/56", + "version": 866, + "value": { "v": 866 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 867, - { + }, + { + "key": "collection/57", + "version": 867, + "value": { "v": 867 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 868, - { + }, + { + "key": "collection/58", + "version": 868, + "value": { "v": 868 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 869, - { + }, + { + "key": "collection/59", + "version": 869, + "value": { "v": 869 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 870, - { + }, + { + "key": "collection/60", + "version": 870, + "value": { "v": 870 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 871, - { + }, + { + "key": "collection/61", + "version": 871, + "value": { "v": 871 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 872, - { + }, + { + "key": "collection/62", + "version": 872, + "value": { "v": 872 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 873, - { + }, + { + "key": "collection/63", + "version": 873, + "value": { "v": 873 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 874, - { + }, + { + "key": "collection/64", + "version": 874, + "value": { "v": 874 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 875, - { + }, + { + "key": "collection/65", + "version": 875, + "value": { "v": 875 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 876, - { + }, + { + "key": "collection/66", + "version": 876, + "value": { "v": 876 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 877, - { + }, + { + "key": "collection/67", + "version": 877, + "value": { "v": 877 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 878, - { + }, + { + "key": "collection/68", + "version": 878, + "value": { "v": 878 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 879, - { + }, + { + "key": "collection/69", + "version": 879, + "value": { "v": 879 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 880, - { + }, + { + "key": "collection/70", + "version": 880, + "value": { "v": 880 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 881, - { + }, + { + "key": "collection/71", + "version": 881, + "value": { "v": 881 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 882, - { + }, + { + "key": "collection/72", + "version": 882, + "value": { "v": 882 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 883, - { + }, + { + "key": "collection/73", + "version": 883, + "value": { "v": 883 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 884, - { + }, + { + "key": "collection/74", + "version": 884, + "value": { "v": 884 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 885, - { + }, + { + "key": "collection/75", + "version": 885, + "value": { "v": 885 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 886, - { + }, + { + "key": "collection/76", + "version": 886, + "value": { "v": 886 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 887, - { + }, + { + "key": "collection/77", + "version": 887, + "value": { "v": 887 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 888, - { + }, + { + "key": "collection/78", + "version": 888, + "value": { "v": 888 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 889, - { + }, + { + "key": "collection/79", + "version": 889, + "value": { "v": 889 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 890, - { + }, + { + "key": "collection/80", + "version": 890, + "value": { "v": 890 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 891, - { + }, + { + "key": "collection/81", + "version": 891, + "value": { "v": 891 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 892, - { + }, + { + "key": "collection/82", + "version": 892, + "value": { "v": 892 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 893, - { + }, + { + "key": "collection/83", + "version": 893, + "value": { "v": 893 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 894, - { + }, + { + "key": "collection/84", + "version": 894, + "value": { "v": 894 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 895, - { + }, + { + "key": "collection/85", + "version": 895, + "value": { "v": 895 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 896, - { + }, + { + "key": "collection/86", + "version": 896, + "value": { "v": 896 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 897, - { + }, + { + "key": "collection/87", + "version": 897, + "value": { "v": 897 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 898, - { + }, + { + "key": "collection/88", + "version": 898, + "value": { "v": 898 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 899, - { + }, + { + "key": "collection/89", + "version": 899, + "value": { "v": 899 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 900, - { + }, + { + "key": "collection/90", + "version": 900, + "value": { "v": 900 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 901, - { + }, + { + "key": "collection/91", + "version": 901, + "value": { "v": 901 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 902, - { + }, + { + "key": "collection/92", + "version": 902, + "value": { "v": 902 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 903, - { + }, + { + "key": "collection/93", + "version": 903, + "value": { "v": 903 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 904, - { + }, + { + "key": "collection/94", + "version": 904, + "value": { "v": 904 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 905, - { + }, + { + "key": "collection/95", + "version": 905, + "value": { "v": 905 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 906, - { + }, + { + "key": "collection/96", + "version": 906, + "value": { "v": 906 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 907, - { + }, + { + "key": "collection/97", + "version": 907, + "value": { "v": 907 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 908, - { + }, + { + "key": "collection/98", + "version": 908, + "value": { "v": 908 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 909, - { + }, + { + "key": "collection/99", + "version": 909, + "value": { "v": 909 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -25338,706 +35800,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/0", - 911, - { + { + "key": "collection/0", + "version": 911, + "value": { "v": 911 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 912, - { + }, + { + "key": "collection/1", + "version": 912, + "value": { "v": 912 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 913, - { + }, + { + "key": "collection/2", + "version": 913, + "value": { "v": 913 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 914, - { + }, + { + "key": "collection/3", + "version": 914, + "value": { "v": 914 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 915, - { + }, + { + "key": "collection/4", + "version": 915, + "value": { "v": 915 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 916, - { + }, + { + "key": "collection/5", + "version": 916, + "value": { "v": 916 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 917, - { + }, + { + "key": "collection/6", + "version": 917, + "value": { "v": 917 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 918, - { + }, + { + "key": "collection/7", + "version": 918, + "value": { "v": 918 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 919, - { + }, + { + "key": "collection/8", + "version": 919, + "value": { "v": 919 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 920, - { + }, + { + "key": "collection/9", + "version": 920, + "value": { "v": 920 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 921, - { + }, + { + "key": "collection/10", + "version": 921, + "value": { "v": 921 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 922, - { + }, + { + "key": "collection/11", + "version": 922, + "value": { "v": 922 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 923, - { + }, + { + "key": "collection/12", + "version": 923, + "value": { "v": 923 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 924, - { + }, + { + "key": "collection/13", + "version": 924, + "value": { "v": 924 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 925, - { + }, + { + "key": "collection/14", + "version": 925, + "value": { "v": 925 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 926, - { + }, + { + "key": "collection/15", + "version": 926, + "value": { "v": 926 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 927, - { + }, + { + "key": "collection/16", + "version": 927, + "value": { "v": 927 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 928, - { + }, + { + "key": "collection/17", + "version": 928, + "value": { "v": 928 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 929, - { + }, + { + "key": "collection/18", + "version": 929, + "value": { "v": 929 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 930, - { + }, + { + "key": "collection/19", + "version": 930, + "value": { "v": 930 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 931, - { + }, + { + "key": "collection/20", + "version": 931, + "value": { "v": 931 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 932, - { + }, + { + "key": "collection/21", + "version": 932, + "value": { "v": 932 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 933, - { + }, + { + "key": "collection/22", + "version": 933, + "value": { "v": 933 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 934, - { + }, + { + "key": "collection/23", + "version": 934, + "value": { "v": 934 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 935, - { + }, + { + "key": "collection/24", + "version": 935, + "value": { "v": 935 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 936, - { + }, + { + "key": "collection/25", + "version": 936, + "value": { "v": 936 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 937, - { + }, + { + "key": "collection/26", + "version": 937, + "value": { "v": 937 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 938, - { + }, + { + "key": "collection/27", + "version": 938, + "value": { "v": 938 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 939, - { + }, + { + "key": "collection/28", + "version": 939, + "value": { "v": 939 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 940, - { + }, + { + "key": "collection/29", + "version": 940, + "value": { "v": 940 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 941, - { + }, + { + "key": "collection/30", + "version": 941, + "value": { "v": 941 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 942, - { + }, + { + "key": "collection/31", + "version": 942, + "value": { "v": 942 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 943, - { + }, + { + "key": "collection/32", + "version": 943, + "value": { "v": 943 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 944, - { + }, + { + "key": "collection/33", + "version": 944, + "value": { "v": 944 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 945, - { + }, + { + "key": "collection/34", + "version": 945, + "value": { "v": 945 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 946, - { + }, + { + "key": "collection/35", + "version": 946, + "value": { "v": 946 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 947, - { + }, + { + "key": "collection/36", + "version": 947, + "value": { "v": 947 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 948, - { + }, + { + "key": "collection/37", + "version": 948, + "value": { "v": 948 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 949, - { + }, + { + "key": "collection/38", + "version": 949, + "value": { "v": 949 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 950, - { + }, + { + "key": "collection/39", + "version": 950, + "value": { "v": 950 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 951, - { + }, + { + "key": "collection/40", + "version": 951, + "value": { "v": 951 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 952, - { + }, + { + "key": "collection/41", + "version": 952, + "value": { "v": 952 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 953, - { + }, + { + "key": "collection/42", + "version": 953, + "value": { "v": 953 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 954, - { + }, + { + "key": "collection/43", + "version": 954, + "value": { "v": 954 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 955, - { + }, + { + "key": "collection/44", + "version": 955, + "value": { "v": 955 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 956, - { + }, + { + "key": "collection/45", + "version": 956, + "value": { "v": 956 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 957, - { + }, + { + "key": "collection/46", + "version": 957, + "value": { "v": 957 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 958, - { + }, + { + "key": "collection/47", + "version": 958, + "value": { "v": 958 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 959, - { + }, + { + "key": "collection/48", + "version": 959, + "value": { "v": 959 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 960, - { + }, + { + "key": "collection/49", + "version": 960, + "value": { "v": 960 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 961, - { + }, + { + "key": "collection/50", + "version": 961, + "value": { "v": 961 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 962, - { + }, + { + "key": "collection/51", + "version": 962, + "value": { "v": 962 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 963, - { + }, + { + "key": "collection/52", + "version": 963, + "value": { "v": 963 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 964, - { + }, + { + "key": "collection/53", + "version": 964, + "value": { "v": 964 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 965, - { + }, + { + "key": "collection/54", + "version": 965, + "value": { "v": 965 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 966, - { + }, + { + "key": "collection/55", + "version": 966, + "value": { "v": 966 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 967, - { + }, + { + "key": "collection/56", + "version": 967, + "value": { "v": 967 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 968, - { + }, + { + "key": "collection/57", + "version": 968, + "value": { "v": 968 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 969, - { + }, + { + "key": "collection/58", + "version": 969, + "value": { "v": 969 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 970, - { + }, + { + "key": "collection/59", + "version": 970, + "value": { "v": 970 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 971, - { + }, + { + "key": "collection/60", + "version": 971, + "value": { "v": 971 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 972, - { + }, + { + "key": "collection/61", + "version": 972, + "value": { "v": 972 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 973, - { + }, + { + "key": "collection/62", + "version": 973, + "value": { "v": 973 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 974, - { + }, + { + "key": "collection/63", + "version": 974, + "value": { "v": 974 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 975, - { + }, + { + "key": "collection/64", + "version": 975, + "value": { "v": 975 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 976, - { + }, + { + "key": "collection/65", + "version": 976, + "value": { "v": 976 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 977, - { + }, + { + "key": "collection/66", + "version": 977, + "value": { "v": 977 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 978, - { + }, + { + "key": "collection/67", + "version": 978, + "value": { "v": 978 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 979, - { + }, + { + "key": "collection/68", + "version": 979, + "value": { "v": 979 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 980, - { + }, + { + "key": "collection/69", + "version": 980, + "value": { "v": 980 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 981, - { + }, + { + "key": "collection/70", + "version": 981, + "value": { "v": 981 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 982, - { + }, + { + "key": "collection/71", + "version": 982, + "value": { "v": 982 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 983, - { + }, + { + "key": "collection/72", + "version": 983, + "value": { "v": 983 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 984, - { + }, + { + "key": "collection/73", + "version": 984, + "value": { "v": 984 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 985, - { + }, + { + "key": "collection/74", + "version": 985, + "value": { "v": 985 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 986, - { + }, + { + "key": "collection/75", + "version": 986, + "value": { "v": 986 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 987, - { + }, + { + "key": "collection/76", + "version": 987, + "value": { "v": 987 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 988, - { + }, + { + "key": "collection/77", + "version": 988, + "value": { "v": 988 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 989, - { + }, + { + "key": "collection/78", + "version": 989, + "value": { "v": 989 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 990, - { + }, + { + "key": "collection/79", + "version": 990, + "value": { "v": 990 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 991, - { + }, + { + "key": "collection/80", + "version": 991, + "value": { "v": 991 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 992, - { + }, + { + "key": "collection/81", + "version": 992, + "value": { "v": 992 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 993, - { + }, + { + "key": "collection/82", + "version": 993, + "value": { "v": 993 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 994, - { + }, + { + "key": "collection/83", + "version": 994, + "value": { "v": 994 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 995, - { + }, + { + "key": "collection/84", + "version": 995, + "value": { "v": 995 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 996, - { + }, + { + "key": "collection/85", + "version": 996, + "value": { "v": 996 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 997, - { + }, + { + "key": "collection/86", + "version": 997, + "value": { "v": 997 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 998, - { + }, + { + "key": "collection/87", + "version": 998, + "value": { "v": 998 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 999, - { + }, + { + "key": "collection/88", + "version": 999, + "value": { "v": 999 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 1000, - { + }, + { + "key": "collection/89", + "version": 1000, + "value": { "v": 1000 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 1001, - { + }, + { + "key": "collection/90", + "version": 1001, + "value": { "v": 1001 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 1002, - { + }, + { + "key": "collection/91", + "version": 1002, + "value": { "v": 1002 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 1003, - { + }, + { + "key": "collection/92", + "version": 1003, + "value": { "v": 1003 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 1004, - { + }, + { + "key": "collection/93", + "version": 1004, + "value": { "v": 1004 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 1005, - { + }, + { + "key": "collection/94", + "version": 1005, + "value": { "v": 1005 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 1006, - { + }, + { + "key": "collection/95", + "version": 1006, + "value": { "v": 1006 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 1007, - { + }, + { + "key": "collection/96", + "version": 1007, + "value": { "v": 1007 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 1008, - { + }, + { + "key": "collection/97", + "version": 1008, + "value": { "v": 1008 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 1009, - { + }, + { + "key": "collection/98", + "version": 1009, + "value": { "v": 1009 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 1010, - { + }, + { + "key": "collection/99", + "version": 1010, + "value": { "v": 1010 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -26046,7 +36908,8 @@ }, { "watchSnapshot": { - "version": 1011 + "version": 1011, + "targetIds": [] }, "expect": [ { @@ -26061,706 +36924,1106 @@ ] }, "modified": [ - [ - "collection/0", - 911, - { + { + "key": "collection/0", + "version": 911, + "value": { "v": 911 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1", - 912, - { + }, + { + "key": "collection/1", + "version": 912, + "value": { "v": 912 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2", - 913, - { + }, + { + "key": "collection/2", + "version": 913, + "value": { "v": 913 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3", - 914, - { + }, + { + "key": "collection/3", + "version": 914, + "value": { "v": 914 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4", - 915, - { + }, + { + "key": "collection/4", + "version": 915, + "value": { "v": 915 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5", - 916, - { + }, + { + "key": "collection/5", + "version": 916, + "value": { "v": 916 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6", - 917, - { + }, + { + "key": "collection/6", + "version": 917, + "value": { "v": 917 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7", - 918, - { + }, + { + "key": "collection/7", + "version": 918, + "value": { "v": 918 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8", - 919, - { + }, + { + "key": "collection/8", + "version": 919, + "value": { "v": 919 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9", - 920, - { + }, + { + "key": "collection/9", + "version": 920, + "value": { "v": 920 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10", - 921, - { + }, + { + "key": "collection/10", + "version": 921, + "value": { "v": 921 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/11", - 922, - { + }, + { + "key": "collection/11", + "version": 922, + "value": { "v": 922 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/12", - 923, - { + }, + { + "key": "collection/12", + "version": 923, + "value": { "v": 923 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/13", - 924, - { + }, + { + "key": "collection/13", + "version": 924, + "value": { "v": 924 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/14", - 925, - { + }, + { + "key": "collection/14", + "version": 925, + "value": { "v": 925 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/15", - 926, - { + }, + { + "key": "collection/15", + "version": 926, + "value": { "v": 926 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/16", - 927, - { + }, + { + "key": "collection/16", + "version": 927, + "value": { "v": 927 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/17", - 928, - { + }, + { + "key": "collection/17", + "version": 928, + "value": { "v": 928 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/18", - 929, - { + }, + { + "key": "collection/18", + "version": 929, + "value": { "v": 929 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/19", - 930, - { + }, + { + "key": "collection/19", + "version": 930, + "value": { "v": 930 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/20", - 931, - { + }, + { + "key": "collection/20", + "version": 931, + "value": { "v": 931 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/21", - 932, - { + }, + { + "key": "collection/21", + "version": 932, + "value": { "v": 932 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/22", - 933, - { + }, + { + "key": "collection/22", + "version": 933, + "value": { "v": 933 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/23", - 934, - { + }, + { + "key": "collection/23", + "version": 934, + "value": { "v": 934 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/24", - 935, - { + }, + { + "key": "collection/24", + "version": 935, + "value": { "v": 935 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/25", - 936, - { + }, + { + "key": "collection/25", + "version": 936, + "value": { "v": 936 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/26", - 937, - { + }, + { + "key": "collection/26", + "version": 937, + "value": { "v": 937 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/27", - 938, - { + }, + { + "key": "collection/27", + "version": 938, + "value": { "v": 938 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/28", - 939, - { + }, + { + "key": "collection/28", + "version": 939, + "value": { "v": 939 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/29", - 940, - { + }, + { + "key": "collection/29", + "version": 940, + "value": { "v": 940 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/30", - 941, - { + }, + { + "key": "collection/30", + "version": 941, + "value": { "v": 941 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/31", - 942, - { + }, + { + "key": "collection/31", + "version": 942, + "value": { "v": 942 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/32", - 943, - { + }, + { + "key": "collection/32", + "version": 943, + "value": { "v": 943 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/33", - 944, - { + }, + { + "key": "collection/33", + "version": 944, + "value": { "v": 944 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/34", - 945, - { + }, + { + "key": "collection/34", + "version": 945, + "value": { "v": 945 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/35", - 946, - { + }, + { + "key": "collection/35", + "version": 946, + "value": { "v": 946 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/36", - 947, - { + }, + { + "key": "collection/36", + "version": 947, + "value": { "v": 947 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/37", - 948, - { + }, + { + "key": "collection/37", + "version": 948, + "value": { "v": 948 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/38", - 949, - { + }, + { + "key": "collection/38", + "version": 949, + "value": { "v": 949 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/39", - 950, - { + }, + { + "key": "collection/39", + "version": 950, + "value": { "v": 950 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/40", - 951, - { + }, + { + "key": "collection/40", + "version": 951, + "value": { "v": 951 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/41", - 952, - { + }, + { + "key": "collection/41", + "version": 952, + "value": { "v": 952 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/42", - 953, - { + }, + { + "key": "collection/42", + "version": 953, + "value": { "v": 953 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/43", - 954, - { + }, + { + "key": "collection/43", + "version": 954, + "value": { "v": 954 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/44", - 955, - { + }, + { + "key": "collection/44", + "version": 955, + "value": { "v": 955 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/45", - 956, - { + }, + { + "key": "collection/45", + "version": 956, + "value": { "v": 956 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/46", - 957, - { + }, + { + "key": "collection/46", + "version": 957, + "value": { "v": 957 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/47", - 958, - { + }, + { + "key": "collection/47", + "version": 958, + "value": { "v": 958 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/48", - 959, - { + }, + { + "key": "collection/48", + "version": 959, + "value": { "v": 959 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/49", - 960, - { + }, + { + "key": "collection/49", + "version": 960, + "value": { "v": 960 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/50", - 961, - { + }, + { + "key": "collection/50", + "version": 961, + "value": { "v": 961 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/51", - 962, - { + }, + { + "key": "collection/51", + "version": 962, + "value": { "v": 962 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/52", - 963, - { + }, + { + "key": "collection/52", + "version": 963, + "value": { "v": 963 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/53", - 964, - { + }, + { + "key": "collection/53", + "version": 964, + "value": { "v": 964 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/54", - 965, - { + }, + { + "key": "collection/54", + "version": 965, + "value": { "v": 965 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/55", - 966, - { + }, + { + "key": "collection/55", + "version": 966, + "value": { "v": 966 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/56", - 967, - { + }, + { + "key": "collection/56", + "version": 967, + "value": { "v": 967 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/57", - 968, - { + }, + { + "key": "collection/57", + "version": 968, + "value": { "v": 968 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/58", - 969, - { + }, + { + "key": "collection/58", + "version": 969, + "value": { "v": 969 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/59", - 970, - { + }, + { + "key": "collection/59", + "version": 970, + "value": { "v": 970 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/60", - 971, - { + }, + { + "key": "collection/60", + "version": 971, + "value": { "v": 971 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/61", - 972, - { + }, + { + "key": "collection/61", + "version": 972, + "value": { "v": 972 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/62", - 973, - { + }, + { + "key": "collection/62", + "version": 973, + "value": { "v": 973 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/63", - 974, - { + }, + { + "key": "collection/63", + "version": 974, + "value": { "v": 974 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/64", - 975, - { + }, + { + "key": "collection/64", + "version": 975, + "value": { "v": 975 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/65", - 976, - { + }, + { + "key": "collection/65", + "version": 976, + "value": { "v": 976 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/66", - 977, - { + }, + { + "key": "collection/66", + "version": 977, + "value": { "v": 977 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/67", - 978, - { + }, + { + "key": "collection/67", + "version": 978, + "value": { "v": 978 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/68", - 979, - { + }, + { + "key": "collection/68", + "version": 979, + "value": { "v": 979 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/69", - 980, - { + }, + { + "key": "collection/69", + "version": 980, + "value": { "v": 980 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/70", - 981, - { + }, + { + "key": "collection/70", + "version": 981, + "value": { "v": 981 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/71", - 982, - { + }, + { + "key": "collection/71", + "version": 982, + "value": { "v": 982 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/72", - 983, - { + }, + { + "key": "collection/72", + "version": 983, + "value": { "v": 983 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/73", - 984, - { + }, + { + "key": "collection/73", + "version": 984, + "value": { "v": 984 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/74", - 985, - { + }, + { + "key": "collection/74", + "version": 985, + "value": { "v": 985 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/75", - 986, - { + }, + { + "key": "collection/75", + "version": 986, + "value": { "v": 986 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/76", - 987, - { + }, + { + "key": "collection/76", + "version": 987, + "value": { "v": 987 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/77", - 988, - { + }, + { + "key": "collection/77", + "version": 988, + "value": { "v": 988 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/78", - 989, - { + }, + { + "key": "collection/78", + "version": 989, + "value": { "v": 989 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/79", - 990, - { + }, + { + "key": "collection/79", + "version": 990, + "value": { "v": 990 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/80", - 991, - { + }, + { + "key": "collection/80", + "version": 991, + "value": { "v": 991 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/81", - 992, - { + }, + { + "key": "collection/81", + "version": 992, + "value": { "v": 992 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/82", - 993, - { + }, + { + "key": "collection/82", + "version": 993, + "value": { "v": 993 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/83", - 994, - { + }, + { + "key": "collection/83", + "version": 994, + "value": { "v": 994 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/84", - 995, - { + }, + { + "key": "collection/84", + "version": 995, + "value": { "v": 995 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/85", - 996, - { + }, + { + "key": "collection/85", + "version": 996, + "value": { "v": 996 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/86", - 997, - { + }, + { + "key": "collection/86", + "version": 997, + "value": { "v": 997 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/87", - 998, - { + }, + { + "key": "collection/87", + "version": 998, + "value": { "v": 998 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/88", - 999, - { + }, + { + "key": "collection/88", + "version": 999, + "value": { "v": 999 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/89", - 1000, - { + }, + { + "key": "collection/89", + "version": 1000, + "value": { "v": 1000 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/90", - 1001, - { + }, + { + "key": "collection/90", + "version": 1001, + "value": { "v": 1001 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/91", - 1002, - { + }, + { + "key": "collection/91", + "version": 1002, + "value": { "v": 1002 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/92", - 1003, - { + }, + { + "key": "collection/92", + "version": 1003, + "value": { "v": 1003 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/93", - 1004, - { + }, + { + "key": "collection/93", + "version": 1004, + "value": { "v": 1004 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/94", - 1005, - { + }, + { + "key": "collection/94", + "version": 1005, + "value": { "v": 1005 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/95", - 1006, - { + }, + { + "key": "collection/95", + "version": 1006, + "value": { "v": 1006 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/96", - 1007, - { + }, + { + "key": "collection/96", + "version": 1007, + "value": { "v": 1007 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/97", - 1008, - { + }, + { + "key": "collection/97", + "version": 1008, + "value": { "v": 1008 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/98", - 1009, - { + }, + { + "key": "collection/98", + "version": 1009, + "value": { "v": 1009 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/99", - 1010, - { + }, + { + "key": "collection/99", + "version": 1010, + "value": { "v": 1010 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -26821,706 +38084,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/1/coll/0", - 2, - { + { + "key": "collection/1/coll/0", + "version": 2, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/1", - 3, - { + }, + { + "key": "collection/1/coll/1", + "version": 3, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/2", - 4, - { + }, + { + "key": "collection/1/coll/2", + "version": 4, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/3", - 5, - { + }, + { + "key": "collection/1/coll/3", + "version": 5, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/4", - 6, - { + }, + { + "key": "collection/1/coll/4", + "version": 6, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/5", - 7, - { + }, + { + "key": "collection/1/coll/5", + "version": 7, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/6", - 8, - { + }, + { + "key": "collection/1/coll/6", + "version": 8, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/7", - 9, - { + }, + { + "key": "collection/1/coll/7", + "version": 9, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/8", - 10, - { + }, + { + "key": "collection/1/coll/8", + "version": 10, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/9", - 11, - { + }, + { + "key": "collection/1/coll/9", + "version": 11, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/10", - 12, - { + }, + { + "key": "collection/1/coll/10", + "version": 12, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/11", - 13, - { + }, + { + "key": "collection/1/coll/11", + "version": 13, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/12", - 14, - { + }, + { + "key": "collection/1/coll/12", + "version": 14, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/13", - 15, - { + }, + { + "key": "collection/1/coll/13", + "version": 15, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/14", - 16, - { + }, + { + "key": "collection/1/coll/14", + "version": 16, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/15", - 17, - { + }, + { + "key": "collection/1/coll/15", + "version": 17, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/16", - 18, - { + }, + { + "key": "collection/1/coll/16", + "version": 18, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/17", - 19, - { + }, + { + "key": "collection/1/coll/17", + "version": 19, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/18", - 20, - { + }, + { + "key": "collection/1/coll/18", + "version": 20, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/19", - 21, - { + }, + { + "key": "collection/1/coll/19", + "version": 21, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/20", - 22, - { + }, + { + "key": "collection/1/coll/20", + "version": 22, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/21", - 23, - { + }, + { + "key": "collection/1/coll/21", + "version": 23, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/22", - 24, - { + }, + { + "key": "collection/1/coll/22", + "version": 24, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/23", - 25, - { + }, + { + "key": "collection/1/coll/23", + "version": 25, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/24", - 26, - { + }, + { + "key": "collection/1/coll/24", + "version": 26, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/25", - 27, - { + }, + { + "key": "collection/1/coll/25", + "version": 27, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/26", - 28, - { + }, + { + "key": "collection/1/coll/26", + "version": 28, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/27", - 29, - { + }, + { + "key": "collection/1/coll/27", + "version": 29, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/28", - 30, - { + }, + { + "key": "collection/1/coll/28", + "version": 30, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/29", - 31, - { + }, + { + "key": "collection/1/coll/29", + "version": 31, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/30", - 32, - { + }, + { + "key": "collection/1/coll/30", + "version": 32, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/31", - 33, - { + }, + { + "key": "collection/1/coll/31", + "version": 33, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/32", - 34, - { + }, + { + "key": "collection/1/coll/32", + "version": 34, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/33", - 35, - { + }, + { + "key": "collection/1/coll/33", + "version": 35, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/34", - 36, - { + }, + { + "key": "collection/1/coll/34", + "version": 36, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/35", - 37, - { + }, + { + "key": "collection/1/coll/35", + "version": 37, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/36", - 38, - { + }, + { + "key": "collection/1/coll/36", + "version": 38, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/37", - 39, - { + }, + { + "key": "collection/1/coll/37", + "version": 39, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/38", - 40, - { + }, + { + "key": "collection/1/coll/38", + "version": 40, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/39", - 41, - { + }, + { + "key": "collection/1/coll/39", + "version": 41, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/40", - 42, - { + }, + { + "key": "collection/1/coll/40", + "version": 42, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/41", - 43, - { + }, + { + "key": "collection/1/coll/41", + "version": 43, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/42", - 44, - { + }, + { + "key": "collection/1/coll/42", + "version": 44, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/43", - 45, - { + }, + { + "key": "collection/1/coll/43", + "version": 45, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/44", - 46, - { + }, + { + "key": "collection/1/coll/44", + "version": 46, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/45", - 47, - { + }, + { + "key": "collection/1/coll/45", + "version": 47, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/46", - 48, - { + }, + { + "key": "collection/1/coll/46", + "version": 48, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/47", - 49, - { + }, + { + "key": "collection/1/coll/47", + "version": 49, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/48", - 50, - { + }, + { + "key": "collection/1/coll/48", + "version": 50, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/49", - 51, - { + }, + { + "key": "collection/1/coll/49", + "version": 51, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/50", - 52, - { + }, + { + "key": "collection/1/coll/50", + "version": 52, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/51", - 53, - { + }, + { + "key": "collection/1/coll/51", + "version": 53, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/52", - 54, - { + }, + { + "key": "collection/1/coll/52", + "version": 54, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/53", - 55, - { + }, + { + "key": "collection/1/coll/53", + "version": 55, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/54", - 56, - { + }, + { + "key": "collection/1/coll/54", + "version": 56, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/55", - 57, - { + }, + { + "key": "collection/1/coll/55", + "version": 57, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/56", - 58, - { + }, + { + "key": "collection/1/coll/56", + "version": 58, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/57", - 59, - { + }, + { + "key": "collection/1/coll/57", + "version": 59, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/58", - 60, - { + }, + { + "key": "collection/1/coll/58", + "version": 60, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/59", - 61, - { + }, + { + "key": "collection/1/coll/59", + "version": 61, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/60", - 62, - { + }, + { + "key": "collection/1/coll/60", + "version": 62, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/61", - 63, - { + }, + { + "key": "collection/1/coll/61", + "version": 63, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/62", - 64, - { + }, + { + "key": "collection/1/coll/62", + "version": 64, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/63", - 65, - { + }, + { + "key": "collection/1/coll/63", + "version": 65, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/64", - 66, - { + }, + { + "key": "collection/1/coll/64", + "version": 66, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/65", - 67, - { + }, + { + "key": "collection/1/coll/65", + "version": 67, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/66", - 68, - { + }, + { + "key": "collection/1/coll/66", + "version": 68, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/67", - 69, - { + }, + { + "key": "collection/1/coll/67", + "version": 69, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/68", - 70, - { + }, + { + "key": "collection/1/coll/68", + "version": 70, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/69", - 71, - { + }, + { + "key": "collection/1/coll/69", + "version": 71, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/70", - 72, - { + }, + { + "key": "collection/1/coll/70", + "version": 72, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/71", - 73, - { + }, + { + "key": "collection/1/coll/71", + "version": 73, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/72", - 74, - { + }, + { + "key": "collection/1/coll/72", + "version": 74, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/73", - 75, - { + }, + { + "key": "collection/1/coll/73", + "version": 75, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/74", - 76, - { + }, + { + "key": "collection/1/coll/74", + "version": 76, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/75", - 77, - { + }, + { + "key": "collection/1/coll/75", + "version": 77, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/76", - 78, - { + }, + { + "key": "collection/1/coll/76", + "version": 78, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/77", - 79, - { + }, + { + "key": "collection/1/coll/77", + "version": 79, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/78", - 80, - { + }, + { + "key": "collection/1/coll/78", + "version": 80, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/79", - 81, - { + }, + { + "key": "collection/1/coll/79", + "version": 81, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/80", - 82, - { + }, + { + "key": "collection/1/coll/80", + "version": 82, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/81", - 83, - { + }, + { + "key": "collection/1/coll/81", + "version": 83, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/82", - 84, - { + }, + { + "key": "collection/1/coll/82", + "version": 84, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/83", - 85, - { + }, + { + "key": "collection/1/coll/83", + "version": 85, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/84", - 86, - { + }, + { + "key": "collection/1/coll/84", + "version": 86, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/85", - 87, - { + }, + { + "key": "collection/1/coll/85", + "version": 87, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/86", - 88, - { + }, + { + "key": "collection/1/coll/86", + "version": 88, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/87", - 89, - { + }, + { + "key": "collection/1/coll/87", + "version": 89, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/88", - 90, - { + }, + { + "key": "collection/1/coll/88", + "version": 90, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/89", - 91, - { + }, + { + "key": "collection/1/coll/89", + "version": 91, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/90", - 92, - { + }, + { + "key": "collection/1/coll/90", + "version": 92, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/91", - 93, - { + }, + { + "key": "collection/1/coll/91", + "version": 93, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/92", - 94, - { + }, + { + "key": "collection/1/coll/92", + "version": 94, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/93", - 95, - { + }, + { + "key": "collection/1/coll/93", + "version": 95, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/94", - 96, - { + }, + { + "key": "collection/1/coll/94", + "version": 96, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/95", - 97, - { + }, + { + "key": "collection/1/coll/95", + "version": 97, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/96", - 98, - { + }, + { + "key": "collection/1/coll/96", + "version": 98, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/97", - 99, - { + }, + { + "key": "collection/1/coll/97", + "version": 99, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/98", - 100, - { + }, + { + "key": "collection/1/coll/98", + "version": 100, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/99", - 101, - { + }, + { + "key": "collection/1/coll/99", + "version": 101, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -27537,7 +39200,8 @@ }, { "watchSnapshot": { - "version": 102 + "version": 102, + "targetIds": [] }, "expect": [ { @@ -27552,706 +39216,1106 @@ ] }, "added": [ - [ - "collection/1/coll/0", - 2, - { + { + "key": "collection/1/coll/0", + "version": 2, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/1", - 3, - { + }, + { + "key": "collection/1/coll/1", + "version": 3, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/2", - 4, - { + }, + { + "key": "collection/1/coll/2", + "version": 4, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/3", - 5, - { + }, + { + "key": "collection/1/coll/3", + "version": 5, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/4", - 6, - { + }, + { + "key": "collection/1/coll/4", + "version": 6, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/5", - 7, - { + }, + { + "key": "collection/1/coll/5", + "version": 7, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/6", - 8, - { + }, + { + "key": "collection/1/coll/6", + "version": 8, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/7", - 9, - { + }, + { + "key": "collection/1/coll/7", + "version": 9, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/8", - 10, - { + }, + { + "key": "collection/1/coll/8", + "version": 10, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/9", - 11, - { + }, + { + "key": "collection/1/coll/9", + "version": 11, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/10", - 12, - { + }, + { + "key": "collection/1/coll/10", + "version": 12, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/11", - 13, - { + }, + { + "key": "collection/1/coll/11", + "version": 13, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/12", - 14, - { + }, + { + "key": "collection/1/coll/12", + "version": 14, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/13", - 15, - { + }, + { + "key": "collection/1/coll/13", + "version": 15, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/14", - 16, - { + }, + { + "key": "collection/1/coll/14", + "version": 16, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/15", - 17, - { + }, + { + "key": "collection/1/coll/15", + "version": 17, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/16", - 18, - { + }, + { + "key": "collection/1/coll/16", + "version": 18, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/17", - 19, - { + }, + { + "key": "collection/1/coll/17", + "version": 19, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/18", - 20, - { + }, + { + "key": "collection/1/coll/18", + "version": 20, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/19", - 21, - { + }, + { + "key": "collection/1/coll/19", + "version": 21, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/20", - 22, - { + }, + { + "key": "collection/1/coll/20", + "version": 22, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/21", - 23, - { + }, + { + "key": "collection/1/coll/21", + "version": 23, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/22", - 24, - { + }, + { + "key": "collection/1/coll/22", + "version": 24, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/23", - 25, - { + }, + { + "key": "collection/1/coll/23", + "version": 25, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/24", - 26, - { + }, + { + "key": "collection/1/coll/24", + "version": 26, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/25", - 27, - { + }, + { + "key": "collection/1/coll/25", + "version": 27, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/26", - 28, - { + }, + { + "key": "collection/1/coll/26", + "version": 28, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/27", - 29, - { + }, + { + "key": "collection/1/coll/27", + "version": 29, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/28", - 30, - { + }, + { + "key": "collection/1/coll/28", + "version": 30, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/29", - 31, - { + }, + { + "key": "collection/1/coll/29", + "version": 31, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/30", - 32, - { + }, + { + "key": "collection/1/coll/30", + "version": 32, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/31", - 33, - { + }, + { + "key": "collection/1/coll/31", + "version": 33, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/32", - 34, - { + }, + { + "key": "collection/1/coll/32", + "version": 34, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/33", - 35, - { + }, + { + "key": "collection/1/coll/33", + "version": 35, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/34", - 36, - { + }, + { + "key": "collection/1/coll/34", + "version": 36, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/35", - 37, - { + }, + { + "key": "collection/1/coll/35", + "version": 37, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/36", - 38, - { + }, + { + "key": "collection/1/coll/36", + "version": 38, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/37", - 39, - { + }, + { + "key": "collection/1/coll/37", + "version": 39, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/38", - 40, - { + }, + { + "key": "collection/1/coll/38", + "version": 40, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/39", - 41, - { + }, + { + "key": "collection/1/coll/39", + "version": 41, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/40", - 42, - { + }, + { + "key": "collection/1/coll/40", + "version": 42, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/41", - 43, - { + }, + { + "key": "collection/1/coll/41", + "version": 43, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/42", - 44, - { + }, + { + "key": "collection/1/coll/42", + "version": 44, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/43", - 45, - { + }, + { + "key": "collection/1/coll/43", + "version": 45, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/44", - 46, - { + }, + { + "key": "collection/1/coll/44", + "version": 46, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/45", - 47, - { + }, + { + "key": "collection/1/coll/45", + "version": 47, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/46", - 48, - { + }, + { + "key": "collection/1/coll/46", + "version": 48, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/47", - 49, - { + }, + { + "key": "collection/1/coll/47", + "version": 49, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/48", - 50, - { + }, + { + "key": "collection/1/coll/48", + "version": 50, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/49", - 51, - { + }, + { + "key": "collection/1/coll/49", + "version": 51, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/50", - 52, - { + }, + { + "key": "collection/1/coll/50", + "version": 52, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/51", - 53, - { + }, + { + "key": "collection/1/coll/51", + "version": 53, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/52", - 54, - { + }, + { + "key": "collection/1/coll/52", + "version": 54, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/53", - 55, - { + }, + { + "key": "collection/1/coll/53", + "version": 55, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/54", - 56, - { + }, + { + "key": "collection/1/coll/54", + "version": 56, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/55", - 57, - { + }, + { + "key": "collection/1/coll/55", + "version": 57, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/56", - 58, - { + }, + { + "key": "collection/1/coll/56", + "version": 58, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/57", - 59, - { + }, + { + "key": "collection/1/coll/57", + "version": 59, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/58", - 60, - { + }, + { + "key": "collection/1/coll/58", + "version": 60, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/59", - 61, - { + }, + { + "key": "collection/1/coll/59", + "version": 61, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/60", - 62, - { + }, + { + "key": "collection/1/coll/60", + "version": 62, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/61", - 63, - { + }, + { + "key": "collection/1/coll/61", + "version": 63, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/62", - 64, - { + }, + { + "key": "collection/1/coll/62", + "version": 64, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/63", - 65, - { + }, + { + "key": "collection/1/coll/63", + "version": 65, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/64", - 66, - { + }, + { + "key": "collection/1/coll/64", + "version": 66, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/65", - 67, - { + }, + { + "key": "collection/1/coll/65", + "version": 67, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/66", - 68, - { + }, + { + "key": "collection/1/coll/66", + "version": 68, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/67", - 69, - { + }, + { + "key": "collection/1/coll/67", + "version": 69, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/68", - 70, - { + }, + { + "key": "collection/1/coll/68", + "version": 70, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/69", - 71, - { + }, + { + "key": "collection/1/coll/69", + "version": 71, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/70", - 72, - { + }, + { + "key": "collection/1/coll/70", + "version": 72, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/71", - 73, - { + }, + { + "key": "collection/1/coll/71", + "version": 73, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/72", - 74, - { + }, + { + "key": "collection/1/coll/72", + "version": 74, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/73", - 75, - { + }, + { + "key": "collection/1/coll/73", + "version": 75, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/74", - 76, - { + }, + { + "key": "collection/1/coll/74", + "version": 76, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/75", - 77, - { + }, + { + "key": "collection/1/coll/75", + "version": 77, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/76", - 78, - { + }, + { + "key": "collection/1/coll/76", + "version": 78, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/77", - 79, - { + }, + { + "key": "collection/1/coll/77", + "version": 79, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/78", - 80, - { + }, + { + "key": "collection/1/coll/78", + "version": 80, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/79", - 81, - { + }, + { + "key": "collection/1/coll/79", + "version": 81, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/80", - 82, - { + }, + { + "key": "collection/1/coll/80", + "version": 82, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/81", - 83, - { + }, + { + "key": "collection/1/coll/81", + "version": 83, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/82", - 84, - { + }, + { + "key": "collection/1/coll/82", + "version": 84, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/83", - 85, - { + }, + { + "key": "collection/1/coll/83", + "version": 85, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/84", - 86, - { + }, + { + "key": "collection/1/coll/84", + "version": 86, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/85", - 87, - { + }, + { + "key": "collection/1/coll/85", + "version": 87, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/86", - 88, - { + }, + { + "key": "collection/1/coll/86", + "version": 88, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/87", - 89, - { + }, + { + "key": "collection/1/coll/87", + "version": 89, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/88", - 90, - { + }, + { + "key": "collection/1/coll/88", + "version": 90, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/89", - 91, - { + }, + { + "key": "collection/1/coll/89", + "version": 91, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/90", - 92, - { + }, + { + "key": "collection/1/coll/90", + "version": 92, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/91", - 93, - { + }, + { + "key": "collection/1/coll/91", + "version": 93, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/92", - 94, - { + }, + { + "key": "collection/1/coll/92", + "version": 94, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/93", - 95, - { + }, + { + "key": "collection/1/coll/93", + "version": 95, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/94", - 96, - { + }, + { + "key": "collection/1/coll/94", + "version": 96, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/95", - 97, - { + }, + { + "key": "collection/1/coll/95", + "version": 97, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/96", - 98, - { + }, + { + "key": "collection/1/coll/96", + "version": 98, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/97", - 99, - { + }, + { + "key": "collection/1/coll/97", + "version": 99, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/98", - 100, - { + }, + { + "key": "collection/1/coll/98", + "version": 100, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/99", - 101, - { + }, + { + "key": "collection/1/coll/99", + "version": 101, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -28328,706 +40392,1106 @@ ] }, "added": [ - [ - "collection/1/coll/0", - 2, - { + { + "key": "collection/1/coll/0", + "version": 2, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/1", - 3, - { + }, + { + "key": "collection/1/coll/1", + "version": 3, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/2", - 4, - { + }, + { + "key": "collection/1/coll/2", + "version": 4, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/3", - 5, - { + }, + { + "key": "collection/1/coll/3", + "version": 5, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/4", - 6, - { + }, + { + "key": "collection/1/coll/4", + "version": 6, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/5", - 7, - { + }, + { + "key": "collection/1/coll/5", + "version": 7, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/6", - 8, - { + }, + { + "key": "collection/1/coll/6", + "version": 8, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/7", - 9, - { + }, + { + "key": "collection/1/coll/7", + "version": 9, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/8", - 10, - { + }, + { + "key": "collection/1/coll/8", + "version": 10, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/9", - 11, - { + }, + { + "key": "collection/1/coll/9", + "version": 11, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/10", - 12, - { + }, + { + "key": "collection/1/coll/10", + "version": 12, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/11", - 13, - { + }, + { + "key": "collection/1/coll/11", + "version": 13, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/12", - 14, - { + }, + { + "key": "collection/1/coll/12", + "version": 14, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/13", - 15, - { + }, + { + "key": "collection/1/coll/13", + "version": 15, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/14", - 16, - { + }, + { + "key": "collection/1/coll/14", + "version": 16, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/15", - 17, - { + }, + { + "key": "collection/1/coll/15", + "version": 17, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/16", - 18, - { + }, + { + "key": "collection/1/coll/16", + "version": 18, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/17", - 19, - { + }, + { + "key": "collection/1/coll/17", + "version": 19, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/18", - 20, - { + }, + { + "key": "collection/1/coll/18", + "version": 20, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/19", - 21, - { + }, + { + "key": "collection/1/coll/19", + "version": 21, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/20", - 22, - { + }, + { + "key": "collection/1/coll/20", + "version": 22, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/21", - 23, - { + }, + { + "key": "collection/1/coll/21", + "version": 23, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/22", - 24, - { + }, + { + "key": "collection/1/coll/22", + "version": 24, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/23", - 25, - { + }, + { + "key": "collection/1/coll/23", + "version": 25, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/24", - 26, - { + }, + { + "key": "collection/1/coll/24", + "version": 26, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/25", - 27, - { + }, + { + "key": "collection/1/coll/25", + "version": 27, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/26", - 28, - { + }, + { + "key": "collection/1/coll/26", + "version": 28, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/27", - 29, - { + }, + { + "key": "collection/1/coll/27", + "version": 29, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/28", - 30, - { + }, + { + "key": "collection/1/coll/28", + "version": 30, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/29", - 31, - { + }, + { + "key": "collection/1/coll/29", + "version": 31, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/30", - 32, - { + }, + { + "key": "collection/1/coll/30", + "version": 32, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/31", - 33, - { + }, + { + "key": "collection/1/coll/31", + "version": 33, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/32", - 34, - { + }, + { + "key": "collection/1/coll/32", + "version": 34, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/33", - 35, - { + }, + { + "key": "collection/1/coll/33", + "version": 35, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/34", - 36, - { + }, + { + "key": "collection/1/coll/34", + "version": 36, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/35", - 37, - { + }, + { + "key": "collection/1/coll/35", + "version": 37, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/36", - 38, - { + }, + { + "key": "collection/1/coll/36", + "version": 38, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/37", - 39, - { + }, + { + "key": "collection/1/coll/37", + "version": 39, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/38", - 40, - { + }, + { + "key": "collection/1/coll/38", + "version": 40, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/39", - 41, - { + }, + { + "key": "collection/1/coll/39", + "version": 41, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/40", - 42, - { + }, + { + "key": "collection/1/coll/40", + "version": 42, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/41", - 43, - { + }, + { + "key": "collection/1/coll/41", + "version": 43, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/42", - 44, - { + }, + { + "key": "collection/1/coll/42", + "version": 44, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/43", - 45, - { + }, + { + "key": "collection/1/coll/43", + "version": 45, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/44", - 46, - { + }, + { + "key": "collection/1/coll/44", + "version": 46, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/45", - 47, - { + }, + { + "key": "collection/1/coll/45", + "version": 47, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/46", - 48, - { + }, + { + "key": "collection/1/coll/46", + "version": 48, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/47", - 49, - { + }, + { + "key": "collection/1/coll/47", + "version": 49, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/48", - 50, - { + }, + { + "key": "collection/1/coll/48", + "version": 50, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/49", - 51, - { + }, + { + "key": "collection/1/coll/49", + "version": 51, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/50", - 52, - { + }, + { + "key": "collection/1/coll/50", + "version": 52, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/51", - 53, - { + }, + { + "key": "collection/1/coll/51", + "version": 53, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/52", - 54, - { + }, + { + "key": "collection/1/coll/52", + "version": 54, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/53", - 55, - { + }, + { + "key": "collection/1/coll/53", + "version": 55, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/54", - 56, - { + }, + { + "key": "collection/1/coll/54", + "version": 56, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/55", - 57, - { + }, + { + "key": "collection/1/coll/55", + "version": 57, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/56", - 58, - { + }, + { + "key": "collection/1/coll/56", + "version": 58, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/57", - 59, - { + }, + { + "key": "collection/1/coll/57", + "version": 59, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/58", - 60, - { + }, + { + "key": "collection/1/coll/58", + "version": 60, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/59", - 61, - { + }, + { + "key": "collection/1/coll/59", + "version": 61, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/60", - 62, - { + }, + { + "key": "collection/1/coll/60", + "version": 62, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/61", - 63, - { + }, + { + "key": "collection/1/coll/61", + "version": 63, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/62", - 64, - { + }, + { + "key": "collection/1/coll/62", + "version": 64, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/63", - 65, - { + }, + { + "key": "collection/1/coll/63", + "version": 65, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/64", - 66, - { + }, + { + "key": "collection/1/coll/64", + "version": 66, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/65", - 67, - { + }, + { + "key": "collection/1/coll/65", + "version": 67, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/66", - 68, - { + }, + { + "key": "collection/1/coll/66", + "version": 68, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/67", - 69, - { + }, + { + "key": "collection/1/coll/67", + "version": 69, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/68", - 70, - { + }, + { + "key": "collection/1/coll/68", + "version": 70, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/69", - 71, - { + }, + { + "key": "collection/1/coll/69", + "version": 71, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/70", - 72, - { + }, + { + "key": "collection/1/coll/70", + "version": 72, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/71", - 73, - { + }, + { + "key": "collection/1/coll/71", + "version": 73, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/72", - 74, - { + }, + { + "key": "collection/1/coll/72", + "version": 74, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/73", - 75, - { + }, + { + "key": "collection/1/coll/73", + "version": 75, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/74", - 76, - { + }, + { + "key": "collection/1/coll/74", + "version": 76, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/75", - 77, - { + }, + { + "key": "collection/1/coll/75", + "version": 77, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/76", - 78, - { + }, + { + "key": "collection/1/coll/76", + "version": 78, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/77", - 79, - { + }, + { + "key": "collection/1/coll/77", + "version": 79, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/78", - 80, - { + }, + { + "key": "collection/1/coll/78", + "version": 80, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/79", - 81, - { + }, + { + "key": "collection/1/coll/79", + "version": 81, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/80", - 82, - { + }, + { + "key": "collection/1/coll/80", + "version": 82, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/81", - 83, - { + }, + { + "key": "collection/1/coll/81", + "version": 83, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/82", - 84, - { + }, + { + "key": "collection/1/coll/82", + "version": 84, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/83", - 85, - { + }, + { + "key": "collection/1/coll/83", + "version": 85, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/84", - 86, - { + }, + { + "key": "collection/1/coll/84", + "version": 86, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/85", - 87, - { + }, + { + "key": "collection/1/coll/85", + "version": 87, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/86", - 88, - { + }, + { + "key": "collection/1/coll/86", + "version": 88, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/87", - 89, - { + }, + { + "key": "collection/1/coll/87", + "version": 89, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/88", - 90, - { + }, + { + "key": "collection/1/coll/88", + "version": 90, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/89", - 91, - { + }, + { + "key": "collection/1/coll/89", + "version": 91, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/90", - 92, - { + }, + { + "key": "collection/1/coll/90", + "version": 92, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/91", - 93, - { + }, + { + "key": "collection/1/coll/91", + "version": 93, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/92", - 94, - { + }, + { + "key": "collection/1/coll/92", + "version": 94, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/93", - 95, - { + }, + { + "key": "collection/1/coll/93", + "version": 95, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/94", - 96, - { + }, + { + "key": "collection/1/coll/94", + "version": 96, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/95", - 97, - { + }, + { + "key": "collection/1/coll/95", + "version": 97, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/96", - 98, - { + }, + { + "key": "collection/1/coll/96", + "version": 98, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/97", - 99, - { + }, + { + "key": "collection/1/coll/97", + "version": 99, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/98", - 100, - { + }, + { + "key": "collection/1/coll/98", + "version": 100, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/1/coll/99", - 101, - { + }, + { + "key": "collection/1/coll/99", + "version": 101, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -29058,7 +41522,8 @@ }, { "watchSnapshot": { - "version": 103 + "version": 103, + "targetIds": [] }, "expect": [ { @@ -29143,706 +41608,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/2/coll/0", - 104, - { + { + "key": "collection/2/coll/0", + "version": 104, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/1", - 105, - { + }, + { + "key": "collection/2/coll/1", + "version": 105, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/2", - 106, - { + }, + { + "key": "collection/2/coll/2", + "version": 106, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/3", - 107, - { + }, + { + "key": "collection/2/coll/3", + "version": 107, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/4", - 108, - { + }, + { + "key": "collection/2/coll/4", + "version": 108, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/5", - 109, - { + }, + { + "key": "collection/2/coll/5", + "version": 109, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/6", - 110, - { + }, + { + "key": "collection/2/coll/6", + "version": 110, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/7", - 111, - { + }, + { + "key": "collection/2/coll/7", + "version": 111, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/8", - 112, - { + }, + { + "key": "collection/2/coll/8", + "version": 112, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/9", - 113, - { + }, + { + "key": "collection/2/coll/9", + "version": 113, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/10", - 114, - { + }, + { + "key": "collection/2/coll/10", + "version": 114, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/11", - 115, - { + }, + { + "key": "collection/2/coll/11", + "version": 115, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/12", - 116, - { + }, + { + "key": "collection/2/coll/12", + "version": 116, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/13", - 117, - { + }, + { + "key": "collection/2/coll/13", + "version": 117, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/14", - 118, - { + }, + { + "key": "collection/2/coll/14", + "version": 118, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/15", - 119, - { + }, + { + "key": "collection/2/coll/15", + "version": 119, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/16", - 120, - { + }, + { + "key": "collection/2/coll/16", + "version": 120, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/17", - 121, - { + }, + { + "key": "collection/2/coll/17", + "version": 121, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/18", - 122, - { + }, + { + "key": "collection/2/coll/18", + "version": 122, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/19", - 123, - { + }, + { + "key": "collection/2/coll/19", + "version": 123, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/20", - 124, - { + }, + { + "key": "collection/2/coll/20", + "version": 124, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/21", - 125, - { + }, + { + "key": "collection/2/coll/21", + "version": 125, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/22", - 126, - { + }, + { + "key": "collection/2/coll/22", + "version": 126, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/23", - 127, - { + }, + { + "key": "collection/2/coll/23", + "version": 127, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/24", - 128, - { + }, + { + "key": "collection/2/coll/24", + "version": 128, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/25", - 129, - { + }, + { + "key": "collection/2/coll/25", + "version": 129, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/26", - 130, - { + }, + { + "key": "collection/2/coll/26", + "version": 130, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/27", - 131, - { + }, + { + "key": "collection/2/coll/27", + "version": 131, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/28", - 132, - { + }, + { + "key": "collection/2/coll/28", + "version": 132, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/29", - 133, - { + }, + { + "key": "collection/2/coll/29", + "version": 133, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/30", - 134, - { + }, + { + "key": "collection/2/coll/30", + "version": 134, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/31", - 135, - { + }, + { + "key": "collection/2/coll/31", + "version": 135, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/32", - 136, - { + }, + { + "key": "collection/2/coll/32", + "version": 136, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/33", - 137, - { + }, + { + "key": "collection/2/coll/33", + "version": 137, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/34", - 138, - { + }, + { + "key": "collection/2/coll/34", + "version": 138, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/35", - 139, - { + }, + { + "key": "collection/2/coll/35", + "version": 139, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/36", - 140, - { + }, + { + "key": "collection/2/coll/36", + "version": 140, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/37", - 141, - { + }, + { + "key": "collection/2/coll/37", + "version": 141, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/38", - 142, - { + }, + { + "key": "collection/2/coll/38", + "version": 142, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/39", - 143, - { + }, + { + "key": "collection/2/coll/39", + "version": 143, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/40", - 144, - { + }, + { + "key": "collection/2/coll/40", + "version": 144, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/41", - 145, - { + }, + { + "key": "collection/2/coll/41", + "version": 145, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/42", - 146, - { + }, + { + "key": "collection/2/coll/42", + "version": 146, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/43", - 147, - { + }, + { + "key": "collection/2/coll/43", + "version": 147, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/44", - 148, - { + }, + { + "key": "collection/2/coll/44", + "version": 148, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/45", - 149, - { + }, + { + "key": "collection/2/coll/45", + "version": 149, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/46", - 150, - { + }, + { + "key": "collection/2/coll/46", + "version": 150, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/47", - 151, - { + }, + { + "key": "collection/2/coll/47", + "version": 151, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/48", - 152, - { + }, + { + "key": "collection/2/coll/48", + "version": 152, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/49", - 153, - { + }, + { + "key": "collection/2/coll/49", + "version": 153, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/50", - 154, - { + }, + { + "key": "collection/2/coll/50", + "version": 154, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/51", - 155, - { + }, + { + "key": "collection/2/coll/51", + "version": 155, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/52", - 156, - { + }, + { + "key": "collection/2/coll/52", + "version": 156, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/53", - 157, - { + }, + { + "key": "collection/2/coll/53", + "version": 157, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/54", - 158, - { + }, + { + "key": "collection/2/coll/54", + "version": 158, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/55", - 159, - { + }, + { + "key": "collection/2/coll/55", + "version": 159, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/56", - 160, - { + }, + { + "key": "collection/2/coll/56", + "version": 160, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/57", - 161, - { + }, + { + "key": "collection/2/coll/57", + "version": 161, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/58", - 162, - { + }, + { + "key": "collection/2/coll/58", + "version": 162, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/59", - 163, - { + }, + { + "key": "collection/2/coll/59", + "version": 163, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/60", - 164, - { + }, + { + "key": "collection/2/coll/60", + "version": 164, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/61", - 165, - { + }, + { + "key": "collection/2/coll/61", + "version": 165, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/62", - 166, - { + }, + { + "key": "collection/2/coll/62", + "version": 166, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/63", - 167, - { + }, + { + "key": "collection/2/coll/63", + "version": 167, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/64", - 168, - { + }, + { + "key": "collection/2/coll/64", + "version": 168, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/65", - 169, - { + }, + { + "key": "collection/2/coll/65", + "version": 169, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/66", - 170, - { + }, + { + "key": "collection/2/coll/66", + "version": 170, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/67", - 171, - { + }, + { + "key": "collection/2/coll/67", + "version": 171, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/68", - 172, - { + }, + { + "key": "collection/2/coll/68", + "version": 172, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/69", - 173, - { + }, + { + "key": "collection/2/coll/69", + "version": 173, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/70", - 174, - { + }, + { + "key": "collection/2/coll/70", + "version": 174, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/71", - 175, - { + }, + { + "key": "collection/2/coll/71", + "version": 175, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/72", - 176, - { + }, + { + "key": "collection/2/coll/72", + "version": 176, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/73", - 177, - { + }, + { + "key": "collection/2/coll/73", + "version": 177, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/74", - 178, - { + }, + { + "key": "collection/2/coll/74", + "version": 178, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/75", - 179, - { + }, + { + "key": "collection/2/coll/75", + "version": 179, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/76", - 180, - { + }, + { + "key": "collection/2/coll/76", + "version": 180, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/77", - 181, - { + }, + { + "key": "collection/2/coll/77", + "version": 181, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/78", - 182, - { + }, + { + "key": "collection/2/coll/78", + "version": 182, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/79", - 183, - { + }, + { + "key": "collection/2/coll/79", + "version": 183, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/80", - 184, - { + }, + { + "key": "collection/2/coll/80", + "version": 184, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/81", - 185, - { + }, + { + "key": "collection/2/coll/81", + "version": 185, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/82", - 186, - { + }, + { + "key": "collection/2/coll/82", + "version": 186, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/83", - 187, - { + }, + { + "key": "collection/2/coll/83", + "version": 187, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/84", - 188, - { + }, + { + "key": "collection/2/coll/84", + "version": 188, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/85", - 189, - { + }, + { + "key": "collection/2/coll/85", + "version": 189, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/86", - 190, - { + }, + { + "key": "collection/2/coll/86", + "version": 190, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/87", - 191, - { + }, + { + "key": "collection/2/coll/87", + "version": 191, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/88", - 192, - { + }, + { + "key": "collection/2/coll/88", + "version": 192, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/89", - 193, - { + }, + { + "key": "collection/2/coll/89", + "version": 193, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/90", - 194, - { + }, + { + "key": "collection/2/coll/90", + "version": 194, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/91", - 195, - { + }, + { + "key": "collection/2/coll/91", + "version": 195, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/92", - 196, - { + }, + { + "key": "collection/2/coll/92", + "version": 196, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/93", - 197, - { + }, + { + "key": "collection/2/coll/93", + "version": 197, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/94", - 198, - { + }, + { + "key": "collection/2/coll/94", + "version": 198, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/95", - 199, - { + }, + { + "key": "collection/2/coll/95", + "version": 199, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/96", - 200, - { + }, + { + "key": "collection/2/coll/96", + "version": 200, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/97", - 201, - { + }, + { + "key": "collection/2/coll/97", + "version": 201, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/98", - 202, - { + }, + { + "key": "collection/2/coll/98", + "version": 202, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/99", - 203, - { + }, + { + "key": "collection/2/coll/99", + "version": 203, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 4 @@ -29859,7 +42724,8 @@ }, { "watchSnapshot": { - "version": 204 + "version": 204, + "targetIds": [] }, "expect": [ { @@ -29874,706 +42740,1106 @@ ] }, "added": [ - [ - "collection/2/coll/0", - 104, - { + { + "key": "collection/2/coll/0", + "version": 104, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/1", - 105, - { + }, + { + "key": "collection/2/coll/1", + "version": 105, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/2", - 106, - { + }, + { + "key": "collection/2/coll/2", + "version": 106, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/3", - 107, - { + }, + { + "key": "collection/2/coll/3", + "version": 107, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/4", - 108, - { + }, + { + "key": "collection/2/coll/4", + "version": 108, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/5", - 109, - { + }, + { + "key": "collection/2/coll/5", + "version": 109, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/6", - 110, - { + }, + { + "key": "collection/2/coll/6", + "version": 110, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/7", - 111, - { + }, + { + "key": "collection/2/coll/7", + "version": 111, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/8", - 112, - { + }, + { + "key": "collection/2/coll/8", + "version": 112, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/9", - 113, - { + }, + { + "key": "collection/2/coll/9", + "version": 113, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/10", - 114, - { + }, + { + "key": "collection/2/coll/10", + "version": 114, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/11", - 115, - { + }, + { + "key": "collection/2/coll/11", + "version": 115, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/12", - 116, - { + }, + { + "key": "collection/2/coll/12", + "version": 116, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/13", - 117, - { + }, + { + "key": "collection/2/coll/13", + "version": 117, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/14", - 118, - { + }, + { + "key": "collection/2/coll/14", + "version": 118, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/15", - 119, - { + }, + { + "key": "collection/2/coll/15", + "version": 119, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/16", - 120, - { + }, + { + "key": "collection/2/coll/16", + "version": 120, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/17", - 121, - { + }, + { + "key": "collection/2/coll/17", + "version": 121, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/18", - 122, - { + }, + { + "key": "collection/2/coll/18", + "version": 122, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/19", - 123, - { + }, + { + "key": "collection/2/coll/19", + "version": 123, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/20", - 124, - { + }, + { + "key": "collection/2/coll/20", + "version": 124, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/21", - 125, - { + }, + { + "key": "collection/2/coll/21", + "version": 125, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/22", - 126, - { + }, + { + "key": "collection/2/coll/22", + "version": 126, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/23", - 127, - { + }, + { + "key": "collection/2/coll/23", + "version": 127, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/24", - 128, - { + }, + { + "key": "collection/2/coll/24", + "version": 128, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/25", - 129, - { + }, + { + "key": "collection/2/coll/25", + "version": 129, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/26", - 130, - { + }, + { + "key": "collection/2/coll/26", + "version": 130, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/27", - 131, - { + }, + { + "key": "collection/2/coll/27", + "version": 131, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/28", - 132, - { + }, + { + "key": "collection/2/coll/28", + "version": 132, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/29", - 133, - { + }, + { + "key": "collection/2/coll/29", + "version": 133, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/30", - 134, - { + }, + { + "key": "collection/2/coll/30", + "version": 134, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/31", - 135, - { + }, + { + "key": "collection/2/coll/31", + "version": 135, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/32", - 136, - { + }, + { + "key": "collection/2/coll/32", + "version": 136, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/33", - 137, - { + }, + { + "key": "collection/2/coll/33", + "version": 137, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/34", - 138, - { + }, + { + "key": "collection/2/coll/34", + "version": 138, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/35", - 139, - { + }, + { + "key": "collection/2/coll/35", + "version": 139, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/36", - 140, - { + }, + { + "key": "collection/2/coll/36", + "version": 140, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/37", - 141, - { + }, + { + "key": "collection/2/coll/37", + "version": 141, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/38", - 142, - { + }, + { + "key": "collection/2/coll/38", + "version": 142, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/39", - 143, - { + }, + { + "key": "collection/2/coll/39", + "version": 143, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/40", - 144, - { + }, + { + "key": "collection/2/coll/40", + "version": 144, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/41", - 145, - { + }, + { + "key": "collection/2/coll/41", + "version": 145, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/42", - 146, - { + }, + { + "key": "collection/2/coll/42", + "version": 146, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/43", - 147, - { + }, + { + "key": "collection/2/coll/43", + "version": 147, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/44", - 148, - { + }, + { + "key": "collection/2/coll/44", + "version": 148, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/45", - 149, - { + }, + { + "key": "collection/2/coll/45", + "version": 149, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/46", - 150, - { + }, + { + "key": "collection/2/coll/46", + "version": 150, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/47", - 151, - { + }, + { + "key": "collection/2/coll/47", + "version": 151, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/48", - 152, - { + }, + { + "key": "collection/2/coll/48", + "version": 152, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/49", - 153, - { + }, + { + "key": "collection/2/coll/49", + "version": 153, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/50", - 154, - { + }, + { + "key": "collection/2/coll/50", + "version": 154, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/51", - 155, - { + }, + { + "key": "collection/2/coll/51", + "version": 155, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/52", - 156, - { + }, + { + "key": "collection/2/coll/52", + "version": 156, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/53", - 157, - { + }, + { + "key": "collection/2/coll/53", + "version": 157, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/54", - 158, - { + }, + { + "key": "collection/2/coll/54", + "version": 158, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/55", - 159, - { + }, + { + "key": "collection/2/coll/55", + "version": 159, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/56", - 160, - { + }, + { + "key": "collection/2/coll/56", + "version": 160, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/57", - 161, - { + }, + { + "key": "collection/2/coll/57", + "version": 161, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/58", - 162, - { + }, + { + "key": "collection/2/coll/58", + "version": 162, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/59", - 163, - { + }, + { + "key": "collection/2/coll/59", + "version": 163, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/60", - 164, - { + }, + { + "key": "collection/2/coll/60", + "version": 164, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/61", - 165, - { + }, + { + "key": "collection/2/coll/61", + "version": 165, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/62", - 166, - { + }, + { + "key": "collection/2/coll/62", + "version": 166, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/63", - 167, - { + }, + { + "key": "collection/2/coll/63", + "version": 167, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/64", - 168, - { + }, + { + "key": "collection/2/coll/64", + "version": 168, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/65", - 169, - { + }, + { + "key": "collection/2/coll/65", + "version": 169, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/66", - 170, - { + }, + { + "key": "collection/2/coll/66", + "version": 170, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/67", - 171, - { + }, + { + "key": "collection/2/coll/67", + "version": 171, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/68", - 172, - { + }, + { + "key": "collection/2/coll/68", + "version": 172, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/69", - 173, - { + }, + { + "key": "collection/2/coll/69", + "version": 173, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/70", - 174, - { + }, + { + "key": "collection/2/coll/70", + "version": 174, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/71", - 175, - { + }, + { + "key": "collection/2/coll/71", + "version": 175, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/72", - 176, - { + }, + { + "key": "collection/2/coll/72", + "version": 176, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/73", - 177, - { + }, + { + "key": "collection/2/coll/73", + "version": 177, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/74", - 178, - { + }, + { + "key": "collection/2/coll/74", + "version": 178, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/75", - 179, - { + }, + { + "key": "collection/2/coll/75", + "version": 179, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/76", - 180, - { + }, + { + "key": "collection/2/coll/76", + "version": 180, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/77", - 181, - { + }, + { + "key": "collection/2/coll/77", + "version": 181, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/78", - 182, - { + }, + { + "key": "collection/2/coll/78", + "version": 182, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/79", - 183, - { + }, + { + "key": "collection/2/coll/79", + "version": 183, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/80", - 184, - { + }, + { + "key": "collection/2/coll/80", + "version": 184, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/81", - 185, - { + }, + { + "key": "collection/2/coll/81", + "version": 185, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/82", - 186, - { + }, + { + "key": "collection/2/coll/82", + "version": 186, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/83", - 187, - { + }, + { + "key": "collection/2/coll/83", + "version": 187, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/84", - 188, - { + }, + { + "key": "collection/2/coll/84", + "version": 188, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/85", - 189, - { + }, + { + "key": "collection/2/coll/85", + "version": 189, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/86", - 190, - { + }, + { + "key": "collection/2/coll/86", + "version": 190, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/87", - 191, - { + }, + { + "key": "collection/2/coll/87", + "version": 191, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/88", - 192, - { + }, + { + "key": "collection/2/coll/88", + "version": 192, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/89", - 193, - { + }, + { + "key": "collection/2/coll/89", + "version": 193, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/90", - 194, - { + }, + { + "key": "collection/2/coll/90", + "version": 194, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/91", - 195, - { + }, + { + "key": "collection/2/coll/91", + "version": 195, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/92", - 196, - { + }, + { + "key": "collection/2/coll/92", + "version": 196, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/93", - 197, - { + }, + { + "key": "collection/2/coll/93", + "version": 197, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/94", - 198, - { + }, + { + "key": "collection/2/coll/94", + "version": 198, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/95", - 199, - { + }, + { + "key": "collection/2/coll/95", + "version": 199, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/96", - 200, - { + }, + { + "key": "collection/2/coll/96", + "version": 200, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/97", - 201, - { + }, + { + "key": "collection/2/coll/97", + "version": 201, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/98", - 202, - { + }, + { + "key": "collection/2/coll/98", + "version": 202, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/99", - 203, - { + }, + { + "key": "collection/2/coll/99", + "version": 203, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -30650,706 +43916,1106 @@ ] }, "added": [ - [ - "collection/2/coll/0", - 104, - { + { + "key": "collection/2/coll/0", + "version": 104, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/1", - 105, - { + }, + { + "key": "collection/2/coll/1", + "version": 105, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/2", - 106, - { + }, + { + "key": "collection/2/coll/2", + "version": 106, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/3", - 107, - { + }, + { + "key": "collection/2/coll/3", + "version": 107, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/4", - 108, - { + }, + { + "key": "collection/2/coll/4", + "version": 108, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/5", - 109, - { + }, + { + "key": "collection/2/coll/5", + "version": 109, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/6", - 110, - { + }, + { + "key": "collection/2/coll/6", + "version": 110, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/7", - 111, - { + }, + { + "key": "collection/2/coll/7", + "version": 111, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/8", - 112, - { + }, + { + "key": "collection/2/coll/8", + "version": 112, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/9", - 113, - { + }, + { + "key": "collection/2/coll/9", + "version": 113, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/10", - 114, - { + }, + { + "key": "collection/2/coll/10", + "version": 114, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/11", - 115, - { + }, + { + "key": "collection/2/coll/11", + "version": 115, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/12", - 116, - { + }, + { + "key": "collection/2/coll/12", + "version": 116, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/13", - 117, - { + }, + { + "key": "collection/2/coll/13", + "version": 117, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/14", - 118, - { + }, + { + "key": "collection/2/coll/14", + "version": 118, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/15", - 119, - { + }, + { + "key": "collection/2/coll/15", + "version": 119, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/16", - 120, - { + }, + { + "key": "collection/2/coll/16", + "version": 120, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/17", - 121, - { + }, + { + "key": "collection/2/coll/17", + "version": 121, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/18", - 122, - { + }, + { + "key": "collection/2/coll/18", + "version": 122, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/19", - 123, - { + }, + { + "key": "collection/2/coll/19", + "version": 123, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/20", - 124, - { + }, + { + "key": "collection/2/coll/20", + "version": 124, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/21", - 125, - { + }, + { + "key": "collection/2/coll/21", + "version": 125, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/22", - 126, - { + }, + { + "key": "collection/2/coll/22", + "version": 126, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/23", - 127, - { + }, + { + "key": "collection/2/coll/23", + "version": 127, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/24", - 128, - { + }, + { + "key": "collection/2/coll/24", + "version": 128, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/25", - 129, - { + }, + { + "key": "collection/2/coll/25", + "version": 129, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/26", - 130, - { + }, + { + "key": "collection/2/coll/26", + "version": 130, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/27", - 131, - { + }, + { + "key": "collection/2/coll/27", + "version": 131, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/28", - 132, - { + }, + { + "key": "collection/2/coll/28", + "version": 132, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/29", - 133, - { + }, + { + "key": "collection/2/coll/29", + "version": 133, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/30", - 134, - { + }, + { + "key": "collection/2/coll/30", + "version": 134, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/31", - 135, - { + }, + { + "key": "collection/2/coll/31", + "version": 135, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/32", - 136, - { + }, + { + "key": "collection/2/coll/32", + "version": 136, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/33", - 137, - { + }, + { + "key": "collection/2/coll/33", + "version": 137, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/34", - 138, - { + }, + { + "key": "collection/2/coll/34", + "version": 138, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/35", - 139, - { + }, + { + "key": "collection/2/coll/35", + "version": 139, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/36", - 140, - { + }, + { + "key": "collection/2/coll/36", + "version": 140, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/37", - 141, - { + }, + { + "key": "collection/2/coll/37", + "version": 141, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/38", - 142, - { + }, + { + "key": "collection/2/coll/38", + "version": 142, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/39", - 143, - { + }, + { + "key": "collection/2/coll/39", + "version": 143, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/40", - 144, - { + }, + { + "key": "collection/2/coll/40", + "version": 144, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/41", - 145, - { + }, + { + "key": "collection/2/coll/41", + "version": 145, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/42", - 146, - { + }, + { + "key": "collection/2/coll/42", + "version": 146, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/43", - 147, - { + }, + { + "key": "collection/2/coll/43", + "version": 147, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/44", - 148, - { + }, + { + "key": "collection/2/coll/44", + "version": 148, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/45", - 149, - { + }, + { + "key": "collection/2/coll/45", + "version": 149, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/46", - 150, - { + }, + { + "key": "collection/2/coll/46", + "version": 150, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/47", - 151, - { + }, + { + "key": "collection/2/coll/47", + "version": 151, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/48", - 152, - { + }, + { + "key": "collection/2/coll/48", + "version": 152, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/49", - 153, - { + }, + { + "key": "collection/2/coll/49", + "version": 153, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/50", - 154, - { + }, + { + "key": "collection/2/coll/50", + "version": 154, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/51", - 155, - { + }, + { + "key": "collection/2/coll/51", + "version": 155, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/52", - 156, - { + }, + { + "key": "collection/2/coll/52", + "version": 156, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/53", - 157, - { + }, + { + "key": "collection/2/coll/53", + "version": 157, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/54", - 158, - { + }, + { + "key": "collection/2/coll/54", + "version": 158, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/55", - 159, - { + }, + { + "key": "collection/2/coll/55", + "version": 159, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/56", - 160, - { + }, + { + "key": "collection/2/coll/56", + "version": 160, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/57", - 161, - { + }, + { + "key": "collection/2/coll/57", + "version": 161, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/58", - 162, - { + }, + { + "key": "collection/2/coll/58", + "version": 162, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/59", - 163, - { + }, + { + "key": "collection/2/coll/59", + "version": 163, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/60", - 164, - { + }, + { + "key": "collection/2/coll/60", + "version": 164, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/61", - 165, - { + }, + { + "key": "collection/2/coll/61", + "version": 165, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/62", - 166, - { + }, + { + "key": "collection/2/coll/62", + "version": 166, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/63", - 167, - { + }, + { + "key": "collection/2/coll/63", + "version": 167, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/64", - 168, - { + }, + { + "key": "collection/2/coll/64", + "version": 168, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/65", - 169, - { + }, + { + "key": "collection/2/coll/65", + "version": 169, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/66", - 170, - { + }, + { + "key": "collection/2/coll/66", + "version": 170, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/67", - 171, - { + }, + { + "key": "collection/2/coll/67", + "version": 171, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/68", - 172, - { + }, + { + "key": "collection/2/coll/68", + "version": 172, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/69", - 173, - { + }, + { + "key": "collection/2/coll/69", + "version": 173, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/70", - 174, - { + }, + { + "key": "collection/2/coll/70", + "version": 174, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/71", - 175, - { + }, + { + "key": "collection/2/coll/71", + "version": 175, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/72", - 176, - { + }, + { + "key": "collection/2/coll/72", + "version": 176, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/73", - 177, - { + }, + { + "key": "collection/2/coll/73", + "version": 177, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/74", - 178, - { + }, + { + "key": "collection/2/coll/74", + "version": 178, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/75", - 179, - { + }, + { + "key": "collection/2/coll/75", + "version": 179, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/76", - 180, - { + }, + { + "key": "collection/2/coll/76", + "version": 180, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/77", - 181, - { + }, + { + "key": "collection/2/coll/77", + "version": 181, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/78", - 182, - { + }, + { + "key": "collection/2/coll/78", + "version": 182, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/79", - 183, - { + }, + { + "key": "collection/2/coll/79", + "version": 183, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/80", - 184, - { + }, + { + "key": "collection/2/coll/80", + "version": 184, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/81", - 185, - { + }, + { + "key": "collection/2/coll/81", + "version": 185, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/82", - 186, - { + }, + { + "key": "collection/2/coll/82", + "version": 186, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/83", - 187, - { + }, + { + "key": "collection/2/coll/83", + "version": 187, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/84", - 188, - { + }, + { + "key": "collection/2/coll/84", + "version": 188, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/85", - 189, - { + }, + { + "key": "collection/2/coll/85", + "version": 189, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/86", - 190, - { + }, + { + "key": "collection/2/coll/86", + "version": 190, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/87", - 191, - { + }, + { + "key": "collection/2/coll/87", + "version": 191, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/88", - 192, - { + }, + { + "key": "collection/2/coll/88", + "version": 192, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/89", - 193, - { + }, + { + "key": "collection/2/coll/89", + "version": 193, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/90", - 194, - { + }, + { + "key": "collection/2/coll/90", + "version": 194, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/91", - 195, - { + }, + { + "key": "collection/2/coll/91", + "version": 195, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/92", - 196, - { + }, + { + "key": "collection/2/coll/92", + "version": 196, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/93", - 197, - { + }, + { + "key": "collection/2/coll/93", + "version": 197, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/94", - 198, - { + }, + { + "key": "collection/2/coll/94", + "version": 198, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/95", - 199, - { + }, + { + "key": "collection/2/coll/95", + "version": 199, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/96", - 200, - { + }, + { + "key": "collection/2/coll/96", + "version": 200, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/97", - 201, - { + }, + { + "key": "collection/2/coll/97", + "version": 201, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/98", - 202, - { + }, + { + "key": "collection/2/coll/98", + "version": 202, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/2/coll/99", - 203, - { + }, + { + "key": "collection/2/coll/99", + "version": 203, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -31380,7 +45046,8 @@ }, { "watchSnapshot": { - "version": 205 + "version": 205, + "targetIds": [] }, "expect": [ { @@ -31465,706 +45132,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/3/coll/0", - 206, - { + { + "key": "collection/3/coll/0", + "version": 206, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/1", - 207, - { + }, + { + "key": "collection/3/coll/1", + "version": 207, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/2", - 208, - { + }, + { + "key": "collection/3/coll/2", + "version": 208, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/3", - 209, - { + }, + { + "key": "collection/3/coll/3", + "version": 209, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/4", - 210, - { + }, + { + "key": "collection/3/coll/4", + "version": 210, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/5", - 211, - { + }, + { + "key": "collection/3/coll/5", + "version": 211, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/6", - 212, - { + }, + { + "key": "collection/3/coll/6", + "version": 212, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/7", - 213, - { + }, + { + "key": "collection/3/coll/7", + "version": 213, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/8", - 214, - { + }, + { + "key": "collection/3/coll/8", + "version": 214, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/9", - 215, - { + }, + { + "key": "collection/3/coll/9", + "version": 215, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/10", - 216, - { + }, + { + "key": "collection/3/coll/10", + "version": 216, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/11", - 217, - { + }, + { + "key": "collection/3/coll/11", + "version": 217, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/12", - 218, - { + }, + { + "key": "collection/3/coll/12", + "version": 218, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/13", - 219, - { + }, + { + "key": "collection/3/coll/13", + "version": 219, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/14", - 220, - { + }, + { + "key": "collection/3/coll/14", + "version": 220, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/15", - 221, - { + }, + { + "key": "collection/3/coll/15", + "version": 221, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/16", - 222, - { + }, + { + "key": "collection/3/coll/16", + "version": 222, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/17", - 223, - { + }, + { + "key": "collection/3/coll/17", + "version": 223, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/18", - 224, - { + }, + { + "key": "collection/3/coll/18", + "version": 224, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/19", - 225, - { + }, + { + "key": "collection/3/coll/19", + "version": 225, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/20", - 226, - { + }, + { + "key": "collection/3/coll/20", + "version": 226, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/21", - 227, - { + }, + { + "key": "collection/3/coll/21", + "version": 227, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/22", - 228, - { + }, + { + "key": "collection/3/coll/22", + "version": 228, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/23", - 229, - { + }, + { + "key": "collection/3/coll/23", + "version": 229, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/24", - 230, - { + }, + { + "key": "collection/3/coll/24", + "version": 230, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/25", - 231, - { + }, + { + "key": "collection/3/coll/25", + "version": 231, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/26", - 232, - { + }, + { + "key": "collection/3/coll/26", + "version": 232, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/27", - 233, - { + }, + { + "key": "collection/3/coll/27", + "version": 233, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/28", - 234, - { + }, + { + "key": "collection/3/coll/28", + "version": 234, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/29", - 235, - { + }, + { + "key": "collection/3/coll/29", + "version": 235, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/30", - 236, - { + }, + { + "key": "collection/3/coll/30", + "version": 236, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/31", - 237, - { + }, + { + "key": "collection/3/coll/31", + "version": 237, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/32", - 238, - { + }, + { + "key": "collection/3/coll/32", + "version": 238, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/33", - 239, - { + }, + { + "key": "collection/3/coll/33", + "version": 239, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/34", - 240, - { + }, + { + "key": "collection/3/coll/34", + "version": 240, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/35", - 241, - { + }, + { + "key": "collection/3/coll/35", + "version": 241, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/36", - 242, - { + }, + { + "key": "collection/3/coll/36", + "version": 242, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/37", - 243, - { + }, + { + "key": "collection/3/coll/37", + "version": 243, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/38", - 244, - { + }, + { + "key": "collection/3/coll/38", + "version": 244, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/39", - 245, - { + }, + { + "key": "collection/3/coll/39", + "version": 245, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/40", - 246, - { + }, + { + "key": "collection/3/coll/40", + "version": 246, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/41", - 247, - { + }, + { + "key": "collection/3/coll/41", + "version": 247, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/42", - 248, - { + }, + { + "key": "collection/3/coll/42", + "version": 248, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/43", - 249, - { + }, + { + "key": "collection/3/coll/43", + "version": 249, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/44", - 250, - { + }, + { + "key": "collection/3/coll/44", + "version": 250, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/45", - 251, - { + }, + { + "key": "collection/3/coll/45", + "version": 251, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/46", - 252, - { + }, + { + "key": "collection/3/coll/46", + "version": 252, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/47", - 253, - { + }, + { + "key": "collection/3/coll/47", + "version": 253, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/48", - 254, - { + }, + { + "key": "collection/3/coll/48", + "version": 254, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/49", - 255, - { + }, + { + "key": "collection/3/coll/49", + "version": 255, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/50", - 256, - { + }, + { + "key": "collection/3/coll/50", + "version": 256, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/51", - 257, - { + }, + { + "key": "collection/3/coll/51", + "version": 257, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/52", - 258, - { + }, + { + "key": "collection/3/coll/52", + "version": 258, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/53", - 259, - { + }, + { + "key": "collection/3/coll/53", + "version": 259, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/54", - 260, - { + }, + { + "key": "collection/3/coll/54", + "version": 260, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/55", - 261, - { + }, + { + "key": "collection/3/coll/55", + "version": 261, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/56", - 262, - { + }, + { + "key": "collection/3/coll/56", + "version": 262, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/57", - 263, - { + }, + { + "key": "collection/3/coll/57", + "version": 263, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/58", - 264, - { + }, + { + "key": "collection/3/coll/58", + "version": 264, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/59", - 265, - { + }, + { + "key": "collection/3/coll/59", + "version": 265, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/60", - 266, - { + }, + { + "key": "collection/3/coll/60", + "version": 266, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/61", - 267, - { + }, + { + "key": "collection/3/coll/61", + "version": 267, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/62", - 268, - { + }, + { + "key": "collection/3/coll/62", + "version": 268, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/63", - 269, - { + }, + { + "key": "collection/3/coll/63", + "version": 269, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/64", - 270, - { + }, + { + "key": "collection/3/coll/64", + "version": 270, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/65", - 271, - { + }, + { + "key": "collection/3/coll/65", + "version": 271, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/66", - 272, - { + }, + { + "key": "collection/3/coll/66", + "version": 272, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/67", - 273, - { + }, + { + "key": "collection/3/coll/67", + "version": 273, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/68", - 274, - { + }, + { + "key": "collection/3/coll/68", + "version": 274, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/69", - 275, - { + }, + { + "key": "collection/3/coll/69", + "version": 275, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/70", - 276, - { + }, + { + "key": "collection/3/coll/70", + "version": 276, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/71", - 277, - { + }, + { + "key": "collection/3/coll/71", + "version": 277, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/72", - 278, - { + }, + { + "key": "collection/3/coll/72", + "version": 278, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/73", - 279, - { + }, + { + "key": "collection/3/coll/73", + "version": 279, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/74", - 280, - { + }, + { + "key": "collection/3/coll/74", + "version": 280, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/75", - 281, - { + }, + { + "key": "collection/3/coll/75", + "version": 281, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/76", - 282, - { + }, + { + "key": "collection/3/coll/76", + "version": 282, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/77", - 283, - { + }, + { + "key": "collection/3/coll/77", + "version": 283, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/78", - 284, - { + }, + { + "key": "collection/3/coll/78", + "version": 284, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/79", - 285, - { + }, + { + "key": "collection/3/coll/79", + "version": 285, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/80", - 286, - { + }, + { + "key": "collection/3/coll/80", + "version": 286, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/81", - 287, - { + }, + { + "key": "collection/3/coll/81", + "version": 287, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/82", - 288, - { + }, + { + "key": "collection/3/coll/82", + "version": 288, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/83", - 289, - { + }, + { + "key": "collection/3/coll/83", + "version": 289, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/84", - 290, - { + }, + { + "key": "collection/3/coll/84", + "version": 290, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/85", - 291, - { + }, + { + "key": "collection/3/coll/85", + "version": 291, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/86", - 292, - { + }, + { + "key": "collection/3/coll/86", + "version": 292, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/87", - 293, - { + }, + { + "key": "collection/3/coll/87", + "version": 293, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/88", - 294, - { + }, + { + "key": "collection/3/coll/88", + "version": 294, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/89", - 295, - { + }, + { + "key": "collection/3/coll/89", + "version": 295, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/90", - 296, - { + }, + { + "key": "collection/3/coll/90", + "version": 296, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/91", - 297, - { + }, + { + "key": "collection/3/coll/91", + "version": 297, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/92", - 298, - { + }, + { + "key": "collection/3/coll/92", + "version": 298, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/93", - 299, - { + }, + { + "key": "collection/3/coll/93", + "version": 299, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/94", - 300, - { + }, + { + "key": "collection/3/coll/94", + "version": 300, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/95", - 301, - { + }, + { + "key": "collection/3/coll/95", + "version": 301, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/96", - 302, - { + }, + { + "key": "collection/3/coll/96", + "version": 302, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/97", - 303, - { + }, + { + "key": "collection/3/coll/97", + "version": 303, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/98", - 304, - { + }, + { + "key": "collection/3/coll/98", + "version": 304, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/99", - 305, - { + }, + { + "key": "collection/3/coll/99", + "version": 305, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 6 @@ -32181,7 +46248,8 @@ }, { "watchSnapshot": { - "version": 306 + "version": 306, + "targetIds": [] }, "expect": [ { @@ -32196,706 +46264,1106 @@ ] }, "added": [ - [ - "collection/3/coll/0", - 206, - { + { + "key": "collection/3/coll/0", + "version": 206, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/1", - 207, - { + }, + { + "key": "collection/3/coll/1", + "version": 207, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/2", - 208, - { + }, + { + "key": "collection/3/coll/2", + "version": 208, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/3", - 209, - { + }, + { + "key": "collection/3/coll/3", + "version": 209, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/4", - 210, - { + }, + { + "key": "collection/3/coll/4", + "version": 210, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/5", - 211, - { + }, + { + "key": "collection/3/coll/5", + "version": 211, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/6", - 212, - { + }, + { + "key": "collection/3/coll/6", + "version": 212, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/7", - 213, - { + }, + { + "key": "collection/3/coll/7", + "version": 213, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/8", - 214, - { + }, + { + "key": "collection/3/coll/8", + "version": 214, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/9", - 215, - { + }, + { + "key": "collection/3/coll/9", + "version": 215, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/10", - 216, - { + }, + { + "key": "collection/3/coll/10", + "version": 216, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/11", - 217, - { + }, + { + "key": "collection/3/coll/11", + "version": 217, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/12", - 218, - { + }, + { + "key": "collection/3/coll/12", + "version": 218, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/13", - 219, - { + }, + { + "key": "collection/3/coll/13", + "version": 219, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/14", - 220, - { + }, + { + "key": "collection/3/coll/14", + "version": 220, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/15", - 221, - { + }, + { + "key": "collection/3/coll/15", + "version": 221, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/16", - 222, - { + }, + { + "key": "collection/3/coll/16", + "version": 222, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/17", - 223, - { + }, + { + "key": "collection/3/coll/17", + "version": 223, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/18", - 224, - { + }, + { + "key": "collection/3/coll/18", + "version": 224, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/19", - 225, - { + }, + { + "key": "collection/3/coll/19", + "version": 225, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/20", - 226, - { + }, + { + "key": "collection/3/coll/20", + "version": 226, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/21", - 227, - { + }, + { + "key": "collection/3/coll/21", + "version": 227, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/22", - 228, - { + }, + { + "key": "collection/3/coll/22", + "version": 228, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/23", - 229, - { + }, + { + "key": "collection/3/coll/23", + "version": 229, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/24", - 230, - { + }, + { + "key": "collection/3/coll/24", + "version": 230, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/25", - 231, - { + }, + { + "key": "collection/3/coll/25", + "version": 231, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/26", - 232, - { + }, + { + "key": "collection/3/coll/26", + "version": 232, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/27", - 233, - { + }, + { + "key": "collection/3/coll/27", + "version": 233, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/28", - 234, - { + }, + { + "key": "collection/3/coll/28", + "version": 234, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/29", - 235, - { + }, + { + "key": "collection/3/coll/29", + "version": 235, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/30", - 236, - { + }, + { + "key": "collection/3/coll/30", + "version": 236, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/31", - 237, - { + }, + { + "key": "collection/3/coll/31", + "version": 237, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/32", - 238, - { + }, + { + "key": "collection/3/coll/32", + "version": 238, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/33", - 239, - { + }, + { + "key": "collection/3/coll/33", + "version": 239, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/34", - 240, - { + }, + { + "key": "collection/3/coll/34", + "version": 240, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/35", - 241, - { + }, + { + "key": "collection/3/coll/35", + "version": 241, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/36", - 242, - { + }, + { + "key": "collection/3/coll/36", + "version": 242, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/37", - 243, - { + }, + { + "key": "collection/3/coll/37", + "version": 243, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/38", - 244, - { + }, + { + "key": "collection/3/coll/38", + "version": 244, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/39", - 245, - { + }, + { + "key": "collection/3/coll/39", + "version": 245, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/40", - 246, - { + }, + { + "key": "collection/3/coll/40", + "version": 246, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/41", - 247, - { + }, + { + "key": "collection/3/coll/41", + "version": 247, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/42", - 248, - { + }, + { + "key": "collection/3/coll/42", + "version": 248, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/43", - 249, - { + }, + { + "key": "collection/3/coll/43", + "version": 249, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/44", - 250, - { + }, + { + "key": "collection/3/coll/44", + "version": 250, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/45", - 251, - { + }, + { + "key": "collection/3/coll/45", + "version": 251, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/46", - 252, - { + }, + { + "key": "collection/3/coll/46", + "version": 252, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/47", - 253, - { + }, + { + "key": "collection/3/coll/47", + "version": 253, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/48", - 254, - { + }, + { + "key": "collection/3/coll/48", + "version": 254, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/49", - 255, - { + }, + { + "key": "collection/3/coll/49", + "version": 255, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/50", - 256, - { + }, + { + "key": "collection/3/coll/50", + "version": 256, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/51", - 257, - { + }, + { + "key": "collection/3/coll/51", + "version": 257, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/52", - 258, - { + }, + { + "key": "collection/3/coll/52", + "version": 258, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/53", - 259, - { + }, + { + "key": "collection/3/coll/53", + "version": 259, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/54", - 260, - { + }, + { + "key": "collection/3/coll/54", + "version": 260, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/55", - 261, - { + }, + { + "key": "collection/3/coll/55", + "version": 261, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/56", - 262, - { + }, + { + "key": "collection/3/coll/56", + "version": 262, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/57", - 263, - { + }, + { + "key": "collection/3/coll/57", + "version": 263, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/58", - 264, - { + }, + { + "key": "collection/3/coll/58", + "version": 264, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/59", - 265, - { + }, + { + "key": "collection/3/coll/59", + "version": 265, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/60", - 266, - { + }, + { + "key": "collection/3/coll/60", + "version": 266, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/61", - 267, - { + }, + { + "key": "collection/3/coll/61", + "version": 267, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/62", - 268, - { + }, + { + "key": "collection/3/coll/62", + "version": 268, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/63", - 269, - { + }, + { + "key": "collection/3/coll/63", + "version": 269, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/64", - 270, - { + }, + { + "key": "collection/3/coll/64", + "version": 270, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/65", - 271, - { + }, + { + "key": "collection/3/coll/65", + "version": 271, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/66", - 272, - { + }, + { + "key": "collection/3/coll/66", + "version": 272, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/67", - 273, - { + }, + { + "key": "collection/3/coll/67", + "version": 273, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/68", - 274, - { + }, + { + "key": "collection/3/coll/68", + "version": 274, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/69", - 275, - { + }, + { + "key": "collection/3/coll/69", + "version": 275, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/70", - 276, - { + }, + { + "key": "collection/3/coll/70", + "version": 276, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/71", - 277, - { + }, + { + "key": "collection/3/coll/71", + "version": 277, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/72", - 278, - { + }, + { + "key": "collection/3/coll/72", + "version": 278, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/73", - 279, - { + }, + { + "key": "collection/3/coll/73", + "version": 279, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/74", - 280, - { + }, + { + "key": "collection/3/coll/74", + "version": 280, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/75", - 281, - { + }, + { + "key": "collection/3/coll/75", + "version": 281, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/76", - 282, - { + }, + { + "key": "collection/3/coll/76", + "version": 282, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/77", - 283, - { + }, + { + "key": "collection/3/coll/77", + "version": 283, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/78", - 284, - { + }, + { + "key": "collection/3/coll/78", + "version": 284, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/79", - 285, - { + }, + { + "key": "collection/3/coll/79", + "version": 285, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/80", - 286, - { + }, + { + "key": "collection/3/coll/80", + "version": 286, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/81", - 287, - { + }, + { + "key": "collection/3/coll/81", + "version": 287, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/82", - 288, - { + }, + { + "key": "collection/3/coll/82", + "version": 288, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/83", - 289, - { + }, + { + "key": "collection/3/coll/83", + "version": 289, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/84", - 290, - { + }, + { + "key": "collection/3/coll/84", + "version": 290, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/85", - 291, - { + }, + { + "key": "collection/3/coll/85", + "version": 291, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/86", - 292, - { + }, + { + "key": "collection/3/coll/86", + "version": 292, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/87", - 293, - { + }, + { + "key": "collection/3/coll/87", + "version": 293, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/88", - 294, - { + }, + { + "key": "collection/3/coll/88", + "version": 294, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/89", - 295, - { + }, + { + "key": "collection/3/coll/89", + "version": 295, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/90", - 296, - { + }, + { + "key": "collection/3/coll/90", + "version": 296, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/91", - 297, - { + }, + { + "key": "collection/3/coll/91", + "version": 297, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/92", - 298, - { + }, + { + "key": "collection/3/coll/92", + "version": 298, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/93", - 299, - { + }, + { + "key": "collection/3/coll/93", + "version": 299, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/94", - 300, - { + }, + { + "key": "collection/3/coll/94", + "version": 300, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/95", - 301, - { + }, + { + "key": "collection/3/coll/95", + "version": 301, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/96", - 302, - { + }, + { + "key": "collection/3/coll/96", + "version": 302, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/97", - 303, - { + }, + { + "key": "collection/3/coll/97", + "version": 303, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/98", - 304, - { + }, + { + "key": "collection/3/coll/98", + "version": 304, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/99", - 305, - { + }, + { + "key": "collection/3/coll/99", + "version": 305, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -32972,706 +47440,1106 @@ ] }, "added": [ - [ - "collection/3/coll/0", - 206, - { + { + "key": "collection/3/coll/0", + "version": 206, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/1", - 207, - { + }, + { + "key": "collection/3/coll/1", + "version": 207, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/2", - 208, - { + }, + { + "key": "collection/3/coll/2", + "version": 208, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/3", - 209, - { + }, + { + "key": "collection/3/coll/3", + "version": 209, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/4", - 210, - { + }, + { + "key": "collection/3/coll/4", + "version": 210, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/5", - 211, - { + }, + { + "key": "collection/3/coll/5", + "version": 211, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/6", - 212, - { + }, + { + "key": "collection/3/coll/6", + "version": 212, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/7", - 213, - { + }, + { + "key": "collection/3/coll/7", + "version": 213, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/8", - 214, - { + }, + { + "key": "collection/3/coll/8", + "version": 214, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/9", - 215, - { + }, + { + "key": "collection/3/coll/9", + "version": 215, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/10", - 216, - { + }, + { + "key": "collection/3/coll/10", + "version": 216, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/11", - 217, - { + }, + { + "key": "collection/3/coll/11", + "version": 217, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/12", - 218, - { + }, + { + "key": "collection/3/coll/12", + "version": 218, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/13", - 219, - { + }, + { + "key": "collection/3/coll/13", + "version": 219, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/14", - 220, - { + }, + { + "key": "collection/3/coll/14", + "version": 220, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/15", - 221, - { + }, + { + "key": "collection/3/coll/15", + "version": 221, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/16", - 222, - { + }, + { + "key": "collection/3/coll/16", + "version": 222, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/17", - 223, - { + }, + { + "key": "collection/3/coll/17", + "version": 223, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/18", - 224, - { + }, + { + "key": "collection/3/coll/18", + "version": 224, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/19", - 225, - { + }, + { + "key": "collection/3/coll/19", + "version": 225, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/20", - 226, - { + }, + { + "key": "collection/3/coll/20", + "version": 226, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/21", - 227, - { + }, + { + "key": "collection/3/coll/21", + "version": 227, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/22", - 228, - { + }, + { + "key": "collection/3/coll/22", + "version": 228, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/23", - 229, - { + }, + { + "key": "collection/3/coll/23", + "version": 229, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/24", - 230, - { + }, + { + "key": "collection/3/coll/24", + "version": 230, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/25", - 231, - { + }, + { + "key": "collection/3/coll/25", + "version": 231, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/26", - 232, - { + }, + { + "key": "collection/3/coll/26", + "version": 232, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/27", - 233, - { + }, + { + "key": "collection/3/coll/27", + "version": 233, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/28", - 234, - { + }, + { + "key": "collection/3/coll/28", + "version": 234, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/29", - 235, - { + }, + { + "key": "collection/3/coll/29", + "version": 235, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/30", - 236, - { + }, + { + "key": "collection/3/coll/30", + "version": 236, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/31", - 237, - { + }, + { + "key": "collection/3/coll/31", + "version": 237, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/32", - 238, - { + }, + { + "key": "collection/3/coll/32", + "version": 238, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/33", - 239, - { + }, + { + "key": "collection/3/coll/33", + "version": 239, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/34", - 240, - { + }, + { + "key": "collection/3/coll/34", + "version": 240, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/35", - 241, - { + }, + { + "key": "collection/3/coll/35", + "version": 241, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/36", - 242, - { + }, + { + "key": "collection/3/coll/36", + "version": 242, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/37", - 243, - { + }, + { + "key": "collection/3/coll/37", + "version": 243, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/38", - 244, - { + }, + { + "key": "collection/3/coll/38", + "version": 244, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/39", - 245, - { + }, + { + "key": "collection/3/coll/39", + "version": 245, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/40", - 246, - { + }, + { + "key": "collection/3/coll/40", + "version": 246, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/41", - 247, - { + }, + { + "key": "collection/3/coll/41", + "version": 247, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/42", - 248, - { + }, + { + "key": "collection/3/coll/42", + "version": 248, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/43", - 249, - { + }, + { + "key": "collection/3/coll/43", + "version": 249, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/44", - 250, - { + }, + { + "key": "collection/3/coll/44", + "version": 250, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/45", - 251, - { + }, + { + "key": "collection/3/coll/45", + "version": 251, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/46", - 252, - { + }, + { + "key": "collection/3/coll/46", + "version": 252, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/47", - 253, - { + }, + { + "key": "collection/3/coll/47", + "version": 253, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/48", - 254, - { + }, + { + "key": "collection/3/coll/48", + "version": 254, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/49", - 255, - { + }, + { + "key": "collection/3/coll/49", + "version": 255, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/50", - 256, - { + }, + { + "key": "collection/3/coll/50", + "version": 256, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/51", - 257, - { + }, + { + "key": "collection/3/coll/51", + "version": 257, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/52", - 258, - { + }, + { + "key": "collection/3/coll/52", + "version": 258, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/53", - 259, - { + }, + { + "key": "collection/3/coll/53", + "version": 259, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/54", - 260, - { + }, + { + "key": "collection/3/coll/54", + "version": 260, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/55", - 261, - { + }, + { + "key": "collection/3/coll/55", + "version": 261, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/56", - 262, - { + }, + { + "key": "collection/3/coll/56", + "version": 262, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/57", - 263, - { + }, + { + "key": "collection/3/coll/57", + "version": 263, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/58", - 264, - { + }, + { + "key": "collection/3/coll/58", + "version": 264, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/59", - 265, - { + }, + { + "key": "collection/3/coll/59", + "version": 265, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/60", - 266, - { + }, + { + "key": "collection/3/coll/60", + "version": 266, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/61", - 267, - { + }, + { + "key": "collection/3/coll/61", + "version": 267, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/62", - 268, - { + }, + { + "key": "collection/3/coll/62", + "version": 268, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/63", - 269, - { + }, + { + "key": "collection/3/coll/63", + "version": 269, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/64", - 270, - { + }, + { + "key": "collection/3/coll/64", + "version": 270, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/65", - 271, - { + }, + { + "key": "collection/3/coll/65", + "version": 271, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/66", - 272, - { + }, + { + "key": "collection/3/coll/66", + "version": 272, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/67", - 273, - { + }, + { + "key": "collection/3/coll/67", + "version": 273, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/68", - 274, - { + }, + { + "key": "collection/3/coll/68", + "version": 274, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/69", - 275, - { + }, + { + "key": "collection/3/coll/69", + "version": 275, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/70", - 276, - { + }, + { + "key": "collection/3/coll/70", + "version": 276, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/71", - 277, - { + }, + { + "key": "collection/3/coll/71", + "version": 277, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/72", - 278, - { + }, + { + "key": "collection/3/coll/72", + "version": 278, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/73", - 279, - { + }, + { + "key": "collection/3/coll/73", + "version": 279, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/74", - 280, - { + }, + { + "key": "collection/3/coll/74", + "version": 280, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/75", - 281, - { + }, + { + "key": "collection/3/coll/75", + "version": 281, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/76", - 282, - { + }, + { + "key": "collection/3/coll/76", + "version": 282, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/77", - 283, - { + }, + { + "key": "collection/3/coll/77", + "version": 283, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/78", - 284, - { + }, + { + "key": "collection/3/coll/78", + "version": 284, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/79", - 285, - { + }, + { + "key": "collection/3/coll/79", + "version": 285, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/80", - 286, - { + }, + { + "key": "collection/3/coll/80", + "version": 286, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/81", - 287, - { + }, + { + "key": "collection/3/coll/81", + "version": 287, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/82", - 288, - { + }, + { + "key": "collection/3/coll/82", + "version": 288, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/83", - 289, - { + }, + { + "key": "collection/3/coll/83", + "version": 289, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/84", - 290, - { + }, + { + "key": "collection/3/coll/84", + "version": 290, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/85", - 291, - { + }, + { + "key": "collection/3/coll/85", + "version": 291, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/86", - 292, - { + }, + { + "key": "collection/3/coll/86", + "version": 292, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/87", - 293, - { + }, + { + "key": "collection/3/coll/87", + "version": 293, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/88", - 294, - { + }, + { + "key": "collection/3/coll/88", + "version": 294, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/89", - 295, - { + }, + { + "key": "collection/3/coll/89", + "version": 295, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/90", - 296, - { + }, + { + "key": "collection/3/coll/90", + "version": 296, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/91", - 297, - { + }, + { + "key": "collection/3/coll/91", + "version": 297, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/92", - 298, - { + }, + { + "key": "collection/3/coll/92", + "version": 298, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/93", - 299, - { + }, + { + "key": "collection/3/coll/93", + "version": 299, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/94", - 300, - { + }, + { + "key": "collection/3/coll/94", + "version": 300, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/95", - 301, - { + }, + { + "key": "collection/3/coll/95", + "version": 301, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/96", - 302, - { + }, + { + "key": "collection/3/coll/96", + "version": 302, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/97", - 303, - { + }, + { + "key": "collection/3/coll/97", + "version": 303, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/98", - 304, - { + }, + { + "key": "collection/3/coll/98", + "version": 304, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/3/coll/99", - 305, - { + }, + { + "key": "collection/3/coll/99", + "version": 305, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -33702,7 +48570,8 @@ }, { "watchSnapshot": { - "version": 307 + "version": 307, + "targetIds": [] }, "expect": [ { @@ -33787,706 +48656,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/4/coll/0", - 308, - { + { + "key": "collection/4/coll/0", + "version": 308, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/1", - 309, - { + }, + { + "key": "collection/4/coll/1", + "version": 309, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/2", - 310, - { + }, + { + "key": "collection/4/coll/2", + "version": 310, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/3", - 311, - { + }, + { + "key": "collection/4/coll/3", + "version": 311, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/4", - 312, - { + }, + { + "key": "collection/4/coll/4", + "version": 312, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/5", - 313, - { + }, + { + "key": "collection/4/coll/5", + "version": 313, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/6", - 314, - { + }, + { + "key": "collection/4/coll/6", + "version": 314, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/7", - 315, - { + }, + { + "key": "collection/4/coll/7", + "version": 315, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/8", - 316, - { + }, + { + "key": "collection/4/coll/8", + "version": 316, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/9", - 317, - { + }, + { + "key": "collection/4/coll/9", + "version": 317, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/10", - 318, - { + }, + { + "key": "collection/4/coll/10", + "version": 318, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/11", - 319, - { + }, + { + "key": "collection/4/coll/11", + "version": 319, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/12", - 320, - { + }, + { + "key": "collection/4/coll/12", + "version": 320, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/13", - 321, - { + }, + { + "key": "collection/4/coll/13", + "version": 321, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/14", - 322, - { + }, + { + "key": "collection/4/coll/14", + "version": 322, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/15", - 323, - { + }, + { + "key": "collection/4/coll/15", + "version": 323, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/16", - 324, - { + }, + { + "key": "collection/4/coll/16", + "version": 324, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/17", - 325, - { + }, + { + "key": "collection/4/coll/17", + "version": 325, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/18", - 326, - { + }, + { + "key": "collection/4/coll/18", + "version": 326, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/19", - 327, - { + }, + { + "key": "collection/4/coll/19", + "version": 327, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/20", - 328, - { + }, + { + "key": "collection/4/coll/20", + "version": 328, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/21", - 329, - { + }, + { + "key": "collection/4/coll/21", + "version": 329, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/22", - 330, - { + }, + { + "key": "collection/4/coll/22", + "version": 330, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/23", - 331, - { + }, + { + "key": "collection/4/coll/23", + "version": 331, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/24", - 332, - { + }, + { + "key": "collection/4/coll/24", + "version": 332, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/25", - 333, - { + }, + { + "key": "collection/4/coll/25", + "version": 333, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/26", - 334, - { + }, + { + "key": "collection/4/coll/26", + "version": 334, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/27", - 335, - { + }, + { + "key": "collection/4/coll/27", + "version": 335, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/28", - 336, - { + }, + { + "key": "collection/4/coll/28", + "version": 336, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/29", - 337, - { + }, + { + "key": "collection/4/coll/29", + "version": 337, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/30", - 338, - { + }, + { + "key": "collection/4/coll/30", + "version": 338, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/31", - 339, - { + }, + { + "key": "collection/4/coll/31", + "version": 339, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/32", - 340, - { + }, + { + "key": "collection/4/coll/32", + "version": 340, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/33", - 341, - { + }, + { + "key": "collection/4/coll/33", + "version": 341, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/34", - 342, - { + }, + { + "key": "collection/4/coll/34", + "version": 342, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/35", - 343, - { + }, + { + "key": "collection/4/coll/35", + "version": 343, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/36", - 344, - { + }, + { + "key": "collection/4/coll/36", + "version": 344, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/37", - 345, - { + }, + { + "key": "collection/4/coll/37", + "version": 345, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/38", - 346, - { + }, + { + "key": "collection/4/coll/38", + "version": 346, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/39", - 347, - { + }, + { + "key": "collection/4/coll/39", + "version": 347, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/40", - 348, - { + }, + { + "key": "collection/4/coll/40", + "version": 348, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/41", - 349, - { + }, + { + "key": "collection/4/coll/41", + "version": 349, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/42", - 350, - { + }, + { + "key": "collection/4/coll/42", + "version": 350, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/43", - 351, - { + }, + { + "key": "collection/4/coll/43", + "version": 351, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/44", - 352, - { + }, + { + "key": "collection/4/coll/44", + "version": 352, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/45", - 353, - { + }, + { + "key": "collection/4/coll/45", + "version": 353, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/46", - 354, - { + }, + { + "key": "collection/4/coll/46", + "version": 354, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/47", - 355, - { + }, + { + "key": "collection/4/coll/47", + "version": 355, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/48", - 356, - { + }, + { + "key": "collection/4/coll/48", + "version": 356, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/49", - 357, - { + }, + { + "key": "collection/4/coll/49", + "version": 357, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/50", - 358, - { + }, + { + "key": "collection/4/coll/50", + "version": 358, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/51", - 359, - { + }, + { + "key": "collection/4/coll/51", + "version": 359, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/52", - 360, - { + }, + { + "key": "collection/4/coll/52", + "version": 360, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/53", - 361, - { + }, + { + "key": "collection/4/coll/53", + "version": 361, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/54", - 362, - { + }, + { + "key": "collection/4/coll/54", + "version": 362, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/55", - 363, - { + }, + { + "key": "collection/4/coll/55", + "version": 363, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/56", - 364, - { + }, + { + "key": "collection/4/coll/56", + "version": 364, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/57", - 365, - { + }, + { + "key": "collection/4/coll/57", + "version": 365, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/58", - 366, - { + }, + { + "key": "collection/4/coll/58", + "version": 366, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/59", - 367, - { + }, + { + "key": "collection/4/coll/59", + "version": 367, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/60", - 368, - { + }, + { + "key": "collection/4/coll/60", + "version": 368, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/61", - 369, - { + }, + { + "key": "collection/4/coll/61", + "version": 369, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/62", - 370, - { + }, + { + "key": "collection/4/coll/62", + "version": 370, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/63", - 371, - { + }, + { + "key": "collection/4/coll/63", + "version": 371, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/64", - 372, - { + }, + { + "key": "collection/4/coll/64", + "version": 372, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/65", - 373, - { + }, + { + "key": "collection/4/coll/65", + "version": 373, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/66", - 374, - { + }, + { + "key": "collection/4/coll/66", + "version": 374, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/67", - 375, - { + }, + { + "key": "collection/4/coll/67", + "version": 375, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/68", - 376, - { + }, + { + "key": "collection/4/coll/68", + "version": 376, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/69", - 377, - { + }, + { + "key": "collection/4/coll/69", + "version": 377, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/70", - 378, - { + }, + { + "key": "collection/4/coll/70", + "version": 378, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/71", - 379, - { + }, + { + "key": "collection/4/coll/71", + "version": 379, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/72", - 380, - { + }, + { + "key": "collection/4/coll/72", + "version": 380, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/73", - 381, - { + }, + { + "key": "collection/4/coll/73", + "version": 381, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/74", - 382, - { + }, + { + "key": "collection/4/coll/74", + "version": 382, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/75", - 383, - { + }, + { + "key": "collection/4/coll/75", + "version": 383, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/76", - 384, - { + }, + { + "key": "collection/4/coll/76", + "version": 384, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/77", - 385, - { + }, + { + "key": "collection/4/coll/77", + "version": 385, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/78", - 386, - { + }, + { + "key": "collection/4/coll/78", + "version": 386, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/79", - 387, - { + }, + { + "key": "collection/4/coll/79", + "version": 387, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/80", - 388, - { + }, + { + "key": "collection/4/coll/80", + "version": 388, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/81", - 389, - { + }, + { + "key": "collection/4/coll/81", + "version": 389, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/82", - 390, - { + }, + { + "key": "collection/4/coll/82", + "version": 390, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/83", - 391, - { + }, + { + "key": "collection/4/coll/83", + "version": 391, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/84", - 392, - { + }, + { + "key": "collection/4/coll/84", + "version": 392, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/85", - 393, - { + }, + { + "key": "collection/4/coll/85", + "version": 393, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/86", - 394, - { + }, + { + "key": "collection/4/coll/86", + "version": 394, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/87", - 395, - { + }, + { + "key": "collection/4/coll/87", + "version": 395, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/88", - 396, - { + }, + { + "key": "collection/4/coll/88", + "version": 396, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/89", - 397, - { + }, + { + "key": "collection/4/coll/89", + "version": 397, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/90", - 398, - { + }, + { + "key": "collection/4/coll/90", + "version": 398, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/91", - 399, - { + }, + { + "key": "collection/4/coll/91", + "version": 399, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/92", - 400, - { + }, + { + "key": "collection/4/coll/92", + "version": 400, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/93", - 401, - { + }, + { + "key": "collection/4/coll/93", + "version": 401, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/94", - 402, - { + }, + { + "key": "collection/4/coll/94", + "version": 402, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/95", - 403, - { + }, + { + "key": "collection/4/coll/95", + "version": 403, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/96", - 404, - { + }, + { + "key": "collection/4/coll/96", + "version": 404, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/97", - 405, - { + }, + { + "key": "collection/4/coll/97", + "version": 405, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/98", - 406, - { + }, + { + "key": "collection/4/coll/98", + "version": 406, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/99", - 407, - { + }, + { + "key": "collection/4/coll/99", + "version": 407, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 8 @@ -34503,7 +49772,8 @@ }, { "watchSnapshot": { - "version": 408 + "version": 408, + "targetIds": [] }, "expect": [ { @@ -34518,706 +49788,1106 @@ ] }, "added": [ - [ - "collection/4/coll/0", - 308, - { + { + "key": "collection/4/coll/0", + "version": 308, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/1", - 309, - { + }, + { + "key": "collection/4/coll/1", + "version": 309, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/2", - 310, - { + }, + { + "key": "collection/4/coll/2", + "version": 310, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/3", - 311, - { + }, + { + "key": "collection/4/coll/3", + "version": 311, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/4", - 312, - { + }, + { + "key": "collection/4/coll/4", + "version": 312, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/5", - 313, - { + }, + { + "key": "collection/4/coll/5", + "version": 313, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/6", - 314, - { + }, + { + "key": "collection/4/coll/6", + "version": 314, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/7", - 315, - { + }, + { + "key": "collection/4/coll/7", + "version": 315, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/8", - 316, - { + }, + { + "key": "collection/4/coll/8", + "version": 316, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/9", - 317, - { + }, + { + "key": "collection/4/coll/9", + "version": 317, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/10", - 318, - { + }, + { + "key": "collection/4/coll/10", + "version": 318, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/11", - 319, - { + }, + { + "key": "collection/4/coll/11", + "version": 319, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/12", - 320, - { + }, + { + "key": "collection/4/coll/12", + "version": 320, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/13", - 321, - { + }, + { + "key": "collection/4/coll/13", + "version": 321, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/14", - 322, - { + }, + { + "key": "collection/4/coll/14", + "version": 322, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/15", - 323, - { + }, + { + "key": "collection/4/coll/15", + "version": 323, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/16", - 324, - { + }, + { + "key": "collection/4/coll/16", + "version": 324, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/17", - 325, - { + }, + { + "key": "collection/4/coll/17", + "version": 325, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/18", - 326, - { + }, + { + "key": "collection/4/coll/18", + "version": 326, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/19", - 327, - { + }, + { + "key": "collection/4/coll/19", + "version": 327, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/20", - 328, - { + }, + { + "key": "collection/4/coll/20", + "version": 328, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/21", - 329, - { + }, + { + "key": "collection/4/coll/21", + "version": 329, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/22", - 330, - { + }, + { + "key": "collection/4/coll/22", + "version": 330, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/23", - 331, - { + }, + { + "key": "collection/4/coll/23", + "version": 331, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/24", - 332, - { + }, + { + "key": "collection/4/coll/24", + "version": 332, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/25", - 333, - { + }, + { + "key": "collection/4/coll/25", + "version": 333, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/26", - 334, - { + }, + { + "key": "collection/4/coll/26", + "version": 334, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/27", - 335, - { + }, + { + "key": "collection/4/coll/27", + "version": 335, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/28", - 336, - { + }, + { + "key": "collection/4/coll/28", + "version": 336, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/29", - 337, - { + }, + { + "key": "collection/4/coll/29", + "version": 337, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/30", - 338, - { + }, + { + "key": "collection/4/coll/30", + "version": 338, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/31", - 339, - { + }, + { + "key": "collection/4/coll/31", + "version": 339, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/32", - 340, - { + }, + { + "key": "collection/4/coll/32", + "version": 340, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/33", - 341, - { + }, + { + "key": "collection/4/coll/33", + "version": 341, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/34", - 342, - { + }, + { + "key": "collection/4/coll/34", + "version": 342, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/35", - 343, - { + }, + { + "key": "collection/4/coll/35", + "version": 343, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/36", - 344, - { + }, + { + "key": "collection/4/coll/36", + "version": 344, + "value": { "v": 36 - } - ], - [ - "collection/4/coll/37", - 345, - { + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + }, + { + "key": "collection/4/coll/37", + "version": 345, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/38", - 346, - { + }, + { + "key": "collection/4/coll/38", + "version": 346, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/39", - 347, - { + }, + { + "key": "collection/4/coll/39", + "version": 347, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/40", - 348, - { + }, + { + "key": "collection/4/coll/40", + "version": 348, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/41", - 349, - { + }, + { + "key": "collection/4/coll/41", + "version": 349, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/42", - 350, - { + }, + { + "key": "collection/4/coll/42", + "version": 350, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/43", - 351, - { + }, + { + "key": "collection/4/coll/43", + "version": 351, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/44", - 352, - { + }, + { + "key": "collection/4/coll/44", + "version": 352, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/45", - 353, - { + }, + { + "key": "collection/4/coll/45", + "version": 353, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/46", - 354, - { + }, + { + "key": "collection/4/coll/46", + "version": 354, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/47", - 355, - { + }, + { + "key": "collection/4/coll/47", + "version": 355, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/48", - 356, - { + }, + { + "key": "collection/4/coll/48", + "version": 356, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/49", - 357, - { + }, + { + "key": "collection/4/coll/49", + "version": 357, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/50", - 358, - { + }, + { + "key": "collection/4/coll/50", + "version": 358, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/51", - 359, - { + }, + { + "key": "collection/4/coll/51", + "version": 359, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/52", - 360, - { + }, + { + "key": "collection/4/coll/52", + "version": 360, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/53", - 361, - { + }, + { + "key": "collection/4/coll/53", + "version": 361, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/54", - 362, - { + }, + { + "key": "collection/4/coll/54", + "version": 362, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/55", - 363, - { + }, + { + "key": "collection/4/coll/55", + "version": 363, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/56", - 364, - { + }, + { + "key": "collection/4/coll/56", + "version": 364, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/57", - 365, - { + }, + { + "key": "collection/4/coll/57", + "version": 365, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/58", - 366, - { + }, + { + "key": "collection/4/coll/58", + "version": 366, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/59", - 367, - { + }, + { + "key": "collection/4/coll/59", + "version": 367, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/60", - 368, - { + }, + { + "key": "collection/4/coll/60", + "version": 368, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/61", - 369, - { + }, + { + "key": "collection/4/coll/61", + "version": 369, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/62", - 370, - { + }, + { + "key": "collection/4/coll/62", + "version": 370, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/63", - 371, - { + }, + { + "key": "collection/4/coll/63", + "version": 371, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/64", - 372, - { + }, + { + "key": "collection/4/coll/64", + "version": 372, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/65", - 373, - { + }, + { + "key": "collection/4/coll/65", + "version": 373, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/66", - 374, - { + }, + { + "key": "collection/4/coll/66", + "version": 374, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/67", - 375, - { + }, + { + "key": "collection/4/coll/67", + "version": 375, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/68", - 376, - { + }, + { + "key": "collection/4/coll/68", + "version": 376, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/69", - 377, - { + }, + { + "key": "collection/4/coll/69", + "version": 377, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/70", - 378, - { + }, + { + "key": "collection/4/coll/70", + "version": 378, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/71", - 379, - { + }, + { + "key": "collection/4/coll/71", + "version": 379, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/72", - 380, - { + }, + { + "key": "collection/4/coll/72", + "version": 380, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/73", - 381, - { + }, + { + "key": "collection/4/coll/73", + "version": 381, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/74", - 382, - { + }, + { + "key": "collection/4/coll/74", + "version": 382, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/75", - 383, - { + }, + { + "key": "collection/4/coll/75", + "version": 383, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/76", - 384, - { + }, + { + "key": "collection/4/coll/76", + "version": 384, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/77", - 385, - { + }, + { + "key": "collection/4/coll/77", + "version": 385, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/78", - 386, - { + }, + { + "key": "collection/4/coll/78", + "version": 386, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/79", - 387, - { + }, + { + "key": "collection/4/coll/79", + "version": 387, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/80", - 388, - { + }, + { + "key": "collection/4/coll/80", + "version": 388, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/81", - 389, - { + }, + { + "key": "collection/4/coll/81", + "version": 389, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/82", - 390, - { + }, + { + "key": "collection/4/coll/82", + "version": 390, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/83", - 391, - { + }, + { + "key": "collection/4/coll/83", + "version": 391, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/84", - 392, - { + }, + { + "key": "collection/4/coll/84", + "version": 392, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/85", - 393, - { + }, + { + "key": "collection/4/coll/85", + "version": 393, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/86", - 394, - { + }, + { + "key": "collection/4/coll/86", + "version": 394, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/87", - 395, - { + }, + { + "key": "collection/4/coll/87", + "version": 395, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/88", - 396, - { + }, + { + "key": "collection/4/coll/88", + "version": 396, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/89", - 397, - { + }, + { + "key": "collection/4/coll/89", + "version": 397, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/90", - 398, - { + }, + { + "key": "collection/4/coll/90", + "version": 398, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/91", - 399, - { + }, + { + "key": "collection/4/coll/91", + "version": 399, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/92", - 400, - { + }, + { + "key": "collection/4/coll/92", + "version": 400, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/93", - 401, - { + }, + { + "key": "collection/4/coll/93", + "version": 401, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/94", - 402, - { + }, + { + "key": "collection/4/coll/94", + "version": 402, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/95", - 403, - { + }, + { + "key": "collection/4/coll/95", + "version": 403, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/96", - 404, - { + }, + { + "key": "collection/4/coll/96", + "version": 404, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/97", - 405, - { + }, + { + "key": "collection/4/coll/97", + "version": 405, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/98", - 406, - { + }, + { + "key": "collection/4/coll/98", + "version": 406, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/99", - 407, - { + }, + { + "key": "collection/4/coll/99", + "version": 407, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -35294,706 +50964,1106 @@ ] }, "added": [ - [ - "collection/4/coll/0", - 308, - { + { + "key": "collection/4/coll/0", + "version": 308, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/1", - 309, - { + }, + { + "key": "collection/4/coll/1", + "version": 309, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/2", - 310, - { + }, + { + "key": "collection/4/coll/2", + "version": 310, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/3", - 311, - { + }, + { + "key": "collection/4/coll/3", + "version": 311, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/4", - 312, - { + }, + { + "key": "collection/4/coll/4", + "version": 312, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/5", - 313, - { + }, + { + "key": "collection/4/coll/5", + "version": 313, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/6", - 314, - { + }, + { + "key": "collection/4/coll/6", + "version": 314, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/7", - 315, - { + }, + { + "key": "collection/4/coll/7", + "version": 315, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/8", - 316, - { + }, + { + "key": "collection/4/coll/8", + "version": 316, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/9", - 317, - { + }, + { + "key": "collection/4/coll/9", + "version": 317, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/10", - 318, - { + }, + { + "key": "collection/4/coll/10", + "version": 318, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/11", - 319, - { + }, + { + "key": "collection/4/coll/11", + "version": 319, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/12", - 320, - { + }, + { + "key": "collection/4/coll/12", + "version": 320, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/13", - 321, - { + }, + { + "key": "collection/4/coll/13", + "version": 321, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/14", - 322, - { + }, + { + "key": "collection/4/coll/14", + "version": 322, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/15", - 323, - { + }, + { + "key": "collection/4/coll/15", + "version": 323, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/16", - 324, - { + }, + { + "key": "collection/4/coll/16", + "version": 324, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/17", - 325, - { + }, + { + "key": "collection/4/coll/17", + "version": 325, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/18", - 326, - { + }, + { + "key": "collection/4/coll/18", + "version": 326, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/19", - 327, - { + }, + { + "key": "collection/4/coll/19", + "version": 327, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/20", - 328, - { + }, + { + "key": "collection/4/coll/20", + "version": 328, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/21", - 329, - { + }, + { + "key": "collection/4/coll/21", + "version": 329, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/22", - 330, - { + }, + { + "key": "collection/4/coll/22", + "version": 330, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/23", - 331, - { + }, + { + "key": "collection/4/coll/23", + "version": 331, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/24", - 332, - { + }, + { + "key": "collection/4/coll/24", + "version": 332, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/25", - 333, - { + }, + { + "key": "collection/4/coll/25", + "version": 333, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/26", - 334, - { + }, + { + "key": "collection/4/coll/26", + "version": 334, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/27", - 335, - { + }, + { + "key": "collection/4/coll/27", + "version": 335, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/28", - 336, - { + }, + { + "key": "collection/4/coll/28", + "version": 336, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/29", - 337, - { + }, + { + "key": "collection/4/coll/29", + "version": 337, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/30", - 338, - { + }, + { + "key": "collection/4/coll/30", + "version": 338, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/31", - 339, - { + }, + { + "key": "collection/4/coll/31", + "version": 339, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/32", - 340, - { + }, + { + "key": "collection/4/coll/32", + "version": 340, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/33", - 341, - { + }, + { + "key": "collection/4/coll/33", + "version": 341, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/34", - 342, - { + }, + { + "key": "collection/4/coll/34", + "version": 342, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/35", - 343, - { + }, + { + "key": "collection/4/coll/35", + "version": 343, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/36", - 344, - { + }, + { + "key": "collection/4/coll/36", + "version": 344, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/37", - 345, - { + }, + { + "key": "collection/4/coll/37", + "version": 345, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/38", - 346, - { + }, + { + "key": "collection/4/coll/38", + "version": 346, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/39", - 347, - { + }, + { + "key": "collection/4/coll/39", + "version": 347, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/40", - 348, - { + }, + { + "key": "collection/4/coll/40", + "version": 348, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/41", - 349, - { + }, + { + "key": "collection/4/coll/41", + "version": 349, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/42", - 350, - { + }, + { + "key": "collection/4/coll/42", + "version": 350, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/43", - 351, - { + }, + { + "key": "collection/4/coll/43", + "version": 351, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/44", - 352, - { + }, + { + "key": "collection/4/coll/44", + "version": 352, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/45", - 353, - { + }, + { + "key": "collection/4/coll/45", + "version": 353, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/46", - 354, - { + }, + { + "key": "collection/4/coll/46", + "version": 354, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/47", - 355, - { + }, + { + "key": "collection/4/coll/47", + "version": 355, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/48", - 356, - { + }, + { + "key": "collection/4/coll/48", + "version": 356, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/49", - 357, - { + }, + { + "key": "collection/4/coll/49", + "version": 357, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/50", - 358, - { + }, + { + "key": "collection/4/coll/50", + "version": 358, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/51", - 359, - { + }, + { + "key": "collection/4/coll/51", + "version": 359, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/52", - 360, - { + }, + { + "key": "collection/4/coll/52", + "version": 360, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/53", - 361, - { + }, + { + "key": "collection/4/coll/53", + "version": 361, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/54", - 362, - { + }, + { + "key": "collection/4/coll/54", + "version": 362, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/55", - 363, - { + }, + { + "key": "collection/4/coll/55", + "version": 363, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/56", - 364, - { + }, + { + "key": "collection/4/coll/56", + "version": 364, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/57", - 365, - { + }, + { + "key": "collection/4/coll/57", + "version": 365, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/58", - 366, - { + }, + { + "key": "collection/4/coll/58", + "version": 366, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/59", - 367, - { + }, + { + "key": "collection/4/coll/59", + "version": 367, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/60", - 368, - { + }, + { + "key": "collection/4/coll/60", + "version": 368, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/61", - 369, - { + }, + { + "key": "collection/4/coll/61", + "version": 369, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/62", - 370, - { + }, + { + "key": "collection/4/coll/62", + "version": 370, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/63", - 371, - { + }, + { + "key": "collection/4/coll/63", + "version": 371, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/64", - 372, - { + }, + { + "key": "collection/4/coll/64", + "version": 372, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/65", - 373, - { + }, + { + "key": "collection/4/coll/65", + "version": 373, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/66", - 374, - { + }, + { + "key": "collection/4/coll/66", + "version": 374, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/67", - 375, - { + }, + { + "key": "collection/4/coll/67", + "version": 375, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/68", - 376, - { + }, + { + "key": "collection/4/coll/68", + "version": 376, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/69", - 377, - { + }, + { + "key": "collection/4/coll/69", + "version": 377, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/70", - 378, - { + }, + { + "key": "collection/4/coll/70", + "version": 378, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/71", - 379, - { + }, + { + "key": "collection/4/coll/71", + "version": 379, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/72", - 380, - { + }, + { + "key": "collection/4/coll/72", + "version": 380, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/73", - 381, - { + }, + { + "key": "collection/4/coll/73", + "version": 381, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/74", - 382, - { + }, + { + "key": "collection/4/coll/74", + "version": 382, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/75", - 383, - { + }, + { + "key": "collection/4/coll/75", + "version": 383, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/76", - 384, - { + }, + { + "key": "collection/4/coll/76", + "version": 384, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/77", - 385, - { + }, + { + "key": "collection/4/coll/77", + "version": 385, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/78", - 386, - { + }, + { + "key": "collection/4/coll/78", + "version": 386, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/79", - 387, - { + }, + { + "key": "collection/4/coll/79", + "version": 387, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/80", - 388, - { + }, + { + "key": "collection/4/coll/80", + "version": 388, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/81", - 389, - { + }, + { + "key": "collection/4/coll/81", + "version": 389, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/82", - 390, - { + }, + { + "key": "collection/4/coll/82", + "version": 390, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/83", - 391, - { + }, + { + "key": "collection/4/coll/83", + "version": 391, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/84", - 392, - { + }, + { + "key": "collection/4/coll/84", + "version": 392, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/85", - 393, - { + }, + { + "key": "collection/4/coll/85", + "version": 393, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/86", - 394, - { + }, + { + "key": "collection/4/coll/86", + "version": 394, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/87", - 395, - { + }, + { + "key": "collection/4/coll/87", + "version": 395, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/88", - 396, - { + }, + { + "key": "collection/4/coll/88", + "version": 396, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/89", - 397, - { + }, + { + "key": "collection/4/coll/89", + "version": 397, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/90", - 398, - { + }, + { + "key": "collection/4/coll/90", + "version": 398, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/91", - 399, - { + }, + { + "key": "collection/4/coll/91", + "version": 399, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/92", - 400, - { + }, + { + "key": "collection/4/coll/92", + "version": 400, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/93", - 401, - { + }, + { + "key": "collection/4/coll/93", + "version": 401, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/94", - 402, - { + }, + { + "key": "collection/4/coll/94", + "version": 402, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/95", - 403, - { + }, + { + "key": "collection/4/coll/95", + "version": 403, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/96", - 404, - { + }, + { + "key": "collection/4/coll/96", + "version": 404, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/97", - 405, - { + }, + { + "key": "collection/4/coll/97", + "version": 405, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/98", - 406, - { + }, + { + "key": "collection/4/coll/98", + "version": 406, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/4/coll/99", - 407, - { + }, + { + "key": "collection/4/coll/99", + "version": 407, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -36024,7 +52094,8 @@ }, { "watchSnapshot": { - "version": 409 + "version": 409, + "targetIds": [] }, "expect": [ { @@ -36109,706 +52180,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/5/coll/0", - 410, - { + { + "key": "collection/5/coll/0", + "version": 410, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/1", - 411, - { + }, + { + "key": "collection/5/coll/1", + "version": 411, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/2", - 412, - { + }, + { + "key": "collection/5/coll/2", + "version": 412, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/3", - 413, - { + }, + { + "key": "collection/5/coll/3", + "version": 413, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/4", - 414, - { + }, + { + "key": "collection/5/coll/4", + "version": 414, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/5", - 415, - { + }, + { + "key": "collection/5/coll/5", + "version": 415, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/6", - 416, - { + }, + { + "key": "collection/5/coll/6", + "version": 416, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/7", - 417, - { + }, + { + "key": "collection/5/coll/7", + "version": 417, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/8", - 418, - { + }, + { + "key": "collection/5/coll/8", + "version": 418, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/9", - 419, - { + }, + { + "key": "collection/5/coll/9", + "version": 419, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/10", - 420, - { + }, + { + "key": "collection/5/coll/10", + "version": 420, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/11", - 421, - { + }, + { + "key": "collection/5/coll/11", + "version": 421, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/12", - 422, - { + }, + { + "key": "collection/5/coll/12", + "version": 422, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/13", - 423, - { + }, + { + "key": "collection/5/coll/13", + "version": 423, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/14", - 424, - { + }, + { + "key": "collection/5/coll/14", + "version": 424, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/15", - 425, - { + }, + { + "key": "collection/5/coll/15", + "version": 425, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/16", - 426, - { + }, + { + "key": "collection/5/coll/16", + "version": 426, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/17", - 427, - { + }, + { + "key": "collection/5/coll/17", + "version": 427, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/18", - 428, - { + }, + { + "key": "collection/5/coll/18", + "version": 428, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/19", - 429, - { + }, + { + "key": "collection/5/coll/19", + "version": 429, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/20", - 430, - { + }, + { + "key": "collection/5/coll/20", + "version": 430, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/21", - 431, - { + }, + { + "key": "collection/5/coll/21", + "version": 431, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/22", - 432, - { + }, + { + "key": "collection/5/coll/22", + "version": 432, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/23", - 433, - { + }, + { + "key": "collection/5/coll/23", + "version": 433, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/24", - 434, - { + }, + { + "key": "collection/5/coll/24", + "version": 434, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/25", - 435, - { + }, + { + "key": "collection/5/coll/25", + "version": 435, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/26", - 436, - { + }, + { + "key": "collection/5/coll/26", + "version": 436, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/27", - 437, - { + }, + { + "key": "collection/5/coll/27", + "version": 437, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/28", - 438, - { + }, + { + "key": "collection/5/coll/28", + "version": 438, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/29", - 439, - { + }, + { + "key": "collection/5/coll/29", + "version": 439, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/30", - 440, - { + }, + { + "key": "collection/5/coll/30", + "version": 440, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/31", - 441, - { + }, + { + "key": "collection/5/coll/31", + "version": 441, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/32", - 442, - { + }, + { + "key": "collection/5/coll/32", + "version": 442, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/33", - 443, - { + }, + { + "key": "collection/5/coll/33", + "version": 443, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/34", - 444, - { + }, + { + "key": "collection/5/coll/34", + "version": 444, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/35", - 445, - { + }, + { + "key": "collection/5/coll/35", + "version": 445, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/36", - 446, - { + }, + { + "key": "collection/5/coll/36", + "version": 446, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/37", - 447, - { + }, + { + "key": "collection/5/coll/37", + "version": 447, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/38", - 448, - { + }, + { + "key": "collection/5/coll/38", + "version": 448, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/39", - 449, - { + }, + { + "key": "collection/5/coll/39", + "version": 449, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/40", - 450, - { + }, + { + "key": "collection/5/coll/40", + "version": 450, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/41", - 451, - { + }, + { + "key": "collection/5/coll/41", + "version": 451, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/42", - 452, - { + }, + { + "key": "collection/5/coll/42", + "version": 452, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/43", - 453, - { + }, + { + "key": "collection/5/coll/43", + "version": 453, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/44", - 454, - { + }, + { + "key": "collection/5/coll/44", + "version": 454, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/45", - 455, - { + }, + { + "key": "collection/5/coll/45", + "version": 455, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/46", - 456, - { + }, + { + "key": "collection/5/coll/46", + "version": 456, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/47", - 457, - { + }, + { + "key": "collection/5/coll/47", + "version": 457, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/48", - 458, - { + }, + { + "key": "collection/5/coll/48", + "version": 458, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/49", - 459, - { + }, + { + "key": "collection/5/coll/49", + "version": 459, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/50", - 460, - { + }, + { + "key": "collection/5/coll/50", + "version": 460, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/51", - 461, - { + }, + { + "key": "collection/5/coll/51", + "version": 461, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/52", - 462, - { + }, + { + "key": "collection/5/coll/52", + "version": 462, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/53", - 463, - { + }, + { + "key": "collection/5/coll/53", + "version": 463, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/54", - 464, - { + }, + { + "key": "collection/5/coll/54", + "version": 464, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/55", - 465, - { + }, + { + "key": "collection/5/coll/55", + "version": 465, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/56", - 466, - { + }, + { + "key": "collection/5/coll/56", + "version": 466, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/57", - 467, - { + }, + { + "key": "collection/5/coll/57", + "version": 467, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/58", - 468, - { + }, + { + "key": "collection/5/coll/58", + "version": 468, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/59", - 469, - { + }, + { + "key": "collection/5/coll/59", + "version": 469, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/60", - 470, - { + }, + { + "key": "collection/5/coll/60", + "version": 470, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/61", - 471, - { + }, + { + "key": "collection/5/coll/61", + "version": 471, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/62", - 472, - { + }, + { + "key": "collection/5/coll/62", + "version": 472, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/63", - 473, - { + }, + { + "key": "collection/5/coll/63", + "version": 473, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/64", - 474, - { + }, + { + "key": "collection/5/coll/64", + "version": 474, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/65", - 475, - { + }, + { + "key": "collection/5/coll/65", + "version": 475, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/66", - 476, - { + }, + { + "key": "collection/5/coll/66", + "version": 476, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/67", - 477, - { + }, + { + "key": "collection/5/coll/67", + "version": 477, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/68", - 478, - { + }, + { + "key": "collection/5/coll/68", + "version": 478, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/69", - 479, - { + }, + { + "key": "collection/5/coll/69", + "version": 479, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/70", - 480, - { + }, + { + "key": "collection/5/coll/70", + "version": 480, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/71", - 481, - { + }, + { + "key": "collection/5/coll/71", + "version": 481, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/72", - 482, - { + }, + { + "key": "collection/5/coll/72", + "version": 482, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/73", - 483, - { + }, + { + "key": "collection/5/coll/73", + "version": 483, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/74", - 484, - { + }, + { + "key": "collection/5/coll/74", + "version": 484, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/75", - 485, - { + }, + { + "key": "collection/5/coll/75", + "version": 485, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/76", - 486, - { + }, + { + "key": "collection/5/coll/76", + "version": 486, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/77", - 487, - { + }, + { + "key": "collection/5/coll/77", + "version": 487, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/78", - 488, - { + }, + { + "key": "collection/5/coll/78", + "version": 488, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/79", - 489, - { + }, + { + "key": "collection/5/coll/79", + "version": 489, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/80", - 490, - { + }, + { + "key": "collection/5/coll/80", + "version": 490, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/81", - 491, - { + }, + { + "key": "collection/5/coll/81", + "version": 491, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/82", - 492, - { + }, + { + "key": "collection/5/coll/82", + "version": 492, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/83", - 493, - { + }, + { + "key": "collection/5/coll/83", + "version": 493, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/84", - 494, - { + }, + { + "key": "collection/5/coll/84", + "version": 494, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/85", - 495, - { + }, + { + "key": "collection/5/coll/85", + "version": 495, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/86", - 496, - { + }, + { + "key": "collection/5/coll/86", + "version": 496, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/87", - 497, - { + }, + { + "key": "collection/5/coll/87", + "version": 497, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/88", - 498, - { + }, + { + "key": "collection/5/coll/88", + "version": 498, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/89", - 499, - { + }, + { + "key": "collection/5/coll/89", + "version": 499, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/90", - 500, - { + }, + { + "key": "collection/5/coll/90", + "version": 500, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/91", - 501, - { + }, + { + "key": "collection/5/coll/91", + "version": 501, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/92", - 502, - { + }, + { + "key": "collection/5/coll/92", + "version": 502, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/93", - 503, - { + }, + { + "key": "collection/5/coll/93", + "version": 503, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/94", - 504, - { + }, + { + "key": "collection/5/coll/94", + "version": 504, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/95", - 505, - { + }, + { + "key": "collection/5/coll/95", + "version": 505, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/96", - 506, - { + }, + { + "key": "collection/5/coll/96", + "version": 506, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/97", - 507, - { + }, + { + "key": "collection/5/coll/97", + "version": 507, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/98", - 508, - { + }, + { + "key": "collection/5/coll/98", + "version": 508, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/99", - 509, - { + }, + { + "key": "collection/5/coll/99", + "version": 509, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 10 @@ -36825,7 +53296,8 @@ }, { "watchSnapshot": { - "version": 510 + "version": 510, + "targetIds": [] }, "expect": [ { @@ -36840,706 +53312,1106 @@ ] }, "added": [ - [ - "collection/5/coll/0", - 410, - { + { + "key": "collection/5/coll/0", + "version": 410, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/1", - 411, - { + }, + { + "key": "collection/5/coll/1", + "version": 411, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/2", - 412, - { + }, + { + "key": "collection/5/coll/2", + "version": 412, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/3", - 413, - { + }, + { + "key": "collection/5/coll/3", + "version": 413, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/4", - 414, - { + }, + { + "key": "collection/5/coll/4", + "version": 414, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/5", - 415, - { + }, + { + "key": "collection/5/coll/5", + "version": 415, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/6", - 416, - { + }, + { + "key": "collection/5/coll/6", + "version": 416, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/7", - 417, - { + }, + { + "key": "collection/5/coll/7", + "version": 417, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/8", - 418, - { + }, + { + "key": "collection/5/coll/8", + "version": 418, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/9", - 419, - { + }, + { + "key": "collection/5/coll/9", + "version": 419, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/10", - 420, - { + }, + { + "key": "collection/5/coll/10", + "version": 420, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/11", - 421, - { + }, + { + "key": "collection/5/coll/11", + "version": 421, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/12", - 422, - { + }, + { + "key": "collection/5/coll/12", + "version": 422, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/13", - 423, - { + }, + { + "key": "collection/5/coll/13", + "version": 423, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/14", - 424, - { + }, + { + "key": "collection/5/coll/14", + "version": 424, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/15", - 425, - { + }, + { + "key": "collection/5/coll/15", + "version": 425, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/16", - 426, - { + }, + { + "key": "collection/5/coll/16", + "version": 426, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/17", - 427, - { + }, + { + "key": "collection/5/coll/17", + "version": 427, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/18", - 428, - { + }, + { + "key": "collection/5/coll/18", + "version": 428, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/19", - 429, - { + }, + { + "key": "collection/5/coll/19", + "version": 429, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/20", - 430, - { + }, + { + "key": "collection/5/coll/20", + "version": 430, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/21", - 431, - { + }, + { + "key": "collection/5/coll/21", + "version": 431, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/22", - 432, - { + }, + { + "key": "collection/5/coll/22", + "version": 432, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/23", - 433, - { + }, + { + "key": "collection/5/coll/23", + "version": 433, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/24", - 434, - { + }, + { + "key": "collection/5/coll/24", + "version": 434, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/25", - 435, - { + }, + { + "key": "collection/5/coll/25", + "version": 435, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/26", - 436, - { + }, + { + "key": "collection/5/coll/26", + "version": 436, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/27", - 437, - { + }, + { + "key": "collection/5/coll/27", + "version": 437, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/28", - 438, - { + }, + { + "key": "collection/5/coll/28", + "version": 438, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/29", - 439, - { + }, + { + "key": "collection/5/coll/29", + "version": 439, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/30", - 440, - { + }, + { + "key": "collection/5/coll/30", + "version": 440, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/31", - 441, - { + }, + { + "key": "collection/5/coll/31", + "version": 441, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/32", - 442, - { + }, + { + "key": "collection/5/coll/32", + "version": 442, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/33", - 443, - { + }, + { + "key": "collection/5/coll/33", + "version": 443, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/34", - 444, - { + }, + { + "key": "collection/5/coll/34", + "version": 444, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/35", - 445, - { + }, + { + "key": "collection/5/coll/35", + "version": 445, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/36", - 446, - { + }, + { + "key": "collection/5/coll/36", + "version": 446, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/37", - 447, - { + }, + { + "key": "collection/5/coll/37", + "version": 447, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/38", - 448, - { + }, + { + "key": "collection/5/coll/38", + "version": 448, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/39", - 449, - { + }, + { + "key": "collection/5/coll/39", + "version": 449, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/40", - 450, - { + }, + { + "key": "collection/5/coll/40", + "version": 450, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/41", - 451, - { + }, + { + "key": "collection/5/coll/41", + "version": 451, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/42", - 452, - { + }, + { + "key": "collection/5/coll/42", + "version": 452, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/43", - 453, - { + }, + { + "key": "collection/5/coll/43", + "version": 453, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/44", - 454, - { + }, + { + "key": "collection/5/coll/44", + "version": 454, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/45", - 455, - { + }, + { + "key": "collection/5/coll/45", + "version": 455, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/46", - 456, - { + }, + { + "key": "collection/5/coll/46", + "version": 456, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/47", - 457, - { + }, + { + "key": "collection/5/coll/47", + "version": 457, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/48", - 458, - { + }, + { + "key": "collection/5/coll/48", + "version": 458, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/49", - 459, - { + }, + { + "key": "collection/5/coll/49", + "version": 459, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/50", - 460, - { + }, + { + "key": "collection/5/coll/50", + "version": 460, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/51", - 461, - { + }, + { + "key": "collection/5/coll/51", + "version": 461, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/52", - 462, - { + }, + { + "key": "collection/5/coll/52", + "version": 462, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/53", - 463, - { + }, + { + "key": "collection/5/coll/53", + "version": 463, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/54", - 464, - { + }, + { + "key": "collection/5/coll/54", + "version": 464, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/55", - 465, - { + }, + { + "key": "collection/5/coll/55", + "version": 465, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/56", - 466, - { + }, + { + "key": "collection/5/coll/56", + "version": 466, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/57", - 467, - { + }, + { + "key": "collection/5/coll/57", + "version": 467, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/58", - 468, - { + }, + { + "key": "collection/5/coll/58", + "version": 468, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/59", - 469, - { + }, + { + "key": "collection/5/coll/59", + "version": 469, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/60", - 470, - { + }, + { + "key": "collection/5/coll/60", + "version": 470, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/61", - 471, - { + }, + { + "key": "collection/5/coll/61", + "version": 471, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/62", - 472, - { + }, + { + "key": "collection/5/coll/62", + "version": 472, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/63", - 473, - { + }, + { + "key": "collection/5/coll/63", + "version": 473, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/64", - 474, - { + }, + { + "key": "collection/5/coll/64", + "version": 474, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/65", - 475, - { + }, + { + "key": "collection/5/coll/65", + "version": 475, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/66", - 476, - { + }, + { + "key": "collection/5/coll/66", + "version": 476, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/67", - 477, - { + }, + { + "key": "collection/5/coll/67", + "version": 477, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/68", - 478, - { + }, + { + "key": "collection/5/coll/68", + "version": 478, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/69", - 479, - { + }, + { + "key": "collection/5/coll/69", + "version": 479, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/70", - 480, - { + }, + { + "key": "collection/5/coll/70", + "version": 480, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/71", - 481, - { + }, + { + "key": "collection/5/coll/71", + "version": 481, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/72", - 482, - { + }, + { + "key": "collection/5/coll/72", + "version": 482, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/73", - 483, - { + }, + { + "key": "collection/5/coll/73", + "version": 483, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/74", - 484, - { + }, + { + "key": "collection/5/coll/74", + "version": 484, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/75", - 485, - { + }, + { + "key": "collection/5/coll/75", + "version": 485, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/76", - 486, - { + }, + { + "key": "collection/5/coll/76", + "version": 486, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/77", - 487, - { + }, + { + "key": "collection/5/coll/77", + "version": 487, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/78", - 488, - { + }, + { + "key": "collection/5/coll/78", + "version": 488, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/79", - 489, - { + }, + { + "key": "collection/5/coll/79", + "version": 489, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/80", - 490, - { + }, + { + "key": "collection/5/coll/80", + "version": 490, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/81", - 491, - { + }, + { + "key": "collection/5/coll/81", + "version": 491, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/82", - 492, - { + }, + { + "key": "collection/5/coll/82", + "version": 492, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/83", - 493, - { + }, + { + "key": "collection/5/coll/83", + "version": 493, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/84", - 494, - { + }, + { + "key": "collection/5/coll/84", + "version": 494, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/85", - 495, - { + }, + { + "key": "collection/5/coll/85", + "version": 495, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/86", - 496, - { + }, + { + "key": "collection/5/coll/86", + "version": 496, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/87", - 497, - { + }, + { + "key": "collection/5/coll/87", + "version": 497, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/88", - 498, - { + }, + { + "key": "collection/5/coll/88", + "version": 498, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/89", - 499, - { + }, + { + "key": "collection/5/coll/89", + "version": 499, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/90", - 500, - { + }, + { + "key": "collection/5/coll/90", + "version": 500, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/91", - 501, - { + }, + { + "key": "collection/5/coll/91", + "version": 501, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/92", - 502, - { + }, + { + "key": "collection/5/coll/92", + "version": 502, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/93", - 503, - { + }, + { + "key": "collection/5/coll/93", + "version": 503, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/94", - 504, - { + }, + { + "key": "collection/5/coll/94", + "version": 504, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/95", - 505, - { + }, + { + "key": "collection/5/coll/95", + "version": 505, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/96", - 506, - { + }, + { + "key": "collection/5/coll/96", + "version": 506, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/97", - 507, - { + }, + { + "key": "collection/5/coll/97", + "version": 507, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/98", - 508, - { + }, + { + "key": "collection/5/coll/98", + "version": 508, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/99", - 509, - { + }, + { + "key": "collection/5/coll/99", + "version": 509, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -37616,706 +54488,1106 @@ ] }, "added": [ - [ - "collection/5/coll/0", - 410, - { + { + "key": "collection/5/coll/0", + "version": 410, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/1", - 411, - { + }, + { + "key": "collection/5/coll/1", + "version": 411, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/2", - 412, - { + }, + { + "key": "collection/5/coll/2", + "version": 412, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/3", - 413, - { + }, + { + "key": "collection/5/coll/3", + "version": 413, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/4", - 414, - { + }, + { + "key": "collection/5/coll/4", + "version": 414, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/5", - 415, - { + }, + { + "key": "collection/5/coll/5", + "version": 415, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/6", - 416, - { + }, + { + "key": "collection/5/coll/6", + "version": 416, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/7", - 417, - { + }, + { + "key": "collection/5/coll/7", + "version": 417, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/8", - 418, - { + }, + { + "key": "collection/5/coll/8", + "version": 418, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/9", - 419, - { + }, + { + "key": "collection/5/coll/9", + "version": 419, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/10", - 420, - { + }, + { + "key": "collection/5/coll/10", + "version": 420, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/11", - 421, - { + }, + { + "key": "collection/5/coll/11", + "version": 421, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/12", - 422, - { + }, + { + "key": "collection/5/coll/12", + "version": 422, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/13", - 423, - { + }, + { + "key": "collection/5/coll/13", + "version": 423, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/14", - 424, - { + }, + { + "key": "collection/5/coll/14", + "version": 424, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/15", - 425, - { + }, + { + "key": "collection/5/coll/15", + "version": 425, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/16", - 426, - { + }, + { + "key": "collection/5/coll/16", + "version": 426, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/17", - 427, - { + }, + { + "key": "collection/5/coll/17", + "version": 427, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/18", - 428, - { + }, + { + "key": "collection/5/coll/18", + "version": 428, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/19", - 429, - { + }, + { + "key": "collection/5/coll/19", + "version": 429, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/20", - 430, - { + }, + { + "key": "collection/5/coll/20", + "version": 430, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/21", - 431, - { + }, + { + "key": "collection/5/coll/21", + "version": 431, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/22", - 432, - { + }, + { + "key": "collection/5/coll/22", + "version": 432, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/23", - 433, - { + }, + { + "key": "collection/5/coll/23", + "version": 433, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/24", - 434, - { + }, + { + "key": "collection/5/coll/24", + "version": 434, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/25", - 435, - { + }, + { + "key": "collection/5/coll/25", + "version": 435, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/26", - 436, - { + }, + { + "key": "collection/5/coll/26", + "version": 436, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/27", - 437, - { + }, + { + "key": "collection/5/coll/27", + "version": 437, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/28", - 438, - { + }, + { + "key": "collection/5/coll/28", + "version": 438, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/29", - 439, - { + }, + { + "key": "collection/5/coll/29", + "version": 439, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/30", - 440, - { + }, + { + "key": "collection/5/coll/30", + "version": 440, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/31", - 441, - { + }, + { + "key": "collection/5/coll/31", + "version": 441, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/32", - 442, - { + }, + { + "key": "collection/5/coll/32", + "version": 442, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/33", - 443, - { + }, + { + "key": "collection/5/coll/33", + "version": 443, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/34", - 444, - { + }, + { + "key": "collection/5/coll/34", + "version": 444, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/35", - 445, - { + }, + { + "key": "collection/5/coll/35", + "version": 445, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/36", - 446, - { + }, + { + "key": "collection/5/coll/36", + "version": 446, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/37", - 447, - { + }, + { + "key": "collection/5/coll/37", + "version": 447, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/38", - 448, - { + }, + { + "key": "collection/5/coll/38", + "version": 448, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/39", - 449, - { + }, + { + "key": "collection/5/coll/39", + "version": 449, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/40", - 450, - { + }, + { + "key": "collection/5/coll/40", + "version": 450, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/41", - 451, - { + }, + { + "key": "collection/5/coll/41", + "version": 451, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/42", - 452, - { + }, + { + "key": "collection/5/coll/42", + "version": 452, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/43", - 453, - { + }, + { + "key": "collection/5/coll/43", + "version": 453, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/44", - 454, - { + }, + { + "key": "collection/5/coll/44", + "version": 454, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/45", - 455, - { + }, + { + "key": "collection/5/coll/45", + "version": 455, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/46", - 456, - { + }, + { + "key": "collection/5/coll/46", + "version": 456, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/47", - 457, - { + }, + { + "key": "collection/5/coll/47", + "version": 457, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/48", - 458, - { + }, + { + "key": "collection/5/coll/48", + "version": 458, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/49", - 459, - { + }, + { + "key": "collection/5/coll/49", + "version": 459, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/50", - 460, - { + }, + { + "key": "collection/5/coll/50", + "version": 460, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/51", - 461, - { + }, + { + "key": "collection/5/coll/51", + "version": 461, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/52", - 462, - { + }, + { + "key": "collection/5/coll/52", + "version": 462, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/53", - 463, - { + }, + { + "key": "collection/5/coll/53", + "version": 463, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/54", - 464, - { + }, + { + "key": "collection/5/coll/54", + "version": 464, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/55", - 465, - { + }, + { + "key": "collection/5/coll/55", + "version": 465, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/56", - 466, - { + }, + { + "key": "collection/5/coll/56", + "version": 466, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/57", - 467, - { + }, + { + "key": "collection/5/coll/57", + "version": 467, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/58", - 468, - { + }, + { + "key": "collection/5/coll/58", + "version": 468, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/59", - 469, - { + }, + { + "key": "collection/5/coll/59", + "version": 469, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/60", - 470, - { + }, + { + "key": "collection/5/coll/60", + "version": 470, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/61", - 471, - { + }, + { + "key": "collection/5/coll/61", + "version": 471, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/62", - 472, - { + }, + { + "key": "collection/5/coll/62", + "version": 472, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/63", - 473, - { + }, + { + "key": "collection/5/coll/63", + "version": 473, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/64", - 474, - { + }, + { + "key": "collection/5/coll/64", + "version": 474, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/65", - 475, - { + }, + { + "key": "collection/5/coll/65", + "version": 475, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/66", - 476, - { + }, + { + "key": "collection/5/coll/66", + "version": 476, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/67", - 477, - { + }, + { + "key": "collection/5/coll/67", + "version": 477, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/68", - 478, - { + }, + { + "key": "collection/5/coll/68", + "version": 478, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/69", - 479, - { + }, + { + "key": "collection/5/coll/69", + "version": 479, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/70", - 480, - { + }, + { + "key": "collection/5/coll/70", + "version": 480, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/71", - 481, - { + }, + { + "key": "collection/5/coll/71", + "version": 481, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/72", - 482, - { + }, + { + "key": "collection/5/coll/72", + "version": 482, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/73", - 483, - { + }, + { + "key": "collection/5/coll/73", + "version": 483, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/74", - 484, - { + }, + { + "key": "collection/5/coll/74", + "version": 484, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/75", - 485, - { + }, + { + "key": "collection/5/coll/75", + "version": 485, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/76", - 486, - { + }, + { + "key": "collection/5/coll/76", + "version": 486, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/77", - 487, - { + }, + { + "key": "collection/5/coll/77", + "version": 487, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/78", - 488, - { + }, + { + "key": "collection/5/coll/78", + "version": 488, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/79", - 489, - { + }, + { + "key": "collection/5/coll/79", + "version": 489, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/80", - 490, - { + }, + { + "key": "collection/5/coll/80", + "version": 490, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/81", - 491, - { + }, + { + "key": "collection/5/coll/81", + "version": 491, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/82", - 492, - { + }, + { + "key": "collection/5/coll/82", + "version": 492, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/83", - 493, - { + }, + { + "key": "collection/5/coll/83", + "version": 493, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/84", - 494, - { + }, + { + "key": "collection/5/coll/84", + "version": 494, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/85", - 495, - { + }, + { + "key": "collection/5/coll/85", + "version": 495, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/86", - 496, - { + }, + { + "key": "collection/5/coll/86", + "version": 496, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/87", - 497, - { + }, + { + "key": "collection/5/coll/87", + "version": 497, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/88", - 498, - { + }, + { + "key": "collection/5/coll/88", + "version": 498, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/89", - 499, - { + }, + { + "key": "collection/5/coll/89", + "version": 499, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/90", - 500, - { + }, + { + "key": "collection/5/coll/90", + "version": 500, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/91", - 501, - { + }, + { + "key": "collection/5/coll/91", + "version": 501, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/92", - 502, - { + }, + { + "key": "collection/5/coll/92", + "version": 502, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/93", - 503, - { + }, + { + "key": "collection/5/coll/93", + "version": 503, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/94", - 504, - { + }, + { + "key": "collection/5/coll/94", + "version": 504, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/95", - 505, - { + }, + { + "key": "collection/5/coll/95", + "version": 505, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/96", - 506, - { + }, + { + "key": "collection/5/coll/96", + "version": 506, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/97", - 507, - { + }, + { + "key": "collection/5/coll/97", + "version": 507, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/98", - 508, - { + }, + { + "key": "collection/5/coll/98", + "version": 508, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/5/coll/99", - 509, - { + }, + { + "key": "collection/5/coll/99", + "version": 509, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -38346,7 +55618,8 @@ }, { "watchSnapshot": { - "version": 511 + "version": 511, + "targetIds": [] }, "expect": [ { @@ -38431,706 +55704,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/6/coll/0", - 512, - { + { + "key": "collection/6/coll/0", + "version": 512, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/1", - 513, - { + }, + { + "key": "collection/6/coll/1", + "version": 513, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/2", - 514, - { + }, + { + "key": "collection/6/coll/2", + "version": 514, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/3", - 515, - { + }, + { + "key": "collection/6/coll/3", + "version": 515, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/4", - 516, - { + }, + { + "key": "collection/6/coll/4", + "version": 516, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/5", - 517, - { + }, + { + "key": "collection/6/coll/5", + "version": 517, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/6", - 518, - { + }, + { + "key": "collection/6/coll/6", + "version": 518, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/7", - 519, - { + }, + { + "key": "collection/6/coll/7", + "version": 519, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/8", - 520, - { + }, + { + "key": "collection/6/coll/8", + "version": 520, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/9", - 521, - { + }, + { + "key": "collection/6/coll/9", + "version": 521, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/10", - 522, - { + }, + { + "key": "collection/6/coll/10", + "version": 522, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/11", - 523, - { + }, + { + "key": "collection/6/coll/11", + "version": 523, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/12", - 524, - { + }, + { + "key": "collection/6/coll/12", + "version": 524, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/13", - 525, - { + }, + { + "key": "collection/6/coll/13", + "version": 525, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/14", - 526, - { + }, + { + "key": "collection/6/coll/14", + "version": 526, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/15", - 527, - { + }, + { + "key": "collection/6/coll/15", + "version": 527, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/16", - 528, - { + }, + { + "key": "collection/6/coll/16", + "version": 528, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/17", - 529, - { + }, + { + "key": "collection/6/coll/17", + "version": 529, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/18", - 530, - { + }, + { + "key": "collection/6/coll/18", + "version": 530, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/19", - 531, - { + }, + { + "key": "collection/6/coll/19", + "version": 531, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/20", - 532, - { + }, + { + "key": "collection/6/coll/20", + "version": 532, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/21", - 533, - { + }, + { + "key": "collection/6/coll/21", + "version": 533, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/22", - 534, - { + }, + { + "key": "collection/6/coll/22", + "version": 534, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/23", - 535, - { + }, + { + "key": "collection/6/coll/23", + "version": 535, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/24", - 536, - { + }, + { + "key": "collection/6/coll/24", + "version": 536, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/25", - 537, - { + }, + { + "key": "collection/6/coll/25", + "version": 537, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/26", - 538, - { + }, + { + "key": "collection/6/coll/26", + "version": 538, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/27", - 539, - { + }, + { + "key": "collection/6/coll/27", + "version": 539, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/28", - 540, - { + }, + { + "key": "collection/6/coll/28", + "version": 540, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/29", - 541, - { + }, + { + "key": "collection/6/coll/29", + "version": 541, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/30", - 542, - { + }, + { + "key": "collection/6/coll/30", + "version": 542, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/31", - 543, - { + }, + { + "key": "collection/6/coll/31", + "version": 543, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/32", - 544, - { + }, + { + "key": "collection/6/coll/32", + "version": 544, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/33", - 545, - { + }, + { + "key": "collection/6/coll/33", + "version": 545, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/34", - 546, - { + }, + { + "key": "collection/6/coll/34", + "version": 546, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/35", - 547, - { + }, + { + "key": "collection/6/coll/35", + "version": 547, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/36", - 548, - { + }, + { + "key": "collection/6/coll/36", + "version": 548, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/37", - 549, - { + }, + { + "key": "collection/6/coll/37", + "version": 549, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/38", - 550, - { + }, + { + "key": "collection/6/coll/38", + "version": 550, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/39", - 551, - { + }, + { + "key": "collection/6/coll/39", + "version": 551, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/40", - 552, - { + }, + { + "key": "collection/6/coll/40", + "version": 552, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/41", - 553, - { + }, + { + "key": "collection/6/coll/41", + "version": 553, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/42", - 554, - { + }, + { + "key": "collection/6/coll/42", + "version": 554, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/43", - 555, - { + }, + { + "key": "collection/6/coll/43", + "version": 555, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/44", - 556, - { + }, + { + "key": "collection/6/coll/44", + "version": 556, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/45", - 557, - { + }, + { + "key": "collection/6/coll/45", + "version": 557, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/46", - 558, - { + }, + { + "key": "collection/6/coll/46", + "version": 558, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/47", - 559, - { + }, + { + "key": "collection/6/coll/47", + "version": 559, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/48", - 560, - { + }, + { + "key": "collection/6/coll/48", + "version": 560, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/49", - 561, - { + }, + { + "key": "collection/6/coll/49", + "version": 561, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/50", - 562, - { + }, + { + "key": "collection/6/coll/50", + "version": 562, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/51", - 563, - { + }, + { + "key": "collection/6/coll/51", + "version": 563, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/52", - 564, - { + }, + { + "key": "collection/6/coll/52", + "version": 564, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/53", - 565, - { + }, + { + "key": "collection/6/coll/53", + "version": 565, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/54", - 566, - { + }, + { + "key": "collection/6/coll/54", + "version": 566, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/55", - 567, - { + }, + { + "key": "collection/6/coll/55", + "version": 567, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/56", - 568, - { + }, + { + "key": "collection/6/coll/56", + "version": 568, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/57", - 569, - { + }, + { + "key": "collection/6/coll/57", + "version": 569, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/58", - 570, - { + }, + { + "key": "collection/6/coll/58", + "version": 570, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/59", - 571, - { + }, + { + "key": "collection/6/coll/59", + "version": 571, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/60", - 572, - { + }, + { + "key": "collection/6/coll/60", + "version": 572, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/61", - 573, - { + }, + { + "key": "collection/6/coll/61", + "version": 573, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/62", - 574, - { + }, + { + "key": "collection/6/coll/62", + "version": 574, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/63", - 575, - { + }, + { + "key": "collection/6/coll/63", + "version": 575, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/64", - 576, - { + }, + { + "key": "collection/6/coll/64", + "version": 576, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/65", - 577, - { + }, + { + "key": "collection/6/coll/65", + "version": 577, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/66", - 578, - { + }, + { + "key": "collection/6/coll/66", + "version": 578, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/67", - 579, - { + }, + { + "key": "collection/6/coll/67", + "version": 579, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/68", - 580, - { + }, + { + "key": "collection/6/coll/68", + "version": 580, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/69", - 581, - { + }, + { + "key": "collection/6/coll/69", + "version": 581, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/70", - 582, - { + }, + { + "key": "collection/6/coll/70", + "version": 582, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/71", - 583, - { + }, + { + "key": "collection/6/coll/71", + "version": 583, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/72", - 584, - { + }, + { + "key": "collection/6/coll/72", + "version": 584, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/73", - 585, - { + }, + { + "key": "collection/6/coll/73", + "version": 585, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/74", - 586, - { + }, + { + "key": "collection/6/coll/74", + "version": 586, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/75", - 587, - { + }, + { + "key": "collection/6/coll/75", + "version": 587, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/76", - 588, - { + }, + { + "key": "collection/6/coll/76", + "version": 588, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/77", - 589, - { + }, + { + "key": "collection/6/coll/77", + "version": 589, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/78", - 590, - { + }, + { + "key": "collection/6/coll/78", + "version": 590, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/79", - 591, - { + }, + { + "key": "collection/6/coll/79", + "version": 591, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/80", - 592, - { + }, + { + "key": "collection/6/coll/80", + "version": 592, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/81", - 593, - { + }, + { + "key": "collection/6/coll/81", + "version": 593, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/82", - 594, - { + }, + { + "key": "collection/6/coll/82", + "version": 594, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/83", - 595, - { + }, + { + "key": "collection/6/coll/83", + "version": 595, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/84", - 596, - { + }, + { + "key": "collection/6/coll/84", + "version": 596, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/85", - 597, - { + }, + { + "key": "collection/6/coll/85", + "version": 597, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/86", - 598, - { + }, + { + "key": "collection/6/coll/86", + "version": 598, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/87", - 599, - { + }, + { + "key": "collection/6/coll/87", + "version": 599, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/88", - 600, - { + }, + { + "key": "collection/6/coll/88", + "version": 600, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/89", - 601, - { + }, + { + "key": "collection/6/coll/89", + "version": 601, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/90", - 602, - { + }, + { + "key": "collection/6/coll/90", + "version": 602, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/91", - 603, - { + }, + { + "key": "collection/6/coll/91", + "version": 603, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/92", - 604, - { + }, + { + "key": "collection/6/coll/92", + "version": 604, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/93", - 605, - { + }, + { + "key": "collection/6/coll/93", + "version": 605, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/94", - 606, - { + }, + { + "key": "collection/6/coll/94", + "version": 606, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/95", - 607, - { + }, + { + "key": "collection/6/coll/95", + "version": 607, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/96", - 608, - { + }, + { + "key": "collection/6/coll/96", + "version": 608, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/97", - 609, - { + }, + { + "key": "collection/6/coll/97", + "version": 609, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/98", - 610, - { + }, + { + "key": "collection/6/coll/98", + "version": 610, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/99", - 611, - { + }, + { + "key": "collection/6/coll/99", + "version": 611, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 12 @@ -39147,7 +56820,8 @@ }, { "watchSnapshot": { - "version": 612 + "version": 612, + "targetIds": [] }, "expect": [ { @@ -39162,706 +56836,1106 @@ ] }, "added": [ - [ - "collection/6/coll/0", - 512, - { + { + "key": "collection/6/coll/0", + "version": 512, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/1", - 513, - { + }, + { + "key": "collection/6/coll/1", + "version": 513, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/2", - 514, - { + }, + { + "key": "collection/6/coll/2", + "version": 514, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/3", - 515, - { + }, + { + "key": "collection/6/coll/3", + "version": 515, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/4", - 516, - { + }, + { + "key": "collection/6/coll/4", + "version": 516, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/5", - 517, - { + }, + { + "key": "collection/6/coll/5", + "version": 517, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/6", - 518, - { + }, + { + "key": "collection/6/coll/6", + "version": 518, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/7", - 519, - { + }, + { + "key": "collection/6/coll/7", + "version": 519, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/8", - 520, - { + }, + { + "key": "collection/6/coll/8", + "version": 520, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/9", - 521, - { + }, + { + "key": "collection/6/coll/9", + "version": 521, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/10", - 522, - { + }, + { + "key": "collection/6/coll/10", + "version": 522, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/11", - 523, - { + }, + { + "key": "collection/6/coll/11", + "version": 523, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/12", - 524, - { + }, + { + "key": "collection/6/coll/12", + "version": 524, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/13", - 525, - { + }, + { + "key": "collection/6/coll/13", + "version": 525, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/14", - 526, - { + }, + { + "key": "collection/6/coll/14", + "version": 526, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/15", - 527, - { + }, + { + "key": "collection/6/coll/15", + "version": 527, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/16", - 528, - { + }, + { + "key": "collection/6/coll/16", + "version": 528, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/17", - 529, - { + }, + { + "key": "collection/6/coll/17", + "version": 529, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/18", - 530, - { + }, + { + "key": "collection/6/coll/18", + "version": 530, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/19", - 531, - { + }, + { + "key": "collection/6/coll/19", + "version": 531, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/20", - 532, - { + }, + { + "key": "collection/6/coll/20", + "version": 532, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/21", - 533, - { + }, + { + "key": "collection/6/coll/21", + "version": 533, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/22", - 534, - { + }, + { + "key": "collection/6/coll/22", + "version": 534, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/23", - 535, - { + }, + { + "key": "collection/6/coll/23", + "version": 535, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/24", - 536, - { + }, + { + "key": "collection/6/coll/24", + "version": 536, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/25", - 537, - { + }, + { + "key": "collection/6/coll/25", + "version": 537, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/26", - 538, - { + }, + { + "key": "collection/6/coll/26", + "version": 538, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/27", - 539, - { + }, + { + "key": "collection/6/coll/27", + "version": 539, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/28", - 540, - { + }, + { + "key": "collection/6/coll/28", + "version": 540, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/29", - 541, - { + }, + { + "key": "collection/6/coll/29", + "version": 541, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/30", - 542, - { + }, + { + "key": "collection/6/coll/30", + "version": 542, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/31", - 543, - { + }, + { + "key": "collection/6/coll/31", + "version": 543, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/32", - 544, - { + }, + { + "key": "collection/6/coll/32", + "version": 544, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/33", - 545, - { + }, + { + "key": "collection/6/coll/33", + "version": 545, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/34", - 546, - { + }, + { + "key": "collection/6/coll/34", + "version": 546, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/35", - 547, - { + }, + { + "key": "collection/6/coll/35", + "version": 547, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/36", - 548, - { + }, + { + "key": "collection/6/coll/36", + "version": 548, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/37", - 549, - { + }, + { + "key": "collection/6/coll/37", + "version": 549, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/38", - 550, - { + }, + { + "key": "collection/6/coll/38", + "version": 550, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/39", - 551, - { + }, + { + "key": "collection/6/coll/39", + "version": 551, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/40", - 552, - { + }, + { + "key": "collection/6/coll/40", + "version": 552, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/41", - 553, - { + }, + { + "key": "collection/6/coll/41", + "version": 553, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/42", - 554, - { + }, + { + "key": "collection/6/coll/42", + "version": 554, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/43", - 555, - { + }, + { + "key": "collection/6/coll/43", + "version": 555, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/44", - 556, - { + }, + { + "key": "collection/6/coll/44", + "version": 556, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/45", - 557, - { + }, + { + "key": "collection/6/coll/45", + "version": 557, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/46", - 558, - { + }, + { + "key": "collection/6/coll/46", + "version": 558, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/47", - 559, - { + }, + { + "key": "collection/6/coll/47", + "version": 559, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/48", - 560, - { + }, + { + "key": "collection/6/coll/48", + "version": 560, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/49", - 561, - { + }, + { + "key": "collection/6/coll/49", + "version": 561, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/50", - 562, - { + }, + { + "key": "collection/6/coll/50", + "version": 562, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/51", - 563, - { + }, + { + "key": "collection/6/coll/51", + "version": 563, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/52", - 564, - { + }, + { + "key": "collection/6/coll/52", + "version": 564, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/53", - 565, - { + }, + { + "key": "collection/6/coll/53", + "version": 565, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/54", - 566, - { + }, + { + "key": "collection/6/coll/54", + "version": 566, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/55", - 567, - { + }, + { + "key": "collection/6/coll/55", + "version": 567, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/56", - 568, - { + }, + { + "key": "collection/6/coll/56", + "version": 568, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/57", - 569, - { + }, + { + "key": "collection/6/coll/57", + "version": 569, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/58", - 570, - { + }, + { + "key": "collection/6/coll/58", + "version": 570, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/59", - 571, - { + }, + { + "key": "collection/6/coll/59", + "version": 571, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/60", - 572, - { + }, + { + "key": "collection/6/coll/60", + "version": 572, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/61", - 573, - { + }, + { + "key": "collection/6/coll/61", + "version": 573, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/62", - 574, - { + }, + { + "key": "collection/6/coll/62", + "version": 574, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/63", - 575, - { + }, + { + "key": "collection/6/coll/63", + "version": 575, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/64", - 576, - { + }, + { + "key": "collection/6/coll/64", + "version": 576, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/65", - 577, - { + }, + { + "key": "collection/6/coll/65", + "version": 577, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/66", - 578, - { + }, + { + "key": "collection/6/coll/66", + "version": 578, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/67", - 579, - { + }, + { + "key": "collection/6/coll/67", + "version": 579, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/68", - 580, - { + }, + { + "key": "collection/6/coll/68", + "version": 580, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/69", - 581, - { + }, + { + "key": "collection/6/coll/69", + "version": 581, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/70", - 582, - { + }, + { + "key": "collection/6/coll/70", + "version": 582, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/71", - 583, - { + }, + { + "key": "collection/6/coll/71", + "version": 583, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/72", - 584, - { + }, + { + "key": "collection/6/coll/72", + "version": 584, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/73", - 585, - { + }, + { + "key": "collection/6/coll/73", + "version": 585, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/74", - 586, - { + }, + { + "key": "collection/6/coll/74", + "version": 586, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/75", - 587, - { + }, + { + "key": "collection/6/coll/75", + "version": 587, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/76", - 588, - { + }, + { + "key": "collection/6/coll/76", + "version": 588, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/77", - 589, - { + }, + { + "key": "collection/6/coll/77", + "version": 589, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/78", - 590, - { + }, + { + "key": "collection/6/coll/78", + "version": 590, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/79", - 591, - { + }, + { + "key": "collection/6/coll/79", + "version": 591, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/80", - 592, - { + }, + { + "key": "collection/6/coll/80", + "version": 592, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/81", - 593, - { + }, + { + "key": "collection/6/coll/81", + "version": 593, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/82", - 594, - { + }, + { + "key": "collection/6/coll/82", + "version": 594, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/83", - 595, - { + }, + { + "key": "collection/6/coll/83", + "version": 595, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/84", - 596, - { + }, + { + "key": "collection/6/coll/84", + "version": 596, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/85", - 597, - { + }, + { + "key": "collection/6/coll/85", + "version": 597, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/86", - 598, - { + }, + { + "key": "collection/6/coll/86", + "version": 598, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/87", - 599, - { + }, + { + "key": "collection/6/coll/87", + "version": 599, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/88", - 600, - { + }, + { + "key": "collection/6/coll/88", + "version": 600, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/89", - 601, - { + }, + { + "key": "collection/6/coll/89", + "version": 601, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/90", - 602, - { + }, + { + "key": "collection/6/coll/90", + "version": 602, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/91", - 603, - { + }, + { + "key": "collection/6/coll/91", + "version": 603, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/92", - 604, - { + }, + { + "key": "collection/6/coll/92", + "version": 604, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/93", - 605, - { + }, + { + "key": "collection/6/coll/93", + "version": 605, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/94", - 606, - { + }, + { + "key": "collection/6/coll/94", + "version": 606, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/95", - 607, - { + }, + { + "key": "collection/6/coll/95", + "version": 607, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/96", - 608, - { + }, + { + "key": "collection/6/coll/96", + "version": 608, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/97", - 609, - { + }, + { + "key": "collection/6/coll/97", + "version": 609, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/98", - 610, - { + }, + { + "key": "collection/6/coll/98", + "version": 610, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/99", - 611, - { + }, + { + "key": "collection/6/coll/99", + "version": 611, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -39938,706 +58012,1106 @@ ] }, "added": [ - [ - "collection/6/coll/0", - 512, - { + { + "key": "collection/6/coll/0", + "version": 512, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/1", - 513, - { + }, + { + "key": "collection/6/coll/1", + "version": 513, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/2", - 514, - { + }, + { + "key": "collection/6/coll/2", + "version": 514, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/3", - 515, - { + }, + { + "key": "collection/6/coll/3", + "version": 515, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/4", - 516, - { + }, + { + "key": "collection/6/coll/4", + "version": 516, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/5", - 517, - { + }, + { + "key": "collection/6/coll/5", + "version": 517, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/6", - 518, - { + }, + { + "key": "collection/6/coll/6", + "version": 518, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/7", - 519, - { + }, + { + "key": "collection/6/coll/7", + "version": 519, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/8", - 520, - { + }, + { + "key": "collection/6/coll/8", + "version": 520, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/9", - 521, - { + }, + { + "key": "collection/6/coll/9", + "version": 521, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/10", - 522, - { + }, + { + "key": "collection/6/coll/10", + "version": 522, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/11", - 523, - { + }, + { + "key": "collection/6/coll/11", + "version": 523, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/12", - 524, - { + }, + { + "key": "collection/6/coll/12", + "version": 524, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/13", - 525, - { + }, + { + "key": "collection/6/coll/13", + "version": 525, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/14", - 526, - { + }, + { + "key": "collection/6/coll/14", + "version": 526, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/15", - 527, - { + }, + { + "key": "collection/6/coll/15", + "version": 527, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/16", - 528, - { + }, + { + "key": "collection/6/coll/16", + "version": 528, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/17", - 529, - { + }, + { + "key": "collection/6/coll/17", + "version": 529, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/18", - 530, - { + }, + { + "key": "collection/6/coll/18", + "version": 530, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/19", - 531, - { + }, + { + "key": "collection/6/coll/19", + "version": 531, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/20", - 532, - { + }, + { + "key": "collection/6/coll/20", + "version": 532, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/21", - 533, - { + }, + { + "key": "collection/6/coll/21", + "version": 533, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/22", - 534, - { + }, + { + "key": "collection/6/coll/22", + "version": 534, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/23", - 535, - { + }, + { + "key": "collection/6/coll/23", + "version": 535, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/24", - 536, - { + }, + { + "key": "collection/6/coll/24", + "version": 536, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/25", - 537, - { + }, + { + "key": "collection/6/coll/25", + "version": 537, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/26", - 538, - { + }, + { + "key": "collection/6/coll/26", + "version": 538, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/27", - 539, - { + }, + { + "key": "collection/6/coll/27", + "version": 539, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/28", - 540, - { + }, + { + "key": "collection/6/coll/28", + "version": 540, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/29", - 541, - { + }, + { + "key": "collection/6/coll/29", + "version": 541, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/30", - 542, - { + }, + { + "key": "collection/6/coll/30", + "version": 542, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/31", - 543, - { + }, + { + "key": "collection/6/coll/31", + "version": 543, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/32", - 544, - { + }, + { + "key": "collection/6/coll/32", + "version": 544, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/33", - 545, - { + }, + { + "key": "collection/6/coll/33", + "version": 545, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/34", - 546, - { + }, + { + "key": "collection/6/coll/34", + "version": 546, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/35", - 547, - { + }, + { + "key": "collection/6/coll/35", + "version": 547, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/36", - 548, - { + }, + { + "key": "collection/6/coll/36", + "version": 548, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/37", - 549, - { + }, + { + "key": "collection/6/coll/37", + "version": 549, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/38", - 550, - { + }, + { + "key": "collection/6/coll/38", + "version": 550, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/39", - 551, - { + }, + { + "key": "collection/6/coll/39", + "version": 551, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/40", - 552, - { + }, + { + "key": "collection/6/coll/40", + "version": 552, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/41", - 553, - { + }, + { + "key": "collection/6/coll/41", + "version": 553, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/42", - 554, - { + }, + { + "key": "collection/6/coll/42", + "version": 554, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/43", - 555, - { + }, + { + "key": "collection/6/coll/43", + "version": 555, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/44", - 556, - { + }, + { + "key": "collection/6/coll/44", + "version": 556, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/45", - 557, - { + }, + { + "key": "collection/6/coll/45", + "version": 557, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/46", - 558, - { + }, + { + "key": "collection/6/coll/46", + "version": 558, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/47", - 559, - { + }, + { + "key": "collection/6/coll/47", + "version": 559, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/48", - 560, - { + }, + { + "key": "collection/6/coll/48", + "version": 560, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/49", - 561, - { + }, + { + "key": "collection/6/coll/49", + "version": 561, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/50", - 562, - { + }, + { + "key": "collection/6/coll/50", + "version": 562, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/51", - 563, - { + }, + { + "key": "collection/6/coll/51", + "version": 563, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/52", - 564, - { + }, + { + "key": "collection/6/coll/52", + "version": 564, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/53", - 565, - { + }, + { + "key": "collection/6/coll/53", + "version": 565, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/54", - 566, - { + }, + { + "key": "collection/6/coll/54", + "version": 566, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/55", - 567, - { + }, + { + "key": "collection/6/coll/55", + "version": 567, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/56", - 568, - { + }, + { + "key": "collection/6/coll/56", + "version": 568, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/57", - 569, - { + }, + { + "key": "collection/6/coll/57", + "version": 569, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/58", - 570, - { + }, + { + "key": "collection/6/coll/58", + "version": 570, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/59", - 571, - { + }, + { + "key": "collection/6/coll/59", + "version": 571, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/60", - 572, - { + }, + { + "key": "collection/6/coll/60", + "version": 572, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/61", - 573, - { + }, + { + "key": "collection/6/coll/61", + "version": 573, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/62", - 574, - { + }, + { + "key": "collection/6/coll/62", + "version": 574, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/63", - 575, - { + }, + { + "key": "collection/6/coll/63", + "version": 575, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/64", - 576, - { + }, + { + "key": "collection/6/coll/64", + "version": 576, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/65", - 577, - { + }, + { + "key": "collection/6/coll/65", + "version": 577, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/66", - 578, - { + }, + { + "key": "collection/6/coll/66", + "version": 578, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/67", - 579, - { + }, + { + "key": "collection/6/coll/67", + "version": 579, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/68", - 580, - { + }, + { + "key": "collection/6/coll/68", + "version": 580, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/69", - 581, - { + }, + { + "key": "collection/6/coll/69", + "version": 581, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/70", - 582, - { + }, + { + "key": "collection/6/coll/70", + "version": 582, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/71", - 583, - { + }, + { + "key": "collection/6/coll/71", + "version": 583, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/72", - 584, - { + }, + { + "key": "collection/6/coll/72", + "version": 584, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/73", - 585, - { + }, + { + "key": "collection/6/coll/73", + "version": 585, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/74", - 586, - { + }, + { + "key": "collection/6/coll/74", + "version": 586, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/75", - 587, - { + }, + { + "key": "collection/6/coll/75", + "version": 587, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/76", - 588, - { + }, + { + "key": "collection/6/coll/76", + "version": 588, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/77", - 589, - { + }, + { + "key": "collection/6/coll/77", + "version": 589, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/78", - 590, - { + }, + { + "key": "collection/6/coll/78", + "version": 590, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/79", - 591, - { + }, + { + "key": "collection/6/coll/79", + "version": 591, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/80", - 592, - { + }, + { + "key": "collection/6/coll/80", + "version": 592, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/81", - 593, - { + }, + { + "key": "collection/6/coll/81", + "version": 593, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/82", - 594, - { + }, + { + "key": "collection/6/coll/82", + "version": 594, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/83", - 595, - { + }, + { + "key": "collection/6/coll/83", + "version": 595, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/84", - 596, - { + }, + { + "key": "collection/6/coll/84", + "version": 596, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/85", - 597, - { + }, + { + "key": "collection/6/coll/85", + "version": 597, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/86", - 598, - { + }, + { + "key": "collection/6/coll/86", + "version": 598, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/87", - 599, - { + }, + { + "key": "collection/6/coll/87", + "version": 599, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/88", - 600, - { + }, + { + "key": "collection/6/coll/88", + "version": 600, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/89", - 601, - { + }, + { + "key": "collection/6/coll/89", + "version": 601, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/90", - 602, - { + }, + { + "key": "collection/6/coll/90", + "version": 602, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/91", - 603, - { + }, + { + "key": "collection/6/coll/91", + "version": 603, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/92", - 604, - { + }, + { + "key": "collection/6/coll/92", + "version": 604, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/93", - 605, - { + }, + { + "key": "collection/6/coll/93", + "version": 605, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/94", - 606, - { + }, + { + "key": "collection/6/coll/94", + "version": 606, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/95", - 607, - { + }, + { + "key": "collection/6/coll/95", + "version": 607, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/96", - 608, - { + }, + { + "key": "collection/6/coll/96", + "version": 608, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/97", - 609, - { + }, + { + "key": "collection/6/coll/97", + "version": 609, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/98", - 610, - { + }, + { + "key": "collection/6/coll/98", + "version": 610, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/6/coll/99", - 611, - { + }, + { + "key": "collection/6/coll/99", + "version": 611, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -40668,7 +59142,8 @@ }, { "watchSnapshot": { - "version": 613 + "version": 613, + "targetIds": [] }, "expect": [ { @@ -40753,706 +59228,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/7/coll/0", - 614, - { + { + "key": "collection/7/coll/0", + "version": 614, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/1", - 615, - { + }, + { + "key": "collection/7/coll/1", + "version": 615, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/2", - 616, - { + }, + { + "key": "collection/7/coll/2", + "version": 616, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/3", - 617, - { + }, + { + "key": "collection/7/coll/3", + "version": 617, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/4", - 618, - { + }, + { + "key": "collection/7/coll/4", + "version": 618, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/5", - 619, - { + }, + { + "key": "collection/7/coll/5", + "version": 619, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/6", - 620, - { + }, + { + "key": "collection/7/coll/6", + "version": 620, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/7", - 621, - { + }, + { + "key": "collection/7/coll/7", + "version": 621, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/8", - 622, - { + }, + { + "key": "collection/7/coll/8", + "version": 622, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/9", - 623, - { + }, + { + "key": "collection/7/coll/9", + "version": 623, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/10", - 624, - { + }, + { + "key": "collection/7/coll/10", + "version": 624, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/11", - 625, - { + }, + { + "key": "collection/7/coll/11", + "version": 625, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/12", - 626, - { + }, + { + "key": "collection/7/coll/12", + "version": 626, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/13", - 627, - { + }, + { + "key": "collection/7/coll/13", + "version": 627, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/14", - 628, - { + }, + { + "key": "collection/7/coll/14", + "version": 628, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/15", - 629, - { + }, + { + "key": "collection/7/coll/15", + "version": 629, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/16", - 630, - { + }, + { + "key": "collection/7/coll/16", + "version": 630, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/17", - 631, - { + }, + { + "key": "collection/7/coll/17", + "version": 631, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/18", - 632, - { + }, + { + "key": "collection/7/coll/18", + "version": 632, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/19", - 633, - { + }, + { + "key": "collection/7/coll/19", + "version": 633, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/20", - 634, - { + }, + { + "key": "collection/7/coll/20", + "version": 634, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/21", - 635, - { + }, + { + "key": "collection/7/coll/21", + "version": 635, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/22", - 636, - { + }, + { + "key": "collection/7/coll/22", + "version": 636, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/23", - 637, - { + }, + { + "key": "collection/7/coll/23", + "version": 637, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/24", - 638, - { + }, + { + "key": "collection/7/coll/24", + "version": 638, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/25", - 639, - { + }, + { + "key": "collection/7/coll/25", + "version": 639, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/26", - 640, - { + }, + { + "key": "collection/7/coll/26", + "version": 640, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/27", - 641, - { + }, + { + "key": "collection/7/coll/27", + "version": 641, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/28", - 642, - { + }, + { + "key": "collection/7/coll/28", + "version": 642, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/29", - 643, - { + }, + { + "key": "collection/7/coll/29", + "version": 643, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/30", - 644, - { + }, + { + "key": "collection/7/coll/30", + "version": 644, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/31", - 645, - { + }, + { + "key": "collection/7/coll/31", + "version": 645, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/32", - 646, - { + }, + { + "key": "collection/7/coll/32", + "version": 646, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/33", - 647, - { + }, + { + "key": "collection/7/coll/33", + "version": 647, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/34", - 648, - { + }, + { + "key": "collection/7/coll/34", + "version": 648, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/35", - 649, - { + }, + { + "key": "collection/7/coll/35", + "version": 649, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/36", - 650, - { + }, + { + "key": "collection/7/coll/36", + "version": 650, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/37", - 651, - { + }, + { + "key": "collection/7/coll/37", + "version": 651, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/38", - 652, - { + }, + { + "key": "collection/7/coll/38", + "version": 652, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/39", - 653, - { + }, + { + "key": "collection/7/coll/39", + "version": 653, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/40", - 654, - { + }, + { + "key": "collection/7/coll/40", + "version": 654, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/41", - 655, - { + }, + { + "key": "collection/7/coll/41", + "version": 655, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/42", - 656, - { + }, + { + "key": "collection/7/coll/42", + "version": 656, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/43", - 657, - { + }, + { + "key": "collection/7/coll/43", + "version": 657, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/44", - 658, - { + }, + { + "key": "collection/7/coll/44", + "version": 658, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/45", - 659, - { + }, + { + "key": "collection/7/coll/45", + "version": 659, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/46", - 660, - { + }, + { + "key": "collection/7/coll/46", + "version": 660, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/47", - 661, - { + }, + { + "key": "collection/7/coll/47", + "version": 661, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/48", - 662, - { + }, + { + "key": "collection/7/coll/48", + "version": 662, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/49", - 663, - { + }, + { + "key": "collection/7/coll/49", + "version": 663, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/50", - 664, - { + }, + { + "key": "collection/7/coll/50", + "version": 664, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/51", - 665, - { + }, + { + "key": "collection/7/coll/51", + "version": 665, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/52", - 666, - { + }, + { + "key": "collection/7/coll/52", + "version": 666, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/53", - 667, - { + }, + { + "key": "collection/7/coll/53", + "version": 667, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/54", - 668, - { + }, + { + "key": "collection/7/coll/54", + "version": 668, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/55", - 669, - { + }, + { + "key": "collection/7/coll/55", + "version": 669, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/56", - 670, - { + }, + { + "key": "collection/7/coll/56", + "version": 670, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/57", - 671, - { + }, + { + "key": "collection/7/coll/57", + "version": 671, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/58", - 672, - { + }, + { + "key": "collection/7/coll/58", + "version": 672, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/59", - 673, - { + }, + { + "key": "collection/7/coll/59", + "version": 673, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/60", - 674, - { + }, + { + "key": "collection/7/coll/60", + "version": 674, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/61", - 675, - { + }, + { + "key": "collection/7/coll/61", + "version": 675, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/62", - 676, - { + }, + { + "key": "collection/7/coll/62", + "version": 676, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/63", - 677, - { + }, + { + "key": "collection/7/coll/63", + "version": 677, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/64", - 678, - { + }, + { + "key": "collection/7/coll/64", + "version": 678, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/65", - 679, - { + }, + { + "key": "collection/7/coll/65", + "version": 679, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/66", - 680, - { + }, + { + "key": "collection/7/coll/66", + "version": 680, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/67", - 681, - { + }, + { + "key": "collection/7/coll/67", + "version": 681, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/68", - 682, - { + }, + { + "key": "collection/7/coll/68", + "version": 682, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/69", - 683, - { + }, + { + "key": "collection/7/coll/69", + "version": 683, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/70", - 684, - { + }, + { + "key": "collection/7/coll/70", + "version": 684, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/71", - 685, - { + }, + { + "key": "collection/7/coll/71", + "version": 685, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/72", - 686, - { + }, + { + "key": "collection/7/coll/72", + "version": 686, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/73", - 687, - { + }, + { + "key": "collection/7/coll/73", + "version": 687, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/74", - 688, - { + }, + { + "key": "collection/7/coll/74", + "version": 688, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/75", - 689, - { + }, + { + "key": "collection/7/coll/75", + "version": 689, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/76", - 690, - { + }, + { + "key": "collection/7/coll/76", + "version": 690, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/77", - 691, - { + }, + { + "key": "collection/7/coll/77", + "version": 691, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/78", - 692, - { + }, + { + "key": "collection/7/coll/78", + "version": 692, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/79", - 693, - { + }, + { + "key": "collection/7/coll/79", + "version": 693, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/80", - 694, - { + }, + { + "key": "collection/7/coll/80", + "version": 694, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/81", - 695, - { + }, + { + "key": "collection/7/coll/81", + "version": 695, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/82", - 696, - { + }, + { + "key": "collection/7/coll/82", + "version": 696, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/83", - 697, - { + }, + { + "key": "collection/7/coll/83", + "version": 697, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/84", - 698, - { + }, + { + "key": "collection/7/coll/84", + "version": 698, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/85", - 699, - { + }, + { + "key": "collection/7/coll/85", + "version": 699, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/86", - 700, - { + }, + { + "key": "collection/7/coll/86", + "version": 700, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/87", - 701, - { + }, + { + "key": "collection/7/coll/87", + "version": 701, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/88", - 702, - { + }, + { + "key": "collection/7/coll/88", + "version": 702, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/89", - 703, - { + }, + { + "key": "collection/7/coll/89", + "version": 703, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/90", - 704, - { + }, + { + "key": "collection/7/coll/90", + "version": 704, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/91", - 705, - { + }, + { + "key": "collection/7/coll/91", + "version": 705, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/92", - 706, - { + }, + { + "key": "collection/7/coll/92", + "version": 706, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/93", - 707, - { + }, + { + "key": "collection/7/coll/93", + "version": 707, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/94", - 708, - { + }, + { + "key": "collection/7/coll/94", + "version": 708, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/95", - 709, - { + }, + { + "key": "collection/7/coll/95", + "version": 709, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/96", - 710, - { + }, + { + "key": "collection/7/coll/96", + "version": 710, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/97", - 711, - { + }, + { + "key": "collection/7/coll/97", + "version": 711, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/98", - 712, - { + }, + { + "key": "collection/7/coll/98", + "version": 712, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/99", - 713, - { + }, + { + "key": "collection/7/coll/99", + "version": 713, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 14 @@ -41469,7 +60344,8 @@ }, { "watchSnapshot": { - "version": 714 + "version": 714, + "targetIds": [] }, "expect": [ { @@ -41484,706 +60360,1106 @@ ] }, "added": [ - [ - "collection/7/coll/0", - 614, - { + { + "key": "collection/7/coll/0", + "version": 614, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/1", - 615, - { + }, + { + "key": "collection/7/coll/1", + "version": 615, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/2", - 616, - { + }, + { + "key": "collection/7/coll/2", + "version": 616, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/3", - 617, - { + }, + { + "key": "collection/7/coll/3", + "version": 617, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/4", - 618, - { + }, + { + "key": "collection/7/coll/4", + "version": 618, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/5", - 619, - { + }, + { + "key": "collection/7/coll/5", + "version": 619, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/6", - 620, - { + }, + { + "key": "collection/7/coll/6", + "version": 620, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/7", - 621, - { + }, + { + "key": "collection/7/coll/7", + "version": 621, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/8", - 622, - { + }, + { + "key": "collection/7/coll/8", + "version": 622, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/9", - 623, - { + }, + { + "key": "collection/7/coll/9", + "version": 623, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/10", - 624, - { + }, + { + "key": "collection/7/coll/10", + "version": 624, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/11", - 625, - { + }, + { + "key": "collection/7/coll/11", + "version": 625, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/12", - 626, - { + }, + { + "key": "collection/7/coll/12", + "version": 626, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/13", - 627, - { + }, + { + "key": "collection/7/coll/13", + "version": 627, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/14", - 628, - { + }, + { + "key": "collection/7/coll/14", + "version": 628, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/15", - 629, - { + }, + { + "key": "collection/7/coll/15", + "version": 629, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/16", - 630, - { + }, + { + "key": "collection/7/coll/16", + "version": 630, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/17", - 631, - { + }, + { + "key": "collection/7/coll/17", + "version": 631, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/18", - 632, - { + }, + { + "key": "collection/7/coll/18", + "version": 632, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/19", - 633, - { + }, + { + "key": "collection/7/coll/19", + "version": 633, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/20", - 634, - { + }, + { + "key": "collection/7/coll/20", + "version": 634, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/21", - 635, - { + }, + { + "key": "collection/7/coll/21", + "version": 635, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/22", - 636, - { + }, + { + "key": "collection/7/coll/22", + "version": 636, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/23", - 637, - { + }, + { + "key": "collection/7/coll/23", + "version": 637, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/24", - 638, - { + }, + { + "key": "collection/7/coll/24", + "version": 638, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/25", - 639, - { + }, + { + "key": "collection/7/coll/25", + "version": 639, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/26", - 640, - { + }, + { + "key": "collection/7/coll/26", + "version": 640, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/27", - 641, - { + }, + { + "key": "collection/7/coll/27", + "version": 641, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/28", - 642, - { + }, + { + "key": "collection/7/coll/28", + "version": 642, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/29", - 643, - { + }, + { + "key": "collection/7/coll/29", + "version": 643, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/30", - 644, - { + }, + { + "key": "collection/7/coll/30", + "version": 644, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/31", - 645, - { + }, + { + "key": "collection/7/coll/31", + "version": 645, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/32", - 646, - { + }, + { + "key": "collection/7/coll/32", + "version": 646, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/33", - 647, - { + }, + { + "key": "collection/7/coll/33", + "version": 647, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/34", - 648, - { + }, + { + "key": "collection/7/coll/34", + "version": 648, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/35", - 649, - { + }, + { + "key": "collection/7/coll/35", + "version": 649, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/36", - 650, - { + }, + { + "key": "collection/7/coll/36", + "version": 650, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/37", - 651, - { + }, + { + "key": "collection/7/coll/37", + "version": 651, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/38", - 652, - { + }, + { + "key": "collection/7/coll/38", + "version": 652, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/39", - 653, - { + }, + { + "key": "collection/7/coll/39", + "version": 653, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/40", - 654, - { + }, + { + "key": "collection/7/coll/40", + "version": 654, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/41", - 655, - { + }, + { + "key": "collection/7/coll/41", + "version": 655, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/42", - 656, - { + }, + { + "key": "collection/7/coll/42", + "version": 656, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/43", - 657, - { + }, + { + "key": "collection/7/coll/43", + "version": 657, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/44", - 658, - { + }, + { + "key": "collection/7/coll/44", + "version": 658, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/45", - 659, - { + }, + { + "key": "collection/7/coll/45", + "version": 659, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/46", - 660, - { + }, + { + "key": "collection/7/coll/46", + "version": 660, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/47", - 661, - { + }, + { + "key": "collection/7/coll/47", + "version": 661, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/48", - 662, - { + }, + { + "key": "collection/7/coll/48", + "version": 662, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/49", - 663, - { + }, + { + "key": "collection/7/coll/49", + "version": 663, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/50", - 664, - { + }, + { + "key": "collection/7/coll/50", + "version": 664, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/51", - 665, - { + }, + { + "key": "collection/7/coll/51", + "version": 665, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/52", - 666, - { + }, + { + "key": "collection/7/coll/52", + "version": 666, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/53", - 667, - { + }, + { + "key": "collection/7/coll/53", + "version": 667, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/54", - 668, - { + }, + { + "key": "collection/7/coll/54", + "version": 668, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/55", - 669, - { + }, + { + "key": "collection/7/coll/55", + "version": 669, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/56", - 670, - { + }, + { + "key": "collection/7/coll/56", + "version": 670, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/57", - 671, - { + }, + { + "key": "collection/7/coll/57", + "version": 671, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/58", - 672, - { + }, + { + "key": "collection/7/coll/58", + "version": 672, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/59", - 673, - { + }, + { + "key": "collection/7/coll/59", + "version": 673, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/60", - 674, - { + }, + { + "key": "collection/7/coll/60", + "version": 674, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/61", - 675, - { + }, + { + "key": "collection/7/coll/61", + "version": 675, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/62", - 676, - { + }, + { + "key": "collection/7/coll/62", + "version": 676, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/63", - 677, - { + }, + { + "key": "collection/7/coll/63", + "version": 677, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/64", - 678, - { + }, + { + "key": "collection/7/coll/64", + "version": 678, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/65", - 679, - { + }, + { + "key": "collection/7/coll/65", + "version": 679, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/66", - 680, - { + }, + { + "key": "collection/7/coll/66", + "version": 680, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/67", - 681, - { + }, + { + "key": "collection/7/coll/67", + "version": 681, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/68", - 682, - { + }, + { + "key": "collection/7/coll/68", + "version": 682, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/69", - 683, - { + }, + { + "key": "collection/7/coll/69", + "version": 683, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/70", - 684, - { + }, + { + "key": "collection/7/coll/70", + "version": 684, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/71", - 685, - { + }, + { + "key": "collection/7/coll/71", + "version": 685, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/72", - 686, - { + }, + { + "key": "collection/7/coll/72", + "version": 686, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/73", - 687, - { + }, + { + "key": "collection/7/coll/73", + "version": 687, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/74", - 688, - { + }, + { + "key": "collection/7/coll/74", + "version": 688, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/75", - 689, - { + }, + { + "key": "collection/7/coll/75", + "version": 689, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/76", - 690, - { + }, + { + "key": "collection/7/coll/76", + "version": 690, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/77", - 691, - { + }, + { + "key": "collection/7/coll/77", + "version": 691, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/78", - 692, - { + }, + { + "key": "collection/7/coll/78", + "version": 692, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/79", - 693, - { + }, + { + "key": "collection/7/coll/79", + "version": 693, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/80", - 694, - { + }, + { + "key": "collection/7/coll/80", + "version": 694, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/81", - 695, - { + }, + { + "key": "collection/7/coll/81", + "version": 695, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/82", - 696, - { + }, + { + "key": "collection/7/coll/82", + "version": 696, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/83", - 697, - { + }, + { + "key": "collection/7/coll/83", + "version": 697, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/84", - 698, - { + }, + { + "key": "collection/7/coll/84", + "version": 698, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/85", - 699, - { + }, + { + "key": "collection/7/coll/85", + "version": 699, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/86", - 700, - { + }, + { + "key": "collection/7/coll/86", + "version": 700, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/87", - 701, - { + }, + { + "key": "collection/7/coll/87", + "version": 701, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/88", - 702, - { + }, + { + "key": "collection/7/coll/88", + "version": 702, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/89", - 703, - { + }, + { + "key": "collection/7/coll/89", + "version": 703, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/90", - 704, - { + }, + { + "key": "collection/7/coll/90", + "version": 704, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/91", - 705, - { + }, + { + "key": "collection/7/coll/91", + "version": 705, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/92", - 706, - { + }, + { + "key": "collection/7/coll/92", + "version": 706, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/93", - 707, - { + }, + { + "key": "collection/7/coll/93", + "version": 707, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/94", - 708, - { + }, + { + "key": "collection/7/coll/94", + "version": 708, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/95", - 709, - { + }, + { + "key": "collection/7/coll/95", + "version": 709, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/96", - 710, - { + }, + { + "key": "collection/7/coll/96", + "version": 710, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/97", - 711, - { + }, + { + "key": "collection/7/coll/97", + "version": 711, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/98", - 712, - { + }, + { + "key": "collection/7/coll/98", + "version": 712, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/99", - 713, - { + }, + { + "key": "collection/7/coll/99", + "version": 713, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -42260,706 +61536,1106 @@ ] }, "added": [ - [ - "collection/7/coll/0", - 614, - { + { + "key": "collection/7/coll/0", + "version": 614, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/1", - 615, - { + }, + { + "key": "collection/7/coll/1", + "version": 615, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/2", - 616, - { + }, + { + "key": "collection/7/coll/2", + "version": 616, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/3", - 617, - { + }, + { + "key": "collection/7/coll/3", + "version": 617, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/4", - 618, - { + }, + { + "key": "collection/7/coll/4", + "version": 618, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/5", - 619, - { + }, + { + "key": "collection/7/coll/5", + "version": 619, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/6", - 620, - { + }, + { + "key": "collection/7/coll/6", + "version": 620, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/7", - 621, - { + }, + { + "key": "collection/7/coll/7", + "version": 621, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/8", - 622, - { + }, + { + "key": "collection/7/coll/8", + "version": 622, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/9", - 623, - { + }, + { + "key": "collection/7/coll/9", + "version": 623, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/10", - 624, - { + }, + { + "key": "collection/7/coll/10", + "version": 624, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/11", - 625, - { + }, + { + "key": "collection/7/coll/11", + "version": 625, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/12", - 626, - { + }, + { + "key": "collection/7/coll/12", + "version": 626, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/13", - 627, - { + }, + { + "key": "collection/7/coll/13", + "version": 627, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/14", - 628, - { + }, + { + "key": "collection/7/coll/14", + "version": 628, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/15", - 629, - { + }, + { + "key": "collection/7/coll/15", + "version": 629, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/16", - 630, - { + }, + { + "key": "collection/7/coll/16", + "version": 630, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/17", - 631, - { + }, + { + "key": "collection/7/coll/17", + "version": 631, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/18", - 632, - { + }, + { + "key": "collection/7/coll/18", + "version": 632, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/19", - 633, - { + }, + { + "key": "collection/7/coll/19", + "version": 633, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/20", - 634, - { + }, + { + "key": "collection/7/coll/20", + "version": 634, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/21", - 635, - { + }, + { + "key": "collection/7/coll/21", + "version": 635, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/22", - 636, - { + }, + { + "key": "collection/7/coll/22", + "version": 636, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/23", - 637, - { + }, + { + "key": "collection/7/coll/23", + "version": 637, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/24", - 638, - { + }, + { + "key": "collection/7/coll/24", + "version": 638, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/25", - 639, - { + }, + { + "key": "collection/7/coll/25", + "version": 639, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/26", - 640, - { + }, + { + "key": "collection/7/coll/26", + "version": 640, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/27", - 641, - { + }, + { + "key": "collection/7/coll/27", + "version": 641, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/28", - 642, - { + }, + { + "key": "collection/7/coll/28", + "version": 642, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/29", - 643, - { + }, + { + "key": "collection/7/coll/29", + "version": 643, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/30", - 644, - { + }, + { + "key": "collection/7/coll/30", + "version": 644, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/31", - 645, - { + }, + { + "key": "collection/7/coll/31", + "version": 645, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/32", - 646, - { + }, + { + "key": "collection/7/coll/32", + "version": 646, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/33", - 647, - { + }, + { + "key": "collection/7/coll/33", + "version": 647, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/34", - 648, - { + }, + { + "key": "collection/7/coll/34", + "version": 648, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/35", - 649, - { + }, + { + "key": "collection/7/coll/35", + "version": 649, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/36", - 650, - { + }, + { + "key": "collection/7/coll/36", + "version": 650, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/37", - 651, - { + }, + { + "key": "collection/7/coll/37", + "version": 651, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/38", - 652, - { + }, + { + "key": "collection/7/coll/38", + "version": 652, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/39", - 653, - { + }, + { + "key": "collection/7/coll/39", + "version": 653, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/40", - 654, - { + }, + { + "key": "collection/7/coll/40", + "version": 654, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/41", - 655, - { + }, + { + "key": "collection/7/coll/41", + "version": 655, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/42", - 656, - { + }, + { + "key": "collection/7/coll/42", + "version": 656, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/43", - 657, - { + }, + { + "key": "collection/7/coll/43", + "version": 657, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/44", - 658, - { + }, + { + "key": "collection/7/coll/44", + "version": 658, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/45", - 659, - { + }, + { + "key": "collection/7/coll/45", + "version": 659, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/46", - 660, - { + }, + { + "key": "collection/7/coll/46", + "version": 660, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/47", - 661, - { + }, + { + "key": "collection/7/coll/47", + "version": 661, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/48", - 662, - { + }, + { + "key": "collection/7/coll/48", + "version": 662, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/49", - 663, - { + }, + { + "key": "collection/7/coll/49", + "version": 663, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/50", - 664, - { + }, + { + "key": "collection/7/coll/50", + "version": 664, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/51", - 665, - { + }, + { + "key": "collection/7/coll/51", + "version": 665, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/52", - 666, - { + }, + { + "key": "collection/7/coll/52", + "version": 666, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/53", - 667, - { + }, + { + "key": "collection/7/coll/53", + "version": 667, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/54", - 668, - { + }, + { + "key": "collection/7/coll/54", + "version": 668, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/55", - 669, - { + }, + { + "key": "collection/7/coll/55", + "version": 669, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/56", - 670, - { + }, + { + "key": "collection/7/coll/56", + "version": 670, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/57", - 671, - { + }, + { + "key": "collection/7/coll/57", + "version": 671, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/58", - 672, - { + }, + { + "key": "collection/7/coll/58", + "version": 672, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/59", - 673, - { + }, + { + "key": "collection/7/coll/59", + "version": 673, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/60", - 674, - { + }, + { + "key": "collection/7/coll/60", + "version": 674, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/61", - 675, - { + }, + { + "key": "collection/7/coll/61", + "version": 675, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/62", - 676, - { + }, + { + "key": "collection/7/coll/62", + "version": 676, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/63", - 677, - { + }, + { + "key": "collection/7/coll/63", + "version": 677, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/64", - 678, - { + }, + { + "key": "collection/7/coll/64", + "version": 678, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/65", - 679, - { + }, + { + "key": "collection/7/coll/65", + "version": 679, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/66", - 680, - { + }, + { + "key": "collection/7/coll/66", + "version": 680, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/67", - 681, - { + }, + { + "key": "collection/7/coll/67", + "version": 681, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/68", - 682, - { + }, + { + "key": "collection/7/coll/68", + "version": 682, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/69", - 683, - { + }, + { + "key": "collection/7/coll/69", + "version": 683, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/70", - 684, - { + }, + { + "key": "collection/7/coll/70", + "version": 684, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/71", - 685, - { + }, + { + "key": "collection/7/coll/71", + "version": 685, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/72", - 686, - { + }, + { + "key": "collection/7/coll/72", + "version": 686, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/73", - 687, - { + }, + { + "key": "collection/7/coll/73", + "version": 687, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/74", - 688, - { + }, + { + "key": "collection/7/coll/74", + "version": 688, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/75", - 689, - { + }, + { + "key": "collection/7/coll/75", + "version": 689, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/76", - 690, - { + }, + { + "key": "collection/7/coll/76", + "version": 690, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/77", - 691, - { + }, + { + "key": "collection/7/coll/77", + "version": 691, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/78", - 692, - { + }, + { + "key": "collection/7/coll/78", + "version": 692, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/79", - 693, - { + }, + { + "key": "collection/7/coll/79", + "version": 693, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/80", - 694, - { + }, + { + "key": "collection/7/coll/80", + "version": 694, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/81", - 695, - { + }, + { + "key": "collection/7/coll/81", + "version": 695, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/82", - 696, - { + }, + { + "key": "collection/7/coll/82", + "version": 696, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/83", - 697, - { + }, + { + "key": "collection/7/coll/83", + "version": 697, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/84", - 698, - { + }, + { + "key": "collection/7/coll/84", + "version": 698, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/85", - 699, - { + }, + { + "key": "collection/7/coll/85", + "version": 699, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/86", - 700, - { + }, + { + "key": "collection/7/coll/86", + "version": 700, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/87", - 701, - { + }, + { + "key": "collection/7/coll/87", + "version": 701, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/88", - 702, - { + }, + { + "key": "collection/7/coll/88", + "version": 702, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/89", - 703, - { + }, + { + "key": "collection/7/coll/89", + "version": 703, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/90", - 704, - { + }, + { + "key": "collection/7/coll/90", + "version": 704, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/91", - 705, - { + }, + { + "key": "collection/7/coll/91", + "version": 705, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/92", - 706, - { + }, + { + "key": "collection/7/coll/92", + "version": 706, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/93", - 707, - { + }, + { + "key": "collection/7/coll/93", + "version": 707, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/94", - 708, - { + }, + { + "key": "collection/7/coll/94", + "version": 708, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/95", - 709, - { + }, + { + "key": "collection/7/coll/95", + "version": 709, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/96", - 710, - { + }, + { + "key": "collection/7/coll/96", + "version": 710, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/97", - 711, - { + }, + { + "key": "collection/7/coll/97", + "version": 711, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/98", - 712, - { + }, + { + "key": "collection/7/coll/98", + "version": 712, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/7/coll/99", - 713, - { + }, + { + "key": "collection/7/coll/99", + "version": 713, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -42990,7 +62666,8 @@ }, { "watchSnapshot": { - "version": 715 + "version": 715, + "targetIds": [] }, "expect": [ { @@ -43075,706 +62752,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/8/coll/0", - 716, - { + { + "key": "collection/8/coll/0", + "version": 716, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/1", - 717, - { + }, + { + "key": "collection/8/coll/1", + "version": 717, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/2", - 718, - { + }, + { + "key": "collection/8/coll/2", + "version": 718, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/3", - 719, - { + }, + { + "key": "collection/8/coll/3", + "version": 719, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/4", - 720, - { + }, + { + "key": "collection/8/coll/4", + "version": 720, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/5", - 721, - { + }, + { + "key": "collection/8/coll/5", + "version": 721, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/6", - 722, - { + }, + { + "key": "collection/8/coll/6", + "version": 722, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/7", - 723, - { + }, + { + "key": "collection/8/coll/7", + "version": 723, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/8", - 724, - { + }, + { + "key": "collection/8/coll/8", + "version": 724, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/9", - 725, - { + }, + { + "key": "collection/8/coll/9", + "version": 725, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/10", - 726, - { + }, + { + "key": "collection/8/coll/10", + "version": 726, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/11", - 727, - { + }, + { + "key": "collection/8/coll/11", + "version": 727, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/12", - 728, - { + }, + { + "key": "collection/8/coll/12", + "version": 728, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/13", - 729, - { + }, + { + "key": "collection/8/coll/13", + "version": 729, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/14", - 730, - { + }, + { + "key": "collection/8/coll/14", + "version": 730, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/15", - 731, - { + }, + { + "key": "collection/8/coll/15", + "version": 731, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/16", - 732, - { + }, + { + "key": "collection/8/coll/16", + "version": 732, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/17", - 733, - { + }, + { + "key": "collection/8/coll/17", + "version": 733, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/18", - 734, - { + }, + { + "key": "collection/8/coll/18", + "version": 734, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/19", - 735, - { + }, + { + "key": "collection/8/coll/19", + "version": 735, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/20", - 736, - { + }, + { + "key": "collection/8/coll/20", + "version": 736, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/21", - 737, - { + }, + { + "key": "collection/8/coll/21", + "version": 737, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/22", - 738, - { + }, + { + "key": "collection/8/coll/22", + "version": 738, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/23", - 739, - { + }, + { + "key": "collection/8/coll/23", + "version": 739, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/24", - 740, - { + }, + { + "key": "collection/8/coll/24", + "version": 740, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/25", - 741, - { + }, + { + "key": "collection/8/coll/25", + "version": 741, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/26", - 742, - { + }, + { + "key": "collection/8/coll/26", + "version": 742, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/27", - 743, - { + }, + { + "key": "collection/8/coll/27", + "version": 743, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/28", - 744, - { + }, + { + "key": "collection/8/coll/28", + "version": 744, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/29", - 745, - { + }, + { + "key": "collection/8/coll/29", + "version": 745, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/30", - 746, - { + }, + { + "key": "collection/8/coll/30", + "version": 746, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/31", - 747, - { + }, + { + "key": "collection/8/coll/31", + "version": 747, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/32", - 748, - { + }, + { + "key": "collection/8/coll/32", + "version": 748, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/33", - 749, - { + }, + { + "key": "collection/8/coll/33", + "version": 749, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/34", - 750, - { + }, + { + "key": "collection/8/coll/34", + "version": 750, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/35", - 751, - { + }, + { + "key": "collection/8/coll/35", + "version": 751, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/36", - 752, - { + }, + { + "key": "collection/8/coll/36", + "version": 752, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/37", - 753, - { + }, + { + "key": "collection/8/coll/37", + "version": 753, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/38", - 754, - { + }, + { + "key": "collection/8/coll/38", + "version": 754, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/39", - 755, - { + }, + { + "key": "collection/8/coll/39", + "version": 755, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/40", - 756, - { + }, + { + "key": "collection/8/coll/40", + "version": 756, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/41", - 757, - { + }, + { + "key": "collection/8/coll/41", + "version": 757, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/42", - 758, - { + }, + { + "key": "collection/8/coll/42", + "version": 758, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/43", - 759, - { + }, + { + "key": "collection/8/coll/43", + "version": 759, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/44", - 760, - { + }, + { + "key": "collection/8/coll/44", + "version": 760, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/45", - 761, - { + }, + { + "key": "collection/8/coll/45", + "version": 761, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/46", - 762, - { + }, + { + "key": "collection/8/coll/46", + "version": 762, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/47", - 763, - { + }, + { + "key": "collection/8/coll/47", + "version": 763, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/48", - 764, - { + }, + { + "key": "collection/8/coll/48", + "version": 764, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/49", - 765, - { + }, + { + "key": "collection/8/coll/49", + "version": 765, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/50", - 766, - { + }, + { + "key": "collection/8/coll/50", + "version": 766, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/51", - 767, - { + }, + { + "key": "collection/8/coll/51", + "version": 767, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/52", - 768, - { + }, + { + "key": "collection/8/coll/52", + "version": 768, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/53", - 769, - { + }, + { + "key": "collection/8/coll/53", + "version": 769, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/54", - 770, - { + }, + { + "key": "collection/8/coll/54", + "version": 770, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/55", - 771, - { + }, + { + "key": "collection/8/coll/55", + "version": 771, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/56", - 772, - { + }, + { + "key": "collection/8/coll/56", + "version": 772, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/57", - 773, - { + }, + { + "key": "collection/8/coll/57", + "version": 773, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/58", - 774, - { + }, + { + "key": "collection/8/coll/58", + "version": 774, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/59", - 775, - { + }, + { + "key": "collection/8/coll/59", + "version": 775, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/60", - 776, - { + }, + { + "key": "collection/8/coll/60", + "version": 776, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/61", - 777, - { + }, + { + "key": "collection/8/coll/61", + "version": 777, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/62", - 778, - { + }, + { + "key": "collection/8/coll/62", + "version": 778, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/63", - 779, - { + }, + { + "key": "collection/8/coll/63", + "version": 779, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/64", - 780, - { + }, + { + "key": "collection/8/coll/64", + "version": 780, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/65", - 781, - { + }, + { + "key": "collection/8/coll/65", + "version": 781, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/66", - 782, - { + }, + { + "key": "collection/8/coll/66", + "version": 782, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/67", - 783, - { + }, + { + "key": "collection/8/coll/67", + "version": 783, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/68", - 784, - { + }, + { + "key": "collection/8/coll/68", + "version": 784, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/69", - 785, - { + }, + { + "key": "collection/8/coll/69", + "version": 785, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/70", - 786, - { + }, + { + "key": "collection/8/coll/70", + "version": 786, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/71", - 787, - { + }, + { + "key": "collection/8/coll/71", + "version": 787, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/72", - 788, - { + }, + { + "key": "collection/8/coll/72", + "version": 788, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/73", - 789, - { + }, + { + "key": "collection/8/coll/73", + "version": 789, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/74", - 790, - { + }, + { + "key": "collection/8/coll/74", + "version": 790, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/75", - 791, - { + }, + { + "key": "collection/8/coll/75", + "version": 791, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/76", - 792, - { + }, + { + "key": "collection/8/coll/76", + "version": 792, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/77", - 793, - { + }, + { + "key": "collection/8/coll/77", + "version": 793, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/78", - 794, - { + }, + { + "key": "collection/8/coll/78", + "version": 794, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/79", - 795, - { + }, + { + "key": "collection/8/coll/79", + "version": 795, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/80", - 796, - { + }, + { + "key": "collection/8/coll/80", + "version": 796, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/81", - 797, - { + }, + { + "key": "collection/8/coll/81", + "version": 797, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/82", - 798, - { + }, + { + "key": "collection/8/coll/82", + "version": 798, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/83", - 799, - { + }, + { + "key": "collection/8/coll/83", + "version": 799, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/84", - 800, - { + }, + { + "key": "collection/8/coll/84", + "version": 800, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/85", - 801, - { + }, + { + "key": "collection/8/coll/85", + "version": 801, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/86", - 802, - { + }, + { + "key": "collection/8/coll/86", + "version": 802, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/87", - 803, - { + }, + { + "key": "collection/8/coll/87", + "version": 803, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/88", - 804, - { + }, + { + "key": "collection/8/coll/88", + "version": 804, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/89", - 805, - { + }, + { + "key": "collection/8/coll/89", + "version": 805, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/90", - 806, - { + }, + { + "key": "collection/8/coll/90", + "version": 806, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/91", - 807, - { + }, + { + "key": "collection/8/coll/91", + "version": 807, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/92", - 808, - { + }, + { + "key": "collection/8/coll/92", + "version": 808, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/93", - 809, - { + }, + { + "key": "collection/8/coll/93", + "version": 809, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/94", - 810, - { + }, + { + "key": "collection/8/coll/94", + "version": 810, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/95", - 811, - { + }, + { + "key": "collection/8/coll/95", + "version": 811, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/96", - 812, - { + }, + { + "key": "collection/8/coll/96", + "version": 812, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/97", - 813, - { + }, + { + "key": "collection/8/coll/97", + "version": 813, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/98", - 814, - { + }, + { + "key": "collection/8/coll/98", + "version": 814, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/99", - 815, - { + }, + { + "key": "collection/8/coll/99", + "version": 815, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 16 @@ -43791,7 +63868,8 @@ }, { "watchSnapshot": { - "version": 816 + "version": 816, + "targetIds": [] }, "expect": [ { @@ -43806,706 +63884,1106 @@ ] }, "added": [ - [ - "collection/8/coll/0", - 716, - { + { + "key": "collection/8/coll/0", + "version": 716, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/1", - 717, - { + }, + { + "key": "collection/8/coll/1", + "version": 717, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/2", - 718, - { + }, + { + "key": "collection/8/coll/2", + "version": 718, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/3", - 719, - { + }, + { + "key": "collection/8/coll/3", + "version": 719, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/4", - 720, - { + }, + { + "key": "collection/8/coll/4", + "version": 720, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/5", - 721, - { + }, + { + "key": "collection/8/coll/5", + "version": 721, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/6", - 722, - { + }, + { + "key": "collection/8/coll/6", + "version": 722, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/7", - 723, - { + }, + { + "key": "collection/8/coll/7", + "version": 723, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/8", - 724, - { + }, + { + "key": "collection/8/coll/8", + "version": 724, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/9", - 725, - { + }, + { + "key": "collection/8/coll/9", + "version": 725, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/10", - 726, - { + }, + { + "key": "collection/8/coll/10", + "version": 726, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/11", - 727, - { + }, + { + "key": "collection/8/coll/11", + "version": 727, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/12", - 728, - { + }, + { + "key": "collection/8/coll/12", + "version": 728, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/13", - 729, - { + }, + { + "key": "collection/8/coll/13", + "version": 729, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/14", - 730, - { + }, + { + "key": "collection/8/coll/14", + "version": 730, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/15", - 731, - { + }, + { + "key": "collection/8/coll/15", + "version": 731, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/16", - 732, - { + }, + { + "key": "collection/8/coll/16", + "version": 732, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/17", - 733, - { + }, + { + "key": "collection/8/coll/17", + "version": 733, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/18", - 734, - { + }, + { + "key": "collection/8/coll/18", + "version": 734, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/19", - 735, - { + }, + { + "key": "collection/8/coll/19", + "version": 735, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/20", - 736, - { + }, + { + "key": "collection/8/coll/20", + "version": 736, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/21", - 737, - { + }, + { + "key": "collection/8/coll/21", + "version": 737, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/22", - 738, - { + }, + { + "key": "collection/8/coll/22", + "version": 738, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/23", - 739, - { + }, + { + "key": "collection/8/coll/23", + "version": 739, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/24", - 740, - { + }, + { + "key": "collection/8/coll/24", + "version": 740, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/25", - 741, - { + }, + { + "key": "collection/8/coll/25", + "version": 741, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/26", - 742, - { + }, + { + "key": "collection/8/coll/26", + "version": 742, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/27", - 743, - { + }, + { + "key": "collection/8/coll/27", + "version": 743, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/28", - 744, - { + }, + { + "key": "collection/8/coll/28", + "version": 744, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/29", - 745, - { + }, + { + "key": "collection/8/coll/29", + "version": 745, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/30", - 746, - { + }, + { + "key": "collection/8/coll/30", + "version": 746, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/31", - 747, - { + }, + { + "key": "collection/8/coll/31", + "version": 747, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/32", - 748, - { + }, + { + "key": "collection/8/coll/32", + "version": 748, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/33", - 749, - { + }, + { + "key": "collection/8/coll/33", + "version": 749, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/34", - 750, - { + }, + { + "key": "collection/8/coll/34", + "version": 750, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/35", - 751, - { + }, + { + "key": "collection/8/coll/35", + "version": 751, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/36", - 752, - { + }, + { + "key": "collection/8/coll/36", + "version": 752, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/37", - 753, - { + }, + { + "key": "collection/8/coll/37", + "version": 753, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/38", - 754, - { + }, + { + "key": "collection/8/coll/38", + "version": 754, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/39", - 755, - { + }, + { + "key": "collection/8/coll/39", + "version": 755, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/40", - 756, - { + }, + { + "key": "collection/8/coll/40", + "version": 756, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/41", - 757, - { + }, + { + "key": "collection/8/coll/41", + "version": 757, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/42", - 758, - { + }, + { + "key": "collection/8/coll/42", + "version": 758, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/43", - 759, - { + }, + { + "key": "collection/8/coll/43", + "version": 759, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/44", - 760, - { + }, + { + "key": "collection/8/coll/44", + "version": 760, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/45", - 761, - { + }, + { + "key": "collection/8/coll/45", + "version": 761, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/46", - 762, - { + }, + { + "key": "collection/8/coll/46", + "version": 762, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/47", - 763, - { + }, + { + "key": "collection/8/coll/47", + "version": 763, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/48", - 764, - { + }, + { + "key": "collection/8/coll/48", + "version": 764, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/49", - 765, - { + }, + { + "key": "collection/8/coll/49", + "version": 765, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/50", - 766, - { + }, + { + "key": "collection/8/coll/50", + "version": 766, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/51", - 767, - { + }, + { + "key": "collection/8/coll/51", + "version": 767, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/52", - 768, - { + }, + { + "key": "collection/8/coll/52", + "version": 768, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/53", - 769, - { + }, + { + "key": "collection/8/coll/53", + "version": 769, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/54", - 770, - { + }, + { + "key": "collection/8/coll/54", + "version": 770, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/55", - 771, - { + }, + { + "key": "collection/8/coll/55", + "version": 771, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/56", - 772, - { + }, + { + "key": "collection/8/coll/56", + "version": 772, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/57", - 773, - { + }, + { + "key": "collection/8/coll/57", + "version": 773, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/58", - 774, - { + }, + { + "key": "collection/8/coll/58", + "version": 774, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/59", - 775, - { + }, + { + "key": "collection/8/coll/59", + "version": 775, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/60", - 776, - { + }, + { + "key": "collection/8/coll/60", + "version": 776, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/61", - 777, - { + }, + { + "key": "collection/8/coll/61", + "version": 777, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/62", - 778, - { + }, + { + "key": "collection/8/coll/62", + "version": 778, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/63", - 779, - { + }, + { + "key": "collection/8/coll/63", + "version": 779, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/64", - 780, - { + }, + { + "key": "collection/8/coll/64", + "version": 780, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/65", - 781, - { + }, + { + "key": "collection/8/coll/65", + "version": 781, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/66", - 782, - { + }, + { + "key": "collection/8/coll/66", + "version": 782, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/67", - 783, - { + }, + { + "key": "collection/8/coll/67", + "version": 783, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/68", - 784, - { + }, + { + "key": "collection/8/coll/68", + "version": 784, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/69", - 785, - { + }, + { + "key": "collection/8/coll/69", + "version": 785, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/70", - 786, - { + }, + { + "key": "collection/8/coll/70", + "version": 786, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/71", - 787, - { + }, + { + "key": "collection/8/coll/71", + "version": 787, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/72", - 788, - { + }, + { + "key": "collection/8/coll/72", + "version": 788, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/73", - 789, - { + }, + { + "key": "collection/8/coll/73", + "version": 789, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/74", - 790, - { + }, + { + "key": "collection/8/coll/74", + "version": 790, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/75", - 791, - { + }, + { + "key": "collection/8/coll/75", + "version": 791, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/76", - 792, - { + }, + { + "key": "collection/8/coll/76", + "version": 792, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/77", - 793, - { + }, + { + "key": "collection/8/coll/77", + "version": 793, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/78", - 794, - { + }, + { + "key": "collection/8/coll/78", + "version": 794, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/79", - 795, - { + }, + { + "key": "collection/8/coll/79", + "version": 795, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/80", - 796, - { + }, + { + "key": "collection/8/coll/80", + "version": 796, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/81", - 797, - { + }, + { + "key": "collection/8/coll/81", + "version": 797, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/82", - 798, - { + }, + { + "key": "collection/8/coll/82", + "version": 798, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/83", - 799, - { + }, + { + "key": "collection/8/coll/83", + "version": 799, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/84", - 800, - { + }, + { + "key": "collection/8/coll/84", + "version": 800, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/85", - 801, - { + }, + { + "key": "collection/8/coll/85", + "version": 801, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/86", - 802, - { + }, + { + "key": "collection/8/coll/86", + "version": 802, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/87", - 803, - { + }, + { + "key": "collection/8/coll/87", + "version": 803, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/88", - 804, - { + }, + { + "key": "collection/8/coll/88", + "version": 804, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/89", - 805, - { + }, + { + "key": "collection/8/coll/89", + "version": 805, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/90", - 806, - { + }, + { + "key": "collection/8/coll/90", + "version": 806, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/91", - 807, - { + }, + { + "key": "collection/8/coll/91", + "version": 807, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/92", - 808, - { + }, + { + "key": "collection/8/coll/92", + "version": 808, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/93", - 809, - { + }, + { + "key": "collection/8/coll/93", + "version": 809, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/94", - 810, - { + }, + { + "key": "collection/8/coll/94", + "version": 810, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/95", - 811, - { + }, + { + "key": "collection/8/coll/95", + "version": 811, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/96", - 812, - { + }, + { + "key": "collection/8/coll/96", + "version": 812, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/97", - 813, - { + }, + { + "key": "collection/8/coll/97", + "version": 813, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/98", - 814, - { + }, + { + "key": "collection/8/coll/98", + "version": 814, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/99", - 815, - { + }, + { + "key": "collection/8/coll/99", + "version": 815, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -44582,706 +65060,1106 @@ ] }, "added": [ - [ - "collection/8/coll/0", - 716, - { + { + "key": "collection/8/coll/0", + "version": 716, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/1", - 717, - { + }, + { + "key": "collection/8/coll/1", + "version": 717, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/2", - 718, - { + }, + { + "key": "collection/8/coll/2", + "version": 718, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/3", - 719, - { + }, + { + "key": "collection/8/coll/3", + "version": 719, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/4", - 720, - { + }, + { + "key": "collection/8/coll/4", + "version": 720, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/5", - 721, - { + }, + { + "key": "collection/8/coll/5", + "version": 721, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/6", - 722, - { + }, + { + "key": "collection/8/coll/6", + "version": 722, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/7", - 723, - { + }, + { + "key": "collection/8/coll/7", + "version": 723, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/8", - 724, - { + }, + { + "key": "collection/8/coll/8", + "version": 724, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/9", - 725, - { + }, + { + "key": "collection/8/coll/9", + "version": 725, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/10", - 726, - { + }, + { + "key": "collection/8/coll/10", + "version": 726, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/11", - 727, - { + }, + { + "key": "collection/8/coll/11", + "version": 727, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/12", - 728, - { + }, + { + "key": "collection/8/coll/12", + "version": 728, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/13", - 729, - { + }, + { + "key": "collection/8/coll/13", + "version": 729, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/14", - 730, - { + }, + { + "key": "collection/8/coll/14", + "version": 730, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/15", - 731, - { + }, + { + "key": "collection/8/coll/15", + "version": 731, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/16", - 732, - { + }, + { + "key": "collection/8/coll/16", + "version": 732, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/17", - 733, - { + }, + { + "key": "collection/8/coll/17", + "version": 733, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/18", - 734, - { + }, + { + "key": "collection/8/coll/18", + "version": 734, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/19", - 735, - { + }, + { + "key": "collection/8/coll/19", + "version": 735, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/20", - 736, - { + }, + { + "key": "collection/8/coll/20", + "version": 736, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/21", - 737, - { + }, + { + "key": "collection/8/coll/21", + "version": 737, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/22", - 738, - { + }, + { + "key": "collection/8/coll/22", + "version": 738, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/23", - 739, - { + }, + { + "key": "collection/8/coll/23", + "version": 739, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/24", - 740, - { + }, + { + "key": "collection/8/coll/24", + "version": 740, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/25", - 741, - { + }, + { + "key": "collection/8/coll/25", + "version": 741, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/26", - 742, - { + }, + { + "key": "collection/8/coll/26", + "version": 742, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/27", - 743, - { + }, + { + "key": "collection/8/coll/27", + "version": 743, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/28", - 744, - { + }, + { + "key": "collection/8/coll/28", + "version": 744, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/29", - 745, - { + }, + { + "key": "collection/8/coll/29", + "version": 745, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/30", - 746, - { + }, + { + "key": "collection/8/coll/30", + "version": 746, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/31", - 747, - { + }, + { + "key": "collection/8/coll/31", + "version": 747, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/32", - 748, - { + }, + { + "key": "collection/8/coll/32", + "version": 748, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/33", - 749, - { + }, + { + "key": "collection/8/coll/33", + "version": 749, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/34", - 750, - { + }, + { + "key": "collection/8/coll/34", + "version": 750, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/35", - 751, - { + }, + { + "key": "collection/8/coll/35", + "version": 751, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/36", - 752, - { + }, + { + "key": "collection/8/coll/36", + "version": 752, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/37", - 753, - { + }, + { + "key": "collection/8/coll/37", + "version": 753, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/38", - 754, - { + }, + { + "key": "collection/8/coll/38", + "version": 754, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/39", - 755, - { + }, + { + "key": "collection/8/coll/39", + "version": 755, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/40", - 756, - { + }, + { + "key": "collection/8/coll/40", + "version": 756, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/41", - 757, - { + }, + { + "key": "collection/8/coll/41", + "version": 757, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/42", - 758, - { + }, + { + "key": "collection/8/coll/42", + "version": 758, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/43", - 759, - { + }, + { + "key": "collection/8/coll/43", + "version": 759, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/44", - 760, - { + }, + { + "key": "collection/8/coll/44", + "version": 760, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/45", - 761, - { + }, + { + "key": "collection/8/coll/45", + "version": 761, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/46", - 762, - { + }, + { + "key": "collection/8/coll/46", + "version": 762, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/47", - 763, - { + }, + { + "key": "collection/8/coll/47", + "version": 763, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/48", - 764, - { + }, + { + "key": "collection/8/coll/48", + "version": 764, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/49", - 765, - { + }, + { + "key": "collection/8/coll/49", + "version": 765, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/50", - 766, - { + }, + { + "key": "collection/8/coll/50", + "version": 766, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/51", - 767, - { + }, + { + "key": "collection/8/coll/51", + "version": 767, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/52", - 768, - { + }, + { + "key": "collection/8/coll/52", + "version": 768, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/53", - 769, - { + }, + { + "key": "collection/8/coll/53", + "version": 769, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/54", - 770, - { + }, + { + "key": "collection/8/coll/54", + "version": 770, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/55", - 771, - { + }, + { + "key": "collection/8/coll/55", + "version": 771, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/56", - 772, - { + }, + { + "key": "collection/8/coll/56", + "version": 772, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/57", - 773, - { + }, + { + "key": "collection/8/coll/57", + "version": 773, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/58", - 774, - { + }, + { + "key": "collection/8/coll/58", + "version": 774, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/59", - 775, - { + }, + { + "key": "collection/8/coll/59", + "version": 775, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/60", - 776, - { + }, + { + "key": "collection/8/coll/60", + "version": 776, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/61", - 777, - { + }, + { + "key": "collection/8/coll/61", + "version": 777, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/62", - 778, - { + }, + { + "key": "collection/8/coll/62", + "version": 778, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/63", - 779, - { + }, + { + "key": "collection/8/coll/63", + "version": 779, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/64", - 780, - { + }, + { + "key": "collection/8/coll/64", + "version": 780, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/65", - 781, - { + }, + { + "key": "collection/8/coll/65", + "version": 781, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/66", - 782, - { + }, + { + "key": "collection/8/coll/66", + "version": 782, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/67", - 783, - { + }, + { + "key": "collection/8/coll/67", + "version": 783, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/68", - 784, - { + }, + { + "key": "collection/8/coll/68", + "version": 784, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/69", - 785, - { + }, + { + "key": "collection/8/coll/69", + "version": 785, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/70", - 786, - { + }, + { + "key": "collection/8/coll/70", + "version": 786, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/71", - 787, - { + }, + { + "key": "collection/8/coll/71", + "version": 787, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/72", - 788, - { + }, + { + "key": "collection/8/coll/72", + "version": 788, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/73", - 789, - { + }, + { + "key": "collection/8/coll/73", + "version": 789, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/74", - 790, - { + }, + { + "key": "collection/8/coll/74", + "version": 790, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/75", - 791, - { + }, + { + "key": "collection/8/coll/75", + "version": 791, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/76", - 792, - { + }, + { + "key": "collection/8/coll/76", + "version": 792, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/77", - 793, - { + }, + { + "key": "collection/8/coll/77", + "version": 793, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/78", - 794, - { + }, + { + "key": "collection/8/coll/78", + "version": 794, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/79", - 795, - { + }, + { + "key": "collection/8/coll/79", + "version": 795, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/80", - 796, - { + }, + { + "key": "collection/8/coll/80", + "version": 796, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/81", - 797, - { + }, + { + "key": "collection/8/coll/81", + "version": 797, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/82", - 798, - { + }, + { + "key": "collection/8/coll/82", + "version": 798, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/83", - 799, - { + }, + { + "key": "collection/8/coll/83", + "version": 799, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/84", - 800, - { + }, + { + "key": "collection/8/coll/84", + "version": 800, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/85", - 801, - { + }, + { + "key": "collection/8/coll/85", + "version": 801, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/86", - 802, - { + }, + { + "key": "collection/8/coll/86", + "version": 802, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/87", - 803, - { + }, + { + "key": "collection/8/coll/87", + "version": 803, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/88", - 804, - { + }, + { + "key": "collection/8/coll/88", + "version": 804, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/89", - 805, - { + }, + { + "key": "collection/8/coll/89", + "version": 805, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/90", - 806, - { + }, + { + "key": "collection/8/coll/90", + "version": 806, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/91", - 807, - { + }, + { + "key": "collection/8/coll/91", + "version": 807, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/92", - 808, - { + }, + { + "key": "collection/8/coll/92", + "version": 808, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/93", - 809, - { + }, + { + "key": "collection/8/coll/93", + "version": 809, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/94", - 810, - { + }, + { + "key": "collection/8/coll/94", + "version": 810, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/95", - 811, - { + }, + { + "key": "collection/8/coll/95", + "version": 811, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/96", - 812, - { + }, + { + "key": "collection/8/coll/96", + "version": 812, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/97", - 813, - { + }, + { + "key": "collection/8/coll/97", + "version": 813, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/98", - 814, - { + }, + { + "key": "collection/8/coll/98", + "version": 814, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/8/coll/99", - 815, - { + }, + { + "key": "collection/8/coll/99", + "version": 815, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -45312,7 +66190,8 @@ }, { "watchSnapshot": { - "version": 817 + "version": 817, + "targetIds": [] }, "expect": [ { @@ -45397,706 +66276,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/9/coll/0", - 818, - { + { + "key": "collection/9/coll/0", + "version": 818, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/1", - 819, - { + }, + { + "key": "collection/9/coll/1", + "version": 819, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/2", - 820, - { + }, + { + "key": "collection/9/coll/2", + "version": 820, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/3", - 821, - { + }, + { + "key": "collection/9/coll/3", + "version": 821, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/4", - 822, - { + }, + { + "key": "collection/9/coll/4", + "version": 822, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/5", - 823, - { + }, + { + "key": "collection/9/coll/5", + "version": 823, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/6", - 824, - { + }, + { + "key": "collection/9/coll/6", + "version": 824, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/7", - 825, - { + }, + { + "key": "collection/9/coll/7", + "version": 825, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/8", - 826, - { + }, + { + "key": "collection/9/coll/8", + "version": 826, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/9", - 827, - { + }, + { + "key": "collection/9/coll/9", + "version": 827, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/10", - 828, - { + }, + { + "key": "collection/9/coll/10", + "version": 828, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/11", - 829, - { + }, + { + "key": "collection/9/coll/11", + "version": 829, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/12", - 830, - { + }, + { + "key": "collection/9/coll/12", + "version": 830, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/13", - 831, - { + }, + { + "key": "collection/9/coll/13", + "version": 831, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/14", - 832, - { + }, + { + "key": "collection/9/coll/14", + "version": 832, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/15", - 833, - { + }, + { + "key": "collection/9/coll/15", + "version": 833, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/16", - 834, - { + }, + { + "key": "collection/9/coll/16", + "version": 834, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/17", - 835, - { + }, + { + "key": "collection/9/coll/17", + "version": 835, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/18", - 836, - { + }, + { + "key": "collection/9/coll/18", + "version": 836, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/19", - 837, - { + }, + { + "key": "collection/9/coll/19", + "version": 837, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/20", - 838, - { + }, + { + "key": "collection/9/coll/20", + "version": 838, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/21", - 839, - { + }, + { + "key": "collection/9/coll/21", + "version": 839, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/22", - 840, - { + }, + { + "key": "collection/9/coll/22", + "version": 840, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/23", - 841, - { + }, + { + "key": "collection/9/coll/23", + "version": 841, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/24", - 842, - { + }, + { + "key": "collection/9/coll/24", + "version": 842, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/25", - 843, - { + }, + { + "key": "collection/9/coll/25", + "version": 843, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/26", - 844, - { + }, + { + "key": "collection/9/coll/26", + "version": 844, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/27", - 845, - { + }, + { + "key": "collection/9/coll/27", + "version": 845, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/28", - 846, - { + }, + { + "key": "collection/9/coll/28", + "version": 846, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/29", - 847, - { + }, + { + "key": "collection/9/coll/29", + "version": 847, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/30", - 848, - { + }, + { + "key": "collection/9/coll/30", + "version": 848, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/31", - 849, - { + }, + { + "key": "collection/9/coll/31", + "version": 849, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/32", - 850, - { + }, + { + "key": "collection/9/coll/32", + "version": 850, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/33", - 851, - { + }, + { + "key": "collection/9/coll/33", + "version": 851, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/34", - 852, - { + }, + { + "key": "collection/9/coll/34", + "version": 852, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/35", - 853, - { + }, + { + "key": "collection/9/coll/35", + "version": 853, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/36", - 854, - { + }, + { + "key": "collection/9/coll/36", + "version": 854, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/37", - 855, - { + }, + { + "key": "collection/9/coll/37", + "version": 855, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/38", - 856, - { + }, + { + "key": "collection/9/coll/38", + "version": 856, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/39", - 857, - { + }, + { + "key": "collection/9/coll/39", + "version": 857, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/40", - 858, - { + }, + { + "key": "collection/9/coll/40", + "version": 858, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/41", - 859, - { + }, + { + "key": "collection/9/coll/41", + "version": 859, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/42", - 860, - { + }, + { + "key": "collection/9/coll/42", + "version": 860, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/43", - 861, - { + }, + { + "key": "collection/9/coll/43", + "version": 861, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/44", - 862, - { + }, + { + "key": "collection/9/coll/44", + "version": 862, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/45", - 863, - { + }, + { + "key": "collection/9/coll/45", + "version": 863, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/46", - 864, - { + }, + { + "key": "collection/9/coll/46", + "version": 864, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/47", - 865, - { + }, + { + "key": "collection/9/coll/47", + "version": 865, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/48", - 866, - { + }, + { + "key": "collection/9/coll/48", + "version": 866, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/49", - 867, - { + }, + { + "key": "collection/9/coll/49", + "version": 867, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/50", - 868, - { + }, + { + "key": "collection/9/coll/50", + "version": 868, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/51", - 869, - { + }, + { + "key": "collection/9/coll/51", + "version": 869, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/52", - 870, - { + }, + { + "key": "collection/9/coll/52", + "version": 870, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/53", - 871, - { + }, + { + "key": "collection/9/coll/53", + "version": 871, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/54", - 872, - { + }, + { + "key": "collection/9/coll/54", + "version": 872, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/55", - 873, - { + }, + { + "key": "collection/9/coll/55", + "version": 873, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/56", - 874, - { + }, + { + "key": "collection/9/coll/56", + "version": 874, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/57", - 875, - { + }, + { + "key": "collection/9/coll/57", + "version": 875, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/58", - 876, - { + }, + { + "key": "collection/9/coll/58", + "version": 876, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/59", - 877, - { + }, + { + "key": "collection/9/coll/59", + "version": 877, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/60", - 878, - { + }, + { + "key": "collection/9/coll/60", + "version": 878, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/61", - 879, - { + }, + { + "key": "collection/9/coll/61", + "version": 879, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/62", - 880, - { + }, + { + "key": "collection/9/coll/62", + "version": 880, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/63", - 881, - { + }, + { + "key": "collection/9/coll/63", + "version": 881, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/64", - 882, - { + }, + { + "key": "collection/9/coll/64", + "version": 882, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/65", - 883, - { + }, + { + "key": "collection/9/coll/65", + "version": 883, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/66", - 884, - { + }, + { + "key": "collection/9/coll/66", + "version": 884, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/67", - 885, - { + }, + { + "key": "collection/9/coll/67", + "version": 885, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/68", - 886, - { + }, + { + "key": "collection/9/coll/68", + "version": 886, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/69", - 887, - { + }, + { + "key": "collection/9/coll/69", + "version": 887, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/70", - 888, - { + }, + { + "key": "collection/9/coll/70", + "version": 888, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/71", - 889, - { + }, + { + "key": "collection/9/coll/71", + "version": 889, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/72", - 890, - { + }, + { + "key": "collection/9/coll/72", + "version": 890, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/73", - 891, - { + }, + { + "key": "collection/9/coll/73", + "version": 891, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/74", - 892, - { + }, + { + "key": "collection/9/coll/74", + "version": 892, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/75", - 893, - { + }, + { + "key": "collection/9/coll/75", + "version": 893, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/76", - 894, - { + }, + { + "key": "collection/9/coll/76", + "version": 894, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/77", - 895, - { + }, + { + "key": "collection/9/coll/77", + "version": 895, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/78", - 896, - { + }, + { + "key": "collection/9/coll/78", + "version": 896, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/79", - 897, - { + }, + { + "key": "collection/9/coll/79", + "version": 897, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/80", - 898, - { + }, + { + "key": "collection/9/coll/80", + "version": 898, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/81", - 899, - { + }, + { + "key": "collection/9/coll/81", + "version": 899, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/82", - 900, - { + }, + { + "key": "collection/9/coll/82", + "version": 900, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/83", - 901, - { + }, + { + "key": "collection/9/coll/83", + "version": 901, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/84", - 902, - { + }, + { + "key": "collection/9/coll/84", + "version": 902, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/85", - 903, - { + }, + { + "key": "collection/9/coll/85", + "version": 903, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/86", - 904, - { + }, + { + "key": "collection/9/coll/86", + "version": 904, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/87", - 905, - { + }, + { + "key": "collection/9/coll/87", + "version": 905, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/88", - 906, - { + }, + { + "key": "collection/9/coll/88", + "version": 906, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/89", - 907, - { + }, + { + "key": "collection/9/coll/89", + "version": 907, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/90", - 908, - { + }, + { + "key": "collection/9/coll/90", + "version": 908, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/91", - 909, - { + }, + { + "key": "collection/9/coll/91", + "version": 909, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/92", - 910, - { + }, + { + "key": "collection/9/coll/92", + "version": 910, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/93", - 911, - { + }, + { + "key": "collection/9/coll/93", + "version": 911, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/94", - 912, - { + }, + { + "key": "collection/9/coll/94", + "version": 912, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/95", - 913, - { + }, + { + "key": "collection/9/coll/95", + "version": 913, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/96", - 914, - { + }, + { + "key": "collection/9/coll/96", + "version": 914, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/97", - 915, - { + }, + { + "key": "collection/9/coll/97", + "version": 915, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/98", - 916, - { + }, + { + "key": "collection/9/coll/98", + "version": 916, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/99", - 917, - { + }, + { + "key": "collection/9/coll/99", + "version": 917, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 18 @@ -46113,7 +67392,8 @@ }, { "watchSnapshot": { - "version": 918 + "version": 918, + "targetIds": [] }, "expect": [ { @@ -46128,706 +67408,1106 @@ ] }, "added": [ - [ - "collection/9/coll/0", - 818, - { + { + "key": "collection/9/coll/0", + "version": 818, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/1", - 819, - { + }, + { + "key": "collection/9/coll/1", + "version": 819, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/2", - 820, - { + }, + { + "key": "collection/9/coll/2", + "version": 820, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/3", - 821, - { + }, + { + "key": "collection/9/coll/3", + "version": 821, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/4", - 822, - { + }, + { + "key": "collection/9/coll/4", + "version": 822, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/5", - 823, - { + }, + { + "key": "collection/9/coll/5", + "version": 823, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/6", - 824, - { + }, + { + "key": "collection/9/coll/6", + "version": 824, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/7", - 825, - { + }, + { + "key": "collection/9/coll/7", + "version": 825, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/8", - 826, - { + }, + { + "key": "collection/9/coll/8", + "version": 826, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/9", - 827, - { + }, + { + "key": "collection/9/coll/9", + "version": 827, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/10", - 828, - { + }, + { + "key": "collection/9/coll/10", + "version": 828, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/11", - 829, - { + }, + { + "key": "collection/9/coll/11", + "version": 829, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/12", - 830, - { + }, + { + "key": "collection/9/coll/12", + "version": 830, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/13", - 831, - { + }, + { + "key": "collection/9/coll/13", + "version": 831, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/14", - 832, - { + }, + { + "key": "collection/9/coll/14", + "version": 832, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/15", - 833, - { + }, + { + "key": "collection/9/coll/15", + "version": 833, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/16", - 834, - { + }, + { + "key": "collection/9/coll/16", + "version": 834, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/17", - 835, - { + }, + { + "key": "collection/9/coll/17", + "version": 835, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/18", - 836, - { + }, + { + "key": "collection/9/coll/18", + "version": 836, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/19", - 837, - { + }, + { + "key": "collection/9/coll/19", + "version": 837, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/20", - 838, - { + }, + { + "key": "collection/9/coll/20", + "version": 838, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/21", - 839, - { + }, + { + "key": "collection/9/coll/21", + "version": 839, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/22", - 840, - { + }, + { + "key": "collection/9/coll/22", + "version": 840, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/23", - 841, - { + }, + { + "key": "collection/9/coll/23", + "version": 841, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/24", - 842, - { + }, + { + "key": "collection/9/coll/24", + "version": 842, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/25", - 843, - { + }, + { + "key": "collection/9/coll/25", + "version": 843, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/26", - 844, - { + }, + { + "key": "collection/9/coll/26", + "version": 844, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/27", - 845, - { + }, + { + "key": "collection/9/coll/27", + "version": 845, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/28", - 846, - { + }, + { + "key": "collection/9/coll/28", + "version": 846, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/29", - 847, - { + }, + { + "key": "collection/9/coll/29", + "version": 847, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/30", - 848, - { + }, + { + "key": "collection/9/coll/30", + "version": 848, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/31", - 849, - { + }, + { + "key": "collection/9/coll/31", + "version": 849, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/32", - 850, - { + }, + { + "key": "collection/9/coll/32", + "version": 850, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/33", - 851, - { + }, + { + "key": "collection/9/coll/33", + "version": 851, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/34", - 852, - { + }, + { + "key": "collection/9/coll/34", + "version": 852, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/35", - 853, - { + }, + { + "key": "collection/9/coll/35", + "version": 853, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/36", - 854, - { + }, + { + "key": "collection/9/coll/36", + "version": 854, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/37", - 855, - { + }, + { + "key": "collection/9/coll/37", + "version": 855, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/38", - 856, - { + }, + { + "key": "collection/9/coll/38", + "version": 856, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/39", - 857, - { + }, + { + "key": "collection/9/coll/39", + "version": 857, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/40", - 858, - { + }, + { + "key": "collection/9/coll/40", + "version": 858, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/41", - 859, - { + }, + { + "key": "collection/9/coll/41", + "version": 859, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/42", - 860, - { + }, + { + "key": "collection/9/coll/42", + "version": 860, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/43", - 861, - { + }, + { + "key": "collection/9/coll/43", + "version": 861, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/44", - 862, - { + }, + { + "key": "collection/9/coll/44", + "version": 862, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/45", - 863, - { + }, + { + "key": "collection/9/coll/45", + "version": 863, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/46", - 864, - { + }, + { + "key": "collection/9/coll/46", + "version": 864, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/47", - 865, - { + }, + { + "key": "collection/9/coll/47", + "version": 865, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/48", - 866, - { + }, + { + "key": "collection/9/coll/48", + "version": 866, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/49", - 867, - { + }, + { + "key": "collection/9/coll/49", + "version": 867, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/50", - 868, - { + }, + { + "key": "collection/9/coll/50", + "version": 868, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/51", - 869, - { + }, + { + "key": "collection/9/coll/51", + "version": 869, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/52", - 870, - { + }, + { + "key": "collection/9/coll/52", + "version": 870, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/53", - 871, - { + }, + { + "key": "collection/9/coll/53", + "version": 871, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/54", - 872, - { + }, + { + "key": "collection/9/coll/54", + "version": 872, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/55", - 873, - { + }, + { + "key": "collection/9/coll/55", + "version": 873, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/56", - 874, - { + }, + { + "key": "collection/9/coll/56", + "version": 874, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/57", - 875, - { + }, + { + "key": "collection/9/coll/57", + "version": 875, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/58", - 876, - { + }, + { + "key": "collection/9/coll/58", + "version": 876, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/59", - 877, - { + }, + { + "key": "collection/9/coll/59", + "version": 877, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/60", - 878, - { + }, + { + "key": "collection/9/coll/60", + "version": 878, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/61", - 879, - { + }, + { + "key": "collection/9/coll/61", + "version": 879, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/62", - 880, - { + }, + { + "key": "collection/9/coll/62", + "version": 880, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/63", - 881, - { + }, + { + "key": "collection/9/coll/63", + "version": 881, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/64", - 882, - { + }, + { + "key": "collection/9/coll/64", + "version": 882, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/65", - 883, - { + }, + { + "key": "collection/9/coll/65", + "version": 883, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/66", - 884, - { + }, + { + "key": "collection/9/coll/66", + "version": 884, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/67", - 885, - { + }, + { + "key": "collection/9/coll/67", + "version": 885, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/68", - 886, - { + }, + { + "key": "collection/9/coll/68", + "version": 886, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/69", - 887, - { + }, + { + "key": "collection/9/coll/69", + "version": 887, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/70", - 888, - { + }, + { + "key": "collection/9/coll/70", + "version": 888, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/71", - 889, - { + }, + { + "key": "collection/9/coll/71", + "version": 889, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/72", - 890, - { + }, + { + "key": "collection/9/coll/72", + "version": 890, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/73", - 891, - { + }, + { + "key": "collection/9/coll/73", + "version": 891, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/74", - 892, - { + }, + { + "key": "collection/9/coll/74", + "version": 892, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/75", - 893, - { + }, + { + "key": "collection/9/coll/75", + "version": 893, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/76", - 894, - { + }, + { + "key": "collection/9/coll/76", + "version": 894, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/77", - 895, - { + }, + { + "key": "collection/9/coll/77", + "version": 895, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/78", - 896, - { + }, + { + "key": "collection/9/coll/78", + "version": 896, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/79", - 897, - { + }, + { + "key": "collection/9/coll/79", + "version": 897, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/80", - 898, - { + }, + { + "key": "collection/9/coll/80", + "version": 898, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/81", - 899, - { + }, + { + "key": "collection/9/coll/81", + "version": 899, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/82", - 900, - { + }, + { + "key": "collection/9/coll/82", + "version": 900, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/83", - 901, - { + }, + { + "key": "collection/9/coll/83", + "version": 901, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/84", - 902, - { + }, + { + "key": "collection/9/coll/84", + "version": 902, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/85", - 903, - { + }, + { + "key": "collection/9/coll/85", + "version": 903, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/86", - 904, - { + }, + { + "key": "collection/9/coll/86", + "version": 904, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/87", - 905, - { + }, + { + "key": "collection/9/coll/87", + "version": 905, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/88", - 906, - { + }, + { + "key": "collection/9/coll/88", + "version": 906, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/89", - 907, - { + }, + { + "key": "collection/9/coll/89", + "version": 907, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/90", - 908, - { + }, + { + "key": "collection/9/coll/90", + "version": 908, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/91", - 909, - { + }, + { + "key": "collection/9/coll/91", + "version": 909, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/92", - 910, - { + }, + { + "key": "collection/9/coll/92", + "version": 910, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/93", - 911, - { + }, + { + "key": "collection/9/coll/93", + "version": 911, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/94", - 912, - { + }, + { + "key": "collection/9/coll/94", + "version": 912, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/95", - 913, - { + }, + { + "key": "collection/9/coll/95", + "version": 913, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/96", - 914, - { + }, + { + "key": "collection/9/coll/96", + "version": 914, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/97", - 915, - { + }, + { + "key": "collection/9/coll/97", + "version": 915, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/98", - 916, - { + }, + { + "key": "collection/9/coll/98", + "version": 916, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/99", - 917, - { + }, + { + "key": "collection/9/coll/99", + "version": 917, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -46904,706 +68584,1106 @@ ] }, "added": [ - [ - "collection/9/coll/0", - 818, - { + { + "key": "collection/9/coll/0", + "version": 818, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/1", - 819, - { + }, + { + "key": "collection/9/coll/1", + "version": 819, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/2", - 820, - { + }, + { + "key": "collection/9/coll/2", + "version": 820, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/3", - 821, - { + }, + { + "key": "collection/9/coll/3", + "version": 821, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/4", - 822, - { + }, + { + "key": "collection/9/coll/4", + "version": 822, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/5", - 823, - { + }, + { + "key": "collection/9/coll/5", + "version": 823, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/6", - 824, - { + }, + { + "key": "collection/9/coll/6", + "version": 824, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/7", - 825, - { + }, + { + "key": "collection/9/coll/7", + "version": 825, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/8", - 826, - { + }, + { + "key": "collection/9/coll/8", + "version": 826, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/9", - 827, - { + }, + { + "key": "collection/9/coll/9", + "version": 827, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/10", - 828, - { + }, + { + "key": "collection/9/coll/10", + "version": 828, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/11", - 829, - { + }, + { + "key": "collection/9/coll/11", + "version": 829, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/12", - 830, - { + }, + { + "key": "collection/9/coll/12", + "version": 830, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/13", - 831, - { + }, + { + "key": "collection/9/coll/13", + "version": 831, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/14", - 832, - { + }, + { + "key": "collection/9/coll/14", + "version": 832, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/15", - 833, - { + }, + { + "key": "collection/9/coll/15", + "version": 833, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/16", - 834, - { + }, + { + "key": "collection/9/coll/16", + "version": 834, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/17", - 835, - { + }, + { + "key": "collection/9/coll/17", + "version": 835, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/18", - 836, - { + }, + { + "key": "collection/9/coll/18", + "version": 836, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/19", - 837, - { + }, + { + "key": "collection/9/coll/19", + "version": 837, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/20", - 838, - { + }, + { + "key": "collection/9/coll/20", + "version": 838, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/21", - 839, - { + }, + { + "key": "collection/9/coll/21", + "version": 839, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/22", - 840, - { + }, + { + "key": "collection/9/coll/22", + "version": 840, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/23", - 841, - { + }, + { + "key": "collection/9/coll/23", + "version": 841, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/24", - 842, - { + }, + { + "key": "collection/9/coll/24", + "version": 842, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/25", - 843, - { + }, + { + "key": "collection/9/coll/25", + "version": 843, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/26", - 844, - { + }, + { + "key": "collection/9/coll/26", + "version": 844, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/27", - 845, - { + }, + { + "key": "collection/9/coll/27", + "version": 845, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/28", - 846, - { + }, + { + "key": "collection/9/coll/28", + "version": 846, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/29", - 847, - { + }, + { + "key": "collection/9/coll/29", + "version": 847, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/30", - 848, - { + }, + { + "key": "collection/9/coll/30", + "version": 848, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/31", - 849, - { + }, + { + "key": "collection/9/coll/31", + "version": 849, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/32", - 850, - { + }, + { + "key": "collection/9/coll/32", + "version": 850, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/33", - 851, - { + }, + { + "key": "collection/9/coll/33", + "version": 851, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/34", - 852, - { + }, + { + "key": "collection/9/coll/34", + "version": 852, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/35", - 853, - { + }, + { + "key": "collection/9/coll/35", + "version": 853, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/36", - 854, - { + }, + { + "key": "collection/9/coll/36", + "version": 854, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/37", - 855, - { + }, + { + "key": "collection/9/coll/37", + "version": 855, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/38", - 856, - { + }, + { + "key": "collection/9/coll/38", + "version": 856, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/39", - 857, - { + }, + { + "key": "collection/9/coll/39", + "version": 857, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/40", - 858, - { + }, + { + "key": "collection/9/coll/40", + "version": 858, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/41", - 859, - { + }, + { + "key": "collection/9/coll/41", + "version": 859, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/42", - 860, - { + }, + { + "key": "collection/9/coll/42", + "version": 860, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/43", - 861, - { + }, + { + "key": "collection/9/coll/43", + "version": 861, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/44", - 862, - { + }, + { + "key": "collection/9/coll/44", + "version": 862, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/45", - 863, - { + }, + { + "key": "collection/9/coll/45", + "version": 863, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/46", - 864, - { + }, + { + "key": "collection/9/coll/46", + "version": 864, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/47", - 865, - { + }, + { + "key": "collection/9/coll/47", + "version": 865, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/48", - 866, - { + }, + { + "key": "collection/9/coll/48", + "version": 866, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/49", - 867, - { + }, + { + "key": "collection/9/coll/49", + "version": 867, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/50", - 868, - { + }, + { + "key": "collection/9/coll/50", + "version": 868, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/51", - 869, - { + }, + { + "key": "collection/9/coll/51", + "version": 869, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/52", - 870, - { + }, + { + "key": "collection/9/coll/52", + "version": 870, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/53", - 871, - { + }, + { + "key": "collection/9/coll/53", + "version": 871, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/54", - 872, - { + }, + { + "key": "collection/9/coll/54", + "version": 872, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/55", - 873, - { + }, + { + "key": "collection/9/coll/55", + "version": 873, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/56", - 874, - { + }, + { + "key": "collection/9/coll/56", + "version": 874, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/57", - 875, - { + }, + { + "key": "collection/9/coll/57", + "version": 875, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/58", - 876, - { + }, + { + "key": "collection/9/coll/58", + "version": 876, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/59", - 877, - { + }, + { + "key": "collection/9/coll/59", + "version": 877, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/60", - 878, - { + }, + { + "key": "collection/9/coll/60", + "version": 878, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/61", - 879, - { + }, + { + "key": "collection/9/coll/61", + "version": 879, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/62", - 880, - { + }, + { + "key": "collection/9/coll/62", + "version": 880, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/63", - 881, - { + }, + { + "key": "collection/9/coll/63", + "version": 881, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/64", - 882, - { + }, + { + "key": "collection/9/coll/64", + "version": 882, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/65", - 883, - { + }, + { + "key": "collection/9/coll/65", + "version": 883, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/66", - 884, - { + }, + { + "key": "collection/9/coll/66", + "version": 884, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/67", - 885, - { + }, + { + "key": "collection/9/coll/67", + "version": 885, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/68", - 886, - { + }, + { + "key": "collection/9/coll/68", + "version": 886, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/69", - 887, - { + }, + { + "key": "collection/9/coll/69", + "version": 887, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/70", - 888, - { + }, + { + "key": "collection/9/coll/70", + "version": 888, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/71", - 889, - { + }, + { + "key": "collection/9/coll/71", + "version": 889, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/72", - 890, - { + }, + { + "key": "collection/9/coll/72", + "version": 890, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/73", - 891, - { + }, + { + "key": "collection/9/coll/73", + "version": 891, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/74", - 892, - { + }, + { + "key": "collection/9/coll/74", + "version": 892, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/75", - 893, - { + }, + { + "key": "collection/9/coll/75", + "version": 893, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/76", - 894, - { + }, + { + "key": "collection/9/coll/76", + "version": 894, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/77", - 895, - { + }, + { + "key": "collection/9/coll/77", + "version": 895, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/78", - 896, - { + }, + { + "key": "collection/9/coll/78", + "version": 896, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/79", - 897, - { + }, + { + "key": "collection/9/coll/79", + "version": 897, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/80", - 898, - { + }, + { + "key": "collection/9/coll/80", + "version": 898, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/81", - 899, - { + }, + { + "key": "collection/9/coll/81", + "version": 899, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/82", - 900, - { + }, + { + "key": "collection/9/coll/82", + "version": 900, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/83", - 901, - { + }, + { + "key": "collection/9/coll/83", + "version": 901, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/84", - 902, - { + }, + { + "key": "collection/9/coll/84", + "version": 902, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/85", - 903, - { + }, + { + "key": "collection/9/coll/85", + "version": 903, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/86", - 904, - { + }, + { + "key": "collection/9/coll/86", + "version": 904, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/87", - 905, - { + }, + { + "key": "collection/9/coll/87", + "version": 905, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/88", - 906, - { + }, + { + "key": "collection/9/coll/88", + "version": 906, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/89", - 907, - { + }, + { + "key": "collection/9/coll/89", + "version": 907, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/90", - 908, - { + }, + { + "key": "collection/9/coll/90", + "version": 908, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/91", - 909, - { + }, + { + "key": "collection/9/coll/91", + "version": 909, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/92", - 910, - { + }, + { + "key": "collection/9/coll/92", + "version": 910, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/93", - 911, - { + }, + { + "key": "collection/9/coll/93", + "version": 911, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/94", - 912, - { + }, + { + "key": "collection/9/coll/94", + "version": 912, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/95", - 913, - { + }, + { + "key": "collection/9/coll/95", + "version": 913, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/96", - 914, - { + }, + { + "key": "collection/9/coll/96", + "version": 914, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/97", - 915, - { + }, + { + "key": "collection/9/coll/97", + "version": 915, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/98", - 916, - { + }, + { + "key": "collection/9/coll/98", + "version": 916, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/9/coll/99", - 917, - { + }, + { + "key": "collection/9/coll/99", + "version": 917, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -47634,7 +69714,8 @@ }, { "watchSnapshot": { - "version": 919 + "version": 919, + "targetIds": [] }, "expect": [ { @@ -47719,706 +69800,1106 @@ { "watchEntity": { "docs": [ - [ - "collection/10/coll/0", - 920, - { + { + "key": "collection/10/coll/0", + "version": 920, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/1", - 921, - { + }, + { + "key": "collection/10/coll/1", + "version": 921, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/2", - 922, - { + }, + { + "key": "collection/10/coll/2", + "version": 922, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/3", - 923, - { + }, + { + "key": "collection/10/coll/3", + "version": 923, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/4", - 924, - { + }, + { + "key": "collection/10/coll/4", + "version": 924, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/5", - 925, - { + }, + { + "key": "collection/10/coll/5", + "version": 925, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/6", - 926, - { + }, + { + "key": "collection/10/coll/6", + "version": 926, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/7", - 927, - { + }, + { + "key": "collection/10/coll/7", + "version": 927, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/8", - 928, - { + }, + { + "key": "collection/10/coll/8", + "version": 928, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/9", - 929, - { + }, + { + "key": "collection/10/coll/9", + "version": 929, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/10", - 930, - { + }, + { + "key": "collection/10/coll/10", + "version": 930, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/11", - 931, - { + }, + { + "key": "collection/10/coll/11", + "version": 931, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/12", - 932, - { + }, + { + "key": "collection/10/coll/12", + "version": 932, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/13", - 933, - { + }, + { + "key": "collection/10/coll/13", + "version": 933, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/14", - 934, - { + }, + { + "key": "collection/10/coll/14", + "version": 934, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/15", - 935, - { + }, + { + "key": "collection/10/coll/15", + "version": 935, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/16", - 936, - { + }, + { + "key": "collection/10/coll/16", + "version": 936, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/17", - 937, - { + }, + { + "key": "collection/10/coll/17", + "version": 937, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/18", - 938, - { + }, + { + "key": "collection/10/coll/18", + "version": 938, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/19", - 939, - { + }, + { + "key": "collection/10/coll/19", + "version": 939, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/20", - 940, - { + }, + { + "key": "collection/10/coll/20", + "version": 940, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/21", - 941, - { + }, + { + "key": "collection/10/coll/21", + "version": 941, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/22", - 942, - { + }, + { + "key": "collection/10/coll/22", + "version": 942, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/23", - 943, - { + }, + { + "key": "collection/10/coll/23", + "version": 943, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/24", - 944, - { + }, + { + "key": "collection/10/coll/24", + "version": 944, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/25", - 945, - { + }, + { + "key": "collection/10/coll/25", + "version": 945, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/26", - 946, - { + }, + { + "key": "collection/10/coll/26", + "version": 946, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/27", - 947, - { + }, + { + "key": "collection/10/coll/27", + "version": 947, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/28", - 948, - { + }, + { + "key": "collection/10/coll/28", + "version": 948, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/29", - 949, - { + }, + { + "key": "collection/10/coll/29", + "version": 949, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/30", - 950, - { + }, + { + "key": "collection/10/coll/30", + "version": 950, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/31", - 951, - { + }, + { + "key": "collection/10/coll/31", + "version": 951, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/32", - 952, - { + }, + { + "key": "collection/10/coll/32", + "version": 952, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/33", - 953, - { + }, + { + "key": "collection/10/coll/33", + "version": 953, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/34", - 954, - { + }, + { + "key": "collection/10/coll/34", + "version": 954, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/35", - 955, - { + }, + { + "key": "collection/10/coll/35", + "version": 955, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/36", - 956, - { + }, + { + "key": "collection/10/coll/36", + "version": 956, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/37", - 957, - { + }, + { + "key": "collection/10/coll/37", + "version": 957, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/38", - 958, - { + }, + { + "key": "collection/10/coll/38", + "version": 958, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/39", - 959, - { + }, + { + "key": "collection/10/coll/39", + "version": 959, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/40", - 960, - { + }, + { + "key": "collection/10/coll/40", + "version": 960, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/41", - 961, - { + }, + { + "key": "collection/10/coll/41", + "version": 961, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/42", - 962, - { + }, + { + "key": "collection/10/coll/42", + "version": 962, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/43", - 963, - { + }, + { + "key": "collection/10/coll/43", + "version": 963, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/44", - 964, - { + }, + { + "key": "collection/10/coll/44", + "version": 964, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/45", - 965, - { + }, + { + "key": "collection/10/coll/45", + "version": 965, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/46", - 966, - { + }, + { + "key": "collection/10/coll/46", + "version": 966, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/47", - 967, - { + }, + { + "key": "collection/10/coll/47", + "version": 967, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/48", - 968, - { + }, + { + "key": "collection/10/coll/48", + "version": 968, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/49", - 969, - { + }, + { + "key": "collection/10/coll/49", + "version": 969, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/50", - 970, - { + }, + { + "key": "collection/10/coll/50", + "version": 970, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/51", - 971, - { + }, + { + "key": "collection/10/coll/51", + "version": 971, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/52", - 972, - { + }, + { + "key": "collection/10/coll/52", + "version": 972, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/53", - 973, - { + }, + { + "key": "collection/10/coll/53", + "version": 973, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/54", - 974, - { + }, + { + "key": "collection/10/coll/54", + "version": 974, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/55", - 975, - { + }, + { + "key": "collection/10/coll/55", + "version": 975, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/56", - 976, - { + }, + { + "key": "collection/10/coll/56", + "version": 976, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/57", - 977, - { + }, + { + "key": "collection/10/coll/57", + "version": 977, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/58", - 978, - { + }, + { + "key": "collection/10/coll/58", + "version": 978, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/59", - 979, - { + }, + { + "key": "collection/10/coll/59", + "version": 979, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/60", - 980, - { + }, + { + "key": "collection/10/coll/60", + "version": 980, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/61", - 981, - { + }, + { + "key": "collection/10/coll/61", + "version": 981, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/62", - 982, - { + }, + { + "key": "collection/10/coll/62", + "version": 982, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/63", - 983, - { + }, + { + "key": "collection/10/coll/63", + "version": 983, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/64", - 984, - { + }, + { + "key": "collection/10/coll/64", + "version": 984, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/65", - 985, - { + }, + { + "key": "collection/10/coll/65", + "version": 985, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/66", - 986, - { + }, + { + "key": "collection/10/coll/66", + "version": 986, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/67", - 987, - { + }, + { + "key": "collection/10/coll/67", + "version": 987, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/68", - 988, - { + }, + { + "key": "collection/10/coll/68", + "version": 988, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/69", - 989, - { + }, + { + "key": "collection/10/coll/69", + "version": 989, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/70", - 990, - { + }, + { + "key": "collection/10/coll/70", + "version": 990, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/71", - 991, - { + }, + { + "key": "collection/10/coll/71", + "version": 991, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/72", - 992, - { + }, + { + "key": "collection/10/coll/72", + "version": 992, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/73", - 993, - { + }, + { + "key": "collection/10/coll/73", + "version": 993, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/74", - 994, - { + }, + { + "key": "collection/10/coll/74", + "version": 994, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/75", - 995, - { + }, + { + "key": "collection/10/coll/75", + "version": 995, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/76", - 996, - { + }, + { + "key": "collection/10/coll/76", + "version": 996, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/77", - 997, - { + }, + { + "key": "collection/10/coll/77", + "version": 997, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/78", - 998, - { + }, + { + "key": "collection/10/coll/78", + "version": 998, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/79", - 999, - { + }, + { + "key": "collection/10/coll/79", + "version": 999, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/80", - 1000, - { + }, + { + "key": "collection/10/coll/80", + "version": 1000, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/81", - 1001, - { + }, + { + "key": "collection/10/coll/81", + "version": 1001, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/82", - 1002, - { + }, + { + "key": "collection/10/coll/82", + "version": 1002, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/83", - 1003, - { + }, + { + "key": "collection/10/coll/83", + "version": 1003, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/84", - 1004, - { + }, + { + "key": "collection/10/coll/84", + "version": 1004, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/85", - 1005, - { + }, + { + "key": "collection/10/coll/85", + "version": 1005, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/86", - 1006, - { + }, + { + "key": "collection/10/coll/86", + "version": 1006, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/87", - 1007, - { + }, + { + "key": "collection/10/coll/87", + "version": 1007, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/88", - 1008, - { + }, + { + "key": "collection/10/coll/88", + "version": 1008, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/89", - 1009, - { + }, + { + "key": "collection/10/coll/89", + "version": 1009, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/90", - 1010, - { + }, + { + "key": "collection/10/coll/90", + "version": 1010, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/91", - 1011, - { + }, + { + "key": "collection/10/coll/91", + "version": 1011, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/92", - 1012, - { + }, + { + "key": "collection/10/coll/92", + "version": 1012, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/93", - 1013, - { + }, + { + "key": "collection/10/coll/93", + "version": 1013, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/94", - 1014, - { + }, + { + "key": "collection/10/coll/94", + "version": 1014, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/95", - 1015, - { + }, + { + "key": "collection/10/coll/95", + "version": 1015, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/96", - 1016, - { + }, + { + "key": "collection/10/coll/96", + "version": 1016, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/97", - 1017, - { + }, + { + "key": "collection/10/coll/97", + "version": 1017, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/98", - 1018, - { + }, + { + "key": "collection/10/coll/98", + "version": 1018, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/99", - 1019, - { + }, + { + "key": "collection/10/coll/99", + "version": 1019, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 20 @@ -48435,7 +70916,8 @@ }, { "watchSnapshot": { - "version": 1020 + "version": 1020, + "targetIds": [] }, "expect": [ { @@ -48450,706 +70932,1106 @@ ] }, "added": [ - [ - "collection/10/coll/0", - 920, - { + { + "key": "collection/10/coll/0", + "version": 920, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/1", - 921, - { + }, + { + "key": "collection/10/coll/1", + "version": 921, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/2", - 922, - { + }, + { + "key": "collection/10/coll/2", + "version": 922, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/3", - 923, - { + }, + { + "key": "collection/10/coll/3", + "version": 923, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/4", - 924, - { + }, + { + "key": "collection/10/coll/4", + "version": 924, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/5", - 925, - { + }, + { + "key": "collection/10/coll/5", + "version": 925, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/6", - 926, - { + }, + { + "key": "collection/10/coll/6", + "version": 926, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/7", - 927, - { + }, + { + "key": "collection/10/coll/7", + "version": 927, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/8", - 928, - { + }, + { + "key": "collection/10/coll/8", + "version": 928, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/9", - 929, - { + }, + { + "key": "collection/10/coll/9", + "version": 929, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/10", - 930, - { + }, + { + "key": "collection/10/coll/10", + "version": 930, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/11", - 931, - { + }, + { + "key": "collection/10/coll/11", + "version": 931, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/12", - 932, - { + }, + { + "key": "collection/10/coll/12", + "version": 932, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/13", - 933, - { + }, + { + "key": "collection/10/coll/13", + "version": 933, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/14", - 934, - { + }, + { + "key": "collection/10/coll/14", + "version": 934, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/15", - 935, - { + }, + { + "key": "collection/10/coll/15", + "version": 935, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/16", - 936, - { + }, + { + "key": "collection/10/coll/16", + "version": 936, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/17", - 937, - { + }, + { + "key": "collection/10/coll/17", + "version": 937, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/18", - 938, - { + }, + { + "key": "collection/10/coll/18", + "version": 938, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/19", - 939, - { + }, + { + "key": "collection/10/coll/19", + "version": 939, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/20", - 940, - { + }, + { + "key": "collection/10/coll/20", + "version": 940, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/21", - 941, - { + }, + { + "key": "collection/10/coll/21", + "version": 941, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/22", - 942, - { + }, + { + "key": "collection/10/coll/22", + "version": 942, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/23", - 943, - { + }, + { + "key": "collection/10/coll/23", + "version": 943, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/24", - 944, - { + }, + { + "key": "collection/10/coll/24", + "version": 944, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/25", - 945, - { + }, + { + "key": "collection/10/coll/25", + "version": 945, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/26", - 946, - { + }, + { + "key": "collection/10/coll/26", + "version": 946, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/27", - 947, - { + }, + { + "key": "collection/10/coll/27", + "version": 947, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/28", - 948, - { + }, + { + "key": "collection/10/coll/28", + "version": 948, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/29", - 949, - { + }, + { + "key": "collection/10/coll/29", + "version": 949, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/30", - 950, - { + }, + { + "key": "collection/10/coll/30", + "version": 950, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/31", - 951, - { + }, + { + "key": "collection/10/coll/31", + "version": 951, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/32", - 952, - { + }, + { + "key": "collection/10/coll/32", + "version": 952, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/33", - 953, - { + }, + { + "key": "collection/10/coll/33", + "version": 953, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/34", - 954, - { + }, + { + "key": "collection/10/coll/34", + "version": 954, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/35", - 955, - { + }, + { + "key": "collection/10/coll/35", + "version": 955, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/36", - 956, - { + }, + { + "key": "collection/10/coll/36", + "version": 956, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/37", - 957, - { + }, + { + "key": "collection/10/coll/37", + "version": 957, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/38", - 958, - { + }, + { + "key": "collection/10/coll/38", + "version": 958, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/39", - 959, - { + }, + { + "key": "collection/10/coll/39", + "version": 959, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/40", - 960, - { + }, + { + "key": "collection/10/coll/40", + "version": 960, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/41", - 961, - { + }, + { + "key": "collection/10/coll/41", + "version": 961, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/42", - 962, - { + }, + { + "key": "collection/10/coll/42", + "version": 962, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/43", - 963, - { + }, + { + "key": "collection/10/coll/43", + "version": 963, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/44", - 964, - { + }, + { + "key": "collection/10/coll/44", + "version": 964, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/45", - 965, - { + }, + { + "key": "collection/10/coll/45", + "version": 965, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/46", - 966, - { + }, + { + "key": "collection/10/coll/46", + "version": 966, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/47", - 967, - { + }, + { + "key": "collection/10/coll/47", + "version": 967, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/48", - 968, - { + }, + { + "key": "collection/10/coll/48", + "version": 968, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/49", - 969, - { + }, + { + "key": "collection/10/coll/49", + "version": 969, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/50", - 970, - { + }, + { + "key": "collection/10/coll/50", + "version": 970, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/51", - 971, - { + }, + { + "key": "collection/10/coll/51", + "version": 971, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/52", - 972, - { + }, + { + "key": "collection/10/coll/52", + "version": 972, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/53", - 973, - { + }, + { + "key": "collection/10/coll/53", + "version": 973, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/54", - 974, - { + }, + { + "key": "collection/10/coll/54", + "version": 974, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/55", - 975, - { + }, + { + "key": "collection/10/coll/55", + "version": 975, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/56", - 976, - { + }, + { + "key": "collection/10/coll/56", + "version": 976, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/57", - 977, - { + }, + { + "key": "collection/10/coll/57", + "version": 977, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/58", - 978, - { + }, + { + "key": "collection/10/coll/58", + "version": 978, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/59", - 979, - { + }, + { + "key": "collection/10/coll/59", + "version": 979, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/60", - 980, - { + }, + { + "key": "collection/10/coll/60", + "version": 980, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/61", - 981, - { + }, + { + "key": "collection/10/coll/61", + "version": 981, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/62", - 982, - { + }, + { + "key": "collection/10/coll/62", + "version": 982, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/63", - 983, - { + }, + { + "key": "collection/10/coll/63", + "version": 983, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/64", - 984, - { + }, + { + "key": "collection/10/coll/64", + "version": 984, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/65", - 985, - { + }, + { + "key": "collection/10/coll/65", + "version": 985, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/66", - 986, - { + }, + { + "key": "collection/10/coll/66", + "version": 986, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/67", - 987, - { + }, + { + "key": "collection/10/coll/67", + "version": 987, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/68", - 988, - { + }, + { + "key": "collection/10/coll/68", + "version": 988, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/69", - 989, - { + }, + { + "key": "collection/10/coll/69", + "version": 989, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/70", - 990, - { + }, + { + "key": "collection/10/coll/70", + "version": 990, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/71", - 991, - { + }, + { + "key": "collection/10/coll/71", + "version": 991, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/72", - 992, - { + }, + { + "key": "collection/10/coll/72", + "version": 992, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/73", - 993, - { + }, + { + "key": "collection/10/coll/73", + "version": 993, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/74", - 994, - { + }, + { + "key": "collection/10/coll/74", + "version": 994, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/75", - 995, - { + }, + { + "key": "collection/10/coll/75", + "version": 995, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/76", - 996, - { + }, + { + "key": "collection/10/coll/76", + "version": 996, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/77", - 997, - { + }, + { + "key": "collection/10/coll/77", + "version": 997, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/78", - 998, - { + }, + { + "key": "collection/10/coll/78", + "version": 998, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/79", - 999, - { + }, + { + "key": "collection/10/coll/79", + "version": 999, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/80", - 1000, - { + }, + { + "key": "collection/10/coll/80", + "version": 1000, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/81", - 1001, - { + }, + { + "key": "collection/10/coll/81", + "version": 1001, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/82", - 1002, - { + }, + { + "key": "collection/10/coll/82", + "version": 1002, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/83", - 1003, - { + }, + { + "key": "collection/10/coll/83", + "version": 1003, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/84", - 1004, - { + }, + { + "key": "collection/10/coll/84", + "version": 1004, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/85", - 1005, - { + }, + { + "key": "collection/10/coll/85", + "version": 1005, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/86", - 1006, - { + }, + { + "key": "collection/10/coll/86", + "version": 1006, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/87", - 1007, - { + }, + { + "key": "collection/10/coll/87", + "version": 1007, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/88", - 1008, - { + }, + { + "key": "collection/10/coll/88", + "version": 1008, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/89", - 1009, - { + }, + { + "key": "collection/10/coll/89", + "version": 1009, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/90", - 1010, - { + }, + { + "key": "collection/10/coll/90", + "version": 1010, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/91", - 1011, - { + }, + { + "key": "collection/10/coll/91", + "version": 1011, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/92", - 1012, - { + }, + { + "key": "collection/10/coll/92", + "version": 1012, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/93", - 1013, - { + }, + { + "key": "collection/10/coll/93", + "version": 1013, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/94", - 1014, - { + }, + { + "key": "collection/10/coll/94", + "version": 1014, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/95", - 1015, - { + }, + { + "key": "collection/10/coll/95", + "version": 1015, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/96", - 1016, - { + }, + { + "key": "collection/10/coll/96", + "version": 1016, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/97", - 1017, - { + }, + { + "key": "collection/10/coll/97", + "version": 1017, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/98", - 1018, - { + }, + { + "key": "collection/10/coll/98", + "version": 1018, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/99", - 1019, - { + }, + { + "key": "collection/10/coll/99", + "version": 1019, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -49226,706 +72108,1106 @@ ] }, "added": [ - [ - "collection/10/coll/0", - 920, - { + { + "key": "collection/10/coll/0", + "version": 920, + "value": { "v": 0 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/1", - 921, - { + }, + { + "key": "collection/10/coll/1", + "version": 921, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/2", - 922, - { + }, + { + "key": "collection/10/coll/2", + "version": 922, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/3", - 923, - { + }, + { + "key": "collection/10/coll/3", + "version": 923, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/4", - 924, - { + }, + { + "key": "collection/10/coll/4", + "version": 924, + "value": { "v": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/5", - 925, - { + }, + { + "key": "collection/10/coll/5", + "version": 925, + "value": { "v": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/6", - 926, - { + }, + { + "key": "collection/10/coll/6", + "version": 926, + "value": { "v": 6 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/7", - 927, - { + }, + { + "key": "collection/10/coll/7", + "version": 927, + "value": { "v": 7 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/8", - 928, - { + }, + { + "key": "collection/10/coll/8", + "version": 928, + "value": { "v": 8 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/9", - 929, - { + }, + { + "key": "collection/10/coll/9", + "version": 929, + "value": { "v": 9 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/10", - 930, - { + }, + { + "key": "collection/10/coll/10", + "version": 930, + "value": { "v": 10 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/11", - 931, - { + }, + { + "key": "collection/10/coll/11", + "version": 931, + "value": { "v": 11 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/12", - 932, - { + }, + { + "key": "collection/10/coll/12", + "version": 932, + "value": { "v": 12 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/13", - 933, - { + }, + { + "key": "collection/10/coll/13", + "version": 933, + "value": { "v": 13 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/14", - 934, - { + }, + { + "key": "collection/10/coll/14", + "version": 934, + "value": { "v": 14 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/15", - 935, - { + }, + { + "key": "collection/10/coll/15", + "version": 935, + "value": { "v": 15 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/16", - 936, - { + }, + { + "key": "collection/10/coll/16", + "version": 936, + "value": { "v": 16 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/17", - 937, - { + }, + { + "key": "collection/10/coll/17", + "version": 937, + "value": { "v": 17 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/18", - 938, - { + }, + { + "key": "collection/10/coll/18", + "version": 938, + "value": { "v": 18 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/19", - 939, - { + }, + { + "key": "collection/10/coll/19", + "version": 939, + "value": { "v": 19 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/20", - 940, - { + }, + { + "key": "collection/10/coll/20", + "version": 940, + "value": { "v": 20 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/21", - 941, - { + }, + { + "key": "collection/10/coll/21", + "version": 941, + "value": { "v": 21 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/22", - 942, - { + }, + { + "key": "collection/10/coll/22", + "version": 942, + "value": { "v": 22 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/23", - 943, - { + }, + { + "key": "collection/10/coll/23", + "version": 943, + "value": { "v": 23 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/24", - 944, - { + }, + { + "key": "collection/10/coll/24", + "version": 944, + "value": { "v": 24 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/25", - 945, - { + }, + { + "key": "collection/10/coll/25", + "version": 945, + "value": { "v": 25 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/26", - 946, - { + }, + { + "key": "collection/10/coll/26", + "version": 946, + "value": { "v": 26 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/27", - 947, - { + }, + { + "key": "collection/10/coll/27", + "version": 947, + "value": { "v": 27 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/28", - 948, - { + }, + { + "key": "collection/10/coll/28", + "version": 948, + "value": { "v": 28 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/29", - 949, - { + }, + { + "key": "collection/10/coll/29", + "version": 949, + "value": { "v": 29 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/30", - 950, - { + }, + { + "key": "collection/10/coll/30", + "version": 950, + "value": { "v": 30 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/31", - 951, - { + }, + { + "key": "collection/10/coll/31", + "version": 951, + "value": { "v": 31 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/32", - 952, - { + }, + { + "key": "collection/10/coll/32", + "version": 952, + "value": { "v": 32 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/33", - 953, - { + }, + { + "key": "collection/10/coll/33", + "version": 953, + "value": { "v": 33 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/34", - 954, - { + }, + { + "key": "collection/10/coll/34", + "version": 954, + "value": { "v": 34 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/35", - 955, - { + }, + { + "key": "collection/10/coll/35", + "version": 955, + "value": { "v": 35 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/36", - 956, - { + }, + { + "key": "collection/10/coll/36", + "version": 956, + "value": { "v": 36 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/37", - 957, - { + }, + { + "key": "collection/10/coll/37", + "version": 957, + "value": { "v": 37 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/38", - 958, - { + }, + { + "key": "collection/10/coll/38", + "version": 958, + "value": { "v": 38 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/39", - 959, - { + }, + { + "key": "collection/10/coll/39", + "version": 959, + "value": { "v": 39 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/40", - 960, - { + }, + { + "key": "collection/10/coll/40", + "version": 960, + "value": { "v": 40 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/41", - 961, - { + }, + { + "key": "collection/10/coll/41", + "version": 961, + "value": { "v": 41 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/42", - 962, - { + }, + { + "key": "collection/10/coll/42", + "version": 962, + "value": { "v": 42 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/43", - 963, - { + }, + { + "key": "collection/10/coll/43", + "version": 963, + "value": { "v": 43 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/44", - 964, - { + }, + { + "key": "collection/10/coll/44", + "version": 964, + "value": { "v": 44 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/45", - 965, - { + }, + { + "key": "collection/10/coll/45", + "version": 965, + "value": { "v": 45 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/46", - 966, - { + }, + { + "key": "collection/10/coll/46", + "version": 966, + "value": { "v": 46 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/47", - 967, - { + }, + { + "key": "collection/10/coll/47", + "version": 967, + "value": { "v": 47 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/48", - 968, - { + }, + { + "key": "collection/10/coll/48", + "version": 968, + "value": { "v": 48 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/49", - 969, - { + }, + { + "key": "collection/10/coll/49", + "version": 969, + "value": { "v": 49 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/50", - 970, - { + }, + { + "key": "collection/10/coll/50", + "version": 970, + "value": { "v": 50 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/51", - 971, - { + }, + { + "key": "collection/10/coll/51", + "version": 971, + "value": { "v": 51 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/52", - 972, - { + }, + { + "key": "collection/10/coll/52", + "version": 972, + "value": { "v": 52 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/53", - 973, - { + }, + { + "key": "collection/10/coll/53", + "version": 973, + "value": { "v": 53 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/54", - 974, - { + }, + { + "key": "collection/10/coll/54", + "version": 974, + "value": { "v": 54 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/55", - 975, - { + }, + { + "key": "collection/10/coll/55", + "version": 975, + "value": { "v": 55 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/56", - 976, - { + }, + { + "key": "collection/10/coll/56", + "version": 976, + "value": { "v": 56 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/57", - 977, - { + }, + { + "key": "collection/10/coll/57", + "version": 977, + "value": { "v": 57 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/58", - 978, - { + }, + { + "key": "collection/10/coll/58", + "version": 978, + "value": { "v": 58 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/59", - 979, - { + }, + { + "key": "collection/10/coll/59", + "version": 979, + "value": { "v": 59 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/60", - 980, - { + }, + { + "key": "collection/10/coll/60", + "version": 980, + "value": { "v": 60 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/61", - 981, - { + }, + { + "key": "collection/10/coll/61", + "version": 981, + "value": { "v": 61 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/62", - 982, - { + }, + { + "key": "collection/10/coll/62", + "version": 982, + "value": { "v": 62 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/63", - 983, - { + }, + { + "key": "collection/10/coll/63", + "version": 983, + "value": { "v": 63 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/64", - 984, - { + }, + { + "key": "collection/10/coll/64", + "version": 984, + "value": { "v": 64 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/65", - 985, - { + }, + { + "key": "collection/10/coll/65", + "version": 985, + "value": { "v": 65 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/66", - 986, - { + }, + { + "key": "collection/10/coll/66", + "version": 986, + "value": { "v": 66 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/67", - 987, - { + }, + { + "key": "collection/10/coll/67", + "version": 987, + "value": { "v": 67 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/68", - 988, - { + }, + { + "key": "collection/10/coll/68", + "version": 988, + "value": { "v": 68 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/69", - 989, - { + }, + { + "key": "collection/10/coll/69", + "version": 989, + "value": { "v": 69 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/70", - 990, - { + }, + { + "key": "collection/10/coll/70", + "version": 990, + "value": { "v": 70 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/71", - 991, - { + }, + { + "key": "collection/10/coll/71", + "version": 991, + "value": { "v": 71 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/72", - 992, - { + }, + { + "key": "collection/10/coll/72", + "version": 992, + "value": { "v": 72 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/73", - 993, - { + }, + { + "key": "collection/10/coll/73", + "version": 993, + "value": { "v": 73 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/74", - 994, - { + }, + { + "key": "collection/10/coll/74", + "version": 994, + "value": { "v": 74 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/75", - 995, - { + }, + { + "key": "collection/10/coll/75", + "version": 995, + "value": { "v": 75 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/76", - 996, - { + }, + { + "key": "collection/10/coll/76", + "version": 996, + "value": { "v": 76 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/77", - 997, - { + }, + { + "key": "collection/10/coll/77", + "version": 997, + "value": { "v": 77 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/78", - 998, - { + }, + { + "key": "collection/10/coll/78", + "version": 998, + "value": { "v": 78 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/79", - 999, - { + }, + { + "key": "collection/10/coll/79", + "version": 999, + "value": { "v": 79 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/80", - 1000, - { + }, + { + "key": "collection/10/coll/80", + "version": 1000, + "value": { "v": 80 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/81", - 1001, - { + }, + { + "key": "collection/10/coll/81", + "version": 1001, + "value": { "v": 81 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/82", - 1002, - { + }, + { + "key": "collection/10/coll/82", + "version": 1002, + "value": { "v": 82 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/83", - 1003, - { + }, + { + "key": "collection/10/coll/83", + "version": 1003, + "value": { "v": 83 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/84", - 1004, - { + }, + { + "key": "collection/10/coll/84", + "version": 1004, + "value": { "v": 84 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/85", - 1005, - { + }, + { + "key": "collection/10/coll/85", + "version": 1005, + "value": { "v": 85 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/86", - 1006, - { + }, + { + "key": "collection/10/coll/86", + "version": 1006, + "value": { "v": 86 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/87", - 1007, - { + }, + { + "key": "collection/10/coll/87", + "version": 1007, + "value": { "v": 87 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/88", - 1008, - { + }, + { + "key": "collection/10/coll/88", + "version": 1008, + "value": { "v": 88 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/89", - 1009, - { + }, + { + "key": "collection/10/coll/89", + "version": 1009, + "value": { "v": 89 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/90", - 1010, - { + }, + { + "key": "collection/10/coll/90", + "version": 1010, + "value": { "v": 90 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/91", - 1011, - { + }, + { + "key": "collection/10/coll/91", + "version": 1011, + "value": { "v": 91 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/92", - 1012, - { + }, + { + "key": "collection/10/coll/92", + "version": 1012, + "value": { "v": 92 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/93", - 1013, - { + }, + { + "key": "collection/10/coll/93", + "version": 1013, + "value": { "v": 93 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/94", - 1014, - { + }, + { + "key": "collection/10/coll/94", + "version": 1014, + "value": { "v": 94 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/95", - 1015, - { + }, + { + "key": "collection/10/coll/95", + "version": 1015, + "value": { "v": 95 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/96", - 1016, - { + }, + { + "key": "collection/10/coll/96", + "version": 1016, + "value": { "v": 96 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/97", - 1017, - { + }, + { + "key": "collection/10/coll/97", + "version": 1017, + "value": { "v": 97 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/98", - 1018, - { + }, + { + "key": "collection/10/coll/98", + "version": 1018, + "value": { "v": 98 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/10/coll/99", - 1019, - { + }, + { + "key": "collection/10/coll/99", + "version": 1019, + "value": { "v": 99 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -49956,7 +73238,8 @@ }, { "watchSnapshot": { - "version": 1021 + "version": 1021, + "targetIds": [] }, "expect": [ { @@ -55192,13 +78475,17 @@ { "watchEntity": { "docs": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2, @@ -55231,7 +78518,8 @@ }, { "watchSnapshot": { - "version": 3 + "version": 3, + "targetIds": [] }, "expect": [ { @@ -55247,13 +78535,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55272,13 +78564,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55297,13 +78593,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55322,13 +78622,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55347,13 +78651,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55372,13 +78680,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55397,13 +78709,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55422,13 +78738,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55447,13 +78767,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55472,13 +78796,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55497,13 +78825,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55522,13 +78854,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55547,13 +78883,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55572,13 +78912,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55597,13 +78941,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55622,13 +78970,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55647,13 +78999,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55672,13 +79028,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55697,13 +79057,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55722,13 +79086,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55747,13 +79115,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55772,13 +79144,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55797,13 +79173,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55822,13 +79202,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -55847,13 +79231,17 @@ "orderBys": [] }, "added": [ - [ - "collection/1/coll/matches", - 2, - { + { + "key": "collection/1/coll/matches", + "version": 2, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -65913,13 +89301,17 @@ { "watchEntity": { "docs": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 52, @@ -65952,7 +89344,8 @@ }, { "watchSnapshot": { - "version": 5 + "version": 5, + "targetIds": [] }, "expect": [ { @@ -65968,13 +89361,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -65993,13 +89390,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66018,13 +89419,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66043,13 +89448,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66068,13 +89477,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66093,13 +89506,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66118,13 +89535,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66143,13 +89564,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66168,13 +89593,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66193,13 +89622,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66218,13 +89651,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66243,13 +89680,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66268,13 +89709,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66293,13 +89738,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66318,13 +89767,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66343,13 +89796,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66368,13 +89825,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66393,13 +89854,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66418,13 +89883,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66443,13 +89912,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66468,13 +89941,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66493,13 +89970,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66518,13 +89999,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66543,13 +90028,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -66568,13 +90057,17 @@ "orderBys": [] }, "added": [ - [ - "collection/2/coll/matches", - 4, - { + { + "key": "collection/2/coll/matches", + "version": 4, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76634,13 +100127,17 @@ { "watchEntity": { "docs": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 102, @@ -76673,7 +100170,8 @@ }, { "watchSnapshot": { - "version": 7 + "version": 7, + "targetIds": [] }, "expect": [ { @@ -76689,13 +100187,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76714,13 +100216,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76739,13 +100245,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76764,13 +100274,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76789,13 +100303,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76814,13 +100332,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76839,13 +100361,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76864,13 +100390,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76889,13 +100419,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76914,13 +100448,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76939,13 +100477,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76964,13 +100506,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -76989,13 +100535,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77014,13 +100564,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77039,13 +100593,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77064,13 +100622,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77089,13 +100651,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77114,13 +100680,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77139,13 +100709,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77164,13 +100738,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77189,13 +100767,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77214,13 +100796,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77239,13 +100825,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77264,13 +100854,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -77289,13 +100883,17 @@ "orderBys": [] }, "added": [ - [ - "collection/3/coll/matches", - 6, - { + { + "key": "collection/3/coll/matches", + "version": 6, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87355,13 +110953,17 @@ { "watchEntity": { "docs": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 152, @@ -87394,7 +110996,8 @@ }, { "watchSnapshot": { - "version": 9 + "version": 9, + "targetIds": [] }, "expect": [ { @@ -87410,13 +111013,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87435,13 +111042,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87460,13 +111071,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87485,13 +111100,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87510,13 +111129,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87535,13 +111158,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87560,13 +111187,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87585,13 +111216,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87610,13 +111245,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87635,13 +111274,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87660,13 +111303,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87685,13 +111332,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87710,13 +111361,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87735,13 +111390,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87760,13 +111419,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87785,13 +111448,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87810,13 +111477,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87835,13 +111506,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87860,13 +111535,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87885,13 +111564,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87910,13 +111593,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87935,13 +111622,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87960,13 +111651,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -87985,13 +111680,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -88010,13 +111709,17 @@ "orderBys": [] }, "added": [ - [ - "collection/4/coll/matches", - 8, - { + { + "key": "collection/4/coll/matches", + "version": 8, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98076,13 +121779,17 @@ { "watchEntity": { "docs": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 202, @@ -98115,7 +121822,8 @@ }, { "watchSnapshot": { - "version": 11 + "version": 11, + "targetIds": [] }, "expect": [ { @@ -98131,13 +121839,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98156,13 +121868,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98181,13 +121897,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98206,13 +121926,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98231,13 +121955,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98256,13 +121984,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98281,13 +122013,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98306,13 +122042,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98331,13 +122071,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98356,13 +122100,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98381,13 +122129,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98406,13 +122158,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98431,13 +122187,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98456,13 +122216,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98481,13 +122245,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98506,13 +122274,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98531,13 +122303,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98556,13 +122332,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98581,13 +122361,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98606,13 +122390,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98631,13 +122419,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98656,13 +122448,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98681,13 +122477,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98706,13 +122506,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -98731,13 +122535,17 @@ "orderBys": [] }, "added": [ - [ - "collection/5/coll/matches", - 10, - { + { + "key": "collection/5/coll/matches", + "version": 10, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -108797,13 +132605,17 @@ { "watchEntity": { "docs": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 252, @@ -108836,7 +132648,8 @@ }, { "watchSnapshot": { - "version": 13 + "version": 13, + "targetIds": [] }, "expect": [ { @@ -108852,13 +132665,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -108877,13 +132694,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -108902,13 +132723,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -108927,13 +132752,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -108952,13 +132781,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -108977,13 +132810,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109002,13 +132839,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109027,13 +132868,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109052,13 +132897,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109077,13 +132926,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109102,13 +132955,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109127,13 +132984,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109152,13 +133013,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109177,13 +133042,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109202,13 +133071,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109227,13 +133100,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109252,13 +133129,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109277,13 +133158,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109302,13 +133187,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109327,13 +133216,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109352,13 +133245,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109377,13 +133274,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109402,13 +133303,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109427,13 +133332,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -109452,13 +133361,17 @@ "orderBys": [] }, "added": [ - [ - "collection/6/coll/matches", - 12, - { + { + "key": "collection/6/coll/matches", + "version": 12, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119518,13 +143431,17 @@ { "watchEntity": { "docs": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 302, @@ -119557,7 +143474,8 @@ }, { "watchSnapshot": { - "version": 15 + "version": 15, + "targetIds": [] }, "expect": [ { @@ -119573,13 +143491,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119598,13 +143520,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119623,13 +143549,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119648,13 +143578,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119673,13 +143607,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119698,13 +143636,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119723,13 +143665,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119748,13 +143694,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119773,13 +143723,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119798,13 +143752,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119823,13 +143781,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119848,13 +143810,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119873,13 +143839,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119898,13 +143868,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119923,13 +143897,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119948,13 +143926,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119973,13 +143955,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -119998,13 +143984,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -120023,13 +144013,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -120048,13 +144042,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -120073,13 +144071,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -120098,13 +144100,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -120123,13 +144129,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -120148,13 +144158,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -120173,13 +144187,17 @@ "orderBys": [] }, "added": [ - [ - "collection/7/coll/matches", - 14, - { + { + "key": "collection/7/coll/matches", + "version": 14, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130239,13 +154257,17 @@ { "watchEntity": { "docs": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 352, @@ -130278,7 +154300,8 @@ }, { "watchSnapshot": { - "version": 17 + "version": 17, + "targetIds": [] }, "expect": [ { @@ -130294,13 +154317,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130319,13 +154346,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130344,13 +154375,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130369,13 +154404,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130394,13 +154433,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130419,13 +154462,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130444,13 +154491,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130469,13 +154520,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130494,13 +154549,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130519,13 +154578,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130544,13 +154607,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130569,13 +154636,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130594,13 +154665,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130619,13 +154694,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130644,13 +154723,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130669,13 +154752,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130694,13 +154781,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130719,13 +154810,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130744,13 +154839,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130769,13 +154868,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130794,13 +154897,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130819,13 +154926,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130844,13 +154955,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130869,13 +154984,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -130894,13 +155013,17 @@ "orderBys": [] }, "added": [ - [ - "collection/8/coll/matches", - 16, - { + { + "key": "collection/8/coll/matches", + "version": 16, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -140960,13 +165083,17 @@ { "watchEntity": { "docs": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 402, @@ -140999,7 +165126,8 @@ }, { "watchSnapshot": { - "version": 19 + "version": 19, + "targetIds": [] }, "expect": [ { @@ -141015,13 +165143,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141040,13 +165172,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141065,13 +165201,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141090,13 +165230,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141115,13 +165259,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141140,13 +165288,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141165,13 +165317,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141190,13 +165346,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141215,13 +165375,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141240,13 +165404,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141265,13 +165433,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141290,13 +165462,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141315,13 +165491,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141340,13 +165520,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141365,13 +165549,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141390,13 +165578,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141415,13 +165607,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141440,13 +165636,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141465,13 +165665,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141490,13 +165694,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141515,13 +165723,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141540,13 +165752,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141565,13 +165781,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141590,13 +165810,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -141615,13 +165839,17 @@ "orderBys": [] }, "added": [ - [ - "collection/9/coll/matches", - 18, - { + { + "key": "collection/9/coll/matches", + "version": 18, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151681,13 +175909,17 @@ { "watchEntity": { "docs": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 452, @@ -151720,7 +175952,8 @@ }, { "watchSnapshot": { - "version": 21 + "version": 21, + "targetIds": [] }, "expect": [ { @@ -151736,13 +175969,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151761,13 +175998,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151786,13 +176027,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151811,13 +176056,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151836,13 +176085,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151861,13 +176114,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151886,13 +176143,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151911,13 +176172,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151936,13 +176201,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151961,13 +176230,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -151986,13 +176259,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152011,13 +176288,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152036,13 +176317,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152061,13 +176346,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152086,13 +176375,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152111,13 +176404,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152136,13 +176433,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152161,13 +176462,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152186,13 +176491,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152211,13 +176520,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152236,13 +176549,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152261,13 +176578,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152286,13 +176607,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152311,13 +176636,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -152336,13 +176665,17 @@ "orderBys": [] }, "added": [ - [ - "collection/10/coll/matches", - 20, - { + { + "key": "collection/10/coll/matches", + "version": 20, + "value": { "val": -1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, diff --git a/Firestore/Example/Tests/SpecTests/json/persistence_spec_test.json b/Firestore/Example/Tests/SpecTests/json/persistence_spec_test.json index f5d9415f7bd..feb6bd8419a 100644 --- a/Firestore/Example/Tests/SpecTests/json/persistence_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/persistence_spec_test.json @@ -112,22 +112,28 @@ "orderBys": [] }, "added": [ - [ - "collection/key1", - 0, - { + { + "key": "collection/key1", + "version": 0, + "value": { "foo": "bar" }, - "local" - ], - [ - "collection/key2", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/key2", + "version": 0, + "value": { "baz": "quu" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -178,13 +184,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -201,7 +211,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -211,13 +222,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -261,13 +276,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -316,13 +335,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -339,7 +362,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -349,13 +373,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -405,13 +433,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -480,13 +512,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": true } - ] + } ], "errorCode": 0, "fromCache": true, @@ -709,13 +745,17 @@ { "watchEntity": { "docs": [ - [ - "users/existing", - 0, - { + { + "key": "users/existing", + "version": 0, + "value": { "uid": "existing" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -732,7 +772,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -742,13 +783,17 @@ "orderBys": [] }, "added": [ - [ - "users/existing", - 0, - { + { + "key": "users/existing", + "version": 0, + "value": { "uid": "existing" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -771,14 +816,17 @@ "orderBys": [] }, "added": [ - [ - "users/anon", - 0, - { + { + "key": "users/anon", + "version": 0, + "value": { "uid": "anon" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -808,14 +856,17 @@ "orderBys": [] }, "removed": [ - [ - "users/anon", - 0, - { + { + "key": "users/anon", + "version": 0, + "value": { "uid": "anon" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -838,14 +889,17 @@ "orderBys": [] }, "added": [ - [ - "users/user1", - 0, - { + { + "key": "users/user1", + "version": 0, + "value": { "uid": "user1" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -863,24 +917,30 @@ "orderBys": [] }, "added": [ - [ - "users/anon", - 0, - { + { + "key": "users/anon", + "version": 0, + "value": { "uid": "anon" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "removed": [ - [ - "users/user1", - 0, - { + { + "key": "users/user1", + "version": 0, + "value": { "uid": "user1" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, diff --git a/Firestore/Example/Tests/SpecTests/json/remote_store_spec_test.json b/Firestore/Example/Tests/SpecTests/json/remote_store_spec_test.json index 744bd6002e4..57e9a2cd6f1 100644 --- a/Firestore/Example/Tests/SpecTests/json/remote_store_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/remote_store_spec_test.json @@ -73,13 +73,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -96,7 +100,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] } }, { @@ -114,13 +119,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -137,7 +146,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -147,13 +157,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -307,13 +321,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -330,7 +348,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] } }, { @@ -348,13 +367,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 1000, - { + { + "key": "collection/b", + "version": 1000, + "value": { "key": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -371,7 +394,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] } }, { @@ -389,13 +413,17 @@ { "watchEntity": { "docs": [ - [ - "collection/c", - 1000, - { + { + "key": "collection/c", + "version": 1000, + "value": { "key": "c" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -412,7 +440,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] } }, { @@ -430,13 +459,17 @@ { "watchEntity": { "docs": [ - [ - "collection/d", - 1000, - { + { + "key": "collection/d", + "version": 1000, + "value": { "key": "d" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -453,7 +486,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -463,13 +497,17 @@ "orderBys": [] }, "added": [ - [ - "collection/d", - 1000, - { + { + "key": "collection/d", + "version": 1000, + "value": { "key": "d" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -539,13 +577,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -562,7 +604,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] }, "expect": [ { @@ -572,13 +615,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, diff --git a/Firestore/Example/Tests/SpecTests/json/resume_token_spec_test.json b/Firestore/Example/Tests/SpecTests/json/resume_token_spec_test.json index 05c97cbefbd..b78b9e16187 100644 --- a/Firestore/Example/Tests/SpecTests/json/resume_token_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/resume_token_spec_test.json @@ -38,13 +38,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -61,7 +65,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -71,13 +76,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -147,13 +156,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -170,7 +183,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -180,13 +194,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -236,13 +254,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "key": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": true, @@ -257,7 +279,8 @@ }, { "watchSnapshot": { - "version": 1001 + "version": 1001, + "targetIds": [] } } ] diff --git a/Firestore/Example/Tests/SpecTests/json/write_spec_test.json b/Firestore/Example/Tests/SpecTests/json/write_spec_test.json index 252fb382d95..28efcde68c8 100644 --- a/Firestore/Example/Tests/SpecTests/json/write_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/write_spec_test.json @@ -38,20 +38,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 500, - { + }, + { + "key": "collection/b", + "version": 500, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -68,7 +76,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -78,20 +87,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 500, - { + }, + { + "key": "collection/b", + "version": 500, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -114,14 +131,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -132,13 +152,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -147,7 +171,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] } }, { @@ -170,13 +195,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a", - 2000, - { + { + "key": "collection/a", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -199,14 +228,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/b", - 500, - { + { + "key": "collection/b", + "version": 500, + "value": { "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -217,13 +249,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2500, - { + { + "key": "collection/b", + "version": 2500, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -232,12 +268,13 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] } }, { "writeAck": { - "version": 3000 + "version": 2500 }, "stateExpect": { "userCallbacks": { @@ -255,13 +292,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/b", - 2500, - { + { + "key": "collection/b", + "version": 2500, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -310,13 +351,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -333,7 +378,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -343,13 +389,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -372,14 +422,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -390,13 +443,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 2000, - { + { + "key": "collection/key", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -405,7 +462,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] } }, { @@ -428,13 +486,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/key", - 2000, - { + { + "key": "collection/key", + "version": 2000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -444,20 +506,28 @@ } ] }, - "Cache will not keep data for an outdated write ack": { + "Raises snapshot with 'hasPendingWrites' for unacknowledged write": { "describeName": "Writes:", - "itName": "Cache will not keep data for an outdated write ack", + "itName": "Raises snapshot with 'hasPendingWrites' for unacknowledged write", "tags": [], "config": { - "useGarbageCollection": true, + "useGarbageCollection": false, "numClients": 1 }, "steps": [ + { + "userSet": [ + "collection/doc", + { + "v": 1 + } + ] + }, { "userListen": [ 2, { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] } @@ -466,163 +536,127 @@ "activeTargets": { "2": { "query": { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] }, "resumeToken": "" } } - } - }, - { - "watchAck": [ - 2 - ] - }, - { - "watchEntity": { - "docs": [ - [ - "collection/key", - 1000, - { - "v": 1 - } - ] - ], - "targets": [ - 2 - ] - } - }, - { - "watchCurrent": [ - [ - 2 - ], - "resume-token-1000" - ] - }, - { - "watchSnapshot": { - "version": 1000 }, "expect": [ { "query": { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/doc", + "version": 0, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, - "fromCache": false, - "hasPendingWrites": false + "fromCache": true, + "hasPendingWrites": true } ] - }, + } + ] + }, + "Doesn't raise 'hasPendingWrites' for committed write and new listen": { + "describeName": "Writes:", + "itName": "Doesn't raise 'hasPendingWrites' for committed write and new listen", + "tags": [], + "config": { + "useGarbageCollection": false, + "numClients": 1 + }, + "steps": [ { "userSet": [ - "collection/key", - { - "v": 2 - } - ], - "expect": [ + "collection/doc", { - "query": { - "path": "collection/key", - "filters": [], - "orderBys": [] - }, - "modified": [ - [ - "collection/key", - 1000, - { - "v": 2 - }, - "local" - ] - ], - "errorCode": 0, - "fromCache": false, - "hasPendingWrites": true + "v": 1 } ] }, - { - "watchEntity": { - "docs": [ - [ - "collection/key", - 10000, - { - "v": 3 - } - ] - ], - "targets": [ - 2 - ] - } - }, - { - "watchSnapshot": { - "version": 10000 - } - }, { "writeAck": { - "version": 2000 + "version": 1000 }, "stateExpect": { "userCallbacks": { "acknowledgedDocs": [ - "collection/key" + "collection/doc" ], "rejectedDocs": [] } + } + }, + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } }, "expect": [ { "query": { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] }, - "modified": [ - [ - "collection/key", - 10000, - { - "v": 3 + "added": [ + { + "key": "collection/doc", + "version": 1000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": true } - ] + } ], "errorCode": 0, - "fromCache": false, + "fromCache": true, "hasPendingWrites": false } ] } ] }, - "Cache raises correct event if write is acked before watch delivers it": { + "Doesn't raise event for document with pending patch": { "describeName": "Writes:", - "itName": "Cache raises correct event if write is acked before watch delivers it", + "itName": "Doesn't raise event for document with pending patch", "tags": [], "config": { - "useGarbageCollection": true, + "useGarbageCollection": false, "numClients": 1 }, "steps": [ @@ -630,7 +664,7 @@ "userListen": [ 2, { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] } @@ -639,7 +673,7 @@ "activeTargets": { "2": { "query": { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] }, @@ -655,15 +689,7 @@ }, { "watchEntity": { - "docs": [ - [ - "collection/key", - 1000, - { - "v": 1 - } - ] - ], + "docs": [], "targets": [ 2 ] @@ -674,29 +700,21 @@ [ 2 ], - "resume-token-1000" + "resume-token-250" ] }, { "watchSnapshot": { - "version": 1000 + "version": 250, + "targetIds": [] }, "expect": [ { "query": { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] }, - "added": [ - [ - "collection/key", - 1000, - { - "v": 1 - } - ] - ], "errorCode": 0, "fromCache": false, "hasPendingWrites": false @@ -704,43 +722,21 @@ ] }, { - "userSet": [ - "collection/key", + "userPatch": [ + "collection/doc", { "v": 2 } - ], - "expect": [ - { - "query": { - "path": "collection/key", - "filters": [], - "orderBys": [] - }, - "modified": [ - [ - "collection/key", - 1000, - { - "v": 2 - }, - "local" - ] - ], - "errorCode": 0, - "fromCache": false, - "hasPendingWrites": true - } ] }, { "writeAck": { - "version": 2000 + "version": 1000 }, "stateExpect": { "userCallbacks": { "acknowledgedDocs": [ - "collection/key" + "collection/doc" ], "rejectedDocs": [] } @@ -749,13 +745,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 2000, - { - "v": 2 + { + "key": "collection/doc", + "version": 500, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -764,23 +764,54 @@ }, { "watchSnapshot": { - "version": 2000 - }, + "version": 500, + "targetIds": [] + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/doc", + "version": 1000, + "value": { + "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, "expect": [ { "query": { - "path": "collection/key", + "path": "collection", "filters": [], "orderBys": [] }, - "metadata": [ - [ - "collection/key", - 2000, - { + "added": [ + { + "key": "collection/doc", + "version": 1000, + "value": { "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -790,9 +821,9 @@ } ] }, - "Cache will hold local write until watch catches up": { + "Cache will not keep data for an outdated write ack": { "describeName": "Writes:", - "itName": "Cache will hold local write until watch catches up", + "itName": "Cache will not keep data for an outdated write ack", "tags": [], "config": { "useGarbageCollection": true, @@ -803,7 +834,7 @@ "userListen": [ 2, { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] } @@ -812,7 +843,7 @@ "activeTargets": { "2": { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, @@ -829,13 +860,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -852,23 +887,28 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, "added": [ - [ - "collection/key", - 1000, - { + { + "key": "collection/key", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -880,25 +920,28 @@ "userSet": [ "collection/key", { - "v": 3 + "v": 2 } ], "expect": [ { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, "modified": [ - [ - "collection/key", - 1000, - { - "v": 3 + { + "key": "collection/key", + "version": 1000, + "value": { + "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -906,29 +949,20 @@ } ] }, - { - "writeAck": { - "version": 3000 - }, - "stateExpect": { - "userCallbacks": { - "acknowledgedDocs": [ - "collection/key" - ], - "rejectedDocs": [] - } - } - }, { "watchEntity": { "docs": [ - [ - "collection/key", - 2000, - { - "v": 2 + { + "key": "collection/key", + "version": 10000, + "value": { + "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -937,60 +971,41 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 10000, + "targetIds": [] } }, { - "watchEntity": { - "docs": [ - [ - "collection/b", - 3000, - { - "doc": "b" - } + "writeAck": { + "version": 2000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/key" ], - [ - "collection/key", - 3000, - { - "v": 3 - } - ] - ], - "targets": [ - 2 - ] - } - }, - { - "watchSnapshot": { - "version": 3000 + "rejectedDocs": [] + } }, "expect": [ { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, - "added": [ - [ - "collection/b", - 3000, - { - "doc": "b" - } - ] - ], - "metadata": [ - [ - "collection/key", - 3000, - { + "modified": [ + { + "key": "collection/key", + "version": 10000, + "value": { "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1000,9 +1015,9 @@ } ] }, - "Writes are pipelined": { + "Cache raises correct event if write is acked before watch delivers it": { "describeName": "Writes:", - "itName": "Writes are pipelined", + "itName": "Cache raises correct event if write is acked before watch delivers it", "tags": [], "config": { "useGarbageCollection": true, @@ -1013,7 +1028,7 @@ "userListen": [ 2, { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] } @@ -1022,7 +1037,7 @@ "activeTargets": { "2": { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, @@ -1036,157 +1051,909 @@ 2 ] }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/key", + "version": 1000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, { "watchCurrent": [ [ 2 ], - "resume-token" + "resume-token-1000" ] }, { - "userSet": [ - "collection/a0", - { - "v": 1 - } - ], + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, "expect": [ { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, "added": [ - [ - "collection/a0", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } ], "errorCode": 0, - "fromCache": true, - "hasPendingWrites": true + "fromCache": false, + "hasPendingWrites": false } ] }, { "userSet": [ - "collection/a1", + "collection/key", { - "v": 1 + "v": 2 } ], "expect": [ { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, - "added": [ - [ - "collection/a1", - 0, - { - "v": 1 + "modified": [ + { + "key": "collection/key", + "version": 1000, + "value": { + "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, - "fromCache": true, + "fromCache": false, "hasPendingWrites": true } ] }, { - "userSet": [ - "collection/a2", - { - "v": 1 - } - ], - "expect": [ - { - "query": { - "path": "collection", - "filters": [], - "orderBys": [] - }, - "added": [ - [ - "collection/a2", - 0, - { - "v": 1 - }, - "local" - ] + "writeAck": { + "version": 2000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/key" ], - "errorCode": 0, - "fromCache": true, - "hasPendingWrites": true + "rejectedDocs": [] } - ] + } }, { - "userSet": [ - "collection/a3", - { - "v": 1 - } - ], + "watchEntity": { + "docs": [ + { + "key": "collection/key", + "version": 2000, + "value": { + "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, "expect": [ { "query": { - "path": "collection", + "path": "collection/key", "filters": [], "orderBys": [] }, - "added": [ - [ - "collection/a3", - 0, - { - "v": 1 + "metadata": [ + { + "key": "collection/key", + "version": 2000, + "value": { + "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } ], "errorCode": 0, - "fromCache": true, - "hasPendingWrites": true + "fromCache": false, + "hasPendingWrites": false } ] - }, + } + ] + }, + "Cache will hold local write until watch catches up": { + "describeName": "Writes:", + "itName": "Cache will hold local write until watch catches up", + "tags": [], + "config": { + "useGarbageCollection": true, + "numClients": 1 + }, + "steps": [ { - "userSet": [ - "collection/a4", + "userListen": [ + 2, { - "v": 1 + "path": "collection", + "filters": [], + "orderBys": [] } ], - "expect": [ - { - "query": { - "path": "collection", - "filters": [], - "orderBys": [] + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + } + }, + { + "watchAck": [ + 2 + ] + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/key", + "version": 1000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-1000" + ] + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/key", + "version": 1000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + }, + { + "userSet": [ + "collection/key", + { + "v": 3 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "modified": [ + { + "key": "collection/key", + "version": 1000, + "value": { + "v": 3 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": true + } + ] + }, + { + "writeAck": { + "version": 3000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/key" + ], + "rejectedDocs": [] + } + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/key", + "version": 2000, + "value": { + "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/b", + "version": 3000, + "value": { + "doc": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + }, + { + "key": "collection/key", + "version": 3000, + "value": { + "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 3000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/b", + "version": 3000, + "value": { + "doc": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "metadata": [ + { + "key": "collection/key", + "version": 3000, + "value": { + "v": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + } + ] + }, + "Local patch is applied to query until watch catches up": { + "describeName": "Writes:", + "itName": "Local patch is applied to query until watch catches up", + "tags": [], + "config": { + "useGarbageCollection": false, + "numClients": 1 + }, + "steps": [ + { + "userSet": [ + "collection/doc", + { + "local": 1 + } + ] + }, + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/doc", + "version": 0, + "value": { + "local": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": true + } + ] + }, + { + "writeAck": { + "version": 1000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/doc" + ], + "rejectedDocs": [] + } + } + }, + { + "watchAck": [ + 2 + ] + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/doc", + "version": 2000, + "value": { + "local": 1, + "remote": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-2000" + ] + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "modified": [ + { + "key": "collection/doc", + "version": 2000, + "value": { + "local": 1, + "remote": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + }, + { + "userPatch": [ + "collection/doc", + { + "local": 5 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "modified": [ + { + "key": "collection/doc", + "version": 2000, + "value": { + "local": 5, + "remote": 2 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": true + } + ] + }, + { + "writeAck": { + "version": 5000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/doc" + ], + "rejectedDocs": [] + } + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/doc", + "version": 3000, + "value": { + "local": 1, + "remote": 3 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": true + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 3000, + "targetIds": [] + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/doc", + "version": 4000, + "value": { + "local": 1, + "remote": 4 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": true + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 4000, + "targetIds": [] + } + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/doc", + "version": 5000, + "value": { + "local": 5, + "remote": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchSnapshot": { + "version": 5000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "modified": [ + { + "key": "collection/doc", + "version": 5000, + "value": { + "local": 5, + "remote": 5 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ] + } + ] + }, + "Writes are pipelined": { + "describeName": "Writes:", + "itName": "Writes are pipelined", + "tags": [], + "config": { + "useGarbageCollection": true, + "numClients": 1 + }, + "steps": [ + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + } + }, + { + "watchAck": [ + 2 + ] + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token" + ] + }, + { + "userSet": [ + "collection/a0", + { + "v": 1 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a0", + "version": 0, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": true + } + ] + }, + { + "userSet": [ + "collection/a1", + { + "v": 1 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a1", + "version": 0, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": true + } + ] + }, + { + "userSet": [ + "collection/a2", + { + "v": 1 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a2", + "version": 0, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": true + } + ] + }, + { + "userSet": [ + "collection/a3", + { + "v": 1 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a3", + "version": 0, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": true + } + ] + }, + { + "userSet": [ + "collection/a4", + { + "v": 1 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] }, "added": [ - [ - "collection/a4", - 0, - { + { + "key": "collection/a4", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1209,14 +1976,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a5", - 0, - { + { + "key": "collection/a5", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1239,14 +2009,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a6", - 0, - { + { + "key": "collection/a6", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1269,14 +2042,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a7", - 0, - { + { + "key": "collection/a7", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1299,14 +2075,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a8", - 0, - { + { + "key": "collection/a8", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1329,14 +2108,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a9", - 0, - { + { + "key": "collection/a9", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1359,14 +2141,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a10", - 0, - { + { + "key": "collection/a10", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1389,14 +2174,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a11", - 0, - { + { + "key": "collection/a11", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1419,14 +2207,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a12", - 0, - { + { + "key": "collection/a12", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1449,14 +2240,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a13", - 0, - { + { + "key": "collection/a13", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1479,14 +2273,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a14", - 0, - { + { + "key": "collection/a14", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -1513,13 +2310,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a0", - 1000, - { + { + "key": "collection/a0", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1528,7 +2329,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -1538,13 +2340,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a0", - 1000, - { + { + "key": "collection/a0", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1568,13 +2374,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a1", - 2000, - { + { + "key": "collection/a1", + "version": 2000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1583,7 +2393,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -1593,13 +2404,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a1", - 2000, - { + { + "key": "collection/a1", + "version": 2000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1623,13 +2438,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a2", - 3000, - { + { + "key": "collection/a2", + "version": 3000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1638,7 +2457,8 @@ }, { "watchSnapshot": { - "version": 3000 + "version": 3000, + "targetIds": [] }, "expect": [ { @@ -1648,13 +2468,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a2", - 3000, - { + { + "key": "collection/a2", + "version": 3000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1678,13 +2502,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a3", - 4000, - { + { + "key": "collection/a3", + "version": 4000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1693,7 +2521,8 @@ }, { "watchSnapshot": { - "version": 4000 + "version": 4000, + "targetIds": [] }, "expect": [ { @@ -1703,13 +2532,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a3", - 4000, - { + { + "key": "collection/a3", + "version": 4000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1733,13 +2566,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a4", - 5000, - { + { + "key": "collection/a4", + "version": 5000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1748,7 +2585,8 @@ }, { "watchSnapshot": { - "version": 5000 + "version": 5000, + "targetIds": [] }, "expect": [ { @@ -1758,13 +2596,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a4", - 5000, - { + { + "key": "collection/a4", + "version": 5000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1788,13 +2630,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a5", - 6000, - { + { + "key": "collection/a5", + "version": 6000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1803,7 +2649,8 @@ }, { "watchSnapshot": { - "version": 6000 + "version": 6000, + "targetIds": [] }, "expect": [ { @@ -1813,13 +2660,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a5", - 6000, - { + { + "key": "collection/a5", + "version": 6000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1843,13 +2694,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a6", - 7000, - { + { + "key": "collection/a6", + "version": 7000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1858,7 +2713,8 @@ }, { "watchSnapshot": { - "version": 7000 + "version": 7000, + "targetIds": [] }, "expect": [ { @@ -1868,13 +2724,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a6", - 7000, - { + { + "key": "collection/a6", + "version": 7000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1898,13 +2758,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a7", - 8000, - { + { + "key": "collection/a7", + "version": 8000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1913,7 +2777,8 @@ }, { "watchSnapshot": { - "version": 8000 + "version": 8000, + "targetIds": [] }, "expect": [ { @@ -1923,13 +2788,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a7", - 8000, - { + { + "key": "collection/a7", + "version": 8000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -1953,13 +2822,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a8", - 9000, - { + { + "key": "collection/a8", + "version": 9000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -1968,7 +2841,8 @@ }, { "watchSnapshot": { - "version": 9000 + "version": 9000, + "targetIds": [] }, "expect": [ { @@ -1978,13 +2852,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a8", - 9000, - { + { + "key": "collection/a8", + "version": 9000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2008,13 +2886,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a9", - 10000, - { + { + "key": "collection/a9", + "version": 10000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2023,7 +2905,8 @@ }, { "watchSnapshot": { - "version": 10000 + "version": 10000, + "targetIds": [] }, "expect": [ { @@ -2033,13 +2916,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a9", - 10000, - { + { + "key": "collection/a9", + "version": 10000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2063,13 +2950,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a10", - 11000, - { + { + "key": "collection/a10", + "version": 11000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2078,7 +2969,8 @@ }, { "watchSnapshot": { - "version": 11000 + "version": 11000, + "targetIds": [] }, "expect": [ { @@ -2088,13 +2980,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a10", - 11000, - { + { + "key": "collection/a10", + "version": 11000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2118,13 +3014,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a11", - 12000, - { + { + "key": "collection/a11", + "version": 12000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2133,7 +3033,8 @@ }, { "watchSnapshot": { - "version": 12000 + "version": 12000, + "targetIds": [] }, "expect": [ { @@ -2143,13 +3044,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a11", - 12000, - { + { + "key": "collection/a11", + "version": 12000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2173,13 +3078,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a12", - 13000, - { + { + "key": "collection/a12", + "version": 13000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2188,7 +3097,8 @@ }, { "watchSnapshot": { - "version": 13000 + "version": 13000, + "targetIds": [] }, "expect": [ { @@ -2198,13 +3108,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a12", - 13000, - { + { + "key": "collection/a12", + "version": 13000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2228,13 +3142,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a13", - 14000, - { + { + "key": "collection/a13", + "version": 14000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2243,7 +3161,8 @@ }, { "watchSnapshot": { - "version": 14000 + "version": 14000, + "targetIds": [] }, "expect": [ { @@ -2253,13 +3172,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a13", - 14000, - { + { + "key": "collection/a13", + "version": 14000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2283,13 +3206,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a14", - 15000, - { + { + "key": "collection/a14", + "version": 15000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -2298,7 +3225,8 @@ }, { "watchSnapshot": { - "version": 15000 + "version": 15000, + "targetIds": [] }, "expect": [ { @@ -2308,13 +3236,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a14", - 15000, - { + { + "key": "collection/a14", + "version": 15000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -2370,14 +3302,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a0", - 0, - { + { + "key": "collection/a0", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2400,14 +3335,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a1", - 0, - { + { + "key": "collection/a1", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2430,14 +3368,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a2", - 0, - { + { + "key": "collection/a2", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2460,14 +3401,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a3", - 0, - { + { + "key": "collection/a3", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2490,14 +3434,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a4", - 0, - { + { + "key": "collection/a4", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2520,14 +3467,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a5", - 0, - { + { + "key": "collection/a5", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2550,14 +3500,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a6", - 0, - { + { + "key": "collection/a6", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2580,14 +3533,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a7", - 0, - { + { + "key": "collection/a7", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2610,14 +3566,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a8", - 0, - { + { + "key": "collection/a8", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2640,14 +3599,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a9", - 0, - { + { + "key": "collection/a9", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2670,14 +3632,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a10", - 0, - { + { + "key": "collection/a10", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2700,14 +3665,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a11", - 0, - { + { + "key": "collection/a11", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2730,14 +3698,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a12", - 0, - { + { + "key": "collection/a12", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2760,14 +3731,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a13", - 0, - { + { + "key": "collection/a13", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2790,14 +3764,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a14", - 0, - { + { + "key": "collection/a14", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2830,14 +3807,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a0", - 0, - { + { + "key": "collection/a0", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2867,14 +3847,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a1", - 0, - { + { + "key": "collection/a1", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2904,14 +3887,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a2", - 0, - { + { + "key": "collection/a2", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2941,14 +3927,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a3", - 0, - { + { + "key": "collection/a3", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -2978,14 +3967,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a4", - 0, - { + { + "key": "collection/a4", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3015,14 +4007,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a5", - 0, - { + { + "key": "collection/a5", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3052,14 +4047,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a6", - 0, - { + { + "key": "collection/a6", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3089,14 +4087,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a7", - 0, - { + { + "key": "collection/a7", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3126,14 +4127,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a8", - 0, - { + { + "key": "collection/a8", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3163,14 +4167,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a9", - 0, - { + { + "key": "collection/a9", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3200,14 +4207,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a10", - 0, - { + { + "key": "collection/a10", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3237,14 +4247,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a11", - 0, - { + { + "key": "collection/a11", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3274,14 +4287,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a12", - 0, - { + { + "key": "collection/a12", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3311,14 +4327,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a13", - 0, - { + { + "key": "collection/a13", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3349,14 +4368,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/a14", - 0, - { + { + "key": "collection/a14", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -3405,13 +4427,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3428,7 +4454,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -3438,13 +4465,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3467,14 +4498,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 0, - { + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -3510,14 +4544,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -3547,13 +4584,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3564,13 +4605,17 @@ { "watchEntity": { "docs": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3579,7 +4624,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -3589,13 +4635,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/b", - 2000, - { + { + "key": "collection/b", + "version": 2000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3605,9 +4655,9 @@ } ] }, - "Held writes are not re-sent.": { + "Writes are not re-sent.": { "describeName": "Writes:", - "itName": "Held writes are not re-sent.", + "itName": "Writes are not re-sent.", "tags": [], "config": { "useGarbageCollection": true, @@ -3659,7 +4709,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -3689,14 +4740,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -3732,14 +4786,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 0, - { + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -3763,20 +4820,28 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 2000, - { + }, + { + "key": "collection/b", + "version": 2000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3785,7 +4850,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -3795,20 +4861,28 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ], - [ - "collection/b", - 2000, - { + }, + { + "key": "collection/b", + "version": 2000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -3818,9 +4892,9 @@ } ] }, - "Held writes are not re-sent after disable/enable network.": { + "Writes are not re-sent after disable/enable network.": { "describeName": "Writes:", - "itName": "Held writes are not re-sent after disable/enable network.", + "itName": "Writes are not re-sent after disable/enable network.", "tags": [], "config": { "useGarbageCollection": true, @@ -3872,7 +4946,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -3902,14 +4977,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -3975,13 +5053,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -3998,7 +5080,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] }, "expect": [ { @@ -4008,13 +5091,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -4024,13 +5111,13 @@ } ] }, - "Held writes are released when there are no queries left.": { + "Writes are released when there are no queries left": { "describeName": "Writes:", - "itName": "Held writes are released when there are no queries left.", + "itName": "Writes are released when there are no queries left", "tags": [ "eager-gc" ], - "comment": "This test expects a new target id for a new listen, but without eager gc, the same target id is reused", + "comment": "This test verifies that committed mutations are eligible for garbage collection on target removal", "config": { "useGarbageCollection": true, "numClients": 1 @@ -4081,7 +5168,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -4111,14 +5199,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -4222,14 +5313,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4259,14 +5353,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4322,14 +5419,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4359,14 +5459,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4422,14 +5525,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4459,14 +5565,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4522,14 +5631,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4559,14 +5671,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4622,14 +5737,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4659,14 +5777,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4722,14 +5843,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4759,14 +5883,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4822,14 +5949,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4859,14 +5989,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4922,14 +6055,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -4959,14 +6095,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5022,14 +6161,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5059,14 +6201,17 @@ "orderBys": [] }, "removed": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5122,14 +6267,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5193,14 +6341,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5237,13 +6388,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5260,7 +6415,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -5270,13 +6426,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5332,14 +6492,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5376,13 +6539,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5399,7 +6566,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -5409,13 +6577,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5471,14 +6643,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5515,13 +6690,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5538,7 +6717,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -5548,13 +6728,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5610,14 +6794,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5654,13 +6841,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5677,7 +6868,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -5687,13 +6879,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5749,14 +6945,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5793,13 +6992,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5816,7 +7019,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -5826,13 +7030,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -5888,14 +7096,17 @@ "orderBys": [] }, "added": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 0, + "value": { "foo": "bar" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -5932,13 +7143,17 @@ { "watchEntity": { "docs": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -5955,7 +7170,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -5965,13 +7181,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/key", - 0, - { + { + "key": "collection/key", + "version": 1000, + "value": { "foo": "bar" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -6020,16 +7240,20 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 1000, - { + { + "key": "collection/doc", + "version": 1000, + "value": { "a": { "b": 2 }, "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -6046,7 +7270,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -6056,16 +7281,20 @@ "orderBys": [] }, "added": [ - [ - "collection/doc", - 1000, - { + { + "key": "collection/doc", + "version": 1000, + "value": { "a": { "b": 2 }, "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -6089,17 +7318,20 @@ "orderBys": [] }, "modified": [ - [ - "collection/doc", - 1000, - { + { + "key": "collection/doc", + "version": 1000, + "value": { "a": { "b": 2 }, "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6110,16 +7342,20 @@ { "watchEntity": { "docs": [ - [ - "collection/doc", - 2000, - { + { + "key": "collection/doc", + "version": 2000, + "value": { "a": { "b": 2 }, "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -6128,7 +7364,8 @@ }, { "watchSnapshot": { - "version": 2000 + "version": 2000, + "targetIds": [] } }, { @@ -6151,16 +7388,20 @@ "orderBys": [] }, "metadata": [ - [ - "collection/doc", - 2000, - { + { + "key": "collection/doc", + "version": 2000, + "value": { "a": { "b": 2 }, "v": 2 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -6458,7 +7699,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -6489,14 +7731,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6538,14 +7783,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6573,14 +7821,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6599,14 +7850,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 2 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6630,14 +7884,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 3 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6656,14 +7913,17 @@ "orderBys": [] }, "modified": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 3 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6744,7 +8004,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -6814,14 +8075,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6840,14 +8104,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, @@ -6865,23 +8132,283 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + }, + "clientIndex": 0 + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "metadata": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 0 + }, + { + "drainQueue": true, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/a" + ], + "rejectedDocs": [] + } + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "metadata": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 1 + } + ] + }, + "Pending write is rejected by primary client": { + "describeName": "Writes:", + "itName": "Pending write is rejected by primary client", + "tags": [ + "multi-client" + ], + "config": { + "useGarbageCollection": false, + "numClients": 2 + }, + "steps": [ + { + "drainQueue": true, + "clientIndex": 0 + }, + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "clientIndex": 0 + }, + { + "watchAck": [ + 2 + ], + "clientIndex": 0 + }, + { + "watchEntity": { + "docs": [], + "targets": [ + 2 + ] + }, + "clientIndex": 0 + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-500" + ], + "clientIndex": 0 + }, + { + "watchSnapshot": { + "version": 500, + "targetIds": [] + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 0 + }, + { + "drainQueue": true, + "clientIndex": 1 + }, + { + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false + } + ], + "clientIndex": 1 + }, + { + "userSet": [ + "collection/a", + { + "v": 1 + } + ], + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 0, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": true + } + ], + "clientIndex": 1 + }, + { + "drainQueue": true, + "expect": [ + { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/a", + "version": 0, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } } - ] - ], - "targets": [ - 2 - ] - }, + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": true + } + ], "clientIndex": 0 }, { - "watchSnapshot": { - "version": 1000 + "failWrite": { + "error": { + "code": 9 + } }, "expect": [ { @@ -6890,14 +8417,18 @@ "filters": [], "orderBys": [] }, - "metadata": [ - [ - "collection/a", - 1000, - { + "removed": [ + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -6910,10 +8441,10 @@ "drainQueue": true, "stateExpect": { "userCallbacks": { - "acknowledgedDocs": [ + "acknowledgedDocs": [], + "rejectedDocs": [ "collection/a" - ], - "rejectedDocs": [] + ] } }, "expect": [ @@ -6923,14 +8454,18 @@ "filters": [], "orderBys": [] }, - "metadata": [ - [ - "collection/a", - 1000, - { + "removed": [ + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -6941,9 +8476,9 @@ } ] }, - "Pending write is rejected by primary client": { + "Writes are released by primary client": { "describeName": "Writes:", - "itName": "Pending write is rejected by primary client", + "itName": "Writes are released by primary client", "tags": [ "multi-client" ], @@ -7005,7 +8540,8 @@ }, { "watchSnapshot": { - "version": 500 + "version": 500, + "targetIds": [] }, "expect": [ { @@ -7025,41 +8561,6 @@ "drainQueue": true, "clientIndex": 1 }, - { - "userListen": [ - 2, - { - "path": "collection", - "filters": [], - "orderBys": [] - } - ], - "stateExpect": { - "activeTargets": { - "2": { - "query": { - "path": "collection", - "filters": [], - "orderBys": [] - }, - "resumeToken": "" - } - } - }, - "expect": [ - { - "query": { - "path": "collection", - "filters": [], - "orderBys": [] - }, - "errorCode": 0, - "fromCache": false, - "hasPendingWrites": false - } - ], - "clientIndex": 1 - }, { "userSet": [ "collection/a", @@ -7067,6 +8568,10 @@ "v": 1 } ], + "clientIndex": 1 + }, + { + "drainQueue": true, "expect": [ { "query": { @@ -7075,24 +8580,73 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, "hasPendingWrites": true } ], + "clientIndex": 0 + }, + { + "writeAck": { + "version": 1000 + }, + "clientIndex": 0 + }, + { + "drainQueue": true, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/a" + ], + "rejectedDocs": [] + } + }, "clientIndex": 1 }, { "drainQueue": true, + "clientIndex": 0 + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/a", + "version": 1000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], + "targets": [ + 2 + ] + }, + "clientIndex": 0 + }, + { + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, "expect": [ { "query": { @@ -7100,29 +8654,73 @@ "filters": [], "orderBys": [] }, - "added": [ - [ - "collection/a", - 0, - { + "metadata": [ + { + "key": "collection/a", + "version": 1000, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": false, - "hasPendingWrites": true + "hasPendingWrites": false } ], "clientIndex": 0 + } + ] + }, + "Writes are held during primary failover": { + "describeName": "Writes:", + "itName": "Writes are held during primary failover", + "tags": [ + "multi-client" + ], + "config": { + "useGarbageCollection": false, + "numClients": 2 + }, + "steps": [ + { + "drainQueue": true, + "clientIndex": 0 }, { - "failWrite": { - "error": { - "code": 9 + "userListen": [ + 2, + { + "path": "collection", + "filters": [], + "orderBys": [] + } + ], + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } } }, + "clientIndex": 0 + }, + { + "userSet": [ + "collection/doc", + { + "v": 1 + } + ], "expect": [ { "query": { @@ -7130,32 +8728,54 @@ "filters": [], "orderBys": [] }, - "removed": [ - [ - "collection/a", - 0, - { + "added": [ + { + "key": "collection/doc", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, - "fromCache": false, - "hasPendingWrites": false + "fromCache": true, + "hasPendingWrites": true } ], "clientIndex": 0 }, { - "drainQueue": true, - "stateExpect": { - "userCallbacks": { - "acknowledgedDocs": [], - "rejectedDocs": [ - "collection/a" - ] - } + "watchAck": [ + 2 + ], + "clientIndex": 0 + }, + { + "watchEntity": { + "docs": [], + "targets": [ + 2 + ] + }, + "clientIndex": 0 + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-1000" + ], + "clientIndex": 0 + }, + { + "watchSnapshot": { + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -7164,45 +8784,55 @@ "filters": [], "orderBys": [] }, - "removed": [ - [ - "collection/a", - 0, - { - "v": 1 - }, - "local" - ] - ], "errorCode": 0, "fromCache": false, - "hasPendingWrites": false + "hasPendingWrites": true } ], - "clientIndex": 1 - } - ] - }, - "Held write is released by primary client": { - "describeName": "Writes:", - "itName": "Held write is released by primary client", - "tags": [ - "multi-client" - ], - "config": { - "useGarbageCollection": false, - "numClients": 2 - }, - "steps": [ + "clientIndex": 0 + }, { - "drainQueue": true, + "writeAck": { + "version": 2000 + }, + "stateExpect": { + "userCallbacks": { + "acknowledgedDocs": [ + "collection/doc" + ], + "rejectedDocs": [] + } + }, "clientIndex": 0 }, + { + "drainQueue": true, + "clientIndex": 1 + }, + { + "applyClientState": { + "primary": true + }, + "stateExpect": { + "isPrimary": true, + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "resume-token-1000" + } + } + }, + "clientIndex": 1 + }, { "userListen": [ - 2, + 4, { - "path": "collection", + "path": "collection/doc", "filters": [], "orderBys": [] } @@ -7215,127 +8845,144 @@ "filters": [], "orderBys": [] }, + "resumeToken": "resume-token-1000" + }, + "4": { + "query": { + "path": "collection/doc", + "filters": [], + "orderBys": [] + }, "resumeToken": "" } } }, - "clientIndex": 0 + "expect": [ + { + "query": { + "path": "collection/doc", + "filters": [], + "orderBys": [] + }, + "added": [ + { + "key": "collection/doc", + "version": 2000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": true + } + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": false + } + ], + "clientIndex": 1 }, { "watchAck": [ 2 ], - "clientIndex": 0 + "clientIndex": 1 + }, + { + "watchAck": [ + 4 + ], + "clientIndex": 1 }, { "watchEntity": { - "docs": [], + "docs": [ + { + "key": "collection/doc", + "version": 2000, + "value": { + "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false + } + } + ], "targets": [ - 2 + 2, + 4 ] }, - "clientIndex": 0 + "clientIndex": 1 }, { "watchCurrent": [ [ 2 ], - "resume-token-500" - ], - "clientIndex": 0 - }, - { - "watchSnapshot": { - "version": 500 - }, - "expect": [ - { - "query": { - "path": "collection", - "filters": [], - "orderBys": [] - }, - "errorCode": 0, - "fromCache": false, - "hasPendingWrites": false - } + "resume-token-2000" ], - "clientIndex": 0 - }, - { - "drainQueue": true, "clientIndex": 1 }, { - "userSet": [ - "collection/a", - { - "v": 1 - } + "watchCurrent": [ + [ + 4 + ], + "resume-token-2000" ], "clientIndex": 1 }, { - "drainQueue": true, + "watchSnapshot": { + "version": 2000, + "targetIds": [] + }, "expect": [ { "query": { - "path": "collection", + "path": "collection/doc", "filters": [], "orderBys": [] }, - "added": [ - [ - "collection/a", - 0, - { - "v": 1 - }, - "local" - ] - ], "errorCode": 0, "fromCache": false, - "hasPendingWrites": true + "hasPendingWrites": false } ], - "clientIndex": 0 - }, - { - "writeAck": { - "version": 1000 - }, - "clientIndex": 0 - }, - { - "drainQueue": true, "clientIndex": 1 }, { "drainQueue": true, - "clientIndex": 0 - }, - { - "watchEntity": { - "docs": [ - [ - "collection/a", - 1000, - { - "v": 1 - } - ] - ], - "targets": [ - 2 - ] + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + }, + "4": { + "query": { + "path": "collection/doc", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } }, "clientIndex": 0 }, { - "watchSnapshot": { - "version": 2000 + "runTimer": "client_metadata_refresh", + "stateExpect": { + "isPrimary": false }, "expect": [ { @@ -7345,13 +8992,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/doc", + "version": 2000, + "value": { "v": 1 + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -7359,18 +9010,6 @@ } ], "clientIndex": 0 - }, - { - "drainQueue": true, - "stateExpect": { - "userCallbacks": { - "acknowledgedDocs": [ - "collection/a" - ], - "rejectedDocs": [] - } - }, - "clientIndex": 1 } ] }, @@ -7868,14 +9507,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -7921,14 +9563,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -7952,14 +9597,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 0, - { + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -7978,14 +9626,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 0, - { + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8004,22 +9655,28 @@ "orderBys": [] }, "removed": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/b", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8043,14 +9700,17 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 0, - { + { + "key": "collection/c", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8073,32 +9733,41 @@ "orderBys": [] }, "added": [ - [ - "collection/c", - 0, - { + { + "key": "collection/c", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "removed": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/b", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8117,32 +9786,41 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/b", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "removed": [ - [ - "collection/c", - 0, - { + { + "key": "collection/c", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8165,32 +9843,41 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ], - [ - "collection/b", - 0, - { + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + }, + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "removed": [ - [ - "collection/c", - 0, - { + { + "key": "collection/c", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8279,14 +9966,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8328,14 +10018,17 @@ "orderBys": [] }, "added": [ - [ - "collection/b", - 0, - { + { + "key": "collection/b", + "version": 0, + "value": { "v": 1 }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8406,14 +10099,17 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 0, + "value": { "k": "a" }, - "local" - ] + "options": { + "hasLocalMutations": true, + "hasCommittedMutations": false + } + } ], "errorCode": 0, "fromCache": true, @@ -8422,6 +10118,26 @@ ], "clientIndex": 1 }, + { + "drainQueue": true, + "stateExpect": { + "activeTargets": { + "2": { + "query": { + "path": "collection", + "filters": [], + "orderBys": [] + }, + "resumeToken": "" + } + } + }, + "clientIndex": 0 + }, + { + "drainQueue": true, + "clientIndex": 1 + }, { "applyClientState": { "primary": true @@ -8446,13 +10162,17 @@ { "watchEntity": { "docs": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "k": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "targets": [ 2 @@ -8471,7 +10191,8 @@ }, { "watchSnapshot": { - "version": 1000 + "version": 1000, + "targetIds": [] }, "expect": [ { @@ -8481,13 +10202,17 @@ "orderBys": [] }, "metadata": [ - [ - "collection/a", - 1000, - { + { + "key": "collection/a", + "version": 1000, + "value": { "k": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": false } - ] + } ], "errorCode": 0, "fromCache": false, @@ -8911,20 +10636,28 @@ "orderBys": [] }, "added": [ - [ - "collection/a", - 0, - { + { + "key": "collection/a", + "version": 1000, + "value": { "k": "a" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": true } - ], - [ - "collection/b", - 0, - { + }, + { + "key": "collection/b", + "version": 2000, + "value": { "k": "b" + }, + "options": { + "hasLocalMutations": false, + "hasCommittedMutations": true } - ] + } ], "errorCode": 0, "fromCache": true, diff --git a/Firestore/Example/Tests/Util/FSTHelpers.h b/Firestore/Example/Tests/Util/FSTHelpers.h index 70eccfbf8a5..faeafe8a352 100644 --- a/Firestore/Example/Tests/Util/FSTHelpers.h +++ b/Firestore/Example/Tests/Util/FSTHelpers.h @@ -19,6 +19,7 @@ #include #include +#import "Firestore/Source/Model/FSTDocument.h" #import "Firestore/Source/Model/FSTDocumentDictionary.h" #import "Firestore/Source/Remote/FSTRemoteEvent.h" @@ -228,11 +229,15 @@ typedef int64_t FSTTestSnapshotVersion; FSTDocument *FSTTestDoc(const absl::string_view path, FSTTestSnapshotVersion version, NSDictionary *data, - BOOL hasMutations); + FSTDocumentState documentState); /** A convenience method for creating deleted docs for tests. */ -FSTDeletedDocument *FSTTestDeletedDoc(const absl::string_view path, FSTTestSnapshotVersion version); +FSTDeletedDocument *FSTTestDeletedDoc(const absl::string_view path, + FSTTestSnapshotVersion version, + BOOL hasCommittedMutations); +/** A convenience method for creating unknown docs for tests. */ +FSTUnknownDocument *FSTTestUnknownDoc(const absl::string_view path, FSTTestSnapshotVersion version); /** * A convenience method for creating a document reference from a path string. */ diff --git a/Firestore/Example/Tests/Util/FSTHelpers.mm b/Firestore/Example/Tests/Util/FSTHelpers.mm index 69cf9937916..965dc395aef 100644 --- a/Firestore/Example/Tests/Util/FSTHelpers.mm +++ b/Firestore/Example/Tests/Util/FSTHelpers.mm @@ -153,18 +153,27 @@ FSTDocument *FSTTestDoc(const absl::string_view path, FSTTestSnapshotVersion version, NSDictionary *data, - BOOL hasMutations) { + FSTDocumentState documentState) { DocumentKey key = testutil::Key(path); return [FSTDocument documentWithData:FSTTestObjectValue(data) key:key version:testutil::Version(version) - hasLocalMutations:hasMutations]; + state:documentState]; } FSTDeletedDocument *FSTTestDeletedDoc(const absl::string_view path, + FSTTestSnapshotVersion version, + BOOL hasCommittedMutations) { + DocumentKey key = testutil::Key(path); + return [FSTDeletedDocument documentWithKey:key + version:testutil::Version(version) + hasCommittedMutations:hasCommittedMutations]; +} + +FSTUnknownDocument *FSTTestUnknownDoc(const absl::string_view path, FSTTestSnapshotVersion version) { DocumentKey key = testutil::Key(path); - return [FSTDeletedDocument documentWithKey:key version:testutil::Version(version)]; + return [FSTUnknownDocument documentWithKey:key version:testutil::Version(version)]; } FSTDocumentKeyReference *FSTTestRef(std::string projectID, std::string database, NSString *path) { diff --git a/Firestore/Source/API/FIRDocumentChange.mm b/Firestore/Source/API/FIRDocumentChange.mm index 0b1413f5dca..973e4f73a9a 100644 --- a/Firestore/Source/API/FIRDocumentChange.mm +++ b/Firestore/Source/API/FIRDocumentChange.mm @@ -60,11 +60,12 @@ + (FIRDocumentChangeType)documentChangeTypeForChange:(FSTDocumentViewChange *)ch NSUInteger index = 0; NSMutableArray *changes = [NSMutableArray array]; for (FSTDocumentViewChange *change in snapshot.documentChanges) { - FIRQueryDocumentSnapshot *document = - [FIRQueryDocumentSnapshot snapshotWithFirestore:firestore - documentKey:change.document.key - document:change.document - fromCache:snapshot.isFromCache]; + FIRQueryDocumentSnapshot *document = [FIRQueryDocumentSnapshot + snapshotWithFirestore:firestore + documentKey:change.document.key + document:change.document + fromCache:snapshot.isFromCache + hasPendingWrites:snapshot.mutatedKeys.contains(change.document.key)]; HARD_ASSERT(change.type == FSTDocumentViewChangeTypeAdded, "Invalid event type for first snapshot"); HARD_ASSERT(!lastDocument || snapshot.query.comparator(lastDocument, change.document) == @@ -86,11 +87,12 @@ + (FIRDocumentChangeType)documentChangeTypeForChange:(FSTDocumentViewChange *)ch continue; } - FIRQueryDocumentSnapshot *document = - [FIRQueryDocumentSnapshot snapshotWithFirestore:firestore - documentKey:change.document.key - document:change.document - fromCache:snapshot.isFromCache]; + FIRQueryDocumentSnapshot *document = [FIRQueryDocumentSnapshot + snapshotWithFirestore:firestore + documentKey:change.document.key + document:change.document + fromCache:snapshot.isFromCache + hasPendingWrites:snapshot.mutatedKeys.contains(change.document.key)]; NSUInteger oldIndex = NSNotFound; NSUInteger newIndex = NSNotFound; diff --git a/Firestore/Source/API/FIRDocumentReference.mm b/Firestore/Source/API/FIRDocumentReference.mm index 54d9c73d640..0a0034f95af 100644 --- a/Firestore/Source/API/FIRDocumentReference.mm +++ b/Firestore/Source/API/FIRDocumentReference.mm @@ -274,10 +274,15 @@ - (void)getDocumentWithSource:(FIRFirestoreSource)source HARD_ASSERT(snapshot.documents.count <= 1, "Too many document returned on a document query"); FSTDocument *document = [snapshot.documents documentForKey:key]; + BOOL hasPendingWrites = document + ? snapshot.mutatedKeys.contains(key) + : NO; // We don't raise `hasPendingWrites` for deleted documents. + FIRDocumentSnapshot *result = [FIRDocumentSnapshot snapshotWithFirestore:firestore documentKey:key document:document - fromCache:snapshot.fromCache]; + fromCache:snapshot.fromCache + hasPendingWrites:hasPendingWrites]; listener(result, nil); }; diff --git a/Firestore/Source/API/FIRDocumentSnapshot+Internal.h b/Firestore/Source/API/FIRDocumentSnapshot+Internal.h index f4cef9a5e91..fdc5ac8a3d5 100644 --- a/Firestore/Source/API/FIRDocumentSnapshot+Internal.h +++ b/Firestore/Source/API/FIRDocumentSnapshot+Internal.h @@ -29,7 +29,8 @@ NS_ASSUME_NONNULL_BEGIN + (instancetype)snapshotWithFirestore:(FIRFirestore *)firestore documentKey:(firebase::firestore::model::DocumentKey)documentKey document:(nullable FSTDocument *)document - fromCache:(BOOL)fromCache; + fromCache:(BOOL)fromCache + hasPendingWrites:(BOOL)pendingWrites; @property(nonatomic, strong, readonly, nullable) FSTDocument *internalDocument; diff --git a/Firestore/Source/API/FIRDocumentSnapshot.mm b/Firestore/Source/API/FIRDocumentSnapshot.mm index dff5b7fa3e2..042c07161ed 100644 --- a/Firestore/Source/API/FIRDocumentSnapshot.mm +++ b/Firestore/Source/API/FIRDocumentSnapshot.mm @@ -59,13 +59,15 @@ @interface FIRDocumentSnapshot () - (instancetype)initWithFirestore:(FIRFirestore *)firestore documentKey:(DocumentKey)documentKey document:(nullable FSTDocument *)document - fromCache:(BOOL)fromCache NS_DESIGNATED_INITIALIZER; + fromCache:(BOOL)fromCache + hasPendingWrites:(BOOL)pendingWrites NS_DESIGNATED_INITIALIZER; - (const DocumentKey &)internalKey; @property(nonatomic, strong, readonly) FIRFirestore *firestore; @property(nonatomic, strong, readonly, nullable) FSTDocument *internalDocument; @property(nonatomic, assign, readonly) BOOL fromCache; +@property(nonatomic, assign, readonly) BOOL pendingWrites; @end @@ -74,11 +76,13 @@ @implementation FIRDocumentSnapshot (Internal) + (instancetype)snapshotWithFirestore:(FIRFirestore *)firestore documentKey:(DocumentKey)documentKey document:(nullable FSTDocument *)document - fromCache:(BOOL)fromCache { + fromCache:(BOOL)fromCache + hasPendingWrites:(BOOL)pendingWrites { return [[[self class] alloc] initWithFirestore:firestore documentKey:std::move(documentKey) document:document - fromCache:fromCache]; + fromCache:fromCache + hasPendingWrites:pendingWrites]; } @end @@ -93,12 +97,14 @@ @implementation FIRDocumentSnapshot { - (instancetype)initWithFirestore:(FIRFirestore *)firestore documentKey:(DocumentKey)documentKey document:(nullable FSTDocument *)document - fromCache:(BOOL)fromCache { + fromCache:(BOOL)fromCache + hasPendingWrites:(BOOL)pendingWrites { if (self = [super init]) { _firestore = firestore; _internalKey = std::move(documentKey); _internalDocument = document; _fromCache = fromCache; + _pendingWrites = pendingWrites; } return self; } @@ -123,13 +129,14 @@ - (BOOL)isEqualToSnapshot:(nullable FIRDocumentSnapshot *)snapshot { return [self.firestore isEqual:snapshot.firestore] && self.internalKey == snapshot.internalKey && (self.internalDocument == snapshot.internalDocument || [self.internalDocument isEqual:snapshot.internalDocument]) && - self.fromCache == snapshot.fromCache; + self.pendingWrites == snapshot.pendingWrites && self.fromCache == snapshot.fromCache; } - (NSUInteger)hash { NSUInteger hash = [self.firestore hash]; hash = hash * 31u + self.internalKey.Hash(); hash = hash * 31u + [self.internalDocument hash]; + hash = hash * 31u + (_pendingWrites ? 1 : 0); hash = hash * 31u + (self.fromCache ? 1 : 0); return hash; } @@ -150,9 +157,8 @@ - (NSString *)documentID { - (FIRSnapshotMetadata *)metadata { if (!_cachedMetadata) { - _cachedMetadata = [FIRSnapshotMetadata - snapshotMetadataWithPendingWrites:self.internalDocument.hasLocalMutations - fromCache:self.fromCache]; + _cachedMetadata = [FIRSnapshotMetadata snapshotMetadataWithPendingWrites:_pendingWrites + fromCache:self.fromCache]; } return _cachedMetadata; } @@ -256,7 +262,8 @@ @interface FIRQueryDocumentSnapshot () - (instancetype)initWithFirestore:(FIRFirestore *)firestore documentKey:(DocumentKey)documentKey document:(FSTDocument *)document - fromCache:(BOOL)fromCache NS_DESIGNATED_INITIALIZER; + fromCache:(BOOL)fromCache + hasPendingWrites:(BOOL)pendingWrites NS_DESIGNATED_INITIALIZER; @end @@ -265,11 +272,13 @@ @implementation FIRQueryDocumentSnapshot - (instancetype)initWithFirestore:(FIRFirestore *)firestore documentKey:(DocumentKey)documentKey document:(FSTDocument *)document - fromCache:(BOOL)fromCache { + fromCache:(BOOL)fromCache + hasPendingWrites:(BOOL)pendingWrites { self = [super initWithFirestore:firestore documentKey:std::move(documentKey) document:document - fromCache:fromCache]; + fromCache:fromCache + hasPendingWrites:pendingWrites]; return self; } diff --git a/Firestore/Source/API/FIRQuerySnapshot.mm b/Firestore/Source/API/FIRQuerySnapshot.mm index 7a6018bac6c..028d99f2b93 100644 --- a/Firestore/Source/API/FIRQuerySnapshot.mm +++ b/Firestore/Source/API/FIRQuerySnapshot.mm @@ -130,10 +130,13 @@ - (NSInteger)count { NSMutableArray *result = [NSMutableArray array]; for (FSTDocument *document in documentSet.documentEnumerator) { - [result addObject:[FIRQueryDocumentSnapshot snapshotWithFirestore:firestore - documentKey:document.key - document:document - fromCache:fromCache]]; + [result + addObject:[FIRQueryDocumentSnapshot + snapshotWithFirestore:firestore + documentKey:document.key + document:document + fromCache:fromCache + hasPendingWrites:self.snapshot.mutatedKeys.contains(document.key)]]; } _documents = result; diff --git a/Firestore/Source/API/FIRTransaction.mm b/Firestore/Source/API/FIRTransaction.mm index d33a114fee7..773c594e984 100644 --- a/Firestore/Source/API/FIRTransaction.mm +++ b/Firestore/Source/API/FIRTransaction.mm @@ -119,16 +119,20 @@ - (void)getDocument:(FIRDocumentReference *)document HARD_ASSERT(documents.count == 1, "Mismatch in docs returned from document lookup."); FSTMaybeDocument *internalDoc = documents.firstObject; - if ([internalDoc isKindOfClass:[FSTDeletedDocument class]]) { + if ([internalDoc isKindOfClass:[FSTDocument class]]) { + FIRDocumentSnapshot *doc = + [FIRDocumentSnapshot snapshotWithFirestore:self.firestore + documentKey:internalDoc.key + document:(FSTDocument *)internalDoc + fromCache:NO + hasPendingWrites:NO]; + completion(doc, nil); + } else if ([internalDoc isKindOfClass:[FSTDeletedDocument class]]) { completion(nil, nil); - return; + } else { + HARD_FAIL("BatchGetDocumentsRequest returned unexpected document type: %s", + NSStringFromClass([internalDoc class])); } - FIRDocumentSnapshot *doc = - [FIRDocumentSnapshot snapshotWithFirestore:self.firestore - documentKey:internalDoc.key - document:(FSTDocument *)internalDoc - fromCache:NO]; - completion(doc, nil); }]; } diff --git a/Firestore/Source/Core/FSTEventManager.mm b/Firestore/Source/Core/FSTEventManager.mm index d54a0d13ef9..cf634500ce5 100644 --- a/Firestore/Source/Core/FSTEventManager.mm +++ b/Firestore/Source/Core/FSTEventManager.mm @@ -136,7 +136,7 @@ - (void)queryDidChangeViewSnapshot:(FSTViewSnapshot *)snapshot { oldDocuments:snapshot.oldDocuments documentChanges:changes fromCache:snapshot.fromCache - hasPendingWrites:snapshot.hasPendingWrites + mutatedKeys:snapshot.mutatedKeys syncStateChanged:snapshot.syncStateChanged]; } @@ -214,7 +214,7 @@ - (void)raiseInitialEventForSnapshot:(FSTViewSnapshot *)snapshot { oldDocuments:[FSTDocumentSet documentSetWithComparator:snapshot.query.comparator] documentChanges:[FSTQueryListener getInitialViewChangesFor:snapshot] fromCache:snapshot.fromCache - hasPendingWrites:snapshot.hasPendingWrites + mutatedKeys:snapshot.mutatedKeys syncStateChanged:YES]; self.raisedInitialEvent = YES; self.viewSnapshotHandler(snapshot, nil); diff --git a/Firestore/Source/Core/FSTFirestoreClient.mm b/Firestore/Source/Core/FSTFirestoreClient.mm index 5b07b54912b..d65bf7ed75f 100644 --- a/Firestore/Source/Core/FSTFirestoreClient.mm +++ b/Firestore/Source/Core/FSTFirestoreClient.mm @@ -287,13 +287,20 @@ - (void)getDocumentFromLocalCache:(FIRDocumentReference *)doc FSTMaybeDocument *maybeDoc = [self.localStore readDocument:doc.key]; FIRDocumentSnapshot *_Nullable result = nil; NSError *_Nullable error = nil; - if (maybeDoc) { - FSTDocument *_Nullable document = - ([maybeDoc isKindOfClass:[FSTDocument class]]) ? (FSTDocument *)maybeDoc : nil; + + if ([maybeDoc isKindOfClass:[FSTDocument class]]) { + FSTDocument *document = (FSTDocument *)maybeDoc; result = [FIRDocumentSnapshot snapshotWithFirestore:doc.firestore documentKey:doc.key document:document - fromCache:YES]; + fromCache:YES + hasPendingWrites:document.hasLocalMutations]; + } else if ([maybeDoc isKindOfClass:[FSTDeletedDocument class]]) { + result = [FIRDocumentSnapshot snapshotWithFirestore:doc.firestore + documentKey:doc.key + document:nil + fromCache:YES + hasPendingWrites:NO]; } else { error = [NSError errorWithDomain:FIRFirestoreErrorDomain code:FIRFirestoreErrorCodeUnavailable diff --git a/Firestore/Source/Core/FSTSyncEngine.mm b/Firestore/Source/Core/FSTSyncEngine.mm index 0bf10880963..a843238df43 100644 --- a/Firestore/Source/Core/FSTSyncEngine.mm +++ b/Firestore/Source/Core/FSTSyncEngine.mm @@ -378,8 +378,9 @@ - (void)rejectListenWithTargetID:(const TargetId)targetID error:(NSError *)error // It's a limbo doc. Create a synthetic event saying it was deleted. This is kind of a hack. // Ideally, we would have a method in the local store to purge a document. However, it would // be tricky to keep all of the local store's invariants with another method. - FSTDeletedDocument *doc = - [FSTDeletedDocument documentWithKey:limboKey version:SnapshotVersion::None()]; + FSTDeletedDocument *doc = [FSTDeletedDocument documentWithKey:limboKey + version:SnapshotVersion::None() + hasCommittedMutations:NO]; DocumentKeySet limboDocuments = DocumentKeySet{doc.key}; FSTRemoteEvent *event = [[FSTRemoteEvent alloc] initWithSnapshotVersion:SnapshotVersion::None() targetChanges:{} diff --git a/Firestore/Source/Core/FSTTransaction.mm b/Firestore/Source/Core/FSTTransaction.mm index 84166632c52..1f30ae0bc9d 100644 --- a/Firestore/Source/Core/FSTTransaction.mm +++ b/Firestore/Source/Core/FSTTransaction.mm @@ -84,12 +84,17 @@ - (instancetype)initWithDatastore:(FSTDatastore *)datastore { - (BOOL)recordVersionForDocument:(FSTMaybeDocument *)doc error:(NSError **)error { HARD_ASSERT(error != nil, "nil error parameter"); *error = nil; - SnapshotVersion docVersion = doc.version; - if ([doc isKindOfClass:[FSTDeletedDocument class]]) { + SnapshotVersion docVersion; + if ([doc isKindOfClass:[FSTDocument class]]) { + docVersion = doc.version; + } else if ([doc isKindOfClass:[FSTDeletedDocument class]]) { // For deleted docs, we must record an explicit no version to build the right precondition // when writing. docVersion = SnapshotVersion::None(); + } else { + HARD_FAIL("Unexpected document type in transaction: %s", NSStringFromClass([doc class])); } + if (_readVersions.find(doc.key) == _readVersions.end()) { _readVersions[doc.key] = docVersion; return YES; diff --git a/Firestore/Source/Core/FSTView.mm b/Firestore/Source/Core/FSTView.mm index 1889c7cf3f6..9986204f874 100644 --- a/Firestore/Source/Core/FSTView.mm +++ b/Firestore/Source/Core/FSTView.mm @@ -213,6 +213,7 @@ - (FSTViewDocumentChanges *)computeChangesWithDocuments:(FSTMaybeDocumentDiction __block DocumentKeySet newMutatedKeys = previousChanges ? previousChanges.mutatedKeys : _mutatedKeys; + __block DocumentKeySet oldMutatedKeys = _mutatedKeys; __block FSTDocumentSet *newDocumentSet = oldDocumentSet; __block BOOL needsRefill = NO; @@ -242,59 +243,76 @@ - (FSTViewDocumentChanges *)computeChangesWithDocuments:(FSTMaybeDocumentDiction newDoc = nil; } } - if (newDoc) { - newDocumentSet = [newDocumentSet documentSetByAddingDocument:newDoc]; - if (newDoc.hasLocalMutations) { - newMutatedKeys = newMutatedKeys.insert(key); - } else { - newMutatedKeys = newMutatedKeys.erase(key); - } - } else { - newDocumentSet = [newDocumentSet documentSetByRemovingKey:key]; - newMutatedKeys = newMutatedKeys.erase(key); - } + BOOL oldDocHadPendingMutations = oldDoc && oldMutatedKeys.contains(oldDoc.key); + + // We only consider committed mutations for documents that were mutated during the lifetime of + // the view. + BOOL newDocHasPendingMutations = + newDoc && (newDoc.hasLocalMutations || + (oldMutatedKeys.contains(newDoc.key) && newDoc.hasCommittedMutations)); + + BOOL changeApplied = NO; // Calculate change if (oldDoc && newDoc) { BOOL docsEqual = [oldDoc.data isEqual:newDoc.data]; - if (!docsEqual || oldDoc.hasLocalMutations != newDoc.hasLocalMutations) { - // only report a change if document actually changed. - if (docsEqual) { - [changeSet addChange:[FSTDocumentViewChange - changeWithDocument:newDoc - type:FSTDocumentViewChangeTypeMetadata]]; - } else { + if (!docsEqual) { + if (![self shouldWaitForSyncedDocument:newDoc oldDocument:oldDoc]) { [changeSet addChange:[FSTDocumentViewChange changeWithDocument:newDoc type:FSTDocumentViewChangeTypeModified]]; - } + changeApplied = YES; - if (lastDocInLimit && self.query.comparator(newDoc, lastDocInLimit) > 0) { - // This doc moved from inside the limit to after the limit. That means there may be some - // doc in the local cache that's actually less than this one. - needsRefill = YES; + if (lastDocInLimit && self.query.comparator(newDoc, lastDocInLimit) > 0) { + // This doc moved from inside the limit to after the limit. That means there may be + // some doc in the local cache that's actually less than this one. + needsRefill = YES; + } } + } else if (oldDocHadPendingMutations != newDocHasPendingMutations) { + [changeSet + addChange:[FSTDocumentViewChange changeWithDocument:newDoc + type:FSTDocumentViewChangeTypeMetadata]]; + changeApplied = YES; } + } else if (!oldDoc && newDoc) { [changeSet addChange:[FSTDocumentViewChange changeWithDocument:newDoc type:FSTDocumentViewChangeTypeAdded]]; + changeApplied = YES; } else if (oldDoc && !newDoc) { [changeSet addChange:[FSTDocumentViewChange changeWithDocument:oldDoc type:FSTDocumentViewChangeTypeRemoved]]; + changeApplied = YES; + if (lastDocInLimit) { // A doc was removed from a full limit query. We'll need to re-query from the local cache // to see if we know about some other doc that should be in the results. needsRefill = YES; } } + + if (changeApplied) { + if (newDoc) { + newDocumentSet = [newDocumentSet documentSetByAddingDocument:newDoc]; + if (newDoc.hasLocalMutations) { + newMutatedKeys = newMutatedKeys.insert(key); + } else { + newMutatedKeys = newMutatedKeys.erase(key); + } + } else { + newDocumentSet = [newDocumentSet documentSetByRemovingKey:key]; + newMutatedKeys = newMutatedKeys.erase(key); + } + } }]; if (self.query.limit) { - // TODO(klimt): Make DocumentSet size be constant time. - while (newDocumentSet.count > self.query.limit) { + for (long i = newDocumentSet.count - self.query.limit; i > 0; --i) { FSTDocument *oldDoc = [newDocumentSet lastDocument]; newDocumentSet = [newDocumentSet documentSetByRemovingKey:oldDoc.key]; + newMutatedKeys = newMutatedKeys.erase(oldDoc.key); [changeSet addChange:[FSTDocumentViewChange changeWithDocument:oldDoc type:FSTDocumentViewChangeTypeRemoved]]; @@ -310,6 +328,16 @@ - (FSTViewDocumentChanges *)computeChangesWithDocuments:(FSTMaybeDocumentDiction mutatedKeys:newMutatedKeys]; } +- (BOOL)shouldWaitForSyncedDocument:(FSTDocument *)newDoc oldDocument:(FSTDocument *)oldDoc { + // We suppress the initial change event for documents that were modified as part of a write + // acknowledgment (e.g. when the value of a server transform is applied) as Watch will send us + // the same document again. By suppressing the event, we only raise two user visible events (one + // with `hasPendingWrites` and the final state of the document) instead of three (one with + // `hasPendingWrites`, the modified document with `hasPendingWrites` and the final state of the + // document). + return (oldDoc.hasLocalMutations && newDoc.hasCommittedMutations && !newDoc.hasLocalMutations); +} + - (FSTViewChange *)applyChangesToDocuments:(FSTViewDocumentChanges *)docChanges { return [self applyChangesToDocuments:docChanges targetChange:nil]; } @@ -349,7 +377,7 @@ - (FSTViewChange *)applyChangesToDocuments:(FSTViewDocumentChanges *)docChanges oldDocuments:oldDocuments documentChanges:changes fromCache:newSyncState == FSTSyncStateLocal - hasPendingWrites:!docChanges.mutatedKeys.empty() + mutatedKeys:docChanges.mutatedKeys syncStateChanged:syncStateChanged]; return [FSTViewChange changeWithSnapshot:snapshot limboChanges:limboChanges]; diff --git a/Firestore/Source/Core/FSTViewSnapshot.h b/Firestore/Source/Core/FSTViewSnapshot.h index 3db61083273..f516bd74430 100644 --- a/Firestore/Source/Core/FSTViewSnapshot.h +++ b/Firestore/Source/Core/FSTViewSnapshot.h @@ -16,6 +16,10 @@ #import +#include "Firestore/core/src/firebase/firestore/model/document_key_set.h" + +using firebase::firestore::model::DocumentKeySet; + @class FSTDocument; @class FSTQuery; @class FSTDocumentSet; @@ -86,7 +90,7 @@ typedef void (^FSTViewSnapshotHandler)(FSTViewSnapshot *_Nullable snapshot, oldDocuments:(FSTDocumentSet *)oldDocuments documentChanges:(NSArray *)documentChanges fromCache:(BOOL)fromCache - hasPendingWrites:(BOOL)hasPendingWrites + mutatedKeys:(DocumentKeySet)mutatedKeys syncStateChanged:(BOOL)syncStateChanged NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; @@ -112,6 +116,9 @@ typedef void (^FSTViewSnapshotHandler)(FSTViewSnapshot *_Nullable snapshot, /** Whether the sync state changed as part of this snapshot. */ @property(nonatomic, assign, readonly) BOOL syncStateChanged; +/** The document in this snapshot that have unconfirmed writes. */ +@property(nonatomic, assign, readonly) DocumentKeySet mutatedKeys; + @end NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Core/FSTViewSnapshot.mm b/Firestore/Source/Core/FSTViewSnapshot.mm index ac5b376ba0b..086ad5e88d1 100644 --- a/Firestore/Source/Core/FSTViewSnapshot.mm +++ b/Firestore/Source/Core/FSTViewSnapshot.mm @@ -178,7 +178,7 @@ - (instancetype)initWithQuery:(FSTQuery *)query oldDocuments:(FSTDocumentSet *)oldDocuments documentChanges:(NSArray *)documentChanges fromCache:(BOOL)fromCache - hasPendingWrites:(BOOL)hasPendingWrites + mutatedKeys:(DocumentKeySet)mutatedKeys syncStateChanged:(BOOL)syncStateChanged { self = [super init]; if (self) { @@ -187,18 +187,22 @@ - (instancetype)initWithQuery:(FSTQuery *)query _oldDocuments = oldDocuments; _documentChanges = documentChanges; _fromCache = fromCache; - _hasPendingWrites = hasPendingWrites; + _mutatedKeys = mutatedKeys; _syncStateChanged = syncStateChanged; } return self; } +- (BOOL)hasPendingWrites { + return _mutatedKeys.size() != 0; +} + - (NSString *)description { return [NSString stringWithFormat: @"", + "fromCache:%@ mutatedKeys:%zd syncStateChanged:%@>", self.query, self.documents, self.oldDocuments, self.documentChanges, - (self.fromCache ? @"YES" : @"NO"), (self.hasPendingWrites ? @"YES" : @"NO"), + (self.fromCache ? @"YES" : @"NO"), self.mutatedKeys.size(), (self.syncStateChanged ? @"YES" : @"NO")]; } @@ -213,17 +217,20 @@ - (BOOL)isEqual:(id)object { return [self.query isEqual:other.query] && [self.documents isEqual:other.documents] && [self.oldDocuments isEqual:other.oldDocuments] && [self.documentChanges isEqualToArray:other.documentChanges] && - self.fromCache == other.fromCache && self.hasPendingWrites == other.hasPendingWrites && + self.fromCache == other.fromCache && self.mutatedKeys == other.mutatedKeys && self.syncStateChanged == other.syncStateChanged; } - (NSUInteger)hash { + // Note: We are omitting `mutatedKeys` from the hash, since we don't have a straightforward + // way to compute its hash value. Since `FSTViewSnapshot` is currently not stored in an + // NSDictionary, this has no side effects. + NSUInteger result = [self.query hash]; result = 31 * result + [self.documents hash]; result = 31 * result + [self.oldDocuments hash]; result = 31 * result + [self.documentChanges hash]; result = 31 * result + (self.fromCache ? 1231 : 1237); - result = 31 * result + (self.hasPendingWrites ? 1231 : 1237); result = 31 * result + (self.syncStateChanged ? 1231 : 1237); return result; } diff --git a/Firestore/Source/Local/FSTLevelDBMutationQueue.mm b/Firestore/Source/Local/FSTLevelDBMutationQueue.mm index 984540ff79d..e488fd89c73 100644 --- a/Firestore/Source/Local/FSTLevelDBMutationQueue.mm +++ b/Firestore/Source/Local/FSTLevelDBMutationQueue.mm @@ -521,27 +521,25 @@ - (nullable FSTMutationBatch *)nextMutationBatchAfterBatchID:(BatchId)batchID { return result; } -- (void)removeMutationBatches:(NSArray *)batches { +- (void)removeMutationBatch:(FSTMutationBatch *)batch { auto checkIterator = _db.currentTransaction->NewIterator(); - for (FSTMutationBatch *batch in batches) { - BatchId batchID = batch.batchID; - std::string key = LevelDbMutationKey::Key(_userID, batchID); + BatchId batchID = batch.batchID; + std::string key = LevelDbMutationKey::Key(_userID, batchID); - // As a sanity check, verify that the mutation batch exists before deleting it. - checkIterator->Seek(key); - HARD_ASSERT(checkIterator->Valid(), "Mutation batch %s did not exist", DescribeKey(key)); + // As a sanity check, verify that the mutation batch exists before deleting it. + checkIterator->Seek(key); + HARD_ASSERT(checkIterator->Valid(), "Mutation batch %s did not exist", DescribeKey(key)); - HARD_ASSERT(key == checkIterator->key(), "Mutation batch %s not found; found %s", - DescribeKey(key), DescribeKey(checkIterator)); + HARD_ASSERT(key == checkIterator->key(), "Mutation batch %s not found; found %s", + DescribeKey(key), DescribeKey(checkIterator)); - _db.currentTransaction->Delete(key); + _db.currentTransaction->Delete(key); - for (FSTMutation *mutation in batch.mutations) { - key = LevelDbDocumentMutationKey::Key(_userID, mutation.key, batchID); - _db.currentTransaction->Delete(key); - [_db.referenceDelegate removeMutationReference:mutation.key]; - } + for (FSTMutation *mutation in batch.mutations) { + key = LevelDbDocumentMutationKey::Key(_userID, mutation.key, batchID); + _db.currentTransaction->Delete(key); + [_db.referenceDelegate removeMutationReference:mutation.key]; } } diff --git a/Firestore/Source/Local/FSTLevelDBQueryCache.mm b/Firestore/Source/Local/FSTLevelDBQueryCache.mm index 0bb79c79bd1..216ebce85a1 100644 --- a/Firestore/Source/Local/FSTLevelDBQueryCache.mm +++ b/Firestore/Source/Local/FSTLevelDBQueryCache.mm @@ -179,7 +179,7 @@ - (void)enumerateOrphanedDocumentsUsingBlock: LevelDbDocumentTargetKey key; BOOL stop = NO; for (; !stop && it->Valid() && absl::StartsWith(it->key(), documentTargetPrefix); it->Next()) { - key.Decode(it->key()); + HARD_ASSERT(key.Decode(it->key()), "Failed to decode DocumentTarget key"); if (key.IsSentinel()) { // if nextToReport is non-zero, report it, this is a new key so the last one // must be not be a member of any targets. diff --git a/Firestore/Source/Local/FSTLocalDocumentsView.mm b/Firestore/Source/Local/FSTLocalDocumentsView.mm index 170095bda5d..f25dc6142cd 100644 --- a/Firestore/Source/Local/FSTLocalDocumentsView.mm +++ b/Firestore/Source/Local/FSTLocalDocumentsView.mm @@ -87,7 +87,9 @@ - (FSTMaybeDocumentDictionary *)documentsForKeys:(const DocumentKeySet &)keys { FSTMaybeDocument *maybeDoc = [self documentForKey:key inBatches:batches]; // TODO(http://b/32275378): Don't conflate missing / deleted. if (!maybeDoc) { - maybeDoc = [FSTDeletedDocument documentWithKey:key version:SnapshotVersion::None()]; + maybeDoc = [FSTDeletedDocument documentWithKey:key + version:SnapshotVersion::None() + hasCommittedMutations:NO]; } results = [results dictionaryBySettingObject:maybeDoc forKey:key]; } @@ -133,12 +135,10 @@ - (FSTDocumentDictionary *)documentsMatchingCollectionQuery:(FSTQuery *)query { baseDocument:baseDoc localWriteTime:batch.localWriteTime]; - if (!mutatedDoc || [mutatedDoc isKindOfClass:[FSTDeletedDocument class]]) { - results = [results dictionaryByRemovingObjectForKey:key]; - } else if ([mutatedDoc isKindOfClass:[FSTDocument class]]) { + if ([mutatedDoc isKindOfClass:[FSTDocument class]]) { results = [results dictionaryBySettingObject:(FSTDocument *)mutatedDoc forKey:key]; } else { - HARD_FAIL("Unknown document: %s", mutatedDoc); + results = [results dictionaryByRemovingObjectForKey:key]; } } } diff --git a/Firestore/Source/Local/FSTLocalSerializer.mm b/Firestore/Source/Local/FSTLocalSerializer.mm index 3b4fec05160..ed5bdab9a00 100644 --- a/Firestore/Source/Local/FSTLocalSerializer.mm +++ b/Firestore/Source/Local/FSTLocalSerializer.mm @@ -62,9 +62,17 @@ - (FSTPBMaybeDocument *)encodedMaybeDocument:(FSTMaybeDocument *)document { FSTPBMaybeDocument *proto = [FSTPBMaybeDocument message]; if ([document isKindOfClass:[FSTDeletedDocument class]]) { - proto.noDocument = [self encodedDeletedDocument:(FSTDeletedDocument *)document]; + FSTDeletedDocument *deletedDocument = (FSTDeletedDocument *)document; + proto.noDocument = [self encodedDeletedDocument:deletedDocument]; + proto.hasCommittedMutations = deletedDocument.hasCommittedMutations; } else if ([document isKindOfClass:[FSTDocument class]]) { - proto.document = [self encodedDocument:(FSTDocument *)document]; + FSTDocument *existingDocument = (FSTDocument *)document; + proto.document = [self encodedDocument:existingDocument]; + proto.hasCommittedMutations = existingDocument.hasCommittedMutations; + } else if ([document isKindOfClass:[FSTUnknownDocument class]]) { + FSTUnknownDocument *unknownDocument = (FSTUnknownDocument *)document; + proto.unknownDocument = [self encodedUnknownDocument:unknownDocument]; + proto.hasCommittedMutations = YES; } else { HARD_FAIL("Unknown document type %s", NSStringFromClass([document class])); } @@ -75,10 +83,15 @@ - (FSTPBMaybeDocument *)encodedMaybeDocument:(FSTMaybeDocument *)document { - (FSTMaybeDocument *)decodedMaybeDocument:(FSTPBMaybeDocument *)proto { switch (proto.documentTypeOneOfCase) { case FSTPBMaybeDocument_DocumentType_OneOfCase_Document: - return [self decodedDocument:proto.document]; + return + [self decodedDocument:proto.document withCommittedMutations:proto.hasCommittedMutations]; case FSTPBMaybeDocument_DocumentType_OneOfCase_NoDocument: - return [self decodedDeletedDocument:proto.noDocument]; + return [self decodedDeletedDocument:proto.noDocument + withCommittedMutations:proto.hasCommittedMutations]; + + case FSTPBMaybeDocument_DocumentType_OneOfCase_UnknownDocument: + return [self decodedUnknownDocument:proto.unknownDocument]; default: HARD_FAIL("Unknown MaybeDocument %s", proto); @@ -102,13 +115,18 @@ - (GCFSDocument *)encodedDocument:(FSTDocument *)document { } /** Decodes a Document proto to the equivalent model. */ -- (FSTDocument *)decodedDocument:(GCFSDocument *)document { +- (FSTDocument *)decodedDocument:(GCFSDocument *)document + withCommittedMutations:(BOOL)committedMutations { FSTSerializerBeta *remoteSerializer = self.remoteSerializer; FSTObjectValue *data = [remoteSerializer decodedFields:document.fields]; DocumentKey key = [remoteSerializer decodedDocumentKey:document.name]; SnapshotVersion version = [remoteSerializer decodedVersion:document.updateTime]; - return [FSTDocument documentWithData:data key:key version:version hasLocalMutations:NO]; + return [FSTDocument documentWithData:data + key:key + version:version + state:committedMutations ? FSTDocumentStateCommittedMutations + : FSTDocumentStateSynced]; } /** Encodes a NoDocument value to the equivalent proto. */ @@ -122,12 +140,34 @@ - (FSTPBNoDocument *)encodedDeletedDocument:(FSTDeletedDocument *)document { } /** Decodes a NoDocument proto to the equivalent model. */ -- (FSTDeletedDocument *)decodedDeletedDocument:(FSTPBNoDocument *)proto { +- (FSTDeletedDocument *)decodedDeletedDocument:(FSTPBNoDocument *)proto + withCommittedMutations:(BOOL)committedMutations { FSTSerializerBeta *remoteSerializer = self.remoteSerializer; DocumentKey key = [remoteSerializer decodedDocumentKey:proto.name]; SnapshotVersion version = [remoteSerializer decodedVersion:proto.readTime]; - return [FSTDeletedDocument documentWithKey:key version:version]; + return [FSTDeletedDocument documentWithKey:key + version:version + hasCommittedMutations:committedMutations]; +} + +/** Encodes an UnknownDocument value to the equivalent proto. */ +- (FSTPBUnknownDocument *)encodedUnknownDocument:(FSTUnknownDocument *)document { + FSTSerializerBeta *remoteSerializer = self.remoteSerializer; + + FSTPBUnknownDocument *proto = [FSTPBUnknownDocument message]; + proto.name = [remoteSerializer encodedDocumentKey:document.key]; + proto.version = [remoteSerializer encodedVersion:document.version]; + return proto; +} + +/** Decodes an UnknownDocument proto to the equivalent model. */ +- (FSTUnknownDocument *)decodedUnknownDocument:(FSTPBUnknownDocument *)proto { + FSTSerializerBeta *remoteSerializer = self.remoteSerializer; + + DocumentKey key = [remoteSerializer decodedDocumentKey:proto.name]; + SnapshotVersion version = [remoteSerializer decodedVersion:proto.version]; + return [FSTUnknownDocument documentWithKey:key version:version]; } - (FSTPBWriteBatch *)encodedMutationBatch:(FSTMutationBatch *)batch { diff --git a/Firestore/Source/Local/FSTLocalStore.mm b/Firestore/Source/Local/FSTLocalStore.mm index 24dd6c31b48..1c9a4c83ad9 100644 --- a/Firestore/Source/Local/FSTLocalStore.mm +++ b/Firestore/Source/Local/FSTLocalStore.mm @@ -86,17 +86,6 @@ @interface FSTLocalStore () /** Maps a targetID to data about its query. */ @property(nonatomic, strong) NSMutableDictionary *targetIDs; -/** - * A heldBatchResult is a mutation batch result (from a write acknowledgement) that arrived before - * the watch stream got notified of a snapshot that includes the write.  So we "hold" it until - * the watch stream catches up. It ensures that the local write remains visible (latency - * compensation) and doesn't temporarily appear reverted because the watch stream is slower than - * the write stream and so wasn't reflecting it. - * - * NOTE: Eventually we want to move this functionality into the remote store. - */ -@property(nonatomic, strong) NSMutableArray *heldBatchResults; - @end @implementation FSTLocalStore { @@ -117,7 +106,6 @@ - (instancetype)initWithPersistence:(id)persistence [_persistence.referenceDelegate addInMemoryPins:_localViewReferences]; _targetIDs = [NSMutableDictionary dictionary]; - _heldBatchResults = [NSMutableArray array]; _targetIDGenerator = TargetIdGenerator::LocalStoreTargetIdGenerator(0); } @@ -131,27 +119,7 @@ - (void)start { } - (void)startMutationQueue { - self.persistence.run("Start MutationQueue", [&]() { - [self.mutationQueue start]; - - // If we have any leftover mutation batch results from a prior run, just drop them. - // TODO(http://b/33446471): We probably need to repopulate heldBatchResults or similar instead, - // but that is not straightforward since we're not persisting the write ack versions. - [self.heldBatchResults removeAllObjects]; - - // TODO(mikelehen): This is the only usage of getAllMutationBatchesThroughBatchId:. Consider - // removing it in favor of a getAcknowledgedBatches method. - BatchId highestAck = [self.mutationQueue highestAcknowledgedBatchID]; - if (highestAck != kFSTBatchIDUnknown) { - NSArray *batches = - [self.mutationQueue allMutationBatchesThroughBatchID:highestAck]; - if (batches.count > 0) { - // NOTE: This could be more efficient if we had a removeBatchesThroughBatchID, but this set - // should be very small and this code should go away eventually. - [self.mutationQueue removeMutationBatches:batches]; - } - } - }); + self.persistence.run("Start MutationQueue", [&]() { [self.mutationQueue start]; }); } - (FSTMaybeDocumentDictionary *)userDidChange:(const User &)user { @@ -202,18 +170,12 @@ - (FSTMaybeDocumentDictionary *)acknowledgeBatchWithResult:(FSTMutationBatchResu return self.persistence.run("Acknowledge batch", [&]() -> FSTMaybeDocumentDictionary * { id mutationQueue = self.mutationQueue; - [mutationQueue acknowledgeBatch:batchResult.batch streamToken:batchResult.streamToken]; - - DocumentKeySet affected; - if ([self shouldHoldBatchResultWithVersion:batchResult.commitVersion]) { - [self.heldBatchResults addObject:batchResult]; - } else { - affected = [self releaseBatchResults:@[ batchResult ]]; - } - + FSTMutationBatch *batch = batchResult.batch; + [mutationQueue acknowledgeBatch:batch streamToken:batchResult.streamToken]; + [self applyBatchResult:batchResult]; [self.mutationQueue performConsistencyCheck]; - return [self.localDocuments documentsForKeys:affected]; + return [self.localDocuments documentsForKeys:batch.keys]; }); } @@ -225,11 +187,10 @@ - (FSTMaybeDocumentDictionary *)rejectBatchID:(BatchId)batchID { BatchId lastAcked = [self.mutationQueue highestAcknowledgedBatchID]; HARD_ASSERT(batchID > lastAcked, "Acknowledged batches can't be rejected."); - DocumentKeySet affected = [self removeMutationBatch:toReject]; - + [self.mutationQueue removeMutationBatch:toReject]; [self.mutationQueue performConsistencyCheck]; - return [self.localDocuments documentsForKeys:affected]; + return [self.localDocuments documentsForKeys:toReject.keys]; }); } @@ -312,7 +273,8 @@ - (FSTMaybeDocumentDictionary *)applyRemoteEvent:(FSTRemoteEvent *)remoteEvent { // to the remote cache. We make an exception for SnapshotVersion.MIN which can happen for // manufactured events (e.g. in the case of a limbo document resolution failing). if (!existingDoc || doc.version == SnapshotVersion::None() || - authoritativeUpdates.contains(doc.key) || doc.version >= existingDoc.version) { + (authoritativeUpdates.contains(doc.key) && !existingDoc.hasPendingWrites) || + doc.version >= existingDoc.version) { [self.remoteDocumentCache addEntry:doc]; } else { LOG_DEBUG( @@ -340,15 +302,7 @@ - (FSTMaybeDocumentDictionary *)applyRemoteEvent:(FSTRemoteEvent *)remoteEvent { [self.queryCache setLastRemoteSnapshotVersion:remoteVersion]; } - DocumentKeySet releasedWriteKeys = [self releaseHeldBatchResults]; - - // Union the two key sets. - DocumentKeySet keysToRecalc = changedDocKeys; - for (const DocumentKey &key : releasedWriteKeys) { - keysToRecalc = keysToRecalc.insert(key); - } - - return [self.localDocuments documentsForKeys:keysToRecalc]; + return [self.localDocuments documentsForKeys:changedDocKeys]; }); } @@ -454,15 +408,16 @@ - (void)releaseQuery:(FSTQuery *)query { [self.queryCache updateQueryData:queryData]; } - [self.localViewReferences removeReferencesForID:targetID]; + // References for documents sent via Watch are automatically removed when we delete a + // query's target data from the reference delegate. Since this does not remove references + // for locally mutated documents, we have to remove the target associations for these + // documents manually. + DocumentKeySet removed = [self.localViewReferences removeReferencesForID:targetID]; + for (const DocumentKey &key : removed) { + [self.persistence.referenceDelegate removeReference:key]; + } [self.targetIDs removeObjectForKey:boxedTargetID]; [self.persistence.referenceDelegate removeTarget:queryData]; - - // If this was the last watch target, then we won't get any more watch snapshots, so we should - // release any held batch results. - if ([self.targetIDs count] == 0) { - [self releaseHeldBatchResults]; - } }); } @@ -478,67 +433,6 @@ - (DocumentKeySet)remoteDocumentKeysForTarget:(TargetId)targetID { }); } -/** - * Releases all the held mutation batches up to the current remote version received, and - * applies their mutations to the docs in the remote documents cache. - * - * @return the set of keys of docs that were modified by those writes. - */ -- (DocumentKeySet)releaseHeldBatchResults { - NSMutableArray *toRelease = [NSMutableArray array]; - for (FSTMutationBatchResult *batchResult in self.heldBatchResults) { - if (![self isRemoteUpToVersion:batchResult.commitVersion]) { - break; - } - [toRelease addObject:batchResult]; - } - - if (toRelease.count == 0) { - return DocumentKeySet{}; - } else { - [self.heldBatchResults removeObjectsInRange:NSMakeRange(0, toRelease.count)]; - return [self releaseBatchResults:toRelease]; - } -} - -- (BOOL)isRemoteUpToVersion:(const SnapshotVersion &)version { - // If there are no watch targets, then we won't get remote snapshots, and are always "up-to-date." - return version <= self.queryCache.lastRemoteSnapshotVersion || self.targetIDs.count == 0; -} - -- (BOOL)shouldHoldBatchResultWithVersion:(const SnapshotVersion &)version { - // Check if watcher isn't up to date or prior results are already held. - return ![self isRemoteUpToVersion:version] || self.heldBatchResults.count > 0; -} - -- (DocumentKeySet)releaseBatchResults:(NSArray *)batchResults { - NSMutableArray *batches = [NSMutableArray array]; - for (FSTMutationBatchResult *batchResult in batchResults) { - [self applyBatchResult:batchResult]; - [batches addObject:batchResult.batch]; - } - - return [self removeMutationBatches:batches]; -} - -- (DocumentKeySet)removeMutationBatch:(FSTMutationBatch *)batch { - return [self removeMutationBatches:@[ batch ]]; -} - -/** Removes all the mutation batches named in the given array. */ -- (DocumentKeySet)removeMutationBatches:(NSArray *)batches { - DocumentKeySet affectedDocs; - for (FSTMutationBatch *batch in batches) { - for (FSTMutation *mutation in batch.mutations) { - const DocumentKey &key = mutation.key; - affectedDocs = affectedDocs.insert(key); - } - } - - [self.mutationQueue removeMutationBatches:batches]; - return affectedDocs; -} - - (void)applyBatchResult:(FSTMutationBatchResult *)batchResult { FSTMutationBatch *batch = batchResult.batch; DocumentKeySet docKeys = batch.keys; @@ -561,6 +455,8 @@ - (void)applyBatchResult:(FSTMutationBatchResult *)batchResult { } } } + + [self.mutationQueue removeMutationBatch:batch]; } @end diff --git a/Firestore/Source/Local/FSTMemoryMutationQueue.mm b/Firestore/Source/Local/FSTMemoryMutationQueue.mm index c4a570eaf83..a35025ef73f 100644 --- a/Firestore/Source/Local/FSTMemoryMutationQueue.mm +++ b/Firestore/Source/Local/FSTMemoryMutationQueue.mm @@ -326,67 +326,42 @@ - (nullable FSTMutationBatch *)nextMutationBatchAfterBatchID:(BatchId)batchID { return result; } -- (void)removeMutationBatches:(NSArray *)batches { - NSUInteger batchCount = batches.count; - HARD_ASSERT(batchCount > 0, "Should not remove mutations when none exist."); - - BatchId firstBatchID = batches[0].batchID; - +- (void)removeMutationBatch:(FSTMutationBatch *)batch { NSMutableArray *queue = self.queue; NSUInteger queueCount = queue.count; + BatchId batchID = batch.batchID; // Find the position of the first batch for removal. This need not be the first entry in the // queue. - NSUInteger startIndex = [self indexOfExistingBatchID:firstBatchID action:@"removed"]; - HARD_ASSERT(queue[startIndex].batchID == firstBatchID, "Removed batches must exist in the queue"); - - // Check that removed batches are contiguous (while excluding tombstones). - NSUInteger batchIndex = 1; - NSUInteger queueIndex = startIndex + 1; - while (batchIndex < batchCount && queueIndex < queueCount) { - FSTMutationBatch *batch = queue[queueIndex]; - if ([batch isTombstone]) { - queueIndex++; - continue; - } - - HARD_ASSERT(batch.batchID == batches[batchIndex].batchID, - "Removed batches must be contiguous in the queue"); - batchIndex++; - queueIndex++; - } + NSUInteger batchIndex = [self indexOfExistingBatchID:batchID action:@"removed"]; + HARD_ASSERT(queue[batchIndex].batchID == batchID, "Removed batches must exist in the queue"); // Only actually remove batches if removing at the front of the queue. Previously rejected batches // may have left tombstones in the queue, so expand the removal range to include any tombstones. - if (startIndex == 0) { - for (; queueIndex < queueCount; queueIndex++) { - FSTMutationBatch *batch = queue[queueIndex]; + if (batchIndex == 0) { + int endIndex = 1; + for (; endIndex < queueCount; endIndex++) { + FSTMutationBatch *batch = queue[endIndex]; if (![batch isTombstone]) { break; } } - NSUInteger length = queueIndex - startIndex; - [queue removeObjectsInRange:NSMakeRange(startIndex, length)]; + NSUInteger length = endIndex - batchIndex; + [queue removeObjectsInRange:NSMakeRange(batchIndex, length)]; } else { - // Mark tombstones - for (NSUInteger i = startIndex; i < queueIndex; i++) { - queue[i] = [queue[i] toTombstone]; - } + queue[batchIndex] = [queue[batchIndex] toTombstone]; } // Remove entries from the index too. FSTImmutableSortedSet *references = self.batchesByDocumentKey; - for (FSTMutationBatch *batch in batches) { - BatchId batchID = batch.batchID; - for (FSTMutation *mutation in batch.mutations) { - const DocumentKey &key = mutation.key; - [_persistence.referenceDelegate removeMutationReference:key]; - - FSTDocumentReference *reference = [[FSTDocumentReference alloc] initWithKey:key ID:batchID]; - references = [references setByRemovingObject:reference]; - } + for (FSTMutation *mutation in batch.mutations) { + const DocumentKey &key = mutation.key; + [_persistence.referenceDelegate removeMutationReference:key]; + + FSTDocumentReference *reference = [[FSTDocumentReference alloc] initWithKey:key ID:batchID]; + references = [references setByRemovingObject:reference]; } self.batchesByDocumentKey = references; } diff --git a/Firestore/Source/Local/FSTMutationQueue.h b/Firestore/Source/Local/FSTMutationQueue.h index 43ef941dbe6..2cd762322ce 100644 --- a/Firestore/Source/Local/FSTMutationQueue.h +++ b/Firestore/Source/Local/FSTMutationQueue.h @@ -147,15 +147,12 @@ NS_ASSUME_NONNULL_BEGIN - (NSArray *)allMutationBatchesAffectingQuery:(FSTQuery *)query; /** - * Removes the given mutation batches from the queue. This is useful in two circumstances: + * Removes the given mutation batch from the queue. This is useful in two circumstances: * * + Removing applied mutations from the head of the queue * + Removing rejected mutations from anywhere in the queue - * - * In both cases, the array of mutations to remove must be a contiguous range of batchIds. This is - * most easily accomplished by loading mutations with @a -allMutationBatchesThroughBatchID:. */ -- (void)removeMutationBatches:(NSArray *)batches; +- (void)removeMutationBatch:(FSTMutationBatch *)batch; /** Performs a consistency check, examining the mutation queue for any leaks, if possible. */ - (void)performConsistencyCheck; diff --git a/Firestore/Source/Local/FSTReferenceSet.h b/Firestore/Source/Local/FSTReferenceSet.h index f06f8ca2aec..deffa1d4580 100644 --- a/Firestore/Source/Local/FSTReferenceSet.h +++ b/Firestore/Source/Local/FSTReferenceSet.h @@ -52,7 +52,7 @@ NS_ASSUME_NONNULL_BEGIN forID:(int)ID; /** Clears all references with a given ID. Calls -removeReferenceToKey: for each key removed. */ -- (void)removeReferencesForID:(int)ID; +- (firebase::firestore::model::DocumentKeySet)removeReferencesForID:(int)ID; /** Clears all references for all IDs. */ - (void)removeAllReferences; diff --git a/Firestore/Source/Local/FSTReferenceSet.mm b/Firestore/Source/Local/FSTReferenceSet.mm index 9ac862bd8d0..1bdf8389df6 100644 --- a/Firestore/Source/Local/FSTReferenceSet.mm +++ b/Firestore/Source/Local/FSTReferenceSet.mm @@ -86,17 +86,20 @@ - (void)removeReferencesToKeys:(const DocumentKeySet &)keys forID:(int)ID { } } -- (void)removeReferencesForID:(int)ID { +- (DocumentKeySet)removeReferencesForID:(int)ID { FSTDocumentReference *start = [[FSTDocumentReference alloc] initWithKey:DocumentKey::Empty() ID:ID]; FSTDocumentReference *end = [[FSTDocumentReference alloc] initWithKey:DocumentKey::Empty() ID:(ID + 1)]; + __block DocumentKeySet keys; [self.referencesByID enumerateObjectsFrom:start to:end usingBlock:^(FSTDocumentReference *reference, BOOL *stop) { [self removeReference:reference]; + keys = keys.insert(reference.key); }]; + return keys; } - (void)removeAllReferences { diff --git a/Firestore/Source/Model/FSTDocument.h b/Firestore/Source/Model/FSTDocument.h index 0f8d4b3db39..6d9cc8681ba 100644 --- a/Firestore/Source/Model/FSTDocument.h +++ b/Firestore/Source/Model/FSTDocument.h @@ -25,6 +25,16 @@ NS_ASSUME_NONNULL_BEGIN +/** Describes the `hasPendingWrites` state of a document. */ +typedef NS_ENUM(NSInteger, FSTDocumentState) { + /** Local mutations applied via the mutation queue. Document is potentially inconsistent. */ + FSTDocumentStateLocalMutations, + /** Mutations applied based on a write acknowledgment. Document is potentially inconsistent. */ + FSTDocumentStateCommittedMutations, + /** No mutations applied. Document was sent to us by Watch. */ + FSTDocumentStateSynced +}; + /** * The result of a lookup for a given path may be an existing document or a tombstone that marks * the path deleted. @@ -33,22 +43,38 @@ NS_ASSUME_NONNULL_BEGIN - (id)init __attribute__((unavailable("Abstract base class"))); - (const firebase::firestore::model::DocumentKey &)key; - (const firebase::firestore::model::SnapshotVersion &)version; + +/** + * Whether this document has a local mutation applied that has not yet been acknowledged by Watch. + */ +- (BOOL)hasPendingWrites; + @end @interface FSTDocument : FSTMaybeDocument + (instancetype)documentWithData:(FSTObjectValue *)data key:(firebase::firestore::model::DocumentKey)key version:(firebase::firestore::model::SnapshotVersion)version - hasLocalMutations:(BOOL)mutations; + state:(FSTDocumentState)state; - (nullable FSTFieldValue *)fieldForPath:(const firebase::firestore::model::FieldPath &)path; +- (BOOL)hasLocalMutations; +- (BOOL)hasCommittedMutations; @property(nonatomic, strong, readonly) FSTObjectValue *data; -@property(nonatomic, readonly, getter=hasLocalMutations) BOOL localMutations; @end @interface FSTDeletedDocument : FSTMaybeDocument ++ (instancetype)documentWithKey:(firebase::firestore::model::DocumentKey)key + version:(firebase::firestore::model::SnapshotVersion)version + hasCommittedMutations:(BOOL)committedMutations; + +- (BOOL)hasCommittedMutations; + +@end + +@interface FSTUnknownDocument : FSTMaybeDocument + (instancetype)documentWithKey:(firebase::firestore::model::DocumentKey)key version:(firebase::firestore::model::SnapshotVersion)version; @end diff --git a/Firestore/Source/Model/FSTDocument.mm b/Firestore/Source/Model/FSTDocument.mm index f96552c13e4..88c37e99681 100644 --- a/Firestore/Source/Model/FSTDocument.mm +++ b/Firestore/Source/Model/FSTDocument.mm @@ -19,6 +19,7 @@ #include #import "Firestore/Source/Model/FSTFieldValue.h" +#import "Firestore/Source/Util/FSTClasses.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" #include "Firestore/core/src/firebase/firestore/model/field_path.h" @@ -54,6 +55,10 @@ - (instancetype)initWithKey:(DocumentKey)key version:(SnapshotVersion)version { return self; } +- (BOOL)hasPendingWrites { + @throw FSTAbstractMethodException(); // NOLINT +} + - (id)copyWithZone:(NSZone *_Nullable)zone { // All document types are immutable return self; @@ -69,30 +74,44 @@ - (id)copyWithZone:(NSZone *_Nullable)zone { @end -@implementation FSTDocument +@implementation FSTDocument { + FSTDocumentState _documentState; +} + (instancetype)documentWithData:(FSTObjectValue *)data key:(DocumentKey)key version:(SnapshotVersion)version - hasLocalMutations:(BOOL)mutations { + state:(FSTDocumentState)state { return [[FSTDocument alloc] initWithData:data key:std::move(key) version:std::move(version) - hasLocalMutations:mutations]; + state:state]; } - (instancetype)initWithData:(FSTObjectValue *)data key:(DocumentKey)key version:(SnapshotVersion)version - hasLocalMutations:(BOOL)mutations { + state:(FSTDocumentState)state { self = [super initWithKey:std::move(key) version:std::move(version)]; if (self) { _data = data; - _localMutations = mutations; + _documentState = state; } return self; } +- (BOOL)hasLocalMutations { + return _documentState == FSTDocumentStateLocalMutations; +} + +- (BOOL)hasCommittedMutations { + return _documentState == FSTDocumentStateCommittedMutations; +} + +- (BOOL)hasPendingWrites { + return self.hasLocalMutations || self.hasCommittedMutations; +} + - (BOOL)isEqual:(id)other { if (other == self) { return YES; @@ -103,22 +122,22 @@ - (BOOL)isEqual:(id)other { FSTDocument *otherDoc = other; return self.key == otherDoc.key && self.version == otherDoc.version && - [self.data isEqual:otherDoc.data] && self.hasLocalMutations == otherDoc.hasLocalMutations; + _documentState == otherDoc->_documentState && [self.data isEqual:otherDoc.data]; } - (NSUInteger)hash { NSUInteger result = [self.key hash]; result = result * 31 + self.version.Hash(); result = result * 31 + [self.data hash]; - result = result * 31 + (self.hasLocalMutations ? 1 : 0); + result = result * 31 + _documentState; return result; } - (NSString *)description { - return [NSString stringWithFormat:@"", + return [NSString stringWithFormat:@"", self.key.ToString().c_str(), self.version.timestamp().ToString().c_str(), - self.localMutations ? @"YES" : @"NO", self.data]; + (long)_documentState, self.data]; } - (nullable FSTFieldValue *)fieldForPath:(const FieldPath &)path { @@ -127,10 +146,29 @@ - (nullable FSTFieldValue *)fieldForPath:(const FieldPath &)path { @end -@implementation FSTDeletedDocument +@implementation FSTDeletedDocument { + BOOL _hasCommittedMutations; +} + ++ (instancetype)documentWithKey:(DocumentKey)key + version:(SnapshotVersion)version + hasCommittedMutations:(BOOL)committedMutations { + FSTDeletedDocument *deletedDocument = + [[FSTDeletedDocument alloc] initWithKey:std::move(key) version:std::move(version)]; -+ (instancetype)documentWithKey:(DocumentKey)key version:(SnapshotVersion)version { - return [[FSTDeletedDocument alloc] initWithKey:std::move(key) version:std::move(version)]; + if (deletedDocument) { + deletedDocument->_hasCommittedMutations = committedMutations; + } + + return deletedDocument; +} + +- (BOOL)hasCommittedMutations { + return _hasCommittedMutations; +} + +- (BOOL)hasPendingWrites { + return self.hasCommittedMutations; } - (BOOL)isEqual:(id)other { @@ -141,6 +179,45 @@ - (BOOL)isEqual:(id)other { return NO; } + FSTDeletedDocument *otherDoc = other; + return self.key == otherDoc.key && self.version == otherDoc.version && + _hasCommittedMutations == otherDoc->_hasCommittedMutations; +} + +- (NSUInteger)hash { + NSUInteger result = [self.key hash]; + result = result * 31 + self.version.Hash(); + result = result * 31 + (_hasCommittedMutations ? 1 : 0); + return result; +} + +- (NSString *)description { + return [NSString + stringWithFormat:@"", + self.key.ToString().c_str(), self.version.timestamp().ToString().c_str(), + _hasCommittedMutations]; +} + +@end + +@implementation FSTUnknownDocument + ++ (instancetype)documentWithKey:(DocumentKey)key version:(SnapshotVersion)version { + return [[FSTUnknownDocument alloc] initWithKey:std::move(key) version:std::move(version)]; +} + +- (BOOL)hasPendingWrites { + return YES; +} + +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isKindOfClass:[FSTUnknownDocument class]]) { + return NO; + } + FSTDocument *otherDoc = other; return self.key == otherDoc.key && self.version == otherDoc.version; } @@ -151,6 +228,12 @@ - (NSUInteger)hash { return result; } +- (NSString *)description { + return [NSString stringWithFormat:@"", + self.key.ToString().c_str(), + self.version.timestamp().ToString().c_str()]; +} + @end const NSComparator FSTDocumentComparatorByKey = diff --git a/Firestore/Source/Model/FSTMutation.h b/Firestore/Source/Model/FSTMutation.h index 569dc0caf4f..4eb22bc754a 100644 --- a/Firestore/Source/Model/FSTMutation.h +++ b/Firestore/Source/Model/FSTMutation.h @@ -46,7 +46,16 @@ NS_ASSUME_NONNULL_BEGIN transformResults:(NSArray *_Nullable)transformResults NS_DESIGNATED_INITIALIZER; -/** The version at which the mutation was committed. */ +/** + * The version at which the mutation was committed. + * + * - For most operations, this is the updateTime in the WriteResult. + * - For deletes, it is the commitTime of the WriteResponse (because deletes are not stored + * and have no updateTime). + * + * Note that these versions can be different: No-op writes will not change the updateTime even + * though the commitTime advances. + */ - (const firebase::firestore::model::SnapshotVersion &)version; /** @@ -62,42 +71,21 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - FSTMutation /** - * A mutation describes a self-contained change to a document. Mutations can create, replace, - * delete, and update subsets of documents. - * - * ## Subclassing Notes - * - * Subclasses of FSTMutation need to implement -applyTo:hasLocalMutations: to implement the - * actual the behavior of mutation as applied to some source document. - */ -@interface FSTMutation : NSObject - -- (id)init NS_UNAVAILABLE; - -- (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key - precondition:(firebase::firestore::model::Precondition)precondition - NS_DESIGNATED_INITIALIZER; - -/** - * Applies this mutation to the given FSTDocument, FSTDeletedDocument or nil for the purposes of - * computing a new remote document. Both the input and returned documents can be nil. - * - * @param maybeDoc The current state of the document to mutate. The input document should be nil if - * it does not currently exist. - * @param mutationResult Optional result info from the backend. If omitted, it's assumed that - * this is merely a local (latency-compensated) application, and the resulting document will - * have its hasLocalMutations flag set. + * Represents a Mutation of a document. Different subclasses of Mutation will perform different + * kinds of changes to a base document. For example, an FSTSetMutation replaces the value of a + * document and an FSTDeleteMutation deletes a document. * - * @return The mutated document. The returned document may be nil, but only if maybeDoc was nil - * and the mutation would not create a new document. + * Subclasses of FSTMutation need to implement `applyToRemoteDocument:mutationResult:` and + * `applyToLocalDocument:baseDocument:localWriteTime:` to implement the actual the behavior of + * mutations as applied to some source document. * - * NOTE: We preserve the version of the base document only in case of Set or Patch mutation to - * denote what version of original document we've changed. In case of DeleteMutation we always reset - * the version. + * In addition to the value of the document mutations also operate on the version. For local + * mutations (mutations that haven't been committed yet), we preserve the existing version for Set, + * Patch, and Transform mutations. For local deletes, we reset the version to 0. * * Here's the expected transition table. * - * MUTATION APPLIED TO RESULTS IN + * MUTATION APPLIED TO RESULTS IN * * SetMutation Document(v3) Document(v3) * SetMutation DeletedDocument(v3) Document(v0) @@ -112,25 +100,53 @@ NS_ASSUME_NONNULL_BEGIN * DeleteMutation DeletedDocument(v3) DeletedDocument(v0) * DeleteMutation nil DeletedDocument(v0) * - * Note that FSTTransformMutations don't create FSTDocuments (in the case of being applied to an + * For acknowledged mutations, we use the updateTime of the WriteResponse as the resulting version + * for Set, Patch, and Transform mutations. As deletes have no explicit update time, we use the + * commitTime of the WriteResponse for acknowledged deletes. + * + * If a mutation is acknowledged by the backend but fails the precondition check locally, we + * return an `FSTUnknownDocument` and rely on Watch to send us the updated version. + * + * Note that FSTTransformMutations don't create Documents (in the case of being applied to an * FSTDeletedDocument), even though they would on the backend. This is because the client always - * combines the FSTTransformMutation with a FSTSetMutation or FSTPatchMutation and we only want to + * combines the FSTTransformMutations with a FSTSetMutation or FSTPatchMutation and we only want to * apply the transform if the prior mutation resulted in an FSTDocument (always true for an * FSTSetMutation, but not necessarily for an FSTPatchMutation). */ -- (nullable FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc - mutationResult:(FSTMutationResult *)mutationResult; +@interface FSTMutation : NSObject + +- (id)init NS_UNAVAILABLE; + +- (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key + precondition:(firebase::firestore::model::Precondition)precondition + NS_DESIGNATED_INITIALIZER; + +/** + * Applies this mutation to the given FSTMaybeDocument for the purposes of computing a new remote + * document. If the input document doesn't match the expected state (e.g. it is nil or outdated), + * an `FSTUnknownDocument` can be returned. + * + * @param maybeDoc The document to mutate. The input document can be nil if the client has no + * knowledge of the pre-mutation state of the document. + * @param mutationResult The result of applying the mutation from the backend. + * @return The mutated document. The returned document may be an FSTUnknownDocument if the mutation + * could not be applied to the locally cached base document. + */ +- (FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc + mutationResult:(FSTMutationResult *)mutationResult; /** - * Applies this mutation to the given MaybeDocument for the purposes of computing the new local view - * of a document. Both the input and returned documents can be null. + * Applies this mutation to the given FSTMaybeDocument for the purposes of computing the new local + * view of a document. Both the input and returned documents can be nil. * - * @param maybeDoc The current state of the document to mutate. The input document should be nil if - * it does not currently exist. - * @param baseDoc The state of the document prior to this mutation batch. The input document should - * be nil if it the document did not exist. + * @param maybeDoc The document to mutate. The input document can be nil if the client has no + * knowledge of the pre-mutation state of the document. + * @param baseDoc The state of the document prior to this mutation batch. The input document can + * be nil if the client has no knowledge of the pre-mutation state of the document. * @param localWriteTime A timestamp indicating the local write time of the batch this mutation is * a part of. + * @return The mutated document. The returned document may be nil, but only if maybeDoc was nil + * and the mutation would not create a new document. */ - (nullable FSTMaybeDocument *)applyToLocalDocument:(nullable FSTMaybeDocument *)maybeDoc baseDocument:(nullable FSTMaybeDocument *)baseDoc diff --git a/Firestore/Source/Model/FSTMutation.mm b/Firestore/Source/Model/FSTMutation.mm index a5b925278cf..fb74a828450 100644 --- a/Firestore/Source/Model/FSTMutation.mm +++ b/Firestore/Source/Model/FSTMutation.mm @@ -84,8 +84,8 @@ - (instancetype)initWithKey:(DocumentKey)key precondition:(Precondition)precondi return self; } -- (nullable FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc - mutationResult:(FSTMutationResult *)mutationResult { +- (FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc + mutationResult:(FSTMutationResult *)mutationResult { @throw FSTAbstractMethodException(); // NOLINT } @@ -103,6 +103,20 @@ - (nullable FSTMaybeDocument *)applyToLocalDocument:(nullable FSTMaybeDocument * return _precondition; } +- (void)verifyKeyMatches:(nullable FSTMaybeDocument *)maybeDoc { + if (maybeDoc) { + HARD_ASSERT(maybeDoc.key == self.key, "Can only set a document with the same key"); + } +} + +/** + * Returns the version from the given document for use as the result of a mutation. Mutations are + * defined to return the version of the base document only if it is an existing document. Deleted + * and unknown documents have a post-mutation version of {@code SnapshotVersion::None()}. + */ +- (const SnapshotVersion &)postMutationVersionForDocument:(FSTMaybeDocument *)maybeDoc { + return [maybeDoc isKindOfClass:[FSTDocument class]] ? maybeDoc.version : SnapshotVersion::None(); +} @end #pragma mark - FSTSetMutation @@ -144,56 +158,32 @@ - (NSUInteger)hash { - (nullable FSTMaybeDocument *)applyToLocalDocument:(nullable FSTMaybeDocument *)maybeDoc baseDocument:(nullable FSTMaybeDocument *)baseDoc localWriteTime:(FIRTimestamp *)localWriteTime { + [self verifyKeyMatches:maybeDoc]; + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } - if (!maybeDoc || [maybeDoc isMemberOfClass:[FSTDeletedDocument class]]) { - // If the document didn't exist before, create it. - return [FSTDocument documentWithData:self.value - key:self.key - version:SnapshotVersion::None() - hasLocalMutations:YES]; - } - - HARD_ASSERT([maybeDoc isMemberOfClass:[FSTDocument class]], "Unknown MaybeDocument type %s", - [maybeDoc class]); - FSTDocument *doc = (FSTDocument *)maybeDoc; - - HARD_ASSERT(doc.key == self.key, "Can only set a document with the same key"); + SnapshotVersion version = [self postMutationVersionForDocument:maybeDoc]; return [FSTDocument documentWithData:self.value - key:doc.key - version:doc.version - hasLocalMutations:YES]; + key:self.key + version:version + state:FSTDocumentStateLocalMutations]; } -- (nullable FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc - mutationResult:(FSTMutationResult *)mutationResult { - if (mutationResult) { - HARD_ASSERT(!mutationResult.transformResults, "Transform results received by FSTSetMutation."); - } +- (FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc + mutationResult:(FSTMutationResult *)mutationResult { + [self verifyKeyMatches:maybeDoc]; - if (!self.precondition.IsValidFor(maybeDoc)) { - return maybeDoc; - } + HARD_ASSERT(!mutationResult.transformResults, "Transform results received by FSTSetMutation."); - if (!maybeDoc || [maybeDoc isMemberOfClass:[FSTDeletedDocument class]]) { - // If the document didn't exist before, create it. - return [FSTDocument documentWithData:self.value - key:self.key - version:SnapshotVersion::None() - hasLocalMutations:NO]; - } + // Unlike applyToLocalView, if we're applying a mutation to a remote document the server has + // accepted the mutation so the precondition must have held. - HARD_ASSERT([maybeDoc isMemberOfClass:[FSTDocument class]], "Unknown MaybeDocument type %s", - [maybeDoc class]); - FSTDocument *doc = (FSTDocument *)maybeDoc; - - HARD_ASSERT(doc.key == self.key, "Can only set a document with the same key"); return [FSTDocument documentWithData:self.value - key:doc.key - version:doc.version - hasLocalMutations:NO]; + key:self.key + version:mutationResult.version + state:FSTDocumentStateCommittedMutations]; } @end @@ -243,64 +233,57 @@ - (NSString *)description { self.value, self.precondition.description()]; } +/** + * Patches the data of document if available or creates a new document. Note that this does not + * check whether or not the precondition of this patch holds. + */ +- (FSTObjectValue *)patchDocument:(nullable FSTMaybeDocument *)maybeDoc { + FSTObjectValue *data; + if ([maybeDoc isKindOfClass:[FSTDocument class]]) { + data = ((FSTDocument *)maybeDoc).data; + } else { + data = [FSTObjectValue objectValue]; + } + return [self patchObjectValue:data]; +} + - (nullable FSTMaybeDocument *)applyToLocalDocument:(nullable FSTMaybeDocument *)maybeDoc baseDocument:(nullable FSTMaybeDocument *)baseDoc localWriteTime:(FIRTimestamp *)localWriteTime { + [self verifyKeyMatches:maybeDoc]; + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } - if (!maybeDoc || [maybeDoc isMemberOfClass:[FSTDeletedDocument class]]) { - // Precondition applied, so create the document if necessary - const DocumentKey &key = maybeDoc ? maybeDoc.key : self.key; - SnapshotVersion version = maybeDoc ? maybeDoc.version : SnapshotVersion::None(); - maybeDoc = [FSTDocument documentWithData:[FSTObjectValue objectValue] - key:key - version:std::move(version) - hasLocalMutations:YES]; - } - - HARD_ASSERT([maybeDoc isMemberOfClass:[FSTDocument class]], "Unknown MaybeDocument type %s", - [maybeDoc class]); - FSTDocument *doc = (FSTDocument *)maybeDoc; - - HARD_ASSERT(doc.key == self.key, "Can only patch a document with the same key"); + FSTObjectValue *newData = [self patchDocument:maybeDoc]; + SnapshotVersion version = [self postMutationVersionForDocument:maybeDoc]; - FSTObjectValue *newData = [self patchObjectValue:doc.data]; - return - [FSTDocument documentWithData:newData key:doc.key version:doc.version hasLocalMutations:YES]; + return [FSTDocument documentWithData:newData + key:self.key + version:version + state:FSTDocumentStateLocalMutations]; } -- (nullable FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc - mutationResult:(FSTMutationResult *)mutationResult { +- (FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc + mutationResult:(FSTMutationResult *)mutationResult { + [self verifyKeyMatches:maybeDoc]; + HARD_ASSERT(!mutationResult.transformResults, "Transform results received by FSTPatchMutation."); if (!self.precondition.IsValidFor(maybeDoc)) { - return maybeDoc; + // Since the mutation was not rejected, we know that the precondition matched on the backend. + // We therefore must not have the expected version of the document in our cache and return a + // FSTUnknownDocument with the known updateTime. + return [FSTUnknownDocument documentWithKey:self.key version:mutationResult.version]; } - BOOL hasLocalMutations = (mutationResult == nil); - if (!maybeDoc || [maybeDoc isMemberOfClass:[FSTDeletedDocument class]]) { - // Precondition applied, so create the document if necessary - const DocumentKey &key = maybeDoc ? maybeDoc.key : self.key; - SnapshotVersion version = maybeDoc ? maybeDoc.version : SnapshotVersion::None(); - maybeDoc = [FSTDocument documentWithData:[FSTObjectValue objectValue] - key:key - version:std::move(version) - hasLocalMutations:hasLocalMutations]; - } + FSTObjectValue *newData = [self patchDocument:maybeDoc]; - HARD_ASSERT([maybeDoc isMemberOfClass:[FSTDocument class]], "Unknown MaybeDocument type %s", - [maybeDoc class]); - FSTDocument *doc = (FSTDocument *)maybeDoc; - - HARD_ASSERT(doc.key == self.key, "Can only patch a document with the same key"); - - FSTObjectValue *newData = [self patchObjectValue:doc.data]; return [FSTDocument documentWithData:newData - key:doc.key - version:doc.version - hasLocalMutations:hasLocalMutations]; + key:self.key + version:mutationResult.version + state:FSTDocumentStateCommittedMutations]; } - (FSTObjectValue *)patchObjectValue:(FSTObjectValue *)objectValue { @@ -375,6 +358,8 @@ - (NSString *)description { - (nullable FSTMaybeDocument *)applyToLocalDocument:(nullable FSTMaybeDocument *)maybeDoc baseDocument:(nullable FSTMaybeDocument *)baseDoc localWriteTime:(FIRTimestamp *)localWriteTime { + [self verifyKeyMatches:maybeDoc]; + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } @@ -385,22 +370,28 @@ - (nullable FSTMaybeDocument *)applyToLocalDocument:(nullable FSTMaybeDocument * [maybeDoc class]); FSTDocument *doc = (FSTDocument *)maybeDoc; - HARD_ASSERT(doc.key == self.key, "Can only transform a document with the same key"); - NSArray *transformResults = [self localTransformResultsWithBaseDocument:baseDoc writeTime:localWriteTime]; FSTObjectValue *newData = [self transformObject:doc.data transformResults:transformResults]; - return - [FSTDocument documentWithData:newData key:doc.key version:doc.version hasLocalMutations:YES]; + + return [FSTDocument documentWithData:newData + key:doc.key + version:doc.version + state:FSTDocumentStateLocalMutations]; } -- (nullable FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc - mutationResult:(FSTMutationResult *)mutationResult { +- (FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc + mutationResult:(FSTMutationResult *)mutationResult { + [self verifyKeyMatches:maybeDoc]; + HARD_ASSERT(mutationResult.transformResults, "Transform results missing for FSTTransformMutation."); if (!self.precondition.IsValidFor(maybeDoc)) { - return maybeDoc; + // Since the mutation was not rejected, we know that the precondition matched on the backend. + // We therefore must not have the expected version of the document in our cache and return an + // FSTUnknownDocument with the known updateTime. + return [FSTUnknownDocument documentWithKey:self.key version:mutationResult.version]; } // We only support transforms with precondition exists, so we can only apply it to an existing @@ -408,16 +399,16 @@ - (nullable FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument HARD_ASSERT([maybeDoc isMemberOfClass:[FSTDocument class]], "Unknown MaybeDocument type %s", [maybeDoc class]); FSTDocument *doc = (FSTDocument *)maybeDoc; - - HARD_ASSERT(doc.key == self.key, "Can only transform a document with the same key"); - NSArray *transformResults = [self serverTransformResultsWithBaseDocument:maybeDoc serverTransformResults:mutationResult.transformResults]; FSTObjectValue *newData = [self transformObject:doc.data transformResults:transformResults]; - return - [FSTDocument documentWithData:newData key:doc.key version:doc.version hasLocalMutations:NO]; + + return [FSTDocument documentWithData:newData + key:self.key + version:mutationResult.version + state:FSTDocumentStateCommittedMutations]; } /** @@ -521,33 +512,34 @@ - (NSString *)description { - (nullable FSTMaybeDocument *)applyToLocalDocument:(nullable FSTMaybeDocument *)maybeDoc baseDocument:(nullable FSTMaybeDocument *)baseDoc localWriteTime:(FIRTimestamp *)localWriteTime { + [self verifyKeyMatches:maybeDoc]; + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } - if (maybeDoc) { - HARD_ASSERT(maybeDoc.key == self.key, "Can only delete a document with the same key"); - } - - return [FSTDeletedDocument documentWithKey:self.key version:SnapshotVersion::None()]; + return [FSTDeletedDocument documentWithKey:self.key + version:SnapshotVersion::None() + hasCommittedMutations:NO]; } -- (nullable FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc - mutationResult:(FSTMutationResult *)mutationResult { +- (FSTMaybeDocument *)applyToRemoteDocument:(nullable FSTMaybeDocument *)maybeDoc + mutationResult:(FSTMutationResult *)mutationResult { + [self verifyKeyMatches:maybeDoc]; + if (mutationResult) { HARD_ASSERT(!mutationResult.transformResults, "Transform results received by FSTDeleteMutation."); } - if (!self.precondition.IsValidFor(maybeDoc)) { - return maybeDoc; - } - - if (maybeDoc) { - HARD_ASSERT(maybeDoc.key == self.key, "Can only delete a document with the same key"); - } + // Unlike applyToLocalView, if we're applying a mutation to a remote document the server has + // accepted the mutation so the precondition must have held. - return [FSTDeletedDocument documentWithKey:self.key version:SnapshotVersion::None()]; + // We store the deleted document at the commit version of the delete. Any document version + // that the server sends us before the delete was applied is discarded + return [FSTDeletedDocument documentWithKey:self.key + version:mutationResult.version + hasCommittedMutations:YES]; } @end diff --git a/Firestore/Source/Remote/FSTRemoteEvent.mm b/Firestore/Source/Remote/FSTRemoteEvent.mm index ee674b372b5..3b64fabb3f0 100644 --- a/Firestore/Source/Remote/FSTRemoteEvent.mm +++ b/Firestore/Source/Remote/FSTRemoteEvent.mm @@ -427,10 +427,11 @@ - (void)handleExistenceFilter:(FSTExistenceFilterWatchChange *)existenceFilter { // document there might be another query that will raise this document as part of a snapshot // until it is resolved, essentially exposing inconsistency between queries. FSTDocumentKey *key = [FSTDocumentKey keyWithPath:query.path]; - [self - removeDocument:[FSTDeletedDocument documentWithKey:key version:SnapshotVersion::None()] - withKey:key - fromTarget:targetID]; + [self removeDocument:[FSTDeletedDocument documentWithKey:key + version:SnapshotVersion::None() + hasCommittedMutations:NO] + withKey:key + fromTarget:targetID]; } else { HARD_ASSERT(expectedCount == 1, "Single document existence filter with count: %s", expectedCount); @@ -575,7 +576,9 @@ - (FSTRemoteEvent *)remoteEventAtSnapshotVersion:(const SnapshotVersion &)snapsh FSTDocumentKey *key = [FSTDocumentKey keyWithPath:queryData.query.path]; if (_pendingDocumentUpdates.find(key) == _pendingDocumentUpdates.end() && ![self containsDocument:key inTarget:targetID]) { - [self removeDocument:[FSTDeletedDocument documentWithKey:key version:snapshotVersion] + [self removeDocument:[FSTDeletedDocument documentWithKey:key + version:snapshotVersion + hasCommittedMutations:NO] withKey:key fromTarget:targetID]; } diff --git a/Firestore/Source/Remote/FSTSerializerBeta.mm b/Firestore/Source/Remote/FSTSerializerBeta.mm index 05cd80ba220..f561f03fad2 100644 --- a/Firestore/Source/Remote/FSTSerializerBeta.mm +++ b/Firestore/Source/Remote/FSTSerializerBeta.mm @@ -439,7 +439,7 @@ - (FSTDocument *)decodedFoundDocument:(GCFSBatchGetDocumentsResponse *)response HARD_ASSERT(version != SnapshotVersion::None(), "Got a document response with no snapshot version"); - return [FSTDocument documentWithData:value key:key version:version hasLocalMutations:NO]; + return [FSTDocument documentWithData:value key:key version:version state:FSTDocumentStateSynced]; } - (FSTDeletedDocument *)decodedDeletedDocument:(GCFSBatchGetDocumentsResponse *)response { @@ -448,7 +448,7 @@ - (FSTDeletedDocument *)decodedDeletedDocument:(GCFSBatchGetDocumentsResponse *) SnapshotVersion version = [self decodedVersion:response.readTime]; HARD_ASSERT(version != SnapshotVersion::None(), "Got a no document response with no snapshot version"); - return [FSTDeletedDocument documentWithKey:key version:version]; + return [FSTDeletedDocument documentWithKey:key version:version hasCommittedMutations:NO]; } #pragma mark - FSTMutation => GCFSWrite proto @@ -1146,7 +1146,7 @@ - (FSTDocumentWatchChange *)decodedDocumentChange:(GCFSDocumentChange *)change { SnapshotVersion version = [self decodedVersion:change.document.updateTime]; HARD_ASSERT(version != SnapshotVersion::None(), "Got a document change with no snapshot version"); FSTMaybeDocument *document = - [FSTDocument documentWithData:value key:key version:version hasLocalMutations:NO]; + [FSTDocument documentWithData:value key:key version:version state:FSTDocumentStateSynced]; NSArray *updatedTargetIds = [self decodedIntegerArray:change.targetIdsArray]; NSArray *removedTargetIds = [self decodedIntegerArray:change.removedTargetIdsArray]; @@ -1161,7 +1161,8 @@ - (FSTDocumentWatchChange *)decodedDocumentDelete:(GCFSDocumentDelete *)change { const DocumentKey key = [self decodedDocumentKey:change.document]; // Note that version might be unset in which case we use SnapshotVersion::None() SnapshotVersion version = [self decodedVersion:change.readTime]; - FSTMaybeDocument *document = [FSTDeletedDocument documentWithKey:key version:version]; + FSTMaybeDocument *document = + [FSTDeletedDocument documentWithKey:key version:version hasCommittedMutations:NO]; NSArray *removedTargetIds = [self decodedIntegerArray:change.removedTargetIdsArray]; diff --git a/Firestore/core/src/firebase/firestore/local/leveldb_key.cc b/Firestore/core/src/firebase/firestore/local/leveldb_key.cc index 284be906fe0..d0875dc65d5 100644 --- a/Firestore/core/src/firebase/firestore/local/leveldb_key.cc +++ b/Firestore/core/src/firebase/firestore/local/leveldb_key.cc @@ -656,7 +656,7 @@ std::string LevelDbMutationQueueKey::Key(absl::string_view user_id) { return writer.result(); } -bool LevelDbMutationQueueKey::Decode(leveldb::Slice key) { +bool LevelDbMutationQueueKey::Decode(absl::string_view key) { Reader reader{key}; reader.ReadTableNameMatching(kMutationQueuesTable); user_id_ = reader.ReadUserId(); diff --git a/Firestore/core/src/firebase/firestore/local/leveldb_key.h b/Firestore/core/src/firebase/firestore/local/leveldb_key.h index a29b61e42c4..4bbf738e5ed 100644 --- a/Firestore/core/src/firebase/firestore/local/leveldb_key.h +++ b/Firestore/core/src/firebase/firestore/local/leveldb_key.h @@ -121,6 +121,7 @@ class LevelDbMutationKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ + ABSL_MUST_USE_RESULT bool Decode(absl::string_view key); /** The user that owns the mutation batches. */ @@ -184,6 +185,7 @@ class LevelDbDocumentMutationKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ + ABSL_MUST_USE_RESULT bool Decode(absl::string_view key); /** The user that owns the mutation batches. */ @@ -235,7 +237,8 @@ class LevelDbMutationQueueKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ - bool Decode(leveldb::Slice key); + ABSL_MUST_USE_RESULT + bool Decode(absl::string_view key); const std::string& user_id() const { return user_id_; @@ -259,6 +262,7 @@ class LevelDbTargetGlobalKey { * Decodes the contents of a target global key, essentially just verifying * that the key has the correct table name. */ + ABSL_MUST_USE_RESULT bool Decode(leveldb::Slice key); }; @@ -281,6 +285,7 @@ class LevelDbTargetKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ + ABSL_MUST_USE_RESULT bool Decode(leveldb::Slice key); model::TargetId target_id() { @@ -322,6 +327,7 @@ class LevelDbQueryTargetKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ + ABSL_MUST_USE_RESULT bool Decode(absl::string_view key); /** The canonical_id derived from the query. */ @@ -370,6 +376,7 @@ class LevelDbTargetDocumentKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ + ABSL_MUST_USE_RESULT bool Decode(absl::string_view key); /** The target_id identifying a target. */ @@ -436,6 +443,7 @@ class LevelDbDocumentTargetKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ + ABSL_MUST_USE_RESULT bool Decode(absl::string_view key); /** The target_id identifying a target. */ @@ -499,6 +507,7 @@ class LevelDbRemoteDocumentKey { * returned, this instance is in an undefined state until the next call to * `Decode()`. */ + ABSL_MUST_USE_RESULT bool Decode(absl::string_view key); /** The path to the document, as encoded in the key. */ diff --git a/Firestore/core/src/firebase/firestore/local/leveldb_migrations.cc b/Firestore/core/src/firebase/firestore/local/leveldb_migrations.cc index 87ac08010d1..f3f786d2c03 100644 --- a/Firestore/core/src/firebase/firestore/local/leveldb_migrations.cc +++ b/Firestore/core/src/firebase/firestore/local/leveldb_migrations.cc @@ -19,10 +19,12 @@ #include #include +#include "Firestore/Protos/nanopb/firestore/local/mutation.nanopb.h" #include "Firestore/Protos/nanopb/firestore/local/target.nanopb.h" #include "Firestore/core/src/firebase/firestore/local/leveldb_key.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" #include "Firestore/core/src/firebase/firestore/model/types.h" +#include "Firestore/core/src/firebase/firestore/nanopb/reader.h" #include "Firestore/core/src/firebase/firestore/nanopb/writer.h" #include "absl/strings/match.h" @@ -57,8 +59,9 @@ namespace { * https://github.com/firebase/firebase-ios-sdk/issues/1548. * * Migration 4 ensures that every document in the remote document cache * has a sentinel row with a sequence number. + * * Migration 5 drops held write acks. */ -const LevelDbMigrations::SchemaVersion kSchemaVersion = 4; +const LevelDbMigrations::SchemaVersion kSchemaVersion = 5; /** * Save the given version number as the current version of the schema of the @@ -115,6 +118,72 @@ void ClearQueryCache(leveldb::DB* db) { transaction.Commit(); } +/** + * Removes document associations for the given user's mutation queue for + * any mutation with a `batch_id` less than or equal to + * `last_acknowledged_batch_id`. + */ +void RemoveMutationDocuments(LevelDbTransaction* transaction, + absl::string_view user_id, + int32_t last_acknowledged_batch_id) { + LevelDbDocumentMutationKey doc_key; + std::string prefix = LevelDbDocumentMutationKey::KeyPrefix(user_id); + + auto it = transaction->NewIterator(); + it->Seek(prefix); + for (; it->Valid() && absl::StartsWith(it->key(), prefix); it->Next()) { + HARD_ASSERT(doc_key.Decode(it->key()), + "Failed to decode document mutation key"); + if (doc_key.batch_id() <= last_acknowledged_batch_id) { + transaction->Delete(it->key()); + } + } +} + +/** + * Removes mutation batches for the given user with a `batch_id` less than + * or equal to `last_acknowledged_batch_id` + */ +void RemoveMutationBatches(LevelDbTransaction* transaction, + absl::string_view user_id, + int32_t last_acknowledged_batch_id) { + std::string mutations_key = LevelDbMutationKey::KeyPrefix(user_id); + std::string last_key = + LevelDbMutationKey::Key(user_id, last_acknowledged_batch_id); + auto it = transaction->NewIterator(); + it->Seek(mutations_key); + for (; it->Valid() && it->key() <= last_key; it->Next()) { + transaction->Delete(it->key()); + } +} + +/** Migration 5. */ +void RemoveAcknowledgedMutations(leveldb::DB* db) { + LevelDbTransaction transaction(db, "remove acknowledged mutations"); + std::string mutation_queue_start = LevelDbMutationQueueKey::KeyPrefix(); + + LevelDbMutationQueueKey key; + + auto it = transaction.NewIterator(); + it->Seek(mutation_queue_start); + for (; it->Valid() && absl::StartsWith(it->key(), mutation_queue_start); + it->Next()) { + HARD_ASSERT(key.Decode(it->key()), "Failed to decode mutation queue key"); + firestore_client_MutationQueue mutation_queue{}; + Reader reader = Reader::Wrap(it->value()); + reader.ReadNanopbMessage(firestore_client_MutationQueue_fields, + &mutation_queue); + HARD_ASSERT(reader.status().ok(), "Failed to deserialize MutationQueue"); + RemoveMutationBatches(&transaction, key.user_id(), + mutation_queue.last_acknowledged_batch_id); + RemoveMutationDocuments(&transaction, key.user_id(), + mutation_queue.last_acknowledged_batch_id); + } + + SaveVersion(5, &transaction); + transaction.Commit(); +} + /** * Reads the highest sequence number from the target global row. */ @@ -205,6 +274,10 @@ void LevelDbMigrations::RunMigrations(leveldb::DB* db, if (from_version < 4 && to_version >= 4) { EnsureSentinelRows(db); } + + if (from_version < 5 && to_version >= 5) { + RemoveAcknowledgedMutations(db); + } } } // namespace local diff --git a/Firestore/core/src/firebase/firestore/model/precondition.cc b/Firestore/core/src/firebase/firestore/model/precondition.cc index 61024db9cc0..4d22eaa5724 100644 --- a/Firestore/core/src/firebase/firestore/model/precondition.cc +++ b/Firestore/core/src/firebase/firestore/model/precondition.cc @@ -52,13 +52,8 @@ bool Precondition::IsValidFor(const MaybeDocument* maybe_doc) const { maybe_doc->type() == MaybeDocument::Type::Document && maybe_doc->version() == update_time_; case Type::Exists: - if (exists_) { - return maybe_doc != nullptr && - maybe_doc->type() == MaybeDocument::Type::Document; - } else { - return maybe_doc == nullptr || - maybe_doc->type() == MaybeDocument::Type::NoDocument; - } + return (exists_ == (maybe_doc != nullptr && + maybe_doc->type() == MaybeDocument::Type::Document)); case Type::None: return true; } From 4e19ebe40a85e0ae4d4c94f5b5b967a0b971720f Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Thu, 1 Nov 2018 10:32:05 -0700 Subject: [PATCH 053/102] Held Write Acks Changelog (#2037) To be submitted when main PR goes in --- Firestore/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Firestore/CHANGELOG.md b/Firestore/CHANGELOG.md index 6b13477c5ba..1654e89acb2 100644 --- a/Firestore/CHANGELOG.md +++ b/Firestore/CHANGELOG.md @@ -1,5 +1,12 @@ # Unreleased +- [changed] Changed how the SDK handles locally-updated documents while syncing + those updates with Cloud Firestore servers. This can lead to slight behavior + changes and may affect the `SnapshotMetadata.hasPendingWrites` metadata flag. +- [changed] Eliminated superfluous update events for locally cached documents + that are known to lag behind the server version. Instead, the SDK buffers + these events until the client has caught up with the server. + # v0.14.0 - [fixed] Fixed compilation in C99 and C++11 modes without GNU extensions. From b9cc615262736c29dd1ea03d08078b6dd50406c7 Mon Sep 17 00:00:00 2001 From: christibbs <43829046+christibbs@users.noreply.github.com> Date: Thu, 1 Nov 2018 11:10:40 -0700 Subject: [PATCH 054/102] Fix tablet layout for in-app messaging (#2032) * Rename fine-tuning methods to reflect size class rather than orientation * Modify existing constraints to de-portrait tablet layout, need a card width for tablet now * Further constraint tinkering, add identifiers for better auto layout debugging * More constraints for "landscape" appearance in tablet. Looks good for every case except Thin Image, which blows up the height of the message card * Fix fine tune layout methods to correctly fine tune for compact height and width * Update layout constraint identifiers to match titles in document outline for easier debugging * Revert superfluous method name changes for layout fine tuning methods --- .../Modal/FIDModalViewController.m | 11 +- ...IRInAppMessageDisplayStoryboard.storyboard | 176 ++++++++---------- 2 files changed, 87 insertions(+), 100 deletions(-) diff --git a/Firebase/InAppMessagingDisplay/Modal/FIDModalViewController.m b/Firebase/InAppMessagingDisplay/Modal/FIDModalViewController.m index 30427f1a7a8..d8d0e9f2bcf 100644 --- a/Firebase/InAppMessagingDisplay/Modal/FIDModalViewController.m +++ b/Firebase/InAppMessagingDisplay/Modal/FIDModalViewController.m @@ -405,14 +405,15 @@ - (void)layoutFineTuneInLandscapeMode { - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; - if (self.buttonBottomToContainerBottomInPortraitMode.active) { - FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID300009", - @"Modal view rendered in portrait mode"); - [self layoutFineTuneInPortraitMode]; - } else { + if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular || + self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) { FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID300010", @"Modal view rendered in landscape mode"); [self layoutFineTuneInLandscapeMode]; + } else { + FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID300009", + @"Modal view rendered in portrait mode"); + [self layoutFineTuneInPortraitMode]; } // always scroll to the top in case the body area is scrollable diff --git a/Firebase/InAppMessagingDisplay/Resources/FIRInAppMessageDisplayStoryboard.storyboard b/Firebase/InAppMessagingDisplay/Resources/FIRInAppMessageDisplayStoryboard.storyboard index dfe971e6881..43d591b750f 100644 --- a/Firebase/InAppMessagingDisplay/Resources/FIRInAppMessageDisplayStoryboard.storyboard +++ b/Firebase/InAppMessagingDisplay/Resources/FIRInAppMessageDisplayStoryboard.storyboard @@ -1,13 +1,11 @@ - - + + - - - + @@ -20,7 +18,7 @@ - + @@ -61,7 +59,7 @@ - + @@ -75,14 +73,14 @@ - + - + @@ -200,50 +198,46 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -254,7 +248,6 @@ - @@ -269,49 +262,50 @@ - - - - + - - - + + + + + + + + + + + - - - - - - - - + + + +