appium-webdriveragent 4.15.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## [5.0.0](https://github.com/appium/WebDriverAgent/compare/v4.15.1...v5.0.0) (2023-05-14)
2
+
3
+
4
+ ### ⚠ BREAKING CHANGES
5
+
6
+ * The minimum supported xCode/iOS version is now 13/15.0
7
+
8
+ ### Code Refactoring
9
+
10
+ * Drop workarounds for legacy iOS versions ([#696](https://github.com/appium/WebDriverAgent/issues/696)) ([bb562b9](https://github.com/appium/WebDriverAgent/commit/bb562b96db6aad476970ef7bd352cb8df4f1e6c2))
11
+
12
+ ## [4.15.1](https://github.com/appium/WebDriverAgent/compare/v4.15.0...v4.15.1) (2023-05-06)
13
+
14
+
15
+ ### Performance Improvements
16
+
17
+ * tune webDriverAgentUrl case by skiping xcodebuild stuff ([#691](https://github.com/appium/WebDriverAgent/issues/691)) ([d8f1457](https://github.com/appium/WebDriverAgent/commit/d8f1457b591b2dd00040f8336c1a7a728af871d2))
18
+
1
19
  ## [4.15.0](https://github.com/appium/WebDriverAgent/compare/v4.14.0...v4.15.0) (2023-05-04)
2
20
 
3
21
 
@@ -36,26 +36,15 @@ NSString *const FB_SAFARI_APP_NAME = @"Safari";
36
36
  }];
37
37
  NSPredicate *dstViewContainPredicate1 = [NSPredicate predicateWithFormat:@"elementType == %lu", XCUIElementTypeTextView];
38
38
  NSPredicate *dstViewContainPredicate2 = [NSPredicate predicateWithFormat:@"elementType == %lu", XCUIElementTypeButton];
39
- XCUIElement *candidate = nil;
40
- if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0")) {
41
- // Find the first XCUIElementTypeOther which is the grandchild of the web view
42
- // and is horizontally aligned to the center of the screen
43
- candidate = [[[[[[scrollView descendantsMatchingType:XCUIElementTypeAny]
44
- matchingIdentifier:@"WebView"]
45
- descendantsMatchingType:XCUIElementTypeOther]
46
- matchingPredicate:dstViewMatchPredicate]
47
- containingPredicate:dstViewContainPredicate1]
48
- containingPredicate:dstViewContainPredicate2].allElementsBoundByIndex.firstObject;
49
- } else {
50
- NSPredicate *webViewPredicate = [NSPredicate predicateWithFormat:@"elementType == %lu", XCUIElementTypeWebView];
51
- // Find the first XCUIElementTypeOther which is the descendant of the scroll view
52
- // and is horizontally aligned to the center of the screen
53
- candidate = [[[[[scrollView.fb_query containingPredicate:webViewPredicate]
54
- descendantsMatchingType:XCUIElementTypeOther]
55
- matchingPredicate:dstViewMatchPredicate]
56
- containingPredicate:dstViewContainPredicate1]
57
- containingPredicate:dstViewContainPredicate2].allElementsBoundByIndex.firstObject;
58
- }
39
+ // Find the first XCUIElementTypeOther which is the grandchild of the web view
40
+ // and is horizontally aligned to the center of the screen
41
+ XCUIElement *candidate = [[[[[[scrollView descendantsMatchingType:XCUIElementTypeAny]
42
+ matchingIdentifier:@"WebView"]
43
+ descendantsMatchingType:XCUIElementTypeOther]
44
+ matchingPredicate:dstViewMatchPredicate]
45
+ containingPredicate:dstViewContainPredicate1]
46
+ containingPredicate:dstViewContainPredicate2].allElementsBoundByIndex.firstObject;
47
+
59
48
  if (nil == candidate) {
60
49
  return nil;
61
50
  }
@@ -86,11 +86,7 @@ static bool fb_isLocked;
86
86
  [self pressButton:XCUIDeviceButtonHome];
87
87
  [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:FBHomeButtonCoolOffTime]];
88
88
  #if !TARGET_OS_TV
89
- if (SYSTEM_VERSION_LESS_THAN(@"10.0")) {
90
- [[FBApplication fb_activeApplication] swipeRight];
91
- } else {
92
- [self pressButton:XCUIDeviceButtonHome];
93
- }
89
+ [self pressButton:XCUIDeviceButtonHome];
94
90
  #else
95
91
  [self pressButton:XCUIDeviceButtonHome];
96
92
  #endif
@@ -9,52 +9,23 @@
9
9
 
10
10
  #import "XCUIElement+FBTap.h"
11
11
 
12
- #import "FBMacros.h"
13
- #import "XCUIApplication+FBTouchAction.h"
14
- #import "XCUIElement+FBUtilities.h"
15
-
16
12
 
17
13
  #if !TARGET_OS_TV
18
14
  @implementation XCUIElement (FBTap)
19
15
 
20
16
  - (BOOL)fb_tapWithError:(NSError **)error
21
17
  {
22
- if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"13.0")) {
23
- [self tap];
24
- return YES;
25
- }
26
-
27
- NSArray<NSDictionary<NSString *, id> *> *tapGesture =
28
- @[
29
- @{@"action": @"tap",
30
- @"options": @{@"element": self}
31
- }
32
- ];
33
- return [self.application fb_performAppiumTouchActions:tapGesture elementCache:nil error:error];
18
+ [self tap];
19
+ return YES;
34
20
  }
35
21
 
36
22
  - (BOOL)fb_tapCoordinate:(CGPoint)relativeCoordinate error:(NSError **)error
37
23
  {
38
- if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"13.0")) {
39
- // Coordinates calculation issues have been fixed
40
- // for different device orientations since Xcode 11
41
- XCUICoordinate *startCoordinate = [self coordinateWithNormalizedOffset:CGVectorMake(0, 0)];
42
- CGVector offset = CGVectorMake(relativeCoordinate.x, relativeCoordinate.y);
43
- XCUICoordinate *dstCoordinate = [startCoordinate coordinateWithOffset:offset];
44
- [dstCoordinate tap];
45
- return YES;
46
- }
47
-
48
- NSArray<NSDictionary<NSString *, id> *> *tapGesture =
49
- @[
50
- @{@"action": @"tap",
51
- @"options": @{@"element": self,
52
- @"x": @(relativeCoordinate.x),
53
- @"y": @(relativeCoordinate.y)
54
- }
55
- }
56
- ];
57
- return [self.application fb_performAppiumTouchActions:tapGesture elementCache:nil error:error];
24
+ XCUICoordinate *startCoordinate = [self coordinateWithNormalizedOffset:CGVectorMake(0, 0)];
25
+ CGVector offset = CGVectorMake(relativeCoordinate.x, relativeCoordinate.y);
26
+ XCUICoordinate *dstCoordinate = [startCoordinate coordinateWithOffset:offset];
27
+ [dstCoordinate tap];
28
+ return YES;
58
29
  }
59
30
 
60
31
  @end
@@ -423,10 +423,8 @@
423
423
  #endif
424
424
  }];
425
425
 
426
- if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0")) {
427
- // https://developer.apple.com/documentation/foundation/nsprocessinfothermalstate
428
- deviceInfo[@"thermalState"] = @(NSProcessInfo.processInfo.thermalState);
429
- }
426
+ // https://developer.apple.com/documentation/foundation/nsprocessinfothermalstate
427
+ deviceInfo[@"thermalState"] = @(NSProcessInfo.processInfo.thermalState);
430
428
 
431
429
  return FBResponseWithObject(deviceInfo);
432
430
  }
@@ -48,24 +48,8 @@
48
48
  // There is no need to recalculate anything for portrait orientation
49
49
  return hitPoint;
50
50
  }
51
- CGRect appFrame = self.application.frame;
52
- if (@available(iOS 13.0, *)) {
53
- // For Xcode11 it is always necessary to adjust the tap point coordinates
54
- return FBInvertPointForApplication(hitPoint, appFrame.size, interfaceOrientation);
55
- }
56
- NSArray<id<FBXCElementSnapshot>> *ancestors = [FBXCElementSnapshotWrapper ensureWrapped:snapshot].fb_ancestors;
57
- id<FBXCElementSnapshot> parentWindow = ancestors.count > 1 ? [ancestors objectAtIndex:ancestors.count - 2] : nil;
58
- CGRect parentWindowFrame = nil == parentWindow ? snapshot.frame : parentWindow.frame;
59
- if ((appFrame.size.height > appFrame.size.width && parentWindowFrame.size.height < parentWindowFrame.size.width) ||
60
- (appFrame.size.height < appFrame.size.width && parentWindowFrame.size.height > parentWindowFrame.size.width)) {
61
- /*
62
- This is the indication of the fact that transformation is broken and coordinates should be
63
- recalculated manually.
64
- However, upside-down case cannot be covered this way, which is not important for Appium
65
- */
66
- return FBInvertPointForApplication(hitPoint, appFrame.size, interfaceOrientation);
67
- }
68
- return hitPoint;
51
+ // For Xcode11+ it is always necessary to adjust the tap point coordinates
52
+ return FBInvertPointForApplication(hitPoint, self.application.frame.size, interfaceOrientation);
69
53
  }
70
54
 
71
55
  - (nullable NSValue *)hitpointWithElement:(nullable XCUIElement *)element positionOffset:(nullable NSValue *)positionOffset error:(NSError **)error
@@ -74,14 +58,12 @@
74
58
  if (nil == element) {
75
59
  // Only absolute offset is defined
76
60
  hitPoint = [positionOffset CGPointValue];
77
- if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
78
- /*
79
- Since iOS 10.0 XCTest has a bug when it always returns portrait coordinates for UI elements
80
- even if the device is not in portait mode. That is why we need to recalculate them manually
81
- based on the current orientation value
82
- */
83
- hitPoint = FBInvertPointForApplication(hitPoint, self.application.frame.size, self.application.interfaceOrientation);
84
- }
61
+ /*
62
+ Since iOS 10.0 XCTest has a bug when it always returns portrait coordinates for UI elements
63
+ even if the device is not in portait mode. That is why we need to recalculate them manually
64
+ based on the current orientation value
65
+ */
66
+ hitPoint = FBInvertPointForApplication(hitPoint, self.application.frame.size, self.application.interfaceOrientation);
85
67
  } else {
86
68
  // The offset relative to the element is defined
87
69
 
@@ -63,8 +63,7 @@
63
63
  }];
64
64
  XCUIElement *firstKey = [[app.keyboard descendantsMatchingType:XCUIElementTypeKey]
65
65
  matchingPredicate:keySearchPredicate].allElementsBoundByIndex.firstObject;
66
- return firstKey.exists
67
- && (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"13.0") ? firstKey.hittable : firstKey.fb_isVisible);
66
+ return firstKey.exists && firstKey.hittable;
68
67
  };
69
68
  NSString* errMessage = @"The on-screen keyboard must be present to send keys";
70
69
  if (timeout <= 0) {
@@ -22,17 +22,10 @@
22
22
 
23
23
  + (CGSize)statusBarSizeForApplication:(XCUIApplication *)application
24
24
  {
25
- XCUIApplication *app = application;
26
- BOOL expectVisibleBar = YES;
27
-
25
+ XCUIApplication *app = FBApplication.fb_systemApplication;
28
26
  // Since iOS 13 the status bar is no longer part of the application, it’s part of the SpringBoard
29
- if (@available(iOS 13.0, *)) {
30
- app = FBApplication.fb_systemApplication;
31
- expectVisibleBar = NO;
32
- }
33
-
34
27
  XCUIElement *mainStatusBar = app.statusBars.allElementsBoundByIndex.firstObject;
35
- if (!mainStatusBar || (expectVisibleBar && !mainStatusBar.fb_isVisible)) {
28
+ if (nil == mainStatusBar) {
36
29
  return CGSizeZero;
37
30
  }
38
31
  CGSize result = mainStatusBar.frame.size;
@@ -228,7 +228,6 @@ NSString *formatTimeInterval(NSTimeInterval interval) {
228
228
  compressionQuality:(CGFloat)compressionQuality
229
229
  error:(NSError **)error
230
230
  {
231
- // TODO: Use native accessors after we drop the support of Xcode 12.4 and below
232
231
  Class imageEncodingClass = NSClassFromString(@"XCTImageEncoding");
233
232
  if (nil == imageEncodingClass) {
234
233
  [[[FBErrorBuilder builder]
@@ -297,9 +297,7 @@ static NSString *const FB_KEY_ACTIONS = @"actions";
297
297
  }
298
298
  CGPoint recentPosition = self.previousItem.atPosition;
299
299
  CGPoint offsetRelativeToRecentPosition = (nil == x && nil == y) ? CGPointMake(0.0, 0.0) : CGPointMake(x.floatValue, y.floatValue);
300
- if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
301
- offsetRelativeToRecentPosition = FBInvertOffsetForOrientation(offsetRelativeToRecentPosition, self.application.interfaceOrientation);
302
- }
300
+ offsetRelativeToRecentPosition = FBInvertOffsetForOrientation(offsetRelativeToRecentPosition, self.application.interfaceOrientation);
303
301
  return [NSValue valueWithCGPoint:CGPointMake(recentPosition.x + offsetRelativeToRecentPosition.x, recentPosition.y + offsetRelativeToRecentPosition.y)];
304
302
  }
305
303
 
@@ -53,7 +53,7 @@ class WebDriverAgent {
53
53
  this.updatedWDABundleId = args.updatedWDABundleId;
54
54
  this.usePreinstalledWDA = args.usePreinstalledWDA;
55
55
  this.xctestApiClient = null;
56
- this.xcodebuild = this.usePreinstalledWDA ? null : new _xcodebuild.default(this.xcodeVersion, this.device, {
56
+ this.xcodebuild = this.canSkipXcodebuild ? null : new _xcodebuild.default(this.xcodeVersion, this.device, {
57
57
  platformVersion: this.platformVersion,
58
58
  platformName: this.platformName,
59
59
  iosSdkVersion: this.iosSdkVersion,
@@ -79,8 +79,11 @@ class WebDriverAgent {
79
79
  resultBundleVersion: args.resultBundleVersion
80
80
  }, this.log);
81
81
  }
82
+ get canSkipXcodebuild() {
83
+ return this.usePreinstalledWDA || this.args.webDriverAgentUrl;
84
+ }
82
85
  get bundleIdForXctest() {
83
- return `${this.updatedWDABundleId}.xctrunner` || _constants.WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;
86
+ return this.updatedWDABundleId ? `${this.updatedWDABundleId}.xctrunner` : _constants.WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;
84
87
  }
85
88
  setWDAPaths(bootstrapPath, agentPath) {
86
89
  this.bootstrapPath = bootstrapPath || _utils.BOOTSTRAP_PATH;
@@ -183,7 +186,7 @@ class WebDriverAgent {
183
186
  this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
184
187
  return;
185
188
  }
186
- if (this.usePreinstalledWDA) {
189
+ if (this.canSkipXcodebuild) {
187
190
  return;
188
191
  }
189
192
  try {
@@ -319,10 +322,12 @@ class WebDriverAgent {
319
322
  this.xctestApiClient.stop();
320
323
  this.xctestApiClient = null;
321
324
  }
322
- } else {
325
+ } else if (!this.args.webDriverAgentUrl) {
323
326
  this.log.info('Shutting down sub-processes');
324
327
  await this.xcodebuild.quit();
325
328
  await this.xcodebuild.reset();
329
+ } else {
330
+ this.log.debug('Do not stop xcodebuild nor XCTest session ' + 'since the WDA session is managed by outside this driver.');
326
331
  }
327
332
  if (this.jwproxy) {
328
333
  this.jwproxy.sessionId = null;
@@ -357,7 +362,7 @@ class WebDriverAgent {
357
362
  this.started = started;
358
363
  }
359
364
  async retrieveDerivedDataPath() {
360
- if (this.usePreinstalledWDA) {
365
+ if (this.canSkipXcodebuild) {
361
366
  return;
362
367
  }
363
368
  return await this.xcodebuild.retrieveDerivedDataPath();
@@ -399,4 +404,4 @@ class WebDriverAgent {
399
404
  exports.WebDriverAgent = WebDriverAgent;
400
405
  var _default = WebDriverAgent;
401
406
  exports.default = _default;
402
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl91cmwyIiwiX2JsdWViaXJkIiwiX2Jhc2VEcml2ZXIiLCJfc3VwcG9ydCIsIl9sb2dnZXIiLCJfbm9TZXNzaW9uUHJveHkiLCJfdXRpbHMiLCJfeGNvZGVidWlsZCIsIl9hc3luY0xvY2siLCJfdGVlbl9wcm9jZXNzIiwiX2NoZWNrRGVwZW5kZW5jaWVzIiwiX2NvbnN0YW50cyIsIl9hcHBpdW1Jb3NEZXZpY2UiLCJXREFfTEFVTkNIX1RJTUVPVVQiLCJXREFfQUdFTlRfUE9SVCIsIldEQV9DRl9CVU5ETEVfTkFNRSIsIlNIQVJFRF9SRVNPVVJDRVNfR1VBUkQiLCJBc3luY0xvY2siLCJXZWJEcml2ZXJBZ2VudCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiYXJncyIsImxvZyIsIl8iLCJjbG9uZSIsImRlZmF1bHRMb2dnZXIiLCJkZXZpY2UiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwiaG9zdCIsImlzUmVhbERldmljZSIsInJlYWxEZXZpY2UiLCJpZGIiLCJ3ZGFCdW5kbGVQYXRoIiwic2V0V0RBUGF0aHMiLCJib290c3RyYXBQYXRoIiwiYWdlbnRQYXRoIiwid2RhTG9jYWxQb3J0Iiwid2RhUmVtb3RlUG9ydCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJwcmVidWlsZFdEQSIsIndlYkRyaXZlckFnZW50VXJsIiwic3RhcnRlZCIsIndkYUNvbm5lY3Rpb25UaW1lb3V0IiwidXNlWGN0ZXN0cnVuRmlsZSIsInVzZVByZWJ1aWx0V0RBIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwidXNlUHJlaW5zdGFsbGVkV0RBIiwieGN0ZXN0QXBpQ2xpZW50IiwieGNvZGVidWlsZCIsIlhjb2RlQnVpbGQiLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwibGF1bmNoVGltZW91dCIsIndkYUxhdW5jaFRpbWVvdXQiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiYnVuZGxlSWRGb3JYY3Rlc3QiLCJXREFfUlVOTkVSX0JVTkRMRV9JRF9GT1JfWENURVNUIiwiQk9PVFNUUkFQX1BBVEgiLCJpbmZvIiwicGF0aCIsInJlc29sdmUiLCJjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMiLCJvYnNvbGV0ZVBpZHMiLCJnZXRQSURzTGlzdGVuaW5nT25Qb3J0IiwidXJsIiwicG9ydCIsImNtZExpbmUiLCJpbmNsdWRlcyIsInRvTG93ZXJDYXNlIiwidWRpZCIsImlzRW1wdHkiLCJkZWJ1ZyIsImxlbmd0aCIsImV4ZWMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJpc1J1bm5pbmciLCJnZXRTdGF0dXMiLCJiYXNlUGF0aCIsIm5vU2Vzc2lvblByb3h5IiwiTm9TZXNzaW9uUHJveHkiLCJzZXJ2ZXIiLCJob3N0bmFtZSIsImJhc2UiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImVyciIsImhyZWYiLCJ1bmluc3RhbGwiLCJidW5kbGVJZHMiLCJnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIiwiYnVuZGxlSWQiLCJyZW1vdmVBcHAiLCJfY2xlYW51cFByb2plY3RJZkZyZXNoIiwiaG9tZUZvbGRlciIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwiY3VycmVudFVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiaXNJbnRlZ2VyIiwidGltZXN0YW1wUGF0aCIsIldEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRIIiwiZGlkVGltZXN0YW1wRXhpc3QiLCJmcyIsImV4aXN0cyIsImFjY2VzcyIsIldfT0siLCJpZ24iLCJyZWNlbnRVcGdyYWRlVGltZXN0YW1wIiwicGFyc2VJbnQiLCJyZWFkRmlsZSIsIm1rZGlycCIsImRpcm5hbWUiLCJ3cml0ZUZpbGUiLCJjbGVhblByb2plY3QiLCJsYXVuY2hXaXRoUHJlaW5zdGFsbGVkV0RBIiwic2Vzc2lvbklkIiwieGN0ZXN0RW52IiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIk1KUEVHX1NFUlZFUl9QT1JUIiwiWGN0ZXN0Iiwic3RhcnQiLCJzZXR1cFByb3hpZXMiLCJzdGF0dXMiLCJsYXVuY2giLCJFcnJvciIsInN5bmNocm9uaXphdGlvbktleSIsIm5vcm1hbGl6ZSIsImFjcXVpcmUiLCJyZXNldFRlc3RQcm9jZXNzZXMiLCJzdGFydFdpdGhJREIiLCJpbml0IiwicHJlYnVpbGQiLCJ3ZGFCdW5kbGVJZCIsInRlc3RCdW5kbGVJZCIsInByZXBhcmVXREEiLCJydW5YQ1VJVGVzdCIsInBhcnNlQnVuZGxlSWQiLCJpbmZvUGxpc3RQYXRoIiwiam9pbiIsImluZm9QbGlzdCIsInBsaXN0IiwicGFyc2VQbGlzdCIsIkNGQnVuZGxlSWRlbnRpZmllciIsImZldGNoV0RBQnVuZGxlIiwiaXNBcHBJbnN0YWxsZWQiLCJpbnN0YWxsQXBwIiwiaW5zdGFsbFhDVGVzdEJ1bmRsZSIsImJ1bmRsZVdEQVNpbSIsIndkYUJ1bmRsZVBhdGhzIiwiZ2xvYiIsIldEQV9SVU5ORVJfQVBQIiwiYWJzb2x1dGUiLCJpc1NvdXJjZUZyZXNoIiwiZXhpc3RzUHJvbWlzZXMiLCJzZXAiLCJtYXAiLCJzdWJQYXRoIiwiQiIsImFsbCIsInNvbWUiLCJ2IiwicHJveHlPcHRzIiwia2VlcEFsaXZlIiwiandwcm94eSIsIkpXUHJveHkiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJxdWl0Iiwic3RvcCIsInJlc2V0IiwiX3VybCIsInBhcnNlIiwicHJvdG9jb2wiLCJmdWxseVN0YXJ0ZWQiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsInNldHVwQ2FjaGluZyIsImJ1aWxkIiwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIiLCJ1cGdyYWRlZEF0IiwidXRpbCIsImhhc1ZhbHVlIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJhY3R1YWxVcGdyYWRlVGltZXN0YW1wIiwidG9Mb3dlciIsInF1aXRBbmRVbmluc3RhbGwiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYmRyaXZlcmFnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBwbGlzdCwgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IE5vU2Vzc2lvblByb3h5IH0gZnJvbSAnLi9uby1zZXNzaW9uLXByb3h5JztcbmltcG9ydCB7XG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIHJlc2V0VGVzdFByb2Nlc3NlcywgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwgQk9PVFNUUkFQX1BBVEhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYnVuZGxlV0RBU2ltIH0gZnJvbSAnLi9jaGVjay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFdEQV9SVU5ORVJfQlVORExFX0lEX0ZPUl9YQ1RFU1QsIFdEQV9SVU5ORVJfQVBQLFxuICBXREFfQkFTRV9VUkwsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRILFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1hjdGVzdH0gZnJvbSAnYXBwaXVtLWlvcy1kZXZpY2UnO1xuXG5jb25zdCBXREFfTEFVTkNIX1RJTUVPVVQgPSA2MCAqIDEwMDA7XG5jb25zdCBXREFfQUdFTlRfUE9SVCA9IDgxMDA7XG5jb25zdCBXREFfQ0ZfQlVORExFX05BTUUgPSAnV2ViRHJpdmVyQWdlbnRSdW5uZXItUnVubmVyJztcbmNvbnN0IFNIQVJFRF9SRVNPVVJDRVNfR1VBUkQgPSBuZXcgQXN5bmNMb2NrKCk7XG5cbmNsYXNzIFdlYkRyaXZlckFnZW50IHtcbiAgY29uc3RydWN0b3IgKHhjb2RlVmVyc2lvbiwgYXJncyA9IHt9LCBsb2cgPSBudWxsKSB7XG4gICAgdGhpcy54Y29kZVZlcnNpb24gPSB4Y29kZVZlcnNpb247XG5cbiAgICB0aGlzLmFyZ3MgPSBfLmNsb25lKGFyZ3MpO1xuICAgIHRoaXMubG9nID0gbG9nID8/IGRlZmF1bHRMb2dnZXI7XG5cbiAgICB0aGlzLmRldmljZSA9IGFyZ3MuZGV2aWNlO1xuICAgIHRoaXMucGxhdGZvcm1WZXJzaW9uID0gYXJncy5wbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5wbGF0Zm9ybU5hbWUgPSBhcmdzLnBsYXRmb3JtTmFtZTtcbiAgICB0aGlzLmlvc1Nka1ZlcnNpb24gPSBhcmdzLmlvc1Nka1ZlcnNpb247XG4gICAgdGhpcy5ob3N0ID0gYXJncy5ob3N0O1xuICAgIHRoaXMuaXNSZWFsRGV2aWNlID0gISFhcmdzLnJlYWxEZXZpY2U7XG4gICAgdGhpcy5pZGIgPSAoYXJncy5kZXZpY2UgfHwge30pLmlkYjtcbiAgICB0aGlzLndkYUJ1bmRsZVBhdGggPSBhcmdzLndkYUJ1bmRsZVBhdGg7XG5cbiAgICB0aGlzLnNldFdEQVBhdGhzKGFyZ3MuYm9vdHN0cmFwUGF0aCwgYXJncy5hZ2VudFBhdGgpO1xuXG4gICAgdGhpcy53ZGFMb2NhbFBvcnQgPSBhcmdzLndkYUxvY2FsUG9ydDtcbiAgICB0aGlzLndkYVJlbW90ZVBvcnQgPSBhcmdzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVDtcbiAgICB0aGlzLndkYUJhc2VVcmwgPSBhcmdzLndkYUJhc2VVcmwgfHwgV0RBX0JBU0VfVVJMO1xuXG4gICAgdGhpcy5wcmVidWlsZFdEQSA9IGFyZ3MucHJlYnVpbGRXREE7XG5cbiAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gYXJncy53ZWJEcml2ZXJBZ2VudFVybDtcblxuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy53ZGFDb25uZWN0aW9uVGltZW91dCA9IGFyZ3Mud2RhQ29ubmVjdGlvblRpbWVvdXQ7XG5cbiAgICB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgPSBhcmdzLnVzZVhjdGVzdHJ1bkZpbGU7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IGFyZ3MudXNlUHJlYnVpbHRXREE7XG4gICAgdGhpcy5kZXJpdmVkRGF0YVBhdGggPSBhcmdzLmRlcml2ZWREYXRhUGF0aDtcbiAgICB0aGlzLm1qcGVnU2VydmVyUG9ydCA9IGFyZ3MubWpwZWdTZXJ2ZXJQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcblxuICAgIHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBID0gYXJncy51c2VQcmVpbnN0YWxsZWRXREE7XG4gICAgdGhpcy54Y3Rlc3RBcGlDbGllbnQgPSBudWxsO1xuXG4gICAgLy8gRklYTUU6IG1heWJlICd0aGlzLndlYkRyaXZlckFnZW50VXJsJyBhbHNvIGNhbiBpZ25vcmVcbiAgICAvLyB0aGUgeGNvZGVidWlsZCBpbnN0YW5jZSBpdHNlbGYuXG5cbiAgICB0aGlzLnhjb2RlYnVpbGQgPSB0aGlzLnVzZVByZWluc3RhbGxlZFdEQVxuICAgID8gbnVsbFxuICAgIDogbmV3IFhjb2RlQnVpbGQodGhpcy54Y29kZVZlcnNpb24sIHRoaXMuZGV2aWNlLCB7XG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogdGhpcy5wbGF0Zm9ybVZlcnNpb24sXG4gICAgICAgIHBsYXRmb3JtTmFtZTogdGhpcy5wbGF0Zm9ybU5hbWUsXG4gICAgICAgIGlvc1Nka1ZlcnNpb246IHRoaXMuaW9zU2RrVmVyc2lvbixcbiAgICAgICAgYWdlbnRQYXRoOiB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgYm9vdHN0cmFwUGF0aDogdGhpcy5ib290c3RyYXBQYXRoLFxuICAgICAgICByZWFsRGV2aWNlOiB0aGlzLmlzUmVhbERldmljZSxcbiAgICAgICAgc2hvd1hjb2RlTG9nOiBhcmdzLnNob3dYY29kZUxvZyxcbiAgICAgICAgeGNvZGVDb25maWdGaWxlOiBhcmdzLnhjb2RlQ29uZmlnRmlsZSxcbiAgICAgICAgeGNvZGVPcmdJZDogYXJncy54Y29kZU9yZ0lkLFxuICAgICAgICB4Y29kZVNpZ25pbmdJZDogYXJncy54Y29kZVNpZ25pbmdJZCxcbiAgICAgICAga2V5Y2hhaW5QYXRoOiBhcmdzLmtleWNoYWluUGF0aCxcbiAgICAgICAga2V5Y2hhaW5QYXNzd29yZDogYXJncy5rZXljaGFpblBhc3N3b3JkLFxuICAgICAgICB1c2VTaW1wbGVCdWlsZFRlc3Q6IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0LFxuICAgICAgICB1c2VQcmVidWlsdFdEQTogYXJncy51c2VQcmVidWlsdFdEQSxcbiAgICAgICAgdXBkYXRlZFdEQUJ1bmRsZUlkOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICAgICAgbGF1bmNoVGltZW91dDogYXJncy53ZGFMYXVuY2hUaW1lb3V0IHx8IFdEQV9MQVVOQ0hfVElNRU9VVCxcbiAgICAgICAgd2RhUmVtb3RlUG9ydDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgICB1c2VYY3Rlc3RydW5GaWxlOiB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUsXG4gICAgICAgIGRlcml2ZWREYXRhUGF0aDogYXJncy5kZXJpdmVkRGF0YVBhdGgsXG4gICAgICAgIG1qcGVnU2VydmVyUG9ydDogdGhpcy5tanBlZ1NlcnZlclBvcnQsXG4gICAgICAgIGFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uOiBhcmdzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uLFxuICAgICAgICByZXN1bHRCdW5kbGVQYXRoOiBhcmdzLnJlc3VsdEJ1bmRsZVBhdGgsXG4gICAgICAgIHJlc3VsdEJ1bmRsZVZlcnNpb246IGFyZ3MucmVzdWx0QnVuZGxlVmVyc2lvbixcbiAgICAgIH0sIHRoaXMubG9nKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCdW5kbGUgSUQgZm9yIFhjdGVzdC5cbiAgICovXG4gIGdldCBidW5kbGVJZEZvclhjdGVzdCAoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBkYXRlZFdEQUJ1bmRsZUlkfS54Y3RydW5uZXJgIHx8IFdEQV9SVU5ORVJfQlVORExFX0lEX0ZPUl9YQ1RFU1Q7XG4gIH1cblxuICBzZXRXREFQYXRocyAoYm9vdHN0cmFwUGF0aCwgYWdlbnRQYXRoKSB7XG4gICAgLy8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHBsYWNlIGZvciBXREEuIFRoaXMgaXMgdW5kb2N1bWVudGVkIGFuZFxuICAgIC8vIG9ubHkgaGVyZSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRlc3RpbmcgZGV2ZWxvcG1lbnQgb2YgV0RBXG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYm9vdHN0cmFwUGF0aCB8fCBCT09UU1RSQVBfUEFUSDtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgcGF0aDogJyR7dGhpcy5ib290c3RyYXBQYXRofSdgKTtcblxuICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFnZW50UGF0aCB0b29cbiAgICB0aGlzLmFnZW50UGF0aCA9IGFnZW50UGF0aCB8fCBwYXRoLnJlc29sdmUodGhpcy5ib290c3RyYXBQYXRoLCAnV2ViRHJpdmVyQWdlbnQueGNvZGVwcm9qJyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgV0RBIGFnZW50OiAnJHt0aGlzLmFnZW50UGF0aH0nYCk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMgKCkge1xuICAgIGNvbnN0IG9ic29sZXRlUGlkcyA9IGF3YWl0IGdldFBJRHNMaXN0ZW5pbmdPblBvcnQodGhpcy51cmwucG9ydCxcbiAgICAgIChjbWRMaW5lKSA9PiBjbWRMaW5lLmluY2x1ZGVzKCcvV2ViRHJpdmVyQWdlbnRSdW5uZXInKSAmJlxuICAgICAgICAhY21kTGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZGV2aWNlLnVkaWQudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShvYnNvbGV0ZVBpZHMpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3NlcyBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucyBgICtcbiAgICAgICAgYGxpc3RlbmluZyBvbiBwb3J0ICR7dGhpcy51cmwucG9ydH0gaGF2ZSBiZWVuIGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbyhgRGV0ZWN0ZWQgJHtvYnNvbGV0ZVBpZHMubGVuZ3RofSBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gYCArXG4gICAgICBgZnJvbSBwcmV2aW91cyBXREEgc2Vzc2lvbnMuIENsZWFuaW5nIHRoZW0gdXBgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYygna2lsbCcsIG9ic29sZXRlUGlkcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cud2FybihgRmFpbGVkIHRvIGtpbGwgb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3Mke29ic29sZXRlUGlkcy5sZW5ndGggPT09IDEgPyAnJyA6ICdlcyd9ICcke29ic29sZXRlUGlkc30nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaWYgV0RBIGlzIHJ1bm5pbmcgb3Igbm90XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV0RBIGlzIHJ1bm5pbmdcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgaXNSdW5uaW5nICgpIHtcbiAgICByZXR1cm4gISEoYXdhaXQgdGhpcy5nZXRTdGF0dXMoKSk7XG4gIH1cblxuICBnZXQgYmFzZVBhdGggKCkge1xuICAgIGlmICh0aGlzLnVybC5wYXRoID09PSAnLycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsLnBhdGggfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGN1cnJlbnQgcnVubmluZyBXREEncyBzdGF0dXMgbGlrZSBiZWxvd1xuICAgKiB7XG4gICAqICAgXCJzdGF0ZVwiOiBcInN1Y2Nlc3NcIixcbiAgICogICBcIm9zXCI6IHtcbiAgICogICAgIFwibmFtZVwiOiBcImlPU1wiLFxuICAgKiAgICAgXCJ2ZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJzZGtWZXJzaW9uXCI6IFwiMTEuM1wiXG4gICAqICAgfSxcbiAgICogICBcImlvc1wiOiB7XG4gICAqICAgICBcInNpbXVsYXRvclZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcImlwXCI6IFwiMTcyLjI1NC45OS4zNFwiXG4gICAqICAgfSxcbiAgICogICBcImJ1aWxkXCI6IHtcbiAgICogICAgIFwidGltZVwiOiBcIkp1biAyNCAyMDE4IDE3OjA4OjIxXCIsXG4gICAqICAgICBcInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyXCI6IFwiY29tLmZhY2Vib29rLldlYkRyaXZlckFnZW50UnVubmVyXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgY29uc3Qgbm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkoe1xuICAgICAgc2VydmVyOiB0aGlzLnVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHRoaXMudXJsLnBvcnQsXG4gICAgICBiYXNlOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgdGltZW91dDogMzAwMCxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5vU2Vzc2lvblByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV0RBIGlzIG5vdCBsaXN0ZW5pbmcgYXQgJyR7dGhpcy51cmwuaHJlZn0nYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIFdEQXMgZnJvbSB0aGUgdGVzdCBkZXZpY2UuXG4gICAqIE92ZXIgWGNvZGUgMTEsIG11bHRpcGxlIFdEQSBjYW4gYmUgaW4gdGhlIGRldmljZSBzaW5jZSBYY29kZSAxMSBnZW5lcmF0ZXMgZGlmZmVyZW50IFdEQS5cbiAgICogQXBwaXVtIGRvZXMgbm90IGV4cGVjdCBtdWx0aXBsZSBXREFzIGFyZSBydW5uaW5nIG9uIGEgZGV2aWNlLlxuICAgKi9cbiAgYXN5bmMgdW5pbnN0YWxsICgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYnVuZGxlSWRzID0gYXdhaXQgdGhpcy5kZXZpY2UuZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZShXREFfQ0ZfQlVORExFX05BTUUpO1xuICAgICAgaWYgKF8uaXNFbXB0eShidW5kbGVJZHMpKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBXREFzIG9uIHRoZSBkZXZpY2UuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYFVuaW5zdGFsbGluZyBXREFzOiAnJHtidW5kbGVJZHN9J2ApO1xuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBidW5kbGVJZHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZXZpY2UucmVtb3ZlQXBwKGJ1bmRsZUlkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlKTtcbiAgICAgIHRoaXMubG9nLndhcm4oYFdlYkRyaXZlckFnZW50IHVuaW5zdGFsbCBmYWlsZWQuIFBlcmhhcHMsIGl0IGlzIGFscmVhZHkgdW5pbnN0YWxsZWQ/IGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9jbGVhbnVwUHJvamVjdElmRnJlc2ggKCkge1xuICAgIGNvbnN0IGhvbWVGb2xkZXIgPSBwcm9jZXNzLmVudi5IT01FO1xuICAgIGlmICghaG9tZUZvbGRlcikge1xuICAgICAgdGhpcy5sb2cuaW5mbygnVGhlIEhPTUUgZm9sZGVyIHBhdGggY2Fubm90IGJlIGRldGVybWluZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgcGFja2FnZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlciwgV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgpO1xuICAgIGNvbnN0IGRpZFRpbWVzdGFtcEV4aXN0ID0gYXdhaXQgZnMuZXhpc3RzKHRpbWVzdGFtcFBhdGgpO1xuICAgIGlmIChkaWRUaW1lc3RhbXBFeGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHRpbWVzdGFtcFBhdGgsIGZzLldfT0spO1xuICAgICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgc291cmNlcyBjbGVhbnVwYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY2VudFVwZ3JhZGVUaW1lc3RhbXAgPSBwYXJzZUludChhd2FpdCBmcy5yZWFkRmlsZSh0aW1lc3RhbXBQYXRoLCAndXRmOCcpLCAxMCk7XG4gICAgICBpZiAoXy5pc0ludGVnZXIocmVjZW50VXBncmFkZVRpbWVzdGFtcCkpIHtcbiAgICAgICAgaWYgKHJlY2VudFVwZ3JhZGVUaW1lc3RhbXAgPj0gY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBXZWJEcml2ZXJBZ2VudCBkb2VzIG5vdCBuZWVkIGEgY2xlYW51cC4gVGhlIHNvdXJjZXMgYXJlIHVwIHRvIGRhdGUgYCArXG4gICAgICAgICAgICBgKCR7cmVjZW50VXBncmFkZVRpbWVzdGFtcH0gPj0gJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IHNvdXJjZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIGAgK1xuICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA8ICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVGhlIHJlY2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScgaXMgY29ycnVwdGVkLiBUcnlpbmcgdG8gZml4IGl0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUodGltZXN0YW1wUGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRpbWVzdGFtcFBhdGgsIGAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfWAsICd1dGY4Jyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU3RvcmVkIHRoZSByZWNlbnQgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0gYCArXG4gICAgICAgIGBhdCAnJHt0aW1lc3RhbXBQYXRofSdgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBVbmFibGUgdG8gY3JlYXRlIHRoZSByZWNlbnQgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGVyZSBpcyBubyBuZWVkIHRvIHBlcmZvcm0gdGhlIHByb2plY3QgY2xlYW51cC4gQSBmcmVzaCBpbnN0YWxsIGhhcyBiZWVuIGRldGVjdGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuY2xlYW5Qcm9qZWN0KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBlcmZvcm0gV2ViRHJpdmVyQWdlbnQgcHJvamVjdCBjbGVhbnVwLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaCBXREEgd2l0aCBwcmVpbnN0YWxsZWQgcGFja2FnZSB3aXRob3V0IHhjb2RlYnVpbGQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgTGF1bmNoIFdEQSBhbmQgZXN0YWJsaXNoIHRoZSBzZXNzaW9uIHdpdGggdGhpcyBzZXNzaW9uSWRcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqL1xuICBhc3luYyBsYXVuY2hXaXRoUHJlaW5zdGFsbGVkV0RBKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IHhjdGVzdEVudiA9IHtcbiAgICAgIFVTRV9QT1JUOiB0aGlzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLmJ1bmRsZUlkRm9yWGN0ZXN0XG4gICAgfTtcbiAgICBpZiAodGhpcy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIHhjdGVzdEVudi5NSlBFR19TRVJWRVJfUE9SVCA9IHRoaXMubWpwZWdTZXJ2ZXJQb3J0O1xuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKCdMYXVuY2hpbmcgV2ViRHJpdmVyQWdlbnQgb24gdGhlIGRldmljZSB3aXRob3V0IHhjb2RlYnVpbGQnKTtcbiAgICB0aGlzLnhjdGVzdEFwaUNsaWVudCA9IG5ldyBYY3Rlc3QodGhpcy5kZXZpY2UudWRpZCwgdGhpcy5idW5kbGVJZEZvclhjdGVzdCwgbnVsbCwge2VudjogeGN0ZXN0RW52fSk7XG5cbiAgICBhd2FpdCB0aGlzLnhjdGVzdEFwaUNsaWVudC5zdGFydCgpO1xuXG4gICAgdGhpcy5zZXR1cFByb3hpZXMoc2Vzc2lvbklkKTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93IGFmdGVyIGxhdW5jaGluZyBXREFcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgTGF1bmNoIFdEQSBhbmQgZXN0YWJsaXNoIHRoZSBzZXNzaW9uIHdpdGggdGhpcyBzZXNzaW9uSWRcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGxhdW5jaCAoc2Vzc2lvbklkKSB7XG4gICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIHByb3ZpZGVkIFdlYmRyaXZlckFnZW50IGF0ICcke3RoaXMud2ViRHJpdmVyQWdlbnRVcmx9J2ApO1xuICAgICAgdGhpcy51cmwgPSB0aGlzLndlYkRyaXZlckFnZW50VXJsO1xuICAgICAgdGhpcy5zZXR1cFByb3hpZXMoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZVByZWluc3RhbGxlZFdEQSkge1xuICAgICAgaWYgKHRoaXMuaXNSZWFsRGV2aWNlKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxhdW5jaFdpdGhQcmVpbnN0YWxsZWRXREEoc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlUHJlaW5zdGFsbGVkV0RBIGlzIGF2YWlsYWJsZSBvbmx5IGZvciBhIHJlYWwgZGV2aWNlLicpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlJyk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmFnZW50UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGF0ICcke3RoaXMuYWdlbnRQYXRofScgYnV0IHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIC8vIHVzZVhjdGVzdHJ1bkZpbGUgYW5kIHVzZVByZWJ1aWx0V0RBIHVzZSBleGlzdGluZyBkZXBlbmRlbmNpZXNcbiAgICAvLyBJdCBkZXBlbmRzIG9uIHVzZXIgc2lkZVxuICAgIGlmICh0aGlzLmlkYiB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgfHwgKHRoaXMuZGVyaXZlZERhdGFQYXRoICYmIHRoaXMudXNlUHJlYnVpbHRXREEpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGVkIFdEQSBwcm9qZWN0IGNsZWFudXAgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjYXBhYmlsaXRpZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3luY2hyb25pemF0aW9uS2V5ID0gcGF0aC5ub3JtYWxpemUodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICAgIGF3YWl0IFNIQVJFRF9SRVNPVVJDRVNfR1VBUkQuYWNxdWlyZShzeW5jaHJvbml6YXRpb25LZXksXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NsZWFudXBQcm9qZWN0SWZGcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgV0RBIGxvY2FsIHBvcnQsIGJlY2F1c2UgaXQgbWlnaHQgYmUgb2NjdXBpZWRcbiAgICBhd2FpdCByZXNldFRlc3RQcm9jZXNzZXModGhpcy5kZXZpY2UudWRpZCwgIXRoaXMuaXNSZWFsRGV2aWNlKTtcblxuICAgIGlmICh0aGlzLmlkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRXaXRoSURCKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmluaXQodGhpcy5ub1Nlc3Npb25Qcm94eSk7XG5cbiAgICAvLyBTdGFydCB0aGUgeGNvZGVidWlsZCBwcm9jZXNzXG4gICAgaWYgKHRoaXMucHJlYnVpbGRXREEpIHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5wcmVidWlsZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydFdpdGhJREIgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1dpbGwgbGF1bmNoIFdEQSB3aXRoIGlkYiBpbnN0ZWFkIG9mIHhjb2RlYnVpbGQgc2luY2UgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZyBpcyBlbmFibGVkJyk7XG4gICAgY29uc3Qge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWR9ID0gYXdhaXQgdGhpcy5wcmVwYXJlV0RBKCk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRiLnJ1blhDVUlUZXN0KHdkYUJ1bmRsZUlkLCB3ZGFCdW5kbGVJZCwgdGVzdEJ1bmRsZUlkLCB7ZW52fSk7XG4gIH1cblxuICBhc3luYyBwYXJzZUJ1bmRsZUlkICh3ZGFCdW5kbGVQYXRoKSB7XG4gICAgY29uc3QgaW5mb1BsaXN0UGF0aCA9IHBhdGguam9pbih3ZGFCdW5kbGVQYXRoLCAnSW5mby5wbGlzdCcpO1xuICAgIGNvbnN0IGluZm9QbGlzdCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3QoYXdhaXQgZnMucmVhZEZpbGUoaW5mb1BsaXN0UGF0aCkpO1xuICAgIGlmICghaW5mb1BsaXN0LkNGQnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBidW5kbGUgaWQgaW4gJyR7aW5mb1BsaXN0UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdEQSAoKSB7XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHRoaXMud2RhQnVuZGxlUGF0aCB8fCBhd2FpdCB0aGlzLmZldGNoV0RBQnVuZGxlKCk7XG4gICAgY29uc3Qgd2RhQnVuZGxlSWQgPSBhd2FpdCB0aGlzLnBhcnNlQnVuZGxlSWQod2RhQnVuZGxlUGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmRldmljZS5pc0FwcEluc3RhbGxlZCh3ZGFCdW5kbGVJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLmluc3RhbGxBcHAod2RhQnVuZGxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRlc3RCdW5kbGVJZCA9IGF3YWl0IHRoaXMuaWRiLmluc3RhbGxYQ1Rlc3RCdW5kbGUocGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdQbHVnSW5zJywgJ1dlYkRyaXZlckFnZW50UnVubmVyLnhjdGVzdCcpKTtcbiAgICByZXR1cm4ge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHdkYUJ1bmRsZVBhdGh9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXREFCdW5kbGUgKCkge1xuICAgIGlmICghdGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiBhd2FpdCBidW5kbGVXREFTaW0odGhpcy54Y29kZWJ1aWxkKTtcbiAgICB9XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZGVyaXZlZERhdGFQYXRofS8qKi8qJHtXREFfUlVOTkVSX0FQUH0vYCwge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKF8uaXNFbXB0eSh3ZGFCdW5kbGVQYXRocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIFdEQSBidW5kbGUgaW4gJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aHNbMF07XG4gIH1cblxuICBhc3luYyBpc1NvdXJjZUZyZXNoICgpIHtcbiAgICBjb25zdCBleGlzdHNQcm9taXNlcyA9IFtcbiAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgYFJlc291cmNlcyR7cGF0aC5zZXB9V2ViRHJpdmVyQWdlbnQuYnVuZGxlYCxcbiAgICBdLm1hcCgoc3ViUGF0aCkgPT4gZnMuZXhpc3RzKHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsIHN1YlBhdGgpKSk7XG4gICAgcmV0dXJuIChhd2FpdCBCLmFsbChleGlzdHNQcm9taXNlcykpLnNvbWUoKHYpID0+IHYgPT09IGZhbHNlKTtcbiAgfVxuXG4gIHNldHVwUHJveGllcyAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuandwcm94eSA9IG5ldyBKV1Byb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcblxuICAgIHRoaXMubm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkocHJveHlPcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHF1aXQgKCkge1xuICAgIGlmICh0aGlzLnVzZVByZWluc3RhbGxlZFdEQSkge1xuICAgICAgaWYgKHRoaXMueGN0ZXN0QXBpQ2xpZW50KSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1N0b3BwaW5nIHRoZSBYQ1Rlc3Qgc2Vzc2lvbicpO1xuICAgICAgICB0aGlzLnhjdGVzdEFwaUNsaWVudC5zdG9wKCk7XG4gICAgICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biBzdWItcHJvY2Vzc2VzJyk7XG4gICAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucXVpdCgpO1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuandwcm94eSkge1xuICAgICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgLy8gaWYgd2UgcG9wdWxhdGVkIHRoZSB1cmwgb3Vyc2VsdmVzIChkdXJpbmcgYHNldHVwQ2FjaGluZ2AgY2FsbCwgZm9yIGluc3RhbmNlKVxuICAgICAgLy8gdGhlbiBjbGVhbiB0aGF0IHVwLiBJZiB0aGUgdXJsIHdhcyBzdXBwbGllZCwgd2Ugd2FudCB0byBrZWVwIGl0XG4gICAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgICAgICBjb25zdCB7cHJvdG9jb2wsIGhvc3RuYW1lfSA9IHVybC5wYXJzZSh0aGlzLndkYUJhc2VVcmwgfHwgV0RBX0JBU0VfVVJMKTtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX06JHtwb3J0fWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgc2V0IHVybCAoX3VybCkge1xuICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShfdXJsKTtcbiAgfVxuXG4gIGdldCBmdWxseVN0YXJ0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0ZWQ7XG4gIH1cblxuICBzZXQgZnVsbHlTdGFydGVkIChzdGFydGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnN0YXJ0ZWQgPSBzdGFydGVkO1xuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLnVzZVByZWluc3RhbGxlZFdEQSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgcnVubmluZyBXREEgaWYgaXQgaGFzIHRoZSBzYW1lIGJ1bmRsZSBpZCB3aXRoIHVwZGF0ZWRXREFCdW5kbGVJZC5cbiAgICogT3IgcmV1c2UgaXQgaWYgaXQgaGFzIHRoZSBkZWZhdWx0IGlkIHdpdGhvdXQgdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBVbmluc3RhbGwgaXQgaWYgdGhlIG1ldGhvZCBmYWNlcyBhbiBleGNlcHRpb24gZm9yIHRoZSBhYm92ZSBzaXR1YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVkV0RBQnVuZGxlSWQgQnVuZGxlSWQgeW91J2QgbGlrZSB0byB1c2VcbiAgICovXG4gIGFzeW5jIHNldHVwQ2FjaGluZyAoKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cyB8fCAhc3RhdHVzLmJ1aWxkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnV0RBIGlzIGN1cnJlbnRseSBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBjYWNoZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyLFxuICAgICAgdXBncmFkZWRBdCxcbiAgICB9ID0gc3RhdHVzLmJ1aWxkO1xuICAgIC8vIGZvciByZWFsIGRldmljZVxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiB1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0IGhhcyBkaWZmZXJlbnQgYnVuZGxlIGlkLiBUaGUgYWN0dWFsIHZhbHVlIGlzICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfScuYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG4gICAgLy8gZm9yIHNpbXVsYXRvclxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiAhdXRpbC5oYXNWYWx1ZSh0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCkgJiYgV0RBX1JVTk5FUl9CVU5ETEVfSUQgIT09IHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdHMgYnVuZGxlIGlkIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAke1dEQV9SVU5ORVJfQlVORExFX0lEfWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVXBncmFkZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnRseSBidW5kbGVkIFdEQTogJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgV0RBIG9uIHRoZSBkZXZpY2U6ICR7dXBncmFkZWRBdH1gKTtcbiAgICBpZiAoYWN0dWFsVXBncmFkZVRpbWVzdGFtcCAmJiB1cGdyYWRlZEF0ICYmIF8udG9Mb3dlcihgJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApICE9PSBfLnRvTG93ZXIoYCR7dXBncmFkZWRBdH1gKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCB2ZXJzaW9uIGluIGNvbXBhcmlzb24gdG8gdGhlIG9uZSAnICtcbiAgICAgICAgYHdoaWNoIGlzIGJ1bmRsZWQgd2l0aCBhcHBpdW0teGN1aXRlc3QtZHJpdmVyIG1vZHVsZSAoJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfSAhPSAke3VwZ3JhZGVkQXR9KWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpXG4gICAgICA/IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfScgd2l0aCAnJHtwcm9kdWN0QnVuZGxlSWRlbnRpZmllcn0nYFxuICAgICAgOiBgV2lsbCByZXVzZSBwcmV2aW91c2x5IGNhY2hlZCBXREEgaW5zdGFuY2UgYXQgJyR7dGhpcy51cmwuaHJlZn0nYDtcbiAgICB0aGlzLmxvZy5pbmZvKGAke21lc3NhZ2V9LiBTZXQgdGhlIHdkYUxvY2FsUG9ydCBjYXBhYmlsaXR5IHRvIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gJHt0aGlzLnVybC5wb3J0fSBpZiB0aGlzIGlzIGFuIHVuZGVzaXJlZCBiZWhhdmlvci5gKTtcbiAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gdGhpcy51cmwuaHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWl0IGFuZCB1bmluc3RhbGwgcnVubmluZyBXREEuXG4gICAqL1xuICBhc3luYyBxdWl0QW5kVW5pbnN0YWxsICgpIHtcbiAgICBhd2FpdCB0aGlzLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYkRyaXZlckFnZW50O1xuZXhwb3J0IHsgV2ViRHJpdmVyQWdlbnQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxlQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFHQSxJQUFBUyxXQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxVQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxhQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxrQkFBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEsVUFBQSxHQUFBYixPQUFBO0FBSUEsSUFBQWMsZ0JBQUEsR0FBQWQsT0FBQTtBQUVBLE1BQU1lLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQ3BDLE1BQU1DLGNBQWMsR0FBRyxJQUFJO0FBQzNCLE1BQU1DLGtC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
407
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl91cmwyIiwiX2JsdWViaXJkIiwiX2Jhc2VEcml2ZXIiLCJfc3VwcG9ydCIsIl9sb2dnZXIiLCJfbm9TZXNzaW9uUHJveHkiLCJfdXRpbHMiLCJfeGNvZGVidWlsZCIsIl9hc3luY0xvY2siLCJfdGVlbl9wcm9jZXNzIiwiX2NoZWNrRGVwZW5kZW5jaWVzIiwiX2NvbnN0YW50cyIsIl9hcHBpdW1Jb3NEZXZpY2UiLCJXREFfTEFVTkNIX1RJTUVPVVQiLCJXREFfQUdFTlRfUE9SVCIsIldEQV9DRl9CVU5ETEVfTkFNRSIsIlNIQVJFRF9SRVNPVVJDRVNfR1VBUkQiLCJBc3luY0xvY2siLCJXZWJEcml2ZXJBZ2VudCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiYXJncyIsImxvZyIsIl8iLCJjbG9uZSIsImRlZmF1bHRMb2dnZXIiLCJkZXZpY2UiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwiaG9zdCIsImlzUmVhbERldmljZSIsInJlYWxEZXZpY2UiLCJpZGIiLCJ3ZGFCdW5kbGVQYXRoIiwic2V0V0RBUGF0aHMiLCJib290c3RyYXBQYXRoIiwiYWdlbnRQYXRoIiwid2RhTG9jYWxQb3J0Iiwid2RhUmVtb3RlUG9ydCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJwcmVidWlsZFdEQSIsIndlYkRyaXZlckFnZW50VXJsIiwic3RhcnRlZCIsIndkYUNvbm5lY3Rpb25UaW1lb3V0IiwidXNlWGN0ZXN0cnVuRmlsZSIsInVzZVByZWJ1aWx0V0RBIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwidXNlUHJlaW5zdGFsbGVkV0RBIiwieGN0ZXN0QXBpQ2xpZW50IiwieGNvZGVidWlsZCIsImNhblNraXBYY29kZWJ1aWxkIiwiWGNvZGVCdWlsZCIsInNob3dYY29kZUxvZyIsInhjb2RlQ29uZmlnRmlsZSIsInhjb2RlT3JnSWQiLCJ4Y29kZVNpZ25pbmdJZCIsImtleWNoYWluUGF0aCIsImtleWNoYWluUGFzc3dvcmQiLCJ1c2VTaW1wbGVCdWlsZFRlc3QiLCJsYXVuY2hUaW1lb3V0Iiwid2RhTGF1bmNoVGltZW91dCIsImFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIiwicmVzdWx0QnVuZGxlUGF0aCIsInJlc3VsdEJ1bmRsZVZlcnNpb24iLCJidW5kbGVJZEZvclhjdGVzdCIsIldEQV9SVU5ORVJfQlVORExFX0lEX0ZPUl9YQ1RFU1QiLCJCT09UU1RSQVBfUEFUSCIsImluZm8iLCJwYXRoIiwicmVzb2x2ZSIsImNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyIsIm9ic29sZXRlUGlkcyIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJ1cmwiLCJwb3J0IiwiY21kTGluZSIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJ1ZGlkIiwiaXNFbXB0eSIsImRlYnVnIiwibGVuZ3RoIiwiZXhlYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImlzUnVubmluZyIsImdldFN0YXR1cyIsImJhc2VQYXRoIiwibm9TZXNzaW9uUHJveHkiLCJOb1Nlc3Npb25Qcm94eSIsInNlcnZlciIsImhvc3RuYW1lIiwiYmFzZSIsInRpbWVvdXQiLCJjb21tYW5kIiwiZXJyIiwiaHJlZiIsInVuaW5zdGFsbCIsImJ1bmRsZUlkcyIsImdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUiLCJidW5kbGVJZCIsInJlbW92ZUFwcCIsIl9jbGVhbnVwUHJvamVjdElmRnJlc2giLCJob21lRm9sZGVyIiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJjdXJyZW50VXBncmFkZVRpbWVzdGFtcCIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJpc0ludGVnZXIiLCJ0aW1lc3RhbXBQYXRoIiwiV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgiLCJkaWRUaW1lc3RhbXBFeGlzdCIsImZzIiwiZXhpc3RzIiwiYWNjZXNzIiwiV19PSyIsImlnbiIsInJlY2VudFVwZ3JhZGVUaW1lc3RhbXAiLCJwYXJzZUludCIsInJlYWRGaWxlIiwibWtkaXJwIiwiZGlybmFtZSIsIndyaXRlRmlsZSIsImNsZWFuUHJvamVjdCIsImxhdW5jaFdpdGhQcmVpbnN0YWxsZWRXREEiLCJzZXNzaW9uSWQiLCJ4Y3Rlc3RFbnYiLCJVU0VfUE9SVCIsIldEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSIiwiTUpQRUdfU0VSVkVSX1BPUlQiLCJYY3Rlc3QiLCJzdGFydCIsInNldHVwUHJveGllcyIsInN0YXR1cyIsImxhdW5jaCIsIkVycm9yIiwic3luY2hyb25pemF0aW9uS2V5Iiwibm9ybWFsaXplIiwiYWNxdWlyZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsInN0YXJ0V2l0aElEQiIsImluaXQiLCJwcmVidWlsZCIsIndkYUJ1bmRsZUlkIiwidGVzdEJ1bmRsZUlkIiwicHJlcGFyZVdEQSIsInJ1blhDVUlUZXN0IiwicGFyc2VCdW5kbGVJZCIsImluZm9QbGlzdFBhdGgiLCJqb2luIiwiaW5mb1BsaXN0IiwicGxpc3QiLCJwYXJzZVBsaXN0IiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwiZmV0Y2hXREFCdW5kbGUiLCJpc0FwcEluc3RhbGxlZCIsImluc3RhbGxBcHAiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwiYnVuZGxlV0RBU2ltIiwid2RhQnVuZGxlUGF0aHMiLCJnbG9iIiwiV0RBX1JVTk5FUl9BUFAiLCJhYnNvbHV0ZSIsImlzU291cmNlRnJlc2giLCJleGlzdHNQcm9taXNlcyIsInNlcCIsIm1hcCIsInN1YlBhdGgiLCJCIiwiYWxsIiwic29tZSIsInYiLCJwcm94eU9wdHMiLCJrZWVwQWxpdmUiLCJqd3Byb3h5IiwiSldQcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsInF1aXQiLCJzdG9wIiwicmVzZXQiLCJfdXJsIiwicGFyc2UiLCJwcm90b2NvbCIsImZ1bGx5U3RhcnRlZCIsInJldHJpZXZlRGVyaXZlZERhdGFQYXRoIiwic2V0dXBDYWNoaW5nIiwiYnVpbGQiLCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllciIsInVwZ3JhZGVkQXQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsImFjdHVhbFVwZ3JhZGVUaW1lc3RhbXAiLCJ0b0xvd2VyIiwicXVpdEFuZFVuaW5zdGFsbCIsImV4cG9ydHMiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9saWIvd2ViZHJpdmVyYWdlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgSldQcm94eSB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHBsaXN0LCBta2RpcnAgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGRlZmF1bHRMb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgTm9TZXNzaW9uUHJveHkgfSBmcm9tICcuL25vLXNlc3Npb24tcHJveHknO1xuaW1wb3J0IHtcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLCBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBCT09UU1RSQVBfUEFUSFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBYY29kZUJ1aWxkIGZyb20gJy4veGNvZGVidWlsZCc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBidW5kbGVXREFTaW0gfSBmcm9tICcuL2NoZWNrLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQge1xuICBXREFfUlVOTkVSX0JVTkRMRV9JRCwgV0RBX1JVTk5FUl9CVU5ETEVfSURfRk9SX1hDVEVTVCwgV0RBX1JVTk5FUl9BUFAsXG4gIFdEQV9CQVNFX1VSTCwgV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7WGN0ZXN0fSBmcm9tICdhcHBpdW0taW9zLWRldmljZSc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgV2ViRHJpdmVyQWdlbnQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuYXJncyA9IF8uY2xvbmUoYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMuZGV2aWNlID0gYXJncy5kZXZpY2U7XG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcbiAgICB0aGlzLmhvc3QgPSBhcmdzLmhvc3Q7XG4gICAgdGhpcy5pc1JlYWxEZXZpY2UgPSAhIWFyZ3MucmVhbERldmljZTtcbiAgICB0aGlzLmlkYiA9IChhcmdzLmRldmljZSB8fCB7fSkuaWRiO1xuICAgIHRoaXMud2RhQnVuZGxlUGF0aCA9IGFyZ3Mud2RhQnVuZGxlUGF0aDtcblxuICAgIHRoaXMuc2V0V0RBUGF0aHMoYXJncy5ib290c3RyYXBQYXRoLCBhcmdzLmFnZW50UGF0aCk7XG5cbiAgICB0aGlzLndkYUxvY2FsUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0O1xuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgIHRoaXMud2RhQmFzZVVybCA9IGFyZ3Mud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcblxuICAgIC8vIHRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCBndWlhcmFudGVlcyB0aGUgY2FwYWJpbGl0aWVzIGFjdWFsbHlcbiAgICAvLyBnYXZlICdhcHBpdW06d2ViRHJpdmVyQWdlbnRVcmwnIGJ1dCAndGhpcy53ZWJEcml2ZXJBZ2VudFVybCdcbiAgICAvLyBjb3VsZCBiZSB1c2VkIGZvciBjYWNoaW5nIFdEQSB3aXRoIHhjb2RlYnVpbGQuXG4gICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IGFyZ3Mud2ViRHJpdmVyQWdlbnRVcmw7XG5cbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQgPSBhcmdzLndkYUNvbm5lY3Rpb25UaW1lb3V0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuICAgIHRoaXMudXNlUHJlYnVpbHRXREEgPSBhcmdzLnVzZVByZWJ1aWx0V0RBO1xuICAgIHRoaXMuZGVyaXZlZERhdGFQYXRoID0gYXJncy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkID0gYXJncy51cGRhdGVkV0RBQnVuZGxlSWQ7XG5cbiAgICB0aGlzLnVzZVByZWluc3RhbGxlZFdEQSA9IGFyZ3MudXNlUHJlaW5zdGFsbGVkV0RBO1xuICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50ID0gbnVsbDtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IHRoaXMuY2FuU2tpcFhjb2RlYnVpbGRcbiAgICA/IG51bGxcbiAgICA6IG5ldyBYY29kZUJ1aWxkKHRoaXMueGNvZGVWZXJzaW9uLCB0aGlzLmRldmljZSwge1xuICAgICAgICBwbGF0Zm9ybVZlcnNpb246IHRoaXMucGxhdGZvcm1WZXJzaW9uLFxuICAgICAgICBwbGF0Zm9ybU5hbWU6IHRoaXMucGxhdGZvcm1OYW1lLFxuICAgICAgICBpb3NTZGtWZXJzaW9uOiB0aGlzLmlvc1Nka1ZlcnNpb24sXG4gICAgICAgIGFnZW50UGF0aDogdGhpcy5hZ2VudFBhdGgsXG4gICAgICAgIGJvb3RzdHJhcFBhdGg6IHRoaXMuYm9vdHN0cmFwUGF0aCxcbiAgICAgICAgcmVhbERldmljZTogdGhpcy5pc1JlYWxEZXZpY2UsXG4gICAgICAgIHNob3dYY29kZUxvZzogYXJncy5zaG93WGNvZGVMb2csXG4gICAgICAgIHhjb2RlQ29uZmlnRmlsZTogYXJncy54Y29kZUNvbmZpZ0ZpbGUsXG4gICAgICAgIHhjb2RlT3JnSWQ6IGFyZ3MueGNvZGVPcmdJZCxcbiAgICAgICAgeGNvZGVTaWduaW5nSWQ6IGFyZ3MueGNvZGVTaWduaW5nSWQsXG4gICAgICAgIGtleWNoYWluUGF0aDogYXJncy5rZXljaGFpblBhdGgsXG4gICAgICAgIGtleWNoYWluUGFzc3dvcmQ6IGFyZ3Mua2V5Y2hhaW5QYXNzd29yZCxcbiAgICAgICAgdXNlU2ltcGxlQnVpbGRUZXN0OiBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdCxcbiAgICAgICAgdXNlUHJlYnVpbHRXREE6IGFyZ3MudXNlUHJlYnVpbHRXREEsXG4gICAgICAgIHVwZGF0ZWRXREFCdW5kbGVJZDogdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQsXG4gICAgICAgIGxhdW5jaFRpbWVvdXQ6IGFyZ3Mud2RhTGF1bmNoVGltZW91dCB8fCBXREFfTEFVTkNIX1RJTUVPVVQsXG4gICAgICAgIHdkYVJlbW90ZVBvcnQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgICAgdXNlWGN0ZXN0cnVuRmlsZTogdGhpcy51c2VYY3Rlc3RydW5GaWxlLFxuICAgICAgICBkZXJpdmVkRGF0YVBhdGg6IGFyZ3MuZGVyaXZlZERhdGFQYXRoLFxuICAgICAgICBtanBlZ1NlcnZlclBvcnQ6IHRoaXMubWpwZWdTZXJ2ZXJQb3J0LFxuICAgICAgICBhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbjogYXJncy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbixcbiAgICAgICAgcmVzdWx0QnVuZGxlUGF0aDogYXJncy5yZXN1bHRCdW5kbGVQYXRoLFxuICAgICAgICByZXN1bHRCdW5kbGVWZXJzaW9uOiBhcmdzLnJlc3VsdEJ1bmRsZVZlcnNpb24sXG4gICAgICB9LCB0aGlzLmxvZyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNlc3Npb24gZG9lcyBub3QgbmVlZCB4Y29kZWJ1aWxkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2Vzc2lvbiBuZWVkcy9oYXMgeGNvZGVidWlsZC5cbiAgICovXG4gIGdldCBjYW5Ta2lwWGNvZGVidWlsZCAoKSB7XG4gICAgLy8gVXNlIHRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCB0byBndWFyYW50ZWVcbiAgICAvLyB0aGUgY2FwYWJpbGl0aWVzIHNldCBnYXZlIHRoZSBgYXBwaXVtOndlYkRyaXZlckFnZW50VXJsYC5cbiAgICByZXR1cm4gdGhpcy51c2VQcmVpbnN0YWxsZWRXREEgfHwgdGhpcy5hcmdzLndlYkRyaXZlckFnZW50VXJsO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEJ1bmRsZSBJRCBmb3IgWGN0ZXN0LlxuICAgKi9cbiAgZ2V0IGJ1bmRsZUlkRm9yWGN0ZXN0ICgpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPyBgJHt0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZH0ueGN0cnVubmVyYCA6IFdEQV9SVU5ORVJfQlVORExFX0lEX0ZPUl9YQ1RFU1Q7XG4gIH1cblxuICBzZXRXREFQYXRocyAoYm9vdHN0cmFwUGF0aCwgYWdlbnRQYXRoKSB7XG4gICAgLy8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHBsYWNlIGZvciBXREEuIFRoaXMgaXMgdW5kb2N1bWVudGVkIGFuZFxuICAgIC8vIG9ubHkgaGVyZSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRlc3RpbmcgZGV2ZWxvcG1lbnQgb2YgV0RBXG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYm9vdHN0cmFwUGF0aCB8fCBCT09UU1RSQVBfUEFUSDtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgcGF0aDogJyR7dGhpcy5ib290c3RyYXBQYXRofSdgKTtcblxuICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFnZW50UGF0aCB0b29cbiAgICB0aGlzLmFnZW50UGF0aCA9IGFnZW50UGF0aCB8fCBwYXRoLnJlc29sdmUodGhpcy5ib290c3RyYXBQYXRoLCAnV2ViRHJpdmVyQWdlbnQueGNvZGVwcm9qJyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgV0RBIGFnZW50OiAnJHt0aGlzLmFnZW50UGF0aH0nYCk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMgKCkge1xuICAgIGNvbnN0IG9ic29sZXRlUGlkcyA9IGF3YWl0IGdldFBJRHNMaXN0ZW5pbmdPblBvcnQodGhpcy51cmwucG9ydCxcbiAgICAgIChjbWRMaW5lKSA9PiBjbWRMaW5lLmluY2x1ZGVzKCcvV2ViRHJpdmVyQWdlbnRSdW5uZXInKSAmJlxuICAgICAgICAhY21kTGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZGV2aWNlLnVkaWQudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShvYnNvbGV0ZVBpZHMpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3NlcyBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucyBgICtcbiAgICAgICAgYGxpc3RlbmluZyBvbiBwb3J0ICR7dGhpcy51cmwucG9ydH0gaGF2ZSBiZWVuIGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbyhgRGV0ZWN0ZWQgJHtvYnNvbGV0ZVBpZHMubGVuZ3RofSBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gYCArXG4gICAgICBgZnJvbSBwcmV2aW91cyBXREEgc2Vzc2lvbnMuIENsZWFuaW5nIHRoZW0gdXBgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYygna2lsbCcsIG9ic29sZXRlUGlkcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cud2FybihgRmFpbGVkIHRvIGtpbGwgb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3Mke29ic29sZXRlUGlkcy5sZW5ndGggPT09IDEgPyAnJyA6ICdlcyd9ICcke29ic29sZXRlUGlkc30nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaWYgV0RBIGlzIHJ1bm5pbmcgb3Igbm90XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV0RBIGlzIHJ1bm5pbmdcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgaXNSdW5uaW5nICgpIHtcbiAgICByZXR1cm4gISEoYXdhaXQgdGhpcy5nZXRTdGF0dXMoKSk7XG4gIH1cblxuICBnZXQgYmFzZVBhdGggKCkge1xuICAgIGlmICh0aGlzLnVybC5wYXRoID09PSAnLycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsLnBhdGggfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGN1cnJlbnQgcnVubmluZyBXREEncyBzdGF0dXMgbGlrZSBiZWxvd1xuICAgKiB7XG4gICAqICAgXCJzdGF0ZVwiOiBcInN1Y2Nlc3NcIixcbiAgICogICBcIm9zXCI6IHtcbiAgICogICAgIFwibmFtZVwiOiBcImlPU1wiLFxuICAgKiAgICAgXCJ2ZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJzZGtWZXJzaW9uXCI6IFwiMTEuM1wiXG4gICAqICAgfSxcbiAgICogICBcImlvc1wiOiB7XG4gICAqICAgICBcInNpbXVsYXRvclZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcImlwXCI6IFwiMTcyLjI1NC45OS4zNFwiXG4gICAqICAgfSxcbiAgICogICBcImJ1aWxkXCI6IHtcbiAgICogICAgIFwidGltZVwiOiBcIkp1biAyNCAyMDE4IDE3OjA4OjIxXCIsXG4gICAqICAgICBcInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyXCI6IFwiY29tLmZhY2Vib29rLldlYkRyaXZlckFnZW50UnVubmVyXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgY29uc3Qgbm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkoe1xuICAgICAgc2VydmVyOiB0aGlzLnVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHRoaXMudXJsLnBvcnQsXG4gICAgICBiYXNlOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgdGltZW91dDogMzAwMCxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5vU2Vzc2lvblByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV0RBIGlzIG5vdCBsaXN0ZW5pbmcgYXQgJyR7dGhpcy51cmwuaHJlZn0nYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIFdEQXMgZnJvbSB0aGUgdGVzdCBkZXZpY2UuXG4gICAqIE92ZXIgWGNvZGUgMTEsIG11bHRpcGxlIFdEQSBjYW4gYmUgaW4gdGhlIGRldmljZSBzaW5jZSBYY29kZSAxMSBnZW5lcmF0ZXMgZGlmZmVyZW50IFdEQS5cbiAgICogQXBwaXVtIGRvZXMgbm90IGV4cGVjdCBtdWx0aXBsZSBXREFzIGFyZSBydW5uaW5nIG9uIGEgZGV2aWNlLlxuICAgKi9cbiAgYXN5bmMgdW5pbnN0YWxsICgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYnVuZGxlSWRzID0gYXdhaXQgdGhpcy5kZXZpY2UuZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZShXREFfQ0ZfQlVORExFX05BTUUpO1xuICAgICAgaWYgKF8uaXNFbXB0eShidW5kbGVJZHMpKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBXREFzIG9uIHRoZSBkZXZpY2UuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYFVuaW5zdGFsbGluZyBXREFzOiAnJHtidW5kbGVJZHN9J2ApO1xuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBidW5kbGVJZHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZXZpY2UucmVtb3ZlQXBwKGJ1bmRsZUlkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlKTtcbiAgICAgIHRoaXMubG9nLndhcm4oYFdlYkRyaXZlckFnZW50IHVuaW5zdGFsbCBmYWlsZWQuIFBlcmhhcHMsIGl0IGlzIGFscmVhZHkgdW5pbnN0YWxsZWQ/IGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9jbGVhbnVwUHJvamVjdElmRnJlc2ggKCkge1xuICAgIGNvbnN0IGhvbWVGb2xkZXIgPSBwcm9jZXNzLmVudi5IT01FO1xuICAgIGlmICghaG9tZUZvbGRlcikge1xuICAgICAgdGhpcy5sb2cuaW5mbygnVGhlIEhPTUUgZm9sZGVyIHBhdGggY2Fubm90IGJlIGRldGVybWluZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgcGFja2FnZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlciwgV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgpO1xuICAgIGNvbnN0IGRpZFRpbWVzdGFtcEV4aXN0ID0gYXdhaXQgZnMuZXhpc3RzKHRpbWVzdGFtcFBhdGgpO1xuICAgIGlmIChkaWRUaW1lc3RhbXBFeGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHRpbWVzdGFtcFBhdGgsIGZzLldfT0spO1xuICAgICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgc291cmNlcyBjbGVhbnVwYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY2VudFVwZ3JhZGVUaW1lc3RhbXAgPSBwYXJzZUludChhd2FpdCBmcy5yZWFkRmlsZSh0aW1lc3RhbXBQYXRoLCAndXRmOCcpLCAxMCk7XG4gICAgICBpZiAoXy5pc0ludGVnZXIocmVjZW50VXBncmFkZVRpbWVzdGFtcCkpIHtcbiAgICAgICAgaWYgKHJlY2VudFVwZ3JhZGVUaW1lc3RhbXAgPj0gY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBXZWJEcml2ZXJBZ2VudCBkb2VzIG5vdCBuZWVkIGEgY2xlYW51cC4gVGhlIHNvdXJjZXMgYXJlIHVwIHRvIGRhdGUgYCArXG4gICAgICAgICAgICBgKCR7cmVjZW50VXBncmFkZVRpbWVzdGFtcH0gPj0gJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IHNvdXJjZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIGAgK1xuICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA8ICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVGhlIHJlY2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScgaXMgY29ycnVwdGVkLiBUcnlpbmcgdG8gZml4IGl0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUodGltZXN0YW1wUGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRpbWVzdGFtcFBhdGgsIGAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfWAsICd1dGY4Jyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU3RvcmVkIHRoZSByZWNlbnQgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0gYCArXG4gICAgICAgIGBhdCAnJHt0aW1lc3RhbXBQYXRofSdgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBVbmFibGUgdG8gY3JlYXRlIHRoZSByZWNlbnQgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGVyZSBpcyBubyBuZWVkIHRvIHBlcmZvcm0gdGhlIHByb2plY3QgY2xlYW51cC4gQSBmcmVzaCBpbnN0YWxsIGhhcyBiZWVuIGRldGVjdGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuU2tpcFhjb2RlYnVpbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5jbGVhblByb2plY3QoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcGVyZm9ybSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGNsZWFudXAuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoIFdEQSB3aXRoIHByZWluc3RhbGxlZCBwYWNrYWdlIHdpdGhvdXQgeGNvZGVidWlsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBMYXVuY2ggV0RBIGFuZCBlc3RhYmxpc2ggdGhlIHNlc3Npb24gd2l0aCB0aGlzIHNlc3Npb25JZFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICovXG4gIGFzeW5jIGxhdW5jaFdpdGhQcmVpbnN0YWxsZWRXREEoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgeGN0ZXN0RW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JULFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMuYnVuZGxlSWRGb3JYY3Rlc3RcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgeGN0ZXN0RW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlIHdpdGhvdXQgeGNvZGVidWlsZCcpO1xuICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50ID0gbmV3IFhjdGVzdCh0aGlzLmRldmljZS51ZGlkLCB0aGlzLmJ1bmRsZUlkRm9yWGN0ZXN0LCBudWxsLCB7ZW52OiB4Y3Rlc3RFbnZ9KTtcblxuICAgIGF3YWl0IHRoaXMueGN0ZXN0QXBpQ2xpZW50LnN0YXJ0KCk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBjdXJyZW50IHJ1bm5pbmcgV0RBJ3Mgc3RhdHVzIGxpa2UgYmVsb3cgYWZ0ZXIgbGF1bmNoaW5nIFdEQVxuICAgKiB7XG4gICAqICAgXCJzdGF0ZVwiOiBcInN1Y2Nlc3NcIixcbiAgICogICBcIm9zXCI6IHtcbiAgICogICAgIFwibmFtZVwiOiBcImlPU1wiLFxuICAgKiAgICAgXCJ2ZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJzZGtWZXJzaW9uXCI6IFwiMTEuM1wiXG4gICAqICAgfSxcbiAgICogICBcImlvc1wiOiB7XG4gICAqICAgICBcInNpbXVsYXRvclZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcImlwXCI6IFwiMTcyLjI1NC45OS4zNFwiXG4gICAqICAgfSxcbiAgICogICBcImJ1aWxkXCI6IHtcbiAgICogICAgIFwidGltZVwiOiBcIkp1biAyNCAyMDE4IDE3OjA4OjIxXCIsXG4gICAqICAgICBcInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyXCI6IFwiY29tLmZhY2Vib29rLldlYkRyaXZlckFnZW50UnVubmVyXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBMYXVuY2ggV0RBIGFuZCBlc3RhYmxpc2ggdGhlIHNlc3Npb24gd2l0aCB0aGlzIHNlc3Npb25JZFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgbGF1bmNoIChzZXNzaW9uSWQpIHtcbiAgICBpZiAodGhpcy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgcHJvdmlkZWQgV2ViZHJpdmVyQWdlbnQgYXQgJyR7dGhpcy53ZWJEcml2ZXJBZ2VudFVybH0nYCk7XG4gICAgICB0aGlzLnVybCA9IHRoaXMud2ViRHJpdmVyQWdlbnRVcmw7XG4gICAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBKSB7XG4gICAgICBpZiAodGhpcy5pc1JlYWxEZXZpY2UpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubGF1bmNoV2l0aFByZWluc3RhbGxlZFdEQShzZXNzaW9uSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VQcmVpbnN0YWxsZWRXREEgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIGEgcmVhbCBkZXZpY2UuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbygnTGF1bmNoaW5nIFdlYkRyaXZlckFnZW50IG9uIHRoZSBkZXZpY2UnKTtcblxuICAgIHRoaXMuc2V0dXBQcm94aWVzKHNlc3Npb25JZCk7XG5cbiAgICBpZiAoIXRoaXMudXNlWGN0ZXN0cnVuRmlsZSAmJiAhYXdhaXQgZnMuZXhpc3RzKHRoaXMuYWdlbnRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcnlpbmcgdG8gdXNlIFdlYkRyaXZlckFnZW50IHByb2plY3QgYXQgJyR7dGhpcy5hZ2VudFBhdGh9JyBidXQgdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICdmaWxlIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgfVxuXG4gICAgLy8gdXNlWGN0ZXN0cnVuRmlsZSBhbmQgdXNlUHJlYnVpbHRXREEgdXNlIGV4aXN0aW5nIGRlcGVuZGVuY2llc1xuICAgIC8vIEl0IGRlcGVuZHMgb24gdXNlciBzaWRlXG4gICAgaWYgKHRoaXMuaWRiIHx8IHRoaXMudXNlWGN0ZXN0cnVuRmlsZSB8fCAodGhpcy5kZXJpdmVkRGF0YVBhdGggJiYgdGhpcy51c2VQcmVidWlsdFdEQSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1NraXBwZWQgV0RBIHByb2plY3QgY2xlYW51cCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNhcGFiaWxpdGllcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW5jaHJvbml6YXRpb25LZXkgPSBwYXRoLm5vcm1hbGl6ZSh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgICAgYXdhaXQgU0hBUkVEX1JFU09VUkNFU19HVUFSRC5hY3F1aXJlKHN5bmNocm9uaXphdGlvbktleSxcbiAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fY2xlYW51cFByb2plY3RJZkZyZXNoKCkpO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gcHJvdmlkZSBXREEgbG9jYWwgcG9ydCwgYmVjYXVzZSBpdCBtaWdodCBiZSBvY2N1cGllZFxuICAgIGF3YWl0IHJlc2V0VGVzdFByb2Nlc3Nlcyh0aGlzLmRldmljZS51ZGlkLCAhdGhpcy5pc1JlYWxEZXZpY2UpO1xuXG4gICAgaWYgKHRoaXMuaWRiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydFdpdGhJREIoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuaW5pdCh0aGlzLm5vU2Vzc2lvblByb3h5KTtcblxuICAgIC8vIFN0YXJ0IHRoZSB4Y29kZWJ1aWxkIHByb2Nlc3NcbiAgICBpZiAodGhpcy5wcmVidWlsZFdEQSkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnByZWJ1aWxkKCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuc3RhcnQoKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2l0aElEQiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnV2lsbCBsYXVuY2ggV0RBIHdpdGggaWRiIGluc3RlYWQgb2YgeGNvZGVidWlsZCBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyBmbGFnIGlzIGVuYWJsZWQnKTtcbiAgICBjb25zdCB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZH0gPSBhd2FpdCB0aGlzLnByZXBhcmVXREEoKTtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICBVU0VfUE9SVDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkLFxuICAgIH07XG4gICAgaWYgKHRoaXMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBlbnYuTUpQRUdfU0VSVkVSX1BPUlQgPSB0aGlzLm1qcGVnU2VydmVyUG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGIucnVuWENVSVRlc3Qod2RhQnVuZGxlSWQsIHdkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHtlbnZ9KTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlQnVuZGxlSWQgKHdkYUJ1bmRsZVBhdGgpIHtcbiAgICBjb25zdCBpbmZvUGxpc3RQYXRoID0gcGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdJbmZvLnBsaXN0Jyk7XG4gICAgY29uc3QgaW5mb1BsaXN0ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdChhd2FpdCBmcy5yZWFkRmlsZShpbmZvUGxpc3RQYXRoKSk7XG4gICAgaWYgKCFpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGJ1bmRsZSBpZCBpbiAnJHtpbmZvUGxpc3RQYXRofSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm9QbGlzdC5DRkJ1bmRsZUlkZW50aWZpZXI7XG4gIH1cblxuICBhc3luYyBwcmVwYXJlV0RBICgpIHtcbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRoID0gdGhpcy53ZGFCdW5kbGVQYXRoIHx8IGF3YWl0IHRoaXMuZmV0Y2hXREFCdW5kbGUoKTtcbiAgICBjb25zdCB3ZGFCdW5kbGVJZCA9IGF3YWl0IHRoaXMucGFyc2VCdW5kbGVJZCh3ZGFCdW5kbGVQYXRoKTtcbiAgICBpZiAoIWF3YWl0IHRoaXMuZGV2aWNlLmlzQXBwSW5zdGFsbGVkKHdkYUJ1bmRsZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZXZpY2UuaW5zdGFsbEFwcCh3ZGFCdW5kbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgdGVzdEJ1bmRsZUlkID0gYXdhaXQgdGhpcy5pZGIuaW5zdGFsbFhDVGVzdEJ1bmRsZShwYXRoLmpvaW4od2RhQnVuZGxlUGF0aCwgJ1BsdWdJbnMnLCAnV2ViRHJpdmVyQWdlbnRSdW5uZXIueGN0ZXN0JykpO1xuICAgIHJldHVybiB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZCwgd2RhQnVuZGxlUGF0aH07XG4gIH1cblxuICBhc3luYyBmZXRjaFdEQUJ1bmRsZSAoKSB7XG4gICAgaWYgKCF0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJ1bmRsZVdEQVNpbSh0aGlzLnhjb2RlYnVpbGQpO1xuICAgIH1cbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRocyA9IGF3YWl0IGZzLmdsb2IoYCR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9LyoqLyoke1dEQV9SVU5ORVJfQVBQfS9gLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAoXy5pc0VtcHR5KHdkYUJ1bmRsZVBhdGhzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgV0RBIGJ1bmRsZSBpbiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiB3ZGFCdW5kbGVQYXRoc1swXTtcbiAgfVxuXG4gIGFzeW5jIGlzU291cmNlRnJlc2ggKCkge1xuICAgIGNvbnN0IGV4aXN0c1Byb21pc2VzID0gW1xuICAgICAgJ1Jlc291cmNlcycsXG4gICAgICBgUmVzb3VyY2VzJHtwYXRoLnNlcH1XZWJEcml2ZXJBZ2VudC5idW5kbGVgLFxuICAgIF0ubWFwKChzdWJQYXRoKSA9PiBmcy5leGlzdHMocGF0aC5yZXNvbHZlKHRoaXMuYm9vdHN0cmFwUGF0aCwgc3ViUGF0aCkpKTtcbiAgICByZXR1cm4gKGF3YWl0IEIuYWxsKGV4aXN0c1Byb21pc2VzKSkuc29tZSgodikgPT4gdiA9PT0gZmFsc2UpO1xuICB9XG5cbiAgc2V0dXBQcm94aWVzIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBsb2c6IHRoaXMubG9nLFxuICAgICAgc2VydmVyOiB0aGlzLnVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHRoaXMudXJsLnBvcnQsXG4gICAgICBiYXNlOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgdGltZW91dDogdGhpcy53ZGFDb25uZWN0aW9uVGltZW91dCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLmp3cHJveHkuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuXG4gICAgdGhpcy5ub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eShwcm94eU9wdHMpO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgaWYgKHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBKSB7XG4gICAgICBpZiAodGhpcy54Y3Rlc3RBcGlDbGllbnQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU3RvcHBpbmcgdGhlIFhDVGVzdCBzZXNzaW9uJyk7XG4gICAgICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50LnN0b3AoKTtcbiAgICAgICAgdGhpcy54Y3Rlc3RBcGlDbGllbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biBzdWItcHJvY2Vzc2VzJyk7XG4gICAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucXVpdCgpO1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJlc2V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdEbyBub3Qgc3RvcCB4Y29kZWJ1aWxkIG5vciBYQ1Rlc3Qgc2Vzc2lvbiAnICtcbiAgICAgICAgJ3NpbmNlIHRoZSBXREEgc2Vzc2lvbiBpcyBtYW5hZ2VkIGJ5IG91dHNpZGUgdGhpcyBkcml2ZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuandwcm94eSkge1xuICAgICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgLy8gaWYgd2UgcG9wdWxhdGVkIHRoZSB1cmwgb3Vyc2VsdmVzIChkdXJpbmcgYHNldHVwQ2FjaGluZ2AgY2FsbCwgZm9yIGluc3RhbmNlKVxuICAgICAgLy8gdGhlbiBjbGVhbiB0aGF0IHVwLiBJZiB0aGUgdXJsIHdhcyBzdXBwbGllZCwgd2Ugd2FudCB0byBrZWVwIGl0XG4gICAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgICAgICBjb25zdCB7cHJvdG9jb2wsIGhvc3RuYW1lfSA9IHVybC5wYXJzZSh0aGlzLndkYUJhc2VVcmwgfHwgV0RBX0JBU0VfVVJMKTtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX06JHtwb3J0fWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgc2V0IHVybCAoX3VybCkge1xuICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShfdXJsKTtcbiAgfVxuXG4gIGdldCBmdWxseVN0YXJ0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0ZWQ7XG4gIH1cblxuICBzZXQgZnVsbHlTdGFydGVkIChzdGFydGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnN0YXJ0ZWQgPSBzdGFydGVkO1xuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmNhblNraXBYY29kZWJ1aWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXVzZSBydW5uaW5nIFdEQSBpZiBpdCBoYXMgdGhlIHNhbWUgYnVuZGxlIGlkIHdpdGggdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBPciByZXVzZSBpdCBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgaWQgd2l0aG91dCB1cGRhdGVkV0RBQnVuZGxlSWQuXG4gICAqIFVuaW5zdGFsbCBpdCBpZiB0aGUgbWV0aG9kIGZhY2VzIGFuIGV4Y2VwdGlvbiBmb3IgdGhlIGFib3ZlIHNpdHVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVwZGF0ZWRXREFCdW5kbGVJZCBCdW5kbGVJZCB5b3UnZCBsaWtlIHRvIHVzZVxuICAgKi9cbiAgYXN5bmMgc2V0dXBDYWNoaW5nICgpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIGlmICghc3RhdHVzIHx8ICFzdGF0dXMuYnVpbGQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdXREEgaXMgY3VycmVudGx5IG5vdCBydW5uaW5nLiBUaGVyZSBpcyBub3RoaW5nIHRvIGNhY2hlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIsXG4gICAgICB1cGdyYWRlZEF0LFxuICAgIH0gPSBzdGF0dXMuYnVpbGQ7XG4gICAgLy8gZm9yIHJlYWwgZGV2aWNlXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmIHV0aWwuaGFzVmFsdWUodGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpICYmIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkICE9PSBwcm9kdWN0QnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCBidW5kbGUgaWQuIFRoZSBhY3R1YWwgdmFsdWUgaXMgJyR7cHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJ9Jy5gKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICAgIH1cbiAgICAvLyBmb3Igc2ltdWxhdG9yXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmICF1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiBXREFfUlVOTkVSX0JVTkRMRV9JRCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0cyBidW5kbGUgaWQgaXMgbm90IGVxdWFsIHRvIHRoZSBkZWZhdWx0IHZhbHVlICR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9YCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudGx5IGJ1bmRsZWQgV0RBOiAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFVwZ3JhZGUgdGltZXN0YW1wIG9mIHRoZSBXREEgb24gdGhlIGRldmljZTogJHt1cGdyYWRlZEF0fWApO1xuICAgIGlmIChhY3R1YWxVcGdyYWRlVGltZXN0YW1wICYmIHVwZ3JhZGVkQXQgJiYgXy50b0xvd2VyKGAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCkgIT09IF8udG9Mb3dlcihgJHt1cGdyYWRlZEF0fWApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdCBoYXMgZGlmZmVyZW50IHZlcnNpb24gaW4gY29tcGFyaXNvbiB0byB0aGUgb25lICcgK1xuICAgICAgICBgd2hpY2ggaXMgYnVuZGxlZCB3aXRoIGFwcGl1bS14Y3VpdGVzdC1kcml2ZXIgbW9kdWxlICgke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9ICE9ICR7dXBncmFkZWRBdH0pYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gdXRpbC5oYXNWYWx1ZShwcm9kdWN0QnVuZGxlSWRlbnRpZmllcilcbiAgICAgID8gYFdpbGwgcmV1c2UgcHJldmlvdXNseSBjYWNoZWQgV0RBIGluc3RhbmNlIGF0ICcke3RoaXMudXJsLmhyZWZ9JyB3aXRoICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfSdgXG4gICAgICA6IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfSdgO1xuICAgIHRoaXMubG9nLmluZm8oYCR7bWVzc2FnZX0uIFNldCB0aGUgd2RhTG9jYWxQb3J0IGNhcGFiaWxpdHkgdG8gYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSAke3RoaXMudXJsLnBvcnR9IGlmIHRoaXMgaXMgYW4gdW5kZXNpcmVkIGJlaGF2aW9yLmApO1xuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSB0aGlzLnVybC5ocmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aXQgYW5kIHVuaW5zdGFsbCBydW5uaW5nIFdEQS5cbiAgICovXG4gIGFzeW5jIHF1aXRBbmRVbmluc3RhbGwgKCkge1xuICAgIGF3YWl0IHRoaXMucXVpdCgpO1xuICAgIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV2ViRHJpdmVyQWdlbnQ7XG5leHBvcnQgeyBXZWJEcml2ZXJBZ2VudCB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLE1BQUEsR0FBQVIsT0FBQTtBQUdBLElBQUFTLFdBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFVBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLGFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGtCQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxVQUFBLEdBQUFiLE9BQUE7QUFJQSxJQUFBYyxnQkFBQSxHQUFBZCxPQUFBO0FBRUEsTUFBTWUsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDcEMsTUFBTUMsY0FBYyxHQUFHLElBQUk7QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsNkJBQTZCO0FBQ3hELE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGtCQUFTLENBQUMsQ0FBQztBQUU5QyxNQUFNQyxjQUFjLENBQUM7RUFDbkJDLFdBQVdBLENBQUVDLFlBQVksRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFQyxHQUFHLEdBQUcsSUFBSSxFQUFFO0lBQ2hELElBQUksQ0FBQ0YsWUFBWSxHQUFHQSxZQUFZO0lBRWhDLElBQUksQ0FBQ0MsSUFB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
@@ -1 +1 @@
1
- {"version":3,"file":"webdriveragent.js","names":["_lodash","_interopRequireDefault","require","_path","_url2","_bluebird","_baseDriver","_support","_logger","_noSessionProxy","_utils","_xcodebuild","_asyncLock","_teen_process","_checkDependencies","_constants","_appiumIosDevice","WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","usePreinstalledWDA","xctestApiClient","xcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","bundleIdForXctest","WDA_RUNNER_BUNDLE_ID_FOR_XCTEST","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","homeFolder","process","env","HOME","currentUpgradeTimestamp","getWDAUpgradeTimestamp","isInteger","timestampPath","WDA_UPGRADE_TIMESTAMP_PATH","didTimestampExist","fs","exists","access","W_OK","ign","recentUpgradeTimestamp","parseInt","readFile","mkdirp","dirname","writeFile","cleanProject","launchWithPreinstalledWDA","sessionId","xctestEnv","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","Xctest","start","setupProxies","status","launch","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","wdaBundleId","testBundleId","prepareWDA","runXCUITest","parseBundleId","infoPlistPath","join","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","stop","reset","_url","parse","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","build","productBundleIdentifier","upgradedAt","util","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","toLower","quitAndUninstall","exports","_default","default"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from '@appium/base-driver';\nimport { fs, util, plist, mkdirp } from '@appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_BUNDLE_ID_FOR_XCTEST, WDA_RUNNER_APP,\n WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,\n} from './constants';\nimport {Xctest} from 'appium-ios-device';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.usePreinstalledWDA = args.usePreinstalledWDA;\n this.xctestApiClient = null;\n\n // FIXME: maybe 'this.webDriverAgentUrl' also can ignore\n // the xcodebuild instance itself.\n\n this.xcodebuild = this.usePreinstalledWDA\n ? null\n : new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n /**\n *\n * @returns {string} Bundle ID for Xctest.\n */\n get bundleIdForXctest () {\n return `${this.updatedWDABundleId}.xctrunner` || WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n const homeFolder = process.env.HOME;\n if (!homeFolder) {\n this.log.info('The HOME folder path cannot be determined');\n return;\n }\n\n const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();\n if (!_.isInteger(currentUpgradeTimestamp)) {\n this.log.info('It is impossible to determine the timestamp of the package');\n return;\n }\n\n const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);\n const didTimestampExist = await fs.exists(timestampPath);\n if (didTimestampExist) {\n try {\n await fs.access(timestampPath, fs.W_OK);\n } catch (ign) {\n this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +\n `Skipping sources cleanup`);\n return;\n }\n const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);\n if (_.isInteger(recentUpgradeTimestamp)) {\n if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {\n this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +\n `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);\n return;\n }\n this.log.info(`WebDriverAgent sources have been upgraded ` +\n `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);\n } else {\n this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);\n }\n }\n\n try {\n await mkdirp(path.dirname(timestampPath));\n await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');\n this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +\n `at '${timestampPath}'`);\n } catch (e) {\n this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +\n `Original error: ${e.message}`);\n return;\n }\n\n if (!didTimestampExist) {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n return;\n }\n\n if (this.usePreinstalledWDA) {\n return;\n }\n try {\n await this.xcodebuild.cleanProject();\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Launch WDA with preinstalled package without xcodebuild.\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n */\n async launchWithPreinstalledWDA(sessionId) {\n const xctestEnv = {\n USE_PORT: this.wdaLocalPort || WDA_AGENT_PORT,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.bundleIdForXctest\n };\n if (this.mjpegServerPort) {\n xctestEnv.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n this.log.info('Launching WebDriverAgent on the device without xcodebuild');\n this.xctestApiClient = new Xctest(this.device.udid, this.bundleIdForXctest, null, {env: xctestEnv});\n\n await this.xctestApiClient.start();\n\n this.setupProxies(sessionId);\n const status = await this.getStatus();\n this.started = true;\n return status;\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n if (this.usePreinstalledWDA) {\n if (this.isRealDevice) {\n return await this.launchWithPreinstalledWDA(sessionId);\n }\n throw new Error('usePreinstalledWDA is available only for a real device.');\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n if (this.usePreinstalledWDA) {\n if (this.xctestApiClient) {\n this.log.info('Stopping the XCTest session');\n this.xctestApiClient.stop();\n this.xctestApiClient = null;\n }\n } else {\n this.log.info('Shutting down sub-processes');\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n }\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n if (this.usePreinstalledWDA) {\n return;\n }\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":"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"}
1
+ {"version":3,"file":"webdriveragent.js","names":["_lodash","_interopRequireDefault","require","_path","_url2","_bluebird","_baseDriver","_support","_logger","_noSessionProxy","_utils","_xcodebuild","_asyncLock","_teen_process","_checkDependencies","_constants","_appiumIosDevice","WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","usePreinstalledWDA","xctestApiClient","xcodebuild","canSkipXcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","bundleIdForXctest","WDA_RUNNER_BUNDLE_ID_FOR_XCTEST","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","homeFolder","process","env","HOME","currentUpgradeTimestamp","getWDAUpgradeTimestamp","isInteger","timestampPath","WDA_UPGRADE_TIMESTAMP_PATH","didTimestampExist","fs","exists","access","W_OK","ign","recentUpgradeTimestamp","parseInt","readFile","mkdirp","dirname","writeFile","cleanProject","launchWithPreinstalledWDA","sessionId","xctestEnv","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","Xctest","start","setupProxies","status","launch","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","wdaBundleId","testBundleId","prepareWDA","runXCUITest","parseBundleId","infoPlistPath","join","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","stop","reset","_url","parse","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","build","productBundleIdentifier","upgradedAt","util","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","toLower","quitAndUninstall","exports","_default","default"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from '@appium/base-driver';\nimport { fs, util, plist, mkdirp } from '@appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_BUNDLE_ID_FOR_XCTEST, WDA_RUNNER_APP,\n WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,\n} from './constants';\nimport {Xctest} from 'appium-ios-device';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n // this.args.webDriverAgentUrl guiarantees the capabilities acually\n // gave 'appium:webDriverAgentUrl' but 'this.webDriverAgentUrl'\n // could be used for caching WDA with xcodebuild.\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.usePreinstalledWDA = args.usePreinstalledWDA;\n this.xctestApiClient = null;\n\n this.xcodebuild = this.canSkipXcodebuild\n ? null\n : new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n /**\n * Return true if the session does not need xcodebuild.\n * @returns {boolean} Whether the session needs/has xcodebuild.\n */\n get canSkipXcodebuild () {\n // Use this.args.webDriverAgentUrl to guarantee\n // the capabilities set gave the `appium:webDriverAgentUrl`.\n return this.usePreinstalledWDA || this.args.webDriverAgentUrl;\n }\n\n /**\n *\n * @returns {string} Bundle ID for Xctest.\n */\n get bundleIdForXctest () {\n return this.updatedWDABundleId ? `${this.updatedWDABundleId}.xctrunner` : WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n const homeFolder = process.env.HOME;\n if (!homeFolder) {\n this.log.info('The HOME folder path cannot be determined');\n return;\n }\n\n const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();\n if (!_.isInteger(currentUpgradeTimestamp)) {\n this.log.info('It is impossible to determine the timestamp of the package');\n return;\n }\n\n const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);\n const didTimestampExist = await fs.exists(timestampPath);\n if (didTimestampExist) {\n try {\n await fs.access(timestampPath, fs.W_OK);\n } catch (ign) {\n this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +\n `Skipping sources cleanup`);\n return;\n }\n const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);\n if (_.isInteger(recentUpgradeTimestamp)) {\n if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {\n this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +\n `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);\n return;\n }\n this.log.info(`WebDriverAgent sources have been upgraded ` +\n `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);\n } else {\n this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);\n }\n }\n\n try {\n await mkdirp(path.dirname(timestampPath));\n await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');\n this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +\n `at '${timestampPath}'`);\n } catch (e) {\n this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +\n `Original error: ${e.message}`);\n return;\n }\n\n if (!didTimestampExist) {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n return;\n }\n\n if (this.canSkipXcodebuild) {\n return;\n }\n try {\n await this.xcodebuild.cleanProject();\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Launch WDA with preinstalled package without xcodebuild.\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n */\n async launchWithPreinstalledWDA(sessionId) {\n const xctestEnv = {\n USE_PORT: this.wdaLocalPort || WDA_AGENT_PORT,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.bundleIdForXctest\n };\n if (this.mjpegServerPort) {\n xctestEnv.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n this.log.info('Launching WebDriverAgent on the device without xcodebuild');\n this.xctestApiClient = new Xctest(this.device.udid, this.bundleIdForXctest, null, {env: xctestEnv});\n\n await this.xctestApiClient.start();\n\n this.setupProxies(sessionId);\n const status = await this.getStatus();\n this.started = true;\n return status;\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n if (this.usePreinstalledWDA) {\n if (this.isRealDevice) {\n return await this.launchWithPreinstalledWDA(sessionId);\n }\n throw new Error('usePreinstalledWDA is available only for a real device.');\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n if (this.usePreinstalledWDA) {\n if (this.xctestApiClient) {\n this.log.info('Stopping the XCTest session');\n this.xctestApiClient.stop();\n this.xctestApiClient = null;\n }\n } else if (!this.args.webDriverAgentUrl) {\n this.log.info('Shutting down sub-processes');\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n } else {\n this.log.debug('Do not stop xcodebuild nor XCTest session ' +\n 'since the WDA session is managed by outside this driver.');\n }\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n if (this.canSkipXcodebuild) {\n return;\n }\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":"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"}
@@ -48,6 +48,9 @@ class WebDriverAgent {
48
48
 
49
49
  this.prebuildWDA = args.prebuildWDA;
50
50
 
51
+ // this.args.webDriverAgentUrl guiarantees the capabilities acually
52
+ // gave 'appium:webDriverAgentUrl' but 'this.webDriverAgentUrl'
53
+ // could be used for caching WDA with xcodebuild.
51
54
  this.webDriverAgentUrl = args.webDriverAgentUrl;
52
55
 
53
56
  this.started = false;
@@ -64,10 +67,7 @@ class WebDriverAgent {
64
67
  this.usePreinstalledWDA = args.usePreinstalledWDA;
65
68
  this.xctestApiClient = null;
66
69
 
67
- // FIXME: maybe 'this.webDriverAgentUrl' also can ignore
68
- // the xcodebuild instance itself.
69
-
70
- this.xcodebuild = this.usePreinstalledWDA
70
+ this.xcodebuild = this.canSkipXcodebuild
71
71
  ? null
72
72
  : new XcodeBuild(this.xcodeVersion, this.device, {
73
73
  platformVersion: this.platformVersion,
@@ -96,12 +96,22 @@ class WebDriverAgent {
96
96
  }, this.log);
97
97
  }
98
98
 
99
+ /**
100
+ * Return true if the session does not need xcodebuild.
101
+ * @returns {boolean} Whether the session needs/has xcodebuild.
102
+ */
103
+ get canSkipXcodebuild () {
104
+ // Use this.args.webDriverAgentUrl to guarantee
105
+ // the capabilities set gave the `appium:webDriverAgentUrl`.
106
+ return this.usePreinstalledWDA || this.args.webDriverAgentUrl;
107
+ }
108
+
99
109
  /**
100
110
  *
101
111
  * @returns {string} Bundle ID for Xctest.
102
112
  */
103
113
  get bundleIdForXctest () {
104
- return `${this.updatedWDABundleId}.xctrunner` || WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;
114
+ return this.updatedWDABundleId ? `${this.updatedWDABundleId}.xctrunner` : WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;
105
115
  }
106
116
 
107
117
  setWDAPaths (bootstrapPath, agentPath) {
@@ -266,7 +276,7 @@ class WebDriverAgent {
266
276
  return;
267
277
  }
268
278
 
269
- if (this.usePreinstalledWDA) {
279
+ if (this.canSkipXcodebuild) {
270
280
  return;
271
281
  }
272
282
  try {
@@ -451,10 +461,13 @@ class WebDriverAgent {
451
461
  this.xctestApiClient.stop();
452
462
  this.xctestApiClient = null;
453
463
  }
454
- } else {
464
+ } else if (!this.args.webDriverAgentUrl) {
455
465
  this.log.info('Shutting down sub-processes');
456
466
  await this.xcodebuild.quit();
457
467
  await this.xcodebuild.reset();
468
+ } else {
469
+ this.log.debug('Do not stop xcodebuild nor XCTest session ' +
470
+ 'since the WDA session is managed by outside this driver.');
458
471
  }
459
472
 
460
473
  if (this.jwproxy) {
@@ -496,7 +509,7 @@ class WebDriverAgent {
496
509
  }
497
510
 
498
511
  async retrieveDerivedDataPath () {
499
- if (this.usePreinstalledWDA) {
512
+ if (this.canSkipXcodebuild) {
500
513
  return;
501
514
  }
502
515
  return await this.xcodebuild.retrieveDerivedDataPath();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-webdriveragent",
3
- "version": "4.15.0",
3
+ "version": "5.0.0",
4
4
  "description": "Package bundling WebDriverAgent",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {