appium-android-driver 5.8.8 → 5.8.10

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 (73) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/index.js +1 -1
  3. package/build/lib/android-helpers.js +8 -6
  4. package/build/lib/android-helpers.js.map +1 -1
  5. package/build/lib/bootstrap.js +1 -1
  6. package/build/lib/bootstrap.js.map +1 -1
  7. package/build/lib/commands/actions.js +1 -1
  8. package/build/lib/commands/actions.js.map +1 -1
  9. package/build/lib/commands/alert.js +1 -1
  10. package/build/lib/commands/alert.js.map +1 -1
  11. package/build/lib/commands/app-management.js +1 -1
  12. package/build/lib/commands/app-management.js.map +1 -1
  13. package/build/lib/commands/context.js +1 -1
  14. package/build/lib/commands/context.js.map +1 -1
  15. package/build/lib/commands/coverage.js +1 -1
  16. package/build/lib/commands/coverage.js.map +1 -1
  17. package/build/lib/commands/element.js +1 -1
  18. package/build/lib/commands/element.js.map +1 -1
  19. package/build/lib/commands/emu-console.js +1 -1
  20. package/build/lib/commands/emu-console.js.map +1 -1
  21. package/build/lib/commands/execute.js +1 -1
  22. package/build/lib/commands/execute.js.map +1 -1
  23. package/build/lib/commands/file-actions.js +1 -1
  24. package/build/lib/commands/file-actions.js.map +1 -1
  25. package/build/lib/commands/find.js +1 -1
  26. package/build/lib/commands/find.js.map +1 -1
  27. package/build/lib/commands/general.js +1 -1
  28. package/build/lib/commands/general.js.map +1 -1
  29. package/build/lib/commands/ime.js +1 -1
  30. package/build/lib/commands/ime.js.map +1 -1
  31. package/build/lib/commands/index.js +1 -1
  32. package/build/lib/commands/index.js.map +1 -1
  33. package/build/lib/commands/intent.js +1 -1
  34. package/build/lib/commands/intent.js.map +1 -1
  35. package/build/lib/commands/log.js +1 -1
  36. package/build/lib/commands/log.js.map +1 -1
  37. package/build/lib/commands/media-projection.js +1 -1
  38. package/build/lib/commands/media-projection.js.map +1 -1
  39. package/build/lib/commands/network.js +1 -1
  40. package/build/lib/commands/network.js.map +1 -1
  41. package/build/lib/commands/performance.js +1 -1
  42. package/build/lib/commands/performance.js.map +1 -1
  43. package/build/lib/commands/permissions.js +1 -1
  44. package/build/lib/commands/permissions.js.map +1 -1
  45. package/build/lib/commands/recordscreen.js +1 -1
  46. package/build/lib/commands/recordscreen.js.map +1 -1
  47. package/build/lib/commands/shell.js +1 -1
  48. package/build/lib/commands/shell.js.map +1 -1
  49. package/build/lib/commands/streamscreen.js +1 -1
  50. package/build/lib/commands/streamscreen.js.map +1 -1
  51. package/build/lib/commands/system-bars.js +1 -1
  52. package/build/lib/commands/system-bars.js.map +1 -1
  53. package/build/lib/commands/touch.js +1 -1
  54. package/build/lib/commands/touch.js.map +1 -1
  55. package/build/lib/desired-caps.js +1 -1
  56. package/build/lib/desired-caps.js.map +1 -1
  57. package/build/lib/driver.js +1 -1
  58. package/build/lib/driver.js.map +1 -1
  59. package/build/lib/logger.js +1 -1
  60. package/build/lib/logger.js.map +1 -1
  61. package/build/lib/method-map.js +1 -1
  62. package/build/lib/method-map.js.map +1 -1
  63. package/build/lib/uiautomator.js +1 -1
  64. package/build/lib/uiautomator.js.map +1 -1
  65. package/build/lib/unlock-helpers.js +1 -1
  66. package/build/lib/unlock-helpers.js.map +1 -1
  67. package/build/lib/utils.js +1 -1
  68. package/build/lib/utils.js.map +1 -1
  69. package/build/lib/webview-helpers.js +1 -1
  70. package/build/lib/webview-helpers.js.map +1 -1
  71. package/lib/android-helpers.js +12 -8
  72. package/lib/commands/performance.js +17 -0
  73. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","names":["commands","helpers","extensions","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign"],"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;\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\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 await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\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 await this.adb.broadcastAirplaneMode(flightMode);\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":";;;;;;;;AAAA;AACA;AACA;AAEA,IAAIA,QAAQ,GAAG,CAAC,CAAC;EAAEC,OAAO,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAAC;AAAA;AAEjD,MAAMC,kBAAkB,GAAG,KAAK;AAChC,MAAMC,SAAS,GAAG,KAAK;AACvB,MAAMC,SAAS,GAAG,KAAK;AAMvB,MAAMC,WAAW,GAAGC,MAAM,CAACC,SAAS;AAEpCR,QAAQ,CAACS,oBAAoB,GAAG,eAAeA,oBAAoB,GAAI;EACrE,IAAI,CAACC,GAAG,CAACC,IAAI,CAAC,4BAA4B,CAAC;EAC3C,IAAIC,cAAc,GAAG,MAAM,IAAI,CAACC,GAAG,CAACC,gBAAgB,EAAE;EACtD,IAAIC,UAAU,GAAGH,cAAc,GAAGT,kBAAkB,GAAG,CAAC;EAGxD,IAAI,CAACS,cAAc,EAAE;IACnB,IAAII,MAAM,GAAG,MAAM,IAAI,CAACC,QAAQ,EAAE;IAClCF,UAAU,IAAKC,MAAM,GAAGZ,SAAS,GAAG,CAAE;IACtC,IAAIc,MAAM,GAAG,MAAM,IAAI,CAACL,GAAG,CAACM,QAAQ,EAAE;IACtCJ,UAAU,IAAKG,MAAM,GAAGb,SAAS,GAAG,CAAE;EACxC;EAEA,OAAOU,UAAU;AACnB,CAAC;AAKDf,QAAQ,CAACiB,QAAQ,GAAG,eAAeA,QAAQ,GAAI;EAC7C,OAAO,MAAM,IAAI,CAACJ,GAAG,CAACI,QAAQ,EAAE;AAClC,CAAC;AAEDjB,QAAQ,CAACoB,oBAAoB,GAAG,eAAeA,oBAAoB,CAAEC,IAAI,EAAE;EACzE,IAAI,CAACX,GAAG,CAACC,IAAI,CAAC,4BAA4B,CAAC;EAE3C,MAAMW,wBAAwB,GAAG,CAACD,IAAI,GAAGlB,kBAAkB,MAAM,CAAC;EAClE,MAAMoB,gBAAgB,GAAG,CAACF,IAAI,GAAGjB,SAAS,MAAM,CAAC;EACjD,MAAMoB,0BAA0B,GAAG,CAACH,IAAI,GAAGhB,SAAS,MAAM,CAAC;EAE3D,MAAMoB,YAAY,GAAG,MAAM,IAAI,CAAChB,oBAAoB,EAAE;EACtD,MAAMiB,qBAAqB,GAAG,CAACD,YAAY,GAAGtB,kBAAkB,MAAM,CAAC;EACvE,MAAMwB,aAAa,GAAG,CAACF,YAAY,GAAGrB,SAAS,MAAM,CAAC;EACtD,MAAMwB,aAAa,GAAG,CAACH,YAAY,GAAGpB,SAAS,MAAM,CAAC;EAEtD,IAAIiB,wBAAwB,KAAKI,qBAAqB,EAAE;IACtD,MAAM,IAAI,CAACG,uBAAuB,CAAC,YAAY;MAC7C,MAAM,IAAI,CAAChB,GAAG,CAACiB,eAAe,CAACR,wBAAwB,CAAC;IAC1D,CAAC,CAAC;IACF,MAAM,IAAI,CAACO,uBAAuB,CAAC,YAAY;MAC7C,MAAM,IAAI,CAAChB,GAAG,CAACkB,qBAAqB,CAACT,wBAAwB,CAAC;IAChE,CAAC,CAAC;EACJ,CAAC,MAAM;IACL,IAAI,CAACZ,GAAG,CAACC,IAAI,CAAE,kDAAiD,GACtD,GAAEW,wBAAwB,GAAG,SAAS,GAAG,UAAW,EAAC,CAAC;EAClE;EAEA,IAAIC,gBAAgB,KAAKI,aAAa,IAAIH,0BAA0B,KAAKI,aAAa,EAAE;IACtF,IAAI,CAAClB,GAAG,CAACC,IAAI,CAAC,0FAA0F,CAAC;IACzG,IAAI,MAAM,IAAI,CAACE,GAAG,CAACC,gBAAgB,EAAE,EAAE;MACrC,OAAOX,kBAAkB,GAAGsB,YAAY;IAC1C;IACA,OAAO,CAACtB,kBAAkB,GAAGsB,YAAY;EAC3C;EAEA,MAAM,IAAI,CAACI,uBAAuB,CAAC,YAAY;IAC7C,IAAIN,gBAAgB,KAAKI,aAAa,EAAE;MACtC,MAAM,IAAI,CAACK,YAAY,CAACT,gBAAgB,CAAC;IAC3C,CAAC,MAAM;MACL,IAAI,CAACb,GAAG,CAACC,IAAI,CAAE,gDAA+C,GAC3D,GAAEY,gBAAgB,GAAG,SAAS,GAAG,UAAW,EAAC,CAAC;IACnD;IAEA,IAAID,wBAAwB,EAAE;MAC5B,IAAI,CAACZ,GAAG,CAACC,IAAI,CAAC,sEAAsE,CAAC;IACvF,CAAC,MAAM,IAAIa,0BAA0B,KAAKI,aAAa,EAAE;MACvD,IAAI,CAAClB,GAAG,CAACC,IAAI,CAAE,0DAAyD,GACrE,GAAEa,0BAA0B,GAAG,SAAS,GAAG,UAAW,EAAC,CAAC;IAC7D,CAAC,MAAM;MACL,MAAM,IAAI,CAACX,GAAG,CAACoB,YAAY,CAACT,0BAA0B,EAAE,IAAI,CAACU,UAAU,EAAE,CAAC;IAC5E;EACF,CAAC,CAAC;EAEF,OAAO,MAAM,IAAI,CAACzB,oBAAoB,EAAE;AAC1C,CAAC;AAKDT,QAAQ,CAACgC,YAAY,GAAG,eAAeA,YAAY,CAAEG,IAAI,EAAE;EACzD,MAAM,IAAI,CAACtB,GAAG,CAACmB,YAAY,CAACG,IAAI,EAAE,IAAI,CAACD,UAAU,EAAE,CAAC;AACtD,CAAC;AAEDlC,QAAQ,CAACoC,UAAU,GAAG,eAAeA,UAAU,GAAI;EACjD,IAAIC,IAAI,GAAG,EAAE,MAAM,IAAI,CAACxB,GAAG,CAACM,QAAQ,EAAE,CAAC;EACvC,IAAI,CAACT,GAAG,CAACC,IAAI,CAAE,wBAAuB0B,IAAI,GAAG,IAAI,GAAG,KAAM,EAAC,CAAC;EAC5D,MAAM,IAAI,CAACR,uBAAuB,CAAC,YAAY;IAC7C,MAAM,IAAI,CAAChB,GAAG,CAACyB,cAAc,CAAC;MAACD;IAAI,CAAC,EAAE,IAAI,CAACH,UAAU,EAAE,CAAC;EAC1D,CAAC,CAAC;AACJ,CAAC;AAEDlC,QAAQ,CAACuC,UAAU,GAAG,eAAeA,UAAU,GAAI;EACjD,IAAIJ,IAAI,GAAG,EAAE,MAAM,IAAI,CAACtB,GAAG,CAACI,QAAQ,EAAE,CAAC;EACvC,IAAI,CAACP,GAAG,CAACC,IAAI,CAAE,gBAAewB,IAAI,GAAG,IAAI,GAAG,KAAM,EAAC,CAAC;EACpD,MAAM,IAAI,CAACN,uBAAuB,CAAC,YAAY;IAC7C,MAAM,IAAI,CAAChB,GAAG,CAACyB,cAAc,CAAC;MAACH;IAAI,CAAC,EAAE,IAAI,CAACD,UAAU,EAAE,CAAC;EAC1D,CAAC,CAAC;AACJ,CAAC;AAEDlC,QAAQ,CAACwC,gBAAgB,GAAG,eAAeA,gBAAgB,GAAI;EAK7D,IAAIC,UAAU,GAAG,EAAE,MAAM,IAAI,CAAC5B,GAAG,CAACC,gBAAgB,EAAE,CAAC;EACrD,IAAI,CAACJ,GAAG,CAACC,IAAI,CAAE,uBAAsB8B,UAAU,GAAG,IAAI,GAAG,KAAM,EAAC,CAAC;EACjE,MAAM,IAAI,CAACZ,uBAAuB,CAAC,YAAY;IAC7C,MAAM,IAAI,CAAChB,GAAG,CAACiB,eAAe,CAACW,UAAU,CAAC;EAC5C,CAAC,CAAC;EACF,MAAM,IAAI,CAACZ,uBAAuB,CAAC,YAAY;IAC7C,MAAM,IAAI,CAAChB,GAAG,CAACkB,qBAAqB,CAACU,UAAU,CAAC;EAClD,CAAC,CAAC;AACJ,CAAC;AAEDzC,QAAQ,CAAC0C,cAAc,GAAG,eAAeA,cAAc,CAAEC,QAAQ,EAAE;EACjE,MAAM,IAAI,CAAC9B,GAAG,CAAC6B,cAAc,CAACC,QAAQ,EAAE,IAAI,CAACT,UAAU,EAAE,CAAC;EAC1D,IAAI;IACF,OAAO,MAAM,IAAI,CAACU,cAAc,EAAE;EACpC,CAAC,CAAC,OAAOC,CAAC,EAAE;IACV,IAAI,CAACnC,GAAG,CAACoC,IAAI,CAAE,+CAA8CD,CAAC,CAACE,OAAQ,EAAC,CAAC;IACzE,IAAI,CAACrC,GAAG,CAACoC,IAAI,CAAE,sCAAqC,CAAC;IACrD,OAAO;MACLE,QAAQ,EAAE1C,WAAW;MACrB2C,SAAS,EAAE3C,WAAW;MACtB4C,QAAQ,EAAE5C;IACZ,CAAC;EACH;AACF,CAAC;AAkBDN,QAAQ,CAACmD,qBAAqB,GAAG,eAAeA,qBAAqB,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChF,MAAM;IAAEC;EAAU,CAAC,GAAGD,IAAI;EAC1B,MAAM,IAAI,CAACvC,GAAG,CAACyC,uBAAuB,CAACD,SAAS,CAAC;AACnD,CAAC;AAEDrD,QAAQ,CAAC4C,cAAc,GAAG,eAAeA,cAAc,GAAI;EACzD,MAAM;IAACI,QAAQ;IAAEC,SAAS;IAAEC;EAAQ,CAAC,GAAG,MAAM,IAAI,CAACrC,GAAG,CAAC+B,cAAc,EAAE;EACvE,OAAO;IACLI,QAAQ,EAAEO,UAAU,CAACP,QAAQ,CAAC,IAAI1C,WAAW;IAC7C2C,SAAS,EAAEM,UAAU,CAACN,SAAS,CAAC,IAAI3C,WAAW;IAC/C4C,QAAQ,EAAEK,UAAU,CAACL,QAAQ,CAAC,IAAI5C;EACpC,CAAC;AACH,CAAC;AAGD,MAAMkD,OAAO,GAAG;EACdC,EAAE,EAAE,EAAE;EACNC,IAAI,EAAE,EAAE;EACRC,KAAK,EAAE,EAAE;EACTC,MAAM,EAAE;AACV,CAAC;AACD5D,QAAQ,CAAC6D,sBAAsB,GAAG,eAAeA,sBAAsB,GAAI;EACzE,IAAI,CAACnD,GAAG,CAACC,IAAI,CAAC,4BAA4B,CAAC;EAC3C,IAAImD,GAAG,GAAG,MAAM,IAAI,CAACjD,GAAG,CAACkD,WAAW,EAAE;EACtC,IAAI,IAAI,CAAC7B,UAAU,EAAE,EAAE;IACrB,IAAI8B,SAAS,GAAG,MAAM,IAAI,CAACnD,GAAG,CAACoD,oBAAoB,EAAE;IACrD,IAAIC,YAAY,GAAGF,SAAS,CAACG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,IAAI,CAACtD,GAAG,CAACuD,yBAAyB,CAAC,CAACF,YAAY,CAAC;IACvD;EACF;EAEA,IAAIJ,GAAG,GAAG,EAAE,EAAE;IACZ,IAAIO,GAAG,GAAG,CAACb,OAAO,CAACC,EAAE,EAAED,OAAO,CAACC,EAAE,CAAC;IAClC,IAAIK,GAAG,KAAK,EAAE,EAAE;MAEdO,GAAG,CAACC,IAAI,CAACd,OAAO,CAACE,IAAI,CAAC;IACxB,CAAC,MAAM,IAAII,GAAG,GAAG,EAAE,EAAE;MAEnBO,GAAG,GAAG,CAACb,OAAO,CAACG,KAAK,EAAEH,OAAO,CAACG,KAAK,EAAEH,OAAO,CAACC,EAAE,CAAC;MAMhD,MAAM,IAAI,CAAC5C,GAAG,CAAC0D,QAAQ,CAACf,OAAO,CAACC,EAAE,CAAC;IACrC,CAAC,MAAM,IAAIK,GAAG,IAAI,EAAE,EAAE;MAGpBO,GAAG,GAAG,CAACb,OAAO,CAACG,KAAK,CAAC;MACrB,MAAM,IAAI,CAAC9C,GAAG,CAAC0D,QAAQ,CAACf,OAAO,CAACC,EAAE,CAAC;IACrC;IACA,MAAM,IAAI,CAACe,aAAa,CAAC,0BAA0B,EAAEH,GAAG,CAAC;EAC3D,CAAC,MAAM;IAEL,MAAM,IAAII,cAAM,CAACC,sBAAsB,EAAE;EAC3C;AACF,CAAC;AAEDzE,OAAO,CAACuE,aAAa,GAAG,eAAeA,aAAa,CAAEG,OAAO,EAAEC,SAAS,EAAE;EAQxE,IAAIC,eAAC,CAACC,MAAM,CAACF,SAAS,CAAC,EAAE;IACvBA,SAAS,GAAG,CAACpB,OAAO,CAACC,EAAE,EAAED,OAAO,CAACC,EAAE,EAAED,OAAO,CAACE,IAAI,CAAC;EACpD;EAEA,MAAM,IAAI,CAACqB,oBAAoB,CAACJ,OAAO,CAAC;EAExC,KAAK,IAAIK,GAAG,IAAIJ,SAAS,EAAE;IACzB,MAAM,IAAI,CAACK,KAAK,CAACD,GAAG,CAAC;EACvB;EAEA,IAAI;IAACE,UAAU;IAAEC;EAAW,CAAC,GAAG,MAAM,IAAI,CAACtE,GAAG,CAACuE,4BAA4B,EAAE;EAM7E,MAAM,IAAI,CAACvD,uBAAuB,CAAC,YAAY;IAC7C,MAAM,IAAI,CAACoD,KAAK,CAACzB,OAAO,CAACI,MAAM,CAAC;EAClC,CAAC,CAAC;EAQF,IAAI;IACF,MAAM,IAAI,CAAC/C,GAAG,CAACwE,kBAAkB,CAACH,UAAU,EAAEC,WAAW,EAAE,IAAI,CAAC;IAChE,MAAM,IAAI,CAACF,KAAK,CAACzB,OAAO,CAACG,KAAK,CAAC;IAC/B,MAAM,IAAI,CAACsB,KAAK,CAACzB,OAAO,CAACI,MAAM,CAAC;IAChC,MAAM,IAAI,CAAC/C,GAAG,CAACwE,kBAAkB,CAACH,UAAU,EAAEC,WAAW,EAAE,IAAI,CAAC;EAClE,CAAC,CAAC,OAAOG,GAAG,EAAE,CAAC;EAEf,MAAM,IAAI,CAACzE,GAAG,CAAC0E,IAAI,EAAE;AACvB,CAAC;AAEDtF,OAAO,CAACgF,KAAK,GAAG,eAAeA,KAAK,CAAED,GAAG,EAAE;EAEzC,MAAMQ,iBAAC,CAACC,KAAK,CAAC,IAAI,CAAC;EACnB,MAAM,IAAI,CAAC5E,GAAG,CAAC0D,QAAQ,CAACS,GAAG,CAAC;AAC9B,CAAC;AAED/E,OAAO,CAAC4B,uBAAuB,GAAG,eAAeA,uBAAuB,CAAE6D,OAAO,EAAE;EACjF,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE;IACnB,OAAO,MAAMD,OAAO,EAAE;EACxB;EAEA,IAAI,CAACC,SAAS,CAACC,wBAAwB,GAAG,IAAI;EAC9C,IAAI;IACF,MAAMF,OAAO,EAAE;IACf,MAAM,IAAI,CAAC7E,GAAG,CAACgF,OAAO,EAAE;IACxB,MAAM,IAAI,CAACF,SAAS,CAACG,KAAK,CAAC,IAAI,CAAC1C,IAAI,CAAC8B,UAAU,EAAE,IAAI,CAAC9B,IAAI,CAAC2C,sBAAsB,EAAE,IAAI,CAAC3C,IAAI,CAAC4C,cAAc,CAAC;EAC9G,CAAC,SAAS;IACR,IAAI,CAACL,SAAS,CAACC,wBAAwB,GAAG,KAAK;EACjD;AACF,CAAC;AAEDK,MAAM,CAACC,MAAM,CAAChG,UAAU,EAAEF,QAAQ,EAAEC,OAAO,CAAC;AAAC,eAE9BC,UAAU;AAAA"}
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","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","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;\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\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 await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\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 await this.adb.broadcastAirplaneMode(flightMode);\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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"}
@@ -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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiTkVUV09SS19LRVlTIiwiQ1BVX0tFWVMiLCJCQVRURVJZX0tFWVMiLCJNRU1PUllfS0VZUyIsIlNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTIiwiT2JqZWN0IiwiZnJlZXplIiwiY3B1aW5mbyIsIm1lbW9yeWluZm8iLCJiYXR0ZXJ5aW5mbyIsIm5ldHdvcmtpbmZvIiwiTUVNSU5GT19USVRMRVMiLCJOQVRJVkUiLCJEQUxWSUsiLCJFR0wiLCJHTCIsIk1UUkFDSyIsIlRPVEFMIiwiSEVBUCIsIlJFVFJZX1BBVVNFX01TIiwicGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IiwiZW50cmllcyIsInZhbERpY3QiLCJ0eXBlIiwic3ViVHlwZSIsIm5hdGl2ZVBzcyIsIm5hdGl2ZVByaXZhdGVEaXJ0eSIsIm5hdGl2ZUhlYXBTaXplIiwibmF0aXZlSGVhcEFsbG9jYXRlZFNpemUiLCJkYWx2aWtQc3MiLCJkYWx2aWtQcml2YXRlRGlydHkiLCJlZ2xQc3MiLCJlZ2xQcml2YXRlRGlydHkiLCJnbFBzcyIsImdsUHJpdmF0ZURpcnR5IiwibGVuZ3RoIiwidG90YWxQc3MiLCJ0b3RhbFByaXZhdGVEaXJ0eSIsInBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkiLCJwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IiwibmF0aXZlUnNzIiwiZGFsdmlrUnNzIiwidG90YWxSc3MiLCJnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyIsIl8iLCJrZXlzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhIiwicGFja2FnZU5hbWUiLCJkYXRhVHlwZSIsInJldHJpZXMiLCJ0b0xvd2VyIiwiZ2V0QmF0dGVyeUluZm8iLCJnZXRDUFVJbmZvIiwiZ2V0TWVtb3J5SW5mbyIsImdldE5ldHdvcmtUcmFmZmljSW5mbyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsInJldHJ5SW50ZXJ2YWwiLCJvdXRwdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJzdGRlcnIiLCJsb2ciLCJpbmZvIiwidXNhZ2VzUGF0dGVybiIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hdGNoIiwiZXhlYyIsImRlYnVnIiwiY21kIiwiZGF0YSIsInBvd2VyIiwicGFyc2VJbnQiLCJzcGxpdCIsInRyaW0iLCJOdW1iZXIiLCJpc05hTiIsImNsb25lIiwidG9TdHJpbmciLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwibGluZSIsImZpbHRlciIsIkJvb2xlYW4iLCJoZWFkZXJzIiwidmFsdWVzIiwibWFwIiwiaGVhZGVyIiwicmV0dXJuVmFsdWUiLCJidWNrZXREdXJhdGlvbiIsImJ1Y2tldFN0YXJ0IiwiYWN0aXZlVGltZSIsInJ4Qnl0ZXMiLCJyeFBhY2tldHMiLCJ0eEJ5dGVzIiwidHhQYWNrZXRzIiwib3BlcmF0aW9ucyIsImluZGV4IiwiZnJvbVh0c3RhdHMiLCJpbmRleE9mIiwic3RhcnQiLCJkZWxpbWl0ZXIiLCJlbmQiLCJwZW5kaW5nQnl0ZXMiLCJzdWJzdHJpbmciLCJhcnJheUxpc3QiLCJqIiwiayIsInJldHVybkluZGV4IiwiaSIsImlzRXF1YWwiLCJpc1VuZGVmaW5lZCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IE5FVFdPUktfS0VZUyA9IFtcbiAgWydidWNrZXRTdGFydCcsICdhY3RpdmVUaW1lJywgJ3J4Qnl0ZXMnLCAncnhQYWNrZXRzJywgJ3R4Qnl0ZXMnLCAndHhQYWNrZXRzJywgJ29wZXJhdGlvbnMnLCAnYnVja2V0RHVyYXRpb24nXSxcbiAgWydzdCcsICdhY3RpdmVUaW1lJywgJ3JiJywgJ3JwJywgJ3RiJywgJ3RwJywgJ29wJywgJ2J1Y2tldER1cmF0aW9uJ11cbl07XG5jb25zdCBDUFVfS0VZUyA9IFsndXNlcicsICdrZXJuZWwnXTtcbmNvbnN0IEJBVFRFUllfS0VZUyA9IFsncG93ZXInXTtcbmNvbnN0IE1FTU9SWV9LRVlTID0gW1xuICAndG90YWxQcml2YXRlRGlydHknLCAnbmF0aXZlUHJpdmF0ZURpcnR5JywgJ2RhbHZpa1ByaXZhdGVEaXJ0eScsXG4gICdlZ2xQcml2YXRlRGlydHknLCAnZ2xQcml2YXRlRGlydHknLFxuICAndG90YWxQc3MnLCAnbmF0aXZlUHNzJywgJ2RhbHZpa1BzcycsICdlZ2xQc3MnLCAnZ2xQc3MnLFxuICAnbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUnLCAnbmF0aXZlSGVhcFNpemUnLFxuICAnbmF0aXZlUnNzJywgJ2RhbHZpa1JzcycsICd0b3RhbFJzcydcbl07XG5jb25zdCBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyA9IE9iamVjdC5mcmVlemUoe1xuICBjcHVpbmZvOiAndGhlIGFtb3VudCBvZiBjcHUgYnkgdXNlciBhbmQga2VybmVsIHByb2Nlc3MgLSBjcHUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBtZW1vcnlpbmZvOiAndGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcHJvY2VzcyAtIG1lbW9yeSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIGJhdHRlcnlpbmZvOiAndGhlIHJlbWFpbmluZyBiYXR0ZXJ5IHBvd2VyIC0gYmF0dGVyeSBwb3dlciBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIG5ldHdvcmtpbmZvOiAndGhlIG5ldHdvcmsgc3RhdGlzdGljcyAtIG5ldHdvcmsgcngvdHggaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnXG59KTtcbmNvbnN0IE1FTUlORk9fVElUTEVTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5BVElWRTogJ05hdGl2ZScsXG4gIERBTFZJSzogJ0RhbHZpaycsXG4gIEVHTDogJ0VHTCcsXG4gIEdMOiAnR0wnLFxuICBNVFJBQ0s6ICdtdHJhY2snLFxuICBUT1RBTDogJ1RPVEFMJyxcbiAgSEVBUDogJ0hlYXAnXG59KTtcbmNvbnN0IFJFVFJZX1BBVVNFX01TID0gMTAwMDtcblxuLyoqXG4gKiBBUEkgbGV2ZWwgYmV0d2VlbiAxOCBhbmQgMzBcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxoZWFwIHNpemU+LCA8aGVhcCBhbGxvYz4sIDxoZWFwIGZyZWU+XVxuICogZXhjZXB0ICdUT1RBTCcsIHdoaWNoIHNraXBzIHRoZSBzZWNvbmQgdHlwZSBuYW1lXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSyAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5IRUFQKSB7XG4gICAgWywsIHZhbERpY3QuZGFsdmlrUHNzLCB2YWxEaWN0LmRhbHZpa1ByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkVHTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5lZ2xQc3MsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZ2xQc3MsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gOCkge1xuICAgIC8vIHRoZXJlIGFyZSB0d28gdG90YWxzLCBhbmQgd2Ugb25seSB3YW50IHRoZSBmdWxsIGxpc3RpbmcsIHdoaWNoIGhhcyA4IGVudHJpZXNcbiAgICBbLCB2YWxEaWN0LnRvdGFsUHNzLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBbJzxTeXN0ZW0gVHlwZScsICc8cHBzPicsICc8c2hhcmVkIGRpcnR5PicsICc8cHJpdmF0ZSBkaXJ0eT4nLCAnPGhlYXAgc2l6ZT4nLCAnPGhlYXAgYWxsb2M+JywgJzxoZWFwIGZyZWU+J11cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IHR5cGUgPSBlbnRyaWVzWzBdO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFKSB7XG4gICAgWywgdmFsRGljdC5uYXRpdmVQc3MsLCB2YWxEaWN0Lm5hdGl2ZVByaXZhdGVEaXJ0eSwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSykge1xuICAgIFssIHZhbERpY3QuZGFsdmlrUHNzLCwgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wpIHtcbiAgICBbLCB2YWxEaWN0LmVnbFBzcywsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wpIHtcbiAgICBbLCB2YWxEaWN0LmdsUHNzLCwgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMKSB7XG4gICAgWywgdmFsRGljdC50b3RhbFBzcywsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfVxufVxuXG4vKipcbiAqIEFQSSBsZXZlbCAzMCBhbmQgYWJvdmVcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxyc3MgdG90YWw+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVSc3MsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHksLCwgdmFsRGljdC5kYWx2aWtSc3NdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDkpIHtcbiAgICAvLyBoYXMgOSBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eSwsLCB2YWxEaWN0LnRvdGFsUnNzXSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLy9cbi8vIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgdGhlIHN5c3RlbSBzdGF0ZSB3aGljaCBpcyBzdXBwb3J0ZWQgdG8gcmVhZCBhcyBsaWtlIGNwdSwgbWVtb3J5LCBuZXR3b3JrIHRyYWZmaWMsIGFuZCBiYXR0ZXJ5LlxuLy8gb3V0cHV0IC0gYXJyYXkgbGlrZSBiZWxvd1xuLy8gW2NwdWluZm8sIGJhdHRlcnlpbmZvLCBuZXR3b3JraW5mbywgbWVtb3J5aW5mb11cbi8vXG5jb21tYW5kcy5nZXRQZXJmb3JtYW5jZURhdGFUeXBlcyA9IGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YVR5cGVzICgpIHtcbiAgcmV0dXJuIF8ua2V5cyhTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbiAqIGlucHV0IC0gKHBhY2thZ2VOYW1lKSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICogICAgICAgIChkYXRhVHlwZSkgdGhlIHR5cGUgb2Ygc3lzdGVtIHN0YXRlIHdoaWNoIHdhbnRzIHRvIHJlYWQuIEl0IHNob3VsZCBiZSBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTXG4gKiAgICAgICAgKGRhdGFSZWFkVGltZW91dCkgdGhlIG51bWJlciBvZiBhdHRlbXB0cyB0byByZWFkXG4gKiBvdXRwdXQgLSB0YWJsZSBvZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSwgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRhYmxlIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZGF0YS4gVGhlIHJlbWFpbmluZyBsaW5lcyByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiB0aGUgZGF0YS5cbiAqXG4gKiBpbiBjYXNlIG9mIGJhdHRlcnkgaW5mbyA6IFtbcG93ZXJdLCBbMjNdXVxuICogaW4gY2FzZSBvZiBtZW1vcnkgaW5mbyA6ICBbW3RvdGFsUHJpdmF0ZURpcnR5LCBuYXRpdmVQcml2YXRlRGlydHksIGRhbHZpa1ByaXZhdGVEaXJ0eSwgZWdsUHJpdmF0ZURpcnR5LCBnbFByaXZhdGVEaXJ0eSwgdG90YWxQc3MsXG4gKiAgIG5hdGl2ZVBzcywgZGFsdmlrUHNzLCBlZ2xQc3MsIGdsUHNzLCBuYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZSwgbmF0aXZlSGVhcFNpemVdLCBbMTgzNjAsIDgyOTYsIDYxMzIsIG51bGwsIG51bGwsIDQyNTg4LCA4NDA2LCA3MDI0LCBudWxsLCBudWxsLCAyNjUxOSwgMTAzNDRdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb24sXSxcbiAqICAgWzE0NzgwOTE2MDAwMDAsIG51bGwsIDEwOTkwNzUsIDYxMDk0NywgOTI4LCAxMTQzNjIsIDc2OSwgMCwgMzYwMDAwMF0sIFsxNDc4MDk1MjAwMDAwLCBudWxsLCAxMzA2MzAwLCA0MDU5OTcsIDUwOSwgNDYzNTksIDM3MCwgMCwgMzYwMDAwMF1dXG4gKiBpbiBjYXNlIG9mIG5ldHdvcmsgaW5mbyA6IFtbc3QsIGFjdGl2ZVRpbWUsIHJiLCBycCwgdGIsIHRwLCBvcCwgYnVja2V0RHVyYXRpb25dLCBbMTQ3ODA4ODAwMCwgbnVsbCwgbnVsbCwgMzIxMTUyOTYsIDM0MjkxLCAyOTU2ODA1LCAyNTcwNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDkxNjAwLCBudWxsLCBudWxsLCAyNzE0NjgzLCAxMTgyMSwgMTQyMDU2NCwgMTI2NTAsIDAsIDM2MDBdLCBbMTQ3ODA5NTIwMCwgbnVsbCwgbnVsbCwgMTAwNzkyMTMsIDE5OTYyLCAyNDg3NzA1LCAyMDAxNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDk4ODAwLCBudWxsLCBudWxsLCA0NDQ0NDMzLCAxMDIyNywgMTQzMDM1NiwgMTA0OTMsIDAsIDM2MDBdXVxuICogaW4gY2FzZSBvZiBjcHUgaW5mbyA6IFtbdXNlciwga2VybmVsXSwgWzAuOSwgMS4zXV1cbiAqL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGVyZm9ybWFuY2VEYXRhIChwYWNrYWdlTmFtZSwgZGF0YVR5cGUsIHJldHJpZXMgPSAyKSB7XG4gIHN3aXRjaCAoXy50b0xvd2VyKGRhdGFUeXBlKSkge1xuICAgIGNhc2UgJ2JhdHRlcnlpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEJhdHRlcnlJbmZvKHJldHJpZXMpO1xuICAgIGNhc2UgJ2NwdWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Q1BVSW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbWVtb3J5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRNZW1vcnlJbmZvKHBhY2thZ2VOYW1lLCByZXRyaWVzKTtcbiAgICBjYXNlICduZXR3b3JraW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROZXR3b3JrVHJhZmZpY0luZm8ocmV0cmllcyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGVyZm9ybWFuY2UgZGF0YSBvZiB0eXBlICcke2RhdGFUeXBlfScgZm91bmQuIGAgK1xuICAgICAgICBgT25seSB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkOiAke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTLCAnICcsIDIpfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDO0FBQUE7QUFFbkQsTUFBTUMsWUFBWSxHQUFHLENBQ25CLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLEVBQzdHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQ3JFO0FBQUM7QUFDRixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0FBQUM7QUFDcEMsTUFBTUMsWUFBWSxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQUM7QUFDL0IsTUFBTUMsV0FBVyxHQUFHLENBQ2xCLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUMvRCxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFDbkMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFD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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":["commands","helpers","extensions","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"],"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\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIkFMTF9QRVJNSVNTSU9OU19NQUdJQyIsIlBNX0FDVElPTiIsIk9iamVjdCIsImZyZWV6ZSIsIkdSQU5UIiwiUkVWT0tFIiwiQVBQT1BTX0FDVElPTiIsIkFMTE9XIiwiREVOWSIsIklHTk9SRSIsIkRFRkFVTFQiLCJQRVJNSVNTSU9OX1RBUkdFVCIsIlBNIiwiQVBQT1BTIiwiUEVSTUlTU0lPTlNfVFlQRSIsIkRFTklFRCIsIkdSQU5URUQiLCJSRVFVRVNURUQiLCJjaGFuZ2VQZXJtaXNzaW9uc1ZpYVBtIiwicGVybWlzc2lvbnMiLCJhcHBQYWNrYWdlIiwiYWN0aW9uIiwiXyIsInZhbHVlcyIsImluY2x1ZGVzIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiYWZmZWN0ZWRQZXJtaXNzaW9ucyIsImlzQXJyYXkiLCJ0b0xvd2VyIiwiZHVtcHN5cyIsImFkYiIsInNoZWxsIiwiZ3JhbnRlZFBlcm1pc3Npb25zIiwiZ2V0R3JhbnRlZFBlcm1pc3Npb25zIiwicmVxUGVybWlzc29ucyIsImdldFJlcVBlcm1pc3Npb25zIiwiZGlmZmVyZW5jZSIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwiZ3JhbnRQZXJtaXNzaW9ucyIsIkIiLCJhbGwiLCJtYXAiLCJuYW1lIiwicmV2b2tlUGVybWlzc2lvbiIsImNoYW5nZVBlcm1pc3Npb25zVmlhQXBwb3BzIiwicHJvbWlzZXMiLCJwZXJtaXNzaW9uIiwibW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMiLCJvcHRzIiwidGFyZ2V0IiwiaXNOaWwiLCJiaW5kIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJBREJfU0hFTExfRkVBVFVSRSIsIm1vYmlsZUdldFBlcm1pc3Npb25zIiwidHlwZSIsImFjdGlvbkZ1bmMiLCJwa2ciLCJnZXREZW5pZWRQZXJtaXNzaW9ucyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJtaXNzaW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBBREJfU0hFTExfRkVBVFVSRSB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgQUxMX1BFUk1JU1NJT05TX01BR0lDID0gJ2FsbCc7XG5jb25zdCBQTV9BQ1RJT04gPSBPYmplY3QuZnJlZXplKHtcbiAgR1JBTlQ6ICdncmFudCcsXG4gIFJFVk9LRTogJ3Jldm9rZScsXG59KTtcbmNvbnN0IEFQUE9QU19BQ1RJT04gPSBPYmplY3QuZnJlZXplKHtcbiAgQUxMT1c6ICdhbGxvdycsXG4gIERFTlk6ICdkZW55JyxcbiAgSUdOT1JFOiAnaWdub3JlJyxcbiAgREVGQVVMVDogJ2RlZmF1bHQnLFxufSk7XG5jb25zdCBQRVJNSVNTSU9OX1RBUkdFVCA9IE9iamVjdC5mcmVlemUoe1xuICBQTTogJ3BtJyxcbiAgQVBQT1BTOiAnYXBwb3BzJyxcbn0pO1xuY29uc3QgUEVSTUlTU0lPTlNfVFlQRSA9IE9iamVjdC5mcmVlemUoe1xuICBERU5JRUQ6ICdkZW5pZWQnLFxuICBHUkFOVEVEOiAnZ3JhbnRlZCcsXG4gIFJFUVVFU1RFRDogJ3JlcXVlc3RlZCcsXG59KTtcblxuYXN5bmMgZnVuY3Rpb24gY2hhbmdlUGVybWlzc2lvbnNWaWFQbSAocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIGFjdGlvbikge1xuICBpZiAoIV8udmFsdWVzKFBNX0FDVElPTikuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUE1fQUNUSU9OKSl9IGFjdGlvbnMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG5cbiAgbGV0IGFmZmVjdGVkUGVybWlzc2lvbnMgPSBfLmlzQXJyYXkocGVybWlzc2lvbnMpID8gcGVybWlzc2lvbnMgOiBbcGVybWlzc2lvbnNdO1xuICBpZiAoXy50b0xvd2VyKHBlcm1pc3Npb25zKSA9PT0gQUxMX1BFUk1JU1NJT05TX01BR0lDKSB7XG4gICAgY29uc3QgZHVtcHN5cyA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgYXBwUGFja2FnZV0pO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuYWRiLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBkdW1wc3lzKTtcbiAgICBpZiAoYWN0aW9uID09PSBQTV9BQ1RJT04uR1JBTlQpIHtcbiAgICAgIGNvbnN0IHJlcVBlcm1pc3NvbnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBkdW1wc3lzKTtcbiAgICAgIGFmZmVjdGVkUGVybWlzc2lvbnMgPSBfLmRpZmZlcmVuY2UocmVxUGVybWlzc29ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IGdyYW50ZWRQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShhZmZlY3RlZFBlcm1pc3Npb25zKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwUGFja2FnZX0nIGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIHRvICR7YWN0aW9ufWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhY3Rpb24gPT09IFBNX0FDVElPTi5HUkFOVCkge1xuICAgIGF3YWl0IHRoaXMuYWRiLmdyYW50UGVybWlzc2lvbnMoYXBwUGFja2FnZSwgYWZmZWN0ZWRQZXJtaXNzaW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgQi5hbGwoYWZmZWN0ZWRQZXJtaXNzaW9ucy5tYXAoKG5hbWUpID0+IHRoaXMuYWRiLnJldm9rZVBlcm1pc3Npb24oYXBwUGFja2FnZSwgbmFtZSkpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGFuZ2VQZXJtaXNzaW9uc1ZpYUFwcG9wcyAocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIGFjdGlvbikge1xuICBpZiAoIV8udmFsdWVzKEFQUE9QU19BQ1RJT04pLmluY2x1ZGVzKGFjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBVbmtub3duIGFjdGlvbiAnJHthY3Rpb259Jy4gYCArXG4gICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KF8udmFsdWVzKEFQUE9QU19BQ1RJT04pKX0gYWN0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihwZXJtaXNzaW9ucykgPT09IEFMTF9QRVJNSVNTSU9OU19NQUdJQykge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke0FMTF9QRVJNSVNTSU9OU19NQUdJQ30nIHBlcm1pc3Npb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIGAgK1xuICAgICAgYCcke1BFUk1JU1NJT05fVEFSR0VULlBNfScgdGFyZ2V0LiBgICtcbiAgICAgIGBDaGVjayBBcHBPcHNNYW5hZ2VyLmphdmEgZnJvbSBBbmRyb2lkIHBsYXRmb3JtIHNvdXJjZXMgdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIEFwcE9wcyBwZXJtaXNzaW9uc2ApO1xuICB9XG5cbiAgY29uc3QgcHJvbWlzZXMgPSAoXy5pc0FycmF5KHBlcm1pc3Npb25zKSA/IHBlcm1pc3Npb25zIDogW3Blcm1pc3Npb25zXSlcbiAgICAubWFwKChwZXJtaXNzaW9uKSA9PiB0aGlzLmFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBhcHBQYWNrYWdlLCBwZXJtaXNzaW9uLCBhY3Rpb25dKSk7XG4gIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ3xBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9uc1xuICogSWYgYHRhcmdldGAgaXMgc2V0IHRvICdwbSc6XG4gKiAgIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgY2hhbmdlZFxuICogb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zLiBDaGVjayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9NYW5pZmVzdC5wZXJtaXNzaW9uXG4gKiB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdGFuZGFyZCBBbmRyb2lkIHBlcm1zc2lvbiBuYW1lcy4gTWFuZGF0b3J5IGFyZ3VtZW50LlxuICogSWYgJ2FsbCcgbWFnaWMgc3RyaW5nIGlzIHBhc3NlZCB0aGVuIHRoZSBjaG9zZW4gYWN0aW9uIGlzIGdvaW5nIHRvIGJlIGFwcGxpZWQgdG8gYWxsXG4gKiBwZXJtaXNpc29ucyByZXF1ZXN0ZWQvZ3JhbnRlZCBieSAnYXBwUGFja2FnZScuXG4gKiBJZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ2FwcG9wcyc6XG4gKiAgIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGFwcG9wcyBwZXJtaXNzaW9uIHRvIGJlIGNoYW5nZWRcbiAqIG9yIGEgbGlzdCBvZiBwZXJtaXNzaW9ucy4gQ2hlY2sgQXBwT3BzTWFuYWdlci5qYXZhIHNvdXJjZXMgdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2ZcbiAqIHN1cHBvcnRlZCBhcHBvcHMgcGVybWlzc2lvbiBuYW1lcyBmb3IgdGhlIGdpdmVuIEFuZHJvaWQgcGtsYXRmb3JtLlxuICogRXhhbXBsZXM6ICdBQ1RJVklUWV9SRUNPR05JVElPTicsICdTTVNfRklOQU5DSUFMX1RSQU5TQUNUSU9OUycsICdSRUFEX1NNUycsICdBQ0NFU1NfTk9USUZJQ0FUSU9OUycuXG4gKiBUaGUgJ2FsbCcgbWFnaWMgc3RyaW5nIGlzIHVuc3VwcG9ydGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFBhY2thZ2UgW3RoaXMub3B0cy5hcHBQYWNrYWdlXSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBbZ3JhbnR8YWxsb3ddIE9uZSBvZiBgUE1fQUNUSU9OYCB2YWx1ZXMgaWYgYHRhcmdldGAgaXMgc2V0IHRvICdwbScsXG4gKiBvdGhlcndpc2Ugb25lIG9mIGBBUFBPUFNfQUNUSU9OYCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgW3BtXSBFaXRoZXIgJ3BtJyBvciAnYXBwb3BzJy4gVGhlICdhcHBvcHMnIG9uZSByZXF1aXJlc1xuICogJ2FkYl9zaGVsbCcgc2VydmVyIHNlY3VyaXR5IG9wdGlvbiB0byBiZSBlbmFibGVkLlxuICovXG5cbi8qKlxuICogQ2hhbmdlcyBwYWNrYWdlIHBlcm1pc3Npb25zIGluIHJ1bnRpbWUuXG4gKlxuICogQHBhcmFtIHs/Q2hhbmdlUGVybWlzc2lvbnNPcHRpb25zfSBvcHRzIC0gQXZhaWxhYmxlIG9wdGlvbnMgbWFwcGluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNoYW5nZVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgcGVybWlzc2lvbnMsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGlvbiA9IF8udG9Mb3dlcihvcHRzLnRhcmdldCkgPT09IFBFUk1JU1NJT05fVEFSR0VULkFQUE9QUyA/IEFQUE9QU19BQ1RJT04uQUxMT1cgOiBQTV9BQ1RJT04uR1JBTlQsXG4gICAgdGFyZ2V0ID0gUEVSTUlTU0lPTl9UQVJHRVQuUE0sXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc05pbChwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IG11c3Qgbm90IGJlIGVtcHR5YCk7XG4gIH1cblxuICBzd2l0Y2ggKF8udG9Mb3dlcih0YXJnZXQpKSB7XG4gICAgY2FzZSBQRVJNSVNTSU9OX1RBUkdFVC5QTTpcbiAgICAgIHJldHVybiBhd2FpdCBjaGFuZ2VQZXJtaXNzaW9uc1ZpYVBtLmJpbmQodGhpcykocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIF8udG9Mb3dlcihhY3Rpb24pKTtcbiAgICBjYXNlIFBFUk1JU1NJT05fVEFSR0VULkFQUE9QUzpcbiAgICAgIHRoaXMuZW5zdXJlRmVhdHVyZUVuYWJsZWQoQURCX1NIRUxMX0ZFQVRVUkUpO1xuICAgICAgcmV0dXJuIGF3YWl0IGNoYW5nZVBlcm1pc3Npb25zVmlhQXBwb3BzLmJpbmQodGhpcykocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIF8udG9Mb3dlcihhY3Rpb24pKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ3RhcmdldCcgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2Y6ICR7Xy52YWx1ZXMoUEVSTUlTU0lPTl9UQVJHRVQpfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgW3JlcXVlc3RlZF0gLSBPbmUgb2YgcG9zc2libGUgcGVybWlzc2lvbiB0eXBlcyB0byBnZXQuXG4gKiBDYW4gYmUgYW55IG9mIGBQRVJNSVNTSU9OU19UWVBFYCB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEdldHMgcnVudGltZSBwZXJtaXNzaW9ucyBsaXN0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0dldFBlcm1pc3Npb25zT3B0aW9uc30gb3B0cyAtIEF2YWlsYWJsZSBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHBlcm1pc3Npb25zIGZvciB0aGUgZ2l2ZW4gdHlwZVxuICogKGNhbiBhbHNvIGJlIGVtcHR5KS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyBwZXJtaXNzaW9ucy5cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlID0gUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICB9ID0gb3B0cztcblxuICBsZXQgYWN0aW9uRnVuYztcbiAgc3dpdGNoIChfLnRvTG93ZXIodHlwZSkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChwa2cpID0+IHRoaXMuYWRiLmdldFJlcVBlcm1pc3Npb25zKHBrZyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuR1JBTlRFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAocGtnKSA9PiB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMocGtnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5ERU5JRUQ6XG4gICAgICBhY3Rpb25GdW5jID0gKHBrZykgPT4gdGhpcy5hZGIuZ2V0RGVuaWVkUGVybWlzc2lvbnMocGtnKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBVbmtub3duIHBlcm1pc3Npb25zIHR5cGUgJyR7dHlwZX0nLiBgICtcbiAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OU19UWVBFKSl9IHR5cGVzIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgYWN0aW9uRnVuYyhhcHBQYWNrYWdlKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQztBQUVwQixNQUFNQyxxQkFBcUIsR0FBRyxLQUFLO0FBQ25DLE1BQU1DLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDOUJDLEtBQUssRUFBRSxPQUFPO0VBQ2RDLE1BQU0sRUFBRTtBQUNWLENBQUMsQ0FBQztBQUNGLE1BQU1DLGFBQWEsR0FBR0osTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDbENJLEtBQUssRUFBRSxPQUFPO0VBQ2RDLElBQUksRUFBRSxNQUFNO0VBQ1pDLE1BQU0sRUFBRSxRQUFRO0VBQ2hCQyxPQUFPLEVBQUU7QUFDWCxDQUFDLENBQUM7QUFDRixNQUFN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
116
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiX3V0aWxzIiwiY29tbWFuZHMiLCJleHBvcnRzIiwiQUxMX1BFUk1JU1NJT05TX01BR0lDIiwiUE1fQUNUSU9OIiwiT2JqZWN0IiwiZnJlZXplIiwiR1JBTlQiLCJSRVZPS0UiLCJBUFBPUFNfQUNUSU9OIiwiQUxMT1ciLCJERU5ZIiwiSUdOT1JFIiwiREVGQVVMVCIsIlBFUk1JU1NJT05fVEFSR0VUIiwiUE0iLCJBUFBPUFMiLCJQRVJNSVNTSU9OU19UWVBFIiwiREVOSUVEIiwiR1JBTlRFRCIsIlJFUVVFU1RFRCIsImNoYW5nZVBlcm1pc3Npb25zVmlhUG0iLCJwZXJtaXNzaW9ucyIsImFwcFBhY2thZ2UiLCJhY3Rpb24iLCJfIiwidmFsdWVzIiwiaW5jbHVkZXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJhZmZlY3RlZFBlcm1pc3Npb25zIiwiaXNBcnJheSIsInRvTG93ZXIiLCJkdW1wc3lzIiwiYWRiIiwic2hlbGwiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJyZXFQZXJtaXNzb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwiaXNFbXB0eSIsImxvZyIsImluZm8iLCJncmFudFBlcm1pc3Npb25zIiwiQiIsImFsbCIsIm1hcCIsIm5hbWUiLCJyZXZva2VQZXJtaXNzaW9uIiwiY2hhbmdlUGVybWlzc2lvbnNWaWFBcHBvcHMiLCJwcm9taXNlcyIsInBlcm1pc3Npb24iLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsIm9wdHMiLCJ0YXJnZXQiLCJpc05pbCIsImJpbmQiLCJlbnN1cmVGZWF0dXJlRW5hYmxlZCIsIkFEQl9TSEVMTF9GRUFUVVJFIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiYWN0aW9uRnVuYyIsInBrZyIsImdldERlbmllZFBlcm1pc3Npb25zIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3Blcm1pc3Npb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEFEQl9TSEVMTF9GRUFUVVJFIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBBTExfUEVSTUlTU0lPTlNfTUFHSUMgPSAnYWxsJztcbmNvbnN0IFBNX0FDVElPTiA9IE9iamVjdC5mcmVlemUoe1xuICBHUkFOVDogJ2dyYW50JyxcbiAgUkVWT0tFOiAncmV2b2tlJyxcbn0pO1xuY29uc3QgQVBQT1BTX0FDVElPTiA9IE9iamVjdC5mcmVlemUoe1xuICBBTExPVzogJ2FsbG93JyxcbiAgREVOWTogJ2RlbnknLFxuICBJR05PUkU6ICdpZ25vcmUnLFxuICBERUZBVUxUOiAnZGVmYXVsdCcsXG59KTtcbmNvbnN0IFBFUk1JU1NJT05fVEFSR0VUID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFBNOiAncG0nLFxuICBBUFBPUFM6ICdhcHBvcHMnLFxufSk7XG5jb25zdCBQRVJNSVNTSU9OU19UWVBFID0gT2JqZWN0LmZyZWV6ZSh7XG4gIERFTklFRDogJ2RlbmllZCcsXG4gIEdSQU5URUQ6ICdncmFudGVkJyxcbiAgUkVRVUVTVEVEOiAncmVxdWVzdGVkJyxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBjaGFuZ2VQZXJtaXNzaW9uc1ZpYVBtIChwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgYWN0aW9uKSB7XG4gIGlmICghXy52YWx1ZXMoUE1fQUNUSU9OKS5pbmNsdWRlcyhhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBhY3Rpb24gJyR7YWN0aW9ufScuIGAgK1xuICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQTV9BQ1RJT04pKX0gYWN0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBsZXQgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uaXNBcnJheShwZXJtaXNzaW9ucykgPyBwZXJtaXNzaW9ucyA6IFtwZXJtaXNzaW9uc107XG4gIGlmIChfLnRvTG93ZXIocGVybWlzc2lvbnMpID09PSBBTExfUEVSTUlTU0lPTlNfTUFHSUMpIHtcbiAgICBjb25zdCBkdW1wc3lzID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBhcHBQYWNrYWdlXSk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgIGlmIChhY3Rpb24gPT09IFBNX0FDVElPTi5HUkFOVCkge1xuICAgICAgY29uc3QgcmVxUGVybWlzc29ucyA9IGF3YWl0IHRoaXMuYWRiLmdldFJlcVBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uZGlmZmVyZW5jZShyZXFQZXJtaXNzb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZmZlY3RlZFBlcm1pc3Npb25zID0gZ3JhbnRlZFBlcm1pc3Npb25zO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGFmZmVjdGVkUGVybWlzc2lvbnMpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnJHthcHBQYWNrYWdlfScgY29udGFpbnMgbm8gcGVybWlzc2lvbnMgdG8gJHthY3Rpb259YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gUE1fQUNUSU9OLkdSQU5UKSB7XG4gICAgYXdhaXQgdGhpcy5hZGIuZ3JhbnRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBhZmZlY3RlZFBlcm1pc3Npb25zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBCLmFsbChhZmZlY3RlZFBlcm1pc3Npb25zLm1hcCgobmFtZSkgPT4gdGhpcy5hZGIucmV2b2tlUGVybWlzc2lvbihhcHBQYWNrYWdlLCBuYW1lKSkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoYW5nZVBlcm1pc3Npb25zVmlhQXBwb3BzIChwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgYWN0aW9uKSB7XG4gIGlmICghXy52YWx1ZXMoQVBQT1BTX0FDVElPTikuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoQVBQT1BTX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICBpZiAoXy50b0xvd2VyKHBlcm1pc3Npb25zKSA9PT0gQUxMX1BFUk1JU1NJT05TX01BR0lDKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJyR7QUxMX1BFUk1JU1NJT05TX01BR0lDfScgcGVybWlzc2lvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYCArXG4gICAgICBgJyR7UEVSTUlTU0lPTl9UQVJHRVQuUE19JyB0YXJnZXQuIGAgK1xuICAgICAgYENoZWNrIEFwcE9wc01hbmFnZXIuamF2YSBmcm9tIEFuZHJvaWQgcGxhdGZvcm0gc291cmNlcyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgQXBwT3BzIHBlcm1pc3Npb25zYCk7XG4gIH1cblxuICBjb25zdCBwcm9taXNlcyA9IChfLmlzQXJyYXkocGVybWlzc2lvbnMpID8gcGVybWlzc2lvbnMgOiBbcGVybWlzc2lvbnNdKVxuICAgIC5tYXAoKHBlcm1pc3Npb24pID0+IHRoaXMuYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIGFwcFBhY2thZ2UsIHBlcm1pc3Npb24sIGFjdGlvbl0pKTtcbiAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYW5nZVBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfEFycmF5PHN0cmluZz59IHBlcm1pc3Npb25zXG4gKiBJZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ3BtJzpcbiAqICAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBjaGFuZ2VkXG4gKiBvciBhIGxpc3Qgb2YgcGVybWlzc2lvbnMuIENoZWNrIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb25cbiAqIHRvIGdldCB0aGUgZnVsbCBsaXN0IG9mIHN0YW5kYXJkIEFuZHJvaWQgcGVybXNzaW9uIG5hbWVzLiBNYW5kYXRvcnkgYXJndW1lbnQuXG4gKiBJZiAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgcGFzc2VkIHRoZW4gdGhlIGNob3NlbiBhY3Rpb24gaXMgZ29pbmcgdG8gYmUgYXBwbGllZCB0byBhbGxcbiAqIHBlcm1pc2lzb25zIHJlcXVlc3RlZC9ncmFudGVkIGJ5ICdhcHBQYWNrYWdlJy5cbiAqIElmIGB0YXJnZXRgIGlzIHNldCB0byAnYXBwb3BzJzpcbiAqICAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgYXBwb3BzIHBlcm1pc3Npb24gdG8gYmUgY2hhbmdlZFxuICogb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zLiBDaGVjayBBcHBPcHNNYW5hZ2VyLmphdmEgc291cmNlcyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZlxuICogc3VwcG9ydGVkIGFwcG9wcyBwZXJtaXNzaW9uIG5hbWVzIGZvciB0aGUgZ2l2ZW4gQW5kcm9pZCBwa2xhdGZvcm0uXG4gKiBFeGFtcGxlczogJ0FDVElWSVRZX1JFQ09HTklUSU9OJywgJ1NNU19GSU5BTkNJQUxfVFJBTlNBQ1RJT05TJywgJ1JFQURfU01TJywgJ0FDQ0VTU19OT1RJRklDQVRJT05TJy5cbiAqIFRoZSAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgdW5zdXBwb3J0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIFRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIHNldCBjaGFuZ2VcbiAqIHBlcm1pc3Npb25zIG9uLiBEZWZhdWx0cyB0byB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRlc3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIFtncmFudHxhbGxvd10gT25lIG9mIGBQTV9BQ1RJT05gIHZhbHVlcyBpZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ3BtJyxcbiAqIG90aGVyd2lzZSBvbmUgb2YgYEFQUE9QU19BQ1RJT05gIHZhbHVlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCBbcG1dIEVpdGhlciAncG0nIG9yICdhcHBvcHMnLiBUaGUgJ2FwcG9wcycgb25lIHJlcXVpcmVzXG4gKiAnYWRiX3NoZWxsJyBzZXJ2ZXIgc2VjdXJpdHkgb3B0aW9uIHRvIGJlIGVuYWJsZWQuXG4gKi9cblxuLyoqXG4gKiBDaGFuZ2VzIHBhY2thZ2UgcGVybWlzc2lvbnMgaW4gcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gez9DaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwZXJtaXNzaW9ucyxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aW9uID0gXy50b0xvd2VyKG9wdHMudGFyZ2V0KSA9PT0gUEVSTUlTU0lPTl9UQVJHRVQuQVBQT1BTID8gQVBQT1BTX0FDVElPTi5BTExPVyA6IFBNX0FDVElPTi5HUkFOVCxcbiAgICB0YXJnZXQgPSBQRVJNSVNTSU9OX1RBUkdFVC5QTSxcbiAgfSA9IG9wdHM7XG4gIGlmIChfLmlzTmlsKHBlcm1pc3Npb25zKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgbXVzdCBub3QgYmUgZW1wdHlgKTtcbiAgfVxuXG4gIHN3aXRjaCAoXy50b0xvd2VyKHRhcmdldCkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05fVEFSR0VULlBNOlxuICAgICAgcmV0dXJuIGF3YWl0IGNoYW5nZVBlcm1pc3Npb25zVmlhUG0uYmluZCh0aGlzKShwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgXy50b0xvd2VyKGFjdGlvbikpO1xuICAgIGNhc2UgUEVSTUlTU0lPTl9UQVJHRVQuQVBQT1BTOlxuICAgICAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChBREJfU0hFTExfRkVBVFVSRSk7XG4gICAgICByZXR1cm4gYXdhaXQgY2hhbmdlUGVybWlzc2lvbnNWaWFBcHBvcHMuYmluZCh0aGlzKShwZXJtaXNzaW9ucywgYXBwUGFja2FnZSwgXy50b0xvd2VyKGFjdGlvbikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAndGFyZ2V0JyBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZjogJHtfLnZhbHVlcyhQRVJNSVNTSU9OX1RBUkdFVCl9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0UGVybWlzc2lvbnNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBbcmVxdWVzdGVkXSAtIE9uZSBvZiBwb3NzaWJsZSBwZXJtaXNzaW9uIHR5cGVzIHRvIGdldC5cbiAqIENhbiBiZSBhbnkgb2YgYFBFUk1JU1NJT05TX1RZUEVgIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYWNrYWdlIFt0aGlzLm9wdHMuYXBwUGFja2FnZV0gLSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICovXG5cbi8qKlxuICogR2V0cyBydW50aW1lIHBlcm1pc3Npb25zIGxpc3QgZm9yIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7R2V0UGVybWlzc2lvbnNPcHRpb25zfSBvcHRzIC0gQXZhaWxhYmxlIG9wdGlvbnMgbWFwcGluZy5cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiByZXRyaWV2ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBnaXZlbiB0eXBlXG4gKiAoY2FuIGFsc28gYmUgZW1wdHkpLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBnZXR0aW5nIHBlcm1pc3Npb25zLlxuICovXG5jb21tYW5kcy5tb2JpbGVHZXRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldFBlcm1pc3Npb25zIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHR5cGUgPSBQRVJNSVNTSU9OU19UWVBFLlJFUVVFU1RFRCxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gIH0gPSBvcHRzO1xuXG4gIGxldCBhY3Rpb25GdW5jO1xuICBzd2l0Y2ggKF8udG9Mb3dlcih0eXBlKSkge1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQ6XG4gICAgICBhY3Rpb25GdW5jID0gKHBrZykgPT4gdGhpcy5hZGIuZ2V0UmVxUGVybWlzc2lvbnMocGtnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5HUkFOVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChwa2cpID0+IHRoaXMuYWRiLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhwa2cpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLkRFTklFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAocGtnKSA9PiB0aGlzLmFkYi5nZXREZW5pZWRQZXJtaXNzaW9ucyhwa2cpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gcGVybWlzc2lvbnMgdHlwZSAnJHt0eXBlfScuIGAgK1xuICAgICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KF8udmFsdWVzKFBFUk1JU1NJT05TX1RZUEUpKX0gdHlwZXMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCBhY3Rpb25GdW5jKGFwcFBhY2thZ2UpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLE1BQU1JLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRCxRQUFBLEdBQUFBLFFBQUE7QUFFcEIsTUFBTUUscUJBQXFCLEdBQUcsS0FB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