appium-android-driver 5.10.4 → 5.11.1
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/build/lib/android-helpers.js +1 -1
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +1 -1
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +52 -1
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +1 -1
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +1 -1
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +1 -1
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/execute.js +1 -1
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +1 -1
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +1 -1
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +1 -1
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +1 -1
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +1 -1
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -1
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/keyboard.js +1 -1
- package/build/lib/commands/keyboard.js.map +1 -1
- package/build/lib/commands/log.js +1 -1
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +1 -1
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +6 -55
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +1 -1
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.js +1 -1
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -1
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/streamscreen.js +1 -1
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/touch.js +1 -1
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/driver.js +1 -1
- package/build/lib/driver.js.map +1 -1
- package/build/lib/uiautomator.js +1 -1
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -1
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -1
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/commands/actions.js +135 -0
- package/lib/commands/network.js +18 -90
- package/lib/utils.js +4 -3
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","names":["_logger","_interopRequireDefault","require","_os","_lodash","_ws","_driver","GET_SERVER_LOGS_FEATURE","commands","helpers","extensions","exports","WEBSOCKET_ENDPOINT","sessionId","DEFAULT_WS_PATHNAME_PREFIX","toLogRecord","timestamp","level","message","supportedLogTypes","logcat","description","getter","self","adb","getLogcatLogs","bugreport","output","Date","now","split","os","EOL","map","x","server","ensureFeatureEnabled","log","unwrap","record","_","isEmpty","prefix","mobileStartLogsBroadcast","pathname","getWebSocketHandlers","debug","info","JSON","stringify","address","wss","WebSocket","Server","noServer","on","ws","req","_req$connection","remoteIp","headers","connection","remoteAddress","_logcatWebsocketListener","logRecord","readyState","OPEN","send","setLogcatListener","code","reason","removeLogcatListener","ign","closeMsg","toString","addWebSocketHandler","mobileStopLogsBroadcast","removeWebSocketHandler","getLogTypes","nativeLogTypes","BaseDriver","prototype","call","isWebContext","webLogTypes","chromedriver","jwproxy","command","getLog","logType","keys","includes","type","Object","assign","_default","default"],"sources":["../../../lib/commands/log.js"],"sourcesContent":["import log from '../logger';\nimport os from 'os';\nimport _ from 'lodash';\nimport WebSocket from 'ws';\nimport { DEFAULT_WS_PATHNAME_PREFIX, BaseDriver } from 'appium/driver';\n\nconst GET_SERVER_LOGS_FEATURE = 'get_server_logs';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst WEBSOCKET_ENDPOINT = (sessionId) => `${DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;\n\n// https://github.com/SeleniumHQ/selenium/blob/0d425676b3c9df261dd641917f867d4d5ce7774d/java/client/src/org/openqa/selenium/logging/LogEntry.java\nfunction toLogRecord (timestamp, level, message) {\n return {\n timestamp,\n level,\n message,\n };\n}\n\nextensions.supportedLogTypes = {\n logcat: {\n description: 'Logs for Android applications on real device and emulators via ADB',\n getter: async (self) => await self.adb.getLogcatLogs(),\n },\n bugreport: {\n description: `'adb bugreport' output for advanced issues diagnostic`,\n getter: async (self) => {\n const output = await self.adb.bugreport();\n const timestamp = Date.now();\n return output.split(os.EOL)\n .map((x) => toLogRecord(timestamp, 'ALL', x));\n },\n },\n server: {\n description: 'Appium server logs',\n getter: (self) => {\n self.ensureFeatureEnabled(GET_SERVER_LOGS_FEATURE);\n const timestamp = Date.now();\n return log.unwrap().record\n .map((x) => toLogRecord(timestamp,\n 'ALL',\n _.isEmpty(x.prefix) ? x.message : `[${x.prefix}] ${x.message}`)\n );\n },\n },\n};\n\n/**\n * Starts Android logcat broadcast websocket on the same host and port\n * where Appium server is running at `/ws/session/:sessionId:/appium/logcat` endpoint. The method\n * will return immediately if the web socket is already listening.\n *\n * Each connected websocket listener will receive logcat log lines\n * as soon as they are visible to Appium.\n */\ncommands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (!_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n log.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);\n return;\n }\n\n log.info(`Starting logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n // https://github.com/websockets/ws/blob/master/doc/ws.md\n const wss = new WebSocket.Server({\n noServer: true,\n });\n wss.on('connection', (ws, req) => {\n if (req) {\n const remoteIp = _.isEmpty(req.headers['x-forwarded-for'])\n ? req.connection?.remoteAddress\n : req.headers['x-forwarded-for'];\n log.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);\n } else {\n log.debug('Established a new logcat listener web socket connection');\n }\n\n if (_.isEmpty(this._logcatWebsocketListener)) {\n this._logcatWebsocketListener = (logRecord) => {\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(logRecord.message);\n }\n };\n }\n this.adb.setLogcatListener(this._logcatWebsocketListener);\n\n ws.on('close', (code, reason) => {\n if (!_.isEmpty(this._logcatWebsocketListener)) {\n try {\n this.adb.removeLogcatListener(this._logcatWebsocketListener);\n } catch (ign) {}\n this._logcatWebsocketListener = null;\n }\n\n let closeMsg = 'Logcat listener web socket is closed.';\n if (!_.isEmpty(code)) {\n closeMsg += ` Code: ${code}.`;\n }\n if (!_.isEmpty(reason)) {\n closeMsg += ` Reason: ${reason.toString()}.`;\n }\n log.debug(closeMsg);\n });\n });\n await this.server.addWebSocketHandler(pathname, wss);\n};\n\n/**\n * Stops the previously started logcat broadcasting wesocket server.\n * This method will return immediately if no server is running.\n */\ncommands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n return;\n }\n\n log.debug(`Stopping logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n await this.server.removeWebSocketHandler(pathname);\n};\n\ncommands.getLogTypes = async function getLogTypes () {\n const nativeLogTypes = await BaseDriver.prototype.getLogTypes.call(this);\n if (this.isWebContext()) {\n const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');\n return [...nativeLogTypes, ...webLogTypes];\n }\n return nativeLogTypes;\n};\n\ncommands.getLog = async function getLog (logType) {\n if (this.isWebContext() && !_.keys(this.supportedLogTypes).includes(logType)) {\n return await this.chromedriver.jwproxy.command('/log', 'POST', {type: logType});\n }\n return await BaseDriver.prototype.getLog.call(this, logType);\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log.js","names":["_logger","_interopRequireDefault","require","_os","_lodash","_ws","_driver","GET_SERVER_LOGS_FEATURE","commands","helpers","extensions","exports","WEBSOCKET_ENDPOINT","sessionId","DEFAULT_WS_PATHNAME_PREFIX","toLogRecord","timestamp","level","message","supportedLogTypes","logcat","description","getter","self","adb","getLogcatLogs","bugreport","output","Date","now","split","os","EOL","map","x","server","ensureFeatureEnabled","log","unwrap","record","_","isEmpty","prefix","mobileStartLogsBroadcast","pathname","getWebSocketHandlers","debug","info","JSON","stringify","address","wss","WebSocket","Server","noServer","on","ws","req","_req$connection","remoteIp","headers","connection","remoteAddress","_logcatWebsocketListener","logRecord","readyState","OPEN","send","setLogcatListener","code","reason","removeLogcatListener","ign","closeMsg","toString","addWebSocketHandler","mobileStopLogsBroadcast","removeWebSocketHandler","getLogTypes","nativeLogTypes","BaseDriver","prototype","call","isWebContext","webLogTypes","chromedriver","jwproxy","command","getLog","logType","keys","includes","type","Object","assign","_default","default"],"sources":["../../../lib/commands/log.js"],"sourcesContent":["import log from '../logger';\nimport os from 'os';\nimport _ from 'lodash';\nimport WebSocket from 'ws';\nimport { DEFAULT_WS_PATHNAME_PREFIX, BaseDriver } from 'appium/driver';\n\nconst GET_SERVER_LOGS_FEATURE = 'get_server_logs';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst WEBSOCKET_ENDPOINT = (sessionId) => `${DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;\n\n// https://github.com/SeleniumHQ/selenium/blob/0d425676b3c9df261dd641917f867d4d5ce7774d/java/client/src/org/openqa/selenium/logging/LogEntry.java\nfunction toLogRecord (timestamp, level, message) {\n return {\n timestamp,\n level,\n message,\n };\n}\n\nextensions.supportedLogTypes = {\n logcat: {\n description: 'Logs for Android applications on real device and emulators via ADB',\n getter: async (self) => await self.adb.getLogcatLogs(),\n },\n bugreport: {\n description: `'adb bugreport' output for advanced issues diagnostic`,\n getter: async (self) => {\n const output = await self.adb.bugreport();\n const timestamp = Date.now();\n return output.split(os.EOL)\n .map((x) => toLogRecord(timestamp, 'ALL', x));\n },\n },\n server: {\n description: 'Appium server logs',\n getter: (self) => {\n self.ensureFeatureEnabled(GET_SERVER_LOGS_FEATURE);\n const timestamp = Date.now();\n return log.unwrap().record\n .map((x) => toLogRecord(timestamp,\n 'ALL',\n _.isEmpty(x.prefix) ? x.message : `[${x.prefix}] ${x.message}`)\n );\n },\n },\n};\n\n/**\n * Starts Android logcat broadcast websocket on the same host and port\n * where Appium server is running at `/ws/session/:sessionId:/appium/logcat` endpoint. The method\n * will return immediately if the web socket is already listening.\n *\n * Each connected websocket listener will receive logcat log lines\n * as soon as they are visible to Appium.\n */\ncommands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (!_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n log.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);\n return;\n }\n\n log.info(`Starting logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n // https://github.com/websockets/ws/blob/master/doc/ws.md\n const wss = new WebSocket.Server({\n noServer: true,\n });\n wss.on('connection', (ws, req) => {\n if (req) {\n const remoteIp = _.isEmpty(req.headers['x-forwarded-for'])\n ? req.connection?.remoteAddress\n : req.headers['x-forwarded-for'];\n log.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);\n } else {\n log.debug('Established a new logcat listener web socket connection');\n }\n\n if (_.isEmpty(this._logcatWebsocketListener)) {\n this._logcatWebsocketListener = (logRecord) => {\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(logRecord.message);\n }\n };\n }\n this.adb.setLogcatListener(this._logcatWebsocketListener);\n\n ws.on('close', (code, reason) => {\n if (!_.isEmpty(this._logcatWebsocketListener)) {\n try {\n this.adb.removeLogcatListener(this._logcatWebsocketListener);\n } catch (ign) {}\n this._logcatWebsocketListener = null;\n }\n\n let closeMsg = 'Logcat listener web socket is closed.';\n if (!_.isEmpty(code)) {\n closeMsg += ` Code: ${code}.`;\n }\n if (!_.isEmpty(reason)) {\n closeMsg += ` Reason: ${reason.toString()}.`;\n }\n log.debug(closeMsg);\n });\n });\n await this.server.addWebSocketHandler(pathname, wss);\n};\n\n/**\n * Stops the previously started logcat broadcasting wesocket server.\n * This method will return immediately if no server is running.\n */\ncommands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n return;\n }\n\n log.debug(`Stopping logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n await this.server.removeWebSocketHandler(pathname);\n};\n\ncommands.getLogTypes = async function getLogTypes () {\n const nativeLogTypes = await BaseDriver.prototype.getLogTypes.call(this);\n if (this.isWebContext()) {\n const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');\n return [...nativeLogTypes, ...webLogTypes];\n }\n return nativeLogTypes;\n};\n\ncommands.getLog = async function getLog (logType) {\n if (this.isWebContext() && !_.keys(this.supportedLogTypes).includes(logType)) {\n return await this.chromedriver.jwproxy.command('/log', 'POST', {type: logType});\n }\n return await BaseDriver.prototype.getLog.call(this, logType);\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
@@ -193,4 +193,4 @@ commands.mobileStopMediaProjectionRecording = async function mobileStopMediaProj
|
|
|
193
193
|
};
|
|
194
194
|
var _default = commands;
|
|
195
195
|
exports.default = _default;
|
|
196
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfc3VwcG9ydCIsIl9wYXRoIiwiX2JsdWViaXJkIiwiX2FuZHJvaWRIZWxwZXJzIiwiX21vbWVudCIsImNvbW1hbmRzIiwiZXhwb3J0cyIsIkRFRkFVTFRfRVhUIiwiUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIlJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMiLCJNSU5fQVBJX0xFVkVMIiwiUkVDT1JESU5HX1NFUlZJQ0VfTkFNRSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSIsIlJFQ09SRElOR19BQ1RJT05fU1RBUlQiLCJSRUNPUkRJTkdfQUNUSU9OX1NUT1AiLCJSRUNPUkRJTkdTX1JPT1QiLCJERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5IiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzIiwibWV0aG9kIiwiaGVhZGVycyIsImZpbGVGaWVsZE5hbWUiLCJmb3JtRmllbGRzIiwidXBsb2FkVGltZW91dCIsInRpbWVvdXQiLCJvcHRpb25zIiwiYXV0aCIsIm5ldCIsInVwbG9hZEZpbGUiLCJhZGp1c3RNZWRpYUV4dGVuc2lvbiIsIm5hbWUiLCJ0b0xvd2VyIiwiZW5kc1dpdGgiLCJ2ZXJpZnlNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdJc1N1cHBvcnRlZCIsImFkYiIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJFcnJvciIsIk1lZGlhUHJvamVjdGlvblJlY29yZGVyIiwiY29uc3RydWN0b3IiLCJpc1J1bm5pbmciLCJzdGRvdXQiLCJzaGVsbCIsImluY2x1ZGVzIiwic3RhcnQiLCJvcHRzIiwiY2xlYW51cCIsImZpbGVuYW1lIiwibWF4RHVyYXRpb25TZWMiLCJwcmlvcml0eSIsInJlc29sdXRpb24iLCJhcmdzIiwicHVzaCIsIkIiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsInB1bGxSZWNlbnQiLCJyZWNvcmRpbmdzIiwibHMiLCJkc3RQYXRoIiwicGF0aCIsImpvaW4iLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGwiLCJzdG9wIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJlIiwibW9iaWxlU3RhcnRNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJyZWNvcmRlciIsImZuYW1lIiwibW9tZW50IiwiZm9ybWF0IiwiZGlkU3RhcnQiLCJsb2ciLCJpbmZvIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsInJlY2VudFJlY29yZGluZ1BhdGgiLCJzaXplIiwiZnMiLCJzdGF0IiwiZGVidWciLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyIsInJpbXJhZiIsImRpcm5hbWUiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbWVkaWEtcHJvamVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwsIGZzLCBuZXQsIHRlbXBEaXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBTRVRUSU5HU19IRUxQRVJfUEtHX0lEIH0gZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2lvLmFwcGl1bS5zZXR0aW5ncyNpbnRlcm5hbC1hdWRpby0tdmlkZW8tcmVjb3JkaW5nXG5jb25zdCBERUZBVUxUX0VYVCA9ICcubXA0JztcbmNvbnN0IFJFQ09SRElOR19TVEFSVFVQX1RJTUVPVVRfTVMgPSAzICogMTAwMDtcbmNvbnN0IFJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMgPSAzICogMTAwMDtcbmNvbnN0IE1JTl9BUElfTEVWRUwgPSAyOTtcbmNvbnN0IFJFQ09SRElOR19TRVJWSUNFX05BTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ucmVjb3JkZXIuUmVjb3JkZXJTZXJ2aWNlYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJVklUWV9OQU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vaW8uYXBwaXVtLnNldHRpbmdzLlNldHRpbmdzYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJT05fU1RBUlQgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS5yZWNvcmRpbmcuQUNUSU9OX1NUQVJUYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJT05fU1RPUCA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9LnJlY29yZGluZy5BQ1RJT05fU1RPUGA7XG5jb25zdCBSRUNPUkRJTkdTX1JPT1QgPSBgL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS9maWxlc2A7XG5jb25zdCBERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCA9ICdZWVlZLU1NLUREVEhILW1tLXNzJztcblxuXG5hc3luYyBmdW5jdGlvbiB1cGxvYWRSZWNvcmRlZE1lZGlhIChsb2NhbEZpbGUsIHJlbW90ZVBhdGggPSBudWxsLCB1cGxvYWRPcHRpb25zID0ge30pIHtcbiAgaWYgKF8uaXNFbXB0eShyZW1vdGVQYXRoKSkge1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgdXNlcixcbiAgICBwYXNzLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGZpbGVGaWVsZE5hbWUsXG4gICAgZm9ybUZpZWxkcyxcbiAgICB1cGxvYWRUaW1lb3V0OiB0aW1lb3V0LFxuICB9ID0gdXBsb2FkT3B0aW9ucztcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBtZXRob2Q6IG1ldGhvZCB8fCAnUFVUJyxcbiAgICBoZWFkZXJzLFxuICAgIGZpbGVGaWVsZE5hbWUsXG4gICAgZm9ybUZpZWxkcyxcbiAgICB0aW1lb3V0LFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gYWRqdXN0TWVkaWFFeHRlbnNpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihuYW1lKS5lbmRzV2l0aChERUZBVUxUX0VYVCkgPyBuYW1lIDogYCR7bmFtZX0ke0RFRkFVTFRfRVhUfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeU1lZGlhUHJvamVjdGlvblJlY29yZGluZ0lzU3VwcG9ydGVkIChhZGIpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsIDwgTUlOX0FQSV9MRVZFTCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWVkaWEgcHJvamVjdGlvbi1iYXNlZCByZWNvcmRpbmcgaXMgbm90IGF2YWlsYWJsZSBvbiBBUEkgTGV2ZWwgJHthcGlMZXZlbH0uIGAgK1xuICAgICAgYE1pbmltdW0gcmVxdWlyZWQgQVBJIExldmVsIGlzICR7TUlOX0FQSV9MRVZFTH0uYCk7XG4gIH1cbn1cblxuXG5jbGFzcyBNZWRpYVByb2plY3Rpb25SZWNvcmRlciB7XG4gIGNvbnN0cnVjdG9yIChhZGIpIHtcbiAgICB0aGlzLmFkYiA9IGFkYjtcbiAgfVxuXG4gIGFzeW5jIGlzUnVubmluZyAoKSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgJ2R1bXBzeXMnLCAnYWN0aXZpdHknLCAnc2VydmljZXMnLCBSRUNPUkRJTkdfU0VSVklDRV9OQU1FXG4gICAgXSk7XG4gICAgcmV0dXJuIHN0ZG91dC5pbmNsdWRlcyhSRUNPUkRJTkdfU0VSVklDRV9OQU1FKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChvcHRzID0ge30pIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgbWF4RHVyYXRpb25TZWMsXG4gICAgICBwcmlvcml0eSxcbiAgICAgIHJlc29sdXRpb24sXG4gICAgfSA9IG9wdHM7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RBUlQsXG4gICAgXTtcbiAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdmaWxlbmFtZScsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgaWYgKG1heER1cmF0aW9uU2VjKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZXMnLCAnbWF4X2R1cmF0aW9uX3NlYycsIGAke21heER1cmF0aW9uU2VjfWApO1xuICAgIH1cbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdwcmlvcml0eScsIHByaW9yaXR5KTtcbiAgICB9XG4gICAgaWYgKHJlc29sdXRpb24pIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdyZXNvbHV0aW9uJywgcmVzb2x1dGlvbik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGFyZ3MpO1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaGUgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaXMgbm90IHJ1bm5pbmcgYWZ0ZXIgJHtSRUNPUkRJTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zLiBgICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscy5gXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwICgpIHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbYHJtIC1mICR7UkVDT1JESU5HU19ST09UfS8qYF0pO1xuICB9XG5cbiAgYXN5bmMgcHVsbFJlY2VudCAoKSB7XG4gICAgY29uc3QgcmVjb3JkaW5ncyA9IGF3YWl0IHRoaXMuYWRiLmxzKFJFQ09SRElOR1NfUk9PVCwgWyctdHInXSk7XG4gICAgaWYgKF8uaXNFbXB0eShyZWNvcmRpbmdzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgcmVjb3JkaW5nc1swXSk7XG4gICAgLy8gaW5jcmVhc2UgdGltZW91dCB0byA1IG1pbnV0ZXMgYmVjYXVzZSBpdCBtaWdodCB0YWtlIGEgd2hpbGUgdG8gcHVsbCBhIGxhcmdlIHZpZGVvIGZpbGVcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKGAke1JFQ09SRElOR1NfUk9PVH0vJHtyZWNvcmRpbmdzWzBdfWAsIGRzdFBhdGgsIHt0aW1lb3V0OiAzMDAwMDB9KTtcbiAgICByZXR1cm4gZHN0UGF0aDtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RPUCxcbiAgICBdKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiAhKGF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpLCB7XG4gICAgICAgIHdhaXRNczogUkVDT1JESU5HX1NUT1BfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGF0dGVtcHQgdG8gc3RvcCB0aGUgY3VycmVudCBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyB0aW1lZCBvdXQgYWZ0ZXIgYCArXG4gICAgICAgIGAke1JFQ09SRElOR19TVE9QX1RJTUVPVVRfTVN9bXNgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSByZXNvbHV0aW9uIE1heGltdW0gc3VwcG9ydGVkIHJlc29sdXRpb24gb24tZGV2aWNlIChEZXRlY3RlZFxuICogYXV0b21hdGljYWxseSBieSB0aGUgYXBwIGl0c2VsZiksIHdoaWNoIHVzdWFsbHkgZXF1YWxzIHRvIEZ1bGwgSEQgMTkyMHgxMDgwIG9uIG1vc3RcbiAqIHBob25lcyBob3dldmVyIHlvdSBjYW4gY2hhbmdlIGl0IHRvIGZvbGxvd2luZyBzdXBwb3J0ZWQgcmVzb2x1dGlvbnNcbiAqIGFzIHdlbGw6IFwiMTkyMHgxMDgwXCIsIFwiMTI4MHg3MjBcIiwgXCI3MjB4NDgwXCIsIFwiMzIweDI0MFwiLCBcIjE3NngxNDRcIi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gbWF4RHVyYXRpb25TZWMgWzkwMF0gRGVmYXVsdCB2YWx1ZTogOTAwIHNlY29uZHMgd2hpY2ggbWVhbnNcbiAqIG1heGltdW0gYWxsb3dlZCBkdXJhdGlvbiBpcyAxNSBtaW51dGUsIHlvdSBjYW4gaW5jcmVhc2UgaXQgaWYgeW91ciB0ZXN0IHRha2VzXG4gKiBsb25nZXIgdGhhbiB0aGF0LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwcmlvcml0eSBbaGlnaF0gTWVhbnMgcmVjb3JkaW5nIHRocmVhZCBwcmlvcml0eSBpcyBtYXhpbXVtXG4gKiBob3dldmVyIGlmIHlvdSBmYWNlIHBlcmZvcm1hbmNlIGRyb3BzIGR1cmluZyB0ZXN0aW5nIHdpdGggcmVjb3JkaW5nIGVuYWJsZWQsIHlvdVxuICogY2FuIHJlZHVjZSByZWNvcmRpbmcgcHJpb3JpdHkgdG8gXCJub3JtYWxcIiBvciBcImxvd1wiLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBmaWxlbmFtZSBZb3UgY2FuIHR5cGUgcmVjb3JkaW5nIHZpZGVvIGZpbGUgbmFtZSBhcyB5b3Ugd2FudCxcbiAqIGJ1dCByZWNvcmRpbmcgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgXCJtcDRcIiBmb3JtYXQgc28geW91ciBmaWxlbmFtZSBtdXN0IGVuZCB3aXRoIFwiLm1wNFwiLlxuICogQW4gaW52YWxpZCBmaWxlIG5hbWUgd2lsbCBmYWlsIHRvIHN0YXJ0IHRoZSByZWNvcmRpbmcuXG4gKiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2lsbCBiZSB1c2VkIGFzIGZpbGUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIFJlY29yZCB0aGUgZGlzcGxheSBvZiBhIHJlYWwgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQgMTAgKEFQSSBsZXZlbCAyOSkgYW5kIGhpZ2hlci5cbiAqIFRoZSBzY3JlZW4gYWN0aXZpdHkgaXMgcmVjb3JkZWQgdG8gYSBNUEVHLTQgZmlsZS4gQXVkaW8gaXMgYWxzbyByZWNvcmRlZCBieSBkZWZhdWx0XG4gKiAob25seSBmb3IgYXBwcyB0aGF0IGFsbG93IGl0IGluIHRoZWlyIG1hbmlmZXN0cykuXG4gKiBJZiBhbm90aGVyIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQgdGhlbiB0aGUgY29tbWFuZCB3aWxsIGV4aXQgc2lsZW50bHkuXG4gKiBUaGUgcHJldmlvdXNseSByZWNvcmRlZCB2aWRlbyBmaWxlIGlzIGRlbGV0ZWQgd2hlbiBhIG5ldyByZWNvcmRpbmcgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICogUmVjb3JkaW5nIGNvbnRpbnVlcyBpdCBpcyBzdG9wcGVkIGV4cGxpY2l0bHkgb3IgdW50aWwgdGhlIHRpbWVvdXQgaGFwcGVucy5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgQXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIG5ldyByZWNvcmRpbmcgaGFzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHJlY29yZGluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIChvcHRpb25zID0ge30pIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHtyZXNvbHV0aW9uLCBwcmlvcml0eSwgbWF4RHVyYXRpb25TZWMsIGZpbGVuYW1lfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgY29uc3QgZm5hbWUgPSBhZGp1c3RNZWRpYUV4dGVuc2lvbihmaWxlbmFtZSB8fCBtb21lbnQoKS5mb3JtYXQoREVGQVVMVF9GSUxFTkFNRV9GT1JNQVQpKTtcbiAgY29uc3QgZGlkU3RhcnQgPSBhd2FpdCByZWNvcmRlci5zdGFydCh7XG4gICAgcmVzb2x1dGlvbixcbiAgICBwcmlvcml0eSxcbiAgICBtYXhEdXJhdGlvblNlYyxcbiAgICBmaWxlbmFtZTogZm5hbWUsXG4gIH0pO1xuICBpZiAoZGlkU3RhcnQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBBIG5ldyBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyAnJHtmbmFtZX0nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdGFydGVkYCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbygnQW5vdGhlciBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzLiBUaGVyZSBpcyBub3RoaW5nIHRvIHN0YXJ0Jyk7XG4gIH1cbiAgcmV0dXJuIGRpZFN0YXJ0O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtZWRpYSBwcm9qZWN0aW9uLWJhc2VkIHJlY29yZGluZyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIHJlY29yZGluZyBpcyBpbiBwcm9ncmVzcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMubW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nICgpIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgcmV0dXJuIGF3YWl0IHJlY29yZGVyLmlzUnVubmluZygpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdG9wUmVjb3JkaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gcmVtb3RlUGF0aCBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgcmVzdWx0aW5nIHZpZGVvIHNob3VsZCBiZSB1cGxvYWRlZC5cbiAqIFRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQ6IGh0dHAvaHR0cHMsIGZ0cC5cbiAqIE51bGwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBtZWFucyB0aGUgY29udGVudCBvZiByZXN1bHRpbmdcbiAqIGZpbGUgc2hvdWxkIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCBwYXNzZWQgYXMgdGhlIGVuZHBvb250IHJlc3BvbnNlIHZhbHVlLlxuICogQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBnZW5lcmF0ZWQgbWVkaWEgZmlsZSBpcyB0b28gYmlnIHRvXG4gKiBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHByb2Nlc3MgbWVtb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1c2VyIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwYXNzIFRoZSBwYXNzd29yZCBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gbWV0aG9kIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIFRoZSAnUFVUJyBvbmUgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtPYmplY3Q/fSBoZWFkZXJzIEFkZGl0aW9uYWwgaGVhZGVycyBtYXBwaW5nIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGZpbGVGaWVsZE5hbWUgW2ZpbGVdIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGZpZWxkLCB3aGVyZSB0aGUgZmlsZSBjb250ZW50IEJMT0Igc2hvdWxkIGJlIHN0b3JlZCBmb3JcbiAqIGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHtPYmplY3R8QXJyYXk8UGFpcj4/fSBmb3JtRmllbGRzIEFkZGl0aW9uYWwgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gdXBsb2FkVGltZW91dCAtIFRoZSBhY3R1YWwgbWVkaWEgdXBsb2FkIHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHM7XG4gKiBkZWZhdWx0cyB0byBAYXBwaXVtL3N1cHBvcnQgbmV0IERFRkFVTFRfVElNRU9VVF9NU1xuICovXG5cbi8qKlxuICogU3RvcCBhIG1lZGlhIHByb2plY3Rpb24tYmFzZWQgcmVjb3JkaW5nLlxuICogSWYgbm8gcmVjb3JkaW5nIGhhcyBiZWVuIHN0YXJ0ZWQgYmVmb3JlIHRoZW4gYW4gZXJyb3IgaXMgdGhyb3duLlxuICogSWYgdGhlIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IGZpbmlzaGVkIGJlZm9yZSB0aGlzIEFQSSBoYXMgYmVlbiBjYWxsZWRcbiAqIHRoZW4gdGhlIG1vc3QgcmVjZW50IHJlY29yZGVkIGZpbGUgaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHs/U3RvcFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgQXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSByZWNvcmRlZCBtZWRpYSBmaWxlIGlmICdyZW1vdGVQYXRoJ1xuICogcGFyYW1ldGVyIGlzIGZhbHN5IG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgc3RvcHBpbmcgYSByZWNvcmRpbmcsXG4gKiBmZXRjaGluZyB0aGUgY29udGVudCBvZiB0aGUgcmVtb3RlIG1lZGlhIGZpbGUsXG4gKiBvciBpZiBhIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcgKG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCB2ZXJpZnlNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdJc1N1cHBvcnRlZCh0aGlzLmFkYik7XG5cbiAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFQcm9qZWN0aW9uUmVjb3JkZXIodGhpcy5hZGIpO1xuICBpZiAoYXdhaXQgcmVjb3JkZXIuc3RvcCgpKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnU3VjY2Vzc2Z1bGx5IHN0b3BwZWQgYSBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZy4gUHVsbGluZyB0aGUgcmVjb3JkZWQgbWVkaWEnKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdNZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBzdG9wJyk7XG4gIH1cbiAgY29uc3QgcmVjZW50UmVjb3JkaW5nUGF0aCA9IGF3YWl0IHJlY29yZGVyLnB1bGxSZWNlbnQoKTtcbiAgaWYgKCFyZWNlbnRSZWNvcmRpbmdQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWNlbnQgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaGF2ZSBiZWVuIGZvdW5kLiBEaWQgeW91IHN0YXJ0IGFueT9gKTtcbiAgfVxuXG4gIGNvbnN0IHtyZW1vdGVQYXRofSA9IG9wdGlvbnM7XG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBmcy5zdGF0KHJlY2VudFJlY29yZGluZ1BhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nIGlzICR7dXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZyhzaXplKX1gKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1cGxvYWRSZWNvcmRlZE1lZGlhKHJlY2VudFJlY29yZGluZ1BhdGgsIHJlbW90ZVBhdGgsIG9wdGlvbnMpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZihwYXRoLmRpcm5hbWUocmVjZW50UmVjb3JkaW5nUGF0aCkpO1xuICB9XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxRQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxlQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFHQSxNQUFNTyxRQUFR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
|
|
196
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfc3VwcG9ydCIsIl9wYXRoIiwiX2JsdWViaXJkIiwiX2FuZHJvaWRIZWxwZXJzIiwiX21vbWVudCIsImNvbW1hbmRzIiwiZXhwb3J0cyIsIkRFRkFVTFRfRVhUIiwiUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIlJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMiLCJNSU5fQVBJX0xFVkVMIiwiUkVDT1JESU5HX1NFUlZJQ0VfTkFNRSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSIsIlJFQ09SRElOR19BQ1RJT05fU1RBUlQiLCJSRUNPUkRJTkdfQUNUSU9OX1NUT1AiLCJSRUNPUkRJTkdTX1JPT1QiLCJERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5IiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzIiwibWV0aG9kIiwiaGVhZGVycyIsImZpbGVGaWVsZE5hbWUiLCJmb3JtRmllbGRzIiwidXBsb2FkVGltZW91dCIsInRpbWVvdXQiLCJvcHRpb25zIiwiYXV0aCIsIm5ldCIsInVwbG9hZEZpbGUiLCJhZGp1c3RNZWRpYUV4dGVuc2lvbiIsIm5hbWUiLCJ0b0xvd2VyIiwiZW5kc1dpdGgiLCJ2ZXJpZnlNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdJc1N1cHBvcnRlZCIsImFkYiIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJFcnJvciIsIk1lZGlhUHJvamVjdGlvblJlY29yZGVyIiwiY29uc3RydWN0b3IiLCJpc1J1bm5pbmciLCJzdGRvdXQiLCJzaGVsbCIsImluY2x1ZGVzIiwic3RhcnQiLCJvcHRzIiwiY2xlYW51cCIsImZpbGVuYW1lIiwibWF4RHVyYXRpb25TZWMiLCJwcmlvcml0eSIsInJlc29sdXRpb24iLCJhcmdzIiwicHVzaCIsIkIiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsInB1bGxSZWNlbnQiLCJyZWNvcmRpbmdzIiwibHMiLCJkc3RQYXRoIiwicGF0aCIsImpvaW4iLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGwiLCJzdG9wIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJlIiwibW9iaWxlU3RhcnRNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJyZWNvcmRlciIsImZuYW1lIiwibW9tZW50IiwiZm9ybWF0IiwiZGlkU3RhcnQiLCJsb2ciLCJpbmZvIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsInJlY2VudFJlY29yZGluZ1BhdGgiLCJzaXplIiwiZnMiLCJzdGF0IiwiZGVidWciLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyIsInJpbXJhZiIsImRpcm5hbWUiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbWVkaWEtcHJvamVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwsIGZzLCBuZXQsIHRlbXBEaXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBTRVRUSU5HU19IRUxQRVJfUEtHX0lEIH0gZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2lvLmFwcGl1bS5zZXR0aW5ncyNpbnRlcm5hbC1hdWRpby0tdmlkZW8tcmVjb3JkaW5nXG5jb25zdCBERUZBVUxUX0VYVCA9ICcubXA0JztcbmNvbnN0IFJFQ09SRElOR19TVEFSVFVQX1RJTUVPVVRfTVMgPSAzICogMTAwMDtcbmNvbnN0IFJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMgPSAzICogMTAwMDtcbmNvbnN0IE1JTl9BUElfTEVWRUwgPSAyOTtcbmNvbnN0IFJFQ09SRElOR19TRVJWSUNFX05BTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ucmVjb3JkZXIuUmVjb3JkZXJTZXJ2aWNlYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJVklUWV9OQU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vaW8uYXBwaXVtLnNldHRpbmdzLlNldHRpbmdzYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJT05fU1RBUlQgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS5yZWNvcmRpbmcuQUNUSU9OX1NUQVJUYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJT05fU1RPUCA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9LnJlY29yZGluZy5BQ1RJT05fU1RPUGA7XG5jb25zdCBSRUNPUkRJTkdTX1JPT1QgPSBgL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS9maWxlc2A7XG5jb25zdCBERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCA9ICdZWVlZLU1NLUREVEhILW1tLXNzJztcblxuXG5hc3luYyBmdW5jdGlvbiB1cGxvYWRSZWNvcmRlZE1lZGlhIChsb2NhbEZpbGUsIHJlbW90ZVBhdGggPSBudWxsLCB1cGxvYWRPcHRpb25zID0ge30pIHtcbiAgaWYgKF8uaXNFbXB0eShyZW1vdGVQYXRoKSkge1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgdXNlcixcbiAgICBwYXNzLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGZpbGVGaWVsZE5hbWUsXG4gICAgZm9ybUZpZWxkcyxcbiAgICB1cGxvYWRUaW1lb3V0OiB0aW1lb3V0LFxuICB9ID0gdXBsb2FkT3B0aW9ucztcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBtZXRob2Q6IG1ldGhvZCB8fCAnUFVUJyxcbiAgICBoZWFkZXJzLFxuICAgIGZpbGVGaWVsZE5hbWUsXG4gICAgZm9ybUZpZWxkcyxcbiAgICB0aW1lb3V0LFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gYWRqdXN0TWVkaWFFeHRlbnNpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihuYW1lKS5lbmRzV2l0aChERUZBVUxUX0VYVCkgPyBuYW1lIDogYCR7bmFtZX0ke0RFRkFVTFRfRVhUfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeU1lZGlhUHJvamVjdGlvblJlY29yZGluZ0lzU3VwcG9ydGVkIChhZGIpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsIDwgTUlOX0FQSV9MRVZFTCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWVkaWEgcHJvamVjdGlvbi1iYXNlZCByZWNvcmRpbmcgaXMgbm90IGF2YWlsYWJsZSBvbiBBUEkgTGV2ZWwgJHthcGlMZXZlbH0uIGAgK1xuICAgICAgYE1pbmltdW0gcmVxdWlyZWQgQVBJIExldmVsIGlzICR7TUlOX0FQSV9MRVZFTH0uYCk7XG4gIH1cbn1cblxuXG5jbGFzcyBNZWRpYVByb2plY3Rpb25SZWNvcmRlciB7XG4gIGNvbnN0cnVjdG9yIChhZGIpIHtcbiAgICB0aGlzLmFkYiA9IGFkYjtcbiAgfVxuXG4gIGFzeW5jIGlzUnVubmluZyAoKSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgJ2R1bXBzeXMnLCAnYWN0aXZpdHknLCAnc2VydmljZXMnLCBSRUNPUkRJTkdfU0VSVklDRV9OQU1FXG4gICAgXSk7XG4gICAgcmV0dXJuIHN0ZG91dC5pbmNsdWRlcyhSRUNPUkRJTkdfU0VSVklDRV9OQU1FKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChvcHRzID0ge30pIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgbWF4RHVyYXRpb25TZWMsXG4gICAgICBwcmlvcml0eSxcbiAgICAgIHJlc29sdXRpb24sXG4gICAgfSA9IG9wdHM7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RBUlQsXG4gICAgXTtcbiAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdmaWxlbmFtZScsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgaWYgKG1heER1cmF0aW9uU2VjKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZXMnLCAnbWF4X2R1cmF0aW9uX3NlYycsIGAke21heER1cmF0aW9uU2VjfWApO1xuICAgIH1cbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdwcmlvcml0eScsIHByaW9yaXR5KTtcbiAgICB9XG4gICAgaWYgKHJlc29sdXRpb24pIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdyZXNvbHV0aW9uJywgcmVzb2x1dGlvbik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGFyZ3MpO1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaGUgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaXMgbm90IHJ1bm5pbmcgYWZ0ZXIgJHtSRUNPUkRJTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zLiBgICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscy5gXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwICgpIHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbYHJtIC1mICR7UkVDT1JESU5HU19ST09UfS8qYF0pO1xuICB9XG5cbiAgYXN5bmMgcHVsbFJlY2VudCAoKSB7XG4gICAgY29uc3QgcmVjb3JkaW5ncyA9IGF3YWl0IHRoaXMuYWRiLmxzKFJFQ09SRElOR1NfUk9PVCwgWyctdHInXSk7XG4gICAgaWYgKF8uaXNFbXB0eShyZWNvcmRpbmdzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgcmVjb3JkaW5nc1swXSk7XG4gICAgLy8gaW5jcmVhc2UgdGltZW91dCB0byA1IG1pbnV0ZXMgYmVjYXVzZSBpdCBtaWdodCB0YWtlIGEgd2hpbGUgdG8gcHVsbCBhIGxhcmdlIHZpZGVvIGZpbGVcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKGAke1JFQ09SRElOR1NfUk9PVH0vJHtyZWNvcmRpbmdzWzBdfWAsIGRzdFBhdGgsIHt0aW1lb3V0OiAzMDAwMDB9KTtcbiAgICByZXR1cm4gZHN0UGF0aDtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RPUCxcbiAgICBdKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiAhKGF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpLCB7XG4gICAgICAgIHdhaXRNczogUkVDT1JESU5HX1NUT1BfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGF0dGVtcHQgdG8gc3RvcCB0aGUgY3VycmVudCBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyB0aW1lZCBvdXQgYWZ0ZXIgYCArXG4gICAgICAgIGAke1JFQ09SRElOR19TVE9QX1RJTUVPVVRfTVN9bXNgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSByZXNvbHV0aW9uIE1heGltdW0gc3VwcG9ydGVkIHJlc29sdXRpb24gb24tZGV2aWNlIChEZXRlY3RlZFxuICogYXV0b21hdGljYWxseSBieSB0aGUgYXBwIGl0c2VsZiksIHdoaWNoIHVzdWFsbHkgZXF1YWxzIHRvIEZ1bGwgSEQgMTkyMHgxMDgwIG9uIG1vc3RcbiAqIHBob25lcyBob3dldmVyIHlvdSBjYW4gY2hhbmdlIGl0IHRvIGZvbGxvd2luZyBzdXBwb3J0ZWQgcmVzb2x1dGlvbnNcbiAqIGFzIHdlbGw6IFwiMTkyMHgxMDgwXCIsIFwiMTI4MHg3MjBcIiwgXCI3MjB4NDgwXCIsIFwiMzIweDI0MFwiLCBcIjE3NngxNDRcIi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gbWF4RHVyYXRpb25TZWMgWzkwMF0gRGVmYXVsdCB2YWx1ZTogOTAwIHNlY29uZHMgd2hpY2ggbWVhbnNcbiAqIG1heGltdW0gYWxsb3dlZCBkdXJhdGlvbiBpcyAxNSBtaW51dGUsIHlvdSBjYW4gaW5jcmVhc2UgaXQgaWYgeW91ciB0ZXN0IHRha2VzXG4gKiBsb25nZXIgdGhhbiB0aGF0LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwcmlvcml0eSBbaGlnaF0gTWVhbnMgcmVjb3JkaW5nIHRocmVhZCBwcmlvcml0eSBpcyBtYXhpbXVtXG4gKiBob3dldmVyIGlmIHlvdSBmYWNlIHBlcmZvcm1hbmNlIGRyb3BzIGR1cmluZyB0ZXN0aW5nIHdpdGggcmVjb3JkaW5nIGVuYWJsZWQsIHlvdVxuICogY2FuIHJlZHVjZSByZWNvcmRpbmcgcHJpb3JpdHkgdG8gXCJub3JtYWxcIiBvciBcImxvd1wiLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBmaWxlbmFtZSBZb3UgY2FuIHR5cGUgcmVjb3JkaW5nIHZpZGVvIGZpbGUgbmFtZSBhcyB5b3Ugd2FudCxcbiAqIGJ1dCByZWNvcmRpbmcgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgXCJtcDRcIiBmb3JtYXQgc28geW91ciBmaWxlbmFtZSBtdXN0IGVuZCB3aXRoIFwiLm1wNFwiLlxuICogQW4gaW52YWxpZCBmaWxlIG5hbWUgd2lsbCBmYWlsIHRvIHN0YXJ0IHRoZSByZWNvcmRpbmcuXG4gKiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2lsbCBiZSB1c2VkIGFzIGZpbGUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIFJlY29yZCB0aGUgZGlzcGxheSBvZiBhIHJlYWwgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQgMTAgKEFQSSBsZXZlbCAyOSkgYW5kIGhpZ2hlci5cbiAqIFRoZSBzY3JlZW4gYWN0aXZpdHkgaXMgcmVjb3JkZWQgdG8gYSBNUEVHLTQgZmlsZS4gQXVkaW8gaXMgYWxzbyByZWNvcmRlZCBieSBkZWZhdWx0XG4gKiAob25seSBmb3IgYXBwcyB0aGF0IGFsbG93IGl0IGluIHRoZWlyIG1hbmlmZXN0cykuXG4gKiBJZiBhbm90aGVyIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQgdGhlbiB0aGUgY29tbWFuZCB3aWxsIGV4aXQgc2lsZW50bHkuXG4gKiBUaGUgcHJldmlvdXNseSByZWNvcmRlZCB2aWRlbyBmaWxlIGlzIGRlbGV0ZWQgd2hlbiBhIG5ldyByZWNvcmRpbmcgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICogUmVjb3JkaW5nIGNvbnRpbnVlcyBpdCBpcyBzdG9wcGVkIGV4cGxpY2l0bHkgb3IgdW50aWwgdGhlIHRpbWVvdXQgaGFwcGVucy5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgQXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIG5ldyByZWNvcmRpbmcgaGFzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHJlY29yZGluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIChvcHRpb25zID0ge30pIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHtyZXNvbHV0aW9uLCBwcmlvcml0eSwgbWF4RHVyYXRpb25TZWMsIGZpbGVuYW1lfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgY29uc3QgZm5hbWUgPSBhZGp1c3RNZWRpYUV4dGVuc2lvbihmaWxlbmFtZSB8fCBtb21lbnQoKS5mb3JtYXQoREVGQVVMVF9GSUxFTkFNRV9GT1JNQVQpKTtcbiAgY29uc3QgZGlkU3RhcnQgPSBhd2FpdCByZWNvcmRlci5zdGFydCh7XG4gICAgcmVzb2x1dGlvbixcbiAgICBwcmlvcml0eSxcbiAgICBtYXhEdXJhdGlvblNlYyxcbiAgICBmaWxlbmFtZTogZm5hbWUsXG4gIH0pO1xuICBpZiAoZGlkU3RhcnQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBBIG5ldyBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyAnJHtmbmFtZX0nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdGFydGVkYCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbygnQW5vdGhlciBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzLiBUaGVyZSBpcyBub3RoaW5nIHRvIHN0YXJ0Jyk7XG4gIH1cbiAgcmV0dXJuIGRpZFN0YXJ0O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtZWRpYSBwcm9qZWN0aW9uLWJhc2VkIHJlY29yZGluZyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIHJlY29yZGluZyBpcyBpbiBwcm9ncmVzcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMubW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nICgpIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgcmV0dXJuIGF3YWl0IHJlY29yZGVyLmlzUnVubmluZygpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdG9wUmVjb3JkaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gcmVtb3RlUGF0aCBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgcmVzdWx0aW5nIHZpZGVvIHNob3VsZCBiZSB1cGxvYWRlZC5cbiAqIFRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQ6IGh0dHAvaHR0cHMsIGZ0cC5cbiAqIE51bGwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBtZWFucyB0aGUgY29udGVudCBvZiByZXN1bHRpbmdcbiAqIGZpbGUgc2hvdWxkIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCBwYXNzZWQgYXMgdGhlIGVuZHBvb250IHJlc3BvbnNlIHZhbHVlLlxuICogQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBnZW5lcmF0ZWQgbWVkaWEgZmlsZSBpcyB0b28gYmlnIHRvXG4gKiBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHByb2Nlc3MgbWVtb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1c2VyIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwYXNzIFRoZSBwYXNzd29yZCBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gbWV0aG9kIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIFRoZSAnUFVUJyBvbmUgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtPYmplY3Q/fSBoZWFkZXJzIEFkZGl0aW9uYWwgaGVhZGVycyBtYXBwaW5nIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGZpbGVGaWVsZE5hbWUgW2ZpbGVdIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGZpZWxkLCB3aGVyZSB0aGUgZmlsZSBjb250ZW50IEJMT0Igc2hvdWxkIGJlIHN0b3JlZCBmb3JcbiAqIGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHtPYmplY3R8QXJyYXk8UGFpcj4/fSBmb3JtRmllbGRzIEFkZGl0aW9uYWwgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gdXBsb2FkVGltZW91dCAtIFRoZSBhY3R1YWwgbWVkaWEgdXBsb2FkIHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHM7XG4gKiBkZWZhdWx0cyB0byBAYXBwaXVtL3N1cHBvcnQgbmV0IERFRkFVTFRfVElNRU9VVF9NU1xuICovXG5cbi8qKlxuICogU3RvcCBhIG1lZGlhIHByb2plY3Rpb24tYmFzZWQgcmVjb3JkaW5nLlxuICogSWYgbm8gcmVjb3JkaW5nIGhhcyBiZWVuIHN0YXJ0ZWQgYmVmb3JlIHRoZW4gYW4gZXJyb3IgaXMgdGhyb3duLlxuICogSWYgdGhlIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IGZpbmlzaGVkIGJlZm9yZSB0aGlzIEFQSSBoYXMgYmVlbiBjYWxsZWRcbiAqIHRoZW4gdGhlIG1vc3QgcmVjZW50IHJlY29yZGVkIGZpbGUgaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHs/U3RvcFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgQXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSByZWNvcmRlZCBtZWRpYSBmaWxlIGlmICdyZW1vdGVQYXRoJ1xuICogcGFyYW1ldGVyIGlzIGZhbHN5IG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgc3RvcHBpbmcgYSByZWNvcmRpbmcsXG4gKiBmZXRjaGluZyB0aGUgY29udGVudCBvZiB0aGUgcmVtb3RlIG1lZGlhIGZpbGUsXG4gKiBvciBpZiBhIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcgKG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCB2ZXJpZnlNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdJc1N1cHBvcnRlZCh0aGlzLmFkYik7XG5cbiAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFQcm9qZWN0aW9uUmVjb3JkZXIodGhpcy5hZGIpO1xuICBpZiAoYXdhaXQgcmVjb3JkZXIuc3RvcCgpKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnU3VjY2Vzc2Z1bGx5IHN0b3BwZWQgYSBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZy4gUHVsbGluZyB0aGUgcmVjb3JkZWQgbWVkaWEnKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdNZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBzdG9wJyk7XG4gIH1cbiAgY29uc3QgcmVjZW50UmVjb3JkaW5nUGF0aCA9IGF3YWl0IHJlY29yZGVyLnB1bGxSZWNlbnQoKTtcbiAgaWYgKCFyZWNlbnRSZWNvcmRpbmdQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWNlbnQgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaGF2ZSBiZWVuIGZvdW5kLiBEaWQgeW91IHN0YXJ0IGFueT9gKTtcbiAgfVxuXG4gIGNvbnN0IHtyZW1vdGVQYXRofSA9IG9wdGlvbnM7XG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBmcy5zdGF0KHJlY2VudFJlY29yZGluZ1BhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nIGlzICR7dXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZyhzaXplKX1gKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1cGxvYWRSZWNvcmRlZE1lZGlhKHJlY2VudFJlY29yZGluZ1BhdGgsIHJlbW90ZVBhdGgsIG9wdGlvbnMpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZihwYXRoLmRpcm5hbWUocmVjZW50UmVjb3JkaW5nUGF0aCkpO1xuICB9XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxRQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxlQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFHQSxNQUFNTyxRQUFR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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-projection.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","_support","_path","_bluebird","_androidHelpers","_moment","commands","exports","DEFAULT_EXT","RECORDING_STARTUP_TIMEOUT_MS","RECORDING_STOP_TIMEOUT_MS","MIN_API_LEVEL","RECORDING_SERVICE_NAME","SETTINGS_HELPER_PKG_ID","RECORDING_ACTIVITY_NAME","RECORDING_ACTION_START","RECORDING_ACTION_STOP","RECORDINGS_ROOT","DEFAULT_FILENAME_FORMAT","uploadRecordedMedia","localFile","remotePath","uploadOptions","_","isEmpty","util","toInMemoryBase64","toString","user","pass","method","headers","fileFieldName","formFields","uploadTimeout","timeout","options","auth","net","uploadFile","adjustMediaExtension","name","toLower","endsWith","verifyMediaProjectionRecordingIsSupported","adb","apiLevel","getApiLevel","Error","MediaProjectionRecorder","constructor","isRunning","stdout","shell","includes","start","opts","cleanup","filename","maxDurationSec","priority","resolution","args","push","B","resolve","reject","setTimeout","pullRecent","recordings","ls","dstPath","path","join","tempDir","openDir","pull","stop","waitForCondition","waitMs","intervalMs","e","mobileStartMediaProjectionRecording","recorder","fname","moment","format","didStart","log","info","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","recentRecordingPath","size","fs","stat","debug","toReadableSizeString","rimraf","dirname","_default","default"],"sources":["../../../lib/commands/media-projection.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util, fs, net, tempDir } from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport { SETTINGS_HELPER_PKG_ID } from '../android-helpers';\nimport moment from 'moment';\n\n\nconst commands = {};\n\n// https://github.com/appium/io.appium.settings#internal-audio--video-recording\nconst DEFAULT_EXT = '.mp4';\nconst RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;\nconst RECORDING_STOP_TIMEOUT_MS = 3 * 1000;\nconst MIN_API_LEVEL = 29;\nconst RECORDING_SERVICE_NAME = `${SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;\nconst RECORDING_ACTIVITY_NAME = `${SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;\nconst RECORDING_ACTION_START = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;\nconst RECORDING_ACTION_STOP = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;\nconst RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${SETTINGS_HELPER_PKG_ID}/files`;\nconst DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';\n\n\nasync function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {\n if (_.isEmpty(remotePath)) {\n return (await util.toInMemoryBase64(localFile)).toString();\n }\n\n const {\n user,\n pass,\n method,\n headers,\n fileFieldName,\n formFields,\n uploadTimeout: timeout,\n } = uploadOptions;\n const options = {\n method: method || 'PUT',\n headers,\n fileFieldName,\n formFields,\n timeout,\n };\n if (user && pass) {\n options.auth = {user, pass};\n }\n await net.uploadFile(localFile, remotePath, options);\n return '';\n}\n\nfunction adjustMediaExtension (name) {\n return _.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;\n}\n\nasync function verifyMediaProjectionRecordingIsSupported (adb) {\n const apiLevel = await adb.getApiLevel();\n if (apiLevel < MIN_API_LEVEL) {\n throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` +\n `Minimum required API Level is ${MIN_API_LEVEL}.`);\n }\n}\n\n\nclass MediaProjectionRecorder {\n constructor (adb) {\n this.adb = adb;\n }\n\n async isRunning () {\n const stdout = await this.adb.shell([\n 'dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME\n ]);\n return stdout.includes(RECORDING_SERVICE_NAME);\n }\n\n async start (opts = {}) {\n if (await this.isRunning()) {\n return false;\n }\n\n await this.cleanup();\n const {\n filename,\n maxDurationSec,\n priority,\n resolution,\n } = opts;\n const args = [\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_START,\n ];\n if (filename) {\n args.push('--es', 'filename', filename);\n }\n if (maxDurationSec) {\n args.push('--es', 'max_duration_sec', `${maxDurationSec}`);\n }\n if (priority) {\n args.push('--es', 'priority', priority);\n }\n if (resolution) {\n args.push('--es', 'resolution', resolution);\n }\n await this.adb.shell(args);\n await new B((resolve, reject) => {\n setTimeout(async () => {\n if (!await this.isRunning()) {\n return reject(new Error(\n `The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` +\n `Please check the logcat output for more details.`\n ));\n }\n resolve();\n }, RECORDING_STARTUP_TIMEOUT_MS);\n });\n return true;\n }\n\n async cleanup () {\n await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);\n }\n\n async pullRecent () {\n const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);\n if (_.isEmpty(recordings)) {\n return null;\n }\n\n const dstPath = path.join(await tempDir.openDir(), recordings[0]);\n // increase timeout to 5 minutes because it might take a while to pull a large video file\n await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath, {timeout: 300000});\n return dstPath;\n }\n\n async stop () {\n if (!await this.isRunning()) {\n return false;\n }\n\n await this.adb.shell([\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_STOP,\n ]);\n try {\n await waitForCondition(async () => !(await this.isRunning()), {\n waitMs: RECORDING_STOP_TIMEOUT_MS,\n intervalMs: 500,\n });\n } catch (e) {\n throw new Error(\n `The attempt to stop the current media projection recording timed out after ` +\n `${RECORDING_STOP_TIMEOUT_MS}ms`\n );\n }\n return true;\n }\n}\n\n\n/**\n * @typedef {Object} StartRecordingOptions\n *\n * @property {string?} resolution Maximum supported resolution on-device (Detected\n * automatically by the app itself), which usually equals to Full HD 1920x1080 on most\n * phones however you can change it to following supported resolutions\n * as well: \"1920x1080\", \"1280x720\", \"720x480\", \"320x240\", \"176x144\".\n * @property {number?} maxDurationSec [900] Default value: 900 seconds which means\n * maximum allowed duration is 15 minute, you can increase it if your test takes\n * longer than that.\n * @property {string?} priority [high] Means recording thread priority is maximum\n * however if you face performance drops during testing with recording enabled, you\n * can reduce recording priority to \"normal\" or \"low\".\n * @property {string?} filename You can type recording video file name as you want,\n * but recording currently supports only \"mp4\" format so your filename must end with \".mp4\".\n * An invalid file name will fail to start the recording.\n * If not provided then the current timestamp will be used as file name.\n */\n\n/**\n * Record the display of a real devices running Android 10 (API level 29) and higher.\n * The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default\n * (only for apps that allow it in their manifests).\n * If another recording has been already started then the command will exit silently.\n * The previously recorded video file is deleted when a new recording session is started.\n * Recording continues it is stopped explicitly or until the timeout happens.\n *\n * @param {?StartRecordingOptions} options Available options.\n * @returns {boolean} True if a new recording has successfully started.\n * @throws {Error} If recording has failed to start or is not supported on the device under test.\n */\ncommands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const {resolution, priority, maxDurationSec, filename} = options;\n const recorder = new MediaProjectionRecorder(this.adb);\n const fname = adjustMediaExtension(filename || moment().format(DEFAULT_FILENAME_FORMAT));\n const didStart = await recorder.start({\n resolution,\n priority,\n maxDurationSec,\n filename: fname,\n });\n if (didStart) {\n this.log.info(`A new media projection recording '${fname}' has been successfully started`);\n } else {\n this.log.info('Another media projection recording is already in progress. There is nothing to start');\n }\n return didStart;\n};\n\n/**\n * Checks if a media projection-based recording is currently running.\n *\n * @returns {boolean} True if a recording is in progress.\n * @throws {Error} If a recording is not supported on the device under test.\n */\ncommands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning () {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n return await recorder.isRunning();\n};\n\n/**\n * @typedef {Object} StopRecordingOptions\n *\n * @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.\n * The following protocols are supported: http/https, ftp.\n * Null or empty string value (the default setting) means the content of resulting\n * file should be encoded as Base64 and passed as the endpoont response value.\n * An exception will be thrown if the generated media file is too big to\n * fit into the available process memory.\n * @property {string?} user The name of the user for the remote authentication.\n * @property {string?} pass The password for the remote authentication.\n * @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.\n * @property {Object?} headers Additional headers mapping for multipart http(s) uploads\n * @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for\n * http(s) uploads\n * @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads\n * @property {number?} uploadTimeout - The actual media upload request timeout in milliseconds;\n * defaults to @appium/support net DEFAULT_TIMEOUT_MS\n */\n\n/**\n * Stop a media projection-based recording.\n * If no recording has been started before then an error is thrown.\n * If the recording has been already finished before this API has been called\n * then the most recent recorded file is returned.\n *\n * @param {?StopRecordingOptions} options Available options.\n * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'\n * parameter is falsy or an empty string.\n * @throws {Error} If there was an error while stopping a recording,\n * fetching the content of the remote media file,\n * or if a recording is not supported on the device under test.\n */\ncommands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n if (await recorder.stop()) {\n this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');\n } else {\n this.log.info('Media projection recording is not running. There is nothing to stop');\n }\n const recentRecordingPath = await recorder.pullRecent();\n if (!recentRecordingPath) {\n throw new Error(`No recent media projection recording have been found. Did you start any?`);\n }\n\n const {remotePath} = options;\n if (_.isEmpty(remotePath)) {\n const {size} = await fs.stat(recentRecordingPath);\n this.log.debug(`The size of the resulting media projection recording is ${util.toReadableSizeString(size)}`);\n }\n try {\n return await uploadRecordedMedia(recentRecordingPath, remotePath, options);\n } finally {\n await fs.rimraf(path.dirname(recentRecordingPath));\n }\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media-projection.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","_support","_path","_bluebird","_androidHelpers","_moment","commands","exports","DEFAULT_EXT","RECORDING_STARTUP_TIMEOUT_MS","RECORDING_STOP_TIMEOUT_MS","MIN_API_LEVEL","RECORDING_SERVICE_NAME","SETTINGS_HELPER_PKG_ID","RECORDING_ACTIVITY_NAME","RECORDING_ACTION_START","RECORDING_ACTION_STOP","RECORDINGS_ROOT","DEFAULT_FILENAME_FORMAT","uploadRecordedMedia","localFile","remotePath","uploadOptions","_","isEmpty","util","toInMemoryBase64","toString","user","pass","method","headers","fileFieldName","formFields","uploadTimeout","timeout","options","auth","net","uploadFile","adjustMediaExtension","name","toLower","endsWith","verifyMediaProjectionRecordingIsSupported","adb","apiLevel","getApiLevel","Error","MediaProjectionRecorder","constructor","isRunning","stdout","shell","includes","start","opts","cleanup","filename","maxDurationSec","priority","resolution","args","push","B","resolve","reject","setTimeout","pullRecent","recordings","ls","dstPath","path","join","tempDir","openDir","pull","stop","waitForCondition","waitMs","intervalMs","e","mobileStartMediaProjectionRecording","recorder","fname","moment","format","didStart","log","info","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","recentRecordingPath","size","fs","stat","debug","toReadableSizeString","rimraf","dirname","_default","default"],"sources":["../../../lib/commands/media-projection.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util, fs, net, tempDir } from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport { SETTINGS_HELPER_PKG_ID } from '../android-helpers';\nimport moment from 'moment';\n\n\nconst commands = {};\n\n// https://github.com/appium/io.appium.settings#internal-audio--video-recording\nconst DEFAULT_EXT = '.mp4';\nconst RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;\nconst RECORDING_STOP_TIMEOUT_MS = 3 * 1000;\nconst MIN_API_LEVEL = 29;\nconst RECORDING_SERVICE_NAME = `${SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;\nconst RECORDING_ACTIVITY_NAME = `${SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;\nconst RECORDING_ACTION_START = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;\nconst RECORDING_ACTION_STOP = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;\nconst RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${SETTINGS_HELPER_PKG_ID}/files`;\nconst DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';\n\n\nasync function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {\n if (_.isEmpty(remotePath)) {\n return (await util.toInMemoryBase64(localFile)).toString();\n }\n\n const {\n user,\n pass,\n method,\n headers,\n fileFieldName,\n formFields,\n uploadTimeout: timeout,\n } = uploadOptions;\n const options = {\n method: method || 'PUT',\n headers,\n fileFieldName,\n formFields,\n timeout,\n };\n if (user && pass) {\n options.auth = {user, pass};\n }\n await net.uploadFile(localFile, remotePath, options);\n return '';\n}\n\nfunction adjustMediaExtension (name) {\n return _.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;\n}\n\nasync function verifyMediaProjectionRecordingIsSupported (adb) {\n const apiLevel = await adb.getApiLevel();\n if (apiLevel < MIN_API_LEVEL) {\n throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` +\n `Minimum required API Level is ${MIN_API_LEVEL}.`);\n }\n}\n\n\nclass MediaProjectionRecorder {\n constructor (adb) {\n this.adb = adb;\n }\n\n async isRunning () {\n const stdout = await this.adb.shell([\n 'dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME\n ]);\n return stdout.includes(RECORDING_SERVICE_NAME);\n }\n\n async start (opts = {}) {\n if (await this.isRunning()) {\n return false;\n }\n\n await this.cleanup();\n const {\n filename,\n maxDurationSec,\n priority,\n resolution,\n } = opts;\n const args = [\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_START,\n ];\n if (filename) {\n args.push('--es', 'filename', filename);\n }\n if (maxDurationSec) {\n args.push('--es', 'max_duration_sec', `${maxDurationSec}`);\n }\n if (priority) {\n args.push('--es', 'priority', priority);\n }\n if (resolution) {\n args.push('--es', 'resolution', resolution);\n }\n await this.adb.shell(args);\n await new B((resolve, reject) => {\n setTimeout(async () => {\n if (!await this.isRunning()) {\n return reject(new Error(\n `The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` +\n `Please check the logcat output for more details.`\n ));\n }\n resolve();\n }, RECORDING_STARTUP_TIMEOUT_MS);\n });\n return true;\n }\n\n async cleanup () {\n await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);\n }\n\n async pullRecent () {\n const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);\n if (_.isEmpty(recordings)) {\n return null;\n }\n\n const dstPath = path.join(await tempDir.openDir(), recordings[0]);\n // increase timeout to 5 minutes because it might take a while to pull a large video file\n await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath, {timeout: 300000});\n return dstPath;\n }\n\n async stop () {\n if (!await this.isRunning()) {\n return false;\n }\n\n await this.adb.shell([\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_STOP,\n ]);\n try {\n await waitForCondition(async () => !(await this.isRunning()), {\n waitMs: RECORDING_STOP_TIMEOUT_MS,\n intervalMs: 500,\n });\n } catch (e) {\n throw new Error(\n `The attempt to stop the current media projection recording timed out after ` +\n `${RECORDING_STOP_TIMEOUT_MS}ms`\n );\n }\n return true;\n }\n}\n\n\n/**\n * @typedef {Object} StartRecordingOptions\n *\n * @property {string?} resolution Maximum supported resolution on-device (Detected\n * automatically by the app itself), which usually equals to Full HD 1920x1080 on most\n * phones however you can change it to following supported resolutions\n * as well: \"1920x1080\", \"1280x720\", \"720x480\", \"320x240\", \"176x144\".\n * @property {number?} maxDurationSec [900] Default value: 900 seconds which means\n * maximum allowed duration is 15 minute, you can increase it if your test takes\n * longer than that.\n * @property {string?} priority [high] Means recording thread priority is maximum\n * however if you face performance drops during testing with recording enabled, you\n * can reduce recording priority to \"normal\" or \"low\".\n * @property {string?} filename You can type recording video file name as you want,\n * but recording currently supports only \"mp4\" format so your filename must end with \".mp4\".\n * An invalid file name will fail to start the recording.\n * If not provided then the current timestamp will be used as file name.\n */\n\n/**\n * Record the display of a real devices running Android 10 (API level 29) and higher.\n * The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default\n * (only for apps that allow it in their manifests).\n * If another recording has been already started then the command will exit silently.\n * The previously recorded video file is deleted when a new recording session is started.\n * Recording continues it is stopped explicitly or until the timeout happens.\n *\n * @param {?StartRecordingOptions} options Available options.\n * @returns {boolean} True if a new recording has successfully started.\n * @throws {Error} If recording has failed to start or is not supported on the device under test.\n */\ncommands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const {resolution, priority, maxDurationSec, filename} = options;\n const recorder = new MediaProjectionRecorder(this.adb);\n const fname = adjustMediaExtension(filename || moment().format(DEFAULT_FILENAME_FORMAT));\n const didStart = await recorder.start({\n resolution,\n priority,\n maxDurationSec,\n filename: fname,\n });\n if (didStart) {\n this.log.info(`A new media projection recording '${fname}' has been successfully started`);\n } else {\n this.log.info('Another media projection recording is already in progress. There is nothing to start');\n }\n return didStart;\n};\n\n/**\n * Checks if a media projection-based recording is currently running.\n *\n * @returns {boolean} True if a recording is in progress.\n * @throws {Error} If a recording is not supported on the device under test.\n */\ncommands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning () {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n return await recorder.isRunning();\n};\n\n/**\n * @typedef {Object} StopRecordingOptions\n *\n * @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.\n * The following protocols are supported: http/https, ftp.\n * Null or empty string value (the default setting) means the content of resulting\n * file should be encoded as Base64 and passed as the endpoont response value.\n * An exception will be thrown if the generated media file is too big to\n * fit into the available process memory.\n * @property {string?} user The name of the user for the remote authentication.\n * @property {string?} pass The password for the remote authentication.\n * @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.\n * @property {Object?} headers Additional headers mapping for multipart http(s) uploads\n * @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for\n * http(s) uploads\n * @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads\n * @property {number?} uploadTimeout - The actual media upload request timeout in milliseconds;\n * defaults to @appium/support net DEFAULT_TIMEOUT_MS\n */\n\n/**\n * Stop a media projection-based recording.\n * If no recording has been started before then an error is thrown.\n * If the recording has been already finished before this API has been called\n * then the most recent recorded file is returned.\n *\n * @param {?StopRecordingOptions} options Available options.\n * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'\n * parameter is falsy or an empty string.\n * @throws {Error} If there was an error while stopping a recording,\n * fetching the content of the remote media file,\n * or if a recording is not supported on the device under test.\n */\ncommands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n if (await recorder.stop()) {\n this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');\n } else {\n this.log.info('Media projection recording is not running. There is nothing to stop');\n }\n const recentRecordingPath = await recorder.pullRecent();\n if (!recentRecordingPath) {\n throw new Error(`No recent media projection recording have been found. Did you start any?`);\n }\n\n const {remotePath} = options;\n if (_.isEmpty(remotePath)) {\n const {size} = await fs.stat(recentRecordingPath);\n this.log.debug(`The size of the resulting media projection recording is ${util.toReadableSizeString(size)}`);\n }\n try {\n return await uploadRecordedMedia(recentRecordingPath, remotePath, options);\n } finally {\n await fs.rimraf(path.dirname(recentRecordingPath));\n }\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -191,63 +191,14 @@ commands.getGeoLocation = async function getGeoLocation() {
|
|
|
191
191
|
altitude: parseFloat(altitude) || GEO_EPSILON
|
|
192
192
|
};
|
|
193
193
|
};
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
DOWN: 20,
|
|
197
|
-
RIGHT: 22,
|
|
198
|
-
CENTER: 23
|
|
194
|
+
commands.isLocationServicesEnabled = async function iLocationServicesEnabled() {
|
|
195
|
+
return (await this.adb.getLocationProviders()).includes('gps');
|
|
199
196
|
};
|
|
200
197
|
commands.toggleLocationServices = async function toggleLocationServices() {
|
|
201
198
|
this.log.info('Toggling location services');
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
let isGpsEnabled = providers.indexOf('gps') !== -1;
|
|
206
|
-
await this.adb.toggleGPSLocationProvider(!isGpsEnabled);
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
if (api > 15) {
|
|
210
|
-
let seq = [KeyCode.UP, KeyCode.UP];
|
|
211
|
-
if (api === 16) {
|
|
212
|
-
seq.push(KeyCode.DOWN);
|
|
213
|
-
} else if (api < 28) {
|
|
214
|
-
seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];
|
|
215
|
-
await this.adb.keyevent(KeyCode.UP);
|
|
216
|
-
} else if (api >= 28) {
|
|
217
|
-
seq = [KeyCode.RIGHT];
|
|
218
|
-
await this.adb.keyevent(KeyCode.UP);
|
|
219
|
-
}
|
|
220
|
-
await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);
|
|
221
|
-
} else {
|
|
222
|
-
throw new _driver.errors.NotYetImplementedError();
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
helpers.toggleSetting = async function toggleSetting(setting, preKeySeq) {
|
|
226
|
-
if (_lodash.default.isNull(preKeySeq)) {
|
|
227
|
-
preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];
|
|
228
|
-
}
|
|
229
|
-
await this.openSettingsActivity(setting);
|
|
230
|
-
for (let key of preKeySeq) {
|
|
231
|
-
await this.doKey(key);
|
|
232
|
-
}
|
|
233
|
-
let {
|
|
234
|
-
appPackage,
|
|
235
|
-
appActivity
|
|
236
|
-
} = await this.adb.getFocusedPackageAndActivity();
|
|
237
|
-
await this.wrapBootstrapDisconnect(async () => {
|
|
238
|
-
await this.doKey(KeyCode.CENTER);
|
|
239
|
-
});
|
|
240
|
-
try {
|
|
241
|
-
await this.adb.waitForNotActivity(appPackage, appActivity, 5000);
|
|
242
|
-
await this.doKey(KeyCode.RIGHT);
|
|
243
|
-
await this.doKey(KeyCode.CENTER);
|
|
244
|
-
await this.adb.waitForNotActivity(appPackage, appActivity, 5000);
|
|
245
|
-
} catch (ign) {}
|
|
246
|
-
await this.adb.back();
|
|
247
|
-
};
|
|
248
|
-
helpers.doKey = async function doKey(key) {
|
|
249
|
-
await _bluebird.default.delay(2000);
|
|
250
|
-
await this.adb.keyevent(key);
|
|
199
|
+
const isGpsEnabled = await this.isLocationServicesEnabled();
|
|
200
|
+
this.log.debug(`Current GPS state: ${isGpsEnabled}. ` + `The service is going to be ${isGpsEnabled ? 'disabled' : 'enabled'}`);
|
|
201
|
+
await this.adb.toggleGPSLocationProvider(!isGpsEnabled);
|
|
251
202
|
};
|
|
252
203
|
helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped) {
|
|
253
204
|
if (!this.bootstrap) {
|
|
@@ -265,4 +216,4 @@ helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped
|
|
|
265
216
|
Object.assign(extensions, commands, helpers);
|
|
266
217
|
var _default = extensions;
|
|
267
218
|
exports.default = _default;
|
|
268
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsIldJRklfS0VZX05BTUUiLCJEQVRBX0tFWV9OQU1FIiwiQUlSUExBTkVfTU9ERV9LRVlfTkFNRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwibW9iaWxlU2V0Q29ubmVjdGl2aXR5Iiwib3B0cyIsIndpZmkiLCJkYXRhIiwiYWlycGxhbmVNb2RlIiwiXyIsImV2ZXJ5IiwiaXNVbmRlZmluZWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImN1cnJlbnRTdGF0ZSIsIm1vYmlsZUdldENvbm5lY3Rpdml0eSIsInNlcnZpY2VzIiwic2V0dGVycyIsIkJvb2xlYW4iLCJwdXNoIiwic2V0V2lmaVN0YXRlIiwiaXNFbXVsYXRvciIsInNldERhdGFTdGF0ZSIsInNldEFpcnBsYW5lTW9kZSIsImdldEFwaUxldmVsIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNFbXB0eSIsIkIiLCJhbGwiLCJpc0FycmF5Iiwic3RhdGVQcm9taXNlcyIsInJlc29sdmUiLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsInZhbHVlcyIsImZyb21QYWlycyIsIm1hcCIsImsiLCJ2YWx1ZSIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ0b2dnbGVEYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiS2V5Q29kZSIsIlVQIiwiRE9XTiIsIlJJR0hUIiwiQ0VOVEVSIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImFwaSIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJrZXlldmVudCIsInRvZ2dsZVNldHRpbmciLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwic2V0dGluZyIsInByZUtleVNlcSIsImlzTnVsbCIsIm9wZW5TZXR0aW5nc0FjdGl2aXR5Iiwia2V5IiwiZG9LZXkiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiaWduIiwiYmFjayIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcbmNvbnN0IFdJRklfS0VZX05BTUUgPSAnd2lmaSc7XG5jb25zdCBEQVRBX0tFWV9OQU1FID0gJ2RhdGEnO1xuY29uc3QgQUlSUExBTkVfTU9ERV9LRVlfTkFNRSA9ICdhaXJwbGFuZU1vZGUnO1xuXG5jb21tYW5kcy5nZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldE5ldHdvcmtDb25uZWN0aW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnR2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgbGV0IGFpcnBsYW5lTW9kZU9uID0gYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpO1xuICBsZXQgY29ubmVjdGlvbiA9IGFpcnBsYW5lTW9kZU9uID8gQUlSUExBTkVfTU9ERV9NQVNLIDogMDtcblxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgd2UgYXJlIGluIGFpcnBsYW5lIG1vZGVcbiAgaWYgKCFhaXJwbGFuZU1vZGVPbikge1xuICAgIGxldCB3aWZpT24gPSBhd2FpdCB0aGlzLmlzV2lmaU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAod2lmaU9uID8gV0lGSV9NQVNLIDogMCk7XG4gICAgbGV0IGRhdGFPbiA9IGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAoZGF0YU9uID8gREFUQV9NQVNLIDogMCk7XG4gIH1cblxuICByZXR1cm4gY29ubmVjdGlvbjtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0Q29ubmVjdGl2aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFuP30gd2lmaSBFaXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgV2ktRmkuXG4gKiBBbiB1bnNldCB2YWx1ZSBtZWFucyB0byBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBkYXRhIEVpdGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBtb2JpbGUgZGF0YSBjb25uZWN0aW9uLlxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFuP30gYWlycGxhbmVNb2RlIEVpdGhlciB0byBlbmFibGUgdG8gZGlzYWJsZSB0aGUgQWlycGxhbmUgTW9kZVxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICovXG5cbi8qKlxuICogU2V0IHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgZm9yIGRpZmZlcmVudCBzZXJ2aWNlc1xuICpcbiAqIEBwYXJhbSB7U2V0Q29ubmVjdGl2aXR5T3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIG5vbmUgb2Yga25vd24gcHJvcGVydGllcyB3ZXJlIHByb3ZpZGVkIG9yIHRoZXJlIHdhcyBhbiBlcnJvclxuICogd2hpbGUgY2hhbmdpbmcgY29ubmVjdGl2aXR5IHN0YXRlc1xuICovXG5jb21tYW5kcy5tb2JpbGVTZXRDb25uZWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTZXRDb25uZWN0aXZpdHkgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lmaSxcbiAgICBkYXRhLFxuICAgIGFpcnBsYW5lTW9kZSxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKF8uZXZlcnkoW3dpZmksIGRhdGEsIGFpcnBsYW5lTW9kZV0sIF8uaXNVbmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBFaXRoZXIgb25lIG9mIFsnJHtXSUZJX0tFWV9OQU1FfScsICcke0RBVEFfS0VZX05BTUV9JywgJyR7QUlSUExBTkVfTU9ERV9LRVlfTkFNRX0nXSBvcHRpb25zIG11c3QgYmUgcHJvdmlkZWRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0Q29ubmVjdGl2aXR5KHtcbiAgICBzZXJ2aWNlczogW1xuICAgICAgLi4uKF8uaXNVbmRlZmluZWQod2lmaSkgPyBbXSA6IFtXSUZJX0tFWV9OQU1FXSksXG4gICAgICAuLi4oXy5pc1VuZGVmaW5lZChkYXRhKSA/IFtdIDogW0RBVEFfS0VZX05BTUVdKSxcbiAgICAgIC4uLihfLmlzVW5kZWZpbmVkKGFpcnBsYW5lTW9kZSkgPyBbXSA6IFtBSVJQTEFORV9NT0RFX0tFWV9OQU1FXSksXG4gICAgXVxuICB9KTtcbiAgY29uc3Qgc2V0dGVycyA9IFtdO1xuICBpZiAoIV8uaXNVbmRlZmluZWQod2lmaSkgJiYgY3VycmVudFN0YXRlLndpZmkgIT09IEJvb2xlYW4od2lmaSkpIHtcbiAgICBzZXR0ZXJzLnB1c2godGhpcy5hZGIuc2V0V2lmaVN0YXRlKHdpZmksIHRoaXMuaXNFbXVsYXRvcigpKSk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGRhdGEpICYmIGN1cnJlbnRTdGF0ZS5kYXRhICE9PSBCb29sZWFuKGRhdGEpKSB7XG4gICAgc2V0dGVycy5wdXNoKHRoaXMuYWRiLnNldERhdGFTdGF0ZShkYXRhLCB0aGlzLmlzRW11bGF0b3IoKSkpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChhaXJwbGFuZU1vZGUpICYmIGN1cnJlbnRTdGF0ZS5haXJwbGFuZU1vZGUgIT09IEJvb2xlYW4oYWlycGxhbmVNb2RlKSkge1xuICAgIHNldHRlcnMucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoYWlycGxhbmVNb2RlKTtcbiAgICAgIGlmICh0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMzApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGFpcnBsYW5lTW9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoc2V0dGVycykpIHtcbiAgICBhd2FpdCBCLmFsbChzZXR0ZXJzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRDb25uZWN0aXZpdHlSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2lmaSBUcnVlIGlmIHdpZmkgaXMgZW5hYmxlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBkYXRhIFRydWUgaWYgbW9iaWxlIGRhdGEgY29ubmVjdGlvbiBpcyBlbmFibGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFpcnBsYW5lTW9kZSBUcnVlIGlmIEFpcnBsYW5lIE1vZGUgaXMgZW5hYmxlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0Q29ubmVjdGl2aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmdbXXxzdHJpbmc/fSBzZXJ2aWNlcyBvbmUgb3IgbW9yZSBzZXJ2aWNlcyB0byBnZXQgdGhlIGNvbm5lY3Rpdml0eSBmb3IuXG4gKiBTdXBwb3J0ZWQgc2VydmljZSBuYW1lcyBhcmU6IHdpZmksIGRhdGEsIGFpcnBsYW5lTW9kZS5cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY29ubmVjdGl2aXR5IHByb3BlcnRpZXMgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge0dldENvbm5lY3Rpdml0eU9wdGlvbnM/fSBvcHRzIElmIG5vIHNlcnZpY2UgbmFtZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhlXG4gKiBjb25uZWN0aXZpdHkgc3RhdGUgaXMgcmV0dXJuZWQgZm9yIGFsbCBvZiB0aGVtLlxuICogQHJldHVybnMge0dldENvbm5lY3Rpdml0eVJlc3VsdH1cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29ubmVjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29ubmVjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgbGV0IHtcbiAgICBzZXJ2aWNlcyA9IFtXSUZJX0tFWV9OQU1FLCBEQVRBX0tFWV9OQU1FLCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FXSxcbiAgfSA9IG9wdHM7XG4gIGlmICghXy5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgIHNlcnZpY2VzID0gW3NlcnZpY2VzXTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlUHJvbWlzZXMgPSB7XG4gICAgd2lmaTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKFdJRklfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNXaWZpT24oKSksXG4gICAgZGF0YTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKERBVEFfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNEYXRhT24oKSksXG4gICAgYWlycGxhbmVNb2RlOiBCLnJlc29sdmUoXG4gICAgICBzZXJ2aWNlcy5pbmNsdWRlcyhBSVJQTEFORV9NT0RFX0tFWV9OQU1FKSA/IHVuZGVmaW5lZCA6IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKVxuICAgICksXG4gIH07XG4gIGF3YWl0IEIuYWxsKF8udmFsdWVzKHN0YXRlUHJvbWlzZXMpKTtcbiAgcmV0dXJuIF8uZnJvbVBhaXJzKHNlcnZpY2VzLm1hcCgoaykgPT4gW2ssIHN0YXRlUHJvbWlzZXNba10udmFsdWUoKV0pKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBSUcsUUFB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
|
|
219
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsIldJRklfS0VZX05BTUUiLCJEQVRBX0tFWV9OQU1FIiwiQUlSUExBTkVfTU9ERV9LRVlfTkFNRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwibW9iaWxlU2V0Q29ubmVjdGl2aXR5Iiwib3B0cyIsIndpZmkiLCJkYXRhIiwiYWlycGxhbmVNb2RlIiwiXyIsImV2ZXJ5IiwiaXNVbmRlZmluZWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImN1cnJlbnRTdGF0ZSIsIm1vYmlsZUdldENvbm5lY3Rpdml0eSIsInNlcnZpY2VzIiwic2V0dGVycyIsIkJvb2xlYW4iLCJwdXNoIiwic2V0V2lmaVN0YXRlIiwiaXNFbXVsYXRvciIsInNldERhdGFTdGF0ZSIsInNldEFpcnBsYW5lTW9kZSIsImdldEFwaUxldmVsIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNFbXB0eSIsIkIiLCJhbGwiLCJpc0FycmF5Iiwic3RhdGVQcm9taXNlcyIsInJlc29sdmUiLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsInZhbHVlcyIsImZyb21QYWlycyIsIm1hcCIsImsiLCJ2YWx1ZSIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ0b2dnbGVEYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiaXNMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCIsImlMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImlzR3BzRW5hYmxlZCIsImRlYnVnIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsIndyYXBwZWQiLCJib290c3RyYXAiLCJpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24iLCJyZXN0YXJ0Iiwic3RhcnQiLCJhcHBQYWNrYWdlIiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsImFjY2VwdFNzbENlcnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL25ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IEFJUlBMQU5FX01PREVfTUFTSyA9IDBiMDAxO1xuY29uc3QgV0lGSV9NQVNLID0gMGIwMTA7XG5jb25zdCBEQVRBX01BU0sgPSAwYjEwMDtcbi8vIFRoZSB2YWx1ZSBjbG9zZSB0byB6ZXJvLCBidXQgbm90IHplcm8sIGlzIG5lZWRlZFxuLy8gdG8gdHJpY2sgSlNPTiBnZW5lcmF0aW9uIGFuZCBzZW5kIGEgZmxvYXQgdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLFxuLy8gVGhpcyBhbGxvd3Mgc3RyaWN0bHktdHlwZWQgY2xpZW50cywgbGlrZSBKYXZhLCB0byBwcm9wZXJseVxuLy8gcGFyc2UgaXQuIE90aGVyd2lzZSBmbG9hdCAwLjAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIgMCBpbiBKUy5cbi8vIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gREJMX0VQU0lMT04gKGh0dHBzOi8vb3BlbnNvdXJjZS5hcHBsZS5jb20vc291cmNlL0xpYmMvTGliYy00OTgvaW5jbHVkZS9mbG9hdC5oKVxuY29uc3QgR0VPX0VQU0lMT04gPSBOdW1iZXIuTUlOX1ZBTFVFO1xuY29uc3QgV0lGSV9LRVlfTkFNRSA9ICd3aWZpJztcbmNvbnN0IERBVEFfS0VZX05BTUUgPSAnZGF0YSc7XG5jb25zdCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FID0gJ2FpcnBsYW5lTW9kZSc7XG5cbmNvbW1hbmRzLmdldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya0Nvbm5lY3Rpb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdHZXR0aW5nIG5ldHdvcmsgY29ubmVjdGlvbicpO1xuICBsZXQgYWlycGxhbmVNb2RlT24gPSBhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCk7XG4gIGxldCBjb25uZWN0aW9uID0gYWlycGxhbmVNb2RlT24gPyBBSVJQTEFORV9NT0RFX01BU0sgOiAwO1xuXG4gIC8vIG5vIG5lZWQgdG8gY2hlY2sgYW55dGhpbmcgZWxzZSBpZiB3ZSBhcmUgaW4gYWlycGxhbmUgbW9kZVxuICBpZiAoIWFpcnBsYW5lTW9kZU9uKSB7XG4gICAgbGV0IHdpZmlPbiA9IGF3YWl0IHRoaXMuaXNXaWZpT24oKTtcbiAgICBjb25uZWN0aW9uIHw9ICh3aWZpT24gPyBXSUZJX01BU0sgOiAwKTtcbiAgICBsZXQgZGF0YU9uID0gYXdhaXQgdGhpcy5hZGIuaXNEYXRhT24oKTtcbiAgICBjb25uZWN0aW9uIHw9IChkYXRhT24gPyBEQVRBX01BU0sgOiAwKTtcbiAgfVxuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufTtcblxuLyoqXG4gKiBkZWNvdXBsaW5nIHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuaXNXaWZpT24gPSBhc3luYyBmdW5jdGlvbiBpc1dpZmlPbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZXRDb25uZWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSB3aWZpIEVpdGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBXaS1GaS5cbiAqIEFuIHVuc2V0IHZhbHVlIG1lYW5zIHRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj99IGRhdGEgRWl0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb24uXG4gKiBBbiB1bnNldCB2YWx1ZSBtZWFucyB0byBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBhaXJwbGFuZU1vZGUgRWl0aGVyIHRvIGVuYWJsZSB0byBkaXNhYmxlIHRoZSBBaXJwbGFuZSBNb2RlXG4gKiBBbiB1bnNldCB2YWx1ZSBtZWFucyB0byBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHNlcnZpY2UuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBmb3IgZGlmZmVyZW50IHNlcnZpY2VzXG4gKlxuICogQHBhcmFtIHtTZXRDb25uZWN0aXZpdHlPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm9uZSBvZiBrbm93biBwcm9wZXJ0aWVzIHdlcmUgcHJvdmlkZWQgb3IgdGhlcmUgd2FzIGFuIGVycm9yXG4gKiB3aGlsZSBjaGFuZ2luZyBjb25uZWN0aXZpdHkgc3RhdGVzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNldENvbm5lY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNldENvbm5lY3Rpdml0eSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWZpLFxuICAgIGRhdGEsXG4gICAgYWlycGxhbmVNb2RlLFxuICB9ID0gb3B0cztcblxuICBpZiAoXy5ldmVyeShbd2lmaSwgZGF0YSwgYWlycGxhbmVNb2RlXSwgXy5pc1VuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEVpdGhlciBvbmUgb2YgWycke1dJRklfS0VZX05BTUV9JywgJyR7REFUQV9LRVlfTkFNRX0nLCAnJHtBSVJQTEFORV9NT0RFX0tFWV9OQU1FfSddIG9wdGlvbnMgbXVzdCBiZSBwcm92aWRlZGBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFN0YXRlID0gYXdhaXQgdGhpcy5tb2JpbGVHZXRDb25uZWN0aXZpdHkoe1xuICAgIHNlcnZpY2VzOiBbXG4gICAgICAuLi4oXy5pc1VuZGVmaW5lZCh3aWZpKSA/IFtdIDogW1dJRklfS0VZX05BTUVdKSxcbiAgICAgIC4uLihfLmlzVW5kZWZpbmVkKGRhdGEpID8gW10gOiBbREFUQV9LRVlfTkFNRV0pLFxuICAgICAgLi4uKF8uaXNVbmRlZmluZWQoYWlycGxhbmVNb2RlKSA/IFtdIDogW0FJUlBMQU5FX01PREVfS0VZX05BTUVdKSxcbiAgICBdXG4gIH0pO1xuICBjb25zdCBzZXR0ZXJzID0gW107XG4gIGlmICghXy5pc1VuZGVmaW5lZCh3aWZpKSAmJiBjdXJyZW50U3RhdGUud2lmaSAhPT0gQm9vbGVhbih3aWZpKSkge1xuICAgIHNldHRlcnMucHVzaCh0aGlzLmFkYi5zZXRXaWZpU3RhdGUod2lmaSwgdGhpcy5pc0VtdWxhdG9yKCkpKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQoZGF0YSkgJiYgY3VycmVudFN0YXRlLmRhdGEgIT09IEJvb2xlYW4oZGF0YSkpIHtcbiAgICBzZXR0ZXJzLnB1c2godGhpcy5hZGIuc2V0RGF0YVN0YXRlKGRhdGEsIHRoaXMuaXNFbXVsYXRvcigpKSk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGFpcnBsYW5lTW9kZSkgJiYgY3VycmVudFN0YXRlLmFpcnBsYW5lTW9kZSAhPT0gQm9vbGVhbihhaXJwbGFuZU1vZGUpKSB7XG4gICAgc2V0dGVycy5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShhaXJwbGFuZU1vZGUpO1xuICAgICAgaWYgKHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAzMCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoYWlycGxhbmVNb2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShzZXR0ZXJzKSkge1xuICAgIGF3YWl0IEIuYWxsKHNldHRlcnMpO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldENvbm5lY3Rpdml0eVJlc3VsdFxuICogQHByb3BlcnR5IHtib29sZWFufSB3aWZpIFRydWUgaWYgd2lmaSBpcyBlbmFibGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRhdGEgVHJ1ZSBpZiBtb2JpbGUgZGF0YSBjb25uZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWlycGxhbmVNb2RlIFRydWUgaWYgQWlycGxhbmUgTW9kZSBpcyBlbmFibGVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRDb25uZWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfHN0cmluZz99IHNlcnZpY2VzIG9uZSBvciBtb3JlIHNlcnZpY2VzIHRvIGdldCB0aGUgY29ubmVjdGl2aXR5IGZvci5cbiAqIFN1cHBvcnRlZCBzZXJ2aWNlIG5hbWVzIGFyZTogd2lmaSwgZGF0YSwgYWlycGxhbmVNb2RlLlxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjb25uZWN0aXZpdHkgcHJvcGVydGllcyBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7R2V0Q29ubmVjdGl2aXR5T3B0aW9ucz99IG9wdHMgSWYgbm8gc2VydmljZSBuYW1lcyBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGNvbm5lY3Rpdml0eSBzdGF0ZSBpcyByZXR1cm5lZCBmb3IgYWxsIG9mIHRoZW0uXG4gKiBAcmV0dXJucyB7R2V0Q29ubmVjdGl2aXR5UmVzdWx0fVxuICovXG5jb21tYW5kcy5tb2JpbGVHZXRDb25uZWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb25uZWN0aXZpdHkgKG9wdHMgPSB7fSkge1xuICBsZXQge1xuICAgIHNlcnZpY2VzID0gW1dJRklfS0VZX05BTUUsIERBVEFfS0VZX05BTUUsIEFJUlBMQU5FX01PREVfS0VZX05BTUVdLFxuICB9ID0gb3B0cztcbiAgaWYgKCFfLmlzQXJyYXkoc2VydmljZXMpKSB7XG4gICAgc2VydmljZXMgPSBbc2VydmljZXNdO1xuICB9XG5cbiAgY29uc3Qgc3RhdGVQcm9taXNlcyA9IHtcbiAgICB3aWZpOiBCLnJlc29sdmUoc2VydmljZXMuaW5jbHVkZXMoV0lGSV9LRVlfTkFNRSkgPyB1bmRlZmluZWQgOiB0aGlzLmFkYi5pc1dpZmlPbigpKSxcbiAgICBkYXRhOiBCLnJlc29sdmUoc2VydmljZXMuaW5jbHVkZXMoREFUQV9LRVlfTkFNRSkgPyB1bmRlZmluZWQgOiB0aGlzLmFkYi5pc0RhdGFPbigpKSxcbiAgICBhaXJwbGFuZU1vZGU6IEIucmVzb2x2ZShcbiAgICAgIHNlcnZpY2VzLmluY2x1ZGVzKEFJUlBMQU5FX01PREVfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpXG4gICAgKSxcbiAgfTtcbiAgYXdhaXQgQi5hbGwoXy52YWx1ZXMoc3RhdGVQcm9taXNlcykpO1xuICByZXR1cm4gXy5mcm9tUGFpcnMoc2VydmljZXMubWFwKChrKSA9PiBbaywgc3RhdGVQcm9taXNlc1trXS52YWx1ZSgpXSkpO1xufTtcblxuY29tbWFuZHMuc2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBzZXROZXR3b3JrQ29ubmVjdGlvbiAodHlwZSkge1xuICB0aGlzLmxvZy5pbmZvKCdTZXR0aW5nIG5ldHdvcmsgY29ubmVjdGlvbicpO1xuICAvLyBkZWNvZGUgdGhlIGlucHV0XG4gIGNvbnN0IHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSA9ICh0eXBlICYgQUlSUExBTkVfTU9ERV9NQVNLKSAhPT0gMDtcbiAgY29uc3Qgc2hvdWxkRW5hYmxlV2lmaSA9ICh0eXBlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3Qgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPSAodHlwZSAmIERBVEFfTUFTSykgIT09IDA7XG5cbiAgY29uc3QgY3VycmVudFN0YXRlID0gYXdhaXQgdGhpcy5nZXROZXR3b3JrQ29ubmVjdGlvbigpO1xuICBjb25zdCBpc0FpcnBsYW5lTW9kZUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgQUlSUExBTkVfTU9ERV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNXaUZpRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBXSUZJX01BU0spICE9PSAwO1xuICBjb25zdCBpc0RhdGFFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIERBVEFfTUFTSykgIT09IDA7XG5cbiAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSAhPT0gaXNBaXJwbGFuZU1vZGVFbmFibGVkKSB7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlKTtcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMzApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBOb3QgY2hhbmdpbmcgYWlycGxhbmUgbW9kZSwgc2luY2UgaXQgaXMgYWxyZWFkeSAke3Nob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoc2hvdWxkRW5hYmxlV2lmaSA9PT0gaXNXaUZpRW5hYmxlZCAmJiBzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9PT0gaXNEYXRhRW5hYmxlZCkge1xuICAgIHRoaXMubG9nLmluZm8oJ05vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24vV2ktRmkgc3RhdGVzLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IHNldCB0byBleHBlY3RlZCB2YWx1ZXMnKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpKSB7XG4gICAgICByZXR1cm4gQUlSUExBTkVfTU9ERV9NQVNLIHwgY3VycmVudFN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gfkFJUlBMQU5FX01PREVfTUFTSyAmIGN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzaG91bGRFbmFibGVXaWZpICE9PSBpc1dpRmlFbmFibGVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldFdpZmlTdGF0ZShzaG91bGRFbmFibGVXaWZpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIFdpLUZpIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVXaWZpID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBiZWNhdXNlIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCcpO1xuICAgIH0gZWxzZSBpZiAoc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24gc3RhdGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgIGAke3Nob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0RGF0YVN0YXRlKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5nZXROZXR3b3JrQ29ubmVjdGlvbigpO1xufTtcblxuLyoqXG4gKiBkZWNvdXBsaW5nIHRvIG92ZXJyaWRlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5zZXRXaWZpU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRXaWZpU3RhdGUgKHdpZmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaVN0YXRlKHdpZmksIHRoaXMuaXNFbXVsYXRvcigpKTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZURhdGEgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVEYXRhICgpIHtcbiAgbGV0IGRhdGEgPSAhKGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIG5ldHdvcmsgZGF0YSAke2RhdGEgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlBbmREYXRhKHtkYXRhfSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZVdpRmkgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVXaUZpICgpIHtcbiAgbGV0IHdpZmkgPSAhKGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIFdpRmkgJHt3aWZpID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7d2lmaX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVGbGlnaHRNb2RlID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRmxpZ2h0TW9kZSAoKSB7XG4gIC8qXG4gICAqIFRPRE86IEltcGxlbWVudCBpc1JlYWxEZXZpY2UoKS4gVGhpcyBtZXRob2QgZmFpbHMgb25cbiAgICogcmVhbCBkZXZpY2VzLCBpdCBzaG91bGQgdGhyb3cgYSBOb3RZZXRJbXBsZW1lbnRlZEVycm9yXG4gICAqL1xuICBsZXQgZmxpZ2h0TW9kZSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBmbGlnaHQgbW9kZSAke2ZsaWdodE1vZGUgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShmbGlnaHRNb2RlKTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMzApIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShmbGlnaHRNb2RlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29tbWFuZHMuc2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRHZW9Mb2NhdGlvbiAobG9jYXRpb24pIHtcbiAgYXdhaXQgdGhpcy5hZGIuc2V0R2VvTG9jYXRpb24obG9jYXRpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRHZW9Mb2NhdGlvbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IGdldCB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpbmZvOiAke2UubWVzc2FnZX1gKTtcbiAgICB0aGlzLmxvZy53YXJuKGBSZXR1cm5pbmcgdGhlIGRlZmF1bHQgemVybydlZCB2YWx1ZXNgKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0aXR1ZGU6IEdFT19FUFNJTE9OLFxuICAgICAgbG9uZ2l0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGFsdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICB9O1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdwc0NhY2hlUmVmcmVzaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKiB0byBibG9jayB1bnRpbCBHUFMgY2FjaGUgaXMgcmVmcmVzaGVkLiBQcm92aWRpbmcgemVybyBvciBhIG5lZ2F0aXZlXG4gKiB2YWx1ZSB0byBpdCBza2lwcyB3YWl0aW5nIGNvbXBsZXRlbHkuXG4gKi9cblxuLyoqXG4gKiBTZW5kcyBhbiBhc3luYyByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIEdQUyBjYWNoZS5cbiAqIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXNcbiAqIEdvb2dsZSBQbGF5IFNlcnZpY2VzIGluc3RhbGxlZC4gSW4gY2FzZSB0aGUgdmFuaWxsYVxuICogTG9jYXRpb25NYW5hZ2VyIGlzIHVzZWQgdGhlIGRldmljZSBBUEkgbGV2ZWwgbXVzdCBiZSBhdFxuICogdmVyc2lvbiAzMCAoQW5kcm9pZCBSKSBvciBoaWdoZXIuXG4gKlxuICogQHBhcmFtIHtHcHNDYWNoZVJlZnJlc2hPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVJlZnJlc2hHcHNDYWNoZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJlZnJlc2hHcHNDYWNoZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgdGltZW91dE1zIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLmFkYi5yZWZyZXNoR2VvTG9jYXRpb25DYWNoZSh0aW1lb3V0TXMpO1xufTtcblxuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhbHRpdHVkZX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRHZW9Mb2NhdGlvbigpO1xuICByZXR1cm4ge1xuICAgIGxhdGl0dWRlOiBwYXJzZUZsb2F0KGxhdGl0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBhbHRpdHVkZTogcGFyc2VGbG9hdChhbHRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gIH07XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBHUFMgaXMgZW5hYmxlZFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fSBUcnVlIGlmIHllc1xuICovXG5jb21tYW5kcy5pc0xvY2F0aW9uU2VydmljZXNFbmFibGVkID0gYXN5bmMgZnVuY3Rpb24gaUxvY2F0aW9uU2VydmljZXNFbmFibGVkICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpKS5pbmNsdWRlcygnZ3BzJyk7XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgR1BTIHN0YXRlXG4gKi9cbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgY29uc3QgaXNHcHNFbmFibGVkID0gYXdhaXQgdGhpcy5pc0xvY2F0aW9uU2VydmljZXNFbmFibGVkKCk7XG4gIHRoaXMubG9nLmRlYnVnKFxuICAgIGBDdXJyZW50IEdQUyBzdGF0ZTogJHtpc0dwc0VuYWJsZWR9LiBgICtcbiAgICBgVGhlIHNlcnZpY2UgaXMgZ29pbmcgdG8gYmUgJHtpc0dwc0VuYWJsZWQgPyAnZGlzYWJsZWQnIDogJ2VuYWJsZWQnfWBcbiAgKTtcbiAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcighaXNHcHNFbmFibGVkKTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBSUcsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRixPQUFBLEdBQUFBLE9BQUE7QUFBQUUsT0FBQSxDQUFBSCxRQUFBLEdBQUFBLFFBQUE7QUFFakQsTUFBTUksa0JBQWtCLEdBQUcsS0FBSztBQUNoQyxNQUFNQyxTQUFTLEdBQUcsS0FBSztBQUN2QixNQUFNQyxTQUFTLEdBQUcsS0FBSztBQU12QixNQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUztBQUNw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
|