@delacour/warden-e2e 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/chunk-e6pn5ygy.mjs +5832 -0
- package/index.d.ts +1 -0
- package/index.mjs +1047 -0
- package/package.json +49 -4
- package/preload.d.ts +1 -0
- package/preload.mjs +4788 -0
- package/types/core/src/allocate.d.ts +23 -0
- package/types/core/src/builds/app-option.schema.d.ts +37 -0
- package/types/core/src/builds/install.d.ts +95 -0
- package/types/core/src/builds/resolve.d.ts +74 -0
- package/types/core/src/config.defaults.d.ts +25 -0
- package/types/core/src/exec.d.ts +18 -0
- package/types/core/src/liveness.d.ts +12 -0
- package/types/core/src/providers/android.d.ts +132 -0
- package/types/core/src/providers/health.d.ts +45 -0
- package/types/core/src/providers/provider.types.d.ts +56 -0
- package/types/core/src/store.d.ts +105 -0
- package/types/core/src/types.d.ts +126 -0
- package/types/e2e/src/alert-buttons.d.ts +41 -0
- package/types/e2e/src/alert-reader.d.ts +25 -0
- package/types/e2e/src/app.d.ts +62 -0
- package/types/e2e/src/device-devtools.d.ts +26 -0
- package/types/e2e/src/device-link.d.ts +43 -0
- package/types/e2e/src/device.d.ts +90 -0
- package/types/e2e/src/devtools/cdp.d.ts +65 -0
- package/types/e2e/src/devtools/console.d.ts +59 -0
- package/types/e2e/src/devtools/devtools.types.d.ts +169 -0
- package/types/e2e/src/devtools/facet.d.ts +28 -0
- package/types/e2e/src/devtools/inspector.d.ts +48 -0
- package/types/e2e/src/devtools/jsonl.d.ts +4 -0
- package/types/e2e/src/devtools/native-log.d.ts +50 -0
- package/types/e2e/src/devtools/network.d.ts +33 -0
- package/types/e2e/src/devtools/network.script.d.ts +24 -0
- package/types/e2e/src/devtools/session.d.ts +82 -0
- package/types/e2e/src/devtools/tree.d.ts +23 -0
- package/types/e2e/src/devtools/tree.script.d.ts +33 -0
- package/types/e2e/src/driver/alerts.d.ts +29 -0
- package/types/e2e/src/driver/android/adb-session.d.ts +52 -0
- package/types/e2e/src/driver/android/android-alert.d.ts +4 -0
- package/types/e2e/src/driver/android/android-animations.d.ts +29 -0
- package/types/e2e/src/driver/android/android-app.d.ts +32 -0
- package/types/e2e/src/driver/android/android-argv.d.ts +122 -0
- package/types/e2e/src/driver/android/android-device.d.ts +44 -0
- package/types/e2e/src/driver/android/android-driver.d.ts +60 -0
- package/types/e2e/src/driver/android/android-dump.d.ts +46 -0
- package/types/e2e/src/driver/android/android-state.d.ts +69 -0
- package/types/e2e/src/driver/android/uiad-backend.d.ts +63 -0
- package/types/e2e/src/driver/android/uiad-client.d.ts +60 -0
- package/types/e2e/src/driver/android/uiad-device.d.ts +70 -0
- package/types/e2e/src/driver/android/uiad-dex.generated.d.ts +8 -0
- package/types/e2e/src/driver/android/uiad-ops.d.ts +62 -0
- package/types/e2e/src/driver/android/uiad-protocol.d.ts +209 -0
- package/types/e2e/src/driver/android/uiautomator.d.ts +33 -0
- package/types/e2e/src/driver/driver.types.d.ts +231 -0
- package/types/e2e/src/driver/errors.d.ts +13 -0
- package/types/e2e/src/driver/gesture-geometry.d.ts +48 -0
- package/types/e2e/src/driver/ios/hid-recovery.d.ts +36 -0
- package/types/e2e/src/driver/ios/ios-driver.d.ts +63 -0
- package/types/e2e/src/driver/ios/ios-session.d.ts +30 -0
- package/types/e2e/src/driver/ios/locate-helper.d.ts +38 -0
- package/types/e2e/src/driver/ios/normalize.d.ts +11 -0
- package/types/e2e/src/driver/ios/simctl.d.ts +102 -0
- package/types/e2e/src/driver/ios/simd-client.d.ts +68 -0
- package/types/e2e/src/driver/ios/simd-protocol.d.ts +433 -0
- package/types/e2e/src/driver/ios/simd-transport.d.ts +43 -0
- package/types/e2e/src/driver/ios/type-budget.d.ts +6 -0
- package/types/e2e/src/driver/observation-cache.d.ts +66 -0
- package/types/e2e/src/driver/open.d.ts +29 -0
- package/types/e2e/src/driver/settle.d.ts +43 -0
- package/types/e2e/src/driver/span-detail.d.ts +12 -0
- package/types/e2e/src/driver/traced-driver.d.ts +14 -0
- package/types/e2e/src/driver/typing.d.ts +48 -0
- package/types/e2e/src/driver/unwrap.d.ts +13 -0
- package/types/e2e/src/env.d.ts +78 -0
- package/types/e2e/src/errors.d.ts +26 -0
- package/types/e2e/src/expect/expect.d.ts +27 -0
- package/types/e2e/src/expect/matchers.d.ts +72 -0
- package/types/e2e/src/fixture-session.d.ts +38 -0
- package/types/e2e/src/fixtures.d.ts +14 -0
- package/types/e2e/src/index.d.ts +11 -0
- package/types/e2e/src/perf/budgets.d.ts +33 -0
- package/types/e2e/src/perf/device-perf.d.ts +45 -0
- package/types/e2e/src/perf/perf.types.d.ts +59 -0
- package/types/e2e/src/preload.d.ts +29 -0
- package/types/e2e/src/runner/artifacts.d.ts +13 -0
- package/types/e2e/src/runner/attempt.d.ts +63 -0
- package/types/e2e/src/runner/callsite.d.ts +2 -0
- package/types/e2e/src/runner/failure.d.ts +40 -0
- package/types/e2e/src/runner/fixtures.types.d.ts +60 -0
- package/types/e2e/src/runner/results.d.ts +48 -0
- package/types/e2e/src/runner/scope.d.ts +64 -0
- package/types/e2e/src/runner/span.d.ts +40 -0
- package/types/e2e/src/runner/step.d.ts +7 -0
- package/types/e2e/src/runner/test.d.ts +59 -0
- package/types/e2e/src/runner/trace.d.ts +87 -0
- package/types/e2e/src/screen/actions.d.ts +93 -0
- package/types/e2e/src/screen/context.d.ts +134 -0
- package/types/e2e/src/screen/field.d.ts +121 -0
- package/types/e2e/src/screen/locator.d.ts +233 -0
- package/types/e2e/src/screen/nodes.d.ts +53 -0
- package/types/e2e/src/screen/poll.d.ts +57 -0
- package/types/e2e/src/screen/queries.d.ts +34 -0
- package/types/e2e/src/screen/query.d.ts +60 -0
- package/types/e2e/src/screen/react-locator.d.ts +30 -0
- package/types/e2e/src/screen/render.d.ts +42 -0
- package/types/e2e/src/screen/roles.d.ts +24 -0
- package/types/e2e/src/screen/screen.d.ts +61 -0
- package/types/e2e/src/screen/selector.d.ts +38 -0
- package/types/e2e/src/screen/text.d.ts +13 -0
- package/types/e2e/src/session.d.ts +124 -0
- package/types/e2e/src/traced-device.d.ts +9 -0
- package/types/e2e/src/version.d.ts +7 -0
- package/types/types/src/result.d.ts +12 -0
- package/README.md +0 -3
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const UIAD_DEX: {
|
|
2
|
+
readonly protocol: 1;
|
|
3
|
+
readonly version: "0.3.0";
|
|
4
|
+
readonly bytes: 31124;
|
|
5
|
+
readonly dexSha256: "d6cb11a3bffc6b00d3ea46c4fdd1721c23973b72b0769f26c2478e7a1769be4c";
|
|
6
|
+
readonly sourceSha256: "d03ff47b9a5890fcc8de5d76b504b05c90402edda60ac69f765c78ec8195cfdc";
|
|
7
|
+
readonly base64: "ZGV4CjAzOAALAG3vu0DO4qAAXoGM16R6HlujKaD7mhyUeQAAcAAAAHhWNBIAAAAAAAAAAMR4AAA8AgAAcAAAAF0AAABgCQAAeQAAANQKAAA+AAAAgBAAAOkAAABwEgAACAAAALgZAADcXgAAuBoAAM5TAADQUwAA01MAAN9TAADqUwAA9lMAAPpTAAD9UwAAAFQAABBUAAAdVAAAKFQAADlUAABIVAAAV1QAAGFUAABzVAAAglQAAJBUAACiVAAAs1QAAL9UAADLVAAA2lQAAOVUAADzVAAAAFUAAAtVAAATVQAAHlUAADRVAABIVQAAX1UAAGpVAABzVQAAfVUAAItVAAChVQAArVUAAMJVAADPVQAA3lUAAAZWAAAUVgAAH1YAACtWAAA2VgAAQFYAAHFWAAB6VgAAhFYAAI1WAACoVgAAtlYAAMNWAADGVgAAzVYAANFWAADYVgAA4lYAAOpWAADvVgAAElcAADdXAABeVwAAjFcAALVXAAC8VwAAz1cAANJXAADWVwAA2VcAAN1XAADiVwAA9FcAAANYAAAKWAAAFlgAABxYAAAqWAAAOVgAADxYAABQWAAAYFgAAGNYAABoWAAAbFgAAHFYAAB0WAAAeFgAAHxYAACBWAAAhVgAAIpYAACVWAAAmFgAAJxYAACgWAAAq1gAALRYAAC4WAAAvVgAAMVYAADJWAAA0FgAANVYAADeWAAA51gAAPhYAAD8WAAAA1kAAAhZAAANWQAAE1kAABdZAABQWQAAiVkAAKVZAADPWQAA6lkAAANaAAAfWgAAM1oAAEhaAABkWgAAeVoAAI9aAACpWgAAwFoAAN9aAAD3WgAAElsAACtbAABVWwAAg1sAAJ9bAADQWwAABFwAADpcAABeXAAAg1wAAKNcAADGXAAA7FwAAAtdAAAnXQAARl0AAGBdAACBXQAAm10AALddAADOXQAA5V0AAAJeAAAaXgAAMV4AAENeAABYXgAAcl4AAIVeAACZXgAAsF4AAMNeAADYXgAA+l4AAAxfAAAvXwAAQ18AAFlfAABtXwAAiF8AAJxfAACwXwAAx18AAOJfAAADYAAAMmAAAE5gAABqYAAAgWAAAJdgAACpYAAAu2AAAN5gAAADYQAAJmEAAEphAAB0YQAApmEAAM1hAADvYQAABWIAAB9iAAA2YgAAPWIAAEhiAABRYgAAVmIAAGBiAABpYgAAcmIAAINiAACJYgAAk2IAAJpiAADZYgAACmMAABRjAAAXYwAAIGMAACRjAAArYwAAL2MAADZjAAA/YwAASWMAAE1jAABSYwAAWmMAAF9jAABlYwAAamMAAG5jAAB0YwAAd2MAAHtjAAB/YwAAhGMAAIhjAACOYwAAlGMAAJljAACeYwAApWMAAKxjAACwYwAAtGMAAN9jAAAOZAAAImQAADdkAABMZAAAUmQAAFZkAABaZAAAXmQAAGJkAABmZAAAamQAAHpkAAB+ZAAAoGQAALtkAADHZAAA02QAAN9kAADrZAAA92QAAARlAAAMZQAAGGUAAB1lAAAiZQAATGUAAGBlAACFZQAAqWUAANhlAADgZQAA7GUAAPhlAAAGZgAADmYAAB1mAAAlZgAAMGYAADlmAABAZgAATGYAAFdmAABeZgAAZGYAAG5mAAB3ZgAAgmYAAJBmAACbZgAAp2YAALdmAADBZgAAyGYAAM9mAADYZgAA3mYAAOdmAADxZgAA/WYAAAZnAAAUZwAAGmcAACZnAAAwZwAAQGcAAEhnAABNZwAAWGcAAGRnAAB1ZwAAgGcAAIxnAACSZwAAmWcAAL1nAADIZwAAzmcAANVnAADcZwAA52cAAPBnAAD+ZwAAB2gAABBoAAAuaAAANWgAADxoAABFaAAAaGgAAIRoAACgaAAArmgAALNoAADGaAAA0GgAANpoAADkaAAA82gAAP1oAAALaQAAImkAADppAABNaQAAWGkAAGlpAAB3aQAAgmkAAI9pAACWaQAAo2kAAKtpAAC5aQAAyGkAANJpAADdaQAA6WkAAPRpAAD9aQAADWoAAB1qAAAtagAANmoAAE1qAABaagAAamoAAHVqAAB+agAAk2oAAKpqAAC0agAAvWoAANRqAADeagAA6moAAPJqAAD7agAABWsAAA1rAAAVawAAI2sAAC1rAAAzawAAO2sAAF5rAABiawAAamsAAG5rAACAawAAjWsAAJVrAACeawAAp2sAALZrAADIawAA42sAAAdsAAAXbAAALmwAADlsAABEbAAAT2wAAFdsAABhbAAAbmwAAHlsAACGbAAAkmwAAJtsAACmbAAAs2wAAL5sAADKbAAA22wAAOJsAADubAAA/GwAAAhtAAAbbQAALG0AADZtAABFbQAASm0AAFNtAABgbQAAbW0AAHNtAAB7bQAAgG0AAI9tAACVbQAAm20AAKBtAACqbQAAtW0AALptAADCbQAAyW0AANBtAADWbQAA3W0AAOptAADwbQAAAm4AACNuAABHbgAAiG4AAKRuAACrbgAAtm4AAL5uAADUbgAA2G4AAORuAADvbgAA924AAABvAAALbwAAEG8AABpvAAAhbwAAMG8AADVvAABMbwAAX28AAGhvAABybwAAg28AAItvAACObwAAl28AAKNvAACqbwAAtG8AAL1vAADGbwAA0W8AAN1vAADobwAA728AAPtvAAACcAAAB3AAAAtwAAAScAAAHnAAACpwAAA2cAAAQXAAAEtwAABRcAAAWHAAAGdwAABycAAAiXAAAKpwAACycAAAwHAAANBwAADbcAAA5HAAAOxwAAD2cAAAA3EAAAlxAAAYcQAAH3EAAClxAAA6cQAAQXEAAExxAABUcQAAW3EAAHhxAAB9cQAAinEAAJFxAACXcQAAp3EAAMVxAADKcQAA0HEAAB9yAAAncgAAL3IAADpyAABBcgAATnIAAFtyAABlcgAAb3IAAHRyAAB6cgAAhXIAAI9yAACTcgAApnIAALRyAADCcgAAyXIAANJyAADhcgAA53IAAPRyAAAEcwAAC3MAABhzAAAhcwAALnMAADVzAAA4cwAAPHMAAEBzAABDcwAAR3MAAEtzAABocwAAcnMAAH5zAACZcwAAvHMAANVzAAD/cwAAC3QAABN0AAAfdAAAKnQAADR0AABBdAAATHQAAFB0AABTdAAAaXQAAHh0AAB9dAAARAAAAEYAAABQAAAAUwAAAFcAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwAAACNAAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgAAACZAAAAmgAAAJsAAACcAAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoAAACrAAAArAAAAK0AAACuAAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtgAAALcAAAC4AAAAuQAAALoAAAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAAAADPAAAA3wAAAOoAAADrAAAA7AAAAO0AAADuAAAA7wAAAPAAAADxAAAARQAAAAAAAAA0UQAARwAAAAEAAAA8UQAASAAAAAEAAABEUQAAUwAAAAMAAAAAAAAAVAAAAAMAAABMUQAAVQAAAAMAAAA8UQAAVgAAAAMAAABUUQAAVwAAAAQAAAAAAAAAWAAAAAQAAABcUQAAWQAAAAQAAABkUQAAWgAAAAQAAABsUQAAXAAAAAQAAAB0UQAAWwAAAAQAAAB8UQAAXAAAAAQAAACEUQAAXgAAAAUAAAAAAAAAXgAAAAkAAAAAAAAAbwAAAAoAAACMUQAAXgAAAA8AAAAAAAAAZwAAABkAAACUUQAAaQAAABkAAACgUQAAawAAABkAAACwUQAAagAAABkAAADQUQAAXgAAABsAAAAAAAAAYwAAABsAAAA0UQAAZgAAABsAAABkUQAAcQAAAC8AAADgUQAAXgAAADAAAAAAAAAAZAAAADAAAABMUQAAbAAAADAAAADoUQAAXgAAADEAAAAAAAAAbAAAADEAAAA8UQAAYwAAADUAAAA0UQAAXgAAADkAAAAAAAAAYwAAADkAAAA0UQAAbwAAADkAAADwUQAAbwAAADkAAAD4UQAAbAAAADkAAAB8UQAAbAAAADkAAAAAUgAAXgAAADsAAAAAAAAAYQAAADsAAAAIUgAAYgAAADsAAAAcUgAAYwAAADsAAAA0UQAAZQAAADsAAAAsUgAAaAAAADsAAABsUQAAbAAAADsAAAA8UgAAbAAAADsAAAA8UQAAbwAAADsAAABEUgAAcAAAADsAAABMUgAAbAAAADsAAABYUgAAbQAAADsAAABgUgAAbgAAADsAAABsUgAAXwAAADwAAAB0UgAAYAAAADwAAAB8UgAAYwAAADwAAAA0UQAAZgAAADwAAABkUQAAbAAAADwAAACEUgAAbAAAADwAAAA8UgAAbAAAADwAAAA8UQAAbAAAADwAAACMUgAAcQAAADwAAADgUQAAXgAAAD8AAAAAAAAAbAAAAEEAAACUUgAAbwAAAEMAAACcUgAAbAAAAEQAAAA8UQAAXgAAAEYAAAAAAAAAXgAAAEcAAAAAAAAAbAAAAEcAAAA8UQAAbAAAAEwAAAA8UQAAbAAAAE0AAACkUgAA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KABIADsBAAAoAGcAIQIAACsAVwA7AAAALwBpAA4BAAAvABkAGAIAADAAAAARAQAAMAADAKcBAAAwABsA/wEAADAAJgANAgAAMQAeAD8BAAAxAD0AUgEAADEAPgBTAQAAMQA+AGEBAAAxACYAYgEAADIAagCYAQAAMgBqAJoBAAAzAFsAOwAAADUAKQAMAgAANQAfABgCAAA3AAQArAEAADcACgCsAQAANwAEAK8BAAA3AAoArwEAADcACADdAQAAOQBIADsAAAA5AB0ATwEAADkASAC9AQAAOQBLABoCAAA7AHEAIAEAADsAcgAuAQAAOwB4AEsBAAA7AAMAdQEAADsAaQCUAQAAOwADAKcBAAA7ACYAEAIAADsALAAYAgAAPABIADsAAAA8AEkAOwAAADwAWwA7AAAAPAAzAAsBAAA8ADQACwEAADwANQALAQAAPAA2AAsBAAA8ADcACwEAADwAOAALAQAAPAA5AAsBAAA8ADsACwEAADwAJgANAgAAPQBJADUBAAA9AFgA7AEAAD4AWgA7AAAAPgBIAPkBAAA/ACYAYAEAAD8AJgANAgAAQAAiALUBAABBACUAtQEAAEEAZgDoAQAAQgA8AEwBAABDACMAjgEAAEMAZgDoAQAARAA/AD8BAABFAEgAOwAAAEYAaQB0AQAARgAgALYBAABHAHIABAEAAEcAIQBJAQAARwBpAJQBAABHAEAAoAEAAEcAAwD0AQAASABIADsAAABIAHQANgEAAEgAdQA5AQAASABiAP4BAABJAEgAOwAAAEkASADeAQAASgBIADoAAABKAEgAOwAAAEoASAD8AAAASgAvAP0AAABKAFsA/gAAAEoALwAwAQAASgB2AHMBAABKAF4AqAEAAEoAaACrAQAASgAtANQBAABKAFsA5gEAAEoASADnAQAASgBEAPgBAABLAGUAOwAAAEsAVAC/AQAATABfADsAAABMACYAYAEAAE0ASAA7AAAATgBhADsAAABPAEgAOwAAAE8AawD8AAAATwAkAP0AAABPAA0A/wAAAE8ADAAAAQAATwAYAAMBAABPAEMADQEAAE8ATAAQAQAATwBIABUBAABPAEgAFwEAAE8ASAAaAQAATwBkACoBAABPAAkAMgEAAE8AFgA+AQAATwAxAEQBAABPABUASAEAAE8AJgB2AQAATwAcAHkBAABPAEgA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ABAsImRpc3BsYXlFcnJvciI6AA0sImVsZW1lbnRzIjpbAAwsImVuY29kZU1zIjoAECwiZmlyc3RFdmVudE1zIjoADywiZm9jdXNlZCI6dHJ1ZQAKLCJncmFiTXMiOgAKLCJoZWlnaHQiOgANLCJsYXN0QWdvTXMiOgAJLCJsYXllciI6AAwsIm1heExhZ01zIjoACywibWVzc2FnZSI6AAksIm1vZGVsIjoABiwibXMiOgAJLCJub2RlcyI6ABQsIm9rIjpmYWxzZSwiZXJyb3IiOgASLCJvayI6dHJ1ZSwiZGF0YSI6ABUsIm9rIjp0cnVlLCJkYXRhIjp7fX0ACSwib3JkZXIiOgAHLCJwaWQiOgAILCJwbmciOiIADCwicG9pbnRlcnMiOgAULCJwcm90b2NvbCI6MSwic2RrIjoACiwicmVhZE1zIjoAEywicmVhc29uIjoidGltZW91dCIACywicmVsZWFzZSI6AA0sInJldHJ5YWJsZSI6ACYsInJldHJ5YWJsZSI6ZmFsc2UsImRldGFpbCI6eyJyZWFzb24iOgAMLCJyb3RhdGlvbiI6AAksInNjYWxlIjoACiwic2NyZWVuIjoACSwidGl0bGUiOgAILCJ0eXBlIjoALywidWlBdXRvbWF0aW9uIjp7InN0YXRlIjoiY29ubmVjdGVkIiwiY29ubmVjdCI6AAcsInVpZCI6AAgsInVwTXMiOgAHLCJ2aWEiOgAZLCJ2aWEiOiJldmVudHMiLCJldmVudHMiOgAMLCJ3YWl0ZWRNcyI6AAssIndpbmRvd3MiOgABLwAFMC4zLjAAAjogAAU6dHJ1ZQAIPGNsaW5pdD4ABjxpbml0PgADPjspACFBQ1RJT05fQVJHVU1FTlRfU0VMRUNUSU9OX0VORF9JTlQAI0FDVElPTl9BUkdVTUVOVF9TRUxFQ1RJT05fU1RBUlRfSU5UACVBQ1RJT05fQVJHVU1FTlRfU0VUX1RFWFRfQ0hBUlNFUVVFTkNFACxBQ1RJT05fU0VUX1NFTEVDVElPTiB3YXMgcmVmdXNlZCBieSB0aGUgbm9kZQAnQUNUSU9OX1NFVF9URVhUIHdhcyByZWZ1c2VkIGJ5IHRoZSBub2RlAAVBU0NJSQARQWxyZWFkeSBjb25uZWN0ZWQAAUMAAkNJAAFEAAJETAADRExEABBFX0FYX1VOQVZBSUxBQkxFAA1FX0JBRF9SRVFVRVNUAAVFX0hJRAAKRV9JTlRFUk5BTAAERV9JTwAMRV9OT19FTEVNRU5UAA1FX1VOU1VQUE9SVEVEAAFGABJHRVNUVVJFX01BWF9GUkFNRVMADkdFU1RVUkVfTUFYX01TAAFJAANJSUkAAklMAANJTEkAAUoAAkpEAAJKSgADSkpKAAJKTAADSkxKAAlKc29uLmphdmEAAUwAAkxDAAJMRgAJTEZGRkZKSUpKAAdMRkZJSkpaAAJMSQADTElJAAZMSUlJSloAAkxKAAVMSklGRgADTEpKAAdMSkpJRkZJAAdMSkpJSUxJAA9MSkpJSUxMSUlGRklJSUkAAkxMAAVMTERKSgADTExJAANMTEwABExMTFoAAkxaADdMYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87ADdMYW5kcm9pZC9hcHAvVWlBdXRvbWF0aW9uJE9uQWNjZXNzaWJpbGl0eUV2ZW50TGlzdGVuZXI7ABpMYW5kcm9pZC9hcHAvVWlBdXRvbWF0aW9uOwAoTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwJENvbXByZXNzRm9ybWF0OwAZTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOwAXTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDsAGkxhbmRyb2lkL29zL0J1aWxkJFZFUlNJT047ABJMYW5kcm9pZC9vcy9CdWlsZDsAE0xhbmRyb2lkL29zL0J1bmRsZTsAGkxhbmRyb2lkL29zL0hhbmRsZXJUaHJlYWQ7ABNMYW5kcm9pZC9vcy9Mb29wZXI7ABRMYW5kcm9pZC9vcy9Qcm9jZXNzOwAYTGFuZHJvaWQvb3MvU3lzdGVtQ2xvY2s7ABVMYW5kcm9pZC91dGlsL0Jhc2U2NDsAHUxhbmRyb2lkL3V0aWwvRGlzcGxheU1ldHJpY3M7ABZMYW5kcm9pZC92aWV3L0Rpc3BsYXk7ABlMYW5kcm9pZC92aWV3L0lucHV0RXZlbnQ7ABdMYW5kcm9pZC92aWV3L0tleUV2ZW50OwAoTGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCRQb2ludGVyQ29vcmRzOwAsTGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCRQb2ludGVyUHJvcGVydGllczsAGkxhbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQ7AC9MYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50OwAyTGFuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlSW5mbzsANExhbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5V2luZG93SW5mbzsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAI0xkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdNZXRob2Q7AB5MZGFsdmlrL2Fubm90YXRpb24vSW5uZXJDbGFzczsAIUxkYWx2aWsvYW5ub3RhdGlvbi9NZW1iZXJDbGFzc2VzOwAkTGRhbHZpay9hbm5vdGF0aW9uL01ldGhvZFBhcmFtZXRlcnM7AB1MZGFsdmlrL2Fubm90YXRpb24vU2lnbmF0dXJlOwAaTGRhbHZpay9hbm5vdGF0aW9uL1Rocm93czsAHUxqYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW07ABhMamF2YS9pby9CdWZmZXJlZFJlYWRlcjsAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsAGExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOwAaTGphdmEvaW8vRmlsZU91dHB1dFN0cmVhbTsAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwAVTGphdmEvaW8vSW5wdXRTdHJlYW07ABtMamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlcjsAFkxqYXZhL2lvL091dHB1dFN0cmVhbTsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwAQTGphdmEvaW8vUmVhZGVyOwATTGphdmEvbGFuZy9Cb29sZWFuOwAYTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7ABFMamF2YS9sYW5nL0NsYXNzOwASTGphdmEvbGFuZy9Eb3VibGU7ABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsAEUxqYXZhL2xhbmcvRmxvYXQ7ABNMamF2YS9sYW5nL0ludGVnZXI7ACBMamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOwAQTGphdmEvbGFuZy9NYXRoOwAhTGphdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb247ABJMamF2YS9sYW5nL09iamVjdDsAFExqYXZhL2xhbmcvUnVubmFibGU7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsAEkxqYXZhL2xhbmcvU3lzdGVtOwASTGphdmEvbGFuZy9UaHJlYWQ7ABVMamF2YS9sYW5nL1Rocm93YWJsZTsAGUxqYXZhL2xhbmcvcmVmbGVjdC9BcnJheTsAH0xqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjsALUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsAGkxqYXZhL25pby9jaGFyc2V0L0NoYXJzZXQ7ABVMamF2YS91dGlsL0FycmF5TGlzdDsAFExqYXZhL3V0aWwvSXRlcmF0b3I7ABBMamF2YS91dGlsL0xpc3Q7ABBMamF2YS91dGlsL0xpc3Q8ACFMbnovY28vZGVsYWNvdXIvd2FyZGVuL3VpYWQvSnNvbjsAI0xuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9NYWluJDE7ACFMbnovY28vZGVsYWNvdXIvd2FyZGVuL3VpYWQvTWFpbjsAIkxuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9VaWEkMTsAKExuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9VaWEkT3BFcnJvcjsAMExuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9VaWEkU25hcHNob3RPcHRpb25zOwAlTG56L2NvL2RlbGFjb3VyL3dhcmRlbi91aWFkL1VpYSRXYWxrOwAgTG56L2NvL2RlbGFjb3VyL3dhcmRlbi91aWFkL1VpYTsAFExvcmcvanNvbi9KU09OQXJyYXk7ABhMb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsAFUxvcmcvanNvbi9KU09OT2JqZWN0OwAFTU9ERUwACU1haW4uamF2YQAHT3BFcnJvcgADUE5HAAhQUk9UT0NPTAAHUkVMRUFTRQAHU0RLX0lOVAAPU25hcHNob3RPcHRpb25zAARUWVBFAAhVUy1BU0NJSQAFVVRGLTgAPVVpQXV0b21hdGlvbihMb29wZXIsIElVaUF1dG9tYXRpb25Db25uZWN0aW9uKSBtaXNzaW5nIG9uIEFQSSAAL1VpQXV0b21hdGlvbkNvbm5lY3Rpb24gaXMgbm90IHJlYWNoYWJsZSBvbiBBUEkgAAhVaWEuamF2YQABVgAHVkVSU0lPTgACVkkABVZJSUlJAAJWSgAFVkpJTEkAB1ZKSklJSUkACFZKSklJTElaAAJWTAADVkxJAAZWTElJSVoAA1ZMTAAEVkxMWgADVkxaAAJWWgAEV2FsawABWgACWkQAAlpJAANaSUwAAlpMAARaTElJAARaTElMAANaTEwAA1pMWgAFWkxaTEwABVpMWkxaAAJbQgACW0kAKVtMYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50JFBvaW50ZXJDb29yZHM7AC1bTGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCRQb2ludGVyUHJvcGVydGllczsAEltMamF2YS9sYW5nL0NsYXNzOwATW0xqYXZhL2xhbmcvT2JqZWN0OwATW0xqYXZhL2xhbmcvU3RyaW5nOwAEW1tbRgACXCIAAlxcAAJcbgACXHIAAlx0AAJcdQAOXSwidHJ1bmNhdGVkIjoAAl19ACBhIGdlc3R1cmUgbGFzdHMgYXQgbW9zdCA2MDAwMCBtcwAZYSBwYXRoIGhhcyAxLi4xMDAwIHBvaW50cwAKYWNjZXNzJDAwMAAKYWNjZXNzJDEwMAAKYWNjZXNzJDIwMAAKYWNjZXNzJDIwMgAKYWNjZXNzJDMwOAALYWNjZXNzRmxhZ3MABmFjdGl2ZQAKYWN0aXZlUm9vdAADYWRkAANhbGwAKGFsbCBwYXRocyBuZWVkIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludHMAEmFscmVhZHkgcmVnaXN0ZXJlZAAjYW5kcm9pZC5hcHAuSVVpQXV0b21hdGlvbkNvbm5lY3Rpb24AImFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbkNvbm5lY3Rpb24ALWFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckdsb2JhbAAGYXBwZW5kAApiYWQgcGF0aDogAApiYWRHZXN0dXJlAAxib29sZWFuVmFsdWUABmJvdHRvbQANY2FuY2VsR2VzdHVyZQAGY2hhckF0AAljaGVja2FibGUAB2NoZWNrZWQABWNsYXNzAApjbGVhckNhY2hlAAljbGlja2FibGUABWNsb3NlAARjb2RlAAhjb21wcmVzcwAHY29ubmVjdAAJY29ubmVjdCgpAAxjb25uZWN0KGludCkACWNvbm5lY3RNcwAKY29ubmVjdFZpYQAOY29ubmVjdF9mYWlsZWQACGNvbnRhaW5zAAVjb3VudAAFZGVidWcAB2RlbnNpdHkABGRlc2MAB2Rlc3Ryb3kACGRpc2FibGVkAApkaXNjb25uZWN0AAdkaXNwbGF5AAxkaXNwbGF5RXJyb3IABGR1bXAACmR1cmF0aW9uTXMACGVkaXRhYmxlAA5lbmNvZGVUb1N0cmluZwAGZXF1YWxzAANlcnIACWVycm9ySnNvbgAKZXZlbnRDb3VudAAPZXZlbnRDb3VudFNpbmNlAAlldmVudExvY2sACmV2ZW50VHlwZXMABGV4aXQABWZpZWxkACJmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld0lkAAlmaW5kRm9jdXMABGZsYWcABWZsYWdzAAVmbHVzaAAJZm9jdXNhYmxlAAdmb2N1c2VkAAxmb2N1c2VkSW5wdXQAB2Zvck5hbWUAB2ZyYW1lTXMAHGZyYW1lTXMgbXVzdCBiZSBpbiAoMCwgMTAwMF0ABWZyZXNoAAVnYXBNcwAHZ2VzdHVyZQAhZ2VzdHVyZSBmYWlsZWQgYmVmb3JlIGFueSBpbnB1dDogABpnZXN0dXJlIGludGVycnVwdGVkIGFmdGVyIAAaZ2VzdHVyZSB0YWtlcyAxIG9yIDIgcGF0aHMADGdlc3R1cmVFdmVudAADZ2V0ABFnZXRCb3VuZHNJblNjcmVlbgAIZ2V0Qnl0ZXMACGdldENhdXNlAAhnZXRDaGlsZAANZ2V0Q2hpbGRDb3VudAAIZ2V0Q2xhc3MADGdldENsYXNzTmFtZQAVZ2V0Q29udGVudERlc2NyaXB0aW9uABZnZXREZWNsYXJlZENvbnN0cnVjdG9yABFnZXREZWNsYXJlZE1ldGhvZAAJZ2V0RG91YmxlAA9nZXREcmF3aW5nT3JkZXIADGdldEV2ZW50VHlwZQAJZ2V0SGVpZ2h0AAtnZXRIaW50VGV4dAAFZ2V0SWQAC2dldEluc3RhbmNlAAZnZXRJbnQADGdldEpTT05BcnJheQANZ2V0SlNPTk9iamVjdAAIZ2V0TGF5ZXIACWdldExvb3BlcgAKZ2V0TWVzc2FnZQAJZ2V0TWV0aG9kAAdnZXROYW1lAA5nZXRQYWNrYWdlTmFtZQAOZ2V0UmVhbERpc3BsYXkADmdldFJlYWxNZXRyaWNzAAdnZXRSb290ABVnZXRSb290SW5BY3RpdmVXaW5kb3cAC2dldFJvdGF0aW9uAA5nZXRTZXJ2aWNlSW5mbwAJZ2V0U3RyaW5nAAdnZXRUZXh0ABNnZXRUZXh0U2VsZWN0aW9uRW5kABVnZXRUZXh0U2VsZWN0aW9uU3RhcnQACGdldFRpdGxlAAdnZXRUeXBlABVnZXRWaWV3SWRSZXNvdXJjZU5hbWUACGdldFdpZHRoAApnZXRXaW5kb3dzAAZoYW5kbGUAB2hhc05leHQACGhhc2hDb2RlAAZoZWFsdGgABmhlaWdodAAMaGVpZ2h0UGl4ZWxzAAhoZWxkVGV4dAAEaGludAAGaG9sZE1zACFob2xkTXMgYW5kIHJlbGVhc2VNcyBtdXN0IGJlID49IDAAAmlkAAZpZGxlTXMAAmluABBpbmNsdWRlSW52aXNpYmxlAAtpbml0RGlzcGxheQAGaW5qZWN0AAdpbmplY3QyAAdpbmplY3QzAA1pbmplY3RHZXN0dXJlABBpbmplY3RJbnB1dEV2ZW50ABlpbmplY3RJbnB1dEV2ZW50IGZhaWxlZDogACJpbmplY3RJbnB1dEV2ZW50IHJlZnVzZWQgdGhlIGV2ZW50AA5pbmplY3RMb29rZWRVcAAVaW5qZWN0Tm9BbmltYXRpb25XYWl0AAlpbmplY3RPbmUACWludGVyc2VjdAAJaW52aXNpYmxlAAZpbnZva2UACGlzQWN0aXZlAAtpc0NoZWNrYWJsZQAJaXNDaGVja2VkAAtpc0NsaWNrYWJsZQAKaXNFZGl0YWJsZQAHaXNFbXB0eQAJaXNFbmFibGVkAAtpc0ZvY3VzYWJsZQAJaXNGb2N1c2VkAAppc0luZmluaXRlAA9pc0xvbmdDbGlja2FibGUABWlzTmFOAAppc1Bhc3N3b3JkAAxpc1Njcm9sbGFibGUACmlzU2VsZWN0ZWQAEWlzU2hvd2luZ0hpbnRUZXh0AA9pc1Zpc2libGVUb1VzZXIACGl0ZXJhdG9yAA1rZWVwSW52aXNpYmxlAANrZXkAB2tleUNvZGUAC2xhc3RFdmVudE1zAAtsYXN0SW5wdXRNcwAEbGVmdAAGbGVuZ3RoAANsb2cADWxvbmdDbGlja2FibGUABGxvb3AABG1haW4AA21heAAIbWF4Tm9kZXMACW1ldGFTdGF0ZQADbWluAAZtb3Rpb24ABW15UGlkAAVteVVpZAAEbmFtZQAFbmFtZXMAC25ld0luc3RhbmNlAARuZXh0ABBubyBmb2N1c2VkIGlucHV0AB9ubyBmb2N1c2VkIGlucHV0IHRvIHNldCB0ZXh0IG9uACJubyByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgd2luZG93AD9ubyByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgd2luZG93IChVaUF1dG9tYXRpb24gcmV0dXJuZWQgbnVsbCkAGm5vIHdpbmRvdyB3aXRoIGEgcm9vdCBub2RlAAVub2RlcwAJbm90aWZ5QWxsAAZvYnRhaW4AFG9uQWNjZXNzaWJpbGl0eUV2ZW50AAJvcAAKb3B0Qm9vbGVhbgAJb3B0RG91YmxlAAZvcHRJbnQAB29wdExvbmcACW9wdFN0cmluZwADb3V0AAhwYXNzd29yZAAFcGF0aHMADXBlcmZvcm1BY3Rpb24AA3BrZwAVcG9pbnRzIG11c3QgYmUgZmluaXRlABFwcmVwYXJlTWFpbkxvb3BlcgAHcHJlc3NNcwAIcHJlc3N1cmUAD3B1dENoYXJTZXF1ZW5jZQAGcHV0SW50AAFxAAdxdWlldE1zAApxdWl0U2FmZWx5AAVxdW90ZQAIcmVhZExpbmUAB3JlY3ljbGUAB3JlZnJlc2gACXJlbGVhc2VNcwAKcmVzb3VyY2VJZAAJcmV0cnlhYmxlAAVyaWdodAAKcm9vdFdhaXRNcwAFcm91bmQAA3J1bgACc2IABXNjb3BlAApzY3JlZW5Kc29uAApzY3JlZW5zaG90AApzY3JvbGxhYmxlAAlzZWxlY3RBbGwACHNlbGVjdGVkAARzZW5kAAVzZXJ2ZQANc2V0QWNjZXNzaWJsZQAJc2V0RGFlbW9uABVzZXRJbnRlcmFjdGl2ZVdpbmRvd3MAH3NldE9uQWNjZXNzaWJpbGl0eUV2ZW50TGlzdGVuZXIABnNldE91dAAMc2V0U2VsZWN0aW9uAA5zZXRTZXJ2aWNlSW5mbwAJc2V0U291cmNlAAdzZXRUZXh0AAZzZXR0bGUACHNodXRkb3duAAtzaWduaWZpY2FudAAEc2l6ZQANc2tpcEludmlzaWJsZQAFc2xlZXAACHNuYXBzaG90AA9zbmFwc2hvdE9wdGlvbnMABXN0YXJ0AAlzdGFydGVkTXMABnN0ZG91dAAFc3RlcHMAG3N0b2NrIHNlcnZpY2UgaW5mbyBmbGFncz0weAADc3RyAAtzdWJTZXF1ZW5jZQAFc3dpcGUABHN5bmMADnRha2VTY3JlZW5zaG90ABx0YWtlU2NyZWVuc2hvdCByZXR1cm5lZCBudWxsAAN0YXAABHRleHQATXRoZSB0ZXh0IG9mIGEgcGFzc3dvcmQgZmllbGQgaXMgbm90IHJlYWRhYmxlLCBzbyBpdCBjYW5ub3QgYmUgZWRpdGVkIGluIHBsYWNlAAZ0aGlzJDAABnRocmVhZAAJdGltZW91dE1zAAV0aW1lcwALdG9CeXRlQXJyYXkAC3RvSGV4U3RyaW5nAAh0b1N0cmluZwAIdG9vbFR5cGUAA3RvcAAEdHJpbQAJdHJ1bmNhdGVkAAh0eXBlVGV4dAACdWEAEXVpYXV0b21hdGlvbl9idXN5AAx1bmtub3duIG9wOiAADHVwdGltZU1pbGxpcwAFdmFsdWUAB3ZhbHVlT2YADXZpc2libGVCb3VuZHMABHdhaXQAC3dhcmRlbi11aWFkAA53YXJkZW4tdWlhZC1pbwAFd2lkdGgAC3dpZHRoUGl4ZWxzAAd3aW5kb3dzAAt3aW5kb3dzSnNvbgAFd3JpdGUAAXgAAngxAAJ4MgABeQACeTEAAnkyABt7ImJhY2tlbmQiOiJ1aWFkIiwic2NyZWVuIjoACHsiY29kZSI6AAp7ImRvd25NcyI6ABl7ImV2ZW50IjoiZmF0YWwiLCJlcnJvciI6ACF7ImV2ZW50IjoiZmF0YWwiLCJlcnJvciI6eyJjb2RlIjoAF3siZXZlbnQiOiJsb2ciLCJsZXZlbCI6ACh7ImV2ZW50IjoicmVhZHkiLCJwcm90b2NvbCI6MSwidmVyc2lvbiI6AAp7ImZyYW1lcyI6AAZ7ImlkIjoACnsibGVuZ3RoIjoACXsicXVpZXQiOgAIeyJ0ZXh0IjoAC3sidmVyc2lvbiI6AAl7IndpZHRoIjoAAnt9AAF9ABR9LCJldmVudHMiOnsiY291bnQiOgANfSwidXB0aW1lTXMiOgADfX19AJ4Bfn5EOHsiYmFja2VuZCI6ImRleCIsImNvbXBpbGF0aW9uLW1vZGUiOiJyZWxlYXNlIiwiaGFzLWNoZWNrc3VtcyI6ZmFsc2UsIm1pbi1hcGkiOjI2LCJzaGEtMSI6IjA4NGE4OTEyNmFlMDU5NmM1OTkxNDNkZjU3YTY1NDY0NmFmMjgzMTMiLCJ2ZXJzaW9uIjoiOS4yLjQtZGV2In0AAh4BlwQaqAIfAoECBACzAx4CIwGXBBwBGDMCIQKBAhwBRBCAALQDHAEeAh4BlwQavQIfAoECBBizAxfDAh0BlwQYTwIfAoECBBizAxfIAh8CgQIEGrMDF94CIgGXBBwFFwYXtReJFzwXqQIjAZcEHAEYTAIgAZcEHAMYTBhNGE4AAAQAmgGCgAS8NgEIuDUBCIQ2AQjUNgAAAQGeAYCABMQ4nwEB3DgEAA0AGRoBGAEYAQqgAYiABPxKAYKABKBLAYgguEsBiCCcSAGIINBLAQq4SAEK0DkBCOhLAQnITAEKoEkBioAIhE0BCpROAQrUSQABAQEdkCCtAYCABNRSrgEB8FIAAgEAHhABEK8BgIAE6FMABwEAIAABAAEAAQABAAEAAQCxAYCABIhUAAcBACcQARABEAEAARABAAEQsgGAgATQVAIOGw0uGgEaMAABAgECAQIBAgESAQIBAgECAQIBAgEQAQIBArMBgIAE/IgBAYgg8FgBiCCAXQGIIOyHAQGIIISIAQECvFcBCtiIAQECuIkBAQL0iQEDAviPAQECpIgBAQKIWAIKyFUCCpxcAQKElQEBApSWAQECjJcBAQKMWQGCAcyXAQIChFcBCrxvAQKQmAEDAqyZAQEC5FoDCqBbBQL8VAEKmIUBvAEAnIoBAQCciwEEAJhdAgD0agcArG4EAPBvAQCEcgMAhHMBALx1AgCweAEA+H0BAOx/AQCEggEDHgQBFzcCJOgDRmDqAAIAAAAedQAAJXUAAAEAAAAvdQAAAQAAADh1AAACAAAASHUAACV1AAACAAAAWnUAAE91AAACAAAAWnUAAGF1AAACAAAAWnUAAGx1AAABAAAAd3UAAAEAAACIdQAAAQAAAJF1AABQdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAKIAAABcdwAAqwAAAFx3AABsdwAAAAAAAAEAAAAAAAAArQAAAGR3AAB4dwAAAAAAAAAAAAAAAAAAhHcAAAAAAAAAAAAAAAAAAJB3AAAAAAAAAAAAAAAAAACsdwAAAAAAABEAAAAAAAAAvQAAAFx3AADAAAAApHcAAMEAAACkdwAAxAAAAKR3AADGAAAApHcAAMcAAACkdwAAyAAAAFx3AADJAAAAXHcAAMoAAACkdwAAzgAAAKR3AADPAAAApHcAANIAAACkdwAA1QAAAKR3AADWAAAApHcAANcAAACkdwAA2AAAAKR3AADaAAAAnHcAABEAAAAAAAAAAQAAAAAAAAABAAAAPAIAAHAAAAACAAAAXQAAAGAJAAADAAAAeQAAANQKAAAEAAAAPgAAAIAQAAAFAAAA6QAAAHASAAAGAAAACAAAALgZAAABIAAAQAAAALgaAAADIAAAPQAAAPhMAAABEAAARQAAACRRAAACIAAAPAIAAM5TAAAEIAAADAAAAB51AAAAIAAACAAAAJ51AAAFIAAAAgAAAEJ3AAADEAAACgAAAFB3AAAGIAAABwAAALR3AAAAEAAAAQAAAMR4AAA=";
|
|
8
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { DriverResult, Logger, Point, ScreenInfo, Snapshot } from "../driver.types";
|
|
2
|
+
import type { GesturePlan } from "../gesture-geometry";
|
|
3
|
+
import type { SettleDetail } from "../settle";
|
|
4
|
+
import { type Clock } from "./android-device";
|
|
5
|
+
import type { UiadBackend } from "./uiad-backend";
|
|
6
|
+
import type { UiadSnapshotData } from "./uiad-protocol";
|
|
7
|
+
/**
|
|
8
|
+
* What the Android driver asks of `warden-uiad`, one method per thing the server does faster than `uiautomator dump`
|
|
9
|
+
* and `input`. Every method answers `undefined` when the server is not the way to do that call (it is off, it could
|
|
10
|
+
* not start, or it refused this one op) and the driver then does it the old way; a result, success or error, is final.
|
|
11
|
+
*
|
|
12
|
+
* Which failures fall back and which are surfaced:
|
|
13
|
+
* - the op was refused (`E_HID`, `E_NO_ELEMENT`, `E_UNSUPPORTED`): nothing happened, the server is fine, this call
|
|
14
|
+
* falls back (a `typeText` with nothing focused is typed by `input text` as before);
|
|
15
|
+
* - the server died, hung or sent nonsense: it is stopped, so the dump can have UiAutomation again, and the next call
|
|
16
|
+
* starts a new one. A read (`snapshot`, `settle`, `selectAll`) falls back; a tap, swipe, key or typed text is
|
|
17
|
+
* surfaced, because it may have happened and doing it twice is worse than a failed step;
|
|
18
|
+
* - the request never left (the server had already gone): started again and sent again, once.
|
|
19
|
+
*/
|
|
20
|
+
/** A settled `DriverResult`. */
|
|
21
|
+
type Res<T> = Awaited<DriverResult<T>>;
|
|
22
|
+
export type Maybe<T> = Promise<Res<T> | undefined>;
|
|
23
|
+
export type UiadOps = {
|
|
24
|
+
/** the server is on and has not been given up on: what `capabilities` reports */
|
|
25
|
+
enabled(): boolean;
|
|
26
|
+
/** `up`, `idle`, `busy`, or `off: <why>`: for `health` */
|
|
27
|
+
status(): string;
|
|
28
|
+
snapshot(): Maybe<Snapshot>;
|
|
29
|
+
settle(opts: {
|
|
30
|
+
quietMs: number;
|
|
31
|
+
timeoutMs: number;
|
|
32
|
+
}): Maybe<SettleDetail>;
|
|
33
|
+
tap(point: Point, opts?: {
|
|
34
|
+
count?: number;
|
|
35
|
+
durationMs?: number;
|
|
36
|
+
}): Maybe<void>;
|
|
37
|
+
longPress(point: Point, durationMs?: number): Maybe<void>;
|
|
38
|
+
swipe(from: Point, to: Point, durationMs?: number): Maybe<void>;
|
|
39
|
+
drag(from: Point, to: Point, timing: {
|
|
40
|
+
pressMs: number;
|
|
41
|
+
durationMs: number;
|
|
42
|
+
releaseMs: number;
|
|
43
|
+
}): Maybe<void>;
|
|
44
|
+
/** replay a 1-2 finger plan as one multi-pointer MotionEvent stream (`gesture` op, server 0.3.0+) */
|
|
45
|
+
gesture(plan: GesturePlan): Maybe<void>;
|
|
46
|
+
key(keyCode: number, times?: number): Maybe<void>;
|
|
47
|
+
selectAll(): Maybe<void>;
|
|
48
|
+
typeText(text: string): Maybe<void>;
|
|
49
|
+
/** replace the whole text of the focused input (`ACTION_SET_TEXT`); `undefined` = refused or no server */
|
|
50
|
+
setText(text: string): Maybe<void>;
|
|
51
|
+
stop(): Promise<void>;
|
|
52
|
+
};
|
|
53
|
+
export type UiadOpsDeps = {
|
|
54
|
+
backend: UiadBackend;
|
|
55
|
+
baseScreen: ScreenInfo;
|
|
56
|
+
clock: Clock;
|
|
57
|
+
log?: Logger;
|
|
58
|
+
};
|
|
59
|
+
/** The `Snapshot` the driver builds from a server reply: the same tree the dump of that screen gives. */
|
|
60
|
+
export declare function snapshotFromUiad(data: UiadSnapshotData, baseScreen: ScreenInfo, takenAt: number): Snapshot;
|
|
61
|
+
export declare function createUiadOps(deps: UiadOpsDeps): UiadOps;
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { responseSchema, type WireError } from "../ios/simd-protocol";
|
|
3
|
+
/**
|
|
4
|
+
* Wire format of `warden-uiad` (plan WDN-PERF, "Android server (PERF-3.2)"), the resident UiAutomation server in
|
|
5
|
+
* `native/android/`. The same NDJSON shapes as `warden-simd` (`ios/simd-protocol.ts`, whose framing, `log` / `fatal`
|
|
6
|
+
* events, responses and error mapping it reuses): requests `{id, op, ...params}`; replies `{id, ok:true, data}` /
|
|
7
|
+
* `{id, ok:false, error}`; events `{event:"ready"|"log"|"fatal", ...}`. Unlike simd the server runs one op at a
|
|
8
|
+
* time, so replies come back in request order.
|
|
9
|
+
*/
|
|
10
|
+
export declare const UIAD_PROTOCOL = 1;
|
|
11
|
+
/** The class the dex's `Main` lives in; `app_process <dir> <class>` starts it and `ps` shows it. */
|
|
12
|
+
export declare const UIAD_MAIN_CLASS = "nz.co.delacour.warden.uiad.Main";
|
|
13
|
+
/**
|
|
14
|
+
* One accessibility node, with the attributes `uiautomator dump` writes under nearly the same names (a flag that is
|
|
15
|
+
* false is absent, `disabled` is true only for a disabled node, `invisible` only for a node that is not visible to the
|
|
16
|
+
* user). `bounds` is `[left, top, right, bottom]` in screen pixels, clipped to the display like the dump's.
|
|
17
|
+
*/
|
|
18
|
+
export type UiadNode = {
|
|
19
|
+
class?: string;
|
|
20
|
+
pkg?: string;
|
|
21
|
+
/** the raw `resource-id`, `pkg:id/name` for platform ids and the bare testID for React Native */
|
|
22
|
+
id?: string;
|
|
23
|
+
text?: string;
|
|
24
|
+
desc?: string;
|
|
25
|
+
hint?: string;
|
|
26
|
+
bounds: readonly [number, number, number, number];
|
|
27
|
+
clickable?: boolean;
|
|
28
|
+
longClickable?: boolean;
|
|
29
|
+
checkable?: boolean;
|
|
30
|
+
checked?: boolean;
|
|
31
|
+
scrollable?: boolean;
|
|
32
|
+
selected?: boolean;
|
|
33
|
+
focused?: boolean;
|
|
34
|
+
focusable?: boolean;
|
|
35
|
+
password?: boolean;
|
|
36
|
+
editable?: boolean;
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
invisible?: boolean;
|
|
39
|
+
/** drawing order among siblings */
|
|
40
|
+
order?: number;
|
|
41
|
+
children?: UiadNode[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* A node read off the wire, or why it is not one. Hand-written rather than zod: a snapshot is hundreds of nodes and
|
|
45
|
+
* this runs on every one, with no allocation beyond the node itself.
|
|
46
|
+
*/
|
|
47
|
+
export declare function readNode(value: unknown, path?: string): UiadNode | string;
|
|
48
|
+
/** What `health` and the `ready` event carry. Unknown fields are kept (a newer server may add some). */
|
|
49
|
+
export declare const healthSchema: z.ZodObject<{
|
|
50
|
+
version: z.ZodString;
|
|
51
|
+
protocol: z.ZodNumber;
|
|
52
|
+
sdk: z.ZodNumber;
|
|
53
|
+
release: z.ZodOptional<z.ZodString>;
|
|
54
|
+
model: z.ZodOptional<z.ZodString>;
|
|
55
|
+
uid: z.ZodOptional<z.ZodNumber>;
|
|
56
|
+
pid: z.ZodOptional<z.ZodNumber>;
|
|
57
|
+
uiAutomation: z.ZodObject<{
|
|
58
|
+
state: z.ZodString;
|
|
59
|
+
connect: z.ZodOptional<z.ZodString>;
|
|
60
|
+
connectMs: z.ZodOptional<z.ZodNumber>;
|
|
61
|
+
}, z.core.$loose>;
|
|
62
|
+
events: z.ZodOptional<z.ZodObject<{
|
|
63
|
+
count: z.ZodNumber;
|
|
64
|
+
lastAgoMs: z.ZodNumber;
|
|
65
|
+
}, z.core.$loose>>;
|
|
66
|
+
uptimeMs: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
screen: z.ZodOptional<z.ZodObject<{
|
|
68
|
+
width: z.ZodNumber;
|
|
69
|
+
height: z.ZodNumber;
|
|
70
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
71
|
+
rotation: z.ZodOptional<z.ZodNumber>;
|
|
72
|
+
}, z.core.$strip>>;
|
|
73
|
+
displayError: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$loose>;
|
|
75
|
+
export type UiadHealth = z.infer<typeof healthSchema>;
|
|
76
|
+
export declare const settleDataSchema: z.ZodObject<{
|
|
77
|
+
quiet: z.ZodBoolean;
|
|
78
|
+
waitedMs: z.ZodNumber;
|
|
79
|
+
via: z.ZodLiteral<"events">;
|
|
80
|
+
events: z.ZodNumber;
|
|
81
|
+
firstEventMs: z.ZodOptional<z.ZodNumber>;
|
|
82
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
83
|
+
}, z.core.$loose>;
|
|
84
|
+
export type UiadSettleData = z.infer<typeof settleDataSchema>;
|
|
85
|
+
export declare const textDataSchema: z.ZodObject<{
|
|
86
|
+
text: z.ZodString;
|
|
87
|
+
caret: z.ZodOptional<z.ZodNumber>;
|
|
88
|
+
caretPlaced: z.ZodOptional<z.ZodBoolean>;
|
|
89
|
+
}, z.core.$loose>;
|
|
90
|
+
export type UiadTextData = z.infer<typeof textDataSchema>;
|
|
91
|
+
export type UiadSnapshotData = {
|
|
92
|
+
backend: "uiad";
|
|
93
|
+
screen: {
|
|
94
|
+
width: number;
|
|
95
|
+
height: number;
|
|
96
|
+
scale?: number;
|
|
97
|
+
rotation?: number;
|
|
98
|
+
};
|
|
99
|
+
windows?: unknown[];
|
|
100
|
+
elements: UiadNode[];
|
|
101
|
+
truncated: boolean;
|
|
102
|
+
nodes: number;
|
|
103
|
+
readMs: number;
|
|
104
|
+
ms: number;
|
|
105
|
+
};
|
|
106
|
+
/** The data of a `snapshot` reply, with every node checked; a string is why it is not one. */
|
|
107
|
+
export declare function readSnapshotData(data: unknown): UiadSnapshotData | string;
|
|
108
|
+
export declare const readyEventSchema: z.ZodObject<{
|
|
109
|
+
event: z.ZodLiteral<"ready">;
|
|
110
|
+
protocol: z.ZodNumber;
|
|
111
|
+
version: z.ZodString;
|
|
112
|
+
data: z.ZodObject<{
|
|
113
|
+
version: z.ZodString;
|
|
114
|
+
protocol: z.ZodNumber;
|
|
115
|
+
sdk: z.ZodNumber;
|
|
116
|
+
release: z.ZodOptional<z.ZodString>;
|
|
117
|
+
model: z.ZodOptional<z.ZodString>;
|
|
118
|
+
uid: z.ZodOptional<z.ZodNumber>;
|
|
119
|
+
pid: z.ZodOptional<z.ZodNumber>;
|
|
120
|
+
uiAutomation: z.ZodObject<{
|
|
121
|
+
state: z.ZodString;
|
|
122
|
+
connect: z.ZodOptional<z.ZodString>;
|
|
123
|
+
connectMs: z.ZodOptional<z.ZodNumber>;
|
|
124
|
+
}, z.core.$loose>;
|
|
125
|
+
events: z.ZodOptional<z.ZodObject<{
|
|
126
|
+
count: z.ZodNumber;
|
|
127
|
+
lastAgoMs: z.ZodNumber;
|
|
128
|
+
}, z.core.$loose>>;
|
|
129
|
+
uptimeMs: z.ZodOptional<z.ZodNumber>;
|
|
130
|
+
screen: z.ZodOptional<z.ZodObject<{
|
|
131
|
+
width: z.ZodNumber;
|
|
132
|
+
height: z.ZodNumber;
|
|
133
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
134
|
+
rotation: z.ZodOptional<z.ZodNumber>;
|
|
135
|
+
}, z.core.$strip>>;
|
|
136
|
+
displayError: z.ZodOptional<z.ZodString>;
|
|
137
|
+
}, z.core.$loose>;
|
|
138
|
+
}, z.core.$strip>;
|
|
139
|
+
export type UiadReadyEvent = z.infer<typeof readyEventSchema>;
|
|
140
|
+
export declare const eventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
141
|
+
event: z.ZodLiteral<"ready">;
|
|
142
|
+
protocol: z.ZodNumber;
|
|
143
|
+
version: z.ZodString;
|
|
144
|
+
data: z.ZodObject<{
|
|
145
|
+
version: z.ZodString;
|
|
146
|
+
protocol: z.ZodNumber;
|
|
147
|
+
sdk: z.ZodNumber;
|
|
148
|
+
release: z.ZodOptional<z.ZodString>;
|
|
149
|
+
model: z.ZodOptional<z.ZodString>;
|
|
150
|
+
uid: z.ZodOptional<z.ZodNumber>;
|
|
151
|
+
pid: z.ZodOptional<z.ZodNumber>;
|
|
152
|
+
uiAutomation: z.ZodObject<{
|
|
153
|
+
state: z.ZodString;
|
|
154
|
+
connect: z.ZodOptional<z.ZodString>;
|
|
155
|
+
connectMs: z.ZodOptional<z.ZodNumber>;
|
|
156
|
+
}, z.core.$loose>;
|
|
157
|
+
events: z.ZodOptional<z.ZodObject<{
|
|
158
|
+
count: z.ZodNumber;
|
|
159
|
+
lastAgoMs: z.ZodNumber;
|
|
160
|
+
}, z.core.$loose>>;
|
|
161
|
+
uptimeMs: z.ZodOptional<z.ZodNumber>;
|
|
162
|
+
screen: z.ZodOptional<z.ZodObject<{
|
|
163
|
+
width: z.ZodNumber;
|
|
164
|
+
height: z.ZodNumber;
|
|
165
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
166
|
+
rotation: z.ZodOptional<z.ZodNumber>;
|
|
167
|
+
}, z.core.$strip>>;
|
|
168
|
+
displayError: z.ZodOptional<z.ZodString>;
|
|
169
|
+
}, z.core.$loose>;
|
|
170
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
171
|
+
event: z.ZodLiteral<"log">;
|
|
172
|
+
level: z.ZodEnum<{
|
|
173
|
+
error: "error";
|
|
174
|
+
info: "info";
|
|
175
|
+
warn: "warn";
|
|
176
|
+
debug: "debug";
|
|
177
|
+
}>;
|
|
178
|
+
message: z.ZodString;
|
|
179
|
+
op: z.ZodOptional<z.ZodString>;
|
|
180
|
+
id: z.ZodOptional<z.ZodString>;
|
|
181
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
182
|
+
event: z.ZodLiteral<"fatal">;
|
|
183
|
+
error: z.ZodObject<{
|
|
184
|
+
code: z.ZodString;
|
|
185
|
+
message: z.ZodString;
|
|
186
|
+
retryable: z.ZodOptional<z.ZodBoolean>;
|
|
187
|
+
detail: z.ZodOptional<z.ZodUnknown>;
|
|
188
|
+
}, z.core.$strip>;
|
|
189
|
+
}, z.core.$strip>], "event">;
|
|
190
|
+
export type UiadEvent = z.infer<typeof eventSchema>;
|
|
191
|
+
export type UiadResponse = z.infer<typeof responseSchema>;
|
|
192
|
+
export type UiadMessage = {
|
|
193
|
+
kind: "event";
|
|
194
|
+
event: UiadEvent;
|
|
195
|
+
} | {
|
|
196
|
+
kind: "response";
|
|
197
|
+
response: UiadResponse;
|
|
198
|
+
};
|
|
199
|
+
export type ParsedUiadLine = {
|
|
200
|
+
success: true;
|
|
201
|
+
message: UiadMessage;
|
|
202
|
+
} | {
|
|
203
|
+
success: false;
|
|
204
|
+
reason: string;
|
|
205
|
+
};
|
|
206
|
+
export declare function parseUiadLine(line: string): ParsedUiadLine;
|
|
207
|
+
/** Why the server could not start, from `fatal.error.detail.reason`. */
|
|
208
|
+
export type FatalReason = "uiautomation_busy" | "connect_failed";
|
|
209
|
+
export declare function fatalReason(error: WireError): FatalReason | undefined;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Element } from "../driver.types";
|
|
2
|
+
import type { UiadNode } from "./uiad-protocol";
|
|
3
|
+
/** Thrown when the text has no `<hierarchy>` (e.g. `ERROR: null root node returned by UiTestAutomationBridge.`). */
|
|
4
|
+
export declare class UiautomatorParseError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export type ParsedTree = {
|
|
8
|
+
elements: Element[];
|
|
9
|
+
flat: Element[];
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Parse `uiautomator dump` output into the normalized tree. Ids are preorder paths (`0`, `0.3`, `0.3.1`).
|
|
13
|
+
* Anything outside `<hierarchy>…</hierarchy>` (the `UI hierarchy dumped to:` trailer, which some images
|
|
14
|
+
* misspell `hierchary`) is ignored. Throws `UiautomatorParseError` when there is no hierarchy at all.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseUiautomatorXml(xml: string, screen: {
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
}): ParsedTree;
|
|
20
|
+
/**
|
|
21
|
+
* The normalized tree of a `warden-uiad` snapshot: the same `Element`s, ids and depths `parseUiautomatorXml` gives for
|
|
22
|
+
* the same screen (the server writes the dump's attributes and skips the same invisible nodes), without the XML.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseUiadNodes(nodes: readonly UiadNode[], screen: {
|
|
25
|
+
width: number;
|
|
26
|
+
height: number;
|
|
27
|
+
}): ParsedTree;
|
|
28
|
+
/**
|
|
29
|
+
* Keep clickable / long-clickable / checkable / scrollable / EditText nodes plus all their ancestors.
|
|
30
|
+
* Returns a new tree (inputs untouched) with ids and depths preserved; descendants of a kept node are
|
|
31
|
+
* only retained when they are interactive themselves.
|
|
32
|
+
*/
|
|
33
|
+
export declare function interactiveFilter(elements: readonly Element[]): ParsedTree;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import type { AsyncResult } from "../../../types/src/result";
|
|
2
|
+
/**
|
|
3
|
+
* The device driver contract every layer of warden-e2e builds on: the spec API (`screen`, `device`,
|
|
4
|
+
* `app`), `warden ui`, specs and the devtools facet all talk to a `Driver`. Implementations:
|
|
5
|
+
* `ios/ios-driver.ts` (warden-simd over NDJSON + `xcrun simctl`) and `android/android-driver.ts`
|
|
6
|
+
* (persistent `adb shell` + uiautomator). `driver.testing.ts` has the scripted FakeDriver for tests.
|
|
7
|
+
*
|
|
8
|
+
* Frozen interface — change it only together with `docs/plans/wdn-e2e.md`.
|
|
9
|
+
*/
|
|
10
|
+
export type Platform = "ios" | "android";
|
|
11
|
+
export type DriverErrorCode = "E_HELPER_MISSING" | "E_HELPER_CRASHED" | "E_TIMEOUT" | "E_NOT_BOOTED" | "E_UNKNOWN_DEVICE" | "E_AX_UNAVAILABLE" | "E_APP_UNAVAILABLE" | "E_APP_NOT_RESPONDING" | "E_NO_ELEMENT" | "E_STALE_REF" | "E_UNSUPPORTED" | "E_UNSUPPORTED_TEXT" | "E_HID" | "E_IO" | "E_BAD_REQUEST" | "E_INTERNAL";
|
|
12
|
+
export type DriverError = {
|
|
13
|
+
code: DriverErrorCode;
|
|
14
|
+
message: string;
|
|
15
|
+
retryable: boolean;
|
|
16
|
+
detail?: unknown;
|
|
17
|
+
};
|
|
18
|
+
export type DriverResult<T> = AsyncResult<T, DriverError>;
|
|
19
|
+
/** Points on iOS (portrait-up screen space, same as AX frames), px on Android. */
|
|
20
|
+
export type Point = {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
};
|
|
24
|
+
export type Rect = {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
};
|
|
30
|
+
/** A point on one finger's route; `t` = ms after touch-down. Every point of a gesture carries `t`, or none does. */
|
|
31
|
+
export type TouchPoint = Point & {
|
|
32
|
+
t?: number;
|
|
33
|
+
};
|
|
34
|
+
/** One finger: down at the first point, through the rest, up at the last. All fingers go down and lift together. */
|
|
35
|
+
export type TouchPath = {
|
|
36
|
+
points: readonly TouchPoint[];
|
|
37
|
+
};
|
|
38
|
+
export type GestureOptions = {
|
|
39
|
+
/** untimed paths only: first point to last, each finger at constant speed (by arc length). Default 300. */
|
|
40
|
+
durationMs?: number;
|
|
41
|
+
/** fingers still at their first points before moving (press-then-drag). Default 0. */
|
|
42
|
+
holdMs?: number;
|
|
43
|
+
/** fingers still at their last points before lifting (no fling). Default 0. */
|
|
44
|
+
releaseMs?: number;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* `radius`: finger distance from the centre (default 100 pt on iOS, 100 x screen scale px on Android);
|
|
48
|
+
* `angle`: the finger axis in degrees, 0 = horizontal.
|
|
49
|
+
*/
|
|
50
|
+
export type TwoFingerOptions = {
|
|
51
|
+
durationMs?: number;
|
|
52
|
+
radius?: number;
|
|
53
|
+
angle?: number;
|
|
54
|
+
};
|
|
55
|
+
export type Role = "button" | "text" | "textfield" | "securefield" | "searchfield" | "image" | "switch" | "checkbox" | "slider" | "link" | "cell" | "list" | "scrollview" | "tab" | "tabbar" | "alert" | "sheet" | "keyboard" | "navbar" | "toolbar" | "window" | "application" | "other";
|
|
56
|
+
/** One accessibility node, normalized across iOS (axbridge / ax) and Android (uiautomator). */
|
|
57
|
+
export type Element = {
|
|
58
|
+
/** driver-local stable id for this snapshot (preorder path such as `0.3.1`, or the backend's unique id) */
|
|
59
|
+
id: string;
|
|
60
|
+
role: Role;
|
|
61
|
+
/** iOS XCUI type (`Button`) or Android class (`android.widget.EditText`) */
|
|
62
|
+
rawType: string;
|
|
63
|
+
/** AX label / content-desc */
|
|
64
|
+
label?: string;
|
|
65
|
+
/** RN testID: iOS accessibilityIdentifier / Android resource-id without the package prefix */
|
|
66
|
+
identifier?: string;
|
|
67
|
+
/** AX value / Android text of inputs */
|
|
68
|
+
value?: string;
|
|
69
|
+
/** Android text; iOS: label of static text */
|
|
70
|
+
text?: string;
|
|
71
|
+
placeholder?: string;
|
|
72
|
+
frame: Rect;
|
|
73
|
+
/** `frame` as 0–1 fractions of the screen */
|
|
74
|
+
normFrame: Rect;
|
|
75
|
+
/** iOS decoded traits; Android flags (clickable, checkable, scrollable, …) */
|
|
76
|
+
traits: string[];
|
|
77
|
+
enabled: boolean;
|
|
78
|
+
focused?: boolean;
|
|
79
|
+
hidden?: boolean;
|
|
80
|
+
selected?: boolean;
|
|
81
|
+
checked?: boolean;
|
|
82
|
+
/** only when reachability was requested (iOS ~18 ms per element) or derivable (Android) */
|
|
83
|
+
hittable?: boolean;
|
|
84
|
+
/** where to tap: iOS `interactable.actionable.at`, else the frame centre */
|
|
85
|
+
tapPoint?: Point;
|
|
86
|
+
pid?: number;
|
|
87
|
+
depth: number;
|
|
88
|
+
children: Element[];
|
|
89
|
+
};
|
|
90
|
+
export type SnapshotBackend = "axbridge" | "ax" | "uiautomator";
|
|
91
|
+
export type ScreenInfo = {
|
|
92
|
+
width: number;
|
|
93
|
+
height: number;
|
|
94
|
+
scale: number;
|
|
95
|
+
rotation?: number;
|
|
96
|
+
};
|
|
97
|
+
export type ModalInfo = {
|
|
98
|
+
pid?: number;
|
|
99
|
+
description?: string;
|
|
100
|
+
};
|
|
101
|
+
export type Snapshot = {
|
|
102
|
+
platform: Platform;
|
|
103
|
+
backend: SnapshotBackend;
|
|
104
|
+
takenAt: number;
|
|
105
|
+
screen: ScreenInfo;
|
|
106
|
+
/** the tree */
|
|
107
|
+
elements: Element[];
|
|
108
|
+
/** the same nodes in preorder (reading order is derived by consumers) */
|
|
109
|
+
flat: Element[];
|
|
110
|
+
truncated: boolean;
|
|
111
|
+
modal?: ModalInfo;
|
|
112
|
+
};
|
|
113
|
+
export type Orientation = "portrait" | "portraitUpsideDown" | "landscapeLeft" | "landscapeRight";
|
|
114
|
+
export type HardwareButton = "home" | "back" | "lock" | "volumeUp" | "volumeDown" | "shake";
|
|
115
|
+
export type KeyName = "Enter" | "Backspace" | "Tab" | "Space" | "Escape" | "Delete" | "Up" | "Down" | "Left" | "Right";
|
|
116
|
+
export type Modifier = "shift" | "cmd" | "alt" | "ctrl";
|
|
117
|
+
export type AlertInfo = {
|
|
118
|
+
title?: string;
|
|
119
|
+
message?: string;
|
|
120
|
+
buttons: Element[];
|
|
121
|
+
};
|
|
122
|
+
export type HealthInfo = {
|
|
123
|
+
platform: Platform;
|
|
124
|
+
id: string;
|
|
125
|
+
version: string;
|
|
126
|
+
/** iOS: negotiated HID transport; Android: `adb` */
|
|
127
|
+
transport: string;
|
|
128
|
+
/** iOS: `axbridge` availability */
|
|
129
|
+
bridge?: "available" | "missing" | "failed";
|
|
130
|
+
screen: ScreenInfo;
|
|
131
|
+
detail?: Record<string, unknown>;
|
|
132
|
+
};
|
|
133
|
+
export type LaunchOptions = {
|
|
134
|
+
/** extra launch arguments (iOS: after the bundle id; Android: intent extras are not supported in v1) */
|
|
135
|
+
args?: readonly string[];
|
|
136
|
+
env?: Record<string, string>;
|
|
137
|
+
/** iOS: `--terminate-running-process`; Android: `am force-stop` first. Default true. */
|
|
138
|
+
relaunch?: boolean;
|
|
139
|
+
};
|
|
140
|
+
export type DriverCapabilities = {
|
|
141
|
+
/** two-finger `pinch` and `rotate` */
|
|
142
|
+
pinch: boolean;
|
|
143
|
+
/** most fingers `gesture` takes: 2 multi-touch, 1 single-finger paths only, 0 no `gesture` */
|
|
144
|
+
maxPointers: 0 | 1 | 2;
|
|
145
|
+
unicodeText: boolean;
|
|
146
|
+
nativeSettle: boolean;
|
|
147
|
+
alerts: boolean;
|
|
148
|
+
reachability: boolean;
|
|
149
|
+
/**
|
|
150
|
+
* `elementAtPoint` costs far less than a whole `snapshot` (iOS: one AX hit-test, ~10 ms, against ~76 ms), so a tap
|
|
151
|
+
* may check the snapshot an assertion just kept with one hit-test instead of taking another. Absent = no (Android's
|
|
152
|
+
* hit-test is a whole snapshot).
|
|
153
|
+
*/
|
|
154
|
+
cheapHitTest?: boolean;
|
|
155
|
+
};
|
|
156
|
+
export type AppCommands = {
|
|
157
|
+
launch(bundleId: string, opts?: LaunchOptions): DriverResult<void>;
|
|
158
|
+
terminate(bundleId: string): DriverResult<void>;
|
|
159
|
+
openUrl(url: string): DriverResult<void>;
|
|
160
|
+
install(path: string): DriverResult<void>;
|
|
161
|
+
uninstall(bundleId: string): DriverResult<void>;
|
|
162
|
+
isInstalled(bundleId: string): DriverResult<boolean>;
|
|
163
|
+
isRunning(bundleId: string): DriverResult<boolean>;
|
|
164
|
+
/** wipe app data, keep the build (iOS: core `resetAppData`; Android: `pm clear`) */
|
|
165
|
+
clearData(bundleId: string, opts?: {
|
|
166
|
+
keychain?: boolean;
|
|
167
|
+
}): DriverResult<void>;
|
|
168
|
+
};
|
|
169
|
+
export interface Driver {
|
|
170
|
+
readonly platform: Platform;
|
|
171
|
+
/** udid (iOS) or serial (Android) */
|
|
172
|
+
readonly id: string;
|
|
173
|
+
readonly capabilities: DriverCapabilities;
|
|
174
|
+
health(): DriverResult<HealthInfo>;
|
|
175
|
+
snapshot(opts?: {
|
|
176
|
+
interactiveOnly?: boolean;
|
|
177
|
+
backend?: SnapshotBackend;
|
|
178
|
+
}): DriverResult<Snapshot>;
|
|
179
|
+
elementAtPoint(point: Point, opts?: {
|
|
180
|
+
reachability?: boolean;
|
|
181
|
+
}): DriverResult<Element | null>;
|
|
182
|
+
tap(point: Point, opts?: {
|
|
183
|
+
count?: number;
|
|
184
|
+
durationMs?: number;
|
|
185
|
+
}): DriverResult<void>;
|
|
186
|
+
longPress(point: Point, opts?: {
|
|
187
|
+
durationMs?: number;
|
|
188
|
+
}): DriverResult<void>;
|
|
189
|
+
swipe(from: Point, to: Point, opts?: {
|
|
190
|
+
durationMs?: number;
|
|
191
|
+
momentum?: boolean;
|
|
192
|
+
}): DriverResult<void>;
|
|
193
|
+
drag(from: Point, to: Point, opts?: {
|
|
194
|
+
pressMs?: number;
|
|
195
|
+
durationMs?: number;
|
|
196
|
+
releaseMs?: number;
|
|
197
|
+
}): DriverResult<void>;
|
|
198
|
+
/** Two fingers around `center` spread (`scale` > 1) or close (< 1). */
|
|
199
|
+
pinch(center: Point, scale: number, opts?: TwoFingerOptions): DriverResult<void>;
|
|
200
|
+
/** Two fingers turn `degrees` around `center`; positive is clockwise on screen. */
|
|
201
|
+
rotate(center: Point, degrees: number, opts?: TwoFingerOptions): DriverResult<void>;
|
|
202
|
+
/** 1-2 finger paths on one timeline (`driver/gesture-geometry.ts`); fingers go down and lift together. */
|
|
203
|
+
gesture(paths: readonly TouchPath[], opts?: GestureOptions): DriverResult<void>;
|
|
204
|
+
/** iOS: HID keyboard → paste fallback for non-ASCII; Android: `input text` (ASCII only) */
|
|
205
|
+
typeText(text: string): DriverResult<void>;
|
|
206
|
+
key(key: KeyName, modifiers?: readonly Modifier[]): DriverResult<void>;
|
|
207
|
+
pressButton(button: HardwareButton): DriverResult<void>;
|
|
208
|
+
screenshot(opts?: {
|
|
209
|
+
path?: string;
|
|
210
|
+
scale?: number;
|
|
211
|
+
}): DriverResult<{
|
|
212
|
+
path?: string;
|
|
213
|
+
png?: Uint8Array;
|
|
214
|
+
}>;
|
|
215
|
+
orientation(set?: Orientation): DriverResult<Orientation>;
|
|
216
|
+
/** wait for a quiet UI: iOS axbridge quiescence, else snapshot-hash polling */
|
|
217
|
+
settle(opts?: {
|
|
218
|
+
quietMs?: number;
|
|
219
|
+
timeoutMs?: number;
|
|
220
|
+
}): DriverResult<{
|
|
221
|
+
quiet: boolean;
|
|
222
|
+
waitedMs: number;
|
|
223
|
+
}>;
|
|
224
|
+
/** the system alert / sheet on top, if any */
|
|
225
|
+
alert(): DriverResult<AlertInfo | null>;
|
|
226
|
+
appearance(set?: "light" | "dark"): DriverResult<"light" | "dark">;
|
|
227
|
+
clipboard(set?: string): DriverResult<string>;
|
|
228
|
+
readonly app: AppCommands;
|
|
229
|
+
close(): Promise<void>;
|
|
230
|
+
}
|
|
231
|
+
export type Logger = (line: string) => void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ErrorResult } from "../../../types/src/result";
|
|
2
|
+
import type { DriverError, DriverErrorCode } from "./driver.types";
|
|
3
|
+
export declare function driverError(code: DriverErrorCode, message: string, extra?: {
|
|
4
|
+
retryable?: boolean;
|
|
5
|
+
detail?: unknown;
|
|
6
|
+
}): DriverError;
|
|
7
|
+
/** `err()` for `DriverResult`. */
|
|
8
|
+
export declare function driverErr(code: DriverErrorCode, message: string, extra?: {
|
|
9
|
+
retryable?: boolean;
|
|
10
|
+
detail?: unknown;
|
|
11
|
+
}): ErrorResult<DriverError>;
|
|
12
|
+
/** One line for logs and CLI output. */
|
|
13
|
+
export declare function describeDriverError(error: DriverError): string;
|