appium-android-driver 5.11.0 → 5.11.2

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.
Files changed (57) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/build/lib/android-helpers.js +8 -2
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +1 -1
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +13 -18
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +1 -1
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +1 -1
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +1 -1
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/execute.js +1 -1
  15. package/build/lib/commands/execute.js.map +1 -1
  16. package/build/lib/commands/file-actions.js +1 -1
  17. package/build/lib/commands/file-actions.js.map +1 -1
  18. package/build/lib/commands/find.js +1 -1
  19. package/build/lib/commands/find.js.map +1 -1
  20. package/build/lib/commands/general.js +1 -1
  21. package/build/lib/commands/general.js.map +1 -1
  22. package/build/lib/commands/ime.js +1 -1
  23. package/build/lib/commands/ime.js.map +1 -1
  24. package/build/lib/commands/index.js +1 -1
  25. package/build/lib/commands/index.js.map +1 -1
  26. package/build/lib/commands/intent.js +1 -1
  27. package/build/lib/commands/intent.js.map +1 -1
  28. package/build/lib/commands/keyboard.js +1 -1
  29. package/build/lib/commands/keyboard.js.map +1 -1
  30. package/build/lib/commands/log.js +1 -1
  31. package/build/lib/commands/log.js.map +1 -1
  32. package/build/lib/commands/media-projection.js +1 -1
  33. package/build/lib/commands/media-projection.js.map +1 -1
  34. package/build/lib/commands/network.js +6 -55
  35. package/build/lib/commands/network.js.map +1 -1
  36. package/build/lib/commands/performance.js +1 -1
  37. package/build/lib/commands/performance.js.map +1 -1
  38. package/build/lib/commands/permissions.js +1 -1
  39. package/build/lib/commands/permissions.js.map +1 -1
  40. package/build/lib/commands/recordscreen.js +1 -1
  41. package/build/lib/commands/recordscreen.js.map +1 -1
  42. package/build/lib/commands/streamscreen.js +1 -1
  43. package/build/lib/commands/streamscreen.js.map +1 -1
  44. package/build/lib/commands/touch.js +1 -1
  45. package/build/lib/commands/touch.js.map +1 -1
  46. package/build/lib/driver.js +1 -1
  47. package/build/lib/driver.js.map +1 -1
  48. package/build/lib/uiautomator.js +1 -1
  49. package/build/lib/uiautomator.js.map +1 -1
  50. package/build/lib/unlock-helpers.js +1 -1
  51. package/build/lib/unlock-helpers.js.map +1 -1
  52. package/build/lib/webview-helpers.js +1 -1
  53. package/build/lib/webview-helpers.js.map +1 -1
  54. package/lib/android-helpers.js +7 -1
  55. package/lib/commands/actions.js +23 -14
  56. package/lib/commands/network.js +18 -90
  57. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","WIFI_KEY_NAME","DATA_KEY_NAME","AIRPLANE_MODE_KEY_NAME","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","mobileSetConnectivity","opts","wifi","data","airplaneMode","_","every","isUndefined","errors","InvalidArgumentError","currentState","mobileGetConnectivity","services","setters","Boolean","push","setWifiState","isEmulator","setDataState","setAirplaneMode","getApiLevel","broadcastAirplaneMode","isEmpty","B","all","isArray","statePromises","resolve","includes","undefined","values","fromPairs","map","k","value","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","toggleData","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","keyevent","toggleSetting","NotYetImplementedError","setting","preKeySeq","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\nconst WIFI_KEY_NAME = 'wifi';\nconst DATA_KEY_NAME = 'data';\nconst AIRPLANE_MODE_KEY_NAME = 'airplaneMode';\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\n/**\n * @typedef {Object} SetConnectivityOptions\n * @property {boolean?} wifi Either to enable or disable Wi-Fi.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} data Either to enable or disable mobile data connection.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode\n * An unset value means to not change the state for the given service.\n */\n\n/**\n * Set the connectivity state for different services\n *\n * @param {SetConnectivityOptions} opts\n * @throws {Error} If none of known properties were provided or there was an error\n * while changing connectivity states\n */\ncommands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {\n const {\n wifi,\n data,\n airplaneMode,\n } = opts;\n\n if (_.every([wifi, data, airplaneMode], _.isUndefined)) {\n throw new errors.InvalidArgumentError(\n `Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`\n );\n }\n\n const currentState = await this.mobileGetConnectivity({\n services: [\n ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),\n ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),\n ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),\n ]\n });\n const setters = [];\n if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {\n setters.push(this.adb.setWifiState(wifi, this.isEmulator()));\n }\n if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {\n setters.push(this.adb.setDataState(data, this.isEmulator()));\n }\n if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {\n setters.push(async () => {\n await this.adb.setAirplaneMode(airplaneMode);\n if (this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(airplaneMode);\n }\n });\n }\n if (!_.isEmpty(setters)) {\n await B.all(setters);\n }\n};\n\n/**\n * @typedef {Object} GetConnectivityResult\n * @property {boolean} wifi True if wifi is enabled\n * @property {boolean} data True if mobile data connection is enabled\n * @property {boolean} airplaneMode True if Airplane Mode is enabled\n */\n\n/**\n * @typedef {Object} GetConnectivityOptions\n * @property {string[]|string?} services one or more services to get the connectivity for.\n * Supported service names are: wifi, data, airplaneMode.\n */\n\n/**\n * Retrieves the connectivity properties from the device under test\n *\n * @param {GetConnectivityOptions?} opts If no service names are provided then the\n * connectivity state is returned for all of them.\n * @returns {GetConnectivityResult}\n */\ncommands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {\n let {\n services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],\n } = opts;\n if (!_.isArray(services)) {\n services = [services];\n }\n\n const statePromises = {\n wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),\n data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),\n airplaneMode: B.resolve(\n services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()\n ),\n };\n await B.all(_.values(statePromises));\n return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n }\n });\n } else {\n this.log.info(\n `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`\n );\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(flightMode);\n }\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","WIFI_KEY_NAME","DATA_KEY_NAME","AIRPLANE_MODE_KEY_NAME","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","mobileSetConnectivity","opts","wifi","data","airplaneMode","_","every","isUndefined","errors","InvalidArgumentError","currentState","mobileGetConnectivity","services","setters","Boolean","push","setWifiState","isEmulator","setDataState","setAirplaneMode","getApiLevel","broadcastAirplaneMode","isEmpty","B","all","isArray","statePromises","resolve","includes","undefined","values","fromPairs","map","k","value","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","toggleData","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","timeoutMs","refreshGeoLocationCache","parseFloat","isLocationServicesEnabled","iLocationServicesEnabled","getLocationProviders","toggleLocationServices","isGpsEnabled","debug","toggleGPSLocationProvider","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","appPackage","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\nconst WIFI_KEY_NAME = 'wifi';\nconst DATA_KEY_NAME = 'data';\nconst AIRPLANE_MODE_KEY_NAME = 'airplaneMode';\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\n/**\n * @typedef {Object} SetConnectivityOptions\n * @property {boolean?} wifi Either to enable or disable Wi-Fi.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} data Either to enable or disable mobile data connection.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode\n * An unset value means to not change the state for the given service.\n */\n\n/**\n * Set the connectivity state for different services\n *\n * @param {SetConnectivityOptions} opts\n * @throws {Error} If none of known properties were provided or there was an error\n * while changing connectivity states\n */\ncommands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {\n const {\n wifi,\n data,\n airplaneMode,\n } = opts;\n\n if (_.every([wifi, data, airplaneMode], _.isUndefined)) {\n throw new errors.InvalidArgumentError(\n `Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`\n );\n }\n\n const currentState = await this.mobileGetConnectivity({\n services: [\n ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),\n ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),\n ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),\n ]\n });\n const setters = [];\n if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {\n setters.push(this.adb.setWifiState(wifi, this.isEmulator()));\n }\n if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {\n setters.push(this.adb.setDataState(data, this.isEmulator()));\n }\n if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {\n setters.push(async () => {\n await this.adb.setAirplaneMode(airplaneMode);\n if (this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(airplaneMode);\n }\n });\n }\n if (!_.isEmpty(setters)) {\n await B.all(setters);\n }\n};\n\n/**\n * @typedef {Object} GetConnectivityResult\n * @property {boolean} wifi True if wifi is enabled\n * @property {boolean} data True if mobile data connection is enabled\n * @property {boolean} airplaneMode True if Airplane Mode is enabled\n */\n\n/**\n * @typedef {Object} GetConnectivityOptions\n * @property {string[]|string?} services one or more services to get the connectivity for.\n * Supported service names are: wifi, data, airplaneMode.\n */\n\n/**\n * Retrieves the connectivity properties from the device under test\n *\n * @param {GetConnectivityOptions?} opts If no service names are provided then the\n * connectivity state is returned for all of them.\n * @returns {GetConnectivityResult}\n */\ncommands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {\n let {\n services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],\n } = opts;\n if (!_.isArray(services)) {\n services = [services];\n }\n\n const statePromises = {\n wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),\n data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),\n airplaneMode: B.resolve(\n services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()\n ),\n };\n await B.all(_.values(statePromises));\n return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n }\n });\n } else {\n this.log.info(\n `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`\n );\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(flightMode);\n }\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n\n/**\n * Checks if GPS is enabled\n *\n * @returns {Promise<Boolean>} True if yes\n */\ncommands.isLocationServicesEnabled = async function iLocationServicesEnabled () {\n return (await this.adb.getLocationProviders()).includes('gps');\n};\n\n/**\n * Toggles GPS state\n */\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n const isGpsEnabled = await this.isLocationServicesEnabled();\n this.log.debug(\n `Current GPS state: ${isGpsEnabled}. ` +\n `The service is going to be ${isGpsEnabled ? 'disabled' : 'enabled'}`\n );\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -265,4 +265,4 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2
265
265
  Object.assign(extensions, commands, helpers);
266
266
  var _default = extensions;
267
267
  exports.default = _default;
268
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsIk5FVFdPUktfS0VZUyIsIkNQVV9LRVlTIiwiQkFUVEVSWV9LRVlTIiwiTUVNT1JZX0tFWVMiLCJTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyIsIk9iamVjdCIsImZyZWV6ZSIsImNwdWluZm8iLCJtZW1vcnlpbmZvIiwiYmF0dGVyeWluZm8iLCJuZXR3b3JraW5mbyIsIk1FTUlORk9fVElUTEVTIiwiTkFUSVZFIiwiREFMVklLIiwiRUdMIiwiR0wiLCJNVFJBQ0siLCJUT1RBTCIsIkhFQVAiLCJSRVRSWV9QQVVTRV9NUyIsInBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSIsImVudHJpZXMiLCJ2YWxEaWN0IiwidHlwZSIsInN1YlR5cGUiLCJuYXRpdmVQc3MiLCJuYXRpdmVQcml2YXRlRGlydHkiLCJuYXRpdmVIZWFwU2l6ZSIsIm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplIiwiZGFsdmlrUHNzIiwiZGFsdmlrUHJpdmF0ZURpcnR5IiwiZWdsUHNzIiwiZWdsUHJpdmF0ZURpcnR5IiwiZ2xQc3MiLCJnbFByaXZhdGVEaXJ0eSIsImxlbmd0aCIsInRvdGFsUHNzIiwidG90YWxQcml2YXRlRGlydHkiLCJwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IiwicGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSIsIm5hdGl2ZVJzcyIsImRhbHZpa1JzcyIsInRvdGFsUnNzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMiLCJfIiwia2V5cyIsImdldFBlcmZvcm1hbmNlRGF0YSIsInBhY2thZ2VOYW1lIiwiZGF0YVR5cGUiLCJyZXRyaWVzIiwidG9Mb3dlciIsImdldEJhdHRlcnlJbmZvIiwiZ2V0Q1BVSW5mbyIsImdldE1lbW9yeUluZm8iLCJnZXROZXR3b3JrVHJhZmZpY0luZm8iLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXRyeUludGVydmFsIiwib3V0cHV0IiwiYWRiIiwic2hlbGwiLCJlIiwic3RkZXJyIiwibG9nIiwiaW5mbyIsInVzYWdlc1BhdHRlcm4iLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsImNtZCIsImRhdGEiLCJwb3dlciIsInBhcnNlSW50Iiwic3BsaXQiLCJ0cmltIiwiTnVtYmVyIiwiaXNOYU4iLCJjbG9uZSIsInRvU3RyaW5nIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImxpbmUiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaGVhZGVycyIsInZhbHVlcyIsIm1hcCIsImhlYWRlciIsInJldHVyblZhbHVlIiwiYnVja2V0RHVyYXRpb24iLCJidWNrZXRTdGFydCIsImFjdGl2ZVRpbWUiLCJyeEJ5dGVzIiwicnhQYWNrZXRzIiwidHhCeXRlcyIsInR4UGFja2V0cyIsIm9wZXJhdGlvbnMiLCJpbmRleCIsImZyb21YdHN0YXRzIiwiaW5kZXhPZiIsInN0YXJ0IiwiZGVsaW1pdGVyIiwiZW5kIiwicGVuZGluZ0J5dGVzIiwic3Vic3RyaW5nIiwiYXJyYXlMaXN0IiwiaiIsImsiLCJyZXR1cm5JbmRleCIsImkiLCJpc0VxdWFsIiwiaXNVbmRlZmluZWQiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvcGVyZm9ybWFuY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBORVRXT1JLX0tFWVMgPSBbXG4gIFsnYnVja2V0U3RhcnQnLCAnYWN0aXZlVGltZScsICdyeEJ5dGVzJywgJ3J4UGFja2V0cycsICd0eEJ5dGVzJywgJ3R4UGFja2V0cycsICdvcGVyYXRpb25zJywgJ2J1Y2tldER1cmF0aW9uJ10sXG4gIFsnc3QnLCAnYWN0aXZlVGltZScsICdyYicsICdycCcsICd0YicsICd0cCcsICdvcCcsICdidWNrZXREdXJhdGlvbiddXG5dO1xuY29uc3QgQ1BVX0tFWVMgPSBbJ3VzZXInLCAna2VybmVsJ107XG5jb25zdCBCQVRURVJZX0tFWVMgPSBbJ3Bvd2VyJ107XG5jb25zdCBNRU1PUllfS0VZUyA9IFtcbiAgJ3RvdGFsUHJpdmF0ZURpcnR5JywgJ25hdGl2ZVByaXZhdGVEaXJ0eScsICdkYWx2aWtQcml2YXRlRGlydHknLFxuICAnZWdsUHJpdmF0ZURpcnR5JywgJ2dsUHJpdmF0ZURpcnR5JyxcbiAgJ3RvdGFsUHNzJywgJ25hdGl2ZVBzcycsICdkYWx2aWtQc3MnLCAnZWdsUHNzJywgJ2dsUHNzJyxcbiAgJ25hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplJywgJ25hdGl2ZUhlYXBTaXplJyxcbiAgJ25hdGl2ZVJzcycsICdkYWx2aWtSc3MnLCAndG90YWxSc3MnXG5dO1xuY29uc3QgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgY3B1aW5mbzogJ3RoZSBhbW91bnQgb2YgY3B1IGJ5IHVzZXIgYW5kIGtlcm5lbCBwcm9jZXNzIC0gY3B1IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJyxcbiAgbWVtb3J5aW5mbzogJ3RoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHByb2Nlc3MgLSBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBiYXR0ZXJ5aW5mbzogJ3RoZSByZW1haW5pbmcgYmF0dGVyeSBwb3dlciAtIGJhdHRlcnkgcG93ZXIgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBuZXR3b3JraW5mbzogJ3RoZSBuZXR3b3JrIHN0YXRpc3RpY3MgLSBuZXR3b3JrIHJ4L3R4IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJ1xufSk7XG5jb25zdCBNRU1JTkZPX1RJVExFUyA9IE9iamVjdC5mcmVlemUoe1xuICBOQVRJVkU6ICdOYXRpdmUnLFxuICBEQUxWSUs6ICdEYWx2aWsnLFxuICBFR0w6ICdFR0wnLFxuICBHTDogJ0dMJyxcbiAgTVRSQUNLOiAnbXRyYWNrJyxcbiAgVE9UQUw6ICdUT1RBTCcsXG4gIEhFQVA6ICdIZWFwJ1xufSk7XG5jb25zdCBSRVRSWV9QQVVTRV9NUyA9IDEwMDA7XG5cbi8qKlxuICogQVBJIGxldmVsIGJldHdlZW4gMTggYW5kIDMwXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqIGV4Y2VwdCAnVE9UQUwnLCB3aGljaCBza2lwcyB0aGUgc2Vjb25kIHR5cGUgbmFtZVxuICogISEhIHZhbERpY3QgZ2V0cyBtdXRhdGVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDgpIHtcbiAgICAvLyB0aGVyZSBhcmUgdHdvIHRvdGFscywgYW5kIHdlIG9ubHkgd2FudCB0aGUgZnVsbCBsaXN0aW5nLCB3aGljaCBoYXMgOCBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8qKlxuICogWyc8U3lzdGVtIFR5cGUnLCAnPHBwcz4nLCAnPHNoYXJlZCBkaXJ0eT4nLCAnPHByaXZhdGUgZGlydHk+JywgJzxoZWFwIHNpemU+JywgJzxoZWFwIGFsbG9jPicsICc8aGVhcCBmcmVlPiddXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCB0eXBlID0gZW50cmllc1swXTtcbiAgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLk5BVElWRSkge1xuICAgIFssIHZhbERpY3QubmF0aXZlUHNzLCwgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUspIHtcbiAgICBbLCB2YWxEaWN0LmRhbHZpa1BzcywsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMKSB7XG4gICAgWywgdmFsRGljdC5lZ2xQc3MsLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMKSB7XG4gICAgWywgdmFsRGljdC5nbFBzcywsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCkge1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkgbGV2ZWwgMzAgYW5kIGFib3ZlXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8cnNzIHRvdGFsPiwgPGhlYXAgc2l6ZT4sIDxoZWFwIGFsbG9jPiwgPGhlYXAgZnJlZT5dXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlUnNzLCB2YWxEaWN0Lm5hdGl2ZUhlYXBTaXplLCB2YWxEaWN0Lm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuREFMVklLICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5kYWx2aWtQc3MsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QuZGFsdmlrUnNzXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmVnbFBzcywgdmFsRGljdC5lZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5HTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5nbFBzcywgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMICYmIGVudHJpZXMubGVuZ3RoID09PSA5KSB7XG4gICAgLy8gaGFzIDkgZW50cmllc1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHksLCwgdmFsRGljdC50b3RhbFJzc10gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8vXG4vLyByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbi8vIG91dHB1dCAtIGFycmF5IGxpa2UgYmVsb3dcbi8vIFtjcHVpbmZvLCBiYXR0ZXJ5aW5mbywgbmV0d29ya2luZm8sIG1lbW9yeWluZm9dXG4vL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMgPSBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyAoKSB7XG4gIHJldHVybiBfLmtleXMoU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgaW5mb3JtYXRpb24gdHlwZSBvZiB0aGUgc3lzdGVtIHN0YXRlIHdoaWNoIGlzIHN1cHBvcnRlZCB0byByZWFkIGFzIGxpa2UgY3B1LCBtZW1vcnksIG5ldHdvcmsgdHJhZmZpYywgYW5kIGJhdHRlcnkuXG4gKiBpbnB1dCAtIChwYWNrYWdlTmFtZSkgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAqICAgICAgICAoZGF0YVR5cGUpIHRoZSB0eXBlIG9mIHN5c3RlbSBzdGF0ZSB3aGljaCB3YW50cyB0byByZWFkLiBJdCBzaG91bGQgYmUgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFU1xuICogICAgICAgIChkYXRhUmVhZFRpbWVvdXQpIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gcmVhZFxuICogb3V0cHV0IC0gdGFibGUgb2YgdGhlIHBlcmZvcm1hbmNlIGRhdGEsIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSB0YWJsZSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGRhdGEuIFRoZSByZW1haW5pbmcgbGluZXMgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlIGRhdGEuXG4gKlxuICogaW4gY2FzZSBvZiBiYXR0ZXJ5IGluZm8gOiBbW3Bvd2VyXSwgWzIzXV1cbiAqIGluIGNhc2Ugb2YgbWVtb3J5IGluZm8gOiAgW1t0b3RhbFByaXZhdGVEaXJ0eSwgbmF0aXZlUHJpdmF0ZURpcnR5LCBkYWx2aWtQcml2YXRlRGlydHksIGVnbFByaXZhdGVEaXJ0eSwgZ2xQcml2YXRlRGlydHksIHRvdGFsUHNzLFxuICogICBuYXRpdmVQc3MsIGRhbHZpa1BzcywgZWdsUHNzLCBnbFBzcywgbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUsIG5hdGl2ZUhlYXBTaXplXSwgWzE4MzYwLCA4Mjk2LCA2MTMyLCBudWxsLCBudWxsLCA0MjU4OCwgODQwNiwgNzAyNCwgbnVsbCwgbnVsbCwgMjY1MTksIDEwMzQ0XV1cbiAqIGluIGNhc2Ugb2YgbmV0d29yayBpbmZvIDogW1tidWNrZXRTdGFydCwgYWN0aXZlVGltZSwgcnhCeXRlcywgcnhQYWNrZXRzLCB0eEJ5dGVzLCB0eFBhY2tldHMsIG9wZXJhdGlvbnMsIGJ1Y2tldER1cmF0aW9uLF0sXG4gKiAgIFsxNDc4MDkxNjAwMDAwLCBudWxsLCAxMDk5MDc1LCA2MTA5NDcsIDkyOCwgMTE0MzYyLCA3NjksIDAsIDM2MDAwMDBdLCBbMTQ3ODA5NTIwMDAwMCwgbnVsbCwgMTMwNjMwMCwgNDA1OTk3LCA1MDksIDQ2MzU5LCAzNzAsIDAsIDM2MDAwMDBdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW3N0LCBhY3RpdmVUaW1lLCByYiwgcnAsIHRiLCB0cCwgb3AsIGJ1Y2tldER1cmF0aW9uXSwgWzE0NzgwODgwMDAsIG51bGwsIG51bGwsIDMyMTE1Mjk2LCAzNDI5MSwgMjk1NjgwNSwgMjU3MDUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5MTYwMCwgbnVsbCwgbnVsbCwgMjcxNDY4MywgMTE4MjEsIDE0MjA1NjQsIDEyNjUwLCAwLCAzNjAwXSwgWzE0NzgwOTUyMDAsIG51bGwsIG51bGwsIDEwMDc5MjEzLCAxOTk2MiwgMjQ4NzcwNSwgMjAwMTUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5ODgwMCwgbnVsbCwgbnVsbCwgNDQ0NDQzMywgMTAyMjcsIDE0MzAzNTYsIDEwNDkzLCAwLCAzNjAwXV1cbiAqIGluIGNhc2Ugb2YgY3B1IGluZm8gOiBbW3VzZXIsIGtlcm5lbF0sIFswLjksIDEuM11dXG4gKi9cbmNvbW1hbmRzLmdldFBlcmZvcm1hbmNlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YSAocGFja2FnZU5hbWUsIGRhdGFUeXBlLCByZXRyaWVzID0gMikge1xuICBzd2l0Y2ggKF8udG9Mb3dlcihkYXRhVHlwZSkpIHtcbiAgICBjYXNlICdiYXR0ZXJ5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRCYXR0ZXJ5SW5mbyhyZXRyaWVzKTtcbiAgICBjYXNlICdjcHVpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENQVUluZm8ocGFja2FnZU5hbWUsIHJldHJpZXMpO1xuICAgIGNhc2UgJ21lbW9yeWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TWVtb3J5SW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbmV0d29ya2luZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvKHJldHJpZXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBlcmZvcm1hbmNlIGRhdGEgb2YgdHlwZSAnJHtkYXRhVHlwZX0nIGZvdW5kLiBgICtcbiAgICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZDogJHtKU09OLnN0cmluZ2lmeShTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUywgJyAnLCAyKX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIENQVSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBnaXZlbiBwYWNrYWdlTmFtZS5cbiAqIEl0IHJhaXNlcyBhbiBleGNlcHRpb24gaWYgdGhlIGR1bXBlZCBDUFUgaW5mb3JtYXRpb24gZGlkIG5vdCBpbmNsdWRlIHRoZSBnaXZlbiBwYWNrYWdlTmFtZVxuICogb3IgdGhlIGZvcm1hdCB3YXMgd3JvbmcuXG4gKiBUaGUgQ1BVIGluZm9ybWF0aW9uJ3Mgc2FtcGxpbmcgaW50ZXJ2YWwgZGVwZW5kcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBGb3IgZXhhbXBsZSwgc29tZSBkZXZpY2VzIGhhdmUgNSBtaW51dGVzIGludGVydmFsLiBXaGVuIHlvdSBnZXQgdGhlIGluZm9ybWF0aW9uXG4gKiBmcm9tIDIwMjMtMDItMDcgMTE6NTk6NDAuNDY4IHRvIDIwMjMtMDItMDcgMTI6MDQ6NDAuNTU2LCB0aGVuIHRoZSBuZXh0IHdpbGwgYmVcbiAqIGZyb20gMjAyMy0wMi0wNyAxMjowNDo0MC41NTYgdG8gMjAyMy0wMi0wNyAxMjowOTo0MC42NjguIE5vIHByb2Nlc3MgaW5mb3JtYXRpb25cbiAqIGV4aXN0cyBpbiB0aGUgcmVzdWx0IGlmIHRoZSBwcm9jZXNzIHdhcyBub3QgcnVubmluZyBkdXJpbmcgdGhlIHBlcmlvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSB0byBnZXQgdGhlIENQVSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFRoZSBudW1iZXIgb2YgcmV0cnkgY291bnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBvZiB0aGUgcGFyc2VkIENQVSB1cHNhZ2UgcGVyY2VudGFnZXMuXG4gKiAgICAgICAgICAgICAgICAgIGUuZy4gWydjcHVpbmZvJywgWycxNC4zJywgJzI4LjInXV1cbiAqICAgICAgICAgICAgICAgICAgJzE0LjMnIGlzIHVzYWdlIGJ5IHRoZSB1c2VyICglKSwgJzI4LjInIGlzIHVzYWdlIGJ5IHRoZSBrZXJuZWwgKCUpXG4gKiBAdGhyb3cge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiBkdW1wc3lzLCBvciBubyBwYWNrYWdlIG5hbWUgZXhpc3RzLlxuICovXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUVBLE1BQU1FLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRW5ELE1BQU1JLFlBQVksR0FBRyxDQUNuQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxnQkFB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
268
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsIk5FVFdPUktfS0VZUyIsIkNQVV9LRVlTIiwiQkFUVEVSWV9LRVlTIiwiTUVNT1JZX0tFWVMiLCJTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyIsIk9iamVjdCIsImZyZWV6ZSIsImNwdWluZm8iLCJtZW1vcnlpbmZvIiwiYmF0dGVyeWluZm8iLCJuZXR3b3JraW5mbyIsIk1FTUlORk9fVElUTEVTIiwiTkFUSVZFIiwiREFMVklLIiwiRUdMIiwiR0wiLCJNVFJBQ0siLCJUT1RBTCIsIkhFQVAiLCJSRVRSWV9QQVVTRV9NUyIsInBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSIsImVudHJpZXMiLCJ2YWxEaWN0IiwidHlwZSIsInN1YlR5cGUiLCJuYXRpdmVQc3MiLCJuYXRpdmVQcml2YXRlRGlydHkiLCJuYXRpdmVIZWFwU2l6ZSIsIm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplIiwiZGFsdmlrUHNzIiwiZGFsdmlrUHJpdmF0ZURpcnR5IiwiZWdsUHNzIiwiZWdsUHJpdmF0ZURpcnR5IiwiZ2xQc3MiLCJnbFByaXZhdGVEaXJ0eSIsImxlbmd0aCIsInRvdGFsUHNzIiwidG90YWxQcml2YXRlRGlydHkiLCJwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IiwicGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSIsIm5hdGl2ZVJzcyIsImRhbHZpa1JzcyIsInRvdGFsUnNzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMiLCJfIiwia2V5cyIsImdldFBlcmZvcm1hbmNlRGF0YSIsInBhY2thZ2VOYW1lIiwiZGF0YVR5cGUiLCJyZXRyaWVzIiwidG9Mb3dlciIsImdldEJhdHRlcnlJbmZvIiwiZ2V0Q1BVSW5mbyIsImdldE1lbW9yeUluZm8iLCJnZXROZXR3b3JrVHJhZmZpY0luZm8iLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXRyeUludGVydmFsIiwib3V0cHV0IiwiYWRiIiwic2hlbGwiLCJlIiwic3RkZXJyIiwibG9nIiwiaW5mbyIsInVzYWdlc1BhdHRlcm4iLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsImNtZCIsImRhdGEiLCJwb3dlciIsInBhcnNlSW50Iiwic3BsaXQiLCJ0cmltIiwiTnVtYmVyIiwiaXNOYU4iLCJjbG9uZSIsInRvU3RyaW5nIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImxpbmUiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaGVhZGVycyIsInZhbHVlcyIsIm1hcCIsImhlYWRlciIsInJldHVyblZhbHVlIiwiYnVja2V0RHVyYXRpb24iLCJidWNrZXRTdGFydCIsImFjdGl2ZVRpbWUiLCJyeEJ5dGVzIiwicnhQYWNrZXRzIiwidHhCeXRlcyIsInR4UGFja2V0cyIsIm9wZXJhdGlvbnMiLCJpbmRleCIsImZyb21YdHN0YXRzIiwiaW5kZXhPZiIsInN0YXJ0IiwiZGVsaW1pdGVyIiwiZW5kIiwicGVuZGluZ0J5dGVzIiwic3Vic3RyaW5nIiwiYXJyYXlMaXN0IiwiaiIsImsiLCJyZXR1cm5JbmRleCIsImkiLCJpc0VxdWFsIiwiaXNVbmRlZmluZWQiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvcGVyZm9ybWFuY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBORVRXT1JLX0tFWVMgPSBbXG4gIFsnYnVja2V0U3RhcnQnLCAnYWN0aXZlVGltZScsICdyeEJ5dGVzJywgJ3J4UGFja2V0cycsICd0eEJ5dGVzJywgJ3R4UGFja2V0cycsICdvcGVyYXRpb25zJywgJ2J1Y2tldER1cmF0aW9uJ10sXG4gIFsnc3QnLCAnYWN0aXZlVGltZScsICdyYicsICdycCcsICd0YicsICd0cCcsICdvcCcsICdidWNrZXREdXJhdGlvbiddXG5dO1xuY29uc3QgQ1BVX0tFWVMgPSBbJ3VzZXInLCAna2VybmVsJ107XG5jb25zdCBCQVRURVJZX0tFWVMgPSBbJ3Bvd2VyJ107XG5jb25zdCBNRU1PUllfS0VZUyA9IFtcbiAgJ3RvdGFsUHJpdmF0ZURpcnR5JywgJ25hdGl2ZVByaXZhdGVEaXJ0eScsICdkYWx2aWtQcml2YXRlRGlydHknLFxuICAnZWdsUHJpdmF0ZURpcnR5JywgJ2dsUHJpdmF0ZURpcnR5JyxcbiAgJ3RvdGFsUHNzJywgJ25hdGl2ZVBzcycsICdkYWx2aWtQc3MnLCAnZWdsUHNzJywgJ2dsUHNzJyxcbiAgJ25hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplJywgJ25hdGl2ZUhlYXBTaXplJyxcbiAgJ25hdGl2ZVJzcycsICdkYWx2aWtSc3MnLCAndG90YWxSc3MnXG5dO1xuY29uc3QgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgY3B1aW5mbzogJ3RoZSBhbW91bnQgb2YgY3B1IGJ5IHVzZXIgYW5kIGtlcm5lbCBwcm9jZXNzIC0gY3B1IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJyxcbiAgbWVtb3J5aW5mbzogJ3RoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHByb2Nlc3MgLSBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBiYXR0ZXJ5aW5mbzogJ3RoZSByZW1haW5pbmcgYmF0dGVyeSBwb3dlciAtIGJhdHRlcnkgcG93ZXIgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBuZXR3b3JraW5mbzogJ3RoZSBuZXR3b3JrIHN0YXRpc3RpY3MgLSBuZXR3b3JrIHJ4L3R4IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJ1xufSk7XG5jb25zdCBNRU1JTkZPX1RJVExFUyA9IE9iamVjdC5mcmVlemUoe1xuICBOQVRJVkU6ICdOYXRpdmUnLFxuICBEQUxWSUs6ICdEYWx2aWsnLFxuICBFR0w6ICdFR0wnLFxuICBHTDogJ0dMJyxcbiAgTVRSQUNLOiAnbXRyYWNrJyxcbiAgVE9UQUw6ICdUT1RBTCcsXG4gIEhFQVA6ICdIZWFwJ1xufSk7XG5jb25zdCBSRVRSWV9QQVVTRV9NUyA9IDEwMDA7XG5cbi8qKlxuICogQVBJIGxldmVsIGJldHdlZW4gMTggYW5kIDMwXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqIGV4Y2VwdCAnVE9UQUwnLCB3aGljaCBza2lwcyB0aGUgc2Vjb25kIHR5cGUgbmFtZVxuICogISEhIHZhbERpY3QgZ2V0cyBtdXRhdGVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDgpIHtcbiAgICAvLyB0aGVyZSBhcmUgdHdvIHRvdGFscywgYW5kIHdlIG9ubHkgd2FudCB0aGUgZnVsbCBsaXN0aW5nLCB3aGljaCBoYXMgOCBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8qKlxuICogWyc8U3lzdGVtIFR5cGUnLCAnPHBwcz4nLCAnPHNoYXJlZCBkaXJ0eT4nLCAnPHByaXZhdGUgZGlydHk+JywgJzxoZWFwIHNpemU+JywgJzxoZWFwIGFsbG9jPicsICc8aGVhcCBmcmVlPiddXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCB0eXBlID0gZW50cmllc1swXTtcbiAgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLk5BVElWRSkge1xuICAgIFssIHZhbERpY3QubmF0aXZlUHNzLCwgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUspIHtcbiAgICBbLCB2YWxEaWN0LmRhbHZpa1BzcywsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMKSB7XG4gICAgWywgdmFsRGljdC5lZ2xQc3MsLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMKSB7XG4gICAgWywgdmFsRGljdC5nbFBzcywsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCkge1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkgbGV2ZWwgMzAgYW5kIGFib3ZlXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8cnNzIHRvdGFsPiwgPGhlYXAgc2l6ZT4sIDxoZWFwIGFsbG9jPiwgPGhlYXAgZnJlZT5dXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlUnNzLCB2YWxEaWN0Lm5hdGl2ZUhlYXBTaXplLCB2YWxEaWN0Lm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuREFMVklLICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5kYWx2aWtQc3MsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QuZGFsdmlrUnNzXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmVnbFBzcywgdmFsRGljdC5lZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5HTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5nbFBzcywgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMICYmIGVudHJpZXMubGVuZ3RoID09PSA5KSB7XG4gICAgLy8gaGFzIDkgZW50cmllc1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHksLCwgdmFsRGljdC50b3RhbFJzc10gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8vXG4vLyByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbi8vIG91dHB1dCAtIGFycmF5IGxpa2UgYmVsb3dcbi8vIFtjcHVpbmZvLCBiYXR0ZXJ5aW5mbywgbmV0d29ya2luZm8sIG1lbW9yeWluZm9dXG4vL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMgPSBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyAoKSB7XG4gIHJldHVybiBfLmtleXMoU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgaW5mb3JtYXRpb24gdHlwZSBvZiB0aGUgc3lzdGVtIHN0YXRlIHdoaWNoIGlzIHN1cHBvcnRlZCB0byByZWFkIGFzIGxpa2UgY3B1LCBtZW1vcnksIG5ldHdvcmsgdHJhZmZpYywgYW5kIGJhdHRlcnkuXG4gKiBpbnB1dCAtIChwYWNrYWdlTmFtZSkgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAqICAgICAgICAoZGF0YVR5cGUpIHRoZSB0eXBlIG9mIHN5c3RlbSBzdGF0ZSB3aGljaCB3YW50cyB0byByZWFkLiBJdCBzaG91bGQgYmUgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFU1xuICogICAgICAgIChkYXRhUmVhZFRpbWVvdXQpIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gcmVhZFxuICogb3V0cHV0IC0gdGFibGUgb2YgdGhlIHBlcmZvcm1hbmNlIGRhdGEsIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSB0YWJsZSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGRhdGEuIFRoZSByZW1haW5pbmcgbGluZXMgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlIGRhdGEuXG4gKlxuICogaW4gY2FzZSBvZiBiYXR0ZXJ5IGluZm8gOiBbW3Bvd2VyXSwgWzIzXV1cbiAqIGluIGNhc2Ugb2YgbWVtb3J5IGluZm8gOiAgW1t0b3RhbFByaXZhdGVEaXJ0eSwgbmF0aXZlUHJpdmF0ZURpcnR5LCBkYWx2aWtQcml2YXRlRGlydHksIGVnbFByaXZhdGVEaXJ0eSwgZ2xQcml2YXRlRGlydHksIHRvdGFsUHNzLFxuICogICBuYXRpdmVQc3MsIGRhbHZpa1BzcywgZWdsUHNzLCBnbFBzcywgbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUsIG5hdGl2ZUhlYXBTaXplXSwgWzE4MzYwLCA4Mjk2LCA2MTMyLCBudWxsLCBudWxsLCA0MjU4OCwgODQwNiwgNzAyNCwgbnVsbCwgbnVsbCwgMjY1MTksIDEwMzQ0XV1cbiAqIGluIGNhc2Ugb2YgbmV0d29yayBpbmZvIDogW1tidWNrZXRTdGFydCwgYWN0aXZlVGltZSwgcnhCeXRlcywgcnhQYWNrZXRzLCB0eEJ5dGVzLCB0eFBhY2tldHMsIG9wZXJhdGlvbnMsIGJ1Y2tldER1cmF0aW9uLF0sXG4gKiAgIFsxNDc4MDkxNjAwMDAwLCBudWxsLCAxMDk5MDc1LCA2MTA5NDcsIDkyOCwgMTE0MzYyLCA3NjksIDAsIDM2MDAwMDBdLCBbMTQ3ODA5NTIwMDAwMCwgbnVsbCwgMTMwNjMwMCwgNDA1OTk3LCA1MDksIDQ2MzU5LCAzNzAsIDAsIDM2MDAwMDBdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW3N0LCBhY3RpdmVUaW1lLCByYiwgcnAsIHRiLCB0cCwgb3AsIGJ1Y2tldER1cmF0aW9uXSwgWzE0NzgwODgwMDAsIG51bGwsIG51bGwsIDMyMTE1Mjk2LCAzNDI5MSwgMjk1NjgwNSwgMjU3MDUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5MTYwMCwgbnVsbCwgbnVsbCwgMjcxNDY4MywgMTE4MjEsIDE0MjA1NjQsIDEyNjUwLCAwLCAzNjAwXSwgWzE0NzgwOTUyMDAsIG51bGwsIG51bGwsIDEwMDc5MjEzLCAxOTk2MiwgMjQ4NzcwNSwgMjAwMTUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5ODgwMCwgbnVsbCwgbnVsbCwgNDQ0NDQzMywgMTAyMjcsIDE0MzAzNTYsIDEwNDkzLCAwLCAzNjAwXV1cbiAqIGluIGNhc2Ugb2YgY3B1IGluZm8gOiBbW3VzZXIsIGtlcm5lbF0sIFswLjksIDEuM11dXG4gKi9cbmNvbW1hbmRzLmdldFBlcmZvcm1hbmNlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YSAocGFja2FnZU5hbWUsIGRhdGFUeXBlLCByZXRyaWVzID0gMikge1xuICBzd2l0Y2ggKF8udG9Mb3dlcihkYXRhVHlwZSkpIHtcbiAgICBjYXNlICdiYXR0ZXJ5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRCYXR0ZXJ5SW5mbyhyZXRyaWVzKTtcbiAgICBjYXNlICdjcHVpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENQVUluZm8ocGFja2FnZU5hbWUsIHJldHJpZXMpO1xuICAgIGNhc2UgJ21lbW9yeWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TWVtb3J5SW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbmV0d29ya2luZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvKHJldHJpZXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBlcmZvcm1hbmNlIGRhdGEgb2YgdHlwZSAnJHtkYXRhVHlwZX0nIGZvdW5kLiBgICtcbiAgICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZDogJHtKU09OLnN0cmluZ2lmeShTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUywgJyAnLCAyKX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIENQVSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBnaXZlbiBwYWNrYWdlTmFtZS5cbiAqIEl0IHJhaXNlcyBhbiBleGNlcHRpb24gaWYgdGhlIGR1bXBlZCBDUFUgaW5mb3JtYXRpb24gZGlkIG5vdCBpbmNsdWRlIHRoZSBnaXZlbiBwYWNrYWdlTmFtZVxuICogb3IgdGhlIGZvcm1hdCB3YXMgd3JvbmcuXG4gKiBUaGUgQ1BVIGluZm9ybWF0aW9uJ3Mgc2FtcGxpbmcgaW50ZXJ2YWwgZGVwZW5kcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBGb3IgZXhhbXBsZSwgc29tZSBkZXZpY2VzIGhhdmUgNSBtaW51dGVzIGludGVydmFsLiBXaGVuIHlvdSBnZXQgdGhlIGluZm9ybWF0aW9uXG4gKiBmcm9tIDIwMjMtMDItMDcgMTE6NTk6NDAuNDY4IHRvIDIwMjMtMDItMDcgMTI6MDQ6NDAuNTU2LCB0aGVuIHRoZSBuZXh0IHdpbGwgYmVcbiAqIGZyb20gMjAyMy0wMi0wNyAxMjowNDo0MC41NTYgdG8gMjAyMy0wMi0wNyAxMjowOTo0MC42NjguIE5vIHByb2Nlc3MgaW5mb3JtYXRpb25cbiAqIGV4aXN0cyBpbiB0aGUgcmVzdWx0IGlmIHRoZSBwcm9jZXNzIHdhcyBub3QgcnVubmluZyBkdXJpbmcgdGhlIHBlcmlvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSB0byBnZXQgdGhlIENQVSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFRoZSBudW1iZXIgb2YgcmV0cnkgY291bnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBvZiB0aGUgcGFyc2VkIENQVSB1cHNhZ2UgcGVyY2VudGFnZXMuXG4gKiAgICAgICAgICAgICAgICAgIGUuZy4gWydjcHVpbmZvJywgWycxNC4zJywgJzI4LjInXV1cbiAqICAgICAgICAgICAgICAgICAgJzE0LjMnIGlzIHVzYWdlIGJ5IHRoZSB1c2VyICglKSwgJzI4LjInIGlzIHVzYWdlIGJ5IHRoZSBrZXJuZWwgKCUpXG4gKiBAdGhyb3cge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiBkdW1wc3lzLCBvciBubyBwYWNrYWdlIG5hbWUgZXhpc3RzLlxuICovXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUVBLE1BQU1FLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRW5ELE1BQU1JLFlBQVksR0FBRyxDQUNuQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxnQkFB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
@@ -1 +1 @@
1
- {"version":3,"file":"performance.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","commands","helpers","extensions","exports","NETWORK_KEYS","CPU_KEYS","BATTERY_KEYS","MEMORY_KEYS","SUPPORTED_PERFORMANCE_DATA_TYPES","Object","freeze","cpuinfo","memoryinfo","batteryinfo","networkinfo","MEMINFO_TITLES","NATIVE","DALVIK","EGL","GL","MTRACK","TOTAL","HEAP","RETRY_PAUSE_MS","parseMeminfoForApi19To29","entries","valDict","type","subType","nativePss","nativePrivateDirty","nativeHeapSize","nativeHeapAllocatedSize","dalvikPss","dalvikPrivateDirty","eglPss","eglPrivateDirty","glPss","glPrivateDirty","length","totalPss","totalPrivateDirty","parseMeminfoForApiBelow19","parseMeminfoForApiAbove29","nativeRss","dalvikRss","totalRss","getPerformanceDataTypes","_","keys","getPerformanceData","packageName","dataType","retries","toLower","getBatteryInfo","getCPUInfo","getMemoryInfo","getNetworkTrafficInfo","Error","JSON","stringify","retryInterval","output","adb","shell","e","stderr","log","info","usagesPattern","RegExp","escapeRegExp","match","exec","debug","cmd","data","power","parseInt","split","trim","Number","isNaN","clone","toString","apiLevel","getApiLevel","line","filter","Boolean","headers","values","map","header","returnValue","bucketDuration","bucketStart","activeTime","rxBytes","rxPackets","txBytes","txPackets","operations","index","fromXtstats","indexOf","start","delimiter","end","pendingBytes","substring","arrayList","j","k","returnIndex","i","isEqual","isUndefined","assign","_default","default"],"sources":["../../../lib/commands/performance.js"],"sourcesContent":["import _ from 'lodash';\nimport { retryInterval } from 'asyncbox';\n\nconst commands = {}, helpers = {}, extensions = {};\n\nconst NETWORK_KEYS = [\n ['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'],\n ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']\n];\nconst CPU_KEYS = ['user', 'kernel'];\nconst BATTERY_KEYS = ['power'];\nconst MEMORY_KEYS = [\n 'totalPrivateDirty', 'nativePrivateDirty', 'dalvikPrivateDirty',\n 'eglPrivateDirty', 'glPrivateDirty',\n 'totalPss', 'nativePss', 'dalvikPss', 'eglPss', 'glPss',\n 'nativeHeapAllocatedSize', 'nativeHeapSize',\n 'nativeRss', 'dalvikRss', 'totalRss'\n];\nconst SUPPORTED_PERFORMANCE_DATA_TYPES = Object.freeze({\n cpuinfo: 'the amount of cpu by user and kernel process - cpu information for applications on real devices and simulators',\n memoryinfo: 'the amount of memory used by the process - memory information for applications on real devices and simulators',\n batteryinfo: 'the remaining battery power - battery power information for applications on real devices and simulators',\n networkinfo: 'the network statistics - network rx/tx information for applications on real devices and simulators'\n});\nconst MEMINFO_TITLES = Object.freeze({\n NATIVE: 'Native',\n DALVIK: 'Dalvik',\n EGL: 'EGL',\n GL: 'GL',\n MTRACK: 'mtrack',\n TOTAL: 'TOTAL',\n HEAP: 'Heap'\n});\nconst RETRY_PAUSE_MS = 1000;\n\n/**\n * API level between 18 and 30\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <heap size>, <heap alloc>, <heap free>]\n * except 'TOTAL', which skips the second type name\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApi19To29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 8) {\n // there are two totals, and we only want the full listing, which has 8 entries\n [, valDict.totalPss, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * ['<System Type', '<pps>', '<shared dirty>', '<private dirty>', '<heap size>', '<heap alloc>', '<heap free>']\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiBelow19 (entries, valDict) {\n const type = entries[0];\n if (type === MEMINFO_TITLES.NATIVE) {\n [, valDict.nativePss,, valDict.nativePrivateDirty, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK) {\n [, valDict.dalvikPss,, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL) {\n [, valDict.eglPss,, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL) {\n [, valDict.glPss,, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL) {\n [, valDict.totalPss,, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * API level 30 and above\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <rss total>, <heap size>, <heap alloc>, <heap free>]\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiAbove29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeRss, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty,,, valDict.dalvikRss] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 9) {\n // has 9 entries\n [, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;\n }\n}\n\n//\n// returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n// output - array like below\n// [cpuinfo, batteryinfo, networkinfo, memoryinfo]\n//\ncommands.getPerformanceDataTypes = function getPerformanceDataTypes () {\n return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);\n};\n\n/**\n * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n * input - (packageName) the package name of the application\n * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES\n * (dataReadTimeout) the number of attempts to read\n * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.\n *\n * in case of battery info : [[power], [23]]\n * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,\n * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]\n * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],\n * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]\n * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],\n * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],\n * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]\n * in case of cpu info : [[user, kernel], [0.9, 1.3]]\n */\ncommands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {\n switch (_.toLower(dataType)) {\n case 'batteryinfo':\n return await this.getBatteryInfo(retries);\n case 'cpuinfo':\n return await this.getCPUInfo(packageName, retries);\n case 'memoryinfo':\n return await this.getMemoryInfo(packageName, retries);\n case 'networkinfo':\n return await this.getNetworkTrafficInfo(retries);\n default:\n throw new Error(`No performance data of type '${dataType}' found. ` +\n `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);\n }\n};\n\n/**\n * Return the CPU information related to the given packageName.\n * It raises an exception if the dumped CPU information did not include the given packageName\n * or the format was wrong.\n * The CPU information's sampling interval depends on the device under test.\n * For example, some devices have 5 minutes interval. When you get the information\n * from 2023-02-07 11:59:40.468 to 2023-02-07 12:04:40.556, then the next will be\n * from 2023-02-07 12:04:40.556 to 2023-02-07 12:09:40.668. No process information\n * exists in the result if the process was not running during the period.\n *\n * @param {string} packageName The package name to get the CPU information.\n * @param {number} retries The number of retry count.\n * @returns {Array} The array of the parsed CPU upsage percentages.\n * e.g. ['cpuinfo', ['14.3', '28.2']]\n * '14.3' is usage by the user (%), '28.2' is usage by the kernel (%)\n * @throw {Error} If it failed to parse the result of dumpsys, or no package name exists.\n */\nhelpers.getCPUInfo = async function getCPUInfo (packageName, retries = 2) {\n // TODO: figure out why this is\n // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',\n // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.\n // It usually fails 30 times and success for the next time,\n // Since then, he has continued to succeed.\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let output;\n try {\n output = await this.adb.shell(['dumpsys', 'cpuinfo']);\n } catch (e) {\n if (e.stderr) {\n this.log.info(e.stderr);\n }\n throw e;\n }\n // `output` will be something like\n // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor\n const usagesPattern =\n new RegExp(`^.+\\\\/${_.escapeRegExp(packageName)}:\\\\D+([\\\\d.]+)%\\\\s+user\\\\s+\\\\+\\\\s+([\\\\d.]+)%\\\\s+kernel`, 'm');\n const match = usagesPattern.exec(output);\n if (!match) {\n this.log.debug(output);\n throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);\n }\n return [CPU_KEYS, [match[1], match[2]]];\n });\n};\n\nhelpers.getBatteryInfo = async function getBatteryInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n let power = parseInt((data.split(':')[1] || '').trim(), 10);\n\n if (!Number.isNaN(power)) {\n return [_.clone(BATTERY_KEYS), [power.toString()]];\n } else {\n throw new Error(`Unable to parse battery data: '${data}'`);\n }\n });\n};\n\nhelpers.getMemoryInfo = async function getMemoryInfo (packageName, retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n const cmd = [\n 'dumpsys', 'meminfo', `'${packageName}'`,\n '|', 'grep', '-E',\n `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` +\n `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`\n ];\n const data = await this.adb.shell(cmd);\n if (!data) {\n throw new Error('No data from dumpsys');\n }\n const valDict = {totalPrivateDirty: ''};\n const apiLevel = await this.adb.getApiLevel();\n for (const line of data.split('\\n')) {\n const entries = line.trim().split(/\\s+/).filter(Boolean);\n if (apiLevel >= 30) {\n parseMeminfoForApiAbove29(entries, valDict);\n } else if (apiLevel > 18 && apiLevel < 30) {\n parseMeminfoForApi19To29(entries, valDict);\n } else {\n parseMeminfoForApiBelow19(entries, valDict);\n }\n }\n if (valDict.totalPrivateDirty && valDict.totalPrivateDirty !== 'nodex') {\n const headers = _.clone(MEMORY_KEYS);\n const values = headers.map((header) => valDict[header]);\n return [headers, values];\n }\n\n throw new Error(`Unable to parse memory data: '${data}'`);\n });\n};\n\nhelpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let returnValue = [];\n let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;\n\n let cmd = ['dumpsys', 'netstats'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n // In case of network traffic information, it is different for the return data between emulator and real device.\n // the return data of emulator\n // Xt stats:\n // Pending bytes: 39250\n // History since boot:\n // ident=[[type=WIFI, subType=COMBINED, networkId=\"WiredSSID\"]] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600000\n // bucketStart=1478098800000 activeTime=31824 rxBytes=21502 rxPackets=78 txBytes=17748 txPackets=90 operations=0\n //\n // 7.1\n // Xt stats:\n // Pending bytes: 481487\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=310260..., metered=true}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1483984800 rb=0 rp=0 tb=12031 tp=184 op=0\n // st=1483988400 rb=0 rp=0 tb=38476 tp=587 op=0\n // st=1483999200 rb=315616 rp=400 tb=94800 tp=362 op=0\n // st=1484002800 rb=15826 rp=20 tb=4738 tp=16 op=0\n //\n // the return data of real device\n // Xt stats:\n // Pending bytes: 0\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=450050...}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1478088000 rb=32115296 rp=34291 tb=2956805 tp=25705 op=0\n // st=1478091600 rb=2714683 rp=11821 tb=1420564 tp=12650 op=0\n // st=1478095200 rb=10079213 rp=19962 tb=2487705 tp=20015 op=0\n // st=1478098800 rb=4444433 rp=10227 tb=1430356 tp=10493 op=0\n let index = 0;\n let fromXtstats = data.indexOf('Xt stats:');\n\n let start = data.indexOf('Pending bytes:', fromXtstats);\n let delimiter = data.indexOf(':', start + 1);\n let end = data.indexOf('\\n', delimiter + 1);\n let pendingBytes = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf('bucketDuration', end + 1);\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf('\\n', delimiter + 1);\n bucketDuration = data.substring(delimiter + 1, end).trim();\n }\n\n if (start >= 0) {\n data = data.substring(end + 1, data.length);\n let arrayList = data.split('\\n');\n\n if (arrayList.length > 0) {\n start = -1;\n\n for (let j = 0; j < NETWORK_KEYS.length; ++j) {\n start = arrayList[0].indexOf(NETWORK_KEYS[j][0]);\n\n if (start >= 0) {\n index = j;\n returnValue[0] = [];\n\n for (let k = 0; k < NETWORK_KEYS[j].length; ++k) {\n returnValue[0][k] = NETWORK_KEYS[j][k];\n }\n break;\n }\n }\n\n let returnIndex = 1;\n for (let i = 0; i < arrayList.length; i++) {\n data = arrayList[i];\n start = data.indexOf(NETWORK_KEYS[index][0]);\n\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n bucketStart = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][1], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n activeTime = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][2], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][3], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][4], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][5], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][6], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.length;\n operations = data.substring(delimiter + 1, end).trim();\n\n }\n }\n returnValue[returnIndex++] = [bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration];\n }\n }\n }\n }\n\n if (!_.isEqual(pendingBytes, '') && !_.isUndefined(pendingBytes) && !_.isEqual(pendingBytes, 'nodex')) {\n return returnValue;\n } else {\n throw new Error(`Unable to parse network traffic data: '${data}'`);\n }\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport {\n commands, helpers, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,\n BATTERY_KEYS, NETWORK_KEYS,\n};\nexport default extensions;\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"performance.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","commands","helpers","extensions","exports","NETWORK_KEYS","CPU_KEYS","BATTERY_KEYS","MEMORY_KEYS","SUPPORTED_PERFORMANCE_DATA_TYPES","Object","freeze","cpuinfo","memoryinfo","batteryinfo","networkinfo","MEMINFO_TITLES","NATIVE","DALVIK","EGL","GL","MTRACK","TOTAL","HEAP","RETRY_PAUSE_MS","parseMeminfoForApi19To29","entries","valDict","type","subType","nativePss","nativePrivateDirty","nativeHeapSize","nativeHeapAllocatedSize","dalvikPss","dalvikPrivateDirty","eglPss","eglPrivateDirty","glPss","glPrivateDirty","length","totalPss","totalPrivateDirty","parseMeminfoForApiBelow19","parseMeminfoForApiAbove29","nativeRss","dalvikRss","totalRss","getPerformanceDataTypes","_","keys","getPerformanceData","packageName","dataType","retries","toLower","getBatteryInfo","getCPUInfo","getMemoryInfo","getNetworkTrafficInfo","Error","JSON","stringify","retryInterval","output","adb","shell","e","stderr","log","info","usagesPattern","RegExp","escapeRegExp","match","exec","debug","cmd","data","power","parseInt","split","trim","Number","isNaN","clone","toString","apiLevel","getApiLevel","line","filter","Boolean","headers","values","map","header","returnValue","bucketDuration","bucketStart","activeTime","rxBytes","rxPackets","txBytes","txPackets","operations","index","fromXtstats","indexOf","start","delimiter","end","pendingBytes","substring","arrayList","j","k","returnIndex","i","isEqual","isUndefined","assign","_default","default"],"sources":["../../../lib/commands/performance.js"],"sourcesContent":["import _ from 'lodash';\nimport { retryInterval } from 'asyncbox';\n\nconst commands = {}, helpers = {}, extensions = {};\n\nconst NETWORK_KEYS = [\n ['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'],\n ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']\n];\nconst CPU_KEYS = ['user', 'kernel'];\nconst BATTERY_KEYS = ['power'];\nconst MEMORY_KEYS = [\n 'totalPrivateDirty', 'nativePrivateDirty', 'dalvikPrivateDirty',\n 'eglPrivateDirty', 'glPrivateDirty',\n 'totalPss', 'nativePss', 'dalvikPss', 'eglPss', 'glPss',\n 'nativeHeapAllocatedSize', 'nativeHeapSize',\n 'nativeRss', 'dalvikRss', 'totalRss'\n];\nconst SUPPORTED_PERFORMANCE_DATA_TYPES = Object.freeze({\n cpuinfo: 'the amount of cpu by user and kernel process - cpu information for applications on real devices and simulators',\n memoryinfo: 'the amount of memory used by the process - memory information for applications on real devices and simulators',\n batteryinfo: 'the remaining battery power - battery power information for applications on real devices and simulators',\n networkinfo: 'the network statistics - network rx/tx information for applications on real devices and simulators'\n});\nconst MEMINFO_TITLES = Object.freeze({\n NATIVE: 'Native',\n DALVIK: 'Dalvik',\n EGL: 'EGL',\n GL: 'GL',\n MTRACK: 'mtrack',\n TOTAL: 'TOTAL',\n HEAP: 'Heap'\n});\nconst RETRY_PAUSE_MS = 1000;\n\n/**\n * API level between 18 and 30\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <heap size>, <heap alloc>, <heap free>]\n * except 'TOTAL', which skips the second type name\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApi19To29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 8) {\n // there are two totals, and we only want the full listing, which has 8 entries\n [, valDict.totalPss, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * ['<System Type', '<pps>', '<shared dirty>', '<private dirty>', '<heap size>', '<heap alloc>', '<heap free>']\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiBelow19 (entries, valDict) {\n const type = entries[0];\n if (type === MEMINFO_TITLES.NATIVE) {\n [, valDict.nativePss,, valDict.nativePrivateDirty, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK) {\n [, valDict.dalvikPss,, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL) {\n [, valDict.eglPss,, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL) {\n [, valDict.glPss,, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL) {\n [, valDict.totalPss,, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * API level 30 and above\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <rss total>, <heap size>, <heap alloc>, <heap free>]\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiAbove29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeRss, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty,,, valDict.dalvikRss] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 9) {\n // has 9 entries\n [, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;\n }\n}\n\n//\n// returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n// output - array like below\n// [cpuinfo, batteryinfo, networkinfo, memoryinfo]\n//\ncommands.getPerformanceDataTypes = function getPerformanceDataTypes () {\n return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);\n};\n\n/**\n * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n * input - (packageName) the package name of the application\n * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES\n * (dataReadTimeout) the number of attempts to read\n * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.\n *\n * in case of battery info : [[power], [23]]\n * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,\n * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]\n * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],\n * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]\n * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],\n * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],\n * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]\n * in case of cpu info : [[user, kernel], [0.9, 1.3]]\n */\ncommands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {\n switch (_.toLower(dataType)) {\n case 'batteryinfo':\n return await this.getBatteryInfo(retries);\n case 'cpuinfo':\n return await this.getCPUInfo(packageName, retries);\n case 'memoryinfo':\n return await this.getMemoryInfo(packageName, retries);\n case 'networkinfo':\n return await this.getNetworkTrafficInfo(retries);\n default:\n throw new Error(`No performance data of type '${dataType}' found. ` +\n `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);\n }\n};\n\n/**\n * Return the CPU information related to the given packageName.\n * It raises an exception if the dumped CPU information did not include the given packageName\n * or the format was wrong.\n * The CPU information's sampling interval depends on the device under test.\n * For example, some devices have 5 minutes interval. When you get the information\n * from 2023-02-07 11:59:40.468 to 2023-02-07 12:04:40.556, then the next will be\n * from 2023-02-07 12:04:40.556 to 2023-02-07 12:09:40.668. No process information\n * exists in the result if the process was not running during the period.\n *\n * @param {string} packageName The package name to get the CPU information.\n * @param {number} retries The number of retry count.\n * @returns {Array} The array of the parsed CPU upsage percentages.\n * e.g. ['cpuinfo', ['14.3', '28.2']]\n * '14.3' is usage by the user (%), '28.2' is usage by the kernel (%)\n * @throw {Error} If it failed to parse the result of dumpsys, or no package name exists.\n */\nhelpers.getCPUInfo = async function getCPUInfo (packageName, retries = 2) {\n // TODO: figure out why this is\n // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',\n // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.\n // It usually fails 30 times and success for the next time,\n // Since then, he has continued to succeed.\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let output;\n try {\n output = await this.adb.shell(['dumpsys', 'cpuinfo']);\n } catch (e) {\n if (e.stderr) {\n this.log.info(e.stderr);\n }\n throw e;\n }\n // `output` will be something like\n // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor\n const usagesPattern =\n new RegExp(`^.+\\\\/${_.escapeRegExp(packageName)}:\\\\D+([\\\\d.]+)%\\\\s+user\\\\s+\\\\+\\\\s+([\\\\d.]+)%\\\\s+kernel`, 'm');\n const match = usagesPattern.exec(output);\n if (!match) {\n this.log.debug(output);\n throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);\n }\n return [CPU_KEYS, [match[1], match[2]]];\n });\n};\n\nhelpers.getBatteryInfo = async function getBatteryInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n let power = parseInt((data.split(':')[1] || '').trim(), 10);\n\n if (!Number.isNaN(power)) {\n return [_.clone(BATTERY_KEYS), [power.toString()]];\n } else {\n throw new Error(`Unable to parse battery data: '${data}'`);\n }\n });\n};\n\nhelpers.getMemoryInfo = async function getMemoryInfo (packageName, retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n const cmd = [\n 'dumpsys', 'meminfo', `'${packageName}'`,\n '|', 'grep', '-E',\n `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` +\n `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`\n ];\n const data = await this.adb.shell(cmd);\n if (!data) {\n throw new Error('No data from dumpsys');\n }\n const valDict = {totalPrivateDirty: ''};\n const apiLevel = await this.adb.getApiLevel();\n for (const line of data.split('\\n')) {\n const entries = line.trim().split(/\\s+/).filter(Boolean);\n if (apiLevel >= 30) {\n parseMeminfoForApiAbove29(entries, valDict);\n } else if (apiLevel > 18 && apiLevel < 30) {\n parseMeminfoForApi19To29(entries, valDict);\n } else {\n parseMeminfoForApiBelow19(entries, valDict);\n }\n }\n if (valDict.totalPrivateDirty && valDict.totalPrivateDirty !== 'nodex') {\n const headers = _.clone(MEMORY_KEYS);\n const values = headers.map((header) => valDict[header]);\n return [headers, values];\n }\n\n throw new Error(`Unable to parse memory data: '${data}'`);\n });\n};\n\nhelpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let returnValue = [];\n let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;\n\n let cmd = ['dumpsys', 'netstats'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n // In case of network traffic information, it is different for the return data between emulator and real device.\n // the return data of emulator\n // Xt stats:\n // Pending bytes: 39250\n // History since boot:\n // ident=[[type=WIFI, subType=COMBINED, networkId=\"WiredSSID\"]] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600000\n // bucketStart=1478098800000 activeTime=31824 rxBytes=21502 rxPackets=78 txBytes=17748 txPackets=90 operations=0\n //\n // 7.1\n // Xt stats:\n // Pending bytes: 481487\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=310260..., metered=true}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1483984800 rb=0 rp=0 tb=12031 tp=184 op=0\n // st=1483988400 rb=0 rp=0 tb=38476 tp=587 op=0\n // st=1483999200 rb=315616 rp=400 tb=94800 tp=362 op=0\n // st=1484002800 rb=15826 rp=20 tb=4738 tp=16 op=0\n //\n // the return data of real device\n // Xt stats:\n // Pending bytes: 0\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=450050...}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1478088000 rb=32115296 rp=34291 tb=2956805 tp=25705 op=0\n // st=1478091600 rb=2714683 rp=11821 tb=1420564 tp=12650 op=0\n // st=1478095200 rb=10079213 rp=19962 tb=2487705 tp=20015 op=0\n // st=1478098800 rb=4444433 rp=10227 tb=1430356 tp=10493 op=0\n let index = 0;\n let fromXtstats = data.indexOf('Xt stats:');\n\n let start = data.indexOf('Pending bytes:', fromXtstats);\n let delimiter = data.indexOf(':', start + 1);\n let end = data.indexOf('\\n', delimiter + 1);\n let pendingBytes = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf('bucketDuration', end + 1);\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf('\\n', delimiter + 1);\n bucketDuration = data.substring(delimiter + 1, end).trim();\n }\n\n if (start >= 0) {\n data = data.substring(end + 1, data.length);\n let arrayList = data.split('\\n');\n\n if (arrayList.length > 0) {\n start = -1;\n\n for (let j = 0; j < NETWORK_KEYS.length; ++j) {\n start = arrayList[0].indexOf(NETWORK_KEYS[j][0]);\n\n if (start >= 0) {\n index = j;\n returnValue[0] = [];\n\n for (let k = 0; k < NETWORK_KEYS[j].length; ++k) {\n returnValue[0][k] = NETWORK_KEYS[j][k];\n }\n break;\n }\n }\n\n let returnIndex = 1;\n for (let i = 0; i < arrayList.length; i++) {\n data = arrayList[i];\n start = data.indexOf(NETWORK_KEYS[index][0]);\n\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n bucketStart = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][1], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n activeTime = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][2], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][3], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][4], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][5], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][6], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.length;\n operations = data.substring(delimiter + 1, end).trim();\n\n }\n }\n returnValue[returnIndex++] = [bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration];\n }\n }\n }\n }\n\n if (!_.isEqual(pendingBytes, '') && !_.isUndefined(pendingBytes) && !_.isEqual(pendingBytes, 'nodex')) {\n return returnValue;\n } else {\n throw new Error(`Unable to parse network traffic data: '${data}'`);\n }\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport {\n commands, helpers, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,\n BATTERY_KEYS, NETWORK_KEYS,\n};\nexport default extensions;\n\n"],"mappings":"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"}
@@ -113,4 +113,4 @@ commands.mobileGetPermissions = async function mobileGetPermissions(opts = {}) {
113
113
  };
114
114
  var _default = commands;
115
115
  exports.default = _default;
116
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiX3V0aWxzIiwiY29tbWFuZHMiLCJleHBvcnRzIiwiQUxMX1BFUk1JU1NJT05TX01BR0lDIiwiUE1fQUNUSU9OIiwiT2JqZWN0IiwiZnJlZXplIiwiR1JBTlQiLCJSRVZPS0UiLCJBUFBPUFNfQUNUSU9OIiwiQUxMT1ciLCJERU5ZIiwiSUdOT1JFIiwiREVGQVVMVCIsIlBFUk1JU1NJT05fVEFSR0VUIiwiUE0iLCJBUFBPUFMiLCJQRVJNSVNTSU9OU19UWVBFIiwiREVOSUVEIiwiR1JBTlRFRCIsIlJFUVVFU1RFRCIsImNoYW5nZVBlcm1pc3Npb25zVmlhUG0iLCJwZXJtaXNzaW9ucyIsImFwcFBhY2thZ2UiLCJhY3Rpb24iLCJfIiwidmFsdWVzIiwiaW5jbHVkZXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJhZmZlY3RlZFBlcm1pc3Npb25zIiwiaXNBcnJheSIsInRvTG93ZXIiLCJkdW1wc3lzIiwiYWRiIiwic2hlbGwiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJyZXFQZXJtaXNzb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwiaXNFbXB0eSIsImxvZyIsImluZm8iLCJncmFudFBlcm1pc3Npb25zIiwiQiIsImFsbCIsIm1hcCIsIm5hbWUiLCJyZXZva2VQZXJtaXNzaW9uIiwiY2hhbmdlUGVybWlzc2lvbnNWaWFBcHBvcHMiLCJwcm9taXNlcyIsInBlcm1pc3Npb24iLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsIm9wdHMiLCJ0YXJnZXQiLCJpc05pbCIsImJpbmQiLCJlbnN1cmVGZWF0dXJlRW5hYmxlZCIsIkFEQl9TSEVMTF9GRUFUVVJFIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiYWN0aW9uRnVuYyIsInBrZyIsImdldERlbmllZFBlcm1pc3Npb25zIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3Blcm1pc3Npb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEFEQl9TSEVMTF9GRUFUVVJFIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBBTExfUEVSTUlTU0lPTlNfTUFHSUMgPSAnYWxsJztcbmNvbnN0IFBNX0FDVElPTiA9IE9iamVjdC5mcmVlemUoe1xuICBHUkFOVDogJ2dyYW50JyxcbiAgUkVWT0tFOiAncmV2b2tlJyxcbn0pO1xuY29uc3QgQVBQT1BTX0FDVElPTiA9IE9iamVjdC5mcmVlemUoe1xuICBBTExPVzogJ2FsbG93JyxcbiAgREVOWTogJ2RlbnknLFxuICBJR05PUkU6ICdpZ25vcmUnLFxuICBERUZBVUxUOiAnZGVmYXVsdCcsXG59KTtcbmNvbnN0IFBFUk1JU1NJT05fVEFSR0VUID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFBNOiAncG0nLFxuICBBUFBPUFM6ICdhcHBvcHMnLFxufSk7XG5jb25zdCBQRVJNSVNTSU9OU19UWVBFID0gT2JqZWN0LmZyZWV6ZSh7XG4gIERFTklFRDogJ2RlbmllZCcsXG4gIEdSQU5URUQ6ICdncmFudGVkJyxcbiAgUkVRVUVTVEVEOiAncmVxdWVzdGVkJyxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjaGFuZ2VQZXJtaXNzaW9uc1ZpYVBtIChwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgYWN0aW9uKSB7XG4gIGlmICghXy52YWx1ZXMoUE1fQUNUSU9OKS5pbmNsdWRlcyhhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBhY3Rpb24gJyR7YWN0aW9ufScuIGAgK1xuICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQTV9BQ1RJT04pKX0gYWN0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBsZXQgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uaXNBcnJheShwZXJtaXNzaW9ucykgPyBwZXJtaXNzaW9ucyA6IFtwZXJtaXNzaW9uc107XG4gIGlmIChfLnRvTG93ZXIocGVybWlzc2lvbnMpID09PSBBTExfUEVSTUlTU0lPTlNfTUFHSUMpIHtcbiAgICBjb25zdCBkdW1wc3lzID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBhcHBQYWNrYWdlXSk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgIGlmIChhY3Rpb24gPT09IFBNX0FDVElPTi5HUkFOVCkge1xuICAgICAgY29uc3QgcmVxUGVybWlzc29ucyA9IGF3YWl0IHRoaXMuYWRiLmdldFJlcVBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uZGlmZmVyZW5jZShyZXFQZXJtaXNzb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZmZlY3RlZFBlcm1pc3Npb25zID0gZ3JhbnRlZFBlcm1pc3Npb25zO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGFmZmVjdGVkUGVybWlzc2lvbnMpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnJHthcHBQYWNrYWdlfScgY29udGFpbnMgbm8gcGVybWlzc2lvbnMgdG8gJHthY3Rpb259YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gUE1fQUNUSU9OLkdSQU5UKSB7XG4gICAgYXdhaXQgdGhpcy5hZGIuZ3JhbnRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBhZmZlY3RlZFBlcm1pc3Npb25zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBCLmFsbChhZmZlY3RlZFBlcm1pc3Npb25zLm1hcCgobmFtZSkgPT4gdGhpcy5hZGIucmV2b2tlUGVybWlzc2lvbihhcHBQYWNrYWdlLCBuYW1lKSkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoYW5nZVBlcm1pc3Npb25zVmlhQXBwb3BzIChwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgYWN0aW9uKSB7XG4gIGlmICghXy52YWx1ZXMoQVBQT1BTX0FDVElPTikuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoQVBQT1BTX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICBpZiAoXy50b0xvd2VyKHBlcm1pc3Npb25zKSA9PT0gQUxMX1BFUk1JU1NJT05TX01BR0lDKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJyR7QUxMX1BFUk1JU1NJT05TX01BR0lDfScgcGVybWlzc2lvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYCArXG4gICAgICBgJyR7UEVSTUlTU0lPTl9UQVJHRVQuUE19JyB0YXJnZXQuIGAgK1xuICAgICAgYENoZWNrIEFwcE9wc01hbmFnZXIuamF2YSBmcm9tIEFuZHJvaWQgcGxhdGZvcm0gc291cmNlcyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgQXBwT3BzIHBlcm1pc3Npb25zYCk7XG4gIH1cblxuICBjb25zdCBwcm9taXNlcyA9IChfLmlzQXJyYXkocGVybWlzc2lvbnMpID8gcGVybWlzc2lvbnMgOiBbcGVybWlzc2lvbnNdKVxuICAgIC5tYXAoKHBlcm1pc3Npb24pID0+IHRoaXMuYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIGFwcFBhY2thZ2UsIHBlcm1pc3Npb24sIGFjdGlvbl0pKTtcbiAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYW5nZVBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfEFycmF5PHN0cmluZz59IHBlcm1pc3Npb25zXG4gKiBJZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ3BtJzpcbiAqICAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBjaGFuZ2VkXG4gKiBvciBhIGxpc3Qgb2YgcGVybWlzc2lvbnMuIENoZWNrIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb25cbiAqIHRvIGdldCB0aGUgZnVsbCBsaXN0IG9mIHN0YW5kYXJkIEFuZHJvaWQgcGVybXNzaW9uIG5hbWVzLiBNYW5kYXRvcnkgYXJndW1lbnQuXG4gKiBJZiAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgcGFzc2VkIHRoZW4gdGhlIGNob3NlbiBhY3Rpb24gaXMgZ29pbmcgdG8gYmUgYXBwbGllZCB0byBhbGxcbiAqIHBlcm1pc2lzb25zIHJlcXVlc3RlZC9ncmFudGVkIGJ5ICdhcHBQYWNrYWdlJy5cbiAqIElmIGB0YXJnZXRgIGlzIHNldCB0byAnYXBwb3BzJzpcbiAqICAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgYXBwb3BzIHBlcm1pc3Npb24gdG8gYmUgY2hhbmdlZFxuICogb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zLiBDaGVjayBBcHBPcHNNYW5hZ2VyLmphdmEgc291cmNlcyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZlxuICogc3VwcG9ydGVkIGFwcG9wcyBwZXJtaXNzaW9uIG5hbWVzIGZvciB0aGUgZ2l2ZW4gQW5kcm9pZCBwa2xhdGZvcm0uXG4gKiBFeGFtcGxlczogJ0FDVElWSVRZX1JFQ09HTklUSU9OJywgJ1NNU19GSU5BTkNJQUxfVFJBTlNBQ1RJT05TJywgJ1JFQURfU01TJywgJ0FDQ0VTU19OT1RJRklDQVRJT05TJy5cbiAqIFRoZSAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgdW5zdXBwb3J0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIFRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIHNldCBjaGFuZ2VcbiAqIHBlcm1pc3Npb25zIG9uLiBEZWZhdWx0cyB0byB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRlc3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIFtncmFudHxhbGxvd10gT25lIG9mIGBQTV9BQ1RJT05gIHZhbHVlcyBpZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ3BtJyxcbiAqIG90aGVyd2lzZSBvbmUgb2YgYEFQUE9QU19BQ1RJT05gIHZhbHVlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCBbcG1dIEVpdGhlciAncG0nIG9yICdhcHBvcHMnLiBUaGUgJ2FwcG9wcycgb25lIHJlcXVpcmVzXG4gKiAnYWRiX3NoZWxsJyBzZXJ2ZXIgc2VjdXJpdHkgb3B0aW9uIHRvIGJlIGVuYWJsZWQuXG4gKi9cblxuLyoqXG4gKiBDaGFuZ2VzIHBhY2thZ2UgcGVybWlzc2lvbnMgaW4gcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gez9DaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwZXJtaXNzaW9ucyxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aW9uID0gXy50b0xvd2VyKG9wdHMudGFyZ2V0KSA9PT0gUEVSTUlTU0lPTl9UQVJHRVQuQVBQT1BTID8gQVBQT1BTX0FDVElPTi5BTExPVyA6IFBNX0FDVElPTi5HUkFOVCxcbiAgICB0YXJnZXQgPSBQRVJNSVNTSU9OX1RBUkdFVC5QTSxcbiAgfSA9IG9wdHM7XG4gIGlmIChfLmlzTmlsKHBlcm1pc3Npb25zKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgbXVzdCBub3QgYmUgZW1wdHlgKTtcbiAgfVxuXG4gIHN3aXRjaCAoXy50b0xvd2VyKHRhcmdldCkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05fVEFSR0VULlBNOlxuICAgICAgcmV0dXJuIGF3YWl0IGNoYW5nZVBlcm1pc3Npb25zVmlhUG0uYmluZCh0aGlzKShwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgXy50b0xvd2VyKGFjdGlvbikpO1xuICAgIGNhc2UgUEVSTUlTU0lPTl9UQVJHRVQuQVBQT1BTOlxuICAgICAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChBREJfU0hFTExfRkVBVFVSRSk7XG4gICAgICByZXR1cm4gYXdhaXQgY2hhbmdlUGVybWlzc2lvbnNWaWFBcHBvcHMuYmluZCh0aGlzKShwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgXy50b0xvd2VyKGFjdGlvbikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAndGFyZ2V0JyBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZjogJHtfLnZhbHVlcyhQRVJNSVNTSU9OX1RBUkdFVCl9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0UGVybWlzc2lvbnNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBbcmVxdWVzdGVkXSAtIE9uZSBvZiBwb3NzaWJsZSBwZXJtaXNzaW9uIHR5cGVzIHRvIGdldC5cbiAqIENhbiBiZSBhbnkgb2YgYFBFUk1JU1NJT05TX1RZUEVgIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYWNrYWdlIFt0aGlzLm9wdHMuYXBwUGFja2FnZV0gLSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICovXG5cbi8qKlxuICogR2V0cyBydW50aW1lIHBlcm1pc3Npb25zIGxpc3QgZm9yIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7R2V0UGVybWlzc2lvbnNPcHRpb25zfSBvcHRzIC0gQXZhaWxhYmxlIG9wdGlvbnMgbWFwcGluZy5cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiByZXRyaWV2ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBnaXZlbiB0eXBlXG4gKiAoY2FuIGFsc28gYmUgZW1wdHkpLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBnZXR0aW5nIHBlcm1pc3Npb25zLlxuICovXG5jb21tYW5kcy5tb2JpbGVHZXRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldFBlcm1pc3Npb25zIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHR5cGUgPSBQRVJNSVNTSU9OU19UWVBFLlJFUVVFU1RFRCxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gIH0gPSBvcHRzO1xuXG4gIGxldCBhY3Rpb25GdW5jO1xuICBzd2l0Y2ggKF8udG9Mb3dlcih0eXBlKSkge1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQ6XG4gICAgICBhY3Rpb25GdW5jID0gKHBrZykgPT4gdGhpcy5hZGIuZ2V0UmVxUGVybWlzc2lvbnMocGtnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5HUkFOVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChwa2cpID0+IHRoaXMuYWRiLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhwa2cpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLkRFTklFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAocGtnKSA9PiB0aGlzLmFkYi5nZXREZW5pZWRQZXJtaXNzaW9ucyhwa2cpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gcGVybWlzc2lvbnMgdHlwZSAnJHt0eXBlfScuIGAgK1xuICAgICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KF8udmFsdWVzKFBFUk1JU1NJT05TX1RZUEUpKX0gdHlwZXMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCBhY3Rpb25GdW5jKGFwcFBhY2thZ2UpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLE1BQU1JLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRCxRQUFBLEdBQUFBLFFBQUE7QUFFcEIsTUFBTUUscUJBQXFCLEdBQUcsS0FB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
116
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiX3V0aWxzIiwiY29tbWFuZHMiLCJleHBvcnRzIiwiQUxMX1BFUk1JU1NJT05TX01BR0lDIiwiUE1fQUNUSU9OIiwiT2JqZWN0IiwiZnJlZXplIiwiR1JBTlQiLCJSRVZPS0UiLCJBUFBPUFNfQUNUSU9OIiwiQUxMT1ciLCJERU5ZIiwiSUdOT1JFIiwiREVGQVVMVCIsIlBFUk1JU1NJT05fVEFSR0VUIiwiUE0iLCJBUFBPUFMiLCJQRVJNSVNTSU9OU19UWVBFIiwiREVOSUVEIiwiR1JBTlRFRCIsIlJFUVVFU1RFRCIsImNoYW5nZVBlcm1pc3Npb25zVmlhUG0iLCJwZXJtaXNzaW9ucyIsImFwcFBhY2thZ2UiLCJhY3Rpb24iLCJfIiwidmFsdWVzIiwiaW5jbHVkZXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJhZmZlY3RlZFBlcm1pc3Npb25zIiwiaXNBcnJheSIsInRvTG93ZXIiLCJkdW1wc3lzIiwiYWRiIiwic2hlbGwiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJyZXFQZXJtaXNzb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwiaXNFbXB0eSIsImxvZyIsImluZm8iLCJncmFudFBlcm1pc3Npb25zIiwiQiIsImFsbCIsIm1hcCIsIm5hbWUiLCJyZXZva2VQZXJtaXNzaW9uIiwiY2hhbmdlUGVybWlzc2lvbnNWaWFBcHBvcHMiLCJwcm9taXNlcyIsInBlcm1pc3Npb24iLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsIm9wdHMiLCJ0YXJnZXQiLCJpc05pbCIsImJpbmQiLCJlbnN1cmVGZWF0dXJlRW5hYmxlZCIsIkFEQl9TSEVMTF9GRUFUVVJFIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiYWN0aW9uRnVuYyIsInBrZyIsImdldERlbmllZFBlcm1pc3Npb25zIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3Blcm1pc3Npb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEFEQl9TSEVMTF9GRUFUVVJFIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBBTExfUEVSTUlTU0lPTlNfTUFHSUMgPSAnYWxsJztcbmNvbnN0IFBNX0FDVElPTiA9IE9iamVjdC5mcmVlemUoe1xuICBHUkFOVDogJ2dyYW50JyxcbiAgUkVWT0tFOiAncmV2b2tlJyxcbn0pO1xuY29uc3QgQVBQT1BTX0FDVElPTiA9IE9iamVjdC5mcmVlemUoe1xuICBBTExPVzogJ2FsbG93JyxcbiAgREVOWTogJ2RlbnknLFxuICBJR05PUkU6ICdpZ25vcmUnLFxuICBERUZBVUxUOiAnZGVmYXVsdCcsXG59KTtcbmNvbnN0IFBFUk1JU1NJT05fVEFSR0VUID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFBNOiAncG0nLFxuICBBUFBPUFM6ICdhcHBvcHMnLFxufSk7XG5jb25zdCBQRVJNSVNTSU9OU19UWVBFID0gT2JqZWN0LmZyZWV6ZSh7XG4gIERFTklFRDogJ2RlbmllZCcsXG4gIEdSQU5URUQ6ICdncmFudGVkJyxcbiAgUkVRVUVTVEVEOiAncmVxdWVzdGVkJyxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjaGFuZ2VQZXJtaXNzaW9uc1ZpYVBtIChwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgYWN0aW9uKSB7XG4gIGlmICghXy52YWx1ZXMoUE1fQUNUSU9OKS5pbmNsdWRlcyhhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBhY3Rpb24gJyR7YWN0aW9ufScuIGAgK1xuICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQTV9BQ1RJT04pKX0gYWN0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBsZXQgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uaXNBcnJheShwZXJtaXNzaW9ucykgPyBwZXJtaXNzaW9ucyA6IFtwZXJtaXNzaW9uc107XG4gIGlmIChfLnRvTG93ZXIocGVybWlzc2lvbnMpID09PSBBTExfUEVSTUlTU0lPTlNfTUFHSUMpIHtcbiAgICBjb25zdCBkdW1wc3lzID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBhcHBQYWNrYWdlXSk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgIGlmIChhY3Rpb24gPT09IFBNX0FDVElPTi5HUkFOVCkge1xuICAgICAgY29uc3QgcmVxUGVybWlzc29ucyA9IGF3YWl0IHRoaXMuYWRiLmdldFJlcVBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uZGlmZmVyZW5jZShyZXFQZXJtaXNzb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZmZlY3RlZFBlcm1pc3Npb25zID0gZ3JhbnRlZFBlcm1pc3Npb25zO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGFmZmVjdGVkUGVybWlzc2lvbnMpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnJHthcHBQYWNrYWdlfScgY29udGFpbnMgbm8gcGVybWlzc2lvbnMgdG8gJHthY3Rpb259YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gUE1fQUNUSU9OLkdSQU5UKSB7XG4gICAgYXdhaXQgdGhpcy5hZGIuZ3JhbnRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBhZmZlY3RlZFBlcm1pc3Npb25zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBCLmFsbChhZmZlY3RlZFBlcm1pc3Npb25zLm1hcCgobmFtZSkgPT4gdGhpcy5hZGIucmV2b2tlUGVybWlzc2lvbihhcHBQYWNrYWdlLCBuYW1lKSkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoYW5nZVBlcm1pc3Npb25zVmlhQXBwb3BzIChwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgYWN0aW9uKSB7XG4gIGlmICghXy52YWx1ZXMoQVBQT1BTX0FDVElPTikuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoQVBQT1BTX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICBpZiAoXy50b0xvd2VyKHBlcm1pc3Npb25zKSA9PT0gQUxMX1BFUk1JU1NJT05TX01BR0lDKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJyR7QUxMX1BFUk1JU1NJT05TX01BR0lDfScgcGVybWlzc2lvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYCArXG4gICAgICBgJyR7UEVSTUlTU0lPTl9UQVJHRVQuUE19JyB0YXJnZXQuIGAgK1xuICAgICAgYENoZWNrIEFwcE9wc01hbmFnZXIuamF2YSBmcm9tIEFuZHJvaWQgcGxhdGZvcm0gc291cmNlcyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgQXBwT3BzIHBlcm1pc3Npb25zYCk7XG4gIH1cblxuICBjb25zdCBwcm9taXNlcyA9IChfLmlzQXJyYXkocGVybWlzc2lvbnMpID8gcGVybWlzc2lvbnMgOiBbcGVybWlzc2lvbnNdKVxuICAgIC5tYXAoKHBlcm1pc3Npb24pID0+IHRoaXMuYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIGFwcFBhY2thZ2UsIHBlcm1pc3Npb24sIGFjdGlvbl0pKTtcbiAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYW5nZVBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfEFycmF5PHN0cmluZz59IHBlcm1pc3Npb25zXG4gKiBJZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ3BtJzpcbiAqICAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBjaGFuZ2VkXG4gKiBvciBhIGxpc3Qgb2YgcGVybWlzc2lvbnMuIENoZWNrIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb25cbiAqIHRvIGdldCB0aGUgZnVsbCBsaXN0IG9mIHN0YW5kYXJkIEFuZHJvaWQgcGVybXNzaW9uIG5hbWVzLiBNYW5kYXRvcnkgYXJndW1lbnQuXG4gKiBJZiAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgcGFzc2VkIHRoZW4gdGhlIGNob3NlbiBhY3Rpb24gaXMgZ29pbmcgdG8gYmUgYXBwbGllZCB0byBhbGxcbiAqIHBlcm1pc2lzb25zIHJlcXVlc3RlZC9ncmFudGVkIGJ5ICdhcHBQYWNrYWdlJy5cbiAqIElmIGB0YXJnZXRgIGlzIHNldCB0byAnYXBwb3BzJzpcbiAqICAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgYXBwb3BzIHBlcm1pc3Npb24gdG8gYmUgY2hhbmdlZFxuICogb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zLiBDaGVjayBBcHBPcHNNYW5hZ2VyLmphdmEgc291cmNlcyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZlxuICogc3VwcG9ydGVkIGFwcG9wcyBwZXJtaXNzaW9uIG5hbWVzIGZvciB0aGUgZ2l2ZW4gQW5kcm9pZCBwa2xhdGZvcm0uXG4gKiBFeGFtcGxlczogJ0FDVElWSVRZX1JFQ09HTklUSU9OJywgJ1NNU19GSU5BTkNJQUxfVFJBTlNBQ1RJT05TJywgJ1JFQURfU01TJywgJ0FDQ0VTU19OT1RJRklDQVRJT05TJy5cbiAqIFRoZSAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgdW5zdXBwb3J0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIFRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIHNldCBjaGFuZ2VcbiAqIHBlcm1pc3Npb25zIG9uLiBEZWZhdWx0cyB0byB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRlc3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIFtncmFudHxhbGxvd10gT25lIG9mIGBQTV9BQ1RJT05gIHZhbHVlcyBpZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ3BtJyxcbiAqIG90aGVyd2lzZSBvbmUgb2YgYEFQUE9QU19BQ1RJT05gIHZhbHVlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCBbcG1dIEVpdGhlciAncG0nIG9yICdhcHBvcHMnLiBUaGUgJ2FwcG9wcycgb25lIHJlcXVpcmVzXG4gKiAnYWRiX3NoZWxsJyBzZXJ2ZXIgc2VjdXJpdHkgb3B0aW9uIHRvIGJlIGVuYWJsZWQuXG4gKi9cblxuLyoqXG4gKiBDaGFuZ2VzIHBhY2thZ2UgcGVybWlzc2lvbnMgaW4gcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gez9DaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwZXJtaXNzaW9ucyxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aW9uID0gXy50b0xvd2VyKG9wdHMudGFyZ2V0KSA9PT0gUEVSTUlTU0lPTl9UQVJHRVQuQVBQT1BTID8gQVBQT1BTX0FDVElPTi5BTExPVyA6IFBNX0FDVElPTi5HUkFOVCxcbiAgICB0YXJnZXQgPSBQRVJNSVNTSU9OX1RBUkdFVC5QTSxcbiAgfSA9IG9wdHM7XG4gIGlmIChfLmlzTmlsKHBlcm1pc3Npb25zKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgbXVzdCBub3QgYmUgZW1wdHlgKTtcbiAgfVxuXG4gIHN3aXRjaCAoXy50b0xvd2VyKHRhcmdldCkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05fVEFSR0VULlBNOlxuICAgICAgcmV0dXJuIGF3YWl0IGNoYW5nZVBlcm1pc3Npb25zVmlhUG0uYmluZCh0aGlzKShwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgXy50b0xvd2VyKGFjdGlvbikpO1xuICAgIGNhc2UgUEVSTUlTU0lPTl9UQVJHRVQuQVBQT1BTOlxuICAgICAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChBREJfU0hFTExfRkVBVFVSRSk7XG4gICAgICByZXR1cm4gYXdhaXQgY2hhbmdlUGVybWlzc2lvbnNWaWFBcHBvcHMuYmluZCh0aGlzKShwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgXy50b0xvd2VyKGFjdGlvbikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAndGFyZ2V0JyBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZjogJHtfLnZhbHVlcyhQRVJNSVNTSU9OX1RBUkdFVCl9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0UGVybWlzc2lvbnNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBbcmVxdWVzdGVkXSAtIE9uZSBvZiBwb3NzaWJsZSBwZXJtaXNzaW9uIHR5cGVzIHRvIGdldC5cbiAqIENhbiBiZSBhbnkgb2YgYFBFUk1JU1NJT05TX1RZUEVgIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYWNrYWdlIFt0aGlzLm9wdHMuYXBwUGFja2FnZV0gLSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICovXG5cbi8qKlxuICogR2V0cyBydW50aW1lIHBlcm1pc3Npb25zIGxpc3QgZm9yIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7R2V0UGVybWlzc2lvbnNPcHRpb25zfSBvcHRzIC0gQXZhaWxhYmxlIG9wdGlvbnMgbWFwcGluZy5cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiByZXRyaWV2ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBnaXZlbiB0eXBlXG4gKiAoY2FuIGFsc28gYmUgZW1wdHkpLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBnZXR0aW5nIHBlcm1pc3Npb25zLlxuICovXG5jb21tYW5kcy5tb2JpbGVHZXRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldFBlcm1pc3Npb25zIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHR5cGUgPSBQRVJNSVNTSU9OU19UWVBFLlJFUVVFU1RFRCxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gIH0gPSBvcHRzO1xuXG4gIGxldCBhY3Rpb25GdW5jO1xuICBzd2l0Y2ggKF8udG9Mb3dlcih0eXBlKSkge1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQ6XG4gICAgICBhY3Rpb25GdW5jID0gKHBrZykgPT4gdGhpcy5hZGIuZ2V0UmVxUGVybWlzc2lvbnMocGtnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5HUkFOVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChwa2cpID0+IHRoaXMuYWRiLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhwa2cpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLkRFTklFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAocGtnKSA9PiB0aGlzLmFkYi5nZXREZW5pZWRQZXJtaXNzaW9ucyhwa2cpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gcGVybWlzc2lvbnMgdHlwZSAnJHt0eXBlfScuIGAgK1xuICAgICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KF8udmFsdWVzKFBFUk1JU1NJT05TX1RZUEUpKX0gdHlwZXMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCBhY3Rpb25GdW5jKGFwcFBhY2thZ2UpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLE1BQU1JLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRCxRQUFBLEdBQUFBLFFBQUE7QUFFcEIsTUFBTUUscUJBQXFCLEdBQUcsS0FB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