appium-uiautomator2-driver 2.12.3 → 2.12.5

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 (46) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +1 -1
  3. package/build/index.js +1 -1
  4. package/build/lib/commands/actions.js +1 -1
  5. package/build/lib/commands/actions.js.map +1 -1
  6. package/build/lib/commands/alert.js +1 -1
  7. package/build/lib/commands/alert.js.map +1 -1
  8. package/build/lib/commands/battery.js +1 -1
  9. package/build/lib/commands/battery.js.map +1 -1
  10. package/build/lib/commands/element.js +2 -3
  11. package/build/lib/commands/element.js.map +1 -1
  12. package/build/lib/commands/find.js +1 -1
  13. package/build/lib/commands/find.js.map +1 -1
  14. package/build/lib/commands/general.js +1 -1
  15. package/build/lib/commands/general.js.map +1 -1
  16. package/build/lib/commands/gestures.js +1 -1
  17. package/build/lib/commands/gestures.js.map +1 -1
  18. package/build/lib/commands/index.js +1 -1
  19. package/build/lib/commands/index.js.map +1 -1
  20. package/build/lib/commands/screenshot.js +1 -1
  21. package/build/lib/commands/screenshot.js.map +1 -1
  22. package/build/lib/commands/touch.js +1 -1
  23. package/build/lib/commands/touch.js.map +1 -1
  24. package/build/lib/commands/viewport.js +1 -1
  25. package/build/lib/commands/viewport.js.map +1 -1
  26. package/build/lib/css-converter.js +1 -1
  27. package/build/lib/css-converter.js.map +1 -1
  28. package/build/lib/desired-caps.js +1 -1
  29. package/build/lib/desired-caps.js.map +1 -1
  30. package/build/lib/driver.js +2 -11
  31. package/build/lib/driver.js.map +1 -1
  32. package/build/lib/extensions.js +1 -1
  33. package/build/lib/extensions.js.map +1 -1
  34. package/build/lib/helpers.js +1 -1
  35. package/build/lib/helpers.js.map +1 -1
  36. package/build/lib/logger.js +1 -1
  37. package/build/lib/logger.js.map +1 -1
  38. package/build/lib/method-map.js +1 -1
  39. package/build/lib/method-map.js.map +1 -1
  40. package/build/lib/uiautomator2.js +1 -1
  41. package/build/lib/uiautomator2.js.map +1 -1
  42. package/lib/commands/element.js +1 -2
  43. package/lib/driver.js +1 -10
  44. package/npm-shrinkwrap.json +820 -3045
  45. package/package.json +5 -3
  46. package/scripts/reset.js +30 -0
@@ -1 +1 @@
1
- {"version":3,"file":"general.js","names":["extensions","commands","helpers","getPageSource","uiautomator2","jwproxy","command","getClipboard","adb","getApiLevel","doSendKeys","params","keyevent","keycode","metastate","log","debug","back","getStrings","language","getDeviceLanguage","info","preprocessStringsMap","mapping","result","key","value","_","toPairs","isString","JSON","stringify","apkStrings","opts","app","appPackage","errorAndThrow","tmpRoot","tempDir","openDir","pullApk","err","message","fs","exists","extractStringsFromApk","rimraf","getDisplayDensity","getWindowSize","getWindowRect","width","height","x","y","executeMobile","mobileCommand","mobileCommandsMapping","shell","execEmuConsoleCommand","dragGesture","flingGesture","doubleClickGesture","clickGesture","longClickGesture","pinchCloseGesture","pinchOpenGesture","swipeGesture","scrollGesture","scrollBackTo","scroll","viewportScreenshot","viewportRect","deepLink","startLogsBroadcast","stopLogsBroadcast","acceptAlert","dismissAlert","batteryInfo","deviceInfo","getDeviceTime","changePermissions","getPermissions","performEditorAction","startScreenStreaming","stopScreenStreaming","getNotifications","listSms","type","sensorSet","pushFile","pullFile","pullFolder","deleteFile","isAppInstalled","queryAppState","activateApp","removeApp","terminateApp","installApp","clearApp","startActivity","startService","stopService","broadcast","getContexts","installMultipleApks","unlock","refreshGpsCache","startMediaProjectionRecording","isMediaProjectionRecordingRunning","stopMediaProjectionRecording","has","errors","UnknownCommandError","keys","mobileViewportScreenshot","getViewportScreenshot","mobileViewPortRect","getViewPortRect","setUrl","url","startUri","mobileDeepLink","package","pkg","waitForLaunch","openNotifications","updateSettings","settings","update","getSettings","driverSettings","serverSettings","wrapBootstrapDisconnect","wrapped","suspendChromedriverProxy","chromedriver","proxyReqRes","bind","proxyCommand","jwpProxyActive","mobileGetDeviceInfo","mobileType","text","isUndefined","typeUnicode","mobileInstallMultipleApks","isArray","apks","isEmpty","InvalidArgumentError","B","all","map","configureApp","APK_EXTENSION","options","Object","assign"],"sources":["../../../lib/commands/general.js"],"sourcesContent":["import _ from 'lodash';\nimport B from 'bluebird';\nimport { errors } from 'appium/driver';\nimport { fs, tempDir } from 'appium/support';\nimport { APK_EXTENSION } from '../extensions';\n\nlet extensions = {},\n commands = {},\n helpers = {};\n\ncommands.getPageSource = async function () {\n return await this.uiautomator2.jwproxy.command('/source', 'GET', {});\n};\n\ncommands.getClipboard = async function () {\n return (await this.adb.getApiLevel() < 29)\n ? (await this.uiautomator2.jwproxy.command('/appium/device/get_clipboard', 'POST', {}))\n : (await this.adb.getClipboard());\n};\n\n// Need to override this for correct unicode support\ncommands.doSendKeys = async function (params) {\n await this.uiautomator2.jwproxy.command('/keys', 'POST', params);\n};\n\n// uiautomator2 doesn't support metastate for keyevents\ncommands.keyevent = async function (keycode, metastate) {\n this.log.debug(`Ignoring metastate ${metastate}`);\n await this.adb.keyevent(keycode);\n};\n\n// Use ADB since we don't have UiAutomator\ncommands.back = async function () {\n await this.adb.keyevent(4);\n};\n\ncommands.getStrings = async function (language) {\n if (!language) {\n language = await this.adb.getDeviceLanguage();\n this.log.info(`No language specified, returning strings for: ${language}`);\n }\n\n // Clients require the resulting mapping to have both keys\n // and values of type string\n const preprocessStringsMap = function (mapping) {\n const result = {};\n for (const [key, value] of _.toPairs(mapping)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n };\n\n if (this.apkStrings[language]) {\n // Return cached strings\n return preprocessStringsMap(this.apkStrings[language]);\n }\n\n if (!this.opts.app && !this.opts.appPackage) {\n this.log.errorAndThrow(\"One of 'app' or 'appPackage' capabilities should must be specified\");\n }\n\n let app = this.opts.app;\n const tmpRoot = await tempDir.openDir();\n try {\n if (!app) {\n try {\n app = await this.adb.pullApk(this.opts.appPackage, tmpRoot);\n } catch (err) {\n this.log.errorAndThrow(`Failed to pull an apk from '${this.opts.appPackage}'. Original error: ${err.message}`);\n }\n }\n\n if (!await fs.exists(app)) {\n this.log.errorAndThrow(`The app at '${app}' does not exist`);\n }\n\n try {\n const {apkStrings} = await this.adb.extractStringsFromApk(app, language, tmpRoot);\n this.apkStrings[language] = apkStrings;\n return preprocessStringsMap(apkStrings);\n } catch (err) {\n this.log.errorAndThrow(`Cannot extract strings from '${app}'. Original error: ${err.message}`);\n }\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\ncommands.getDisplayDensity = async function getDisplayDensity () {\n return await this.uiautomator2.jwproxy.command('/appium/device/display_density', 'GET', {});\n};\n\n// memoized in constructor\ncommands.getWindowSize = async function () {\n return await this.uiautomator2.jwproxy.command('/window/current/size', 'GET', {});\n};\n\n// For W3C\ncommands.getWindowRect = async function () {\n const {width, height} = await this.getWindowSize();\n return {\n width,\n height,\n x: 0,\n y: 0,\n };\n};\n\nextensions.executeMobile = async function (mobileCommand, opts = {}) {\n const mobileCommandsMapping = {\n shell: 'mobileShell',\n\n execEmuConsoleCommand: 'mobileExecEmuConsoleCommand',\n\n dragGesture: 'mobileDragGesture',\n flingGesture: 'mobileFlingGesture',\n doubleClickGesture: 'mobileDoubleClickGesture',\n clickGesture: 'mobileClickGesture',\n longClickGesture: 'mobileLongClickGesture',\n pinchCloseGesture: 'mobilePinchCloseGesture',\n pinchOpenGesture: 'mobilePinchOpenGesture',\n swipeGesture: 'mobileSwipeGesture',\n scrollGesture: 'mobileScrollGesture',\n scrollBackTo: 'mobileScrollBackTo',\n scroll: 'mobileScroll',\n viewportScreenshot: 'mobileViewportScreenshot',\n viewportRect: 'mobileViewPortRect',\n\n deepLink: 'mobileDeepLink',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n acceptAlert: 'mobileAcceptAlert',\n dismissAlert: 'mobileDismissAlert',\n\n batteryInfo: 'mobileGetBatteryInfo',\n\n deviceInfo: 'mobileGetDeviceInfo',\n\n getDeviceTime: 'mobileGetDeviceTime',\n\n changePermissions: 'mobileChangePermissions',\n getPermissions: 'mobileGetPermissions',\n\n performEditorAction: 'mobilePerformEditorAction',\n\n startScreenStreaming: 'mobileStartScreenStreaming',\n stopScreenStreaming: 'mobileStopScreenStreaming',\n\n getNotifications: 'mobileGetNotifications',\n\n listSms: 'mobileListSms',\n\n type: 'mobileType',\n sensorSet: 'sensorSet',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n\n isAppInstalled: 'mobileIsAppInstalled',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n removeApp: 'mobileRemoveApp',\n terminateApp: 'mobileTerminateApp',\n installApp: 'mobileInstallApp',\n clearApp: 'mobileClearApp',\n\n startActivity: 'mobileStartActivity',\n startService: 'mobileStartService',\n stopService: 'mobileStopService',\n broadcast: 'mobileBroadcast',\n\n getContexts: 'mobileGetContexts',\n\n installMultipleApks: 'mobileInstallMultipleApks',\n\n unlock: 'mobileUnlock',\n\n refreshGpsCache: 'mobileRefreshGpsCache',\n\n startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',\n isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',\n stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',\n };\n\n if (!_.has(mobileCommandsMapping, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command \"${mobileCommand}\". ` +\n `Only ${_.keys(mobileCommandsMapping)} commands are supported.`);\n }\n return await this[mobileCommandsMapping[mobileCommand]](opts);\n};\n\ncommands.mobileViewportScreenshot = async function () {\n return await this.getViewportScreenshot();\n};\n\n/**\n * @typedef {object} Rectangle\n * @property {number} left - The left coordinate of the Rectangle.\n * @property {number} top - The top coordinate of the Rectangle.\n * @property {number} width - The width of Rectangle.\n * @property {number} height - The height of Rectangle.\n */\n\n/**\n * Returns the viewport coordinates.\n * @returns {Rectangle} The viewport coordinates.\n */\ncommands.mobileViewPortRect = async function mobileViewPortRect () {\n return await this.getViewPortRect();\n};\n\ncommands.setUrl = async function (url) {\n await this.adb.startUri(url, this.opts.appPackage);\n};\n\n/**\n * @typedef {object} DeepLinkOpts\n * @property {!string} url - The name of URL to start.\n * @property {!string} package - The name of the package to start the URI with.\n * @property {?boolean} waitForLaunch [true] - if `false` then adb won't wait\n * for the started activity to return the control\n */\n\n/**\n * Start URL that take users directly to specific content in the app\n * @param {DeepLinkOpts} opts\n */\ncommands.mobileDeepLink = async function (opts = {}) {\n const {\n url,\n package: pkg,\n waitForLaunch,\n } = opts;\n return await this.adb.startUri(url, pkg, { waitForLaunch });\n};\n\ncommands.openNotifications = async function () {\n return await this.uiautomator2.jwproxy.command('/appium/device/open_notifications', 'POST', {});\n};\n\ncommands.updateSettings = async function (settings) {\n await this.settings.update(settings);\n await this.uiautomator2.jwproxy.command('/appium/settings', 'POST', {settings});\n};\n\ncommands.getSettings = async function () {\n const driverSettings = this.settings.getSettings();\n const serverSettings = await this.uiautomator2.jwproxy.command('/appium/settings', 'GET');\n return {...driverSettings, ...serverSettings};\n};\n\n/**\n * Overriding appium-android-driver's wrapBootstrapDisconnect,\n * unlike in appium-android-driver avoiding adb restarting as it intern\n * kills UiAutomator2 server running in the device.\n **/\nhelpers.wrapBootstrapDisconnect = async function (wrapped) {\n await wrapped();\n};\n\n// Stop proxying to any Chromedriver and redirect to uiautomator2\nhelpers.suspendChromedriverProxy = function () {\n this.chromedriver = null;\n this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);\n this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);\n this.jwpProxyActive = true;\n};\n\n/**\n * The list of available info entries can be found at\n * https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/main/java/io/appium/uiautomator2/handler/GetDeviceInfo.java\n */\ncommands.mobileGetDeviceInfo = async function () {\n return await this.uiautomator2.jwproxy.command('/appium/device/info', 'GET');\n};\n\n/**\n * @typedef {Object} TypingOptions\n * @property {!string|number|boolean} text - The text to type\n */\n\n/**\n * Types the given Unicode string.\n * It is expected that the focus is already put\n * to the destination input field before this method is called.\n *\n * @param {TypingOptions} opts\n * @returns {boolean} `true` if the input text has been successfully sent to adb\n * @throws {Error} if `text` property has not been provided\n */\ncommands.mobileType = async function mobileType (opts = {}) {\n const {\n text,\n } = opts;\n if (_.isUndefined(text)) {\n this.log.errorAndThrow(`The 'text' argument is mandatory`);\n }\n return await this.adb.typeUnicode(text);\n};\n\n\n/**\n * @typedef {Object} InstallOptions\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n * @property {boolean} partialInstall [false] - Install apks partially. It is used for 'install-multiple'.\n * https://android.stackexchange.com/questions/111064/what-is-a-partial-application-install-via-adb\n */\n\n/**\n * @typedef {Object} InstallMultipleApksOptions\n * @property {Array<string>} apks - The list of APKs to install. Each APK should be a path to a apk\n * or downloadable URL as HTTP/HTTPS.\n * @property {InstallOptions} options\n */\n\n/**\n * Install multiple APKs with `install-multiple` option.\n *\n * @param {InstallMultipleApksOptions} opts\n * @throws {Error} if an error occured while installing the given APKs.\n */\ncommands.mobileInstallMultipleApks = async function (opts = {}) {\n if (!_.isArray(opts.apks) || _.isEmpty(opts.apks)) {\n throw new errors.InvalidArgumentError('No apks are given to install');\n }\n const apks = await B.all(opts.apks\n .map((app) => this.helpers.configureApp(app, [APK_EXTENSION])));\n await this.adb.installMultipleApks(apks, opts.options);\n};\n\nObject.assign(extensions, commands, helpers);\n\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"general.js","names":["_lodash","_interopRequireDefault","require","_bluebird","_driver","_support","_extensions","extensions","commands","helpers","getPageSource","uiautomator2","jwproxy","command","getClipboard","adb","getApiLevel","doSendKeys","params","keyevent","keycode","metastate","log","debug","back","getStrings","language","getDeviceLanguage","info","preprocessStringsMap","mapping","result","key","value","_","toPairs","isString","JSON","stringify","apkStrings","opts","app","appPackage","errorAndThrow","tmpRoot","tempDir","openDir","pullApk","err","message","fs","exists","extractStringsFromApk","rimraf","getDisplayDensity","getWindowSize","getWindowRect","width","height","x","y","executeMobile","mobileCommand","mobileCommandsMapping","shell","execEmuConsoleCommand","dragGesture","flingGesture","doubleClickGesture","clickGesture","longClickGesture","pinchCloseGesture","pinchOpenGesture","swipeGesture","scrollGesture","scrollBackTo","scroll","viewportScreenshot","viewportRect","deepLink","startLogsBroadcast","stopLogsBroadcast","acceptAlert","dismissAlert","batteryInfo","deviceInfo","getDeviceTime","changePermissions","getPermissions","performEditorAction","startScreenStreaming","stopScreenStreaming","getNotifications","listSms","type","sensorSet","pushFile","pullFile","pullFolder","deleteFile","isAppInstalled","queryAppState","activateApp","removeApp","terminateApp","installApp","clearApp","startActivity","startService","stopService","broadcast","getContexts","installMultipleApks","unlock","refreshGpsCache","startMediaProjectionRecording","isMediaProjectionRecordingRunning","stopMediaProjectionRecording","has","errors","UnknownCommandError","keys","mobileViewportScreenshot","getViewportScreenshot","mobileViewPortRect","getViewPortRect","setUrl","url","startUri","mobileDeepLink","package","pkg","waitForLaunch","openNotifications","updateSettings","settings","update","getSettings","driverSettings","serverSettings","wrapBootstrapDisconnect","wrapped","suspendChromedriverProxy","chromedriver","proxyReqRes","bind","proxyCommand","jwpProxyActive","mobileGetDeviceInfo","mobileType","text","isUndefined","typeUnicode","mobileInstallMultipleApks","isArray","apks","isEmpty","InvalidArgumentError","B","all","map","configureApp","APK_EXTENSION","options","Object","assign","_default","exports","default"],"sources":["../../../lib/commands/general.js"],"sourcesContent":["import _ from 'lodash';\nimport B from 'bluebird';\nimport { errors } from 'appium/driver';\nimport { fs, tempDir } from 'appium/support';\nimport { APK_EXTENSION } from '../extensions';\n\nlet extensions = {},\n commands = {},\n helpers = {};\n\ncommands.getPageSource = async function () {\n return await this.uiautomator2.jwproxy.command('/source', 'GET', {});\n};\n\ncommands.getClipboard = async function () {\n return (await this.adb.getApiLevel() < 29)\n ? (await this.uiautomator2.jwproxy.command('/appium/device/get_clipboard', 'POST', {}))\n : (await this.adb.getClipboard());\n};\n\n// Need to override this for correct unicode support\ncommands.doSendKeys = async function (params) {\n await this.uiautomator2.jwproxy.command('/keys', 'POST', params);\n};\n\n// uiautomator2 doesn't support metastate for keyevents\ncommands.keyevent = async function (keycode, metastate) {\n this.log.debug(`Ignoring metastate ${metastate}`);\n await this.adb.keyevent(keycode);\n};\n\n// Use ADB since we don't have UiAutomator\ncommands.back = async function () {\n await this.adb.keyevent(4);\n};\n\ncommands.getStrings = async function (language) {\n if (!language) {\n language = await this.adb.getDeviceLanguage();\n this.log.info(`No language specified, returning strings for: ${language}`);\n }\n\n // Clients require the resulting mapping to have both keys\n // and values of type string\n const preprocessStringsMap = function (mapping) {\n const result = {};\n for (const [key, value] of _.toPairs(mapping)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n };\n\n if (this.apkStrings[language]) {\n // Return cached strings\n return preprocessStringsMap(this.apkStrings[language]);\n }\n\n if (!this.opts.app && !this.opts.appPackage) {\n this.log.errorAndThrow(\"One of 'app' or 'appPackage' capabilities should must be specified\");\n }\n\n let app = this.opts.app;\n const tmpRoot = await tempDir.openDir();\n try {\n if (!app) {\n try {\n app = await this.adb.pullApk(this.opts.appPackage, tmpRoot);\n } catch (err) {\n this.log.errorAndThrow(`Failed to pull an apk from '${this.opts.appPackage}'. Original error: ${err.message}`);\n }\n }\n\n if (!await fs.exists(app)) {\n this.log.errorAndThrow(`The app at '${app}' does not exist`);\n }\n\n try {\n const {apkStrings} = await this.adb.extractStringsFromApk(app, language, tmpRoot);\n this.apkStrings[language] = apkStrings;\n return preprocessStringsMap(apkStrings);\n } catch (err) {\n this.log.errorAndThrow(`Cannot extract strings from '${app}'. Original error: ${err.message}`);\n }\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\ncommands.getDisplayDensity = async function getDisplayDensity () {\n return await this.uiautomator2.jwproxy.command('/appium/device/display_density', 'GET', {});\n};\n\n// memoized in constructor\ncommands.getWindowSize = async function () {\n return await this.uiautomator2.jwproxy.command('/window/current/size', 'GET', {});\n};\n\n// For W3C\ncommands.getWindowRect = async function () {\n const {width, height} = await this.getWindowSize();\n return {\n width,\n height,\n x: 0,\n y: 0,\n };\n};\n\nextensions.executeMobile = async function (mobileCommand, opts = {}) {\n const mobileCommandsMapping = {\n shell: 'mobileShell',\n\n execEmuConsoleCommand: 'mobileExecEmuConsoleCommand',\n\n dragGesture: 'mobileDragGesture',\n flingGesture: 'mobileFlingGesture',\n doubleClickGesture: 'mobileDoubleClickGesture',\n clickGesture: 'mobileClickGesture',\n longClickGesture: 'mobileLongClickGesture',\n pinchCloseGesture: 'mobilePinchCloseGesture',\n pinchOpenGesture: 'mobilePinchOpenGesture',\n swipeGesture: 'mobileSwipeGesture',\n scrollGesture: 'mobileScrollGesture',\n scrollBackTo: 'mobileScrollBackTo',\n scroll: 'mobileScroll',\n viewportScreenshot: 'mobileViewportScreenshot',\n viewportRect: 'mobileViewPortRect',\n\n deepLink: 'mobileDeepLink',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n acceptAlert: 'mobileAcceptAlert',\n dismissAlert: 'mobileDismissAlert',\n\n batteryInfo: 'mobileGetBatteryInfo',\n\n deviceInfo: 'mobileGetDeviceInfo',\n\n getDeviceTime: 'mobileGetDeviceTime',\n\n changePermissions: 'mobileChangePermissions',\n getPermissions: 'mobileGetPermissions',\n\n performEditorAction: 'mobilePerformEditorAction',\n\n startScreenStreaming: 'mobileStartScreenStreaming',\n stopScreenStreaming: 'mobileStopScreenStreaming',\n\n getNotifications: 'mobileGetNotifications',\n\n listSms: 'mobileListSms',\n\n type: 'mobileType',\n sensorSet: 'sensorSet',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n\n isAppInstalled: 'mobileIsAppInstalled',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n removeApp: 'mobileRemoveApp',\n terminateApp: 'mobileTerminateApp',\n installApp: 'mobileInstallApp',\n clearApp: 'mobileClearApp',\n\n startActivity: 'mobileStartActivity',\n startService: 'mobileStartService',\n stopService: 'mobileStopService',\n broadcast: 'mobileBroadcast',\n\n getContexts: 'mobileGetContexts',\n\n installMultipleApks: 'mobileInstallMultipleApks',\n\n unlock: 'mobileUnlock',\n\n refreshGpsCache: 'mobileRefreshGpsCache',\n\n startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',\n isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',\n stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',\n };\n\n if (!_.has(mobileCommandsMapping, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command \"${mobileCommand}\". ` +\n `Only ${_.keys(mobileCommandsMapping)} commands are supported.`);\n }\n return await this[mobileCommandsMapping[mobileCommand]](opts);\n};\n\ncommands.mobileViewportScreenshot = async function () {\n return await this.getViewportScreenshot();\n};\n\n/**\n * @typedef {object} Rectangle\n * @property {number} left - The left coordinate of the Rectangle.\n * @property {number} top - The top coordinate of the Rectangle.\n * @property {number} width - The width of Rectangle.\n * @property {number} height - The height of Rectangle.\n */\n\n/**\n * Returns the viewport coordinates.\n * @returns {Rectangle} The viewport coordinates.\n */\ncommands.mobileViewPortRect = async function mobileViewPortRect () {\n return await this.getViewPortRect();\n};\n\ncommands.setUrl = async function (url) {\n await this.adb.startUri(url, this.opts.appPackage);\n};\n\n/**\n * @typedef {object} DeepLinkOpts\n * @property {!string} url - The name of URL to start.\n * @property {!string} package - The name of the package to start the URI with.\n * @property {?boolean} waitForLaunch [true] - if `false` then adb won't wait\n * for the started activity to return the control\n */\n\n/**\n * Start URL that take users directly to specific content in the app\n * @param {DeepLinkOpts} opts\n */\ncommands.mobileDeepLink = async function (opts = {}) {\n const {\n url,\n package: pkg,\n waitForLaunch,\n } = opts;\n return await this.adb.startUri(url, pkg, { waitForLaunch });\n};\n\ncommands.openNotifications = async function () {\n return await this.uiautomator2.jwproxy.command('/appium/device/open_notifications', 'POST', {});\n};\n\ncommands.updateSettings = async function (settings) {\n await this.settings.update(settings);\n await this.uiautomator2.jwproxy.command('/appium/settings', 'POST', {settings});\n};\n\ncommands.getSettings = async function () {\n const driverSettings = this.settings.getSettings();\n const serverSettings = await this.uiautomator2.jwproxy.command('/appium/settings', 'GET');\n return {...driverSettings, ...serverSettings};\n};\n\n/**\n * Overriding appium-android-driver's wrapBootstrapDisconnect,\n * unlike in appium-android-driver avoiding adb restarting as it intern\n * kills UiAutomator2 server running in the device.\n **/\nhelpers.wrapBootstrapDisconnect = async function (wrapped) {\n await wrapped();\n};\n\n// Stop proxying to any Chromedriver and redirect to uiautomator2\nhelpers.suspendChromedriverProxy = function () {\n this.chromedriver = null;\n this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);\n this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);\n this.jwpProxyActive = true;\n};\n\n/**\n * The list of available info entries can be found at\n * https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/main/java/io/appium/uiautomator2/handler/GetDeviceInfo.java\n */\ncommands.mobileGetDeviceInfo = async function () {\n return await this.uiautomator2.jwproxy.command('/appium/device/info', 'GET');\n};\n\n/**\n * @typedef {Object} TypingOptions\n * @property {!string|number|boolean} text - The text to type\n */\n\n/**\n * Types the given Unicode string.\n * It is expected that the focus is already put\n * to the destination input field before this method is called.\n *\n * @param {TypingOptions} opts\n * @returns {boolean} `true` if the input text has been successfully sent to adb\n * @throws {Error} if `text` property has not been provided\n */\ncommands.mobileType = async function mobileType (opts = {}) {\n const {\n text,\n } = opts;\n if (_.isUndefined(text)) {\n this.log.errorAndThrow(`The 'text' argument is mandatory`);\n }\n return await this.adb.typeUnicode(text);\n};\n\n\n/**\n * @typedef {Object} InstallOptions\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n * @property {boolean} partialInstall [false] - Install apks partially. It is used for 'install-multiple'.\n * https://android.stackexchange.com/questions/111064/what-is-a-partial-application-install-via-adb\n */\n\n/**\n * @typedef {Object} InstallMultipleApksOptions\n * @property {Array<string>} apks - The list of APKs to install. Each APK should be a path to a apk\n * or downloadable URL as HTTP/HTTPS.\n * @property {InstallOptions} options\n */\n\n/**\n * Install multiple APKs with `install-multiple` option.\n *\n * @param {InstallMultipleApksOptions} opts\n * @throws {Error} if an error occured while installing the given APKs.\n */\ncommands.mobileInstallMultipleApks = async function (opts = {}) {\n if (!_.isArray(opts.apks) || _.isEmpty(opts.apks)) {\n throw new errors.InvalidArgumentError('No apks are given to install');\n }\n const apks = await B.all(opts.apks\n .map((app) => this.helpers.configureApp(app, [APK_EXTENSION])));\n await this.adb.installMultipleApks(apks, opts.options);\n};\n\nObject.assign(extensions, commands, helpers);\n\nexport default extensions;\n"],"mappings":"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"}
@@ -199,4 +199,4 @@ commands.mobileScroll = async function (opts = {}) {
199
199
  };
200
200
  var _default = commands;
201
201
  exports.default = _default;
202
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUNsaWNrR2VzdHVyZSIsIm9wdHMiLCJlbGVtZW50SWQiLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJkdXJhdGlvbiIsIm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZ2VzdHVyZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuXG5mdW5jdGlvbiB0b09yaWdpbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IHV0aWwud3JhcEVsZW1lbnQodXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnQpKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdG9Qb2ludCAoeCwgeSkge1xuICByZXR1cm4gXy5pc0Zpbml0ZSh4KSAmJiBfLmlzRmluaXRlKHkpID8ge3gsIHl9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b1JlY3QgKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4gW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0uc29tZSgodikgPT4gIV8uaXNGaW5pdGUodikpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHR9O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENsaWNrT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY2xpY2tlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbiBib3RoIGNsaWNrIG9mZnNldCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgb2Zmc2V0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb29yZGluYXRlc1xuICogYXJlIHBhcnNlZCBhcyByZWxhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gY2xpY2sgb25cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gY2xpY2sgb25cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc2ltcGxlIGNsaWNrL3RhcCBnZXN0dXJlXG4gKlxuICogQHBhcmFtIHs/Q2xpY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNsaWNrR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsaWNrR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgeCwgeSxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvY2xpY2snLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgb2Zmc2V0OiB0b1BvaW50KHgsIHkpLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9uZ0NsaWNrT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY2xpY2tlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbiBib3RoIGNsaWNrIG9mZnNldCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgb2Zmc2V0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb29yZGluYXRlc1xuICogYXJlIHBhcnNlZCBhcyByZWxhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gY2xpY2sgb25cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gY2xpY2sgb25cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gZHVyYXRpb24gWzUwMF0gLSBDbGljayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gKiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgY2xpY2sgdGhhdCBsYXN0cyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uXG4gKlxuICogQHBhcmFtIHs/TG9uZ0NsaWNrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVMb25nQ2xpY2tHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTG9uZ0NsaWNrR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgeCwgeSxcbiAgICBkdXJhdGlvbixcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvbG9uZ19jbGljaycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBvZmZzZXQ6IHRvUG9pbnQoeCwgeSksXG4gICAgZHVyYXRpb24sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEb3VibGVDbGlja09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGRvdWJsZSBjbGlja2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuIGJvdGggY2xpY2sgb2Zmc2V0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCBvZmZzZXQgYXJlIHByb3ZpZGVkIHRoZW4gdGhlIGNvb3JkaW5hdGVzXG4gKiBhcmUgcGFyc2VkIGFzIHJlbGF0aXZlIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBkb3VibGUgY2xpY2sgb25cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gZG91YmxlIGNsaWNrIG9uXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGNsaWNrIHRoYXQgbGFzdHMgZm9yIHRoZSBnaXZlbiBkdXJhdGlvblxuICpcbiAqIEBwYXJhbSB7P0RvdWJsZUNsaWNrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVEb3VibGVDbGlja0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEb3VibGVDbGlja0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHgsIHksXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2RvdWJsZV9jbGljaycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBvZmZzZXQ6IHRvUG9pbnQoeCwgeSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEcmFnT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZHJhZ2dlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiB0aGUgc3RhcnQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzdGFydCBjb29yZGluYXRlcyBhcmUgcHJvdmlkZWQgdGhlbiB0aGVzZVxuICogY29vcmRpbmF0ZXMgYXJlIGNvbnNpZGVyZWQgYXMgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBlbGVtZW50IGNvcm5lci5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3RhcnRYIC0gVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRzXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHN0YXJ0WSAtIFRoZSB5IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIHN0YXJ0c1xuICogQHByb3BlcnR5IHshbnVtYmVyfSBlbmRYIC0gVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgZW5kc1xuICogQHByb3BlcnR5IHshbnVtYmVyfSBlbmRZIC0gVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgZW5kc1xuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbMjUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtXG4gKiB0aGlzIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogRHJhZ3MgdGhpcyBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gez9EcmFnT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVEcmFnR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURyYWdHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBzdGFydFgsIHN0YXJ0WSxcbiAgICBlbmRYLCBlbmRZLFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9kcmFnJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIHN0YXJ0OiB0b1BvaW50KHN0YXJ0WCwgc3RhcnRZKSxcbiAgICBlbmQ6IHRvUG9pbnQoZW5kWCwgZW5kWSksXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBGbGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGZsaW5nZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gZmxpbmcgYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhpc1xuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIGZsaW5nLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOiBgdXBgLCBgZG93bmAsIGBsZWZ0YCBhbmQgYHJpZ2h0YCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzc1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybSB0aGlzXG4gKiBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gZmxpbmdcbiAqIHZlbG9jaXR5IGZvciB0aGUgZ2l2ZW4gdmlldyAoNTAgYnkgZGVmYXVsdClcbiAqL1xuXG4vKipcbiAqIERyYWdzIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHs/RmxpbmdPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGNhbiBzdGlsbCBzY3JvbGwgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi5cbiAqL1xuY29tbWFuZHMubW9iaWxlRmxpbmdHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRmxpbmdHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9mbGluZycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQaW5jaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHBpbmNoZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gcGluY2ggYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhlXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgcGluY2ggYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBwaW5jaCBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGluIHJhbmdlIDAuLjEsIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFsyNTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm1cbiAqIHRoaXMgZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHBpbmNoIGNsb3NlIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/UGluY2hPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2hDbG9zZUdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9waW5jaF9jbG9zZScsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBwaW5jaCBvcGVuIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/UGluY2hPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQaW5jaE9wZW5HZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvcGluY2hfb3BlbicsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dpcGVPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBzd2lwZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gc3dpcGUgYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhlXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBvZiB0aGUgc3dpcGUuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHN3aXBlIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgc3dpcGUgYXJlYSBzaXplLlxuICogVmFsaWQgdmFsdWVzIG11c3QgYmUgZmxvYXQgbnVtYmVycyBpbiByYW5nZSAwLi4xLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNTAwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXNcbiAqIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBzd2lwZSBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1N3aXBlT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVTd2lwZUdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTd2lwZUdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvc3dpcGUnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JvbGxPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBzY3JvbGxlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBzY3JvbGwgYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoaXNcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBvZiB0aGUgc2Nyb2xsLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOiBgdXBgLCBgZG93bmAsIGBsZWZ0YCBhbmQgYHJpZ2h0YCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBzY3JvbGwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBzY3JvbGxpbmcgYXJlYSBzaXplLlxuICogVmFsaWQgdmFsdWVzIG11c3QgYmUgZmxvYXQgbnVtYmVycyBncmVhdGVyIHRoYW4gemVybywgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzUwMDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybSB0aGlzIGdlc3R1cmVcbiAqIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc2Nyb2xsIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/U2Nyb2xsT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBjYW4gc3RpbGwgc2Nyb2xsIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbEdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTY3JvbGxHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3Njcm9sbCcsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbEVsZW1lbnRUb0VsZW1lbnRPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWxlbWVudElkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQsXG4gKiB3aGljaCBpcyBnb2luZyB0byBiZSBzY3JvbGxlZC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiBpcyBhIHZhbGlkIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBpdCB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgXG4gKiBzdHJhdGVneS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbGVtZW50VG9JZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSwgd2hpY2ggYmVsb25nc1xuICogdG8gdGhlIHNjcm9sbGFibGUgZWxlbWVudCBhYm92ZSwgYW5kIHdoaWNoIHNob3VsZCBiZWNvbWUgdmlzaWJsZSBhZnRlclxuICogdGhlIHNjcm9sbGluZyBvcGVyYXRpb24gaXMgZmluaXNoZWQuIEl0IGlzIHJlcXVpcmVkIHRoaXMgZWxlbWVudFxuICogd2FzIGxvY2F0ZWQgYnkgYC1hbmRyb2lkIHVpYXV0b21hdG9yYCBzdHJhdGVneS5cbiAqL1xuXG4vKipcbiAqIFNjcm9sbHMgdGhlIGdpdmVuIHNjcm9sbGFibGUgZWxlbWVudCBgZWxlbWVudElkYCB1bnRpbCBgZWxlbWVudFRvSWRgXG4gKiBiZWNvbWVzIHZpc2libGUuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGUgYGVsZW1lbnRUb0lkYFxuICogaXMgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSB2aWV3IHBvcnQuIE90aGVyd2lzZSBpdCB3b3VsZCBzY3JvbGxcbiAqIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgc2Nyb2xsYWJsZSBjb250cm9sIGFuZCB0cmllcyB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gZWxlbWVudFxuICogYnkgc2Nyb2xsaW5nIGl0cyBwYXJlbnQgdG8gdGhlIGVuZCBzdGVwIGJ5IHN0ZXAuIFRoZSBzY3JvbGwgZGlyZWN0aW9uICh2ZXJ0aWNhbCBvciBob3Jpem9udGFsKVxuICogaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge1Njcm9sbEVsZW1lbnRUb0VsZW1lbnRPcHRzfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHNjcm9sbGluZyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZFxuICovXG5jb21tYW5kcy5tb2JpbGVTY3JvbGxCYWNrVG8gPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50SWQsIGVsZW1lbnRUb0lkfSA9IG9wdHM7XG4gIGlmICghZWxlbWVudElkIHx8ICFlbGVtZW50VG9JZCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEJvdGggZWxlbWVudElkIGFuZCBlbGVtZW50VG9JZCBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoXG4gICAgYC9hcHBpdW0vZWxlbWVudC8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50SWQpfS9zY3JvbGxfdG8vJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudFRvSWQpfWAsICdQT1NUJywge30pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JvbGxPcHRzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCBUaGUgaWRlbnRpZmllciBvZiBhbiBlbGVtZW50LiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIGlzIGEgdmFsaWQgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGl0IHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmBcbiAqIHN0cmF0ZWd5LiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBmaXJzdCBjdXJyZW50bHkgYXZhaWxhYmxlIHNjcm9sbGFibGUgdmlld1xuICogaXMgc2VsZWN0ZWQgZm9yIHRoZSBpbnRlcmFjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gc3RyYXRlZ3kgVGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzIGFyZSBzdXBwb3J0ZWQ6XG4gKiAtIGBhY2Nlc3NpYmlsaXR5IGlkYCAoVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uKVxuICogLSBgY2xhc3MgbmFtZWAgKFVpU2VsZWN0b3IoKS5jbGFzc05hbWUpXG4gKiAtIGAtYW5kcm9pZCB1aWF1dG9tYXRvcmAgKFVpU2VsZWN0b3IpXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHNlbGVjdG9yIFRoZSBjb3JyZXNwb25kaW5nIGxvb2t1cCB2YWx1ZSBmb3IgdGhlIGdpdmVuXG4gKiBzdHJhdGVneS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbWF4U3dpcGVzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2lwZXMgdG8gcGVyZm9ybVxuICogb24gdGhlIHRhcmdldCBzY3JvbGxhYmxlIHZpZXcgaW4gb3JkZXIgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnQuXG4gKiBJbiBjYXNlIHRoaXMgdmFsdWUgaXMgdW5zZXQgdGhlbiBpdCB3b3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2Nyb2xsYWJsZVxuICogZWxlbWVudCBpdHNlbGYgKHZ1YSBgZ2V0TWF4U2VhcmNoU3dpcGVzKClgIHByb3BlcnR5KS5cbiAqL1xuXG4vKipcbiAqIFNjcm9sbHMgdGhlIGdpdmVuIHNjcm9sbGFibGUgZWxlbWVudCB1bnRpbCB0aGUgZWxlbWVudCBpZGVudGlmaWVkXG4gKiBieSBgc3RyYXRlZ3lgIGFuZCBgc2VsZWN0b3JgIGJlY29tZXMgdmlzaWJsZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZVxuICogZGVzdGluYXRpb24gZWxlbWVudCBpcyBhbHJlYWR5IHZpc2libGUgaW4gdGhlIHZpZXcgcG9ydC4gT3RoZXJ3aXNlIGl0IHdvdWxkIHNjcm9sbFxuICogdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzY3JvbGxhYmxlIGNvbnRyb2wgYW5kIHRyaWVzIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50XG4gKiBieSBzY3JvbGxpbmcgaXRzIHBhcmVudCB0byB0aGUgZW5kIHN0ZXAgYnkgc3RlcC4gVGhlIHNjcm9sbCBkaXJlY3Rpb24gKHZlcnRpY2FsIG9yIGhvcml6b250YWwpXG4gKiBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7U2Nyb2xsT3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudCwgZWxlbWVudElkLCAvLyBgZWxlbWVudGAgaXMgZGVwcmVjYXRlZCwgdXNlIGBlbGVtZW50SWRgIGluc3RlYWRcbiAgICBzdHJhdGVneSwgc2VsZWN0b3IsIG1heFN3aXBlc1xuICB9ID0gb3B0cztcbiAgaWYgKCFzdHJhdGVneSB8fCAhc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBCb3RoIHN0cmF0ZWd5IGFuZCBzZWxlY3RvciBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy90b3VjaC9zY3JvbGwnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCB8fCBlbGVtZW50KSxcbiAgICBwYXJhbXM6IHtzdHJhdGVneSwgc2VsZWN0b3IsIG1heFN3aXBlc30sXG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsTUFBTUEsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUduQixTQUFTQyxRQUFRLENBQUVDLE9BQU8sRUFBRTtFQUMxQixPQUFPQSxPQUFPLEdBQUdDLGFBQUksQ0FBQ0MsV0FBVyxDQUFDRCxhQUFJLENBQUNFLGFBQWEsQ0FBQ0gsT0FBTyxDQUFDLENBQUMsR0FBR0ksU0FB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
202
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3VwcG9ydCIsInJlcXVpcmUiLCJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9kcml2ZXIiLCJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUNsaWNrR2VzdHVyZSIsIm9wdHMiLCJlbGVtZW50SWQiLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJkdXJhdGlvbiIsIm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2dlc3R1cmVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cblxuZnVuY3Rpb24gdG9PcmlnaW4gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyB1dGlsLndyYXBFbGVtZW50KHV0aWwudW53cmFwRWxlbWVudChlbGVtZW50KSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHRvUG9pbnQgKHgsIHkpIHtcbiAgcmV0dXJuIF8uaXNGaW5pdGUoeCkgJiYgXy5pc0Zpbml0ZSh5KSA/IHt4LCB5fSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdG9SZWN0IChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIFtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHRdLnNvbWUoKHYpID0+ICFfLmlzRmluaXRlKHYpKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiB7bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0fTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGlja09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaWNrZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gYm90aCBjbGljayBvZmZzZXQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIG9mZnNldCBhcmUgcHJvdmlkZWQgdGhlbiB0aGUgY29vcmRpbmF0ZXNcbiAqIGFyZSBwYXJzZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNpbXBsZSBjbGljay90YXAgZ2VzdHVyZVxuICpcbiAqIEBwYXJhbSB7P0NsaWNrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVDbGlja0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDbGlja0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHgsIHksXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2NsaWNrJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIG9mZnNldDogdG9Qb2ludCh4LCB5KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvbmdDbGlja09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaWNrZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gYm90aCBjbGljayBvZmZzZXQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIG9mZnNldCBhcmUgcHJvdmlkZWQgdGhlbiB0aGUgY29vcmRpbmF0ZXNcbiAqIGFyZSBwYXJzZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGR1cmF0aW9uIFs1MDBdIC0gQ2xpY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxuICogVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGNsaWNrIHRoYXQgbGFzdHMgZm9yIHRoZSBnaXZlbiBkdXJhdGlvblxuICpcbiAqIEBwYXJhbSB7P0xvbmdDbGlja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlTG9uZ0NsaWNrR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUxvbmdDbGlja0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHgsIHksXG4gICAgZHVyYXRpb24sXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2xvbmdfY2xpY2snLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgb2Zmc2V0OiB0b1BvaW50KHgsIHkpLFxuICAgIGR1cmF0aW9uLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRG91YmxlQ2xpY2tPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBkb3VibGUgY2xpY2tlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbiBib3RoIGNsaWNrIG9mZnNldCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgb2Zmc2V0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb29yZGluYXRlc1xuICogYXJlIHBhcnNlZCBhcyByZWxhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gZG91YmxlIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGRvdWJsZSBjbGljayBvblxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBjbGljayB0aGF0IGxhc3RzIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb25cbiAqXG4gKiBAcGFyYW0gez9Eb3VibGVDbGlja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICB4LCB5LFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9kb3VibGVfY2xpY2snLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgb2Zmc2V0OiB0b1BvaW50KHgsIHkpLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRHJhZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGRyYWdnZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc3RhcnQgY29vcmRpbmF0ZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhlc2VcbiAqIGNvb3JkaW5hdGVzIGFyZSBjb25zaWRlcmVkIGFzIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgZWxlbWVudCBjb3JuZXIuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHN0YXJ0WCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIHN0YXJ0c1xuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzdGFydFkgLSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydHNcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gZW5kWCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIGVuZHNcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gZW5kWSAtIFRoZSB5IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIGVuZHNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzI1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybVxuICogdGhpcyBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIERyYWdzIHRoaXMgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHs/RHJhZ09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlRHJhZ0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEcmFnR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgc3RhcnRYLCBzdGFydFksXG4gICAgZW5kWCwgZW5kWSxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZHJhZycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBzdGFydDogdG9Qb2ludChzdGFydFgsIHN0YXJ0WSksXG4gICAgZW5kOiB0b1BvaW50KGVuZFgsIGVuZFkpLFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRmxpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBmbGluZ2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIGZsaW5nIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBmbGluZyBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoaXNcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBmbGluZy5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs3NTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpc1xuICogZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIGZsaW5nXG4gKiB2ZWxvY2l0eSBmb3IgdGhlIGdpdmVuIHZpZXcgKDUwIGJ5IGRlZmF1bHQpXG4gKi9cblxuLyoqXG4gKiBEcmFncyB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7P0ZsaW5nT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBjYW4gc3RpbGwgc2Nyb2xsIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUZsaW5nR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZsaW5nR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZmxpbmcnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGluY2hPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBwaW5jaGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHBpbmNoIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHBpbmNoIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgcGluY2ggYXJlYSBzaXplLlxuICogVmFsaWQgdmFsdWVzIG11c3QgYmUgZmxvYXQgbnVtYmVycyBpbiByYW5nZSAwLi4xLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbMjUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtXG4gKiB0aGlzIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBwaW5jaCBjbG9zZSBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1BpbmNoT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVQaW5jaENsb3NlR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvcGluY2hfY2xvc2UnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgcGluY2ggb3BlbiBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1BpbmNoT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVQaW5jaE9wZW5HZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2hPcGVuR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3BpbmNoX29wZW4nLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3aXBlT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgc3dpcGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHN3aXBlIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIHN3aXBlLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOiBgdXBgLCBgZG93bmAsIGBsZWZ0YCBhbmQgYHJpZ2h0YCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBzd2lwZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHN3aXBlIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgaW4gcmFuZ2UgMC4uMSwgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzUwMDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybSB0aGlzXG4gKiBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc3dpcGUgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9Td2lwZU9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU3dpcGVHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3dpcGVHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3N3aXBlJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgc2Nyb2xsZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gc2Nyb2xsIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGlzXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIHNjcm9sbC5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgc2Nyb2xsIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgc2Nyb2xsaW5nIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgZ3JlYXRlciB0aGFuIHplcm8sIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs1MDAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpcyBnZXN0dXJlXG4gKiBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNjcm9sbCBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1Njcm9sbE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgY2FuIHN0aWxsIHNjcm9sbCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxuICovXG5jb21tYW5kcy5tb2JpbGVTY3JvbGxHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2Nyb2xsR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9zY3JvbGwnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JvbGxFbGVtZW50VG9FbGVtZW50T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGVsZW1lbnRJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQuIEl0IGlzIHJlcXVpcmVkIHRoaXMgZWxlbWVudFxuICogaXMgYSB2YWxpZCBzY3JvbGxhYmxlIGNvbnRhaW5lciBhbmQgaXQgd2FzIGxvY2F0ZWQgYnkgYC1hbmRyb2lkIHVpYXV0b21hdG9yYFxuICogc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWxlbWVudFRvSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0sIHdoaWNoIGJlbG9uZ3NcbiAqIHRvIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQgYWJvdmUsIGFuZCB3aGljaCBzaG91bGQgYmVjb21lIHZpc2libGUgYWZ0ZXJcbiAqIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmAgc3RyYXRlZ3kuXG4gKi9cblxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBzY3JvbGxhYmxlIGVsZW1lbnQgYGVsZW1lbnRJZGAgdW50aWwgYGVsZW1lbnRUb0lkYFxuICogYmVjb21lcyB2aXNpYmxlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlIGBlbGVtZW50VG9JZGBcbiAqIGlzIGFscmVhZHkgdmlzaWJsZSBpbiB0aGUgdmlldyBwb3J0LiBPdGhlcndpc2UgaXQgd291bGQgc2Nyb2xsXG4gKiB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGFibGUgY29udHJvbCBhbmQgdHJpZXMgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnRcbiAqIGJ5IHNjcm9sbGluZyBpdHMgcGFyZW50IHRvIHRoZSBlbmQgc3RlcCBieSBzdGVwLiBUaGUgc2Nyb2xsIGRpcmVjdGlvbiAodmVydGljYWwgb3IgaG9yaXpvbnRhbClcbiAqIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHtTY3JvbGxFbGVtZW50VG9FbGVtZW50T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsQmFja1RvID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudElkLCBlbGVtZW50VG9JZH0gPSBvcHRzO1xuICBpZiAoIWVsZW1lbnRJZCB8fCAhZWxlbWVudFRvSWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBCb3RoIGVsZW1lbnRJZCBhbmQgZWxlbWVudFRvSWQgYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKFxuICAgIGAvYXBwaXVtL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudElkKX0vc2Nyb2xsX3RvLyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnRUb0lkKX1gLCAnUE9TVCcsIHt9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsT3B0c1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgVGhlIGlkZW50aWZpZXIgb2YgYW4gZWxlbWVudC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiBpcyBhIHZhbGlkIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBpdCB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgXG4gKiBzdHJhdGVneS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJvdmlkZWQgdGhlbiB0aGUgZmlyc3QgY3VycmVudGx5IGF2YWlsYWJsZSBzY3JvbGxhYmxlIHZpZXdcbiAqIGlzIHNlbGVjdGVkIGZvciB0aGUgaW50ZXJhY3Rpb24uXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHN0cmF0ZWd5IFRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkOlxuICogLSBgYWNjZXNzaWJpbGl0eSBpZGAgKFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbilcbiAqIC0gYGNsYXNzIG5hbWVgIChVaVNlbGVjdG9yKCkuY2xhc3NOYW1lKVxuICogLSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgIChVaVNlbGVjdG9yKVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBzZWxlY3RvciBUaGUgY29ycmVzcG9uZGluZyBsb29rdXAgdmFsdWUgZm9yIHRoZSBnaXZlblxuICogc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IG1heFN3aXBlcyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dpcGVzIHRvIHBlcmZvcm1cbiAqIG9uIHRoZSB0YXJnZXQgc2Nyb2xsYWJsZSB2aWV3IGluIG9yZGVyIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50LlxuICogSW4gY2FzZSB0aGlzIHZhbHVlIGlzIHVuc2V0IHRoZW4gaXQgd291bGQgYmUgcmV0cmlldmVkIGZyb20gdGhlIHNjcm9sbGFibGVcbiAqIGVsZW1lbnQgaXRzZWxmICh2dWEgYGdldE1heFNlYXJjaFN3aXBlcygpYCBwcm9wZXJ0eSkuXG4gKi9cblxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBzY3JvbGxhYmxlIGVsZW1lbnQgdW50aWwgdGhlIGVsZW1lbnQgaWRlbnRpZmllZFxuICogYnkgYHN0cmF0ZWd5YCBhbmQgYHNlbGVjdG9yYCBiZWNvbWVzIHZpc2libGUuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGVcbiAqIGRlc3RpbmF0aW9uIGVsZW1lbnQgaXMgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSB2aWV3IHBvcnQuIE90aGVyd2lzZSBpdCB3b3VsZCBzY3JvbGxcbiAqIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgc2Nyb2xsYWJsZSBjb250cm9sIGFuZCB0cmllcyB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gZWxlbWVudFxuICogYnkgc2Nyb2xsaW5nIGl0cyBwYXJlbnQgdG8gdGhlIGVuZCBzdGVwIGJ5IHN0ZXAuIFRoZSBzY3JvbGwgZGlyZWN0aW9uICh2ZXJ0aWNhbCBvciBob3Jpem9udGFsKVxuICogaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge1Njcm9sbE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbCA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnQsIGVsZW1lbnRJZCwgLy8gYGVsZW1lbnRgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZWxlbWVudElkYCBpbnN0ZWFkXG4gICAgc3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXNcbiAgfSA9IG9wdHM7XG4gIGlmICghc3RyYXRlZ3kgfHwgIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgQm90aCBzdHJhdGVneSBhbmQgc2VsZWN0b3IgYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvdG91Y2gvc2Nyb2xsJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQgfHwgZWxlbWVudCksXG4gICAgcGFyYW1zOiB7c3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXN9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElB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
@@ -1 +1 @@
1
- {"version":3,"file":"gestures.js","names":["commands","toOrigin","element","util","wrapElement","unwrapElement","undefined","toPoint","x","y","_","isFinite","toRect","left","top","width","height","some","v","mobileClickGesture","opts","elementId","uiautomator2","jwproxy","command","origin","offset","mobileLongClickGesture","duration","mobileDoubleClickGesture","mobileDragGesture","startX","startY","endX","endY","speed","start","end","mobileFlingGesture","direction","area","mobilePinchCloseGesture","percent","mobilePinchOpenGesture","mobileSwipeGesture","mobileScrollGesture","mobileScrollBackTo","elementToId","errors","InvalidArgumentError","mobileScroll","strategy","selector","maxSwipes","params"],"sources":["../../../lib/commands/gestures.js"],"sourcesContent":["import { util } from 'appium/support';\nimport _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst commands = {};\n\n\nfunction toOrigin (element) {\n return element ? util.wrapElement(util.unwrapElement(element)) : undefined;\n}\n\nfunction toPoint (x, y) {\n return _.isFinite(x) && _.isFinite(y) ? {x, y} : undefined;\n}\n\nfunction toRect (left, top, width, height) {\n return [left, top, width, height].some((v) => !_.isFinite(v))\n ? undefined\n : {left, top, width, height};\n}\n\n/**\n * @typedef {Object} ClickOptions\n * @property {?string} elementId - The id of the element to be clicked.\n * If the element is missing then both click offset coordinates must be provided.\n * If both the element id and offset are provided then the coordinates\n * are parsed as relative offsets from the top left corner of the element.\n * @property {?number} x - The x coordinate to click on\n * @property {?number} y - The y coordinate to click on\n */\n\n/**\n * Performs a simple click/tap gesture\n *\n * @param {?ClickOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileClickGesture = async function mobileClickGesture (opts = {}) {\n const {\n elementId,\n x, y,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/click', 'POST', {\n origin: toOrigin(elementId),\n offset: toPoint(x, y),\n });\n};\n\n/**\n * @typedef {Object} LongClickOptions\n * @property {?string} elementId - The id of the element to be clicked.\n * If the element is missing then both click offset coordinates must be provided.\n * If both the element id and offset are provided then the coordinates\n * are parsed as relative offsets from the top left corner of the element.\n * @property {?number} x - The x coordinate to click on\n * @property {?number} y - The y coordinate to click on\n * @property {?number} duration [500] - Click duration in milliseconds.\n * The value must not be negative\n */\n\n/**\n * Performs a click that lasts for the given duration\n *\n * @param {?LongClickOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileLongClickGesture = async function mobileLongClickGesture (opts = {}) {\n const {\n elementId,\n x, y,\n duration,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/long_click', 'POST', {\n origin: toOrigin(elementId),\n offset: toPoint(x, y),\n duration,\n });\n};\n\n/**\n * @typedef {Object} DoubleClickOptions\n * @property {?string} elementId - The id of the element to be double clicked.\n * If the element is missing then both click offset coordinates must be provided.\n * If both the element id and offset are provided then the coordinates\n * are parsed as relative offsets from the top left corner of the element.\n * @property {?number} x - The x coordinate to double click on\n * @property {?number} y - The y coordinate to double click on\n */\n\n/**\n * Performs a click that lasts for the given duration\n *\n * @param {?DoubleClickOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileDoubleClickGesture = async function mobileDoubleClickGesture (opts = {}) {\n const {\n elementId,\n x, y,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/double_click', 'POST', {\n origin: toOrigin(elementId),\n offset: toPoint(x, y),\n });\n};\n\n/**\n * @typedef {Object} DragOptions\n * @property {?string} elementId - The id of the element to be dragged.\n * If the element id is missing then the start coordinates must be provided.\n * If both the element id and the start coordinates are provided then these\n * coordinates are considered as offsets from the top left element corner.\n * @property {?number} startX - The x coordinate where the dragging starts\n * @property {?number} startY - The y coordinate where the dragging starts\n * @property {!number} endX - The x coordinate where the dragging ends\n * @property {!number} endY - The y coordinate where the dragging ends\n * @property {?number} speed [2500 * displayDensity] - The speed at which to perform\n * this gesture in pixels per second. The value must not be negative\n */\n\n/**\n * Drags this object to the specified location.\n *\n * @param {?DragOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileDragGesture = async function mobileDragGesture (opts = {}) {\n const {\n elementId,\n startX, startY,\n endX, endY,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/drag', 'POST', {\n origin: toOrigin(elementId),\n start: toPoint(startX, startY),\n end: toPoint(endX, endY),\n speed,\n });\n};\n\n/**\n * @typedef {Object} FlingOptions\n * @property {?string} elementId - The id of the element to be flinged.\n * If the element id is missing then fling bounding area must be provided.\n * If both the element id and the fling bounding area are provided then this\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the fling bounding area\n * @property {?number} top - The top coordinate of the fling bounding area\n * @property {?number} width - The width of the fling bounding area\n * @property {?number} height - The height of the fling bounding area\n * @property {!string} direction - Direction of the fling.\n * Acceptable values are: `up`, `down`, `left` and `right` (case insensitive)\n * @property {?number} speed [7500 * displayDensity] - The speed at which to perform this\n * gesture in pixels per second. The value must be greater than the minimum fling\n * velocity for the given view (50 by default)\n */\n\n/**\n * Drags to the specified location.\n *\n * @param {?FlingOptions} opts\n * @throws {Error} if provided options are not valid\n * @returns {boolean} True if the object can still scroll in the given direction.\n */\ncommands.mobileFlingGesture = async function mobileFlingGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n direction,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/fling', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n direction,\n speed,\n });\n};\n\n/**\n * @typedef {Object} PinchOptions\n * @property {?string} elementId - The id of the element to be pinched.\n * If the element id is missing then pinch bounding area must be provided.\n * If both the element id and the pinch bounding area are provided then the\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the pinch bounding area\n * @property {?number} top - The top coordinate of the pinch bounding area\n * @property {?number} width - The width of the pinch bounding area\n * @property {?number} height - The height of the pinch bounding area\n * @property {!number} percent - The size of the pinch as a percentage of the pinch area size.\n * Valid values must be float numbers in range 0..1, where 1.0 is 100%\n * @property {?number} speed [2500 * displayDensity] - The speed at which to perform\n * this gesture in pixels per second. The value must not be negative\n */\n\n/**\n * Performs a pinch close gesture.\n *\n * @param {?PinchOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobilePinchCloseGesture = async function mobilePinchCloseGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/pinch_close', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n percent,\n speed,\n });\n};\n\n/**\n * Performs a pinch open gesture.\n *\n * @param {?PinchOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobilePinchOpenGesture = async function mobilePinchOpenGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/pinch_open', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n percent,\n speed,\n });\n};\n\n/**\n * @typedef {Object} SwipeOptions\n * @property {?string} elementId - The id of the element to be swiped.\n * If the element id is missing then swipe bounding area must be provided.\n * If both the element id and the swipe bounding area are provided then the\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the swipe bounding area\n * @property {?number} top - The top coordinate of the swipe bounding area\n * @property {?number} width - The width of the swipe bounding area\n * @property {?number} height - The height of the swipe bounding area\n * @property {!string} direction - Direction of the swipe.\n * Acceptable values are: `up`, `down`, `left` and `right` (case insensitive)\n * @property {!number} percent - The size of the swipe as a percentage of the swipe area size.\n * Valid values must be float numbers in range 0..1, where 1.0 is 100%\n * @property {?number} speed [5000 * displayDensity] - The speed at which to perform this\n * gesture in pixels per second. The value must not be negative\n */\n\n/**\n * Performs a swipe gesture.\n *\n * @param {?SwipeOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileSwipeGesture = async function mobileSwipeGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n direction,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/swipe', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n direction,\n percent,\n speed,\n });\n};\n\n/**\n * @typedef {Object} ScrollOptions\n * @property {?string} elementId - The id of the element to be scrolled.\n * If the element id is missing then scroll bounding area must be provided.\n * If both the element id and the scroll bounding area are provided then this\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the scroll bounding area\n * @property {?number} top - The top coordinate of the scroll bounding area\n * @property {?number} width - The width of the scroll bounding area\n * @property {?number} height - The height of the scroll bounding area\n * @property {!string} direction - Direction of the scroll.\n * Acceptable values are: `up`, `down`, `left` and `right` (case insensitive)\n * @property {!number} percent - The size of the scroll as a percentage of the scrolling area size.\n * Valid values must be float numbers greater than zero, where 1.0 is 100%\n * @property {?number} speed [5000 * displayDensity] - The speed at which to perform this gesture\n * in pixels per second. The value must not be negative\n */\n\n/**\n * Performs a scroll gesture.\n *\n * @param {?ScrollOptions} opts\n * @throws {Error} if provided options are not valid\n * @returns {boolean} True if the object can still scroll in the given direction.\n */\ncommands.mobileScrollGesture = async function mobileScrollGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n direction,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/scroll', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n direction,\n percent,\n speed,\n });\n};\n\n/**\n * @typedef {Object} ScrollElementToElementOpts\n * @property {string} elementId The identifier of the scrollable element,\n * which is going to be scrolled. It is required this element\n * is a valid scrollable container and it was located by `-android uiautomator`\n * strategy.\n * @property {string} elementToId The identifier of the item, which belongs\n * to the scrollable element above, and which should become visible after\n * the scrolling operation is finished. It is required this element\n * was located by `-android uiautomator` strategy.\n */\n\n/**\n * Scrolls the given scrollable element `elementId` until `elementToId`\n * becomes visible. This function returns immediately if the `elementToId`\n * is already visible in the view port. Otherwise it would scroll\n * to the very beginning of the scrollable control and tries to reach the destination element\n * by scrolling its parent to the end step by step. The scroll direction (vertical or horizontal)\n * is detected automatically.\n *\n * @param {ScrollElementToElementOpts} opts\n * @throws {Error} if the scrolling operation cannot be performed\n */\ncommands.mobileScrollBackTo = async function (opts = {}) {\n const {elementId, elementToId} = opts;\n if (!elementId || !elementToId) {\n throw new errors.InvalidArgumentError(`Both elementId and elementToId arguments must be provided`);\n }\n return await this.uiautomator2.jwproxy.command(\n `/appium/element/${util.unwrapElement(elementId)}/scroll_to/${util.unwrapElement(elementToId)}`, 'POST', {});\n};\n\n/**\n * @typedef {Object} ScrollOpts\n * @property {?string} elementId The identifier of an element. It is required this element\n * is a valid scrollable container and it was located by `-android uiautomator`\n * strategy. If this property is not provided then the first currently available scrollable view\n * is selected for the interaction.\n * @property {!string} strategy The following strategies are supported:\n * - `accessibility id` (UiSelector().description)\n * - `class name` (UiSelector().className)\n * - `-android uiautomator` (UiSelector)\n * @property {!string} selector The corresponding lookup value for the given\n * strategy.\n * @property {?number} maxSwipes The maximum number of swipes to perform\n * on the target scrollable view in order to reach the destination element.\n * In case this value is unset then it would be retrieved from the scrollable\n * element itself (vua `getMaxSearchSwipes()` property).\n */\n\n/**\n * Scrolls the given scrollable element until the element identified\n * by `strategy` and `selector` becomes visible. This function returns immediately if the\n * destination element is already visible in the view port. Otherwise it would scroll\n * to the very beginning of the scrollable control and tries to reach the destination element\n * by scrolling its parent to the end step by step. The scroll direction (vertical or horizontal)\n * is detected automatically.\n *\n * @param {ScrollOpts} opts\n * @throws {Error} if the scrolling operation cannot be performed\n */\ncommands.mobileScroll = async function (opts = {}) {\n const {\n element, elementId, // `element` is deprecated, use `elementId` instead\n strategy, selector, maxSwipes\n } = opts;\n if (!strategy || !selector) {\n throw new errors.InvalidArgumentError(`Both strategy and selector arguments must be provided`);\n }\n return await this.uiautomator2.jwproxy.command('/touch/scroll', 'POST', {\n origin: toOrigin(elementId || element),\n params: {strategy, selector, maxSwipes},\n });\n};\n\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAEA,MAAMA,QAAQ,GAAG,CAAC,CAAC;AAGnB,SAASC,QAAQ,CAAEC,OAAO,EAAE;EAC1B,OAAOA,OAAO,GAAGC,aAAI,CAACC,WAAW,CAACD,aAAI,CAACE,aAAa,CAACH,OAAO,CAAC,CAAC,GAAGI,SAAS;AAC5E;AAEA,SAASC,OAAO,CAAEC,CAAC,EAAEC,CAAC,EAAE;EACtB,OAAOC,eAAC,CAACC,QAAQ,CAACH,CAAC,CAAC,IAAIE,eAAC,CAACC,QAAQ,CAACF,CAAC,CAAC,GAAG;IAACD,CAAC;IAAEC;EAAC,CAAC,GAAGH,SAAS;AAC5D;AAEA,SAASM,MAAM,CAAEC,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,EAAE;EACzC,OAAO,CAACH,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC,CAACC,IAAI,CAAEC,CAAC,IAAK,CAACR,eAAC,CAACC,QAAQ,CAACO,CAAC,CAAC,CAAC,GACzDZ,SAAS,GACT;IAACO,IAAI;IAAEC,GAAG;IAAEC,KAAK;IAAEC;EAAM,CAAC;AAChC;AAkBAhB,QAAQ,CAACmB,kBAAkB,GAAG,eAAeA,kBAAkB,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAC1E,MAAM;IACJC,SAAS;IACTb,CAAC;IAAEC;EACL,CAAC,GAAGW,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,wBAAwB,EAAE,MAAM,EAAE;IAC/EC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BK,MAAM,EAAEnB,OAAO,CAACC,CAAC,EAAEC,CAAC;EACtB,CAAC,CAAC;AACJ,CAAC;AAoBDT,QAAQ,CAAC2B,sBAAsB,GAAG,eAAeA,sBAAsB,CAAEP,IAAI,GAAG,CAAC,CAAC,EAAE;EAClF,MAAM;IACJC,SAAS;IACTb,CAAC;IAAEC,CAAC;IACJmB;EACF,CAAC,GAAGR,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,6BAA6B,EAAE,MAAM,EAAE;IACpFC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BK,MAAM,EAAEnB,OAAO,CAACC,CAAC,EAAEC,CAAC,CAAC;IACrBmB;EACF,CAAC,CAAC;AACJ,CAAC;AAkBD5B,QAAQ,CAAC6B,wBAAwB,GAAG,eAAeA,wBAAwB,CAAET,IAAI,GAAG,CAAC,CAAC,EAAE;EACtF,MAAM;IACJC,SAAS;IACTb,CAAC;IAAEC;EACL,CAAC,GAAGW,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,+BAA+B,EAAE,MAAM,EAAE;IACtFC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BK,MAAM,EAAEnB,OAAO,CAACC,CAAC,EAAEC,CAAC;EACtB,CAAC,CAAC;AACJ,CAAC;AAsBDT,QAAQ,CAAC8B,iBAAiB,GAAG,eAAeA,iBAAiB,CAAEV,IAAI,GAAG,CAAC,CAAC,EAAE;EACxE,MAAM;IACJC,SAAS;IACTU,MAAM;IAAEC,MAAM;IACdC,IAAI;IAAEC,IAAI;IACVC;EACF,CAAC,GAAGf,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,uBAAuB,EAAE,MAAM,EAAE;IAC9EC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3Be,KAAK,EAAE7B,OAAO,CAACwB,MAAM,EAAEC,MAAM,CAAC;IAC9BK,GAAG,EAAE9B,OAAO,CAAC0B,IAAI,EAAEC,IAAI,CAAC;IACxBC;EACF,CAAC,CAAC;AACJ,CAAC;AA0BDnC,QAAQ,CAACsC,kBAAkB,GAAG,eAAeA,kBAAkB,CAAElB,IAAI,GAAG,CAAC,CAAC,EAAE;EAC1E,MAAM;IACJC,SAAS;IACTR,IAAI;IAAEC,GAAG;IAAEC,KAAK;IAAEC,MAAM;IACxBuB,SAAS;IACTJ;EACF,CAAC,GAAGf,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,wBAAwB,EAAE,MAAM,EAAE;IAC/EC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BmB,IAAI,EAAE5B,MAAM,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC;IACtCuB,SAAS;IACTJ;EACF,CAAC,CAAC;AACJ,CAAC;AAwBDnC,QAAQ,CAACyC,uBAAuB,GAAG,eAAeA,uBAAuB,CAAErB,IAAI,GAAG,CAAC,CAAC,EAAE;EACpF,MAAM;IACJC,SAAS;IACTR,IAAI;IAAEC,GAAG;IAAEC,KAAK;IAAEC,MAAM;IACxB0B,OAAO;IACPP;EACF,CAAC,GAAGf,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,8BAA8B,EAAE,MAAM,EAAE;IACrFC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BmB,IAAI,EAAE5B,MAAM,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC;IACtC0B,OAAO;IACPP;EACF,CAAC,CAAC;AACJ,CAAC;AAQDnC,QAAQ,CAAC2C,sBAAsB,GAAG,eAAeA,sBAAsB,CAAEvB,IAAI,GAAG,CAAC,CAAC,EAAE;EAClF,MAAM;IACJC,SAAS;IACTR,IAAI;IAAEC,GAAG;IAAEC,KAAK;IAAEC,MAAM;IACxB0B,OAAO;IACPP;EACF,CAAC,GAAGf,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,6BAA6B,EAAE,MAAM,EAAE;IACpFC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BmB,IAAI,EAAE5B,MAAM,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC;IACtC0B,OAAO;IACPP;EACF,CAAC,CAAC;AACJ,CAAC;AA0BDnC,QAAQ,CAAC4C,kBAAkB,GAAG,eAAeA,kBAAkB,CAAExB,IAAI,GAAG,CAAC,CAAC,EAAE;EAC1E,MAAM;IACJC,SAAS;IACTR,IAAI;IAAEC,GAAG;IAAEC,KAAK;IAAEC,MAAM;IACxBuB,SAAS;IACTG,OAAO;IACPP;EACF,CAAC,GAAGf,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,wBAAwB,EAAE,MAAM,EAAE;IAC/EC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BmB,IAAI,EAAE5B,MAAM,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC;IACtCuB,SAAS;IACTG,OAAO;IACPP;EACF,CAAC,CAAC;AACJ,CAAC;AA2BDnC,QAAQ,CAAC6C,mBAAmB,GAAG,eAAeA,mBAAmB,CAAEzB,IAAI,GAAG,CAAC,CAAC,EAAE;EAC5E,MAAM;IACJC,SAAS;IACTR,IAAI;IAAEC,GAAG;IAAEC,KAAK;IAAEC,MAAM;IACxBuB,SAAS;IACTG,OAAO;IACPP;EACF,CAAC,GAAGf,IAAI;EACR,OAAO,MAAM,IAAI,CAACE,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,yBAAyB,EAAE,MAAM,EAAE;IAChFC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,CAAC;IAC3BmB,IAAI,EAAE5B,MAAM,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC;IACtCuB,SAAS;IACTG,OAAO;IACPP;EACF,CAAC,CAAC;AACJ,CAAC;AAyBDnC,QAAQ,CAAC8C,kBAAkB,GAAG,gBAAgB1B,IAAI,GAAG,CAAC,CAAC,EAAE;EACvD,MAAM;IAACC,SAAS;IAAE0B;EAAW,CAAC,GAAG3B,IAAI;EACrC,IAAI,CAACC,SAAS,IAAI,CAAC0B,WAAW,EAAE;IAC9B,MAAM,IAAIC,cAAM,CAACC,oBAAoB,CAAE,2DAA0D,CAAC;EACpG;EACA,OAAO,MAAM,IAAI,CAAC3B,YAAY,CAACC,OAAO,CAACC,OAAO,CAC3C,mBAAkBrB,aAAI,CAACE,aAAa,CAACgB,SAAS,CAAE,cAAalB,aAAI,CAACE,aAAa,CAAC0C,WAAW,CAAE,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC;AA+BD/C,QAAQ,CAACkD,YAAY,GAAG,gBAAgB9B,IAAI,GAAG,CAAC,CAAC,EAAE;EACjD,MAAM;IACJlB,OAAO;IAAEmB,SAAS;IAClB8B,QAAQ;IAAEC,QAAQ;IAAEC;EACtB,CAAC,GAAGjC,IAAI;EACR,IAAI,CAAC+B,QAAQ,IAAI,CAACC,QAAQ,EAAE;IAC1B,MAAM,IAAIJ,cAAM,CAACC,oBAAoB,CAAE,uDAAsD,CAAC;EAChG;EACA,OAAO,MAAM,IAAI,CAAC3B,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE;IACtEC,MAAM,EAAExB,QAAQ,CAACoB,SAAS,IAAInB,OAAO,CAAC;IACtCoD,MAAM,EAAE;MAACH,QAAQ;MAAEC,QAAQ;MAAEC;IAAS;EACxC,CAAC,CAAC;AACJ,CAAC;AAAC,eAEarD,QAAQ;AAAA"}
1
+ {"version":3,"file":"gestures.js","names":["_support","require","_lodash","_interopRequireDefault","_driver","commands","toOrigin","element","util","wrapElement","unwrapElement","undefined","toPoint","x","y","_","isFinite","toRect","left","top","width","height","some","v","mobileClickGesture","opts","elementId","uiautomator2","jwproxy","command","origin","offset","mobileLongClickGesture","duration","mobileDoubleClickGesture","mobileDragGesture","startX","startY","endX","endY","speed","start","end","mobileFlingGesture","direction","area","mobilePinchCloseGesture","percent","mobilePinchOpenGesture","mobileSwipeGesture","mobileScrollGesture","mobileScrollBackTo","elementToId","errors","InvalidArgumentError","mobileScroll","strategy","selector","maxSwipes","params","_default","exports","default"],"sources":["../../../lib/commands/gestures.js"],"sourcesContent":["import { util } from 'appium/support';\nimport _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst commands = {};\n\n\nfunction toOrigin (element) {\n return element ? util.wrapElement(util.unwrapElement(element)) : undefined;\n}\n\nfunction toPoint (x, y) {\n return _.isFinite(x) && _.isFinite(y) ? {x, y} : undefined;\n}\n\nfunction toRect (left, top, width, height) {\n return [left, top, width, height].some((v) => !_.isFinite(v))\n ? undefined\n : {left, top, width, height};\n}\n\n/**\n * @typedef {Object} ClickOptions\n * @property {?string} elementId - The id of the element to be clicked.\n * If the element is missing then both click offset coordinates must be provided.\n * If both the element id and offset are provided then the coordinates\n * are parsed as relative offsets from the top left corner of the element.\n * @property {?number} x - The x coordinate to click on\n * @property {?number} y - The y coordinate to click on\n */\n\n/**\n * Performs a simple click/tap gesture\n *\n * @param {?ClickOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileClickGesture = async function mobileClickGesture (opts = {}) {\n const {\n elementId,\n x, y,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/click', 'POST', {\n origin: toOrigin(elementId),\n offset: toPoint(x, y),\n });\n};\n\n/**\n * @typedef {Object} LongClickOptions\n * @property {?string} elementId - The id of the element to be clicked.\n * If the element is missing then both click offset coordinates must be provided.\n * If both the element id and offset are provided then the coordinates\n * are parsed as relative offsets from the top left corner of the element.\n * @property {?number} x - The x coordinate to click on\n * @property {?number} y - The y coordinate to click on\n * @property {?number} duration [500] - Click duration in milliseconds.\n * The value must not be negative\n */\n\n/**\n * Performs a click that lasts for the given duration\n *\n * @param {?LongClickOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileLongClickGesture = async function mobileLongClickGesture (opts = {}) {\n const {\n elementId,\n x, y,\n duration,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/long_click', 'POST', {\n origin: toOrigin(elementId),\n offset: toPoint(x, y),\n duration,\n });\n};\n\n/**\n * @typedef {Object} DoubleClickOptions\n * @property {?string} elementId - The id of the element to be double clicked.\n * If the element is missing then both click offset coordinates must be provided.\n * If both the element id and offset are provided then the coordinates\n * are parsed as relative offsets from the top left corner of the element.\n * @property {?number} x - The x coordinate to double click on\n * @property {?number} y - The y coordinate to double click on\n */\n\n/**\n * Performs a click that lasts for the given duration\n *\n * @param {?DoubleClickOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileDoubleClickGesture = async function mobileDoubleClickGesture (opts = {}) {\n const {\n elementId,\n x, y,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/double_click', 'POST', {\n origin: toOrigin(elementId),\n offset: toPoint(x, y),\n });\n};\n\n/**\n * @typedef {Object} DragOptions\n * @property {?string} elementId - The id of the element to be dragged.\n * If the element id is missing then the start coordinates must be provided.\n * If both the element id and the start coordinates are provided then these\n * coordinates are considered as offsets from the top left element corner.\n * @property {?number} startX - The x coordinate where the dragging starts\n * @property {?number} startY - The y coordinate where the dragging starts\n * @property {!number} endX - The x coordinate where the dragging ends\n * @property {!number} endY - The y coordinate where the dragging ends\n * @property {?number} speed [2500 * displayDensity] - The speed at which to perform\n * this gesture in pixels per second. The value must not be negative\n */\n\n/**\n * Drags this object to the specified location.\n *\n * @param {?DragOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileDragGesture = async function mobileDragGesture (opts = {}) {\n const {\n elementId,\n startX, startY,\n endX, endY,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/drag', 'POST', {\n origin: toOrigin(elementId),\n start: toPoint(startX, startY),\n end: toPoint(endX, endY),\n speed,\n });\n};\n\n/**\n * @typedef {Object} FlingOptions\n * @property {?string} elementId - The id of the element to be flinged.\n * If the element id is missing then fling bounding area must be provided.\n * If both the element id and the fling bounding area are provided then this\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the fling bounding area\n * @property {?number} top - The top coordinate of the fling bounding area\n * @property {?number} width - The width of the fling bounding area\n * @property {?number} height - The height of the fling bounding area\n * @property {!string} direction - Direction of the fling.\n * Acceptable values are: `up`, `down`, `left` and `right` (case insensitive)\n * @property {?number} speed [7500 * displayDensity] - The speed at which to perform this\n * gesture in pixels per second. The value must be greater than the minimum fling\n * velocity for the given view (50 by default)\n */\n\n/**\n * Drags to the specified location.\n *\n * @param {?FlingOptions} opts\n * @throws {Error} if provided options are not valid\n * @returns {boolean} True if the object can still scroll in the given direction.\n */\ncommands.mobileFlingGesture = async function mobileFlingGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n direction,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/fling', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n direction,\n speed,\n });\n};\n\n/**\n * @typedef {Object} PinchOptions\n * @property {?string} elementId - The id of the element to be pinched.\n * If the element id is missing then pinch bounding area must be provided.\n * If both the element id and the pinch bounding area are provided then the\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the pinch bounding area\n * @property {?number} top - The top coordinate of the pinch bounding area\n * @property {?number} width - The width of the pinch bounding area\n * @property {?number} height - The height of the pinch bounding area\n * @property {!number} percent - The size of the pinch as a percentage of the pinch area size.\n * Valid values must be float numbers in range 0..1, where 1.0 is 100%\n * @property {?number} speed [2500 * displayDensity] - The speed at which to perform\n * this gesture in pixels per second. The value must not be negative\n */\n\n/**\n * Performs a pinch close gesture.\n *\n * @param {?PinchOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobilePinchCloseGesture = async function mobilePinchCloseGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/pinch_close', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n percent,\n speed,\n });\n};\n\n/**\n * Performs a pinch open gesture.\n *\n * @param {?PinchOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobilePinchOpenGesture = async function mobilePinchOpenGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/pinch_open', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n percent,\n speed,\n });\n};\n\n/**\n * @typedef {Object} SwipeOptions\n * @property {?string} elementId - The id of the element to be swiped.\n * If the element id is missing then swipe bounding area must be provided.\n * If both the element id and the swipe bounding area are provided then the\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the swipe bounding area\n * @property {?number} top - The top coordinate of the swipe bounding area\n * @property {?number} width - The width of the swipe bounding area\n * @property {?number} height - The height of the swipe bounding area\n * @property {!string} direction - Direction of the swipe.\n * Acceptable values are: `up`, `down`, `left` and `right` (case insensitive)\n * @property {!number} percent - The size of the swipe as a percentage of the swipe area size.\n * Valid values must be float numbers in range 0..1, where 1.0 is 100%\n * @property {?number} speed [5000 * displayDensity] - The speed at which to perform this\n * gesture in pixels per second. The value must not be negative\n */\n\n/**\n * Performs a swipe gesture.\n *\n * @param {?SwipeOptions} opts\n * @throws {Error} if provided options are not valid\n */\ncommands.mobileSwipeGesture = async function mobileSwipeGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n direction,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/swipe', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n direction,\n percent,\n speed,\n });\n};\n\n/**\n * @typedef {Object} ScrollOptions\n * @property {?string} elementId - The id of the element to be scrolled.\n * If the element id is missing then scroll bounding area must be provided.\n * If both the element id and the scroll bounding area are provided then this\n * area is effectively ignored.\n * @property {?number} left - The left coordinate of the scroll bounding area\n * @property {?number} top - The top coordinate of the scroll bounding area\n * @property {?number} width - The width of the scroll bounding area\n * @property {?number} height - The height of the scroll bounding area\n * @property {!string} direction - Direction of the scroll.\n * Acceptable values are: `up`, `down`, `left` and `right` (case insensitive)\n * @property {!number} percent - The size of the scroll as a percentage of the scrolling area size.\n * Valid values must be float numbers greater than zero, where 1.0 is 100%\n * @property {?number} speed [5000 * displayDensity] - The speed at which to perform this gesture\n * in pixels per second. The value must not be negative\n */\n\n/**\n * Performs a scroll gesture.\n *\n * @param {?ScrollOptions} opts\n * @throws {Error} if provided options are not valid\n * @returns {boolean} True if the object can still scroll in the given direction.\n */\ncommands.mobileScrollGesture = async function mobileScrollGesture (opts = {}) {\n const {\n elementId,\n left, top, width, height,\n direction,\n percent,\n speed,\n } = opts;\n return await this.uiautomator2.jwproxy.command('/appium/gestures/scroll', 'POST', {\n origin: toOrigin(elementId),\n area: toRect(left, top, width, height),\n direction,\n percent,\n speed,\n });\n};\n\n/**\n * @typedef {Object} ScrollElementToElementOpts\n * @property {string} elementId The identifier of the scrollable element,\n * which is going to be scrolled. It is required this element\n * is a valid scrollable container and it was located by `-android uiautomator`\n * strategy.\n * @property {string} elementToId The identifier of the item, which belongs\n * to the scrollable element above, and which should become visible after\n * the scrolling operation is finished. It is required this element\n * was located by `-android uiautomator` strategy.\n */\n\n/**\n * Scrolls the given scrollable element `elementId` until `elementToId`\n * becomes visible. This function returns immediately if the `elementToId`\n * is already visible in the view port. Otherwise it would scroll\n * to the very beginning of the scrollable control and tries to reach the destination element\n * by scrolling its parent to the end step by step. The scroll direction (vertical or horizontal)\n * is detected automatically.\n *\n * @param {ScrollElementToElementOpts} opts\n * @throws {Error} if the scrolling operation cannot be performed\n */\ncommands.mobileScrollBackTo = async function (opts = {}) {\n const {elementId, elementToId} = opts;\n if (!elementId || !elementToId) {\n throw new errors.InvalidArgumentError(`Both elementId and elementToId arguments must be provided`);\n }\n return await this.uiautomator2.jwproxy.command(\n `/appium/element/${util.unwrapElement(elementId)}/scroll_to/${util.unwrapElement(elementToId)}`, 'POST', {});\n};\n\n/**\n * @typedef {Object} ScrollOpts\n * @property {?string} elementId The identifier of an element. It is required this element\n * is a valid scrollable container and it was located by `-android uiautomator`\n * strategy. If this property is not provided then the first currently available scrollable view\n * is selected for the interaction.\n * @property {!string} strategy The following strategies are supported:\n * - `accessibility id` (UiSelector().description)\n * - `class name` (UiSelector().className)\n * - `-android uiautomator` (UiSelector)\n * @property {!string} selector The corresponding lookup value for the given\n * strategy.\n * @property {?number} maxSwipes The maximum number of swipes to perform\n * on the target scrollable view in order to reach the destination element.\n * In case this value is unset then it would be retrieved from the scrollable\n * element itself (vua `getMaxSearchSwipes()` property).\n */\n\n/**\n * Scrolls the given scrollable element until the element identified\n * by `strategy` and `selector` becomes visible. This function returns immediately if the\n * destination element is already visible in the view port. Otherwise it would scroll\n * to the very beginning of the scrollable control and tries to reach the destination element\n * by scrolling its parent to the end step by step. The scroll direction (vertical or horizontal)\n * is detected automatically.\n *\n * @param {ScrollOpts} opts\n * @throws {Error} if the scrolling operation cannot be performed\n */\ncommands.mobileScroll = async function (opts = {}) {\n const {\n element, elementId, // `element` is deprecated, use `elementId` instead\n strategy, selector, maxSwipes\n } = opts;\n if (!strategy || !selector) {\n throw new errors.InvalidArgumentError(`Both strategy and selector arguments must be provided`);\n }\n return await this.uiautomator2.jwproxy.command('/touch/scroll', 'POST', {\n origin: toOrigin(elementId || element),\n params: {strategy, selector, maxSwipes},\n });\n};\n\nexport default commands;\n"],"mappings":"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"}
@@ -20,4 +20,4 @@ let commands = {};
20
20
  Object.assign(commands, _alert.default, _find.default, _general.default, _touch.default, _actions.default, _element.default, _viewport.default, _screenshot.default, _battery.default, _gestures.default);
21
21
  var _default = commands;
22
22
  exports.default = _default;
23
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIk9iamVjdCIsImFzc2lnbiIsImFsZXJ0Q21kcyIsImZpbmRDbWRzIiwiZ2VuZXJhbENtZHMiLCJ0b3VjaENtZHMiLCJhY3Rpb25zQ21kcyIsImVsZW1lbnRDbWRzIiwidmlld3BvcnRDbWRzIiwic2NyZWVuc2hvdENtZHMiLCJiYXR0ZXJ5Q21kcyIsImdlc3R1cmVzQ21kcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWxlcnRDbWRzIGZyb20gJy4vYWxlcnQnO1xuaW1wb3J0IGZpbmRDbWRzIGZyb20gJy4vZmluZCc7XG5pbXBvcnQgZ2VuZXJhbENtZHMgZnJvbSAnLi9nZW5lcmFsJztcbmltcG9ydCB0b3VjaENtZHMgZnJvbSAnLi90b3VjaCc7XG5pbXBvcnQgZWxlbWVudENtZHMgZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCBhY3Rpb25zQ21kcyBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHZpZXdwb3J0Q21kcyBmcm9tICcuL3ZpZXdwb3J0JztcbmltcG9ydCBzY3JlZW5zaG90Q21kcyBmcm9tICcuL3NjcmVlbnNob3QnO1xuaW1wb3J0IGJhdHRlcnlDbWRzIGZyb20gJy4vYmF0dGVyeSc7XG5pbXBvcnQgZ2VzdHVyZXNDbWRzIGZyb20gJy4vZ2VzdHVyZXMnO1xuXG5sZXQgY29tbWFuZHMgPSB7fTtcbk9iamVjdC5hc3NpZ24oXG4gIGNvbW1hbmRzLFxuICBhbGVydENtZHMsXG4gIGZpbmRDbWRzLFxuICBnZW5lcmFsQ21kcyxcbiAgdG91Y2hDbWRzLFxuICBhY3Rpb25zQ21kcyxcbiAgZWxlbWVudENtZHMsXG4gIHZpZXdwb3J0Q21kcyxcbiAgc2NyZWVuc2hvdENtZHMsXG4gIGJhdHRlcnlDbWRzLFxuICBnZXN0dXJlc0NtZHMsXG4gIC8vIGFkZCBvdGhlciBjb21tYW5kIHR5cGVzIGhlcmVcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCQyxNQUFNLENBQUNDLE1BQU0sQ0FDWEYsUUFBUSxFQUNSRyxjQUFTLEVBQ1RDLGFBQVEsRUFDUkMsZ0JBQVcsRUFDWEMsY0FBUyxFQUNUQyxnQkFBVyxFQUNYQyxnQkFBVyxFQUNYQyxpQkFBWSxFQUNaQyxtQkFBYyxFQUNkQyxnQkFBVyxFQUNYQyxpQkFBWSxDQUViO0FBQUMsZUFFYVosUUFBUTtBQUFBIn0=
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWxlcnQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9maW5kIiwiX2dlbmVyYWwiLCJfdG91Y2giLCJfZWxlbWVudCIsIl9hY3Rpb25zIiwiX3ZpZXdwb3J0IiwiX3NjcmVlbnNob3QiLCJfYmF0dGVyeSIsIl9nZXN0dXJlcyIsImNvbW1hbmRzIiwiT2JqZWN0IiwiYXNzaWduIiwiYWxlcnRDbWRzIiwiZmluZENtZHMiLCJnZW5lcmFsQ21kcyIsInRvdWNoQ21kcyIsImFjdGlvbnNDbWRzIiwiZWxlbWVudENtZHMiLCJ2aWV3cG9ydENtZHMiLCJzY3JlZW5zaG90Q21kcyIsImJhdHRlcnlDbWRzIiwiZ2VzdHVyZXNDbWRzIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWxlcnRDbWRzIGZyb20gJy4vYWxlcnQnO1xuaW1wb3J0IGZpbmRDbWRzIGZyb20gJy4vZmluZCc7XG5pbXBvcnQgZ2VuZXJhbENtZHMgZnJvbSAnLi9nZW5lcmFsJztcbmltcG9ydCB0b3VjaENtZHMgZnJvbSAnLi90b3VjaCc7XG5pbXBvcnQgZWxlbWVudENtZHMgZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCBhY3Rpb25zQ21kcyBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHZpZXdwb3J0Q21kcyBmcm9tICcuL3ZpZXdwb3J0JztcbmltcG9ydCBzY3JlZW5zaG90Q21kcyBmcm9tICcuL3NjcmVlbnNob3QnO1xuaW1wb3J0IGJhdHRlcnlDbWRzIGZyb20gJy4vYmF0dGVyeSc7XG5pbXBvcnQgZ2VzdHVyZXNDbWRzIGZyb20gJy4vZ2VzdHVyZXMnO1xuXG5sZXQgY29tbWFuZHMgPSB7fTtcbk9iamVjdC5hc3NpZ24oXG4gIGNvbW1hbmRzLFxuICBhbGVydENtZHMsXG4gIGZpbmRDbWRzLFxuICBnZW5lcmFsQ21kcyxcbiAgdG91Y2hDbWRzLFxuICBhY3Rpb25zQ21kcyxcbiAgZWxlbWVudENtZHMsXG4gIHZpZXdwb3J0Q21kcyxcbiAgc2NyZWVuc2hvdENtZHMsXG4gIGJhdHRlcnlDbWRzLFxuICBnZXN0dXJlc0NtZHMsXG4gIC8vIGFkZCBvdGhlciBjb21tYW5kIHR5cGVzIGhlcmVcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssUUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sV0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsUUFBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsU0FBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBSVUsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUNqQkMsTUFBTSxDQUFDQyxNQUFNLENBQ1hGLFFBQVEsRUFDUkcsY0FBUyxFQUNUQyxhQUFRLEVBQ1JDLGdCQUFXLEVBQ1hDLGNBQVMsRUFDVEMsZ0JBQVcsRUFDWEMsZ0JBQVcsRUFDWEMsaUJBQVksRUFDWkMsbUJBQWMsRUFDZEMsZ0JBQVcsRUFDWEMsaUJBQVksQ0FFYjtBQUFDLElBQUFDLFFBQUEsR0FFYWIsUUFBUTtBQUFBYyxPQUFBLENBQUFDLE9BQUEsR0FBQUYsUUFBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["commands","Object","assign","alertCmds","findCmds","generalCmds","touchCmds","actionsCmds","elementCmds","viewportCmds","screenshotCmds","batteryCmds","gesturesCmds"],"sources":["../../../lib/commands/index.js"],"sourcesContent":["import alertCmds from './alert';\nimport findCmds from './find';\nimport generalCmds from './general';\nimport touchCmds from './touch';\nimport elementCmds from './element';\nimport actionsCmds from './actions';\nimport viewportCmds from './viewport';\nimport screenshotCmds from './screenshot';\nimport batteryCmds from './battery';\nimport gesturesCmds from './gestures';\n\nlet commands = {};\nObject.assign(\n commands,\n alertCmds,\n findCmds,\n generalCmds,\n touchCmds,\n actionsCmds,\n elementCmds,\n viewportCmds,\n screenshotCmds,\n batteryCmds,\n gesturesCmds,\n // add other command types here\n);\n\nexport default commands;\n\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,IAAIA,QAAQ,GAAG,CAAC,CAAC;AACjBC,MAAM,CAACC,MAAM,CACXF,QAAQ,EACRG,cAAS,EACTC,aAAQ,EACRC,gBAAW,EACXC,cAAS,EACTC,gBAAW,EACXC,gBAAW,EACXC,iBAAY,EACZC,mBAAc,EACdC,gBAAW,EACXC,iBAAY,CAEb;AAAC,eAEaZ,QAAQ;AAAA"}
1
+ {"version":3,"file":"index.js","names":["_alert","_interopRequireDefault","require","_find","_general","_touch","_element","_actions","_viewport","_screenshot","_battery","_gestures","commands","Object","assign","alertCmds","findCmds","generalCmds","touchCmds","actionsCmds","elementCmds","viewportCmds","screenshotCmds","batteryCmds","gesturesCmds","_default","exports","default"],"sources":["../../../lib/commands/index.js"],"sourcesContent":["import alertCmds from './alert';\nimport findCmds from './find';\nimport generalCmds from './general';\nimport touchCmds from './touch';\nimport elementCmds from './element';\nimport actionsCmds from './actions';\nimport viewportCmds from './viewport';\nimport screenshotCmds from './screenshot';\nimport batteryCmds from './battery';\nimport gesturesCmds from './gestures';\n\nlet commands = {};\nObject.assign(\n commands,\n alertCmds,\n findCmds,\n generalCmds,\n touchCmds,\n actionsCmds,\n elementCmds,\n viewportCmds,\n screenshotCmds,\n batteryCmds,\n gesturesCmds,\n // add other command types here\n);\n\nexport default commands;\n\n"],"mappings":";;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,QAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,MAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,QAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,QAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,SAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,WAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,QAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,SAAA,GAAAV,sBAAA,CAAAC,OAAA;AAEA,IAAIU,QAAQ,GAAG,CAAC,CAAC;AACjBC,MAAM,CAACC,MAAM,CACXF,QAAQ,EACRG,cAAS,EACTC,aAAQ,EACRC,gBAAW,EACXC,cAAS,EACTC,gBAAW,EACXC,gBAAW,EACXC,iBAAY,EACZC,mBAAc,EACdC,gBAAW,EACXC,iBAAY,CAEb;AAAC,IAAAC,QAAA,GAEab,QAAQ;AAAAc,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
@@ -18,4 +18,4 @@ commands.getScreenshot = async function () {
18
18
  };
19
19
  var _default = commands;
20
20
  exports.default = _default;
21
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImdldFNjcmVlbnNob3QiLCJtanBlZ1N0cmVhbSIsImRhdGEiLCJsYXN0Q2h1bmtQTkdCYXNlNjQiLCJsb2ciLCJ3YXJuIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvc2NyZWVuc2hvdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb21tYW5kcy5nZXRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5tanBlZ1N0cmVhbSkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLm1qcGVnU3RyZWFtLmxhc3RDaHVua1BOR0Jhc2U2NCgpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdGhpcy5sb2cud2FybignVHJpZWQgdG8gZ2V0IHNjcmVlbnNob3QgZnJvbSBhY3RpdmUgTUpQRUcgc3RyZWFtLCBidXQgdGhlcmUgJyArXG4gICAgICAnd2FzIG5vIGRhdGEgeWV0LiBGYWxsaW5nIGJhY2sgdG8gcmVndWxhciBzY3JlZW5zaG90IG1ldGhvZHMuJyk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3NjcmVlbnNob3QnLCAnR0VUJyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFbkJBLFFBQVEsQ0FBQ0MsYUFBYSxHQUFHLGtCQUFrQjtFQUN6QyxJQUFJLElBQUksQ0FBQ0MsV0FBVyxFQUFFO0lBQ3BCLE1BQU1DLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQ0QsV0FBVyxDQUFDRSxrQkFBa0IsRUFBRTtJQUN4RCxJQUFJRCxJQUFJLEVBQUU7TUFDUixPQUFPQSxJQUFJO0lBQ2I7SUFDQSxJQUFJLENBQUNFLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLDhEQUE4RCxHQUMxRSw4REFBOEQsQ0FBQztFQUNuRTtFQUNBLE9BQU8sTUFBTSxJQUFJLENBQUNDLFlBQVksQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztBQUN0RSxDQUFDO0FBQUMsZUFFYVQsUUFBUTtBQUFBIn0=
21
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImdldFNjcmVlbnNob3QiLCJtanBlZ1N0cmVhbSIsImRhdGEiLCJsYXN0Q2h1bmtQTkdCYXNlNjQiLCJsb2ciLCJ3YXJuIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3NjcmVlbnNob3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29tbWFuZHMuZ2V0U2NyZWVuc2hvdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubWpwZWdTdHJlYW0pIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5tanBlZ1N0cmVhbS5sYXN0Q2h1bmtQTkdCYXNlNjQoKTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHRoaXMubG9nLndhcm4oJ1RyaWVkIHRvIGdldCBzY3JlZW5zaG90IGZyb20gYWN0aXZlIE1KUEVHIHN0cmVhbSwgYnV0IHRoZXJlICcgK1xuICAgICAgJ3dhcyBubyBkYXRhIHlldC4gRmFsbGluZyBiYWNrIHRvIHJlZ3VsYXIgc2NyZWVuc2hvdCBtZXRob2RzLicpO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9zY3JlZW5zaG90JywgJ0dFVCcpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBRW5CQSxRQUFRLENBQUNDLGFBQWEsR0FBRyxrQkFBa0I7RUFDekMsSUFBSSxJQUFJLENBQUNDLFdBQVcsRUFBRTtJQUNwQixNQUFNQyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUNELFdBQVcsQ0FBQ0Usa0JBQWtCLEVBQUU7SUFDeEQsSUFBSUQsSUFBSSxFQUFFO01BQ1IsT0FBT0EsSUFBSTtJQUNiO0lBQ0EsSUFBSSxDQUFDRSxHQUFHLENBQUNDLElBQUksQ0FBQyw4REFBOEQsR0FDMUUsOERBQThELENBQUM7RUFDbkU7RUFDQSxPQUFPLE1BQU0sSUFBSSxDQUFDQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7QUFDdEUsQ0FBQztBQUFDLElBQUFDLFFBQUEsR0FFYVYsUUFBUTtBQUFBVyxPQUFBLENBQUFDLE9BQUEsR0FBQUYsUUFBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.js","names":["commands","getScreenshot","mjpegStream","data","lastChunkPNGBase64","log","warn","uiautomator2","jwproxy","command"],"sources":["../../../lib/commands/screenshot.js"],"sourcesContent":["const commands = {};\n\ncommands.getScreenshot = async function () {\n if (this.mjpegStream) {\n const data = await this.mjpegStream.lastChunkPNGBase64();\n if (data) {\n return data;\n }\n this.log.warn('Tried to get screenshot from active MJPEG stream, but there ' +\n 'was no data yet. Falling back to regular screenshot methods.');\n }\n return await this.uiautomator2.jwproxy.command('/screenshot', 'GET');\n};\n\nexport default commands;\n"],"mappings":";;;;;;;AAAA,MAAMA,QAAQ,GAAG,CAAC,CAAC;AAEnBA,QAAQ,CAACC,aAAa,GAAG,kBAAkB;EACzC,IAAI,IAAI,CAACC,WAAW,EAAE;IACpB,MAAMC,IAAI,GAAG,MAAM,IAAI,CAACD,WAAW,CAACE,kBAAkB,EAAE;IACxD,IAAID,IAAI,EAAE;MACR,OAAOA,IAAI;IACb;IACA,IAAI,CAACE,GAAG,CAACC,IAAI,CAAC,8DAA8D,GAC1E,8DAA8D,CAAC;EACnE;EACA,OAAO,MAAM,IAAI,CAACC,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC;AACtE,CAAC;AAAC,eAEaT,QAAQ;AAAA"}
1
+ {"version":3,"file":"screenshot.js","names":["commands","getScreenshot","mjpegStream","data","lastChunkPNGBase64","log","warn","uiautomator2","jwproxy","command","_default","exports","default"],"sources":["../../../lib/commands/screenshot.js"],"sourcesContent":["const commands = {};\n\ncommands.getScreenshot = async function () {\n if (this.mjpegStream) {\n const data = await this.mjpegStream.lastChunkPNGBase64();\n if (data) {\n return data;\n }\n this.log.warn('Tried to get screenshot from active MJPEG stream, but there ' +\n 'was no data yet. Falling back to regular screenshot methods.');\n }\n return await this.uiautomator2.jwproxy.command('/screenshot', 'GET');\n};\n\nexport default commands;\n"],"mappings":";;;;;;;AAAA,MAAMA,QAAQ,GAAG,CAAC,CAAC;AAEnBA,QAAQ,CAACC,aAAa,GAAG,kBAAkB;EACzC,IAAI,IAAI,CAACC,WAAW,EAAE;IACpB,MAAMC,IAAI,GAAG,MAAM,IAAI,CAACD,WAAW,CAACE,kBAAkB,EAAE;IACxD,IAAID,IAAI,EAAE;MACR,OAAOA,IAAI;IACb;IACA,IAAI,CAACE,GAAG,CAACC,IAAI,CAAC,8DAA8D,GAC1E,8DAA8D,CAAC;EACnE;EACA,OAAO,MAAM,IAAI,CAACC,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC;AACtE,CAAC;AAAC,IAAAC,QAAA,GAEaV,QAAQ;AAAAW,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
@@ -37,4 +37,4 @@ commands.performActions = async function (actions) {
37
37
  Object.assign(extensions, commands);
38
38
  var _default = extensions;
39
39
  exports.default = _default;
40
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImV4dGVuc2lvbnMiLCJkb1BlcmZvcm1NdWx0aUFjdGlvbiIsImVsZW1lbnRJZCIsInN0YXRlcyIsIm9wdHMiLCJhY3Rpb25zIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJwZXJmb3JtQWN0aW9ucyIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsInByZXByb2Nlc3NlZEFjdGlvbnMiLCJtYXAiLCJhY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJ0eXBlIiwicGFyYW1ldGVycyIsInBvaW50ZXJUeXBlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3RvdWNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBjb21tYW5kcyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmRvUGVyZm9ybU11bHRpQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnRJZCwgc3RhdGVzKSB7XG4gIGxldCBvcHRzO1xuICBpZiAoZWxlbWVudElkKSB7XG4gICAgb3B0cyA9IHtcbiAgICAgIGVsZW1lbnRJZCxcbiAgICAgIGFjdGlvbnM6IHN0YXRlc1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvdG91Y2gvbXVsdGkvcGVyZm9ybScsICdQT1NUJywgb3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgb3B0cyA9IHtcbiAgICAgIGFjdGlvbnM6IHN0YXRlc1xuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3RvdWNoL211bHRpL3BlcmZvcm0nLCAnUE9TVCcsIG9wdHMpO1xuICB9XG59O1xuXG5jb21tYW5kcy5wZXJmb3JtQWN0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uIChhY3Rpb25zKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBSZWNlaXZlZCB0aGUgZm9sbG93aW5nIFczQyBhY3Rpb25zOiAke0pTT04uc3RyaW5naWZ5KGFjdGlvbnMsIG51bGwsICcgICcpfWApO1xuICAvLyBUaGlzIGlzIG1hbmRhdG9yeSwgc2luY2UgU2VsZW5pdW0gQVBJIHVzZXMgTU9VU0UgYXMgdGhlIGRlZmF1bHQgcG9pbnRlciB0eXBlXG4gIGNvbnN0IHByZXByb2Nlc3NlZEFjdGlvbnMgPSBhY3Rpb25zXG4gICAgLm1hcCgoYWN0aW9uKSA9PiBPYmplY3QuYXNzaWduKHt9LCBhY3Rpb24sIGFjdGlvbi50eXBlID09PSAncG9pbnRlcicgPyB7XG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHBvaW50ZXJUeXBlOiAndG91Y2gnXG4gICAgICB9XG4gICAgfSA6IHt9KSk7XG4gIHRoaXMubG9nLmRlYnVnKGBQcmVwcm9jZXNzZWQgYWN0aW9uczogJHtKU09OLnN0cmluZ2lmeShwcmVwcm9jZXNzZWRBY3Rpb25zLCBudWxsLCAnICAnKX1gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FjdGlvbnMnLCAnUE9TVCcsIHthY3Rpb25zOiBwcmVwcm9jZXNzZWRBY3Rpb25zfSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzKTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFJQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFbENELFFBQVEsQ0FBQ0Usb0JBQW9CLEdBQUcsZ0JBQWdCQyxTQUFTLEVBQUVDLE1BQU0sRUFBRTtFQUNqRSxJQUFJQyxJQUFJO0VBQ1IsSUFBSUYsU0FBUyxFQUFFO0lBQ2JFLElBQUksR0FBRztNQUNMRixTQUFTO01BQ1RHLE9BQU8sRUFBRUY7SUFDWCxDQUFDO0lBRUQsT0FBTyxNQUFNLElBQUksQ0FBQ0csWUFBWSxDQUFDQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUVKLElBQUksQ0FBQztFQUN0RixDQUFDLE1BQU07SUFDTEEsSUFBSSxHQUFHO01BQ0xDLE9BQU8sRUFBRUY7SUFDWCxDQUFDO0lBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQ0csWUFBWSxDQUFDQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUVKLElBQUksQ0FBQztFQUN0RjtBQUNGLENBQUM7QUFFREwsUUFBUSxDQUFDVSxjQUFjLEdBQUcsZ0JBQWdCSixPQUFPLEVBQUU7RUFDakQsSUFBSSxDQUFDSyxHQUFHLENBQUNDLEtBQUssQ0FBRSx1Q0FBc0NDLElBQUksQ0FBQ0MsU0FBUyxDQUFDUixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBRSxFQUFDLENBQUM7RUFFNUYsTUFBTVMsbUJBQW1CLEdBQUdULE9BQU8sQ0FDaENVLEdBQUcsQ0FBRUMsTUFBTSxJQUFLQyxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRUYsTUFBTSxFQUFFQSxNQUFNLENBQUNHLElBQUksS0FBSyxTQUFTLEdBQUc7SUFDckVDLFVBQVUsRUFBRTtNQUNWQyxXQUFXLEVBQUU7SUFDZjtFQUNGLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsSUFBSSxDQUFDWCxHQUFHLENBQUNDLEtBQUssQ0FBRSx5QkFBd0JDLElBQUksQ0FBQ0MsU0FBUyxDQUFDQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFFLEVBQUMsQ0FBQztFQUMxRixPQUFPLE1BQU0sSUFBSSxDQUFDUixZQUFZLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUU7SUFBQ0gsT0FBTyxFQUFFUztFQUFtQixDQUFDLENBQUM7QUFDcEcsQ0FBQztBQUVERyxNQUFNLENBQUNDLE1BQU0sQ0FBQ2xCLFVBQVUsRUFBRUQsUUFBUSxDQUFDO0FBQUMsZUFDckJDLFVBQVU7QUFBQSJ9
40
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImV4dGVuc2lvbnMiLCJkb1BlcmZvcm1NdWx0aUFjdGlvbiIsImVsZW1lbnRJZCIsInN0YXRlcyIsIm9wdHMiLCJhY3Rpb25zIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJwZXJmb3JtQWN0aW9ucyIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsInByZXByb2Nlc3NlZEFjdGlvbnMiLCJtYXAiLCJhY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJ0eXBlIiwicGFyYW1ldGVycyIsInBvaW50ZXJUeXBlIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy90b3VjaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJsZXQgY29tbWFuZHMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5kb1BlcmZvcm1NdWx0aUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQsIHN0YXRlcykge1xuICBsZXQgb3B0cztcbiAgaWYgKGVsZW1lbnRJZCkge1xuICAgIG9wdHMgPSB7XG4gICAgICBlbGVtZW50SWQsXG4gICAgICBhY3Rpb25zOiBzdGF0ZXNcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3RvdWNoL211bHRpL3BlcmZvcm0nLCAnUE9TVCcsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIG9wdHMgPSB7XG4gICAgICBhY3Rpb25zOiBzdGF0ZXNcbiAgICB9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy90b3VjaC9tdWx0aS9wZXJmb3JtJywgJ1BPU1QnLCBvcHRzKTtcbiAgfVxufTtcblxuY29tbWFuZHMucGVyZm9ybUFjdGlvbnMgPSBhc3luYyBmdW5jdGlvbiAoYWN0aW9ucykge1xuICB0aGlzLmxvZy5kZWJ1ZyhgUmVjZWl2ZWQgdGhlIGZvbGxvd2luZyBXM0MgYWN0aW9uczogJHtKU09OLnN0cmluZ2lmeShhY3Rpb25zLCBudWxsLCAnICAnKX1gKTtcbiAgLy8gVGhpcyBpcyBtYW5kYXRvcnksIHNpbmNlIFNlbGVuaXVtIEFQSSB1c2VzIE1PVVNFIGFzIHRoZSBkZWZhdWx0IHBvaW50ZXIgdHlwZVxuICBjb25zdCBwcmVwcm9jZXNzZWRBY3Rpb25zID0gYWN0aW9uc1xuICAgIC5tYXAoKGFjdGlvbikgPT4gT2JqZWN0LmFzc2lnbih7fSwgYWN0aW9uLCBhY3Rpb24udHlwZSA9PT0gJ3BvaW50ZXInID8ge1xuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBwb2ludGVyVHlwZTogJ3RvdWNoJ1xuICAgICAgfVxuICAgIH0gOiB7fSkpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgUHJlcHJvY2Vzc2VkIGFjdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkocHJlcHJvY2Vzc2VkQWN0aW9ucywgbnVsbCwgJyAgJyl9YCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hY3Rpb25zJywgJ1BPU1QnLCB7YWN0aW9uczogcHJlcHJvY2Vzc2VkQWN0aW9uc30pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcyk7XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBSUEsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRWxDRCxRQUFRLENBQUNFLG9CQUFvQixHQUFHLGdCQUFnQkMsU0FBUyxFQUFFQyxNQUFNLEVBQUU7RUFDakUsSUFBSUMsSUFBSTtFQUNSLElBQUlGLFNBQVMsRUFBRTtJQUNiRSxJQUFJLEdBQUc7TUFDTEYsU0FBUztNQUNURyxPQUFPLEVBQUVGO0lBQ1gsQ0FBQztJQUVELE9BQU8sTUFBTSxJQUFJLENBQUNHLFlBQVksQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFSixJQUFJLENBQUM7RUFDdEYsQ0FBQyxNQUFNO0lBQ0xBLElBQUksR0FBRztNQUNMQyxPQUFPLEVBQUVGO0lBQ1gsQ0FBQztJQUNELE9BQU8sTUFBTSxJQUFJLENBQUNHLFlBQVksQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFSixJQUFJLENBQUM7RUFDdEY7QUFDRixDQUFDO0FBRURMLFFBQVEsQ0FBQ1UsY0FBYyxHQUFHLGdCQUFnQkosT0FBTyxFQUFFO0VBQ2pELElBQUksQ0FBQ0ssR0FBRyxDQUFDQyxLQUFLLENBQUUsdUNBQXNDQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ1IsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUUsRUFBQyxDQUFDO0VBRTVGLE1BQU1TLG1CQUFtQixHQUFHVCxPQUFPLENBQ2hDVSxHQUFHLENBQUVDLE1BQU0sSUFBS0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVGLE1BQU0sRUFBRUEsTUFBTSxDQUFDRyxJQUFJLEtBQUssU0FBUyxHQUFHO0lBQ3JFQyxVQUFVLEVBQUU7TUFDVkMsV0FBVyxFQUFFO0lBQ2Y7RUFDRixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLElBQUksQ0FBQ1gsR0FBRyxDQUFDQyxLQUFLLENBQUUseUJBQXdCQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0MsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBRSxFQUFDLENBQUM7RUFDMUYsT0FBTyxNQUFNLElBQUksQ0FBQ1IsWUFBWSxDQUFDQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFO0lBQUNILE9BQU8sRUFBRVM7RUFBbUIsQ0FBQyxDQUFDO0FBQ3BHLENBQUM7QUFFREcsTUFBTSxDQUFDQyxNQUFNLENBQUNsQixVQUFVLEVBQUVELFFBQVEsQ0FBQztBQUFDLElBQUF1QixRQUFBLEdBQ3JCdEIsVUFBVTtBQUFBdUIsT0FBQSxDQUFBQyxPQUFBLEdBQUFGLFFBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"touch.js","names":["commands","extensions","doPerformMultiAction","elementId","states","opts","actions","uiautomator2","jwproxy","command","performActions","log","debug","JSON","stringify","preprocessedActions","map","action","Object","assign","type","parameters","pointerType"],"sources":["../../../lib/commands/touch.js"],"sourcesContent":["let commands = {}, extensions = {};\n\ncommands.doPerformMultiAction = async function (elementId, states) {\n let opts;\n if (elementId) {\n opts = {\n elementId,\n actions: states\n };\n\n return await this.uiautomator2.jwproxy.command('/touch/multi/perform', 'POST', opts);\n } else {\n opts = {\n actions: states\n };\n return await this.uiautomator2.jwproxy.command('/touch/multi/perform', 'POST', opts);\n }\n};\n\ncommands.performActions = async function (actions) {\n this.log.debug(`Received the following W3C actions: ${JSON.stringify(actions, null, ' ')}`);\n // This is mandatory, since Selenium API uses MOUSE as the default pointer type\n const preprocessedActions = actions\n .map((action) => Object.assign({}, action, action.type === 'pointer' ? {\n parameters: {\n pointerType: 'touch'\n }\n } : {}));\n this.log.debug(`Preprocessed actions: ${JSON.stringify(preprocessedActions, null, ' ')}`);\n return await this.uiautomator2.jwproxy.command('/actions', 'POST', {actions: preprocessedActions});\n};\n\nObject.assign(extensions, commands);\nexport default extensions;\n"],"mappings":";;;;;;;AAAA,IAAIA,QAAQ,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAElCD,QAAQ,CAACE,oBAAoB,GAAG,gBAAgBC,SAAS,EAAEC,MAAM,EAAE;EACjE,IAAIC,IAAI;EACR,IAAIF,SAAS,EAAE;IACbE,IAAI,GAAG;MACLF,SAAS;MACTG,OAAO,EAAEF;IACX,CAAC;IAED,OAAO,MAAM,IAAI,CAACG,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,sBAAsB,EAAE,MAAM,EAAEJ,IAAI,CAAC;EACtF,CAAC,MAAM;IACLA,IAAI,GAAG;MACLC,OAAO,EAAEF;IACX,CAAC;IACD,OAAO,MAAM,IAAI,CAACG,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,sBAAsB,EAAE,MAAM,EAAEJ,IAAI,CAAC;EACtF;AACF,CAAC;AAEDL,QAAQ,CAACU,cAAc,GAAG,gBAAgBJ,OAAO,EAAE;EACjD,IAAI,CAACK,GAAG,CAACC,KAAK,CAAE,uCAAsCC,IAAI,CAACC,SAAS,CAACR,OAAO,EAAE,IAAI,EAAE,IAAI,CAAE,EAAC,CAAC;EAE5F,MAAMS,mBAAmB,GAAGT,OAAO,CAChCU,GAAG,CAAEC,MAAM,IAAKC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEF,MAAM,EAAEA,MAAM,CAACG,IAAI,KAAK,SAAS,GAAG;IACrEC,UAAU,EAAE;MACVC,WAAW,EAAE;IACf;EACF,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EACV,IAAI,CAACX,GAAG,CAACC,KAAK,CAAE,yBAAwBC,IAAI,CAACC,SAAS,CAACC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAE,EAAC,CAAC;EAC1F,OAAO,MAAM,IAAI,CAACR,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE;IAACH,OAAO,EAAES;EAAmB,CAAC,CAAC;AACpG,CAAC;AAEDG,MAAM,CAACC,MAAM,CAAClB,UAAU,EAAED,QAAQ,CAAC;AAAC,eACrBC,UAAU;AAAA"}
1
+ {"version":3,"file":"touch.js","names":["commands","extensions","doPerformMultiAction","elementId","states","opts","actions","uiautomator2","jwproxy","command","performActions","log","debug","JSON","stringify","preprocessedActions","map","action","Object","assign","type","parameters","pointerType","_default","exports","default"],"sources":["../../../lib/commands/touch.js"],"sourcesContent":["let commands = {}, extensions = {};\n\ncommands.doPerformMultiAction = async function (elementId, states) {\n let opts;\n if (elementId) {\n opts = {\n elementId,\n actions: states\n };\n\n return await this.uiautomator2.jwproxy.command('/touch/multi/perform', 'POST', opts);\n } else {\n opts = {\n actions: states\n };\n return await this.uiautomator2.jwproxy.command('/touch/multi/perform', 'POST', opts);\n }\n};\n\ncommands.performActions = async function (actions) {\n this.log.debug(`Received the following W3C actions: ${JSON.stringify(actions, null, ' ')}`);\n // This is mandatory, since Selenium API uses MOUSE as the default pointer type\n const preprocessedActions = actions\n .map((action) => Object.assign({}, action, action.type === 'pointer' ? {\n parameters: {\n pointerType: 'touch'\n }\n } : {}));\n this.log.debug(`Preprocessed actions: ${JSON.stringify(preprocessedActions, null, ' ')}`);\n return await this.uiautomator2.jwproxy.command('/actions', 'POST', {actions: preprocessedActions});\n};\n\nObject.assign(extensions, commands);\nexport default extensions;\n"],"mappings":";;;;;;;AAAA,IAAIA,QAAQ,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAElCD,QAAQ,CAACE,oBAAoB,GAAG,gBAAgBC,SAAS,EAAEC,MAAM,EAAE;EACjE,IAAIC,IAAI;EACR,IAAIF,SAAS,EAAE;IACbE,IAAI,GAAG;MACLF,SAAS;MACTG,OAAO,EAAEF;IACX,CAAC;IAED,OAAO,MAAM,IAAI,CAACG,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,sBAAsB,EAAE,MAAM,EAAEJ,IAAI,CAAC;EACtF,CAAC,MAAM;IACLA,IAAI,GAAG;MACLC,OAAO,EAAEF;IACX,CAAC;IACD,OAAO,MAAM,IAAI,CAACG,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,sBAAsB,EAAE,MAAM,EAAEJ,IAAI,CAAC;EACtF;AACF,CAAC;AAEDL,QAAQ,CAACU,cAAc,GAAG,gBAAgBJ,OAAO,EAAE;EACjD,IAAI,CAACK,GAAG,CAACC,KAAK,CAAE,uCAAsCC,IAAI,CAACC,SAAS,CAACR,OAAO,EAAE,IAAI,EAAE,IAAI,CAAE,EAAC,CAAC;EAE5F,MAAMS,mBAAmB,GAAGT,OAAO,CAChCU,GAAG,CAAEC,MAAM,IAAKC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEF,MAAM,EAAEA,MAAM,CAACG,IAAI,KAAK,SAAS,GAAG;IACrEC,UAAU,EAAE;MACVC,WAAW,EAAE;IACf;EACF,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EACV,IAAI,CAACX,GAAG,CAACC,KAAK,CAAE,yBAAwBC,IAAI,CAACC,SAAS,CAACC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAE,EAAC,CAAC;EAC1F,OAAO,MAAM,IAAI,CAACR,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE;IAACH,OAAO,EAAES;EAAmB,CAAC,CAAC;AACpG,CAAC;AAEDG,MAAM,CAACC,MAAM,CAAClB,UAAU,EAAED,QAAQ,CAAC;AAAC,IAAAuB,QAAA,GACrBtB,UAAU;AAAAuB,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
@@ -36,4 +36,4 @@ commands.getViewPortRect = async function () {
36
36
  Object.assign(extensions, commands);
37
37
  var _default = extensions;
38
38
  exports.default = _default;
39
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJzdGF0dXNCYXIiLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsImdldERldmljZVBpeGVsUmF0aW8iLCJnZXRWaWV3cG9ydFNjcmVlbnNob3QiLCJzY3JlZW5zaG90IiwiZ2V0U2NyZWVuc2hvdCIsInJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJpbWFnZVV0aWwiLCJjcm9wQmFzZTY0SW1hZ2UiLCJ3aW5kb3dTaXplIiwiZ2V0V2luZG93U2l6ZSIsInN0YXR1c0JhckhlaWdodCIsImxlZnQiLCJ0b3AiLCJ3aWR0aCIsImhlaWdodCIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy92aWV3cG9ydC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbWFnZVV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5cblxubGV0IGV4dGVuc2lvbnMgPSB7fSwgY29tbWFuZHMgPSB7fTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldFN0YXR1c0JhckhlaWdodCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qge3N0YXR1c0Jhcn0gPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZGV2aWNlL3N5c3RlbV9iYXJzYCwgJ0dFVCcsIHt9KTtcbiAgcmV0dXJuIHN0YXR1c0Jhcjtcbn07XG5cbi8vIG1lbW9pemVkIGluIGNvbnN0cnVjdG9yXG5jb21tYW5kcy5nZXREZXZpY2VQaXhlbFJhdGlvID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9waXhlbF9yYXRpbycsICdHRVQnLCB7fSk7XG59O1xuXG5jb21tYW5kcy5nZXRWaWV3cG9ydFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNjcmVlbnNob3QgPSBhd2FpdCB0aGlzLmdldFNjcmVlbnNob3QoKTtcbiAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0Vmlld1BvcnRSZWN0KCk7XG4gIHJldHVybiBhd2FpdCBpbWFnZVV0aWwuY3JvcEJhc2U2NEltYWdlKHNjcmVlbnNob3QsIHJlY3QpO1xufTtcblxuY29tbWFuZHMuZ2V0Vmlld1BvcnRSZWN0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCB3aW5kb3dTaXplID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIGNvbnN0IHN0YXR1c0JhckhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzQmFySGVpZ2h0KCk7XG4gIC8vIGFuZHJvaWQgcmV0dXJucyB0aGUgdXBzY2FsZWQgd2luZG93IHNpemUsIHNvIHRvIGdldCB0aGUgdHJ1ZSBzaXplIG9mIHRoZVxuICAvLyByZWN0IHdlIGhhdmUgdG8gZG93bnNjYWxlXG4gIHJldHVybiB7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IHN0YXR1c0JhckhlaWdodCxcbiAgICB3aWR0aDogd2luZG93U2l6ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd1NpemUuaGVpZ2h0IC0gc3RhdHVzQmFySGVpZ2h0XG4gIH07XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzKTtcbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFHQSxJQUFJQSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQztBQUduQ0EsUUFBUSxDQUFDQyxrQkFBa0IsR0FBRyxrQkFBa0I7RUFDOUMsTUFBTTtJQUFDQztFQUFTLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQ0MsWUFBWSxDQUFDQyxPQUFPLENBQUNDLE9BQU8sQ0FBRSw0QkFBMkIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDcEcsT0FBT0gsU0FBUztBQUNsQixDQUFDO0FBR0RGLFFBQVEsQ0FBQ00sbUJBQW1CLEdBQUcsa0JBQWtCO0VBQy9DLE9BQU8sTUFBTSxJQUFJLENBQUNILFlBQVksQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFREwsUUFBUSxDQUFDTyxxQkFBcUIsR0FBRyxrQkFBa0I7RUFDakQsTUFBTUMsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxhQUFhLEVBQUU7RUFDN0MsTUFBTUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxlQUFlLEVBQUU7RUFDekMsT0FBTyxNQUFNQyxrQkFBUyxDQUFDQyxlQUFlLENBQUNMLFVBQVUsRUFBRUUsSUFBSSxDQUFDO0FBQzFELENBQUM7QUFFRFYsUUFBUSxDQUFDVyxlQUFlLEdBQUcsa0JBQWtCO0VBQzNDLE1BQU1HLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQ0MsYUFBYSxFQUFFO0VBQzdDLE1BQU1DLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQ2Ysa0JBQWtCLEVBQUU7RUFHdkQsT0FBTztJQUNMZ0IsSUFBSSxFQUFFLENBQUM7SUFDUEMsR0FBRyxFQUFFRixlQUFlO0lBQ3BCRyxLQUFLLEVBQUVMLFVBQVUsQ0FBQ0ssS0FBSztJQUN2QkMsTUFBTSxFQUFFTixVQUFVLENBQUNNLE1BQU0sR0FBR0o7RUFDOUIsQ0FBQztBQUNILENBQUM7QUFFREssTUFBTSxDQUFDQyxNQUFNLENBQUN2QixVQUFVLEVBQUVDLFFBQVEsQ0FBQztBQUFDLGVBRXJCRCxVQUFVO0FBQUEifQ==
39
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3VwcG9ydCIsInJlcXVpcmUiLCJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJleHBvcnRzIiwiZ2V0U3RhdHVzQmFySGVpZ2h0Iiwic3RhdHVzQmFyIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXREZXZpY2VQaXhlbFJhdGlvIiwiZ2V0Vmlld3BvcnRTY3JlZW5zaG90Iiwic2NyZWVuc2hvdCIsImdldFNjcmVlbnNob3QiLCJyZWN0IiwiZ2V0Vmlld1BvcnRSZWN0IiwiaW1hZ2VVdGlsIiwiY3JvcEJhc2U2NEltYWdlIiwid2luZG93U2l6ZSIsImdldFdpbmRvd1NpemUiLCJzdGF0dXNCYXJIZWlnaHQiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvdmlld3BvcnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW1hZ2VVdGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmxldCBleHRlbnNpb25zID0ge30sIGNvbW1hbmRzID0ge307XG5cbi8vIG1lbW9pemVkIGluIGNvbnN0cnVjdG9yXG5jb21tYW5kcy5nZXRTdGF0dXNCYXJIZWlnaHQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHtzdGF0dXNCYXJ9ID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2RldmljZS9zeXN0ZW1fYmFyc2AsICdHRVQnLCB7fSk7XG4gIHJldHVybiBzdGF0dXNCYXI7XG59O1xuXG4vLyBtZW1vaXplZCBpbiBjb25zdHJ1Y3RvclxuY29tbWFuZHMuZ2V0RGV2aWNlUGl4ZWxSYXRpbyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvcGl4ZWxfcmF0aW8nLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0Vmlld3BvcnRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBzY3JlZW5zaG90ID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90KCk7XG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xuICByZXR1cm4gYXdhaXQgaW1hZ2VVdGlsLmNyb3BCYXNlNjRJbWFnZShzY3JlZW5zaG90LCByZWN0KTtcbn07XG5cbmNvbW1hbmRzLmdldFZpZXdQb3J0UmVjdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgd2luZG93U2l6ZSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICBjb25zdCBzdGF0dXNCYXJIZWlnaHQgPSBhd2FpdCB0aGlzLmdldFN0YXR1c0JhckhlaWdodCgpO1xuICAvLyBhbmRyb2lkIHJldHVybnMgdGhlIHVwc2NhbGVkIHdpbmRvdyBzaXplLCBzbyB0byBnZXQgdGhlIHRydWUgc2l6ZSBvZiB0aGVcbiAgLy8gcmVjdCB3ZSBoYXZlIHRvIGRvd25zY2FsZVxuICByZXR1cm4ge1xuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiBzdGF0dXNCYXJIZWlnaHQsXG4gICAgd2lkdGg6IHdpbmRvd1NpemUud2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dTaXplLmhlaWdodCAtIHN0YXR1c0JhckhlaWdodFxuICB9O1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcyk7XG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUdBLElBQUlDLFVBQVUsR0FBRyxDQUFDLENBQUM7RUFBRUMsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFELFFBQUEsR0FBQUEsUUFBQTtBQUduQ0EsUUFBUSxDQUFDRSxrQkFBa0IsR0FBRyxrQkFBa0I7RUFDOUMsTUFBTTtJQUFDQztFQUFTLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQ0MsWUFBWSxDQUFDQyxPQUFPLENBQUNDLE9BQU8sQ0FBRSw0QkFBMkIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDcEcsT0FBT0gsU0FBUztBQUNsQixDQUFDO0FBR0RILFFBQVEsQ0FBQ08sbUJBQW1CLEdBQUcsa0JBQWtCO0VBQy9DLE9BQU8sTUFBTSxJQUFJLENBQUNILFlBQVksQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRE4sUUFBUSxDQUFDUSxxQkFBcUIsR0FBRyxrQkFBa0I7RUFDakQsTUFBTUMsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxhQUFhLEVBQUU7RUFDN0MsTUFBTUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxlQUFlLEVBQUU7RUFDekMsT0FBTyxNQUFNQyxrQkFBUyxDQUFDQyxlQUFlLENBQUNMLFVBQVUsRUFBRUUsSUFBSSxDQUFDO0FBQzFELENBQUM7QUFFRFgsUUFBUSxDQUFDWSxlQUFlLEdBQUcsa0JBQWtCO0VBQzNDLE1BQU1HLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQ0MsYUFBYSxFQUFFO0VBQzdDLE1BQU1DLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQ2Ysa0JBQWtCLEVBQUU7RUFHdkQsT0FBTztJQUNMZ0IsSUFBSSxFQUFFLENBQUM7SUFDUEMsR0FBRyxFQUFFRixlQUFlO0lBQ3BCRyxLQUFLLEVBQUVMLFVBQVUsQ0FBQ0ssS0FBSztJQUN2QkMsTUFBTSxFQUFFTixVQUFVLENBQUNNLE1BQU0sR0FBR0o7RUFDOUIsQ0FBQztBQUNILENBQUM7QUFFREssTUFBTSxDQUFDQyxNQUFNLENBQUN4QixVQUFVLEVBQUVDLFFBQVEsQ0FBQztBQUFDLElBQUF3QixRQUFBLEdBRXJCekIsVUFBVTtBQUFBRSxPQUFBLENBQUF3QixPQUFBLEdBQUFELFFBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.js","names":["extensions","commands","getStatusBarHeight","statusBar","uiautomator2","jwproxy","command","getDevicePixelRatio","getViewportScreenshot","screenshot","getScreenshot","rect","getViewPortRect","imageUtil","cropBase64Image","windowSize","getWindowSize","statusBarHeight","left","top","width","height","Object","assign"],"sources":["../../../lib/commands/viewport.js"],"sourcesContent":["import { imageUtil } from 'appium/support';\n\n\nlet extensions = {}, commands = {};\n\n// memoized in constructor\ncommands.getStatusBarHeight = async function () {\n const {statusBar} = await this.uiautomator2.jwproxy.command(`/appium/device/system_bars`, 'GET', {});\n return statusBar;\n};\n\n// memoized in constructor\ncommands.getDevicePixelRatio = async function () {\n return await this.uiautomator2.jwproxy.command('/appium/device/pixel_ratio', 'GET', {});\n};\n\ncommands.getViewportScreenshot = async function () {\n const screenshot = await this.getScreenshot();\n const rect = await this.getViewPortRect();\n return await imageUtil.cropBase64Image(screenshot, rect);\n};\n\ncommands.getViewPortRect = async function () {\n const windowSize = await this.getWindowSize();\n const statusBarHeight = await this.getStatusBarHeight();\n // android returns the upscaled window size, so to get the true size of the\n // rect we have to downscale\n return {\n left: 0,\n top: statusBarHeight,\n width: windowSize.width,\n height: windowSize.height - statusBarHeight\n };\n};\n\nObject.assign(extensions, commands);\nexport { commands };\nexport default extensions;\n"],"mappings":";;;;;;;AAAA;AAGA,IAAIA,UAAU,GAAG,CAAC,CAAC;EAAEC,QAAQ,GAAG,CAAC,CAAC;AAAC;AAGnCA,QAAQ,CAACC,kBAAkB,GAAG,kBAAkB;EAC9C,MAAM;IAACC;EAAS,CAAC,GAAG,MAAM,IAAI,CAACC,YAAY,CAACC,OAAO,CAACC,OAAO,CAAE,4BAA2B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;EACpG,OAAOH,SAAS;AAClB,CAAC;AAGDF,QAAQ,CAACM,mBAAmB,GAAG,kBAAkB;EAC/C,OAAO,MAAM,IAAI,CAACH,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,4BAA4B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACzF,CAAC;AAEDL,QAAQ,CAACO,qBAAqB,GAAG,kBAAkB;EACjD,MAAMC,UAAU,GAAG,MAAM,IAAI,CAACC,aAAa,EAAE;EAC7C,MAAMC,IAAI,GAAG,MAAM,IAAI,CAACC,eAAe,EAAE;EACzC,OAAO,MAAMC,kBAAS,CAACC,eAAe,CAACL,UAAU,EAAEE,IAAI,CAAC;AAC1D,CAAC;AAEDV,QAAQ,CAACW,eAAe,GAAG,kBAAkB;EAC3C,MAAMG,UAAU,GAAG,MAAM,IAAI,CAACC,aAAa,EAAE;EAC7C,MAAMC,eAAe,GAAG,MAAM,IAAI,CAACf,kBAAkB,EAAE;EAGvD,OAAO;IACLgB,IAAI,EAAE,CAAC;IACPC,GAAG,EAAEF,eAAe;IACpBG,KAAK,EAAEL,UAAU,CAACK,KAAK;IACvBC,MAAM,EAAEN,UAAU,CAACM,MAAM,GAAGJ;EAC9B,CAAC;AACH,CAAC;AAEDK,MAAM,CAACC,MAAM,CAACvB,UAAU,EAAEC,QAAQ,CAAC;AAAC,eAErBD,UAAU;AAAA"}
1
+ {"version":3,"file":"viewport.js","names":["_support","require","extensions","commands","exports","getStatusBarHeight","statusBar","uiautomator2","jwproxy","command","getDevicePixelRatio","getViewportScreenshot","screenshot","getScreenshot","rect","getViewPortRect","imageUtil","cropBase64Image","windowSize","getWindowSize","statusBarHeight","left","top","width","height","Object","assign","_default","default"],"sources":["../../../lib/commands/viewport.js"],"sourcesContent":["import { imageUtil } from 'appium/support';\n\n\nlet extensions = {}, commands = {};\n\n// memoized in constructor\ncommands.getStatusBarHeight = async function () {\n const {statusBar} = await this.uiautomator2.jwproxy.command(`/appium/device/system_bars`, 'GET', {});\n return statusBar;\n};\n\n// memoized in constructor\ncommands.getDevicePixelRatio = async function () {\n return await this.uiautomator2.jwproxy.command('/appium/device/pixel_ratio', 'GET', {});\n};\n\ncommands.getViewportScreenshot = async function () {\n const screenshot = await this.getScreenshot();\n const rect = await this.getViewPortRect();\n return await imageUtil.cropBase64Image(screenshot, rect);\n};\n\ncommands.getViewPortRect = async function () {\n const windowSize = await this.getWindowSize();\n const statusBarHeight = await this.getStatusBarHeight();\n // android returns the upscaled window size, so to get the true size of the\n // rect we have to downscale\n return {\n left: 0,\n top: statusBarHeight,\n width: windowSize.width,\n height: windowSize.height - statusBarHeight\n };\n};\n\nObject.assign(extensions, commands);\nexport { commands };\nexport default extensions;\n"],"mappings":";;;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAGA,IAAIC,UAAU,GAAG,CAAC,CAAC;EAAEC,QAAQ,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAD,QAAA,GAAAA,QAAA;AAGnCA,QAAQ,CAACE,kBAAkB,GAAG,kBAAkB;EAC9C,MAAM;IAACC;EAAS,CAAC,GAAG,MAAM,IAAI,CAACC,YAAY,CAACC,OAAO,CAACC,OAAO,CAAE,4BAA2B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;EACpG,OAAOH,SAAS;AAClB,CAAC;AAGDH,QAAQ,CAACO,mBAAmB,GAAG,kBAAkB;EAC/C,OAAO,MAAM,IAAI,CAACH,YAAY,CAACC,OAAO,CAACC,OAAO,CAAC,4BAA4B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACzF,CAAC;AAEDN,QAAQ,CAACQ,qBAAqB,GAAG,kBAAkB;EACjD,MAAMC,UAAU,GAAG,MAAM,IAAI,CAACC,aAAa,EAAE;EAC7C,MAAMC,IAAI,GAAG,MAAM,IAAI,CAACC,eAAe,EAAE;EACzC,OAAO,MAAMC,kBAAS,CAACC,eAAe,CAACL,UAAU,EAAEE,IAAI,CAAC;AAC1D,CAAC;AAEDX,QAAQ,CAACY,eAAe,GAAG,kBAAkB;EAC3C,MAAMG,UAAU,GAAG,MAAM,IAAI,CAACC,aAAa,EAAE;EAC7C,MAAMC,eAAe,GAAG,MAAM,IAAI,CAACf,kBAAkB,EAAE;EAGvD,OAAO;IACLgB,IAAI,EAAE,CAAC;IACPC,GAAG,EAAEF,eAAe;IACpBG,KAAK,EAAEL,UAAU,CAACK,KAAK;IACvBC,MAAM,EAAEN,UAAU,CAACM,MAAM,GAAGJ;EAC9B,CAAC;AACH,CAAC;AAEDK,MAAM,CAACC,MAAM,CAACxB,UAAU,EAAEC,QAAQ,CAAC;AAAC,IAAAwB,QAAA,GAErBzB,UAAU;AAAAE,OAAA,CAAAwB,OAAA,GAAAD,QAAA"}