appium-webdriveragent 4.13.1 → 4.14.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 +14 -0
- package/WebDriverAgentLib/Commands/FBCustomCommands.m +2 -0
- package/build/lib/check-dependencies.js +1 -1
- package/build/lib/check-dependencies.js.map +1 -1
- package/build/lib/constants.js +4 -2
- package/build/lib/constants.js.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webdriveragent.js +49 -5
- package/build/lib/webdriveragent.js.map +1 -1
- package/build/lib/xcodebuild.js +1 -1
- package/build/lib/xcodebuild.js.map +1 -1
- package/lib/constants.js +3 -1
- package/lib/webdriveragent.js +92 -30
- package/package.json +2 -1
package/build/lib/xcodebuild.js
CHANGED
|
@@ -315,4 +315,4 @@ class XcodeBuild {
|
|
|
315
315
|
exports.XcodeBuild = XcodeBuild;
|
|
316
316
|
var _default = XcodeBuild;
|
|
317
317
|
exports.default = _default;
|
|
318
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXN5bmNib3giLCJyZXF1aXJlIiwiX3RlZW5fcHJvY2VzcyIsIl9zdXBwb3J0IiwiX2xvZ2dlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYmx1ZWJpcmQiLCJfdXRpbHMiLCJfbG9kYXNoIiwiX3BhdGgiLCJfb3MiLCJfY29uc3RhbnRzIiwiREVGQVVMVF9TSUdOSU5HX0lEIiwiUFJFQlVJTERfREVMQVkiLCJSVU5ORVJfU0NIRU1FX0lPUyIsIkxJQl9TQ0hFTUVfSU9TIiwiRVJST1JfV1JJVElOR19BVFRBQ0hNRU5UIiwiRVJST1JfQ09QWUlOR19BVFRBQ0hNRU5UIiwiSUdOT1JFRF9FUlJPUlMiLCJSVU5ORVJfU0NIRU1FX1RWIiwiTElCX1NDSEVNRV9UViIsInhjb2RlTG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiWGNvZGVCdWlsZCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiZGV2aWNlIiwiYXJncyIsImxvZyIsImRlZmF1bHRMb2dnZXIiLCJyZWFsRGV2aWNlIiwiYWdlbnRQYXRoIiwiYm9vdHN0cmFwUGF0aCIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwicHJlYnVpbGRXREEiLCJ1c2VQcmVidWlsdFdEQSIsInVzZVNpbXBsZUJ1aWxkVGVzdCIsInVzZVhjdGVzdHJ1bkZpbGUiLCJsYXVuY2hUaW1lb3V0Iiwid2RhUmVtb3RlUG9ydCIsInVwZGF0ZWRXREFCdW5kbGVJZCIsImRlcml2ZWREYXRhUGF0aCIsIm1qcGVnU2VydmVyUG9ydCIsInByZWJ1aWxkRGVsYXkiLCJfIiwiaXNOdW1iZXIiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiaW5pdCIsIm5vU2Vzc2lvblByb3h5IiwiZGV2aXZlSW5mbyIsImlzUmVhbERldmljZSIsInVkaWQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsInNldFhjdGVzdHJ1bkZpbGUiLCJyZXNldFByb2plY3RGaWxlIiwidXBkYXRlUHJvamVjdEZpbGUiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsIl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlIiwic3Rkb3V0IiwiZXhlYyIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwicGF0dGVybiIsIm1hdGNoIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJkZWJ1ZyIsInBhdGgiLCJkaXJuYW1lIiwibm9ybWFsaXplIiwicmVzZXQiLCJwcmVidWlsZCIsInN0YXJ0IiwieGNvZGVidWlsZCIsIkIiLCJkZWxheSIsImNsZWFuUHJvamVjdCIsImxpYlNjaGVtZSIsImlzVHZPUyIsInJ1bm5lclNjaGVtZSIsInNjaGVtZSIsImdldENvbW1hbmQiLCJidWlsZE9ubHkiLCJjbWQiLCJidWlsZENtZCIsInRlc3RDbWQiLCJwdXNoIiwidmVyc2lvbk1hdGNoIiwiUmVnRXhwIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMiLCJjcmVhdGVTdWJQcm9jZXNzIiwic2V0UmVhbERldmljZVNlY3VyaXR5IiwiZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUiLCJqb2luIiwiT2JqZWN0IiwiYXNzaWduIiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiTUpQRUdfU0VSVkVSX1BPUlQiLCJ1cGdyYWRlVGltZXN0YW1wIiwiZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCIsIlVQR1JBREVfVElNRVNUQU1QIiwiU3ViUHJvY2VzcyIsImN3ZCIsImRldGFjaGVkIiwic3RkaW8iLCJsb2dYY29kZU91dHB1dCIsImxvZ01zZyIsImlzQm9vbGVhbiIsIm9uIiwic3RkZXJyIiwib3V0IiwiaW5jbHVkZXMiLCJsb2dMb2NhdGlvbiIsImZpcnN0IiwicmVtb3ZlIiwidHJpbSIsInNwbGl0IiwidiIsInN0YXJ0c1dpdGgiLCJzZXAiLCJpZ25vcmVFcnJvciIsInNvbWUiLCJ4IiwiX3dkYV9lcnJvcl9vY2N1cnJlZCIsImxpbmUiLCJFT0wiLCJlcnJvciIsIl93ZGFfZXJyb3JfbWVzc2FnZSIsInJlc29sdmUiLCJyZWplY3QiLCJjb2RlIiwic2lnbmFsIiwiZGF0YSIsImZzIiwicmVhZEZpbGUiLCJwcm9jZXNzRXhpdGVkIiwiRXJyb3IiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhdHVzIiwid2FpdEZvclN0YXJ0IiwibXNnIiwiY3VycmVudFN0YXR1cyIsInJldHJpZXMiLCJwYXJzZUludCIsInJldHJ5SW50ZXJ2YWwiLCJwcm94eVRpbWVvdXQiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImlvcyIsImlwIiwiYWdlbnRVcmwiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJxdWl0Iiwia2lsbFByb2Nlc3MiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlYnVpbGQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIHNldFJlYWxEZXZpY2VTZWN1cml0eSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsIHNldFhjdGVzdHJ1bkZpbGUsXG4gIHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBraWxsUHJvY2VzcyxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgaXNUdk9TIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5jb25zdCBERUZBVUxUX1NJR05JTkdfSUQgPSAnaVBob25lIERldmVsb3Blcic7XG5jb25zdCBQUkVCVUlMRF9ERUxBWSA9IDA7XG5jb25zdCBSVU5ORVJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcic7XG5jb25zdCBMSUJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudExpYic7XG5cbmNvbnN0IEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCA9ICdFcnJvciB3cml0aW5nIGF0dGFjaG1lbnQgZGF0YSB0byBmaWxlJztcbmNvbnN0IEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCA9ICdFcnJvciBjb3B5aW5nIHRlc3RpbmcgYXR0YWNobWVudCc7XG5jb25zdCBJR05PUkVEX0VSUk9SUyA9IFtcbiAgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5ULFxuICBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQsXG4gICdGYWlsZWQgdG8gcmVtb3ZlIHNjcmVlbnNob3QgYXQgcGF0aCcsXG5dO1xuXG5jb25zdCBSVU5ORVJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50UnVubmVyX3R2T1MnO1xuY29uc3QgTElCX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudExpYl90dk9TJztcblxuY29uc3QgeGNvZGVMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmNsYXNzIFhjb2RlQnVpbGQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBkZXZpY2UsIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcmV0cmlldmUgV0RBIGJ1aWxkIHNldHRpbmdzLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqQlVJTERfRElSXFxzKz1cXHMrKFxcLy4qKS9tO1xuICAgICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIFdEQSBidWlsZCBkaXIgZnJvbSAke18udHJ1bmNhdGUoc3Rkb3V0LCB7bGVuZ3RoOiAzMDB9KX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRlcml2ZWQgZGF0YSByb290OiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICAvLyBpZiBuZWNlc3NhcnksIHJlc2V0IHRoZSBidW5kbGVJZCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpIHtcbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZWJ1aWxkICgpIHtcbiAgICAvLyBmaXJzdCBkbyBhIGJ1aWxkIHBoYXNlXG4gICAgdGhpcy5sb2cuZGVidWcoJ1ByZS1idWlsZGluZyBXREEgYmVmb3JlIGxhdW5jaGluZyB0ZXN0Jyk7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5zdGFydCh0cnVlKTtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IG51bGw7XG5cbiAgICAvLyBwYXVzZSBhIG1vbWVudFxuICAgIGF3YWl0IEIuZGVsYXkodGhpcy5wcmVidWlsZERlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFuUHJvamVjdCAoKSB7XG4gICAgY29uc3QgbGliU2NoZW1lID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKSA/IExJQl9TQ0hFTUVfVFYgOiBMSUJfU0NIRU1FX0lPUztcbiAgICBjb25zdCBydW5uZXJTY2hlbWUgPSBpc1R2T1ModGhpcy5wbGF0Zm9ybU5hbWUpID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgW2xpYlNjaGVtZSwgcnVubmVyU2NoZW1lXSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goXG4gICAgICAgIGAke2lzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyAnVFYnIDogJ0lQSE9ORSd9T1NfREVQTE9ZTUVOVF9UQVJHRVQ9JHt2ZXJzaW9uTWF0Y2hbMV19LiR7dmVyc2lvbk1hdGNoWzJdfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwYXJzZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIGZyb20gcGxhdGZvcm1WZXJzaW9uIFwiJHt0aGlzLnBsYXRmb3JtVmVyc2lvbn1cIi4gYCArXG4gICAgICAgICdXaWxsIGJ1aWxkIGZvciB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBpbnN0ZWFkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhbERldmljZSAmJiB0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFVzaW5nIFhjb2RlIGNvbmZpZ3VyYXRpb24gZmlsZTogJyR7dGhpcy54Y29kZUNvbmZpZ0ZpbGV9J2ApO1xuICAgICAgYXJncy5wdXNoKCcteGNjb25maWcnLCB0aGlzLnhjb2RlQ29uZmlnRmlsZSk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9jZXNzLmVudi5BUFBJVU1fWENVSVRFU1RfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTKSB7XG4gICAgICAvLyBUaGlzIHNvbWV0aW1lcyBoZWxwcyB0byBzdXJ2aXZlIFhjb2RlIHVwZGF0ZXNcbiAgICAgIGFyZ3MucHVzaCgnR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUz0wJyk7XG4gICAgfVxuXG4gICAgLy8gQmVsb3cgb3B0aW9uIHNsaWdodGx5IHJlZHVjZXMgYnVpbGQgdGltZSBpbiBkZWJ1ZyBidWlsZFxuICAgIC8vIHdpdGggcHJldmVudGluZyB0byBnZW5lcmF0ZSBgL0luZGV4L0RhdGFTdG9yZWAgd2hpY2ggaXMgdXNlZCBieSBkZXZlbG9wbWVudFxuICAgIGFyZ3MucHVzaCgnQ09NUElMRVJfSU5ERVhfU1RPUkVfRU5BQkxFPU5PJyk7XG5cbiAgICByZXR1cm4ge2NtZCwgYXJnc307XG4gIH1cblxuICBhc3luYyBjcmVhdGVTdWJQcm9jZXNzIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy51c2VYY3Rlc3RydW5GaWxlICYmIHRoaXMucmVhbERldmljZSkge1xuICAgICAgaWYgKHRoaXMua2V5Y2hhaW5QYXRoICYmIHRoaXMua2V5Y2hhaW5QYXNzd29yZCkge1xuICAgICAgICBhd2FpdCBzZXRSZWFsRGV2aWNlU2VjdXJpdHkodGhpcy5rZXljaGFpblBhdGgsIHRoaXMua2V5Y2hhaW5QYXNzd29yZCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy54Y29kZU9yZ0lkICYmIHRoaXMueGNvZGVTaWduaW5nSWQgJiYgIXRoaXMueGNvZGVDb25maWdGaWxlKSB7XG4gICAgICAgIHRoaXMueGNvZGVDb25maWdGaWxlID0gYXdhaXQgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUodGhpcy54Y29kZU9yZ0lkLCB0aGlzLnhjb2RlU2lnbmluZ0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7Y21kLCBhcmdzfSA9IHRoaXMuZ2V0Q29tbWFuZChidWlsZE9ubHkpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBCZWdpbm5pbmcgJHtidWlsZE9ubHkgPyAnYnVpbGQnIDogJ3Rlc3QnfSB3aXRoIGNvbW1hbmQgJyR7Y21kfSAke2FyZ3Muam9pbignICcpfScgYCArXG4gICAgICBgaW4gZGlyZWN0b3J5ICcke3RoaXMuYm9vdHN0cmFwUGF0aH0nYCk7XG4gICAgY29uc3QgZW52ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIHtcbiAgICAgIFVTRV9QT1JUOiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICBXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUjogdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgfHwgV0RBX1JVTk5FUl9CVU5ETEVfSUQsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL1dlYkRyaXZlckFnZW50L3B1bGwvMTA1XG4gICAgICBlbnYuTUpQRUdfU0VSVkVSX1BPUlQgPSB0aGlzLm1qcGVnU2VydmVyUG9ydDtcbiAgICB9XG4gICAgY29uc3QgdXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICBpZiAodXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgZW52LlVQR1JBREVfVElNRVNUQU1QID0gdXBncmFkZVRpbWVzdGFtcDtcbiAgICB9XG4gICAgY29uc3QgeGNvZGVidWlsZCA9IG5ldyBTdWJQcm9jZXNzKGNtZCwgYXJncywge1xuICAgICAgY3dkOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICBlbnYsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcblxuICAgIGxldCBsb2dYY29kZU91dHB1dCA9ICEhdGhpcy5zaG93WGNvZGVMb2c7XG4gICAgY29uc3QgbG9nTXNnID0gXy5pc0Jvb2xlYW4odGhpcy5zaG93WGNvZGVMb2cpXG4gICAgICA/IGBPdXRwdXQgZnJvbSB4Y29kZWJ1aWxkICR7dGhpcy5zaG93WGNvZGVMb2cgPyAnd2lsbCcgOiAnd2lsbCBub3QnfSBiZSBsb2dnZWRgXG4gICAgICA6ICdPdXRwdXQgZnJvbSB4Y29kZWJ1aWxkIHdpbGwgb25seSBiZSBsb2dnZWQgaWYgYW55IGVycm9ycyBhcmUgcHJlc2VudCB0aGVyZSc7XG4gICAgdGhpcy5sb2cuZGVidWcoYCR7bG9nTXNnfS4gVG8gY2hhbmdlIHRoaXMsIHVzZSAnc2hvd1hjb2RlTG9nJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgICB4Y29kZWJ1aWxkLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGxldCBvdXQgPSBzdGRvdXQgfHwgc3RkZXJyO1xuICAgICAgLy8gd2Ugd2FudCB0byBwdWxsIG91dCB0aGUgbG9nIGZpbGUgdGhhdCBpcyBjcmVhdGVkLCBhbmQgaGlnaGxpZ2h0IGl0XG4gICAgICAvLyBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlc1xuICAgICAgaWYgKG91dC5pbmNsdWRlcygnV3JpdGluZyBkaWFnbm9zdGljIGxvZyBmb3IgdGVzdCBzZXNzaW9uIHRvJykpIHtcbiAgICAgICAgLy8gcHVsbCBvdXQgdGhlIGZpcnN0IGxpbmUgdGhhdCBiZWdpbnMgd2l0aCB0aGUgcGF0aCBzZXBhcmF0b3JcbiAgICAgICAgLy8gd2hpY2ggKnNob3VsZCogYmUgdGhlIGxpbmUgaW5kaWNhdGluZyB0aGUgbG9nIGZpbGUgZ2VuZXJhdGVkXG4gICAgICAgIHhjb2RlYnVpbGQubG9nTG9jYXRpb24gPSBfLmZpcnN0KF8ucmVtb3ZlKG91dC50cmltKCkuc3BsaXQoJ1xcbicpLCAodikgPT4gdi5zdGFydHNXaXRoKHBhdGguc2VwKSkpO1xuICAgICAgICB4Y29kZUxvZy5kZWJ1ZyhgTG9nIGZpbGUgZm9yIHhjb2RlYnVpbGQgdGVzdDogJHt4Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBoYXZlIGFuIGVycm9yIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBsb2dzXG4gICAgICAvLyBvdGhlcndpc2UgdGhlIGZhaWx1cmUgaXMgaW5zY3J1dGlibGVcbiAgICAgIC8vIGJ1dCBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgY29uc3QgaWdub3JlRXJyb3IgPSBJR05PUkVEX0VSUk9SUy5zb21lKCh4KSA9PiBvdXQuaW5jbHVkZXMoeCkpO1xuICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICE9PSBmYWxzZSAmJiBvdXQuaW5jbHVkZXMoJ0Vycm9yIERvbWFpbj0nKSAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgbG9nWGNvZGVPdXRwdXQgPSB0cnVlO1xuXG4gICAgICAgIC8vIHRlcnJpYmxlIGhhY2sgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgeGNvZGUgcmV0dXJuIDAgYnV0IGlzIGZhaWxpbmdcbiAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gbm90IGxvZyBwZXJtaXNzaW9uIGVycm9ycyBmcm9tIHRyeWluZyB0byB3cml0ZSB0byBhdHRhY2htZW50cyBmb2xkZXJcbiAgICAgIGlmIChsb2dYY29kZU91dHB1dCAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdChFT0wpKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgIHhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlICs9IGAke0VPTH0ke2xpbmV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB4Y29kZWJ1aWxkO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgdGhpcy54Y29kZWJ1aWxkID0gYXdhaXQgdGhpcy5jcmVhdGVTdWJQcm9jZXNzKGJ1aWxkT25seSk7XG4gICAgLy8gU3RvcmUgeGNvZGVidWlsZCBtZXNzYWdlXG4gICAgdGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZSA9ICcnO1xuXG4gICAgLy8gd3JhcCB0aGUgc3RhcnQgcHJvY2VkdXJlIGluIGEgcHJvbWlzZSBzbyB0aGF0IHdlIGNhbiBjYXRjaCwgYW5kIHJlcG9ydCxcbiAgICAvLyBhbnkgc3RhcnR1cCBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGFzIGV2ZW50c1xuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnhjb2RlYnVpbGQub24oJ2V4aXQnLCBhc3luYyAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHhjb2RlTG9nLmVycm9yKGB4Y29kZWJ1aWxkIGV4aXRlZCB3aXRoIGNvZGUgJyR7Y29kZX0nIGFuZCBzaWduYWwgJyR7c2lnbmFsfSdgKTtcbiAgICAgICAgLy8gcHJpbnQgb3V0IHRoZSB4Y29kZWJ1aWxkIGZpbGUgaWYgdXNlcnMgaGF2ZSBhc2tlZCBmb3IgaXRcbiAgICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICYmIHRoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbikge1xuICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGBDb250ZW50cyBvZiB4Y29kZWJ1aWxkIGxvZyBmaWxlICcke3RoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbn0nOmApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbiwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgZGF0YS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB4Y29kZUxvZy5lcnJvcihgVW5hYmxlIHRvIGFjY2VzcyB4Y29kZWJ1aWxkIGxvZyBmaWxlOiAnJHtlcnIubWVzc2FnZX0nYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkIHx8ICghc2lnbmFsICYmIGNvZGUgIT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYHhjb2RlYnVpbGQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9JHtFT0x9YCArXG4gICAgICAgICAgICBgeGNvZGVidWlsZCBlcnJvciBtZXNzYWdlOiR7RU9MfSR7dGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YganVzdCBidWlsZGluZywgdGhlIHByb2Nlc3Mgd2lsbCBleGl0IGFuZCB0aGF0IGlzIG91ciBmaW5pc2hcbiAgICAgICAgaWYgKGJ1aWxkT25seSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgICAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5zdGFydCh0cnVlKTtcbiAgICAgICAgICBpZiAoIWJ1aWxkT25seSkge1xuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0KHRpbWVyKTtcbiAgICAgICAgICAgIHJlc29sdmUoc3RhdHVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxldCBtc2cgPSBgVW5hYmxlIHRvIHN0YXJ0IFdlYkRyaXZlckFnZW50OiAke2Vycn1gO1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JTdGFydCAodGltZXIpIHtcbiAgICAvLyB0cnkgdG8gY29ubmVjdCBvbmNlIGV2ZXJ5IDAuNSBzZWNvbmRzLCB1bnRpbCBgbGF1bmNoVGltZW91dGAgaXMgdXBcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3RoaXMubGF1bmNoVGltZW91dH1tcyBmb3IgV2ViRHJpdmVyQWdlbnQgdG8gc3RhcnRgKTtcbiAgICBsZXQgY3VycmVudFN0YXR1cyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXRyaWVzID0gcGFyc2VJbnQodGhpcy5sYXVuY2hUaW1lb3V0IC8gNTAwLCAxMCk7XG4gICAgICBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIDEwMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgLy8gdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgZWxzZXdoZXJlIGFuZCB3ZSBuZWVkIHRvIHNob3J0LWNpcmN1aXRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJveHlUaW1lb3V0ID0gdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0O1xuICAgICAgICB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQgPSAxMDAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGN1cnJlbnRTdGF0dXMgPSBhd2FpdCB0aGlzLm5vU2Vzc2lvblByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgJiYgY3VycmVudFN0YXR1cy5pb3MgJiYgY3VycmVudFN0YXR1cy5pb3MuaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWdlbnRVcmwgPSBjdXJyZW50U3RhdHVzLmlvcy5pcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYkRyaXZlckFnZW50IGluZm9ybWF0aW9uOmApO1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KGN1cnJlbnRTdGF0dXMsIG51bGwsIDIpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29ubmVjdCB0byBydW5uaW5nIFdlYkRyaXZlckFnZW50OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IHByb3h5VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICByZXR1cm4gY3VycmVudFN0YXR1cztcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYkRyaXZlckFnZW50IHN1Y2Nlc3NmdWxseSBzdGFydGVkIGFmdGVyICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCBpZiB3ZSBoYXZlIG5vdCBoYWQgYW55IGVycm9ycyBmcm9tIHhjb2RlIGl0c2VsZiAocmVwb3J0ZWRcbiAgICAgIC8vIGVsc2V3aGVyZSksIHdlIGNhbiBsZXQgdGhpcyBnbyB0aHJvdWdoIGFuZCB0cnkgdG8gY3JlYXRlIHRoZSBzZXNzaW9uXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlcnIubWVzc2FnZSk7XG4gICAgICB0aGlzLmxvZy53YXJuKGBHZXR0aW5nIHN0YXR1cyBvZiBXZWJEcml2ZXJBZ2VudCBvbiBkZXZpY2UgdGltZWQgb3V0LiBDb250aW51aW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgYXdhaXQga2lsbFByb2Nlc3MoJ3hjb2RlYnVpbGQnLCB0aGlzLnhjb2RlYnVpbGQpO1xuICB9XG59XG5cbmV4cG9ydCB7IFhjb2RlQnVpbGQgfTtcbmV4cG9ydCBkZWZhdWx0IFhjb2RlQnVpbGQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssU0FBQSxHQUFBRCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBSUEsSUFBQU8sT0FBQSxHQUFBSCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVEsS0FBQSxHQUFBSixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVMsR0FBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBVixPQUFBO0FBR0EsTUFBTVcsa0JBQWtCLEdBQUcsa0JBQWtCO0FBQzdDLE1BQU1DLGNBQWMsR0FBRyxDQUFDO0FBQ3hCLE1BQU1DLGlCQUFpQixHQUFHLHNCQUFzQjtBQUNoRCxNQUFNQyxjQUFjLEdBQUcsbUJBQW1CO0FBRTFDLE1BQU1DLHdCQUF3QixHQUFHLHVDQUF1QztBQUN4RSxNQUFNQyx3QkFBd0IsR0FBRyxrQ0FBa0M7QUFDbkUsTUFBTUMsY0FBYyxHQUFHLENBQ3JCRix3QkFBd0IsRUFDeEJDLHdCQUF3QixFQUN4QixxQ0FBcUMsQ0FDdEM7QUFFRCxNQUFNRSxnQkFBZ0IsR0FBRywyQkFBMkI7QUFDcEQsTUFBTUMsYUFBYSxHQUFHLHdCQUF3QjtBQUU5QyxNQUFNQyxRQUFRLEdBQUdDLGVBQU0sQ0FBQ0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztBQUcxQyxNQUFNQyxVQUFVLENBQUM7RUFDZkMsV0FBV0EsQ0FBRUMsWUFBWSxFQUFFQyxNQUFNLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRUMsR0FBRyxHQUFHLElBQUksRUFBRTtJQUN4RCxJQUFJLENB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
|
|
318
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXN5bmNib3giLCJyZXF1aXJlIiwiX3RlZW5fcHJvY2VzcyIsIl9zdXBwb3J0IiwiX2xvZ2dlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYmx1ZWJpcmQiLCJfdXRpbHMiLCJfbG9kYXNoIiwiX3BhdGgiLCJfb3MiLCJfY29uc3RhbnRzIiwiREVGQVVMVF9TSUdOSU5HX0lEIiwiUFJFQlVJTERfREVMQVkiLCJSVU5ORVJfU0NIRU1FX0lPUyIsIkxJQl9TQ0hFTUVfSU9TIiwiRVJST1JfV1JJVElOR19BVFRBQ0hNRU5UIiwiRVJST1JfQ09QWUlOR19BVFRBQ0hNRU5UIiwiSUdOT1JFRF9FUlJPUlMiLCJSVU5ORVJfU0NIRU1FX1RWIiwiTElCX1NDSEVNRV9UViIsInhjb2RlTG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiWGNvZGVCdWlsZCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiZGV2aWNlIiwiYXJncyIsImxvZyIsImRlZmF1bHRMb2dnZXIiLCJyZWFsRGV2aWNlIiwiYWdlbnRQYXRoIiwiYm9vdHN0cmFwUGF0aCIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwicHJlYnVpbGRXREEiLCJ1c2VQcmVidWlsdFdEQSIsInVzZVNpbXBsZUJ1aWxkVGVzdCIsInVzZVhjdGVzdHJ1bkZpbGUiLCJsYXVuY2hUaW1lb3V0Iiwid2RhUmVtb3RlUG9ydCIsInVwZGF0ZWRXREFCdW5kbGVJZCIsImRlcml2ZWREYXRhUGF0aCIsIm1qcGVnU2VydmVyUG9ydCIsInByZWJ1aWxkRGVsYXkiLCJfIiwiaXNOdW1iZXIiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiaW5pdCIsIm5vU2Vzc2lvblByb3h5IiwiZGV2aXZlSW5mbyIsImlzUmVhbERldmljZSIsInVkaWQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsInNldFhjdGVzdHJ1bkZpbGUiLCJyZXNldFByb2plY3RGaWxlIiwidXBkYXRlUHJvamVjdEZpbGUiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsIl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlIiwic3Rkb3V0IiwiZXhlYyIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwicGF0dGVybiIsIm1hdGNoIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJkZWJ1ZyIsInBhdGgiLCJkaXJuYW1lIiwibm9ybWFsaXplIiwicmVzZXQiLCJwcmVidWlsZCIsInN0YXJ0IiwieGNvZGVidWlsZCIsIkIiLCJkZWxheSIsImNsZWFuUHJvamVjdCIsImxpYlNjaGVtZSIsImlzVHZPUyIsInJ1bm5lclNjaGVtZSIsInNjaGVtZSIsImdldENvbW1hbmQiLCJidWlsZE9ubHkiLCJjbWQiLCJidWlsZENtZCIsInRlc3RDbWQiLCJwdXNoIiwidmVyc2lvbk1hdGNoIiwiUmVnRXhwIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMiLCJjcmVhdGVTdWJQcm9jZXNzIiwic2V0UmVhbERldmljZVNlY3VyaXR5IiwiZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUiLCJqb2luIiwiT2JqZWN0IiwiYXNzaWduIiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiTUpQRUdfU0VSVkVSX1BPUlQiLCJ1cGdyYWRlVGltZXN0YW1wIiwiZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCIsIlVQR1JBREVfVElNRVNUQU1QIiwiU3ViUHJvY2VzcyIsImN3ZCIsImRldGFjaGVkIiwic3RkaW8iLCJsb2dYY29kZU91dHB1dCIsImxvZ01zZyIsImlzQm9vbGVhbiIsIm9uIiwic3RkZXJyIiwib3V0IiwiaW5jbHVkZXMiLCJsb2dMb2NhdGlvbiIsImZpcnN0IiwicmVtb3ZlIiwidHJpbSIsInNwbGl0IiwidiIsInN0YXJ0c1dpdGgiLCJzZXAiLCJpZ25vcmVFcnJvciIsInNvbWUiLCJ4IiwiX3dkYV9lcnJvcl9vY2N1cnJlZCIsImxpbmUiLCJFT0wiLCJlcnJvciIsIl93ZGFfZXJyb3JfbWVzc2FnZSIsInJlc29sdmUiLCJyZWplY3QiLCJjb2RlIiwic2lnbmFsIiwiZGF0YSIsImZzIiwicmVhZEZpbGUiLCJwcm9jZXNzRXhpdGVkIiwiRXJyb3IiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhdHVzIiwid2FpdEZvclN0YXJ0IiwibXNnIiwiY3VycmVudFN0YXR1cyIsInJldHJpZXMiLCJwYXJzZUludCIsInJldHJ5SW50ZXJ2YWwiLCJwcm94eVRpbWVvdXQiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImlvcyIsImlwIiwiYWdlbnRVcmwiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJxdWl0Iiwia2lsbFByb2Nlc3MiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlYnVpbGQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIHNldFJlYWxEZXZpY2VTZWN1cml0eSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsIHNldFhjdGVzdHJ1bkZpbGUsXG4gIHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBraWxsUHJvY2VzcyxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgaXNUdk9TIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5jb25zdCBERUZBVUxUX1NJR05JTkdfSUQgPSAnaVBob25lIERldmVsb3Blcic7XG5jb25zdCBQUkVCVUlMRF9ERUxBWSA9IDA7XG5jb25zdCBSVU5ORVJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcic7XG5jb25zdCBMSUJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudExpYic7XG5cbmNvbnN0IEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCA9ICdFcnJvciB3cml0aW5nIGF0dGFjaG1lbnQgZGF0YSB0byBmaWxlJztcbmNvbnN0IEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCA9ICdFcnJvciBjb3B5aW5nIHRlc3RpbmcgYXR0YWNobWVudCc7XG5jb25zdCBJR05PUkVEX0VSUk9SUyA9IFtcbiAgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5ULFxuICBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQsXG4gICdGYWlsZWQgdG8gcmVtb3ZlIHNjcmVlbnNob3QgYXQgcGF0aCcsXG5dO1xuXG5jb25zdCBSVU5ORVJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50UnVubmVyX3R2T1MnO1xuY29uc3QgTElCX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudExpYl90dk9TJztcblxuY29uc3QgeGNvZGVMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmNsYXNzIFhjb2RlQnVpbGQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBkZXZpY2UsIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcmV0cmlldmUgV0RBIGJ1aWxkIHNldHRpbmdzLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqQlVJTERfRElSXFxzKz1cXHMrKFxcLy4qKS9tO1xuICAgICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIFdEQSBidWlsZCBkaXIgZnJvbSAke18udHJ1bmNhdGUoc3Rkb3V0LCB7bGVuZ3RoOiAzMDB9KX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRlcml2ZWQgZGF0YSByb290OiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICAvLyBpZiBuZWNlc3NhcnksIHJlc2V0IHRoZSBidW5kbGVJZCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpIHtcbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZWJ1aWxkICgpIHtcbiAgICAvLyBmaXJzdCBkbyBhIGJ1aWxkIHBoYXNlXG4gICAgdGhpcy5sb2cuZGVidWcoJ1ByZS1idWlsZGluZyBXREEgYmVmb3JlIGxhdW5jaGluZyB0ZXN0Jyk7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5zdGFydCh0cnVlKTtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IG51bGw7XG5cbiAgICAvLyBwYXVzZSBhIG1vbWVudFxuICAgIGF3YWl0IEIuZGVsYXkodGhpcy5wcmVidWlsZERlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFuUHJvamVjdCAoKSB7XG4gICAgY29uc3QgbGliU2NoZW1lID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKSA/IExJQl9TQ0hFTUVfVFYgOiBMSUJfU0NIRU1FX0lPUztcbiAgICBjb25zdCBydW5uZXJTY2hlbWUgPSBpc1R2T1ModGhpcy5wbGF0Zm9ybU5hbWUpID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgW2xpYlNjaGVtZSwgcnVubmVyU2NoZW1lXSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goXG4gICAgICAgIGAke2lzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyAnVFYnIDogJ0lQSE9ORSd9T1NfREVQTE9ZTUVOVF9UQVJHRVQ9JHt2ZXJzaW9uTWF0Y2hbMV19LiR7dmVyc2lvbk1hdGNoWzJdfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwYXJzZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIGZyb20gcGxhdGZvcm1WZXJzaW9uIFwiJHt0aGlzLnBsYXRmb3JtVmVyc2lvbn1cIi4gYCArXG4gICAgICAgICdXaWxsIGJ1aWxkIGZvciB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBpbnN0ZWFkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhbERldmljZSAmJiB0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFVzaW5nIFhjb2RlIGNvbmZpZ3VyYXRpb24gZmlsZTogJyR7dGhpcy54Y29kZUNvbmZpZ0ZpbGV9J2ApO1xuICAgICAgYXJncy5wdXNoKCcteGNjb25maWcnLCB0aGlzLnhjb2RlQ29uZmlnRmlsZSk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9jZXNzLmVudi5BUFBJVU1fWENVSVRFU1RfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTKSB7XG4gICAgICAvLyBUaGlzIHNvbWV0aW1lcyBoZWxwcyB0byBzdXJ2aXZlIFhjb2RlIHVwZGF0ZXNcbiAgICAgIGFyZ3MucHVzaCgnR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUz0wJyk7XG4gICAgfVxuXG4gICAgLy8gQmVsb3cgb3B0aW9uIHNsaWdodGx5IHJlZHVjZXMgYnVpbGQgdGltZSBpbiBkZWJ1ZyBidWlsZFxuICAgIC8vIHdpdGggcHJldmVudGluZyB0byBnZW5lcmF0ZSBgL0luZGV4L0RhdGFTdG9yZWAgd2hpY2ggaXMgdXNlZCBieSBkZXZlbG9wbWVudFxuICAgIGFyZ3MucHVzaCgnQ09NUElMRVJfSU5ERVhfU1RPUkVfRU5BQkxFPU5PJyk7XG5cbiAgICByZXR1cm4ge2NtZCwgYXJnc307XG4gIH1cblxuICBhc3luYyBjcmVhdGVTdWJQcm9jZXNzIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy51c2VYY3Rlc3RydW5GaWxlICYmIHRoaXMucmVhbERldmljZSkge1xuICAgICAgaWYgKHRoaXMua2V5Y2hhaW5QYXRoICYmIHRoaXMua2V5Y2hhaW5QYXNzd29yZCkge1xuICAgICAgICBhd2FpdCBzZXRSZWFsRGV2aWNlU2VjdXJpdHkodGhpcy5rZXljaGFpblBhdGgsIHRoaXMua2V5Y2hhaW5QYXNzd29yZCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy54Y29kZU9yZ0lkICYmIHRoaXMueGNvZGVTaWduaW5nSWQgJiYgIXRoaXMueGNvZGVDb25maWdGaWxlKSB7XG4gICAgICAgIHRoaXMueGNvZGVDb25maWdGaWxlID0gYXdhaXQgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUodGhpcy54Y29kZU9yZ0lkLCB0aGlzLnhjb2RlU2lnbmluZ0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7Y21kLCBhcmdzfSA9IHRoaXMuZ2V0Q29tbWFuZChidWlsZE9ubHkpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBCZWdpbm5pbmcgJHtidWlsZE9ubHkgPyAnYnVpbGQnIDogJ3Rlc3QnfSB3aXRoIGNvbW1hbmQgJyR7Y21kfSAke2FyZ3Muam9pbignICcpfScgYCArXG4gICAgICBgaW4gZGlyZWN0b3J5ICcke3RoaXMuYm9vdHN0cmFwUGF0aH0nYCk7XG4gICAgY29uc3QgZW52ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIHtcbiAgICAgIFVTRV9QT1JUOiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICBXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUjogdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgfHwgV0RBX1JVTk5FUl9CVU5ETEVfSUQsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL1dlYkRyaXZlckFnZW50L3B1bGwvMTA1XG4gICAgICBlbnYuTUpQRUdfU0VSVkVSX1BPUlQgPSB0aGlzLm1qcGVnU2VydmVyUG9ydDtcbiAgICB9XG4gICAgY29uc3QgdXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICBpZiAodXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgZW52LlVQR1JBREVfVElNRVNUQU1QID0gdXBncmFkZVRpbWVzdGFtcDtcbiAgICB9XG4gICAgY29uc3QgeGNvZGVidWlsZCA9IG5ldyBTdWJQcm9jZXNzKGNtZCwgYXJncywge1xuICAgICAgY3dkOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICBlbnYsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcblxuICAgIGxldCBsb2dYY29kZU91dHB1dCA9ICEhdGhpcy5zaG93WGNvZGVMb2c7XG4gICAgY29uc3QgbG9nTXNnID0gXy5pc0Jvb2xlYW4odGhpcy5zaG93WGNvZGVMb2cpXG4gICAgICA/IGBPdXRwdXQgZnJvbSB4Y29kZWJ1aWxkICR7dGhpcy5zaG93WGNvZGVMb2cgPyAnd2lsbCcgOiAnd2lsbCBub3QnfSBiZSBsb2dnZWRgXG4gICAgICA6ICdPdXRwdXQgZnJvbSB4Y29kZWJ1aWxkIHdpbGwgb25seSBiZSBsb2dnZWQgaWYgYW55IGVycm9ycyBhcmUgcHJlc2VudCB0aGVyZSc7XG4gICAgdGhpcy5sb2cuZGVidWcoYCR7bG9nTXNnfS4gVG8gY2hhbmdlIHRoaXMsIHVzZSAnc2hvd1hjb2RlTG9nJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgICB4Y29kZWJ1aWxkLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGxldCBvdXQgPSBzdGRvdXQgfHwgc3RkZXJyO1xuICAgICAgLy8gd2Ugd2FudCB0byBwdWxsIG91dCB0aGUgbG9nIGZpbGUgdGhhdCBpcyBjcmVhdGVkLCBhbmQgaGlnaGxpZ2h0IGl0XG4gICAgICAvLyBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlc1xuICAgICAgaWYgKG91dC5pbmNsdWRlcygnV3JpdGluZyBkaWFnbm9zdGljIGxvZyBmb3IgdGVzdCBzZXNzaW9uIHRvJykpIHtcbiAgICAgICAgLy8gcHVsbCBvdXQgdGhlIGZpcnN0IGxpbmUgdGhhdCBiZWdpbnMgd2l0aCB0aGUgcGF0aCBzZXBhcmF0b3JcbiAgICAgICAgLy8gd2hpY2ggKnNob3VsZCogYmUgdGhlIGxpbmUgaW5kaWNhdGluZyB0aGUgbG9nIGZpbGUgZ2VuZXJhdGVkXG4gICAgICAgIHhjb2RlYnVpbGQubG9nTG9jYXRpb24gPSBfLmZpcnN0KF8ucmVtb3ZlKG91dC50cmltKCkuc3BsaXQoJ1xcbicpLCAodikgPT4gdi5zdGFydHNXaXRoKHBhdGguc2VwKSkpO1xuICAgICAgICB4Y29kZUxvZy5kZWJ1ZyhgTG9nIGZpbGUgZm9yIHhjb2RlYnVpbGQgdGVzdDogJHt4Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBoYXZlIGFuIGVycm9yIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBsb2dzXG4gICAgICAvLyBvdGhlcndpc2UgdGhlIGZhaWx1cmUgaXMgaW5zY3J1dGlibGVcbiAgICAgIC8vIGJ1dCBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgY29uc3QgaWdub3JlRXJyb3IgPSBJR05PUkVEX0VSUk9SUy5zb21lKCh4KSA9PiBvdXQuaW5jbHVkZXMoeCkpO1xuICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICE9PSBmYWxzZSAmJiBvdXQuaW5jbHVkZXMoJ0Vycm9yIERvbWFpbj0nKSAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgbG9nWGNvZGVPdXRwdXQgPSB0cnVlO1xuXG4gICAgICAgIC8vIHRlcnJpYmxlIGhhY2sgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgeGNvZGUgcmV0dXJuIDAgYnV0IGlzIGZhaWxpbmdcbiAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gbm90IGxvZyBwZXJtaXNzaW9uIGVycm9ycyBmcm9tIHRyeWluZyB0byB3cml0ZSB0byBhdHRhY2htZW50cyBmb2xkZXJcbiAgICAgIGlmIChsb2dYY29kZU91dHB1dCAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdChFT0wpKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgIHhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlICs9IGAke0VPTH0ke2xpbmV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB4Y29kZWJ1aWxkO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgdGhpcy54Y29kZWJ1aWxkID0gYXdhaXQgdGhpcy5jcmVhdGVTdWJQcm9jZXNzKGJ1aWxkT25seSk7XG4gICAgLy8gU3RvcmUgeGNvZGVidWlsZCBtZXNzYWdlXG4gICAgdGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZSA9ICcnO1xuXG4gICAgLy8gd3JhcCB0aGUgc3RhcnQgcHJvY2VkdXJlIGluIGEgcHJvbWlzZSBzbyB0aGF0IHdlIGNhbiBjYXRjaCwgYW5kIHJlcG9ydCxcbiAgICAvLyBhbnkgc3RhcnR1cCBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGFzIGV2ZW50c1xuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnhjb2RlYnVpbGQub24oJ2V4aXQnLCBhc3luYyAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHhjb2RlTG9nLmVycm9yKGB4Y29kZWJ1aWxkIGV4aXRlZCB3aXRoIGNvZGUgJyR7Y29kZX0nIGFuZCBzaWduYWwgJyR7c2lnbmFsfSdgKTtcbiAgICAgICAgLy8gcHJpbnQgb3V0IHRoZSB4Y29kZWJ1aWxkIGZpbGUgaWYgdXNlcnMgaGF2ZSBhc2tlZCBmb3IgaXRcbiAgICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICYmIHRoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbikge1xuICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGBDb250ZW50cyBvZiB4Y29kZWJ1aWxkIGxvZyBmaWxlICcke3RoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbn0nOmApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbiwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgZGF0YS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB4Y29kZUxvZy5lcnJvcihgVW5hYmxlIHRvIGFjY2VzcyB4Y29kZWJ1aWxkIGxvZyBmaWxlOiAnJHtlcnIubWVzc2FnZX0nYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkIHx8ICghc2lnbmFsICYmIGNvZGUgIT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYHhjb2RlYnVpbGQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9JHtFT0x9YCArXG4gICAgICAgICAgICBgeGNvZGVidWlsZCBlcnJvciBtZXNzYWdlOiR7RU9MfSR7dGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YganVzdCBidWlsZGluZywgdGhlIHByb2Nlc3Mgd2lsbCBleGl0IGFuZCB0aGF0IGlzIG91ciBmaW5pc2hcbiAgICAgICAgaWYgKGJ1aWxkT25seSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgICAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5zdGFydCh0cnVlKTtcbiAgICAgICAgICBpZiAoIWJ1aWxkT25seSkge1xuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0KHRpbWVyKTtcbiAgICAgICAgICAgIHJlc29sdmUoc3RhdHVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxldCBtc2cgPSBgVW5hYmxlIHRvIHN0YXJ0IFdlYkRyaXZlckFnZW50OiAke2Vycn1gO1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JTdGFydCAodGltZXIpIHtcbiAgICAvLyB0cnkgdG8gY29ubmVjdCBvbmNlIGV2ZXJ5IDAuNSBzZWNvbmRzLCB1bnRpbCBgbGF1bmNoVGltZW91dGAgaXMgdXBcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3RoaXMubGF1bmNoVGltZW91dH1tcyBmb3IgV2ViRHJpdmVyQWdlbnQgdG8gc3RhcnRgKTtcbiAgICBsZXQgY3VycmVudFN0YXR1cyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXRyaWVzID0gcGFyc2VJbnQodGhpcy5sYXVuY2hUaW1lb3V0IC8gNTAwLCAxMCk7XG4gICAgICBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIDEwMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgLy8gdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgZWxzZXdoZXJlIGFuZCB3ZSBuZWVkIHRvIHNob3J0LWNpcmN1aXRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJveHlUaW1lb3V0ID0gdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0O1xuICAgICAgICB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQgPSAxMDAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGN1cnJlbnRTdGF0dXMgPSBhd2FpdCB0aGlzLm5vU2Vzc2lvblByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgJiYgY3VycmVudFN0YXR1cy5pb3MgJiYgY3VycmVudFN0YXR1cy5pb3MuaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWdlbnRVcmwgPSBjdXJyZW50U3RhdHVzLmlvcy5pcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYkRyaXZlckFnZW50IGluZm9ybWF0aW9uOmApO1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KGN1cnJlbnRTdGF0dXMsIG51bGwsIDIpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29ubmVjdCB0byBydW5uaW5nIFdlYkRyaXZlckFnZW50OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IHByb3h5VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICByZXR1cm4gY3VycmVudFN0YXR1cztcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYkRyaXZlckFnZW50IHN1Y2Nlc3NmdWxseSBzdGFydGVkIGFmdGVyICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCBpZiB3ZSBoYXZlIG5vdCBoYWQgYW55IGVycm9ycyBmcm9tIHhjb2RlIGl0c2VsZiAocmVwb3J0ZWRcbiAgICAgIC8vIGVsc2V3aGVyZSksIHdlIGNhbiBsZXQgdGhpcyBnbyB0aHJvdWdoIGFuZCB0cnkgdG8gY3JlYXRlIHRoZSBzZXNzaW9uXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlcnIubWVzc2FnZSk7XG4gICAgICB0aGlzLmxvZy53YXJuKGBHZXR0aW5nIHN0YXR1cyBvZiBXZWJEcml2ZXJBZ2VudCBvbiBkZXZpY2UgdGltZWQgb3V0LiBDb250aW51aW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgYXdhaXQga2lsbFByb2Nlc3MoJ3hjb2RlYnVpbGQnLCB0aGlzLnhjb2RlYnVpbGQpO1xuICB9XG59XG5cbmV4cG9ydCB7IFhjb2RlQnVpbGQgfTtcbmV4cG9ydCBkZWZhdWx0IFhjb2RlQnVpbGQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssU0FBQSxHQUFBRCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBSUEsSUFBQU8sT0FBQSxHQUFBSCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVEsS0FBQSxHQUFBSixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVMsR0FBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBVixPQUFBO0FBR0EsTUFBTVcsa0JBQWtCLEdBQUcsa0JBQWtCO0FBQzdDLE1BQU1DLGNBQWMsR0FBRyxDQUFDO0FBQ3hCLE1BQU1DLGlCQUFpQixHQUFHLHNCQUFzQjtBQUNoRCxNQUFNQyxjQUFjLEdBQUcsbUJBQW1CO0FBRTFDLE1BQU1DLHdCQUF3QixHQUFHLHVDQUF1QztBQUN4RSxNQUFNQyx3QkFBd0IsR0FBRyxrQ0FBa0M7QUFDbkUsTUFBTUMsY0FBYyxHQUFHLENBQ3JCRix3QkFBd0IsRUFDeEJDLHdCQUF3QixFQUN4QixxQ0FBcUMsQ0FDdEM7QUFFRCxNQUFNRSxnQkFBZ0IsR0FBRywyQkFBMkI7QUFDcEQsTUFBTUMsYUFBYSxHQUFHLHdCQUF3QjtBQUU5QyxNQUFNQyxRQUFRLEdBQUdDLGVBQU0sQ0FBQ0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztBQUcxQyxNQUFNQyxVQUFVLENBQUM7RUFDZkMsV0FBV0EsQ0FBRUMsWUFBWSxFQUFFQyxNQUFNLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRUMsR0FBRyxHQUFHLElBQUksRUFBRTtJQUN4RCxJQUFJLENB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcodebuild.js","names":["_asyncbox","require","_teen_process","_support","_logger","_interopRequireDefault","_bluebird","_utils","_lodash","_path","_os","_constants","DEFAULT_SIGNING_ID","PREBUILD_DELAY","RUNNER_SCHEME_IOS","LIB_SCHEME_IOS","ERROR_WRITING_ATTACHMENT","ERROR_COPYING_ATTACHMENT","IGNORED_ERRORS","RUNNER_SCHEME_TV","LIB_SCHEME_TV","xcodeLog","logger","getLogger","XcodeBuild","constructor","xcodeVersion","device","args","log","defaultLogger","realDevice","agentPath","bootstrapPath","platformVersion","platformName","iosSdkVersion","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","prebuildWDA","usePrebuiltWDA","useSimpleBuildTest","useXctestrunFile","launchTimeout","wdaRemotePort","updatedWDABundleId","derivedDataPath","mjpegServerPort","prebuildDelay","_","isNumber","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","init","noSessionProxy","deviveInfo","isRealDevice","udid","xctestrunFilePath","setXctestrunFile","resetProjectFile","updateProjectFile","retrieveDerivedDataPath","_derivedDataPathPromise","stdout","exec","err","warn","message","pattern","match","truncate","length","debug","path","dirname","normalize","reset","prebuild","start","xcodebuild","B","delay","cleanProject","libScheme","isTvOS","runnerScheme","scheme","getCommand","buildOnly","cmd","buildCmd","testCmd","push","versionMatch","RegExp","process","env","APPIUM_XCUITEST_TREAT_WARNINGS_AS_ERRORS","createSubProcess","setRealDeviceSecurity","generateXcodeConfigFile","join","Object","assign","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","WDA_RUNNER_BUNDLE_ID","MJPEG_SERVER_PORT","upgradeTimestamp","getWDAUpgradeTimestamp","UPGRADE_TIMESTAMP","SubProcess","cwd","detached","stdio","logXcodeOutput","logMsg","isBoolean","on","stderr","out","includes","logLocation","first","remove","trim","split","v","startsWith","sep","ignoreError","some","x","_wda_error_occurred","line","EOL","error","_wda_error_message","resolve","reject","code","signal","data","fs","readFile","processExited","Error","timer","timing","Timer","status","waitForStart","msg","currentStatus","retries","parseInt","retryInterval","proxyTimeout","timeout","command","ios","ip","agentUrl","JSON","stringify","getDuration","asMilliSeconds","toFixed","quit","killProcess","exports","_default","default"],"sources":["../../lib/xcodebuild.js"],"sourcesContent":["import { retryInterval } from 'asyncbox';\nimport { SubProcess, exec } from 'teen_process';\nimport { fs, logger, timing } from '@appium/support';\nimport defaultLogger from './logger';\nimport B from 'bluebird';\nimport {\n setRealDeviceSecurity, generateXcodeConfigFile, setXctestrunFile,\n updateProjectFile, resetProjectFile, killProcess,\n getWDAUpgradeTimestamp, isTvOS } from './utils';\nimport _ from 'lodash';\nimport path from 'path';\nimport { EOL } from 'os';\nimport { WDA_RUNNER_BUNDLE_ID } from './constants';\n\n\nconst DEFAULT_SIGNING_ID = 'iPhone Developer';\nconst PREBUILD_DELAY = 0;\nconst RUNNER_SCHEME_IOS = 'WebDriverAgentRunner';\nconst LIB_SCHEME_IOS = 'WebDriverAgentLib';\n\nconst ERROR_WRITING_ATTACHMENT = 'Error writing attachment data to file';\nconst ERROR_COPYING_ATTACHMENT = 'Error copying testing attachment';\nconst IGNORED_ERRORS = [\n ERROR_WRITING_ATTACHMENT,\n ERROR_COPYING_ATTACHMENT,\n 'Failed to remove screenshot at path',\n];\n\nconst RUNNER_SCHEME_TV = 'WebDriverAgentRunner_tvOS';\nconst LIB_SCHEME_TV = 'WebDriverAgentLib_tvOS';\n\nconst xcodeLog = logger.getLogger('Xcode');\n\n\nclass XcodeBuild {\n constructor (xcodeVersion, device, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.device = device;\n this.log = log ?? defaultLogger;\n\n this.realDevice = args.realDevice;\n\n this.agentPath = args.agentPath;\n this.bootstrapPath = args.bootstrapPath;\n\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n\n this.showXcodeLog = args.showXcodeLog;\n\n this.xcodeConfigFile = args.xcodeConfigFile;\n this.xcodeOrgId = args.xcodeOrgId;\n this.xcodeSigningId = args.xcodeSigningId || DEFAULT_SIGNING_ID;\n this.keychainPath = args.keychainPath;\n this.keychainPassword = args.keychainPassword;\n\n this.prebuildWDA = args.prebuildWDA;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.useSimpleBuildTest = args.useSimpleBuildTest;\n\n this.useXctestrunFile = args.useXctestrunFile;\n\n this.launchTimeout = args.launchTimeout;\n\n this.wdaRemotePort = args.wdaRemotePort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n this.derivedDataPath = args.derivedDataPath;\n\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.prebuildDelay = _.isNumber(args.prebuildDelay) ? args.prebuildDelay : PREBUILD_DELAY;\n\n this.allowProvisioningDeviceRegistration = args.allowProvisioningDeviceRegistration;\n\n this.resultBundlePath = args.resultBundlePath;\n this.resultBundleVersion = args.resultBundleVersion;\n }\n\n async init (noSessionProxy) {\n this.noSessionProxy = noSessionProxy;\n\n if (this.useXctestrunFile) {\n const deviveInfo = {\n isRealDevice: this.realDevice,\n udid: this.device.udid,\n platformVersion: this.platformVersion,\n platformName: this.platformName\n };\n this.xctestrunFilePath = await setXctestrunFile(deviveInfo, this.iosSdkVersion, this.bootstrapPath, this.wdaRemotePort);\n return;\n }\n\n // if necessary, update the bundleId to user's specification\n if (this.realDevice) {\n // In case the project still has the user specific bundle ID, reset the project file first.\n // - We do this reset even if updatedWDABundleId is not specified,\n // since the previous updatedWDABundleId test has generated the user specific bundle ID project file.\n // - We don't call resetProjectFile for simulator,\n // since simulator test run will work with any user specific bundle ID.\n await resetProjectFile(this.agentPath);\n if (this.updatedWDABundleId) {\n await updateProjectFile(this.agentPath, this.updatedWDABundleId);\n }\n }\n }\n\n async retrieveDerivedDataPath () {\n if (this.derivedDataPath) {\n return this.derivedDataPath;\n }\n\n // avoid race conditions\n if (this._derivedDataPathPromise) {\n return await this._derivedDataPathPromise;\n }\n\n this._derivedDataPathPromise = (async () => {\n let stdout;\n try {\n ({stdout} = await exec('xcodebuild', ['-project', this.agentPath, '-showBuildSettings']));\n } catch (err) {\n this.log.warn(`Cannot retrieve WDA build settings. Original error: ${err.message}`);\n return;\n }\n\n const pattern = /^\\s*BUILD_DIR\\s+=\\s+(\\/.*)/m;\n const match = pattern.exec(stdout);\n if (!match) {\n this.log.warn(`Cannot parse WDA build dir from ${_.truncate(stdout, {length: 300})}`);\n return;\n }\n this.log.debug(`Parsed BUILD_DIR configuration value: '${match[1]}'`);\n // Derived data root is two levels higher over the build dir\n this.derivedDataPath = path.dirname(path.dirname(path.normalize(match[1])));\n this.log.debug(`Got derived data root: '${this.derivedDataPath}'`);\n return this.derivedDataPath;\n })();\n return await this._derivedDataPathPromise;\n }\n\n async reset () {\n // if necessary, reset the bundleId to original value\n if (this.realDevice && this.updatedWDABundleId) {\n await resetProjectFile(this.agentPath);\n }\n }\n\n async prebuild () {\n // first do a build phase\n this.log.debug('Pre-building WDA before launching test');\n this.usePrebuiltWDA = true;\n await this.start(true);\n\n this.xcodebuild = null;\n\n // pause a moment\n await B.delay(this.prebuildDelay);\n }\n\n async cleanProject () {\n const libScheme = isTvOS(this.platformName) ? LIB_SCHEME_TV : LIB_SCHEME_IOS;\n const runnerScheme = isTvOS(this.platformName) ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;\n\n for (const scheme of [libScheme, runnerScheme]) {\n this.log.debug(`Cleaning the project scheme '${scheme}' to make sure there are no leftovers from previous installs`);\n await exec('xcodebuild', [\n 'clean',\n '-project', this.agentPath,\n '-scheme', scheme,\n ]);\n }\n }\n\n getCommand (buildOnly = false) {\n let cmd = 'xcodebuild';\n let args;\n\n // figure out the targets for xcodebuild\n const [buildCmd, testCmd] = this.useSimpleBuildTest ? ['build', 'test'] : ['build-for-testing', 'test-without-building'];\n if (buildOnly) {\n args = [buildCmd];\n } else if (this.usePrebuiltWDA || this.useXctestrunFile) {\n args = [testCmd];\n } else {\n args = [buildCmd, testCmd];\n }\n\n if (this.allowProvisioningDeviceRegistration) {\n // To -allowProvisioningDeviceRegistration flag takes effect, -allowProvisioningUpdates needs to be passed as well.\n args.push('-allowProvisioningUpdates', '-allowProvisioningDeviceRegistration');\n }\n\n if (this.resultBundlePath) {\n args.push('-resultBundlePath', this.resultBundlePath);\n }\n\n if (this.resultBundleVersion) {\n args.push('-resultBundleVersion', this.resultBundleVersion);\n }\n\n if (this.useXctestrunFile) {\n args.push('-xctestrun', this.xctestrunFilePath);\n } else {\n const runnerScheme = isTvOS(this.platformName) ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;\n args.push('-project', this.agentPath, '-scheme', runnerScheme);\n if (this.derivedDataPath) {\n args.push('-derivedDataPath', this.derivedDataPath);\n }\n }\n args.push('-destination', `id=${this.device.udid}`);\n\n const versionMatch = new RegExp(/^(\\d+)\\.(\\d+)/).exec(this.platformVersion);\n if (versionMatch) {\n args.push(\n `${isTvOS(this.platformName) ? 'TV' : 'IPHONE'}OS_DEPLOYMENT_TARGET=${versionMatch[1]}.${versionMatch[2]}`\n );\n } else {\n this.log.warn(`Cannot parse major and minor version numbers from platformVersion \"${this.platformVersion}\". ` +\n 'Will build for the default platform instead');\n }\n\n if (this.realDevice && this.xcodeConfigFile) {\n this.log.debug(`Using Xcode configuration file: '${this.xcodeConfigFile}'`);\n args.push('-xcconfig', this.xcodeConfigFile);\n }\n\n if (!process.env.APPIUM_XCUITEST_TREAT_WARNINGS_AS_ERRORS) {\n // This sometimes helps to survive Xcode updates\n args.push('GCC_TREAT_WARNINGS_AS_ERRORS=0');\n }\n\n // Below option slightly reduces build time in debug build\n // with preventing to generate `/Index/DataStore` which is used by development\n args.push('COMPILER_INDEX_STORE_ENABLE=NO');\n\n return {cmd, args};\n }\n\n async createSubProcess (buildOnly = false) {\n if (!this.useXctestrunFile && this.realDevice) {\n if (this.keychainPath && this.keychainPassword) {\n await setRealDeviceSecurity(this.keychainPath, this.keychainPassword);\n }\n if (this.xcodeOrgId && this.xcodeSigningId && !this.xcodeConfigFile) {\n this.xcodeConfigFile = await generateXcodeConfigFile(this.xcodeOrgId, this.xcodeSigningId);\n }\n }\n\n const {cmd, args} = this.getCommand(buildOnly);\n this.log.debug(`Beginning ${buildOnly ? 'build' : 'test'} with command '${cmd} ${args.join(' ')}' ` +\n `in directory '${this.bootstrapPath}'`);\n const env = Object.assign({}, process.env, {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId || WDA_RUNNER_BUNDLE_ID,\n });\n if (this.mjpegServerPort) {\n // https://github.com/appium/WebDriverAgent/pull/105\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n const upgradeTimestamp = await getWDAUpgradeTimestamp(this.bootstrapPath);\n if (upgradeTimestamp) {\n env.UPGRADE_TIMESTAMP = upgradeTimestamp;\n }\n const xcodebuild = new SubProcess(cmd, args, {\n cwd: this.bootstrapPath,\n env,\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let logXcodeOutput = !!this.showXcodeLog;\n const logMsg = _.isBoolean(this.showXcodeLog)\n ? `Output from xcodebuild ${this.showXcodeLog ? 'will' : 'will not'} be logged`\n : 'Output from xcodebuild will only be logged if any errors are present there';\n this.log.debug(`${logMsg}. To change this, use 'showXcodeLog' desired capability`);\n xcodebuild.on('output', (stdout, stderr) => {\n let out = stdout || stderr;\n // we want to pull out the log file that is created, and highlight it\n // for diagnostic purposes\n if (out.includes('Writing diagnostic log for test session to')) {\n // pull out the first line that begins with the path separator\n // which *should* be the line indicating the log file generated\n xcodebuild.logLocation = _.first(_.remove(out.trim().split('\\n'), (v) => v.startsWith(path.sep)));\n xcodeLog.debug(`Log file for xcodebuild test: ${xcodebuild.logLocation}`);\n }\n\n // if we have an error we want to output the logs\n // otherwise the failure is inscrutible\n // but do not log permission errors from trying to write to attachments folder\n const ignoreError = IGNORED_ERRORS.some((x) => out.includes(x));\n if (this.showXcodeLog !== false && out.includes('Error Domain=') && !ignoreError) {\n logXcodeOutput = true;\n\n // terrible hack to handle case where xcode return 0 but is failing\n xcodebuild._wda_error_occurred = true;\n }\n\n // do not log permission errors from trying to write to attachments folder\n if (logXcodeOutput && !ignoreError) {\n for (const line of out.split(EOL)) {\n xcodeLog.error(line);\n if (line) {\n xcodebuild._wda_error_message += `${EOL}${line}`;\n }\n }\n }\n });\n\n return xcodebuild;\n }\n\n async start (buildOnly = false) {\n this.xcodebuild = await this.createSubProcess(buildOnly);\n // Store xcodebuild message\n this.xcodebuild._wda_error_message = '';\n\n // wrap the start procedure in a promise so that we can catch, and report,\n // any startup errors that are thrown as events\n return await new B((resolve, reject) => {\n this.xcodebuild.on('exit', async (code, signal) => {\n xcodeLog.error(`xcodebuild exited with code '${code}' and signal '${signal}'`);\n // print out the xcodebuild file if users have asked for it\n if (this.showXcodeLog && this.xcodebuild.logLocation) {\n xcodeLog.error(`Contents of xcodebuild log file '${this.xcodebuild.logLocation}':`);\n try {\n let data = await fs.readFile(this.xcodebuild.logLocation, 'utf8');\n for (let line of data.split('\\n')) {\n xcodeLog.error(line);\n }\n } catch (err) {\n xcodeLog.error(`Unable to access xcodebuild log file: '${err.message}'`);\n }\n }\n this.xcodebuild.processExited = true;\n if (this.xcodebuild._wda_error_occurred || (!signal && code !== 0)) {\n return reject(new Error(`xcodebuild failed with code ${code}${EOL}` +\n `xcodebuild error message:${EOL}${this.xcodebuild._wda_error_message}`));\n }\n // in the case of just building, the process will exit and that is our finish\n if (buildOnly) {\n return resolve();\n }\n });\n\n return (async () => {\n try {\n const timer = new timing.Timer().start();\n await this.xcodebuild.start(true);\n if (!buildOnly) {\n let status = await this.waitForStart(timer);\n resolve(status);\n }\n } catch (err) {\n let msg = `Unable to start WebDriverAgent: ${err}`;\n this.log.error(msg);\n reject(new Error(msg));\n }\n })();\n });\n }\n\n async waitForStart (timer) {\n // try to connect once every 0.5 seconds, until `launchTimeout` is up\n this.log.debug(`Waiting up to ${this.launchTimeout}ms for WebDriverAgent to start`);\n let currentStatus = null;\n try {\n let retries = parseInt(this.launchTimeout / 500, 10);\n await retryInterval(retries, 1000, async () => {\n if (this.xcodebuild.processExited) {\n // there has been an error elsewhere and we need to short-circuit\n return;\n }\n const proxyTimeout = this.noSessionProxy.timeout;\n this.noSessionProxy.timeout = 1000;\n try {\n currentStatus = await this.noSessionProxy.command('/status', 'GET');\n if (currentStatus && currentStatus.ios && currentStatus.ios.ip) {\n this.agentUrl = currentStatus.ios.ip;\n }\n this.log.debug(`WebDriverAgent information:`);\n this.log.debug(JSON.stringify(currentStatus, null, 2));\n } catch (err) {\n throw new Error(`Unable to connect to running WebDriverAgent: ${err.message}`);\n } finally {\n this.noSessionProxy.timeout = proxyTimeout;\n }\n });\n\n if (this.xcodebuild.processExited) {\n // there has been an error elsewhere and we need to short-circuit\n return currentStatus;\n }\n\n this.log.debug(`WebDriverAgent successfully started after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n } catch (err) {\n // at this point, if we have not had any errors from xcode itself (reported\n // elsewhere), we can let this go through and try to create the session\n this.log.debug(err.message);\n this.log.warn(`Getting status of WebDriverAgent on device timed out. Continuing`);\n }\n return currentStatus;\n }\n\n async quit () {\n await killProcess('xcodebuild', this.xcodebuild);\n }\n}\n\nexport { XcodeBuild };\nexport default XcodeBuild;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xcodebuild.js","names":["_asyncbox","require","_teen_process","_support","_logger","_interopRequireDefault","_bluebird","_utils","_lodash","_path","_os","_constants","DEFAULT_SIGNING_ID","PREBUILD_DELAY","RUNNER_SCHEME_IOS","LIB_SCHEME_IOS","ERROR_WRITING_ATTACHMENT","ERROR_COPYING_ATTACHMENT","IGNORED_ERRORS","RUNNER_SCHEME_TV","LIB_SCHEME_TV","xcodeLog","logger","getLogger","XcodeBuild","constructor","xcodeVersion","device","args","log","defaultLogger","realDevice","agentPath","bootstrapPath","platformVersion","platformName","iosSdkVersion","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","prebuildWDA","usePrebuiltWDA","useSimpleBuildTest","useXctestrunFile","launchTimeout","wdaRemotePort","updatedWDABundleId","derivedDataPath","mjpegServerPort","prebuildDelay","_","isNumber","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","init","noSessionProxy","deviveInfo","isRealDevice","udid","xctestrunFilePath","setXctestrunFile","resetProjectFile","updateProjectFile","retrieveDerivedDataPath","_derivedDataPathPromise","stdout","exec","err","warn","message","pattern","match","truncate","length","debug","path","dirname","normalize","reset","prebuild","start","xcodebuild","B","delay","cleanProject","libScheme","isTvOS","runnerScheme","scheme","getCommand","buildOnly","cmd","buildCmd","testCmd","push","versionMatch","RegExp","process","env","APPIUM_XCUITEST_TREAT_WARNINGS_AS_ERRORS","createSubProcess","setRealDeviceSecurity","generateXcodeConfigFile","join","Object","assign","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","WDA_RUNNER_BUNDLE_ID","MJPEG_SERVER_PORT","upgradeTimestamp","getWDAUpgradeTimestamp","UPGRADE_TIMESTAMP","SubProcess","cwd","detached","stdio","logXcodeOutput","logMsg","isBoolean","on","stderr","out","includes","logLocation","first","remove","trim","split","v","startsWith","sep","ignoreError","some","x","_wda_error_occurred","line","EOL","error","_wda_error_message","resolve","reject","code","signal","data","fs","readFile","processExited","Error","timer","timing","Timer","status","waitForStart","msg","currentStatus","retries","parseInt","retryInterval","proxyTimeout","timeout","command","ios","ip","agentUrl","JSON","stringify","getDuration","asMilliSeconds","toFixed","quit","killProcess","exports","_default","default"],"sources":["../../lib/xcodebuild.js"],"sourcesContent":["import { retryInterval } from 'asyncbox';\nimport { SubProcess, exec } from 'teen_process';\nimport { fs, logger, timing } from '@appium/support';\nimport defaultLogger from './logger';\nimport B from 'bluebird';\nimport {\n setRealDeviceSecurity, generateXcodeConfigFile, setXctestrunFile,\n updateProjectFile, resetProjectFile, killProcess,\n getWDAUpgradeTimestamp, isTvOS } from './utils';\nimport _ from 'lodash';\nimport path from 'path';\nimport { EOL } from 'os';\nimport { WDA_RUNNER_BUNDLE_ID } from './constants';\n\n\nconst DEFAULT_SIGNING_ID = 'iPhone Developer';\nconst PREBUILD_DELAY = 0;\nconst RUNNER_SCHEME_IOS = 'WebDriverAgentRunner';\nconst LIB_SCHEME_IOS = 'WebDriverAgentLib';\n\nconst ERROR_WRITING_ATTACHMENT = 'Error writing attachment data to file';\nconst ERROR_COPYING_ATTACHMENT = 'Error copying testing attachment';\nconst IGNORED_ERRORS = [\n ERROR_WRITING_ATTACHMENT,\n ERROR_COPYING_ATTACHMENT,\n 'Failed to remove screenshot at path',\n];\n\nconst RUNNER_SCHEME_TV = 'WebDriverAgentRunner_tvOS';\nconst LIB_SCHEME_TV = 'WebDriverAgentLib_tvOS';\n\nconst xcodeLog = logger.getLogger('Xcode');\n\n\nclass XcodeBuild {\n constructor (xcodeVersion, device, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.device = device;\n this.log = log ?? defaultLogger;\n\n this.realDevice = args.realDevice;\n\n this.agentPath = args.agentPath;\n this.bootstrapPath = args.bootstrapPath;\n\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n\n this.showXcodeLog = args.showXcodeLog;\n\n this.xcodeConfigFile = args.xcodeConfigFile;\n this.xcodeOrgId = args.xcodeOrgId;\n this.xcodeSigningId = args.xcodeSigningId || DEFAULT_SIGNING_ID;\n this.keychainPath = args.keychainPath;\n this.keychainPassword = args.keychainPassword;\n\n this.prebuildWDA = args.prebuildWDA;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.useSimpleBuildTest = args.useSimpleBuildTest;\n\n this.useXctestrunFile = args.useXctestrunFile;\n\n this.launchTimeout = args.launchTimeout;\n\n this.wdaRemotePort = args.wdaRemotePort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n this.derivedDataPath = args.derivedDataPath;\n\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.prebuildDelay = _.isNumber(args.prebuildDelay) ? args.prebuildDelay : PREBUILD_DELAY;\n\n this.allowProvisioningDeviceRegistration = args.allowProvisioningDeviceRegistration;\n\n this.resultBundlePath = args.resultBundlePath;\n this.resultBundleVersion = args.resultBundleVersion;\n }\n\n async init (noSessionProxy) {\n this.noSessionProxy = noSessionProxy;\n\n if (this.useXctestrunFile) {\n const deviveInfo = {\n isRealDevice: this.realDevice,\n udid: this.device.udid,\n platformVersion: this.platformVersion,\n platformName: this.platformName\n };\n this.xctestrunFilePath = await setXctestrunFile(deviveInfo, this.iosSdkVersion, this.bootstrapPath, this.wdaRemotePort);\n return;\n }\n\n // if necessary, update the bundleId to user's specification\n if (this.realDevice) {\n // In case the project still has the user specific bundle ID, reset the project file first.\n // - We do this reset even if updatedWDABundleId is not specified,\n // since the previous updatedWDABundleId test has generated the user specific bundle ID project file.\n // - We don't call resetProjectFile for simulator,\n // since simulator test run will work with any user specific bundle ID.\n await resetProjectFile(this.agentPath);\n if (this.updatedWDABundleId) {\n await updateProjectFile(this.agentPath, this.updatedWDABundleId);\n }\n }\n }\n\n async retrieveDerivedDataPath () {\n if (this.derivedDataPath) {\n return this.derivedDataPath;\n }\n\n // avoid race conditions\n if (this._derivedDataPathPromise) {\n return await this._derivedDataPathPromise;\n }\n\n this._derivedDataPathPromise = (async () => {\n let stdout;\n try {\n ({stdout} = await exec('xcodebuild', ['-project', this.agentPath, '-showBuildSettings']));\n } catch (err) {\n this.log.warn(`Cannot retrieve WDA build settings. Original error: ${err.message}`);\n return;\n }\n\n const pattern = /^\\s*BUILD_DIR\\s+=\\s+(\\/.*)/m;\n const match = pattern.exec(stdout);\n if (!match) {\n this.log.warn(`Cannot parse WDA build dir from ${_.truncate(stdout, {length: 300})}`);\n return;\n }\n this.log.debug(`Parsed BUILD_DIR configuration value: '${match[1]}'`);\n // Derived data root is two levels higher over the build dir\n this.derivedDataPath = path.dirname(path.dirname(path.normalize(match[1])));\n this.log.debug(`Got derived data root: '${this.derivedDataPath}'`);\n return this.derivedDataPath;\n })();\n return await this._derivedDataPathPromise;\n }\n\n async reset () {\n // if necessary, reset the bundleId to original value\n if (this.realDevice && this.updatedWDABundleId) {\n await resetProjectFile(this.agentPath);\n }\n }\n\n async prebuild () {\n // first do a build phase\n this.log.debug('Pre-building WDA before launching test');\n this.usePrebuiltWDA = true;\n await this.start(true);\n\n this.xcodebuild = null;\n\n // pause a moment\n await B.delay(this.prebuildDelay);\n }\n\n async cleanProject () {\n const libScheme = isTvOS(this.platformName) ? LIB_SCHEME_TV : LIB_SCHEME_IOS;\n const runnerScheme = isTvOS(this.platformName) ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;\n\n for (const scheme of [libScheme, runnerScheme]) {\n this.log.debug(`Cleaning the project scheme '${scheme}' to make sure there are no leftovers from previous installs`);\n await exec('xcodebuild', [\n 'clean',\n '-project', this.agentPath,\n '-scheme', scheme,\n ]);\n }\n }\n\n getCommand (buildOnly = false) {\n let cmd = 'xcodebuild';\n let args;\n\n // figure out the targets for xcodebuild\n const [buildCmd, testCmd] = this.useSimpleBuildTest ? ['build', 'test'] : ['build-for-testing', 'test-without-building'];\n if (buildOnly) {\n args = [buildCmd];\n } else if (this.usePrebuiltWDA || this.useXctestrunFile) {\n args = [testCmd];\n } else {\n args = [buildCmd, testCmd];\n }\n\n if (this.allowProvisioningDeviceRegistration) {\n // To -allowProvisioningDeviceRegistration flag takes effect, -allowProvisioningUpdates needs to be passed as well.\n args.push('-allowProvisioningUpdates', '-allowProvisioningDeviceRegistration');\n }\n\n if (this.resultBundlePath) {\n args.push('-resultBundlePath', this.resultBundlePath);\n }\n\n if (this.resultBundleVersion) {\n args.push('-resultBundleVersion', this.resultBundleVersion);\n }\n\n if (this.useXctestrunFile) {\n args.push('-xctestrun', this.xctestrunFilePath);\n } else {\n const runnerScheme = isTvOS(this.platformName) ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;\n args.push('-project', this.agentPath, '-scheme', runnerScheme);\n if (this.derivedDataPath) {\n args.push('-derivedDataPath', this.derivedDataPath);\n }\n }\n args.push('-destination', `id=${this.device.udid}`);\n\n const versionMatch = new RegExp(/^(\\d+)\\.(\\d+)/).exec(this.platformVersion);\n if (versionMatch) {\n args.push(\n `${isTvOS(this.platformName) ? 'TV' : 'IPHONE'}OS_DEPLOYMENT_TARGET=${versionMatch[1]}.${versionMatch[2]}`\n );\n } else {\n this.log.warn(`Cannot parse major and minor version numbers from platformVersion \"${this.platformVersion}\". ` +\n 'Will build for the default platform instead');\n }\n\n if (this.realDevice && this.xcodeConfigFile) {\n this.log.debug(`Using Xcode configuration file: '${this.xcodeConfigFile}'`);\n args.push('-xcconfig', this.xcodeConfigFile);\n }\n\n if (!process.env.APPIUM_XCUITEST_TREAT_WARNINGS_AS_ERRORS) {\n // This sometimes helps to survive Xcode updates\n args.push('GCC_TREAT_WARNINGS_AS_ERRORS=0');\n }\n\n // Below option slightly reduces build time in debug build\n // with preventing to generate `/Index/DataStore` which is used by development\n args.push('COMPILER_INDEX_STORE_ENABLE=NO');\n\n return {cmd, args};\n }\n\n async createSubProcess (buildOnly = false) {\n if (!this.useXctestrunFile && this.realDevice) {\n if (this.keychainPath && this.keychainPassword) {\n await setRealDeviceSecurity(this.keychainPath, this.keychainPassword);\n }\n if (this.xcodeOrgId && this.xcodeSigningId && !this.xcodeConfigFile) {\n this.xcodeConfigFile = await generateXcodeConfigFile(this.xcodeOrgId, this.xcodeSigningId);\n }\n }\n\n const {cmd, args} = this.getCommand(buildOnly);\n this.log.debug(`Beginning ${buildOnly ? 'build' : 'test'} with command '${cmd} ${args.join(' ')}' ` +\n `in directory '${this.bootstrapPath}'`);\n const env = Object.assign({}, process.env, {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId || WDA_RUNNER_BUNDLE_ID,\n });\n if (this.mjpegServerPort) {\n // https://github.com/appium/WebDriverAgent/pull/105\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n const upgradeTimestamp = await getWDAUpgradeTimestamp(this.bootstrapPath);\n if (upgradeTimestamp) {\n env.UPGRADE_TIMESTAMP = upgradeTimestamp;\n }\n const xcodebuild = new SubProcess(cmd, args, {\n cwd: this.bootstrapPath,\n env,\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let logXcodeOutput = !!this.showXcodeLog;\n const logMsg = _.isBoolean(this.showXcodeLog)\n ? `Output from xcodebuild ${this.showXcodeLog ? 'will' : 'will not'} be logged`\n : 'Output from xcodebuild will only be logged if any errors are present there';\n this.log.debug(`${logMsg}. To change this, use 'showXcodeLog' desired capability`);\n xcodebuild.on('output', (stdout, stderr) => {\n let out = stdout || stderr;\n // we want to pull out the log file that is created, and highlight it\n // for diagnostic purposes\n if (out.includes('Writing diagnostic log for test session to')) {\n // pull out the first line that begins with the path separator\n // which *should* be the line indicating the log file generated\n xcodebuild.logLocation = _.first(_.remove(out.trim().split('\\n'), (v) => v.startsWith(path.sep)));\n xcodeLog.debug(`Log file for xcodebuild test: ${xcodebuild.logLocation}`);\n }\n\n // if we have an error we want to output the logs\n // otherwise the failure is inscrutible\n // but do not log permission errors from trying to write to attachments folder\n const ignoreError = IGNORED_ERRORS.some((x) => out.includes(x));\n if (this.showXcodeLog !== false && out.includes('Error Domain=') && !ignoreError) {\n logXcodeOutput = true;\n\n // terrible hack to handle case where xcode return 0 but is failing\n xcodebuild._wda_error_occurred = true;\n }\n\n // do not log permission errors from trying to write to attachments folder\n if (logXcodeOutput && !ignoreError) {\n for (const line of out.split(EOL)) {\n xcodeLog.error(line);\n if (line) {\n xcodebuild._wda_error_message += `${EOL}${line}`;\n }\n }\n }\n });\n\n return xcodebuild;\n }\n\n async start (buildOnly = false) {\n this.xcodebuild = await this.createSubProcess(buildOnly);\n // Store xcodebuild message\n this.xcodebuild._wda_error_message = '';\n\n // wrap the start procedure in a promise so that we can catch, and report,\n // any startup errors that are thrown as events\n return await new B((resolve, reject) => {\n this.xcodebuild.on('exit', async (code, signal) => {\n xcodeLog.error(`xcodebuild exited with code '${code}' and signal '${signal}'`);\n // print out the xcodebuild file if users have asked for it\n if (this.showXcodeLog && this.xcodebuild.logLocation) {\n xcodeLog.error(`Contents of xcodebuild log file '${this.xcodebuild.logLocation}':`);\n try {\n let data = await fs.readFile(this.xcodebuild.logLocation, 'utf8');\n for (let line of data.split('\\n')) {\n xcodeLog.error(line);\n }\n } catch (err) {\n xcodeLog.error(`Unable to access xcodebuild log file: '${err.message}'`);\n }\n }\n this.xcodebuild.processExited = true;\n if (this.xcodebuild._wda_error_occurred || (!signal && code !== 0)) {\n return reject(new Error(`xcodebuild failed with code ${code}${EOL}` +\n `xcodebuild error message:${EOL}${this.xcodebuild._wda_error_message}`));\n }\n // in the case of just building, the process will exit and that is our finish\n if (buildOnly) {\n return resolve();\n }\n });\n\n return (async () => {\n try {\n const timer = new timing.Timer().start();\n await this.xcodebuild.start(true);\n if (!buildOnly) {\n let status = await this.waitForStart(timer);\n resolve(status);\n }\n } catch (err) {\n let msg = `Unable to start WebDriverAgent: ${err}`;\n this.log.error(msg);\n reject(new Error(msg));\n }\n })();\n });\n }\n\n async waitForStart (timer) {\n // try to connect once every 0.5 seconds, until `launchTimeout` is up\n this.log.debug(`Waiting up to ${this.launchTimeout}ms for WebDriverAgent to start`);\n let currentStatus = null;\n try {\n let retries = parseInt(this.launchTimeout / 500, 10);\n await retryInterval(retries, 1000, async () => {\n if (this.xcodebuild.processExited) {\n // there has been an error elsewhere and we need to short-circuit\n return;\n }\n const proxyTimeout = this.noSessionProxy.timeout;\n this.noSessionProxy.timeout = 1000;\n try {\n currentStatus = await this.noSessionProxy.command('/status', 'GET');\n if (currentStatus && currentStatus.ios && currentStatus.ios.ip) {\n this.agentUrl = currentStatus.ios.ip;\n }\n this.log.debug(`WebDriverAgent information:`);\n this.log.debug(JSON.stringify(currentStatus, null, 2));\n } catch (err) {\n throw new Error(`Unable to connect to running WebDriverAgent: ${err.message}`);\n } finally {\n this.noSessionProxy.timeout = proxyTimeout;\n }\n });\n\n if (this.xcodebuild.processExited) {\n // there has been an error elsewhere and we need to short-circuit\n return currentStatus;\n }\n\n this.log.debug(`WebDriverAgent successfully started after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n } catch (err) {\n // at this point, if we have not had any errors from xcode itself (reported\n // elsewhere), we can let this go through and try to create the session\n this.log.debug(err.message);\n this.log.warn(`Getting status of WebDriverAgent on device timed out. Continuing`);\n }\n return currentStatus;\n }\n\n async quit () {\n await killProcess('xcodebuild', this.xcodebuild);\n }\n}\n\nexport { XcodeBuild };\nexport default XcodeBuild;\n"],"mappings":"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"}
|
package/lib/constants.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
|
|
3
3
|
const WDA_RUNNER_BUNDLE_ID = 'com.facebook.WebDriverAgentRunner';
|
|
4
|
+
const WDA_RUNNER_BUNDLE_ID_FOR_XCTEST = `${WDA_RUNNER_BUNDLE_ID}.xctrunner`;
|
|
4
5
|
const WDA_RUNNER_APP = 'WebDriverAgentRunner-Runner.app';
|
|
5
6
|
const WDA_SCHEME = 'WebDriverAgentRunner';
|
|
6
7
|
const PROJECT_FILE = 'project.pbxproj';
|
|
@@ -17,5 +18,6 @@ const WDA_UPGRADE_TIMESTAMP_PATH = path.join('.appium', 'webdriveragent', 'upgra
|
|
|
17
18
|
export {
|
|
18
19
|
WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_APP, PROJECT_FILE,
|
|
19
20
|
WDA_SCHEME, PLATFORM_NAME_TVOS, PLATFORM_NAME_IOS,
|
|
20
|
-
SDK_SIMULATOR, SDK_DEVICE, WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH
|
|
21
|
+
SDK_SIMULATOR, SDK_DEVICE, WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,
|
|
22
|
+
WDA_RUNNER_BUNDLE_ID_FOR_XCTEST
|
|
21
23
|
};
|
package/lib/webdriveragent.js
CHANGED
|
@@ -14,8 +14,10 @@ import AsyncLock from 'async-lock';
|
|
|
14
14
|
import { exec } from 'teen_process';
|
|
15
15
|
import { bundleWDASim } from './check-dependencies';
|
|
16
16
|
import {
|
|
17
|
-
WDA_RUNNER_BUNDLE_ID,
|
|
17
|
+
WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_BUNDLE_ID_FOR_XCTEST, WDA_RUNNER_APP,
|
|
18
|
+
WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,
|
|
18
19
|
} from './constants';
|
|
20
|
+
import {Xctest} from 'appium-ios-device';
|
|
19
21
|
|
|
20
22
|
const WDA_LAUNCH_TIMEOUT = 60 * 1000;
|
|
21
23
|
const WDA_AGENT_PORT = 8100;
|
|
@@ -59,31 +61,47 @@ class WebDriverAgent {
|
|
|
59
61
|
|
|
60
62
|
this.updatedWDABundleId = args.updatedWDABundleId;
|
|
61
63
|
|
|
62
|
-
this.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
64
|
+
this.usePreinstalledWDA = args.usePreinstalledWDA;
|
|
65
|
+
this.xctestApiClient = null;
|
|
66
|
+
|
|
67
|
+
// FIXME: maybe 'this.webDriverAgentUrl' also can ignore
|
|
68
|
+
// the xcodebuild instance itself.
|
|
69
|
+
|
|
70
|
+
this.xcodebuild = this.usePreinstalledWDA
|
|
71
|
+
? null
|
|
72
|
+
: new XcodeBuild(this.xcodeVersion, this.device, {
|
|
73
|
+
platformVersion: this.platformVersion,
|
|
74
|
+
platformName: this.platformName,
|
|
75
|
+
iosSdkVersion: this.iosSdkVersion,
|
|
76
|
+
agentPath: this.agentPath,
|
|
77
|
+
bootstrapPath: this.bootstrapPath,
|
|
78
|
+
realDevice: this.isRealDevice,
|
|
79
|
+
showXcodeLog: args.showXcodeLog,
|
|
80
|
+
xcodeConfigFile: args.xcodeConfigFile,
|
|
81
|
+
xcodeOrgId: args.xcodeOrgId,
|
|
82
|
+
xcodeSigningId: args.xcodeSigningId,
|
|
83
|
+
keychainPath: args.keychainPath,
|
|
84
|
+
keychainPassword: args.keychainPassword,
|
|
85
|
+
useSimpleBuildTest: args.useSimpleBuildTest,
|
|
86
|
+
usePrebuiltWDA: args.usePrebuiltWDA,
|
|
87
|
+
updatedWDABundleId: this.updatedWDABundleId,
|
|
88
|
+
launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,
|
|
89
|
+
wdaRemotePort: this.wdaRemotePort,
|
|
90
|
+
useXctestrunFile: this.useXctestrunFile,
|
|
91
|
+
derivedDataPath: args.derivedDataPath,
|
|
92
|
+
mjpegServerPort: this.mjpegServerPort,
|
|
93
|
+
allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,
|
|
94
|
+
resultBundlePath: args.resultBundlePath,
|
|
95
|
+
resultBundleVersion: args.resultBundleVersion,
|
|
96
|
+
}, this.log);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
* @returns {string} Bundle ID for Xctest.
|
|
102
|
+
*/
|
|
103
|
+
get bundleIdForXctest () {
|
|
104
|
+
return `${this.updatedWDABundleId}.xctrunner` || WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;
|
|
87
105
|
}
|
|
88
106
|
|
|
89
107
|
setWDAPaths (bootstrapPath, agentPath) {
|
|
@@ -248,6 +266,9 @@ class WebDriverAgent {
|
|
|
248
266
|
return;
|
|
249
267
|
}
|
|
250
268
|
|
|
269
|
+
if (this.usePreinstalledWDA) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
251
272
|
try {
|
|
252
273
|
await this.xcodebuild.cleanProject();
|
|
253
274
|
} catch (e) {
|
|
@@ -255,6 +276,30 @@ class WebDriverAgent {
|
|
|
255
276
|
}
|
|
256
277
|
}
|
|
257
278
|
|
|
279
|
+
/**
|
|
280
|
+
* Launch WDA with preinstalled package without xcodebuild.
|
|
281
|
+
* @param {string} sessionId Launch WDA and establish the session with this sessionId
|
|
282
|
+
* @return {?object} State Object
|
|
283
|
+
*/
|
|
284
|
+
async launchWithPreinstalledWDA(sessionId) {
|
|
285
|
+
const xctestEnv = {
|
|
286
|
+
USE_PORT: this.wdaLocalPort || WDA_AGENT_PORT,
|
|
287
|
+
WDA_PRODUCT_BUNDLE_IDENTIFIER: this.bundleIdForXctest
|
|
288
|
+
};
|
|
289
|
+
if (this.mjpegServerPort) {
|
|
290
|
+
xctestEnv.MJPEG_SERVER_PORT = this.mjpegServerPort;
|
|
291
|
+
}
|
|
292
|
+
this.log.info('Launching WebDriverAgent on the device without xcodebuild');
|
|
293
|
+
this.xctestApiClient = new Xctest(this.device.udid, this.bundleIdForXctest, null, {env: xctestEnv});
|
|
294
|
+
|
|
295
|
+
await this.xctestApiClient.start();
|
|
296
|
+
|
|
297
|
+
this.setupProxies(sessionId);
|
|
298
|
+
const status = await this.getStatus();
|
|
299
|
+
this.started = true;
|
|
300
|
+
return status;
|
|
301
|
+
}
|
|
302
|
+
|
|
258
303
|
/**
|
|
259
304
|
* Return current running WDA's status like below after launching WDA
|
|
260
305
|
* {
|
|
@@ -286,6 +331,13 @@ class WebDriverAgent {
|
|
|
286
331
|
return await this.getStatus();
|
|
287
332
|
}
|
|
288
333
|
|
|
334
|
+
if (this.usePreinstalledWDA) {
|
|
335
|
+
if (this.isRealDevice) {
|
|
336
|
+
return await this.launchWithPreinstalledWDA(sessionId);
|
|
337
|
+
}
|
|
338
|
+
throw new Error('usePreinstalledWDA is available only for a real device.');
|
|
339
|
+
}
|
|
340
|
+
|
|
289
341
|
this.log.info('Launching WebDriverAgent on the device');
|
|
290
342
|
|
|
291
343
|
this.setupProxies(sessionId);
|
|
@@ -393,10 +445,17 @@ class WebDriverAgent {
|
|
|
393
445
|
}
|
|
394
446
|
|
|
395
447
|
async quit () {
|
|
396
|
-
this.
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
448
|
+
if (this.usePreinstalledWDA) {
|
|
449
|
+
if (this.xctestApiClient) {
|
|
450
|
+
this.log.info('Stopping the XCTest session');
|
|
451
|
+
this.xctestApiClient.stop();
|
|
452
|
+
this.xctestApiClient = null;
|
|
453
|
+
}
|
|
454
|
+
} else {
|
|
455
|
+
this.log.info('Shutting down sub-processes');
|
|
456
|
+
await this.xcodebuild.quit();
|
|
457
|
+
await this.xcodebuild.reset();
|
|
458
|
+
}
|
|
400
459
|
|
|
401
460
|
if (this.jwproxy) {
|
|
402
461
|
this.jwproxy.sessionId = null;
|
|
@@ -437,6 +496,9 @@ class WebDriverAgent {
|
|
|
437
496
|
}
|
|
438
497
|
|
|
439
498
|
async retrieveDerivedDataPath () {
|
|
499
|
+
if (this.usePreinstalledWDA) {
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
440
502
|
return await this.xcodebuild.retrieveDerivedDataPath();
|
|
441
503
|
}
|
|
442
504
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-webdriveragent",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.14.0",
|
|
4
4
|
"description": "Package bundling WebDriverAgent",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
"@appium/base-driver": "^9.0.0",
|
|
87
87
|
"@appium/support": "^3.0.0",
|
|
88
88
|
"@babel/runtime": "^7.0.0",
|
|
89
|
+
"appium-ios-device": "^2.5.0",
|
|
89
90
|
"appium-ios-simulator": "^5.0.1",
|
|
90
91
|
"async-lock": "^1.0.0",
|
|
91
92
|
"asyncbox": "^2.5.3",
|