browserscale-ts 1.7.0 → 1.8.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/README.md +136 -78
- package/dist/browser.js +1 -1
- package/dist/browserscale.browser.js +427 -162
- package/dist/client.d.ts +241 -62
- package/dist/client.js +312 -83
- package/dist/defaults.d.ts +11 -9
- package/dist/defaults.js +15 -12
- package/dist/dom-mirror.d.ts +27 -0
- package/dist/dom-mirror.js +27 -0
- package/dist/errors.d.ts +43 -0
- package/dist/errors.js +37 -0
- package/dist/gen/wrc_pb.d.ts +348 -91
- package/dist/gen/wrc_pb.js +53 -58
- package/dist/index.d.ts +8 -5
- package/dist/index.js +8 -5
- package/dist/internal/convert.js +1 -0
- package/dist/locator.d.ts +12 -11
- package/dist/locator.js +14 -22
- package/dist/network-capture.d.ts +3 -2
- package/dist/network-capture.js +3 -2
- package/dist/options.d.ts +1 -1
- package/dist/scripts.d.ts +4 -3
- package/dist/scripts.js +4 -3
- package/dist/types.d.ts +12 -0
- package/package.json +1 -1
|
@@ -3799,20 +3799,20 @@ function serviceDesc(file, path, ...paths) {
|
|
|
3799
3799
|
}
|
|
3800
3800
|
|
|
3801
3801
|
// src/gen/wrc_pb.ts
|
|
3802
|
-
var file_wrc = /* @__PURE__ */ fileDesc("Cgl3cmMucHJvdG8SD2Jyb3dzZXJzY2FsZS52MSI7CgRSZWN0EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAEihgIKCUZyYW1lSW5mbxIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSEAoIaXNfb29waWYYAyABKAgSFgoOaGFzX2pzX2NvbnRleHQYBCABKAgSEgoKaXNfbG9hZGluZxgFIAEoCBISCgppc192aXNpYmxlGAYgASgIEiwKDWFic29sdXRlX3JlY3QYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIsCg1yZWxhdGl2ZV9yZWN0GAggASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSLAoIY2hpbGRyZW4YCSADKAsyGi5icm93c2Vyc2NhbGUudjEuRnJhbWVJbmZvIqwBCghQYWdlSW5mbxIPCgdwYWdlX2lkGAEgASgJEhoKEmJyb3dzZXJfY29udGV4dF9pZBgCIAEoCRILCgN1cmwYAyABKAkSDQoFdGl0bGUYBCABKAkSJwoIdmlld3BvcnQYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIuCgpmcmFtZV90cmVlGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLkZyYW1lSW5mbyIlCgZIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKAAQoSSW50ZXJjZXB0ZWRSZXF1ZXN0Eg4KBm1ldGhvZBgBIAEoCRILCgN1cmwYAiABKAkSKAoHaGVhZGVycxgDIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISDAoEYm9keRgEIAEoCRIVCg1yZXNvdXJjZV90eXBlGAUgASgJIm8KE0ludGVyY2VwdGVkUmVzcG9uc2USCwoDdXJsGAEgASgJEhMKC3N0YXR1c19jb2RlGAIgASgFEigKB2hlYWRlcnMYAyADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEgwKBGJvZHkYBCABKAkijgEKEkhlYWRlck1vZGlmaWNhdGlvbhIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJSACIAQESDgoGYWN0aW9uGAMgASgJEhMKBmJlZm9yZRgEIAEoCUgBiAEBEhIKBWFmdGVyGAUgASgJSAKIAQFCCAoGX3ZhbHVlQgkKB19iZWZvcmVCCAoGX2FmdGVyIk0KEkNvb2tpZVBhcnRpdGlvbktleRIWCg50b3BfbGV2ZWxfc2l0ZRgBIAEoCRIfChdoYXNfY3Jvc3Nfc2l0ZV9hbmNlc3RvchgCIAEoCCK/AwoLQ29va2llUGFyYW0SDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIQCgN1cmwYAyABKAlIAIgBARIOCgZkb21haW4YBCABKAkSDAoEcGF0aBgFIAEoCRITCgZzZWN1cmUYBiABKAhIAYgBARIWCglodHRwX29ubHkYByABKAhIAogBARIWCglzYW1lX3NpdGUYCCABKAlIA4gBARIUCgdleHBpcmVzGAkgASgBSASIAQESFQoIcHJpb3JpdHkYCiABKAlIBYgBARIaCg1zb3VyY2Vfc2NoZW1lGAsgASgJSAaIAQESGAoLc291cmNlX3BvcnQYDCABKAVIB4gBARI/Cg1wYXJ0aXRpb25fa2V5GA0gASgLMiMuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcnRpdGlvbktleUgIiAEBQgYKBF91cmxCCQoHX3NlY3VyZUIMCgpfaHR0cF9vbmx5QgwKCl9zYW1lX3NpdGVCCgoIX2V4cGlyZXNCCwoJX3ByaW9yaXR5QhAKDl9zb3VyY2Vfc2NoZW1lQg4KDF9zb3VyY2VfcG9ydEIQCg5fcGFydGl0aW9uX2tleSKtAQoNV2FpdENvbmRpdGlvbhIVCghzZWxlY3RvchgBIAEoCUgAiAEBEhoKDWpzX2V4cHJlc3Npb24YAiABKAlIAYgBARIUCgd2aXNpYmxlGAMgASgISAKIAQESGAoLc3RlYWR5X3RpbWUYBCABKAFIA4gBAUILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCgoIX3Zpc2libGVCDgoMX3N0ZWFkeV90aW1lIrsBCgpXYWl0UmVzdWx0Eg0KBWluZGV4GAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Ei4KBWVycm9yGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLldhaXRFcnJvckgAiAEBQggKBl9lcnJvciLsAQoTV2FpdENvbmRpdGlvblN0YXR1cxINCgVpbmRleBgBIAEoBRINCgVzdGF0ZRgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEAoIZnJhbWVfaWQYBCABKAkSEgoKaXNfdmlzaWJsZRgFIAEoCBIqCgZib3VuZHMYBiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdEgAiAEBEjQKCG9jY2x1ZGVyGAcgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gBiAEBQgkKB19ib3VuZHNCCwoJX29jY2x1ZGVyImQKCVdhaXRFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSOAoKY29uZGl0aW9ucxgDIAMoCzIkLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uU3RhdHVzIqYBCg1FbGVtZW50UmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoASLSAwoMT2NjbHVkZXJJbmZvEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCghmcmFtZV9pZBgCIAEoCRIQCgh0YWdfbmFtZRgDIAEoCRIPCgJpZBgEIAEoCUgAiAEBEhcKCmNsYXNzX25hbWUYBSABKAlIAYgBARIRCgR0ZXh0GAYgASgJSAKIAQESJQoGYm91bmRzGAcgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSGwoOcG9pbnRlcl9ldmVudHMYCCABKAlIA4gBARIXCgp2aXNpYmlsaXR5GAkgASgJSASIAQESFAoHb3BhY2l0eRgKIAEoAUgFiAEBEhQKB3pfaW5kZXgYCyABKAlIBogBARIlChhoaXR0YWJsZV93aGlsZV9pbnZpc2libGUYDCABKAhIB4gBARIVCghwb3NpdGlvbhgNIAEoCUgIiAEBQgUKA19pZEINCgtfY2xhc3NfbmFtZUIHCgVfdGV4dEIRCg9fcG9pbnRlcl9ldmVudHNCDQoLX3Zpc2liaWxpdHlCCgoIX29wYWNpdHlCCgoIX3pfaW5kZXhCGwoZX2hpdHRhYmxlX3doaWxlX2ludmlzaWJsZUILCglfcG9zaXRpb24ioAEKCkNsaWNrRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjQKCG9jY2x1ZGVyGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gAiAEBEhwKD2V2YWRlX2F0dGVtcHRlZBgEIAEoCEgBiAEBQgsKCV9vY2NsdWRlckISChBfZXZhZGVfYXR0ZW1wdGVkIt8BCgtDbGlja1Jlc3VsdBIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLwoFZXJyb3IYCCABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBQggKBl9lcnJvciKeAgoMUmVhY3Rpb25JbmZvEhMKC3JlYWN0aW9uX2lkGAEgASgJEhsKDm1hdGNoX3NlbGVjdG9yGAIgASgJSACIAQESIAoTbWF0Y2hfanNfZXhwcmVzc2lvbhgDIAEoCUgBiAEBEhwKD2FjdGlvbl9zZWxlY3RvchgEIAEoCUgCiAEBEiEKFGFjdGlvbl9qc19leHByZXNzaW9uGAUgASgJSAOIAQESEAoIZnJhbWVfaWQYBiABKAkSDwoHdmlzaWJsZRgHIAEoCEIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CEgoQX2FjdGlvbl9zZWxlY3RvckIXChVfYWN0aW9uX2pzX2V4cHJlc3Npb24i1gMKEkFkZFJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIbCg5tYXRjaF9zZWxlY3RvchgEIAEoCUgAiAEBEiAKE21hdGNoX2pzX2V4cHJlc3Npb24YBSABKAlIAYgBARIVCghmcmFtZV9pZBgGIAEoCUgCiAEBEhQKB3Zpc2libGUYByABKAhIA4gBARIcCg9hY3Rpb25fc2VsZWN0b3IYCCABKAlIBIgBARIhChRhY3Rpb25fanNfZXhwcmVzc2lvbhgJIAEoCUgFiAEBEhMKBmJ1dHRvbhgKIAEoCUgGiAEBEhgKC2NsaWNrX2NvdW50GAsgASgFSAeIAQESFQoIaW50ZXJ2YWwYDCABKAFICIgBAUIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgoKCF92aXNpYmxlQhIKEF9hY3Rpb25fc2VsZWN0b3JCFwoVX2FjdGlvbl9qc19leHByZXNzaW9uQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgsKCV9pbnRlcnZhbCIqChNBZGRSZWFjdGlvblJlc3BvbnNlEhMKC3JlYWN0aW9uX2lkGAEgASgJIlEKFVJlbW92ZVJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLcmVhY3Rpb25faWQYAyABKAkiKQoWUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRIPCgdyZW1vdmVkGAEgASgIIkwKFExpc3RSZWFjdGlvbnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIkkKFUxpc3RSZWFjdGlvbnNSZXNwb25zZRIwCglyZWFjdGlvbnMYASADKAsyHS5icm93c2Vyc2NhbGUudjEuUmVhY3Rpb25JbmZvIukBCgpFbGVtZW50UmVmEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCgh0YWdfbmFtZRgCIAEoCRIPCgJpZBgDIAEoCUgAiAEBEhEKBG5hbWUYBCABKAlIAYgBARIXCgpjbGFzc19uYW1lGAUgASgJSAKIAQESFwoKaW5wdXRfdHlwZRgGIAEoCUgDiAEBEhEKBHRleHQYByABKAlIBIgBARIQCghlZGl0YWJsZRgIIAEoCEIFCgNfaWRCBwoFX25hbWVCDQoLX2NsYXNzX25hbWVCDQoLX2lucHV0X3R5cGVCBwoFX3RleHQi7gIKCUZpbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSNQoLY2xpY2tfZXJyb3IYAyABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBEiQKF2ZvY3VzZWRfYmFja2VuZF9ub2RlX2lkGAQgASgFSAGIAQESOQoPZm9jdXNlZF9lbGVtZW50GAUgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkVsZW1lbnRSZWZIAogBARIcCg90YXJnZXRfZWRpdGFibGUYBiABKAhIA4gBARIgChN0YXJnZXRfdmFsdWVfbGVuZ3RoGAcgASgFSASIAQFCDgoMX2NsaWNrX2Vycm9yQhoKGF9mb2N1c2VkX2JhY2tlbmRfbm9kZV9pZEISChBfZm9jdXNlZF9lbGVtZW50QhIKEF90YXJnZXRfZWRpdGFibGVCFgoUX3RhcmdldF92YWx1ZV9sZW5ndGgiogEKCkZpbGxSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5GaWxsRXJyb3JIAIgBAUIICgZfZXJyb3IiwgEKCkRyYWdSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSDwoHc3RhcnRfeBgEIAEoARIPCgdzdGFydF95GAUgASgBEg0KBWVuZF94GAYgASgBEg0KBWVuZF95GAcgASgBEi4KBWVycm9yGAggASgLMhouYnJvd3NlcnNjYWxlLnYxLkRyYWdFcnJvckgAiAEBQggKBl9lcnJvciJxCglEcmFnRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjUKC2NsaWNrX2Vycm9yGAMgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkNsaWNrRXJyb3JIAIgBAUIOCgxfY2xpY2tfZXJyb3IirgEKElNlbGVjdE9wdGlvblJlc3VsdBIWCg5zZWxlY3RlZF9pbmRleBgBIAEoBRIWCg5zZWxlY3RlZF92YWx1ZRgCIAEoCRIVCg1zZWxlY3RlZF90ZXh0GAMgASgJEg8KB3N1Y2Nlc3MYBCABKAgSNgoFZXJyb3IYBSABKAsyIi5icm93c2Vyc2NhbGUudjEuU2VsZWN0T3B0aW9uRXJyb3JIAIgBAUIICgZfZXJyb3IiMgoRU2VsZWN0T3B0aW9uRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIsEBCgxTY3JvbGxSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIwCgVlcnJvchgIIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxFcnJvckgAiAEBQggKBl9lcnJvciIsCgtTY3JvbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAki3QEKCk1vdmVSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIOCgZyb290X3gYBiABKAESDgoGcm9vdF95GAcgASgBEi4KBWVycm9yGAggASgLMhouYnJvd3NlcnNjYWxlLnYxLk1vdmVFcnJvckgAiAEBQggKBl9lcnJvciIqCglNb3ZlRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIuYBCg9TZXRQcm94eVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKCnByb3h5X2hvc3QYAyABKAlIAIgBARIXCgpwcm94eV9wb3J0GAQgASgFSAGIAQESGwoOcHJveHlfdXNlcm5hbWUYBSABKAlIAogBARIbCg5wcm94eV9wYXNzd29yZBgGIAEoCUgDiAEBQg0KC19wcm94eV9ob3N0Qg0KC19wcm94eV9wb3J0QhEKD19wcm94eV91c2VybmFtZUIRCg9fcHJveHlfcGFzc3dvcmQiNgoPR2V0UGFnZXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSI8ChBHZXRQYWdlc1Jlc3BvbnNlEigKBXBhZ2VzGAEgAygLMhkuYnJvd3NlcnNjYWxlLnYxLlBhZ2VJbmZvIpoBCg9OYXZpZ2F0ZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDdXJsGAQgASgJEhUKCHJlZmVycmVyGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9yZWZlcnJlckIKCghfdGltZW91dCIxChBOYXZpZ2F0ZVJlc3BvbnNlEhAKCGZyYW1lX2lkGAEgASgJEgsKA3VybBgCIAEoCSK2AQoPTG9hZEhUTUxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA3VybBgEIAEoCRIMCgRodG1sGAUgASgJEigKB2hlYWRlcnMYBiADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEhgKC3N0YXR1c19jb2RlGAcgASgFSACIAQFCDgoMX3N0YXR1c19jb2RlIn8KD0V2YWx1YXRlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRISCgpleHByZXNzaW9uGAQgASgJEhUKCGZyYW1lX2lkGAUgASgJSACIAQFCCwoJX2ZyYW1lX2lkInYKEEV2YWx1YXRlUmVzcG9uc2USDgoGcmVzdWx0GAEgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgCIAEoBRISCgppc192aXNpYmxlGAMgASgIEiUKBmJvdW5kcxgEIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0ImMKClJ1blJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCRIUCgdwYWdlX2lkGAQgASgJSACIAQFCCgoIX3BhZ2VfaWQiLgoLUnVuUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkiwgEKEFdhaXRGb3JBbnlQYXJhbXMSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSMgoKY29uZGl0aW9ucxgEIAMoCzIeLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uEhUKCGZyYW1lX2lkGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9mcmFtZV9pZEIKCghfdGltZW91dCL1AgoTU2VsZWN0T3B0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEhIKBWluZGV4GAggASgFSASIAQESEgoFdmFsdWUYCSABKAlIBYgBARIRCgR0ZXh0GAogASgJSAaIAQESGAoLZmlyZV9ldmVudHMYCyABKAhIB4gBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCCAoGX2luZGV4QggKBl92YWx1ZUIHCgVfdGV4dEIOCgxfZmlyZV9ldmVudHMi7wEKD1Njcm9sbFRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZCKZAgoNTW92ZVRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEg4KAXgYCCABKAFIBIgBARIOCgF5GAkgASgBSAWIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgQKAl94QgQKAl95IoIDCgxDbGlja1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARITCgZidXR0b24YCCABKAlIBIgBARIYCgtjbGlja19jb3VudBgJIAEoBUgFiAEBEg4KAXgYCiABKAFIBogBARIOCgF5GAsgASgBSAeIAQESEwoGYWN0aW9uGAwgASgJSAiIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgQKAl94QgQKAl95QgkKB19hY3Rpb24igwMKC0RyYWdSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESFQoIb2Zmc2V0X3gYCCABKAFIBIgBARIVCghvZmZzZXRfeRgJIAEoAUgFiAEBEhcKCmFic29sdXRlX3gYCiABKAFIBogBARIXCgphYnNvbHV0ZV95GAsgASgBSAeIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgsKCV9vZmZzZXRfeEILCglfb2Zmc2V0X3lCDQoLX2Fic29sdXRlX3hCDQoLX2Fic29sdXRlX3ki7wIKC0ZpbGxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESDAoEdGV4dBgIIAEoCRIYCgtjbGVhcl9maXJzdBgJIAEoCEgEiAEBEhQKB3RpbWVvdXQYCiABKAFIBYgBARIYCgtzdGVhZHlfdGltZRgLIAEoAUgGiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIOCgxfY2xlYXJfZmlyc3RCCgoIX3RpbWVvdXRCDgoMX3N0ZWFkeV90aW1lIkwKE1NldEJsb2NrTGlzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJImEKFVNldFN0YXRpY1BhdGhzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSEQoJYmxvYl9uYW1lGAQgASgJIogBChhXYWl0Rm9yQW55UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhMKC2Fib3J0X2ZsYWdzGAQgAygFEhQKB3RpbWVvdXQYBSABKAFIAIgBAUIKCghfdGltZW91dCJgChlXYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEg0KBWluZGV4GAEgASgFEjQKB3JlcXVlc3QYAiABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0IokBChlXYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIQCghwYXR0ZXJucxgDIAMoCRITCgthYm9ydF9mbGFncxgEIAMoBRIUCgd0aW1lb3V0GAUgASgBSACIAQFCCgoIX3RpbWVvdXQiYwoaV2FpdEZvckFueVJlc3BvbnNlUmVzcG9uc2USDQoFaW5kZXgYASABKAUSNgoIcmVzcG9uc2UYAiABKAsyJC5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXNwb25zZSLKAQoUTW9kaWZ5UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKC3VybF9wYXR0ZXJuGAMgASgJEjoKDW1vZGlmaWNhdGlvbnMYBCADKAsyIy5icm93c2Vyc2NhbGUudjEuSGVhZGVyTW9kaWZpY2F0aW9uEhEKBGJvZHkYBSABKAlIAIgBARIUCgd0aW1lb3V0GAYgASgBSAGIAQFCBwoFX2JvZHlCCgoIX3RpbWVvdXQiTQoVTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEjQKB3JlcXVlc3QYASABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0IoYBChpTdGFydE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSDgoGYm9kaWVzGAQgASgJEhUKDWJvZHlfcGF0dGVybnMYBSADKAlKBAgGEAdKBAgHEAgiQAoZU3RvcE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiLQoaU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2USDwoHc3RvcHBlZBgBIAEoCCJECh1TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiWwoUTmV0d29ya0V4Y2hhbmdlRXZlbnQSMgoIZXhjaGFuZ2UYASABKAsyIC5icm93c2Vyc2NhbGUudjEuTmV0d29ya0V4Y2hhbmdlEg8KB2Ryb3BwZWQYAiABKAQitAUKD05ldHdvcmtFeGNoYW5nZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGNoYWluX2lkGAIgASgJEhYKDnJlZGlyZWN0X2luZGV4GAMgASgFEhAKCGZyYW1lX2lkGAQgASgJEhAKCGlzX29vcGlmGAUgASgIEhUKDXJlc291cmNlX3R5cGUYBiABKAkSDgoGbWV0aG9kGAcgASgJEgsKA3VybBgIIAEoCRIVCg1pbml0aWF0b3JfdXJsGAkgASgJEjAKD3JlcXVlc3RfaGVhZGVycxgKIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIAoYcmVxdWVzdF9oZWFkZXJzX2FyZV93aXJlGAsgASgIEhQKDHJlcXVlc3RfYm9keRgMIAEoDBIeChZyZXF1ZXN0X2JvZHlfdHJ1bmNhdGVkGA0gASgIEhQKDGhhc19yZXNwb25zZRgOIAEoCBITCgtzdGF0dXNfY29kZRgPIAEoBRITCgtzdGF0dXNfdGV4dBgQIAEoCRIRCgltaW1lX3R5cGUYESABKAkSEAoIcHJvdG9jb2wYEiABKAkSFgoOcmVtb3RlX2FkZHJlc3MYEyABKAkSEwoLc2VydmVkX2Zyb20YFCABKAkSMQoQcmVzcG9uc2VfaGVhZGVycxgVIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIQoZcmVzcG9uc2VfaGVhZGVyc19hcmVfd2lyZRgWIAEoCBIVCg1yZXNwb25zZV9ib2R5GBcgASgMEh8KF3Jlc3BvbnNlX2JvZHlfdHJ1bmNhdGVkGBggASgIEh4KFnJlc3BvbnNlX2JvZHlfY2FwdHVyZWQYGSABKAgSGwoTZW5jb2RlZF9kYXRhX2xlbmd0aBgaIAEoAxINCgVlcnJvchgbIAEoCSI4ChFHZXRDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiQwoSR2V0Q29va2llc1Jlc3BvbnNlEi0KB2Nvb2tpZXMYASADKAsyHC5icm93c2Vyc2NhbGUudjEuQ29va2llUGFyYW0iZwoRU2V0Q29va2llc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEi0KB2Nvb2tpZXMYAyADKAsyHC5icm93c2Vyc2NhbGUudjEuQ29va2llUGFyYW0iOgoTQ2xlYXJDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiKQoLU3RvcmFnZUl0ZW0SCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIlEKElN0b3JhZ2VPcmlnaW5FbnRyeRIOCgZvcmlnaW4YASABKAkSKwoFaXRlbXMYAiADKAsyHC5icm93c2Vyc2NhbGUudjEuU3RvcmFnZUl0ZW0iWAoRR2V0U3RvcmFnZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKBm9yaWdpbhgDIAEoCUgAiAEBQgkKB19vcmlnaW4iSgoSR2V0U3RvcmFnZVJlc3BvbnNlEjQKB3N0b3JhZ2UYASADKAsyIy5icm93c2Vyc2NhbGUudjEuU3RvcmFnZU9yaWdpbkVudHJ5IpgBChFTZXRTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSNAoHc3RvcmFnZRgDIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlT3JpZ2luRW50cnkSGAoLY2xlYXJfZmlyc3QYBCABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiWgoTQ2xlYXJTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoGb3JpZ2luGAMgASgJSACIAQFCCQoHX29yaWdpbiIsCgtEYnNjU2Vzc2lvbhIMCgRzaXRlGAEgASgJEg8KB3Nlc3Npb24YAiABKAki2AIKC0F1dGhTZXNzaW9uEhQKB2dhaWFfaWQYASABKAlIAIgBARISCgVlbWFpbBgCIAEoCUgBiAEBEhoKDXJlZnJlc2hfdG9rZW4YAyABKAlIAogBARIgChN3cmFwcGVkX2JpbmRpbmdfa2V5GAQgASgJSAOIAQESJAoXc2lnbmluX3Njb3BlZF9kZXZpY2VfaWQYBSABKAlIBIgBARIZCgxzeW5jX2NvbnNlbnQYBiABKAhIBYgBARIzCg1kYnNjX3Nlc3Npb25zGAcgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkRic2NTZXNzaW9uQgoKCF9nYWlhX2lkQggKBl9lbWFpbEIQCg5fcmVmcmVzaF90b2tlbkIWChRfd3JhcHBlZF9iaW5kaW5nX2tleUIaChhfc2lnbmluX3Njb3BlZF9kZXZpY2VfaWRCDwoNX3N5bmNfY29uc2VudCI8ChVHZXRBdXRoU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIlgKFkdldEF1dGhTZXNzaW9uUmVzcG9uc2USMgoHc2Vzc2lvbhgBIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbkgAiAEBQgoKCF9zZXNzaW9uImsKFVNldEF1dGhTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSLQoHc2Vzc2lvbhgDIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbiKHAQoNR2V0RE9NUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCIdCg5HZXRET01SZXNwb25zZRILCgNkb20YASABKAkimQQKFUdldE9ic2VydmF0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIjChZtYXhfZWxlbWVudHNfcGVyX2ZyYW1lGAQgASgFSACIAQESHAoPbWF4X3RleHRfbGVuZ3RoGAUgASgFSAGIAQESEwoGZm9ybWF0GAYgASgJSAKIAQESHQoQbWF4X3RvdGFsX3Rva2VucxgHIAEoBUgDiAEBEhsKDmluY2x1ZGVfYm91bmRzGAggASgISASIAQESGgoNdmlld3BvcnRfb25seRgJIAEoCEgFiAEBEhwKD2JhY2tlbmRfbm9kZV9pZBgKIAEoBUgGiAEBEhUKCHNlbGVjdG9yGAsgASgJSAeIAQESGgoNanNfZXhwcmVzc2lvbhgMIAEoCUgIiAEBEhUKCGZyYW1lX2lkGA0gASgJSAmIAQFCGQoXX21heF9lbGVtZW50c19wZXJfZnJhbWVCEgoQX21heF90ZXh0X2xlbmd0aEIJCgdfZm9ybWF0QhMKEV9tYXhfdG90YWxfdG9rZW5zQhEKD19pbmNsdWRlX2JvdW5kc0IQCg5fdmlld3BvcnRfb25seUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWQiRQoWR2V0T2JzZXJ2YXRpb25SZXNwb25zZRITCgtvYnNlcnZhdGlvbhgBIAEoCUoECAIQA1IQb2JzZXJ2YXRpb25fanNvbiJtChFHZXRET01IYXNoUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCIiChJHZXRET01IYXNoUmVzcG9uc2USDAoEaGFzaBgBIAEoCSKAAQoVU3RhcnREb21NaXJyb3JSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgVkZXB0aBgEIAEoBUgAiAEBEhMKBnBpZXJjZRgFIAEoCEgBiAEBQggKBl9kZXB0aEIJCgdfcGllcmNlSgQIAxAEIksKFlN0YXJ0RG9tTWlycm9yUmVzcG9uc2USDAoEcm9vdBgBIAEoCRIQCghmcmFtZV9pZBgCIAEoCRILCgNzZXEYAyABKARKBAgEEAUiQQoUU3RvcERvbU1pcnJvclJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJSgQIAxAEIpcBChVHZXREb21DaGlsZHJlblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCI3ChZHZXREb21DaGlsZHJlblJlc3BvbnNlEhAKCGNoaWxkcmVuGAEgASgJEgsKA3NlcRgCIAEoBCJ8ChhSZWxlYXNlRG9tU3VidHJlZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJ4ChRSZXZlYWxEb21Ob2RlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhUKCGZyYW1lX2lkGAQgASgJSACIAQFCCwoJX2ZyYW1lX2lkIjIKFVJldmVhbERvbU5vZGVSZXNwb25zZRIMCgRwYXRoGAEgASgJEgsKA3NlcRgCIAEoBCJgChVHZXREb21SZXZpc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhUKCGZyYW1lX2lkGAMgASgJSACIAQFCCwoJX2ZyYW1lX2lkIioKFkdldERvbVJldmlzaW9uUmVzcG9uc2USEAoIcmV2aXNpb24YASABKAQiPQoWU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiOQoJRG9tVXBkYXRlEhAKCGZyYW1lX2lkGAEgASgJEgsKA3NlcRgCIAEoBBINCgVlZGl0cxgDIAEoCSIhCglEb21SZXN5bmMSDgoGcmVhc29uGAIgASgJSgQIARACInsKCERvbUV2ZW50EiwKBnVwZGF0ZRgBIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Eb21VcGRhdGVIABIsCgZyZXN5bmMYAiABKAsyGi5icm93c2Vyc2NhbGUudjEuRG9tUmVzeW5jSABCBwoFZXZlbnRKBAgDEARKBAgEEAUiZgoYSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgkKAXgYBCABKAESCQoBeRgFIAEoASKpAQoZSW5zcGVjdEF0UG9zaXRpb25SZXNwb25zZRIXCg9iYWNrZW5kX25vZGVfaWQYASABKAUSEAoIZnJhbWVfaWQYAiABKAkSEAoIdGFnX25hbWUYAyABKAkSFAoMdGV4dF9jb250ZW50GAQgASgJEhIKCmlzX3Zpc2libGUYBSABKAgSJQoGYm91bmRzGAYgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QiiQEKFEhpZ2hsaWdodE5vZGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBRIVCghmcmFtZV9pZBgFIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJXChFJbnNlcnRUZXh0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIMCgR0ZXh0GAQgASgJInsKC1R5cGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgwKBHRleHQYBCABKAkSGAoLY2xlYXJfZmlyc3QYBSABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiugEKD1ByZXNzS2V5UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgNrZXkYBCABKAkSEQoEY29kZRgFIAEoCUgAiAEBEhYKCW1vZGlmaWVycxgGIAEoBUgBiAEBEhUKCGxvY2F0aW9uGAcgASgFSAKIAQFCBwoFX2NvZGVCDAoKX21vZGlmaWVyc0ILCglfbG9jYXRpb24ivAEKEVJlbGVhc2VLZXlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA2tleRgEIAEoCRIRCgRjb2RlGAUgASgJSACIAQESFgoJbW9kaWZpZXJzGAYgASgFSAGIAQESFQoIbG9jYXRpb24YByABKAVIAogBAUIHCgVfY29kZUIMCgpfbW9kaWZpZXJzQgsKCV9sb2NhdGlvbiJLChNHZXRTZWxlY3Rpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIiQKFEdldFNlbGVjdGlvblJlc3BvbnNlEgwKBHRleHQYASABKAkiiwEKEVNjcmVlbnNob3RSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhMKBmZvcm1hdBgEIAEoCUgAiAEBEhQKB3F1YWxpdHkYBSABKAVIAYgBAUIJCgdfZm9ybWF0QgoKCF9xdWFsaXR5IkgKElNjcmVlbnNob3RSZXNwb25zZRITCgtkYXRhX2Jhc2U2NBgBIAEoCRINCgV3aWR0aBgCIAEoBRIOCgZoZWlnaHQYAyABKAUikwMKEVJlYWRDYW52YXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESEwoGZm9ybWF0GAggASgJSASIAQESFAoHcXVhbGl0eRgJIAEoBUgFiAEBEg8KAnN4GAogASgFSAaIAQESDwoCc3kYCyABKAVIB4gBARIPCgJzdxgMIAEoBUgIiAEBEg8KAnNoGA0gASgFSAmIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19mb3JtYXRCCgoIX3F1YWxpdHlCBQoDX3N4QgUKA19zeUIFCgNfc3dCBQoDX3NoIpoBChJSZWFkQ2FudmFzUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEwoLZGF0YV9iYXNlNjQYBCABKAkSDQoFd2lkdGgYBSABKAUSDgoGaGVpZ2h0GAYgASgFEhQKDG9yaWdpbl9jbGVhbhgHIAEoCCJkChNTb2x2ZUNhcHRjaGFSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgp0aW1lb3V0X21zGAMgASgFEhQKDHJldHJ5X2Ftb3VudBgEIAEoBSImChRTb2x2ZUNhcHRjaGFSZXNwb25zZRIOCgZyZXN1bHQYASABKAkiZQoJSWNlU2VydmVyEgwKBHVybHMYASADKAkSFQoIdXNlcm5hbWUYAiABKAlIAIgBARIXCgpjcmVkZW50aWFsGAMgASgJSAGIAQFCCwoJX3VzZXJuYW1lQg0KC19jcmVkZW50aWFsIj0KFkdldFN0cmVhbUNvbmZpZ1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkoKF0dldFN0cmVhbUNvbmZpZ1Jlc3BvbnNlEi8KC2ljZV9zZXJ2ZXJzGAEgAygLMhouYnJvd3NlcnNjYWxlLnYxLkljZVNlcnZlciJMChJTdGFydFN0cmVhbVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhEKCW9mZmVyX3NkcBgDIAEoCSJSChNTdGFydFN0cmVhbVJlc3BvbnNlEhIKCmFuc3dlcl9zZHAYASABKAkSJwoIdmlld3BvcnQYAiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdCI4ChFTdG9wU3RyZWFtUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiFAoSU3RvcFN0cmVhbVJlc3BvbnNlIkMKDlNjcmlwdExvZ0VudHJ5Eg0KBWxldmVsGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDIkcKEFJ1blNjcmlwdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCSKFAQoRUnVuU2NyaXB0UmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkSDgoGcnVuX2lkGAMgASgJEiwKA2xvZxgEIAMoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeRIRCgl0cnVuY2F0ZWQYBSABKAgiSQoSU3RhcnRTY3JpcHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZzb3VyY2UYAyABKAkiJQoTU3RhcnRTY3JpcHRSZXNwb25zZRIOCgZydW5faWQYASABKAkiSQoSU3RvcFNjcmlwdHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZydW5faWQYAyABKAkiJgoTU3RvcFNjcmlwdHNSZXNwb25zZRIPCgdzdG9wcGVkGAEgASgFIi8KCVNjcmlwdFJ1bhIOCgZydW5faWQYASABKAkSEgoKcnVubmluZ19tcxgCIAEoAyI8ChVMaXN0U2NyaXB0UnVuc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkIKFkxpc3RTY3JpcHRSdW5zUmVzcG9uc2USKAoEcnVucxgBIAMoCzIaLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRSdW4iUAoZU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGcnVuX2lkGAMgASgJIkoKCVNjcmlwdExvZxIOCgZydW5faWQYASABKAkSLQoEbGluZRgCIAEoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeSJSCg5TY3JpcHRGaW5pc2hlZBIOCgZydW5faWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIOCgZyZXN1bHQYAyABKAkSDwoHc3RvcHBlZBgEIAEoCCKHAQoLU2NyaXB0RXZlbnQSKQoDbG9nGAEgASgLMhouYnJvd3NlcnNjYWxlLnYxLlNjcmlwdExvZ0gAEjMKCGZpbmlzaGVkGAIgASgLMh8uYnJvd3NlcnNjYWxlLnYxLlNjcmlwdEZpbmlzaGVkSAASDwoHZHJvcHBlZBgDIAEoBEIHCgVldmVudDLLKAoHQnJvd3NlchJECghTZXRQcm94eRIgLmJyb3dzZXJzY2FsZS52MS5TZXRQcm94eVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSTwoIR2V0UGFnZXMSIC5icm93c2Vyc2NhbGUudjEuR2V0UGFnZXNSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLkdldFBhZ2VzUmVzcG9uc2USTwoITmF2aWdhdGUSIC5icm93c2Vyc2NhbGUudjEuTmF2aWdhdGVSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLk5hdmlnYXRlUmVzcG9uc2USRAoITG9hZEhUTUwSIC5icm93c2Vyc2NhbGUudjEuTG9hZEhUTUxSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ek8KCEV2YWx1YXRlEiAuYnJvd3NlcnNjYWxlLnYxLkV2YWx1YXRlUmVxdWVzdBohLmJyb3dzZXJzY2FsZS52MS5FdmFsdWF0ZVJlc3BvbnNlEkAKA1J1bhIbLmJyb3dzZXJzY2FsZS52MS5SdW5SZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLlJ1blJlc3BvbnNlEkwKCldhaXRGb3JBbnkSIS5icm93c2Vyc2NhbGUudjEuV2FpdEZvckFueVBhcmFtcxobLmJyb3dzZXJzY2FsZS52MS5XYWl0UmVzdWx0ElkKDFNlbGVjdE9wdGlvbhIkLmJyb3dzZXJzY2FsZS52MS5TZWxlY3RPcHRpb25SZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvblJlc3VsdBJLCghTY3JvbGxUbxIgLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxUb1JlcXVlc3QaHS5icm93c2Vyc2NhbGUudjEuU2Nyb2xsUmVzdWx0EkUKBk1vdmVUbxIeLmJyb3dzZXJzY2FsZS52MS5Nb3ZlVG9SZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLk1vdmVSZXN1bHQSRAoFQ2xpY2sSHS5icm93c2Vyc2NhbGUudjEuQ2xpY2tSZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLkNsaWNrUmVzdWx0EkEKBERyYWcSHC5icm93c2Vyc2NhbGUudjEuRHJhZ1JlcXVlc3QaGy5icm93c2Vyc2NhbGUudjEuRHJhZ1Jlc3VsdBJBCgRGaWxsEhwuYnJvd3NlcnNjYWxlLnYxLkZpbGxSZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLkZpbGxSZXN1bHQSWAoLQWRkUmVhY3Rpb24SIy5icm93c2Vyc2NhbGUudjEuQWRkUmVhY3Rpb25SZXF1ZXN0GiQuYnJvd3NlcnNjYWxlLnYxLkFkZFJlYWN0aW9uUmVzcG9uc2USYQoOUmVtb3ZlUmVhY3Rpb24SJi5icm93c2Vyc2NhbGUudjEuUmVtb3ZlUmVhY3Rpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLlJlbW92ZVJlYWN0aW9uUmVzcG9uc2USXgoNTGlzdFJlYWN0aW9ucxIlLmJyb3dzZXJzY2FsZS52MS5MaXN0UmVhY3Rpb25zUmVxdWVzdBomLmJyb3dzZXJzY2FsZS52MS5MaXN0UmVhY3Rpb25zUmVzcG9uc2USTAoMU2V0QmxvY2tMaXN0EiQuYnJvd3NlcnNjYWxlLnYxLlNldEJsb2NrTGlzdFJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSUAoOU2V0U3RhdGljUGF0aHMSJi5icm93c2Vyc2NhbGUudjEuU2V0U3RhdGljUGF0aHNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EmoKEVdhaXRGb3JBbnlSZXF1ZXN0EikuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXF1ZXN0UmVxdWVzdBoqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEm0KEldhaXRGb3JBbnlSZXNwb25zZRIqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0GisuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXNwb25zZVJlc3BvbnNlEl4KDU1vZGlmeVJlcXVlc3QSJS5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEloKE1N0YXJ0TmV0d29ya0NhcHR1cmUSKy5icm93c2Vyc2NhbGUudjEuU3RhcnROZXR3b3JrQ2FwdHVyZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSbQoSU3RvcE5ldHdvcmtDYXB0dXJlEiouYnJvd3NlcnNjYWxlLnYxLlN0b3BOZXR3b3JrQ2FwdHVyZVJlcXVlc3QaKy5icm93c2Vyc2NhbGUudjEuU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2UScQoWU3RyZWFtTmV0d29ya0V4Y2hhbmdlcxIuLmJyb3dzZXJzY2FsZS52MS5TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5OZXR3b3JrRXhjaGFuZ2VFdmVudDABElUKCkdldENvb2tpZXMSIi5icm93c2Vyc2NhbGUudjEuR2V0Q29va2llc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuR2V0Q29va2llc1Jlc3BvbnNlEkgKClNldENvb2tpZXMSIi5icm93c2Vyc2NhbGUudjEuU2V0Q29va2llc1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSTAoMQ2xlYXJDb29raWVzEiQuYnJvd3NlcnNjYWxlLnYxLkNsZWFyQ29va2llc1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSVQoKR2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVzcG9uc2USSAoKU2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5TZXRTdG9yYWdlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJMCgxDbGVhclN0b3JhZ2USJC5icm93c2Vyc2NhbGUudjEuQ2xlYXJTdG9yYWdlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJhCg5HZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXRBdXRoU2Vzc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0QXV0aFNlc3Npb25SZXNwb25zZRJQCg5TZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5TZXRBdXRoU2Vzc2lvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSSQoGR2V0RE9NEh4uYnJvd3NlcnNjYWxlLnYxLkdldERPTVJlcXVlc3QaHy5icm93c2Vyc2NhbGUudjEuR2V0RE9NUmVzcG9uc2USVQoKR2V0RE9NSGFzaBIiLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVzcG9uc2USYQoOR2V0T2JzZXJ2YXRpb24SJi5icm93c2Vyc2NhbGUudjEuR2V0T2JzZXJ2YXRpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLkdldE9ic2VydmF0aW9uUmVzcG9uc2USagoRSW5zcGVjdEF0UG9zaXRpb24SKS5icm93c2Vyc2NhbGUudjEuSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0GiouYnJvd3NlcnNjYWxlLnYxLkluc3BlY3RBdFBvc2l0aW9uUmVzcG9uc2USTgoNSGlnaGxpZ2h0Tm9kZRIlLmJyb3dzZXJzY2FsZS52MS5IaWdobGlnaHROb2RlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJhCg5TdGFydERvbU1pcnJvchImLmJyb3dzZXJzY2FsZS52MS5TdGFydERvbU1pcnJvclJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuU3RhcnREb21NaXJyb3JSZXNwb25zZRJOCg1TdG9wRG9tTWlycm9yEiUuYnJvd3NlcnNjYWxlLnYxLlN0b3BEb21NaXJyb3JSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EmEKDkdldERvbUNoaWxkcmVuEiYuYnJvd3NlcnNjYWxlLnYxLkdldERvbUNoaWxkcmVuUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5HZXREb21DaGlsZHJlblJlc3BvbnNlElYKEVJlbGVhc2VEb21TdWJ0cmVlEikuYnJvd3NlcnNjYWxlLnYxLlJlbGVhc2VEb21TdWJ0cmVlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJeCg1SZXZlYWxEb21Ob2RlEiUuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXF1ZXN0GiYuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXNwb25zZRJhCg5HZXREb21SZXZpc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXREb21SZXZpc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0RG9tUmV2aXNpb25SZXNwb25zZRJXCg9TdHJlYW1Eb21FdmVudHMSJy5icm93c2Vyc2NhbGUudjEuU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBoZLmJyb3dzZXJzY2FsZS52MS5Eb21FdmVudDABElUKClNjcmVlbnNob3QSIi5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlc3BvbnNlElUKClJlYWRDYW52YXMSIi5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1Jlc3BvbnNlEkgKCkluc2VydFRleHQSIi5icm93c2Vyc2NhbGUudjEuSW5zZXJ0VGV4dFJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSPAoEVHlwZRIcLmJyb3dzZXJzY2FsZS52MS5UeXBlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJECghQcmVzc0tleRIgLmJyb3dzZXJzY2FsZS52MS5QcmVzc0tleVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSSAoKUmVsZWFzZUtleRIiLmJyb3dzZXJzY2FsZS52MS5SZWxlYXNlS2V5UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJbCgxHZXRTZWxlY3Rpb24SJC5icm93c2Vyc2NhbGUudjEuR2V0U2VsZWN0aW9uUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5HZXRTZWxlY3Rpb25SZXNwb25zZRJbCgxTb2x2ZUNhcHRjaGESJC5icm93c2Vyc2NhbGUudjEuU29sdmVDYXB0Y2hhUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5Tb2x2ZUNhcHRjaGFSZXNwb25zZRJkCg9HZXRTdHJlYW1Db25maWcSJy5icm93c2Vyc2NhbGUudjEuR2V0U3RyZWFtQ29uZmlnUmVxdWVzdBooLmJyb3dzZXJzY2FsZS52MS5HZXRTdHJlYW1Db25maWdSZXNwb25zZRJYCgtTdGFydFN0cmVhbRIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFN0cmVhbVJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTdHJlYW1SZXNwb25zZRJVCgpTdG9wU3RyZWFtEiIuYnJvd3NlcnNjYWxlLnYxLlN0b3BTdHJlYW1SZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLlN0b3BTdHJlYW1SZXNwb25zZRJSCglSdW5TY3JpcHQSIS5icm93c2Vyc2NhbGUudjEuUnVuU2NyaXB0UmVxdWVzdBoiLmJyb3dzZXJzY2FsZS52MS5SdW5TY3JpcHRSZXNwb25zZRJYCgtTdGFydFNjcmlwdBIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFNjcmlwdFJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTY3JpcHRSZXNwb25zZRJYCgtTdG9wU2NyaXB0cxIjLmJyb3dzZXJzY2FsZS52MS5TdG9wU2NyaXB0c1JlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RvcFNjcmlwdHNSZXNwb25zZRJhCg5MaXN0U2NyaXB0UnVucxImLmJyb3dzZXJzY2FsZS52MS5MaXN0U2NyaXB0UnVuc1JlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuTGlzdFNjcmlwdFJ1bnNSZXNwb25zZRJgChJTdHJlYW1TY3JpcHRFdmVudHMSKi5icm93c2Vyc2NhbGUudjEuU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBocLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRFdmVudDABQjNaMWdpdGh1Yi5jb20vYnJvd3NlcnNjYWxlL2Jyb3dzZXJzY2FsZS1nby9nZW5lcmF0ZWRiBnByb3RvMw", [file_google_protobuf_empty]);
|
|
3802
|
+
var file_wrc = /* @__PURE__ */ fileDesc("Cgl3cmMucHJvdG8SD2Jyb3dzZXJzY2FsZS52MSI7CgRSZWN0EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAEihgIKCUZyYW1lSW5mbxIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSEAoIaXNfb29waWYYAyABKAgSFgoOaGFzX2pzX2NvbnRleHQYBCABKAgSEgoKaXNfbG9hZGluZxgFIAEoCBISCgppc192aXNpYmxlGAYgASgIEiwKDWFic29sdXRlX3JlY3QYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIsCg1yZWxhdGl2ZV9yZWN0GAggASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSLAoIY2hpbGRyZW4YCSADKAsyGi5icm93c2Vyc2NhbGUudjEuRnJhbWVJbmZvIqwBCghQYWdlSW5mbxIPCgdwYWdlX2lkGAEgASgJEhoKEmJyb3dzZXJfY29udGV4dF9pZBgCIAEoCRILCgN1cmwYAyABKAkSDQoFdGl0bGUYBCABKAkSJwoIdmlld3BvcnQYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIuCgpmcmFtZV90cmVlGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLkZyYW1lSW5mbyIlCgZIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKAAQoSSW50ZXJjZXB0ZWRSZXF1ZXN0Eg4KBm1ldGhvZBgBIAEoCRILCgN1cmwYAiABKAkSKAoHaGVhZGVycxgDIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISDAoEYm9keRgEIAEoCRIVCg1yZXNvdXJjZV90eXBlGAUgASgJIm8KE0ludGVyY2VwdGVkUmVzcG9uc2USCwoDdXJsGAEgASgJEhMKC3N0YXR1c19jb2RlGAIgASgFEigKB2hlYWRlcnMYAyADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEgwKBGJvZHkYBCABKAkijgEKEkhlYWRlck1vZGlmaWNhdGlvbhIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJSACIAQESDgoGYWN0aW9uGAMgASgJEhMKBmJlZm9yZRgEIAEoCUgBiAEBEhIKBWFmdGVyGAUgASgJSAKIAQFCCAoGX3ZhbHVlQgkKB19iZWZvcmVCCAoGX2FmdGVyIk0KEkNvb2tpZVBhcnRpdGlvbktleRIWCg50b3BfbGV2ZWxfc2l0ZRgBIAEoCRIfChdoYXNfY3Jvc3Nfc2l0ZV9hbmNlc3RvchgCIAEoCCK/AwoLQ29va2llUGFyYW0SDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIQCgN1cmwYAyABKAlIAIgBARIOCgZkb21haW4YBCABKAkSDAoEcGF0aBgFIAEoCRITCgZzZWN1cmUYBiABKAhIAYgBARIWCglodHRwX29ubHkYByABKAhIAogBARIWCglzYW1lX3NpdGUYCCABKAlIA4gBARIUCgdleHBpcmVzGAkgASgBSASIAQESFQoIcHJpb3JpdHkYCiABKAlIBYgBARIaCg1zb3VyY2Vfc2NoZW1lGAsgASgJSAaIAQESGAoLc291cmNlX3BvcnQYDCABKAVIB4gBARI/Cg1wYXJ0aXRpb25fa2V5GA0gASgLMiMuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcnRpdGlvbktleUgIiAEBQgYKBF91cmxCCQoHX3NlY3VyZUIMCgpfaHR0cF9vbmx5QgwKCl9zYW1lX3NpdGVCCgoIX2V4cGlyZXNCCwoJX3ByaW9yaXR5QhAKDl9zb3VyY2Vfc2NoZW1lQg4KDF9zb3VyY2VfcG9ydEIQCg5fcGFydGl0aW9uX2tleSKtAQoNV2FpdENvbmRpdGlvbhIVCghzZWxlY3RvchgBIAEoCUgAiAEBEhoKDWpzX2V4cHJlc3Npb24YAiABKAlIAYgBARIUCgd2aXNpYmxlGAMgASgISAKIAQESGAoLc3RlYWR5X3RpbWUYBCABKAFIA4gBAUILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCgoIX3Zpc2libGVCDgoMX3N0ZWFkeV90aW1lIswBCgpXYWl0UmVzdWx0Eg0KBWluZGV4GAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYByABKAgSLgoFZXJyb3IYBiABKAsyGi5icm93c2Vyc2NhbGUudjEuV2FpdEVycm9ySACIAQFCCAoGX2Vycm9yIuwBChNXYWl0Q29uZGl0aW9uU3RhdHVzEg0KBWluZGV4GAEgASgFEg0KBXN0YXRlGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIQCghmcmFtZV9pZBgEIAEoCRISCgppc192aXNpYmxlGAUgASgIEioKBmJvdW5kcxgGIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0SACIAQESNAoIb2NjbHVkZXIYByABKAsyHS5icm93c2Vyc2NhbGUudjEuT2NjbHVkZXJJbmZvSAGIAQFCCQoHX2JvdW5kc0ILCglfb2NjbHVkZXIiZAoJV2FpdEVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI4Cgpjb25kaXRpb25zGAMgAygLMiQuYnJvd3NlcnNjYWxlLnYxLldhaXRDb25kaXRpb25TdGF0dXMipgEKDUVsZW1lbnRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIOCgZyb290X3gYBiABKAESDgoGcm9vdF95GAcgASgBItIDCgxPY2NsdWRlckluZm8SFwoPYmFja2VuZF9ub2RlX2lkGAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhAKCHRhZ19uYW1lGAMgASgJEg8KAmlkGAQgASgJSACIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgBiAEBEhEKBHRleHQYBiABKAlIAogBARIlCgZib3VuZHMYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIbCg5wb2ludGVyX2V2ZW50cxgIIAEoCUgDiAEBEhcKCnZpc2liaWxpdHkYCSABKAlIBIgBARIUCgdvcGFjaXR5GAogASgBSAWIAQESFAoHel9pbmRleBgLIAEoCUgGiAEBEiUKGGhpdHRhYmxlX3doaWxlX2ludmlzaWJsZRgMIAEoCEgHiAEBEhUKCHBvc2l0aW9uGA0gASgJSAiIAQFCBQoDX2lkQg0KC19jbGFzc19uYW1lQgcKBV90ZXh0QhEKD19wb2ludGVyX2V2ZW50c0INCgtfdmlzaWJpbGl0eUIKCghfb3BhY2l0eUIKCghfel9pbmRleEIbChlfaGl0dGFibGVfd2hpbGVfaW52aXNpYmxlQgsKCV9wb3NpdGlvbiItCgxDb21tYW5kRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIl0KDUNvbW1hbmRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIxCgVlcnJvchgCIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IioAEKCkNsaWNrRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjQKCG9jY2x1ZGVyGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gAiAEBEhwKD2V2YWRlX2F0dGVtcHRlZBgEIAEoCEgBiAEBQgsKCV9vY2NsdWRlckISChBfZXZhZGVfYXR0ZW1wdGVkIt8BCgtDbGlja1Jlc3VsdBIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLwoFZXJyb3IYCCABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBQggKBl9lcnJvciKeAgoMUmVhY3Rpb25JbmZvEhMKC3JlYWN0aW9uX2lkGAEgASgJEhsKDm1hdGNoX3NlbGVjdG9yGAIgASgJSACIAQESIAoTbWF0Y2hfanNfZXhwcmVzc2lvbhgDIAEoCUgBiAEBEhwKD2FjdGlvbl9zZWxlY3RvchgEIAEoCUgCiAEBEiEKFGFjdGlvbl9qc19leHByZXNzaW9uGAUgASgJSAOIAQESEAoIZnJhbWVfaWQYBiABKAkSDwoHdmlzaWJsZRgHIAEoCEIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CEgoQX2FjdGlvbl9zZWxlY3RvckIXChVfYWN0aW9uX2pzX2V4cHJlc3Npb24i1gMKEkFkZFJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIbCg5tYXRjaF9zZWxlY3RvchgEIAEoCUgAiAEBEiAKE21hdGNoX2pzX2V4cHJlc3Npb24YBSABKAlIAYgBARIVCghmcmFtZV9pZBgGIAEoCUgCiAEBEhQKB3Zpc2libGUYByABKAhIA4gBARIcCg9hY3Rpb25fc2VsZWN0b3IYCCABKAlIBIgBARIhChRhY3Rpb25fanNfZXhwcmVzc2lvbhgJIAEoCUgFiAEBEhMKBmJ1dHRvbhgKIAEoCUgGiAEBEhgKC2NsaWNrX2NvdW50GAsgASgFSAeIAQESFQoIaW50ZXJ2YWwYDCABKAFICIgBAUIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgoKCF92aXNpYmxlQhIKEF9hY3Rpb25fc2VsZWN0b3JCFwoVX2FjdGlvbl9qc19leHByZXNzaW9uQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgsKCV9pbnRlcnZhbCJ4ChNBZGRSZWFjdGlvblJlc3BvbnNlEhMKC3JlYWN0aW9uX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIlEKFVJlbW92ZVJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLcmVhY3Rpb25faWQYAyABKAkidwoWUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRIPCgdyZW1vdmVkGAEgASgIEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIkwKFExpc3RSZWFjdGlvbnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIpcBChVMaXN0UmVhY3Rpb25zUmVzcG9uc2USMAoJcmVhY3Rpb25zGAEgAygLMh0uYnJvd3NlcnNjYWxlLnYxLlJlYWN0aW9uSW5mbxIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciLpAQoKRWxlbWVudFJlZhIXCg9iYWNrZW5kX25vZGVfaWQYASABKAUSEAoIdGFnX25hbWUYAiABKAkSDwoCaWQYAyABKAlIAIgBARIRCgRuYW1lGAQgASgJSAGIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgCiAEBEhcKCmlucHV0X3R5cGUYBiABKAlIA4gBARIRCgR0ZXh0GAcgASgJSASIAQESEAoIZWRpdGFibGUYCCABKAhCBQoDX2lkQgcKBV9uYW1lQg0KC19jbGFzc19uYW1lQg0KC19pbnB1dF90eXBlQgcKBV90ZXh0Iu4CCglGaWxsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjUKC2NsaWNrX2Vycm9yGAMgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkNsaWNrRXJyb3JIAIgBARIkChdmb2N1c2VkX2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgBiAEBEjkKD2ZvY3VzZWRfZWxlbWVudBgFIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5FbGVtZW50UmVmSAKIAQESHAoPdGFyZ2V0X2VkaXRhYmxlGAYgASgISAOIAQESIAoTdGFyZ2V0X3ZhbHVlX2xlbmd0aBgHIAEoBUgEiAEBQg4KDF9jbGlja19lcnJvckIaChhfZm9jdXNlZF9iYWNrZW5kX25vZGVfaWRCEgoQX2ZvY3VzZWRfZWxlbWVudEISChBfdGFyZ2V0X2VkaXRhYmxlQhYKFF90YXJnZXRfdmFsdWVfbGVuZ3RoIqIBCgpGaWxsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLgoFZXJyb3IYCCABKAsyGi5icm93c2Vyc2NhbGUudjEuRmlsbEVycm9ySACIAQFCCAoGX2Vycm9yIsIBCgpEcmFnUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg8KB3N0YXJ0X3gYBCABKAESDwoHc3RhcnRfeRgFIAEoARINCgVlbmRfeBgGIAEoARINCgVlbmRfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5EcmFnRXJyb3JIAIgBAUIICgZfZXJyb3IicQoJRHJhZ0Vycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI1CgtjbGlja19lcnJvchgDIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5DbGlja0Vycm9ySACIAQFCDgoMX2NsaWNrX2Vycm9yIq4BChJTZWxlY3RPcHRpb25SZXN1bHQSFgoOc2VsZWN0ZWRfaW5kZXgYASABKAUSFgoOc2VsZWN0ZWRfdmFsdWUYAiABKAkSFQoNc2VsZWN0ZWRfdGV4dBgDIAEoCRIPCgdzdWNjZXNzGAQgASgIEjYKBWVycm9yGAUgASgLMiIuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvbkVycm9ySACIAQFCCAoGX2Vycm9yIjIKEVNlbGVjdE9wdGlvbkVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLBAQoMU2Nyb2xsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSMAoFZXJyb3IYCCABKAsyHC5icm93c2Vyc2NhbGUudjEuU2Nyb2xsRXJyb3JIAIgBAUIICgZfZXJyb3IiLAoLU2Nyb2xsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIt0BCgpNb3ZlUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Nb3ZlRXJyb3JIAIgBAUIICgZfZXJyb3IiKgoJTW92ZUVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLmAQoPU2V0UHJveHlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIXCgpwcm94eV9ob3N0GAMgASgJSACIAQESFwoKcHJveHlfcG9ydBgEIAEoBUgBiAEBEhsKDnByb3h5X3VzZXJuYW1lGAUgASgJSAKIAQESGwoOcHJveHlfcGFzc3dvcmQYBiABKAlIA4gBAUINCgtfcHJveHlfaG9zdEINCgtfcHJveHlfcG9ydEIRCg9fcHJveHlfdXNlcm5hbWVCEQoPX3Byb3h5X3Bhc3N3b3JkIjYKD0dldFBhZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiigEKEEdldFBhZ2VzUmVzcG9uc2USKAoFcGFnZXMYASADKAsyGS5icm93c2Vyc2NhbGUudjEuUGFnZUluZm8SDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IimgEKD05hdmlnYXRlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgN1cmwYBCABKAkSFQoIcmVmZXJyZXIYBSABKAlIAIgBARIUCgd0aW1lb3V0GAYgASgBSAGIAQFCCwoJX3JlZmVycmVyQgoKCF90aW1lb3V0In8KEE5hdmlnYXRlUmVzcG9uc2USEAoIZnJhbWVfaWQYASABKAkSCwoDdXJsGAIgASgJEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIrYBCg9Mb2FkSFRNTFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDdXJsGAQgASgJEgwKBGh0bWwYBSABKAkSKAoHaGVhZGVycxgGIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISGAoLc3RhdHVzX2NvZGUYByABKAVIAIgBAUIOCgxfc3RhdHVzX2NvZGUifwoPRXZhbHVhdGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhIKCmV4cHJlc3Npb24YBCABKAkSFQoIZnJhbWVfaWQYBSABKAlIAIgBAUILCglfZnJhbWVfaWQixAEKEEV2YWx1YXRlUmVzcG9uc2USDgoGcmVzdWx0GAEgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgCIAEoBRISCgppc192aXNpYmxlGAMgASgIEiUKBmJvdW5kcxgEIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYBSABKAgSMQoFZXJyb3IYBiABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIsIBChBXYWl0Rm9yQW55UGFyYW1zEhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEjIKCmNvbmRpdGlvbnMYBCADKAsyHi5icm93c2Vyc2NhbGUudjEuV2FpdENvbmRpdGlvbhIVCghmcmFtZV9pZBgFIAEoCUgAiAEBEhQKB3RpbWVvdXQYBiABKAFIAYgBAUILCglfZnJhbWVfaWRCCgoIX3RpbWVvdXQi9QIKE1NlbGVjdE9wdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARISCgVpbmRleBgIIAEoBUgEiAEBEhIKBXZhbHVlGAkgASgJSAWIAQESEQoEdGV4dBgKIAEoCUgGiAEBEhgKC2ZpcmVfZXZlbnRzGAsgASgISAeIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQggKBl9pbmRleEIICgZfdmFsdWVCBwoFX3RleHRCDgoMX2ZpcmVfZXZlbnRzIu8BCg9TY3JvbGxUb1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWQimQIKDU1vdmVUb1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARIOCgF4GAggASgBSASIAQESDgoBeRgJIAEoAUgFiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIECgJfeEIECgJfeSKCAwoMQ2xpY2tSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESEwoGYnV0dG9uGAggASgJSASIAQESGAoLY2xpY2tfY291bnQYCSABKAVIBYgBARIOCgF4GAogASgBSAaIAQESDgoBeRgLIAEoAUgHiAEBEhMKBmFjdGlvbhgMIAEoCUgIiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIJCgdfYnV0dG9uQg4KDF9jbGlja19jb3VudEIECgJfeEIECgJfeUIJCgdfYWN0aW9uIoMDCgtEcmFnUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEhUKCG9mZnNldF94GAggASgBSASIAQESFQoIb2Zmc2V0X3kYCSABKAFIBYgBARIXCgphYnNvbHV0ZV94GAogASgBSAaIAQESFwoKYWJzb2x1dGVfeRgLIAEoAUgHiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEILCglfb2Zmc2V0X3hCCwoJX29mZnNldF95Qg0KC19hYnNvbHV0ZV94Qg0KC19hYnNvbHV0ZV95Iu8CCgtGaWxsUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEgwKBHRleHQYCCABKAkSGAoLY2xlYXJfZmlyc3QYCSABKAhIBIgBARIUCgd0aW1lb3V0GAogASgBSAWIAQESGAoLc3RlYWR5X3RpbWUYCyABKAFIBogBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCDgoMX2NsZWFyX2ZpcnN0QgoKCF90aW1lb3V0Qg4KDF9zdGVhZHlfdGltZSJMChNTZXRCbG9ja0xpc3RSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIQCghwYXR0ZXJucxgDIAMoCSJhChVTZXRTdGF0aWNQYXRoc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhEKCWJsb2JfbmFtZRgEIAEoCSKIAQoYV2FpdEZvckFueVJlcXVlc3RSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIQCghwYXR0ZXJucxgDIAMoCRITCgthYm9ydF9mbGFncxgEIAMoBRIUCgd0aW1lb3V0GAUgASgBSACIAQFCCgoIX3RpbWVvdXQirgEKGVdhaXRGb3JBbnlSZXF1ZXN0UmVzcG9uc2USDQoFaW5kZXgYASABKAUSNAoHcmVxdWVzdBgCIAEoCzIjLmJyb3dzZXJzY2FsZS52MS5JbnRlcmNlcHRlZFJlcXVlc3QSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiiQEKGVdhaXRGb3JBbnlSZXNwb25zZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhMKC2Fib3J0X2ZsYWdzGAQgAygFEhQKB3RpbWVvdXQYBSABKAFIAIgBAUIKCghfdGltZW91dCKxAQoaV2FpdEZvckFueVJlc3BvbnNlUmVzcG9uc2USDQoFaW5kZXgYASABKAUSNgoIcmVzcG9uc2UYAiABKAsyJC5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXNwb25zZRIPCgdzdWNjZXNzGAMgASgIEjEKBWVycm9yGAQgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciLKAQoUTW9kaWZ5UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKC3VybF9wYXR0ZXJuGAMgASgJEjoKDW1vZGlmaWNhdGlvbnMYBCADKAsyIy5icm93c2Vyc2NhbGUudjEuSGVhZGVyTW9kaWZpY2F0aW9uEhEKBGJvZHkYBSABKAlIAIgBARIUCgd0aW1lb3V0GAYgASgBSAGIAQFCBwoFX2JvZHlCCgoIX3RpbWVvdXQimwEKFU1vZGlmeVJlcXVlc3RSZXNwb25zZRI0CgdyZXF1ZXN0GAEgASgLMiMuYnJvd3NlcnNjYWxlLnYxLkludGVyY2VwdGVkUmVxdWVzdBIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKGAQoaU3RhcnROZXR3b3JrQ2FwdHVyZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEg4KBmJvZGllcxgEIAEoCRIVCg1ib2R5X3BhdHRlcm5zGAUgAygJSgQIBhAHSgQIBxAIIkAKGVN0b3BOZXR3b3JrQ2FwdHVyZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJInsKGlN0b3BOZXR3b3JrQ2FwdHVyZVJlc3BvbnNlEg8KB3N0b3BwZWQYASABKAgSDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiRAodU3RyZWFtTmV0d29ya0V4Y2hhbmdlc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIlsKFE5ldHdvcmtFeGNoYW5nZUV2ZW50EjIKCGV4Y2hhbmdlGAEgASgLMiAuYnJvd3NlcnNjYWxlLnYxLk5ldHdvcmtFeGNoYW5nZRIPCgdkcm9wcGVkGAIgASgEIrQFCg9OZXR3b3JrRXhjaGFuZ2USEgoKcmVxdWVzdF9pZBgBIAEoCRIQCghjaGFpbl9pZBgCIAEoCRIWCg5yZWRpcmVjdF9pbmRleBgDIAEoBRIQCghmcmFtZV9pZBgEIAEoCRIQCghpc19vb3BpZhgFIAEoCBIVCg1yZXNvdXJjZV90eXBlGAYgASgJEg4KBm1ldGhvZBgHIAEoCRILCgN1cmwYCCABKAkSFQoNaW5pdGlhdG9yX3VybBgJIAEoCRIwCg9yZXF1ZXN0X2hlYWRlcnMYCiADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEiAKGHJlcXVlc3RfaGVhZGVyc19hcmVfd2lyZRgLIAEoCBIUCgxyZXF1ZXN0X2JvZHkYDCABKAwSHgoWcmVxdWVzdF9ib2R5X3RydW5jYXRlZBgNIAEoCBIUCgxoYXNfcmVzcG9uc2UYDiABKAgSEwoLc3RhdHVzX2NvZGUYDyABKAUSEwoLc3RhdHVzX3RleHQYECABKAkSEQoJbWltZV90eXBlGBEgASgJEhAKCHByb3RvY29sGBIgASgJEhYKDnJlbW90ZV9hZGRyZXNzGBMgASgJEhMKC3NlcnZlZF9mcm9tGBQgASgJEjEKEHJlc3BvbnNlX2hlYWRlcnMYFSADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEiEKGXJlc3BvbnNlX2hlYWRlcnNfYXJlX3dpcmUYFiABKAgSFQoNcmVzcG9uc2VfYm9keRgXIAEoDBIfChdyZXNwb25zZV9ib2R5X3RydW5jYXRlZBgYIAEoCBIeChZyZXNwb25zZV9ib2R5X2NhcHR1cmVkGBkgASgIEhsKE2VuY29kZWRfZGF0YV9sZW5ndGgYGiABKAMSDQoFZXJyb3IYGyABKAkiOAoRR2V0Q29va2llc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIpEBChJHZXRDb29raWVzUmVzcG9uc2USLQoHY29va2llcxgBIAMoCzIcLmJyb3dzZXJzY2FsZS52MS5Db29raWVQYXJhbRIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJnChFTZXRDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSLQoHY29va2llcxgDIAMoCzIcLmJyb3dzZXJzY2FsZS52MS5Db29raWVQYXJhbSI6ChNDbGVhckNvb2tpZXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSIpCgtTdG9yYWdlSXRlbRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAkiUQoSU3RvcmFnZU9yaWdpbkVudHJ5Eg4KBm9yaWdpbhgBIAEoCRIrCgVpdGVtcxgCIAMoCzIcLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlSXRlbSJYChFHZXRTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoGb3JpZ2luGAMgASgJSACIAQFCCQoHX29yaWdpbiKYAQoSR2V0U3RvcmFnZVJlc3BvbnNlEjQKB3N0b3JhZ2UYASADKAsyIy5icm93c2Vyc2NhbGUudjEuU3RvcmFnZU9yaWdpbkVudHJ5Eg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIpgBChFTZXRTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSNAoHc3RvcmFnZRgDIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlT3JpZ2luRW50cnkSGAoLY2xlYXJfZmlyc3QYBCABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiWgoTQ2xlYXJTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoGb3JpZ2luGAMgASgJSACIAQFCCQoHX29yaWdpbiIsCgtEYnNjU2Vzc2lvbhIMCgRzaXRlGAEgASgJEg8KB3Nlc3Npb24YAiABKAki2AIKC0F1dGhTZXNzaW9uEhQKB2dhaWFfaWQYASABKAlIAIgBARISCgVlbWFpbBgCIAEoCUgBiAEBEhoKDXJlZnJlc2hfdG9rZW4YAyABKAlIAogBARIgChN3cmFwcGVkX2JpbmRpbmdfa2V5GAQgASgJSAOIAQESJAoXc2lnbmluX3Njb3BlZF9kZXZpY2VfaWQYBSABKAlIBIgBARIZCgxzeW5jX2NvbnNlbnQYBiABKAhIBYgBARIzCg1kYnNjX3Nlc3Npb25zGAcgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkRic2NTZXNzaW9uQgoKCF9nYWlhX2lkQggKBl9lbWFpbEIQCg5fcmVmcmVzaF90b2tlbkIWChRfd3JhcHBlZF9iaW5kaW5nX2tleUIaChhfc2lnbmluX3Njb3BlZF9kZXZpY2VfaWRCDwoNX3N5bmNfY29uc2VudCI8ChVHZXRBdXRoU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIqYBChZHZXRBdXRoU2Vzc2lvblJlc3BvbnNlEjIKB3Nlc3Npb24YASABKAsyHC5icm93c2Vyc2NhbGUudjEuQXV0aFNlc3Npb25IAIgBARIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgBiAEBQgoKCF9zZXNzaW9uQggKBl9lcnJvciJrChVTZXRBdXRoU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEi0KB3Nlc3Npb24YAyABKAsyHC5icm93c2Vyc2NhbGUudjEuQXV0aFNlc3Npb24ihwEKDUdldERPTVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSFQoIZnJhbWVfaWQYBCABKAlIAIgBARISCgVkZXB0aBgFIAEoBUgBiAEBQgsKCV9mcmFtZV9pZEIICgZfZGVwdGgiawoOR2V0RE9NUmVzcG9uc2USCwoDZG9tGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIpkEChVHZXRPYnNlcnZhdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSIwoWbWF4X2VsZW1lbnRzX3Blcl9mcmFtZRgEIAEoBUgAiAEBEhwKD21heF90ZXh0X2xlbmd0aBgFIAEoBUgBiAEBEhMKBmZvcm1hdBgGIAEoCUgCiAEBEh0KEG1heF90b3RhbF90b2tlbnMYByABKAVIA4gBARIbCg5pbmNsdWRlX2JvdW5kcxgIIAEoCEgEiAEBEhoKDXZpZXdwb3J0X29ubHkYCSABKAhIBYgBARIcCg9iYWNrZW5kX25vZGVfaWQYCiABKAVIBogBARIVCghzZWxlY3RvchgLIAEoCUgHiAEBEhoKDWpzX2V4cHJlc3Npb24YDCABKAlICIgBARIVCghmcmFtZV9pZBgNIAEoCUgJiAEBQhkKF19tYXhfZWxlbWVudHNfcGVyX2ZyYW1lQhIKEF9tYXhfdGV4dF9sZW5ndGhCCQoHX2Zvcm1hdEITChFfbWF4X3RvdGFsX3Rva2Vuc0IRCg9faW5jbHVkZV9ib3VuZHNCEAoOX3ZpZXdwb3J0X29ubHlCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkIpMBChZHZXRPYnNlcnZhdGlvblJlc3BvbnNlEhMKC29ic2VydmF0aW9uGAEgASgJEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9ySgQIAhADUhBvYnNlcnZhdGlvbl9qc29uIm0KEUdldERPTUhhc2hSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhUKCGZyYW1lX2lkGAQgASgJSACIAQFCCwoJX2ZyYW1lX2lkIiIKEkdldERPTUhhc2hSZXNwb25zZRIMCgRoYXNoGAEgASgJIoABChVTdGFydERvbU1pcnJvclJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhIKBWRlcHRoGAQgASgFSACIAQESEwoGcGllcmNlGAUgASgISAGIAQFCCAoGX2RlcHRoQgkKB19waWVyY2VKBAgDEAQimQEKFlN0YXJ0RG9tTWlycm9yUmVzcG9uc2USDAoEcm9vdBgBIAEoCRIQCghmcmFtZV9pZBgCIAEoCRILCgNzZXEYAyABKAQSDwoHc3VjY2VzcxgFIAEoCBIxCgVlcnJvchgGIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3JKBAgEEAUiQQoUU3RvcERvbU1pcnJvclJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJSgQIAxAEIpcBChVHZXREb21DaGlsZHJlblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCKFAQoWR2V0RG9tQ2hpbGRyZW5SZXNwb25zZRIQCghjaGlsZHJlbhgBIAEoCRILCgNzZXEYAiABKAQSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IifAoYUmVsZWFzZURvbVN1YnRyZWVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSFQoIZnJhbWVfaWQYBCABKAlIAIgBAUILCglfZnJhbWVfaWQieAoUUmV2ZWFsRG9tTm9kZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCKAAQoVUmV2ZWFsRG9tTm9kZVJlc3BvbnNlEgwKBHBhdGgYASABKAkSCwoDc2VxGAIgASgEEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yImAKFUdldERvbVJldmlzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFQoIZnJhbWVfaWQYAyABKAlIAIgBAUILCglfZnJhbWVfaWQieAoWR2V0RG9tUmV2aXNpb25SZXNwb25zZRIQCghyZXZpc2lvbhgBIAEoBBIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciI9ChZTdHJlYW1Eb21FdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSI5CglEb21VcGRhdGUSEAoIZnJhbWVfaWQYASABKAkSCwoDc2VxGAIgASgEEg0KBWVkaXRzGAMgASgJIiEKCURvbVJlc3luYxIOCgZyZWFzb24YAiABKAlKBAgBEAIiewoIRG9tRXZlbnQSLAoGdXBkYXRlGAEgASgLMhouYnJvd3NlcnNjYWxlLnYxLkRvbVVwZGF0ZUgAEiwKBnJlc3luYxgCIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Eb21SZXN5bmNIAEIHCgVldmVudEoECAMQBEoECAQQBSJmChhJbnNwZWN0QXRQb3NpdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCQoBeBgEIAEoARIJCgF5GAUgASgBIvcBChlJbnNwZWN0QXRQb3NpdGlvblJlc3BvbnNlEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCghmcmFtZV9pZBgCIAEoCRIQCgh0YWdfbmFtZRgDIAEoCRIUCgx0ZXh0X2NvbnRlbnQYBCABKAkSEgoKaXNfdmlzaWJsZRgFIAEoCBIlCgZib3VuZHMYBiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIPCgdzdWNjZXNzGAcgASgIEjEKBWVycm9yGAggASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKJAQoUSGlnaGxpZ2h0Tm9kZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAQgASgFEhUKCGZyYW1lX2lkGAUgASgJSACIAQFCCwoJX2ZyYW1lX2lkIlcKEUluc2VydFRleHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgwKBHRleHQYBCABKAkiewoLVHlwZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSDAoEdGV4dBgEIAEoCRIYCgtjbGVhcl9maXJzdBgFIAEoCEgAiAEBQg4KDF9jbGVhcl9maXJzdCK6AQoPUHJlc3NLZXlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA2tleRgEIAEoCRIRCgRjb2RlGAUgASgJSACIAQESFgoJbW9kaWZpZXJzGAYgASgFSAGIAQESFQoIbG9jYXRpb24YByABKAVIAogBAUIHCgVfY29kZUIMCgpfbW9kaWZpZXJzQgsKCV9sb2NhdGlvbiK8AQoRUmVsZWFzZUtleVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDa2V5GAQgASgJEhEKBGNvZGUYBSABKAlIAIgBARIWCgltb2RpZmllcnMYBiABKAVIAYgBARIVCghsb2NhdGlvbhgHIAEoBUgCiAEBQgcKBV9jb2RlQgwKCl9tb2RpZmllcnNCCwoJX2xvY2F0aW9uIksKE0dldFNlbGVjdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkicgoUR2V0U2VsZWN0aW9uUmVzcG9uc2USDAoEdGV4dBgBIAEoCRIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKLAQoRU2NyZWVuc2hvdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSEwoGZm9ybWF0GAQgASgJSACIAQESFAoHcXVhbGl0eRgFIAEoBUgBiAEBQgkKB19mb3JtYXRCCgoIX3F1YWxpdHkilgEKElNjcmVlbnNob3RSZXNwb25zZRITCgtkYXRhX2Jhc2U2NBgBIAEoCRINCgV3aWR0aBgCIAEoBRIOCgZoZWlnaHQYAyABKAUSDwoHc3VjY2VzcxgEIAEoCBIxCgVlcnJvchgFIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IikwMKEVJlYWRDYW52YXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESEwoGZm9ybWF0GAggASgJSASIAQESFAoHcXVhbGl0eRgJIAEoBUgFiAEBEg8KAnN4GAogASgFSAaIAQESDwoCc3kYCyABKAVIB4gBARIPCgJzdxgMIAEoBUgIiAEBEg8KAnNoGA0gASgFSAmIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19mb3JtYXRCCgoIX3F1YWxpdHlCBQoDX3N4QgUKA19zeUIFCgNfc3dCBQoDX3NoItcBChJSZWFkQ2FudmFzUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEwoLZGF0YV9iYXNlNjQYBCABKAkSDQoFd2lkdGgYBSABKAUSDgoGaGVpZ2h0GAYgASgFEhQKDG9yaWdpbl9jbGVhbhgHIAEoCBIxCgVlcnJvchgIIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiZAoTU29sdmVDYXB0Y2hhUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEgoKdGltZW91dF9tcxgDIAEoBRIUCgxyZXRyeV9hbW91bnQYBCABKAUiJgoUU29sdmVDYXB0Y2hhUmVzcG9uc2USDgoGcmVzdWx0GAEgASgJImUKCUljZVNlcnZlchIMCgR1cmxzGAEgAygJEhUKCHVzZXJuYW1lGAIgASgJSACIAQESFwoKY3JlZGVudGlhbBgDIAEoCUgBiAEBQgsKCV91c2VybmFtZUINCgtfY3JlZGVudGlhbCI9ChZHZXRTdHJlYW1Db25maWdSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSJKChdHZXRTdHJlYW1Db25maWdSZXNwb25zZRIvCgtpY2Vfc2VydmVycxgBIAMoCzIaLmJyb3dzZXJzY2FsZS52MS5JY2VTZXJ2ZXIiTAoSU3RhcnRTdHJlYW1SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIRCglvZmZlcl9zZHAYAyABKAkioAEKE1N0YXJ0U3RyZWFtUmVzcG9uc2USEgoKYW5zd2VyX3NkcBgBIAEoCRInCgh2aWV3cG9ydBgCIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIjgKEVN0b3BTdHJlYW1SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSJDCg5TY3JpcHRMb2dFbnRyeRINCgVsZXZlbBgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhEKCXRpbWVzdGFtcBgDIAEoAyJHChBSdW5TY3JpcHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZzb3VyY2UYAyABKAkihQEKEVJ1blNjcmlwdFJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgSDgoGcmVzdWx0GAIgASgJEg4KBnJ1bl9pZBgDIAEoCRIsCgNsb2cYBCADKAsyHy5icm93c2Vyc2NhbGUudjEuU2NyaXB0TG9nRW50cnkSEQoJdHJ1bmNhdGVkGAUgASgIIkkKElN0YXJ0U2NyaXB0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGc291cmNlGAMgASgJIiUKE1N0YXJ0U2NyaXB0UmVzcG9uc2USDgoGcnVuX2lkGAEgASgJIkkKElN0b3BTY3JpcHRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGcnVuX2lkGAMgASgJIiYKE1N0b3BTY3JpcHRzUmVzcG9uc2USDwoHc3RvcHBlZBgBIAEoBSIvCglTY3JpcHRSdW4SDgoGcnVuX2lkGAEgASgJEhIKCnJ1bm5pbmdfbXMYAiABKAMiPAoVTGlzdFNjcmlwdFJ1bnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSJCChZMaXN0U2NyaXB0UnVuc1Jlc3BvbnNlEigKBHJ1bnMYASADKAsyGi5icm93c2Vyc2NhbGUudjEuU2NyaXB0UnVuIlAKGVN0cmVhbVNjcmlwdEV2ZW50c1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnJ1bl9pZBgDIAEoCSJKCglTY3JpcHRMb2cSDgoGcnVuX2lkGAEgASgJEi0KBGxpbmUYAiABKAsyHy5icm93c2Vyc2NhbGUudjEuU2NyaXB0TG9nRW50cnkiUgoOU2NyaXB0RmluaXNoZWQSDgoGcnVuX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSDgoGcmVzdWx0GAMgASgJEg8KB3N0b3BwZWQYBCABKAgihwEKC1NjcmlwdEV2ZW50EikKA2xvZxgBIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dIABIzCghmaW5pc2hlZBgCIAEoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRGaW5pc2hlZEgAEg8KB2Ryb3BwZWQYAyABKARCBwoFZXZlbnQyjCkKB0Jyb3dzZXISTAoIU2V0UHJveHkSIC5icm93c2Vyc2NhbGUudjEuU2V0UHJveHlSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSTwoIR2V0UGFnZXMSIC5icm93c2Vyc2NhbGUudjEuR2V0UGFnZXNSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLkdldFBhZ2VzUmVzcG9uc2USTwoITmF2aWdhdGUSIC5icm93c2Vyc2NhbGUudjEuTmF2aWdhdGVSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLk5hdmlnYXRlUmVzcG9uc2USTAoITG9hZEhUTUwSIC5icm93c2Vyc2NhbGUudjEuTG9hZEhUTUxSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSTwoIRXZhbHVhdGUSIC5icm93c2Vyc2NhbGUudjEuRXZhbHVhdGVSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLkV2YWx1YXRlUmVzcG9uc2USTAoKV2FpdEZvckFueRIhLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UGFyYW1zGhsuYnJvd3NlcnNjYWxlLnYxLldhaXRSZXN1bHQSWQoMU2VsZWN0T3B0aW9uEiQuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvblJlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuU2VsZWN0T3B0aW9uUmVzdWx0EksKCFNjcm9sbFRvEiAuYnJvd3NlcnNjYWxlLnYxLlNjcm9sbFRvUmVxdWVzdBodLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxSZXN1bHQSRQoGTW92ZVRvEh4uYnJvd3NlcnNjYWxlLnYxLk1vdmVUb1JlcXVlc3QaGy5icm93c2Vyc2NhbGUudjEuTW92ZVJlc3VsdBJECgVDbGljaxIdLmJyb3dzZXJzY2FsZS52MS5DbGlja1JlcXVlc3QaHC5icm93c2Vyc2NhbGUudjEuQ2xpY2tSZXN1bHQSQQoERHJhZxIcLmJyb3dzZXJzY2FsZS52MS5EcmFnUmVxdWVzdBobLmJyb3dzZXJzY2FsZS52MS5EcmFnUmVzdWx0EkEKBEZpbGwSHC5icm93c2Vyc2NhbGUudjEuRmlsbFJlcXVlc3QaGy5icm93c2Vyc2NhbGUudjEuRmlsbFJlc3VsdBJYCgtBZGRSZWFjdGlvbhIjLmJyb3dzZXJzY2FsZS52MS5BZGRSZWFjdGlvblJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuQWRkUmVhY3Rpb25SZXNwb25zZRJhCg5SZW1vdmVSZWFjdGlvbhImLmJyb3dzZXJzY2FsZS52MS5SZW1vdmVSZWFjdGlvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRJeCg1MaXN0UmVhY3Rpb25zEiUuYnJvd3NlcnNjYWxlLnYxLkxpc3RSZWFjdGlvbnNSZXF1ZXN0GiYuYnJvd3NlcnNjYWxlLnYxLkxpc3RSZWFjdGlvbnNSZXNwb25zZRJUCgxTZXRCbG9ja0xpc3QSJC5icm93c2Vyc2NhbGUudjEuU2V0QmxvY2tMaXN0UmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElgKDlNldFN0YXRpY1BhdGhzEiYuYnJvd3NlcnNjYWxlLnYxLlNldFN0YXRpY1BhdGhzUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EmoKEVdhaXRGb3JBbnlSZXF1ZXN0EikuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXF1ZXN0UmVxdWVzdBoqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEm0KEldhaXRGb3JBbnlSZXNwb25zZRIqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0GisuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXNwb25zZVJlc3BvbnNlEl4KDU1vZGlmeVJlcXVlc3QSJS5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEmIKE1N0YXJ0TmV0d29ya0NhcHR1cmUSKy5icm93c2Vyc2NhbGUudjEuU3RhcnROZXR3b3JrQ2FwdHVyZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJtChJTdG9wTmV0d29ya0NhcHR1cmUSKi5icm93c2Vyc2NhbGUudjEuU3RvcE5ldHdvcmtDYXB0dXJlUmVxdWVzdBorLmJyb3dzZXJzY2FsZS52MS5TdG9wTmV0d29ya0NhcHR1cmVSZXNwb25zZRJxChZTdHJlYW1OZXR3b3JrRXhjaGFuZ2VzEi4uYnJvd3NlcnNjYWxlLnYxLlN0cmVhbU5ldHdvcmtFeGNoYW5nZXNSZXF1ZXN0GiUuYnJvd3NlcnNjYWxlLnYxLk5ldHdvcmtFeGNoYW5nZUV2ZW50MAESVQoKR2V0Q29va2llcxIiLmJyb3dzZXJzY2FsZS52MS5HZXRDb29raWVzUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRDb29raWVzUmVzcG9uc2USUAoKU2V0Q29va2llcxIiLmJyb3dzZXJzY2FsZS52MS5TZXRDb29raWVzUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElQKDENsZWFyQ29va2llcxIkLmJyb3dzZXJzY2FsZS52MS5DbGVhckNvb2tpZXNSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSVQoKR2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVzcG9uc2USUAoKU2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5TZXRTdG9yYWdlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElQKDENsZWFyU3RvcmFnZRIkLmJyb3dzZXJzY2FsZS52MS5DbGVhclN0b3JhZ2VSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSYQoOR2V0QXV0aFNlc3Npb24SJi5icm93c2Vyc2NhbGUudjEuR2V0QXV0aFNlc3Npb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLkdldEF1dGhTZXNzaW9uUmVzcG9uc2USWAoOU2V0QXV0aFNlc3Npb24SJi5icm93c2Vyc2NhbGUudjEuU2V0QXV0aFNlc3Npb25SZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSSQoGR2V0RE9NEh4uYnJvd3NlcnNjYWxlLnYxLkdldERPTVJlcXVlc3QaHy5icm93c2Vyc2NhbGUudjEuR2V0RE9NUmVzcG9uc2USVQoKR2V0RE9NSGFzaBIiLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVzcG9uc2USYQoOR2V0T2JzZXJ2YXRpb24SJi5icm93c2Vyc2NhbGUudjEuR2V0T2JzZXJ2YXRpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLkdldE9ic2VydmF0aW9uUmVzcG9uc2USagoRSW5zcGVjdEF0UG9zaXRpb24SKS5icm93c2Vyc2NhbGUudjEuSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0GiouYnJvd3NlcnNjYWxlLnYxLkluc3BlY3RBdFBvc2l0aW9uUmVzcG9uc2USVgoNSGlnaGxpZ2h0Tm9kZRIlLmJyb3dzZXJzY2FsZS52MS5IaWdobGlnaHROb2RlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EmEKDlN0YXJ0RG9tTWlycm9yEiYuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0RG9tTWlycm9yUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5TdGFydERvbU1pcnJvclJlc3BvbnNlElYKDVN0b3BEb21NaXJyb3ISJS5icm93c2Vyc2NhbGUudjEuU3RvcERvbU1pcnJvclJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJhCg5HZXREb21DaGlsZHJlbhImLmJyb3dzZXJzY2FsZS52MS5HZXREb21DaGlsZHJlblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0RG9tQ2hpbGRyZW5SZXNwb25zZRJeChFSZWxlYXNlRG9tU3VidHJlZRIpLmJyb3dzZXJzY2FsZS52MS5SZWxlYXNlRG9tU3VidHJlZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJeCg1SZXZlYWxEb21Ob2RlEiUuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXF1ZXN0GiYuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXNwb25zZRJhCg5HZXREb21SZXZpc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXREb21SZXZpc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0RG9tUmV2aXNpb25SZXNwb25zZRJXCg9TdHJlYW1Eb21FdmVudHMSJy5icm93c2Vyc2NhbGUudjEuU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBoZLmJyb3dzZXJzY2FsZS52MS5Eb21FdmVudDABElUKClNjcmVlbnNob3QSIi5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlc3BvbnNlElUKClJlYWRDYW52YXMSIi5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1Jlc3BvbnNlElAKCkluc2VydFRleHQSIi5icm93c2Vyc2NhbGUudjEuSW5zZXJ0VGV4dFJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJECgRUeXBlEhwuYnJvd3NlcnNjYWxlLnYxLlR5cGVSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSTAoIUHJlc3NLZXkSIC5icm93c2Vyc2NhbGUudjEuUHJlc3NLZXlSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSUAoKUmVsZWFzZUtleRIiLmJyb3dzZXJzY2FsZS52MS5SZWxlYXNlS2V5UmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElsKDEdldFNlbGVjdGlvbhIkLmJyb3dzZXJzY2FsZS52MS5HZXRTZWxlY3Rpb25SZXF1ZXN0GiUuYnJvd3NlcnNjYWxlLnYxLkdldFNlbGVjdGlvblJlc3BvbnNlElsKDFNvbHZlQ2FwdGNoYRIkLmJyb3dzZXJzY2FsZS52MS5Tb2x2ZUNhcHRjaGFSZXF1ZXN0GiUuYnJvd3NlcnNjYWxlLnYxLlNvbHZlQ2FwdGNoYVJlc3BvbnNlEmQKD0dldFN0cmVhbUNvbmZpZxInLmJyb3dzZXJzY2FsZS52MS5HZXRTdHJlYW1Db25maWdSZXF1ZXN0GiguYnJvd3NlcnNjYWxlLnYxLkdldFN0cmVhbUNvbmZpZ1Jlc3BvbnNlElgKC1N0YXJ0U3RyZWFtEiMuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0U3RyZWFtUmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5TdGFydFN0cmVhbVJlc3BvbnNlElAKClN0b3BTdHJlYW0SIi5icm93c2Vyc2NhbGUudjEuU3RvcFN0cmVhbVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJSCglSdW5TY3JpcHQSIS5icm93c2Vyc2NhbGUudjEuUnVuU2NyaXB0UmVxdWVzdBoiLmJyb3dzZXJzY2FsZS52MS5SdW5TY3JpcHRSZXNwb25zZRJYCgtTdGFydFNjcmlwdBIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFNjcmlwdFJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTY3JpcHRSZXNwb25zZRJYCgtTdG9wU2NyaXB0cxIjLmJyb3dzZXJzY2FsZS52MS5TdG9wU2NyaXB0c1JlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RvcFNjcmlwdHNSZXNwb25zZRJhCg5MaXN0U2NyaXB0UnVucxImLmJyb3dzZXJzY2FsZS52MS5MaXN0U2NyaXB0UnVuc1JlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuTGlzdFNjcmlwdFJ1bnNSZXNwb25zZRJgChJTdHJlYW1TY3JpcHRFdmVudHMSKi5icm93c2Vyc2NhbGUudjEuU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBocLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRFdmVudDABQjNaMWdpdGh1Yi5jb20vYnJvd3NlcnNjYWxlL2Jyb3dzZXJzY2FsZS1nby9nZW5lcmF0ZWRiBnByb3RvMw", [file_google_protobuf_empty]);
|
|
3803
3803
|
var HeaderSchema = /* @__PURE__ */ messageDesc(file_wrc, 3);
|
|
3804
3804
|
var HeaderModificationSchema = /* @__PURE__ */ messageDesc(file_wrc, 6);
|
|
3805
3805
|
var CookiePartitionKeySchema = /* @__PURE__ */ messageDesc(file_wrc, 7);
|
|
3806
3806
|
var CookieParamSchema = /* @__PURE__ */ messageDesc(file_wrc, 8);
|
|
3807
3807
|
var WaitConditionSchema = /* @__PURE__ */ messageDesc(file_wrc, 9);
|
|
3808
|
-
var AddReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3809
|
-
var RemoveReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3810
|
-
var ListReactionsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3811
|
-
var SetProxyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3812
|
-
var GetPagesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3813
|
-
var NavigateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3814
|
-
var LoadHTMLRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3815
|
-
var EvaluateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3808
|
+
var AddReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 20);
|
|
3809
|
+
var RemoveReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 22);
|
|
3810
|
+
var ListReactionsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 24);
|
|
3811
|
+
var SetProxyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 37);
|
|
3812
|
+
var GetPagesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 38);
|
|
3813
|
+
var NavigateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 40);
|
|
3814
|
+
var LoadHTMLRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 42);
|
|
3815
|
+
var EvaluateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 43);
|
|
3816
3816
|
var WaitForAnyParamsSchema = /* @__PURE__ */ messageDesc(file_wrc, 45);
|
|
3817
3817
|
var SelectOptionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 46);
|
|
3818
3818
|
var ScrollToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 47);
|
|
@@ -3863,18 +3863,13 @@ var SolveCaptchaRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 114);
|
|
|
3863
3863
|
var GetStreamConfigRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 117);
|
|
3864
3864
|
var StartStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 119);
|
|
3865
3865
|
var StopStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 121);
|
|
3866
|
-
var RunScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3867
|
-
var StartScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3868
|
-
var StopScriptsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3869
|
-
var ListScriptRunsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3870
|
-
var StreamScriptEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3866
|
+
var RunScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 123);
|
|
3867
|
+
var StartScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 125);
|
|
3868
|
+
var StopScriptsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 127);
|
|
3869
|
+
var ListScriptRunsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 130);
|
|
3870
|
+
var StreamScriptEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 132);
|
|
3871
3871
|
var Browser = /* @__PURE__ */ serviceDesc(file_wrc, 0);
|
|
3872
3872
|
|
|
3873
|
-
// src/defaults.ts
|
|
3874
|
-
var DefaultWaitTimeoutMs = 3e4;
|
|
3875
|
-
var DefaultVisible = true;
|
|
3876
|
-
var DefaultSteadyMs = 500;
|
|
3877
|
-
|
|
3878
3873
|
// src/errors.ts
|
|
3879
3874
|
var BrowserScaleError = class extends Error {
|
|
3880
3875
|
constructor(message, cause) {
|
|
@@ -3883,6 +3878,19 @@ var BrowserScaleError = class extends Error {
|
|
|
3883
3878
|
this.name = "BrowserScaleError";
|
|
3884
3879
|
}
|
|
3885
3880
|
};
|
|
3881
|
+
function throwCommandError(command, error) {
|
|
3882
|
+
if (error) {
|
|
3883
|
+
throw new CommandError({ command, code: error.code, message: error.message });
|
|
3884
|
+
}
|
|
3885
|
+
}
|
|
3886
|
+
var CommandError = class extends BrowserScaleError {
|
|
3887
|
+
constructor(init) {
|
|
3888
|
+
super(formatMessage(init.command, init.code, init.message));
|
|
3889
|
+
this.name = "CommandError";
|
|
3890
|
+
this.command = init.command;
|
|
3891
|
+
this.code = init.code;
|
|
3892
|
+
}
|
|
3893
|
+
};
|
|
3886
3894
|
var ClickError = class extends BrowserScaleError {
|
|
3887
3895
|
constructor(init) {
|
|
3888
3896
|
super(formatMessage("click", init.code, init.message));
|
|
@@ -3982,9 +3990,9 @@ var Locator = class _Locator {
|
|
|
3982
3990
|
* Enforces or disables the visibility check for this Locator's wait
|
|
3983
3991
|
* condition.
|
|
3984
3992
|
*
|
|
3985
|
-
*
|
|
3986
|
-
* no effect when used as an action target — actions
|
|
3987
|
-
* visibility before dispatching.
|
|
3993
|
+
* Visibility is required by default, so pass `false` to wait for DOM
|
|
3994
|
+
* presence alone. Has no effect when used as an action target — actions
|
|
3995
|
+
* never check visibility before dispatching.
|
|
3988
3996
|
*
|
|
3989
3997
|
* @param v - true to require visibility, false to skip the check
|
|
3990
3998
|
*
|
|
@@ -4000,9 +4008,9 @@ var Locator = class _Locator {
|
|
|
4000
4008
|
* Requires the element to keep a stable position and size for at least
|
|
4001
4009
|
* `ms` milliseconds before the wait matches.
|
|
4002
4010
|
*
|
|
4003
|
-
*
|
|
4004
|
-
* for js() expressions that return a non-Element
|
|
4005
|
-
* as an action target.
|
|
4011
|
+
* Settling defaults to 500ms, so pass 0 to match the instant the element
|
|
4012
|
+
* is found. Has no effect for js() expressions that return a non-Element
|
|
4013
|
+
* value, nor when used as an action target.
|
|
4006
4014
|
*
|
|
4007
4015
|
* @param ms - steady-state duration in milliseconds; 0 disables
|
|
4008
4016
|
*
|
|
@@ -4065,19 +4073,11 @@ var Locator = class _Locator {
|
|
|
4065
4073
|
// ── Constructors (top-level functions re-export these) ──────────────
|
|
4066
4074
|
/** @internal */
|
|
4067
4075
|
static _css(selector) {
|
|
4068
|
-
return new _Locator({
|
|
4069
|
-
selector,
|
|
4070
|
-
visibleFlag: DefaultVisible,
|
|
4071
|
-
steadyMs: DefaultSteadyMs
|
|
4072
|
-
});
|
|
4076
|
+
return new _Locator({ selector });
|
|
4073
4077
|
}
|
|
4074
4078
|
/** @internal */
|
|
4075
4079
|
static _js(expression) {
|
|
4076
|
-
return new _Locator({
|
|
4077
|
-
jsExpression: expression,
|
|
4078
|
-
visibleFlag: DefaultVisible,
|
|
4079
|
-
steadyMs: DefaultSteadyMs
|
|
4080
|
-
});
|
|
4080
|
+
return new _Locator({ jsExpression: expression });
|
|
4081
4081
|
}
|
|
4082
4082
|
/** @internal */
|
|
4083
4083
|
static _node(backendNodeId) {
|
|
@@ -4260,6 +4260,7 @@ function waitConditionStatusFromProto(c) {
|
|
|
4260
4260
|
}
|
|
4261
4261
|
function unwrapWait(r) {
|
|
4262
4262
|
const res = {
|
|
4263
|
+
success: r.success,
|
|
4263
4264
|
index: r.index,
|
|
4264
4265
|
frameId: r.frameId,
|
|
4265
4266
|
backendNodeId: r.backendNodeId,
|
|
@@ -4558,8 +4559,9 @@ var NetworkCapture = class {
|
|
|
4558
4559
|
* {@link CloudBrowser.stopNetworkCapture} instead: stop awaits the reader,
|
|
4559
4560
|
* which cannot finish while the handler it called is still running.
|
|
4560
4561
|
*
|
|
4561
|
-
*
|
|
4562
|
-
*
|
|
4562
|
+
* Rejects only on a transport failure, and the local reader is shut down
|
|
4563
|
+
* regardless. Disarming a capture that is not running is a no-op rather than a
|
|
4564
|
+
* failure, so there are no error codes to branch on.
|
|
4563
4565
|
*/
|
|
4564
4566
|
async stop() {
|
|
4565
4567
|
if (this.stopped) return;
|
|
@@ -4680,7 +4682,8 @@ var ScriptRun = class {
|
|
|
4680
4682
|
*
|
|
4681
4683
|
* @returns how the script ended
|
|
4682
4684
|
*
|
|
4683
|
-
*
|
|
4685
|
+
* Rejects only on a transport failure - the connection dying, or the run being
|
|
4686
|
+
* abandoned. A script that threw is a normal outcome and arrives in the result.
|
|
4684
4687
|
*/
|
|
4685
4688
|
async wait() {
|
|
4686
4689
|
await this.endedPromise;
|
|
@@ -4698,8 +4701,8 @@ var ScriptRun = class {
|
|
|
4698
4701
|
* at its next operation in the page. Either way the handler sees a `finished`
|
|
4699
4702
|
* with `stopped` set, unless the local reader is torn down first.
|
|
4700
4703
|
*
|
|
4701
|
-
*
|
|
4702
|
-
*
|
|
4704
|
+
* Rejects only on a transport failure, and the local reader is detached
|
|
4705
|
+
* regardless. Cancelling a run that has already finished is a no-op.
|
|
4703
4706
|
*/
|
|
4704
4707
|
async stop() {
|
|
4705
4708
|
if (this.detached) return;
|
|
@@ -4874,6 +4877,14 @@ var DomMirror = class {
|
|
|
4874
4877
|
* boundary was crossed; it is a child list like any other.
|
|
4875
4878
|
*
|
|
4876
4879
|
* @param depth levels below the node, default 1
|
|
4880
|
+
*
|
|
4881
|
+
* @throws not_mirrored - the page has no mirror, or the node's frame is not
|
|
4882
|
+
* part of the one it has; after a resync, fetch the current tree before
|
|
4883
|
+
* addressing nodes again
|
|
4884
|
+
* @throws mirror_failed - the subtree could not be serialized, usually a
|
|
4885
|
+
* document that went away mid-read
|
|
4886
|
+
*
|
|
4887
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4877
4888
|
*/
|
|
4878
4889
|
async expand(node2, depth) {
|
|
4879
4890
|
if (this.stopped) return;
|
|
@@ -4899,6 +4910,13 @@ var DomMirror = class {
|
|
|
4899
4910
|
*
|
|
4900
4911
|
* Skipping this is not an error, it is a slow leak: the browser's revealed
|
|
4901
4912
|
* set only grows, and eventually it is no longer filtering anything.
|
|
4913
|
+
*
|
|
4914
|
+
* @throws not_mirrored - the page has no mirror, or the node's frame is not
|
|
4915
|
+
* part of the one it has; this is what collapsing a node from a tree that has
|
|
4916
|
+
* since been resynced looks like, so fetch the current tree and address the
|
|
4917
|
+
* node again
|
|
4918
|
+
*
|
|
4919
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4902
4920
|
*/
|
|
4903
4921
|
async collapse(node2) {
|
|
4904
4922
|
if (this.stopped) return;
|
|
@@ -4925,6 +4943,13 @@ var DomMirror = class {
|
|
|
4925
4943
|
*
|
|
4926
4944
|
* @returns the ancestor chain, the main document first, or an empty array if
|
|
4927
4945
|
* the node is not on the page
|
|
4946
|
+
*
|
|
4947
|
+
* @throws not_mirrored - the page has no mirror, or the given frame is not part
|
|
4948
|
+
* of the one it has
|
|
4949
|
+
* @throws mirror_failed - the path could not be serialized, usually a document
|
|
4950
|
+
* that went away mid-read
|
|
4951
|
+
*
|
|
4952
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4928
4953
|
*/
|
|
4929
4954
|
async reveal(backendNodeId, frameId) {
|
|
4930
4955
|
if (this.stopped) return [];
|
|
@@ -4960,6 +4985,11 @@ var DomMirror = class {
|
|
|
4960
4985
|
* Throws away the local copy of the whole page and fetches a fresh one.
|
|
4961
4986
|
* Happens automatically whenever the browser says the copy is void, so you
|
|
4962
4987
|
* rarely need to call it.
|
|
4988
|
+
*
|
|
4989
|
+
* @throws mirror_failed - the page could not be serialized, usually a document
|
|
4990
|
+
* that went away while the tree was being rebuilt. The mirror then ends
|
|
4991
|
+
*
|
|
4992
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4963
4993
|
*/
|
|
4964
4994
|
async resync(reason = "manual") {
|
|
4965
4995
|
if (this.stopped) return;
|
|
@@ -5299,7 +5329,8 @@ var CloudBrowser = class {
|
|
|
5299
5329
|
* {@link createWebSocketBrowser} the rental stays untouched; only the
|
|
5300
5330
|
* transport is closed.
|
|
5301
5331
|
*
|
|
5302
|
-
*
|
|
5332
|
+
* Rejects only when the stop API or the transport close fails. The session is
|
|
5333
|
+
* released either way; retrying a stop is safe.
|
|
5303
5334
|
*
|
|
5304
5335
|
* @example
|
|
5305
5336
|
* await browser.stopBrowser();
|
|
@@ -5324,7 +5355,9 @@ var CloudBrowser = class {
|
|
|
5324
5355
|
* @param proxyUsername - proxy auth user; empty for unauthenticated proxies
|
|
5325
5356
|
* @param proxyPassword - proxy auth password; empty for unauthenticated proxies
|
|
5326
5357
|
*
|
|
5327
|
-
*
|
|
5358
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
5359
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
5360
|
+
* are no error codes to branch on.
|
|
5328
5361
|
*
|
|
5329
5362
|
* @example
|
|
5330
5363
|
* await browser.setProxy("proxy.example.com", 8080, "user", "pass");
|
|
@@ -5340,7 +5373,8 @@ var CloudBrowser = class {
|
|
|
5340
5373
|
if (proxyUsername) req.proxyUsername = proxyUsername;
|
|
5341
5374
|
if (proxyPassword) req.proxyPassword = proxyPassword;
|
|
5342
5375
|
}
|
|
5343
|
-
await this.client.setProxy(req);
|
|
5376
|
+
const res = await this.client.setProxy(req);
|
|
5377
|
+
throwCommandError("setProxy", res.error);
|
|
5344
5378
|
}
|
|
5345
5379
|
/**
|
|
5346
5380
|
* Returns all open pages (tabs and popups) for this session's browser
|
|
@@ -5352,7 +5386,9 @@ var CloudBrowser = class {
|
|
|
5352
5386
|
*
|
|
5353
5387
|
* @returns PageInfo[] for every page currently open in the context
|
|
5354
5388
|
*
|
|
5355
|
-
*
|
|
5389
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
5390
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
5391
|
+
* are no error codes to branch on.
|
|
5356
5392
|
*
|
|
5357
5393
|
* @example
|
|
5358
5394
|
* const pages = await browser.getPages();
|
|
@@ -5365,6 +5401,7 @@ var CloudBrowser = class {
|
|
|
5365
5401
|
apiKey: this.apiKey
|
|
5366
5402
|
})
|
|
5367
5403
|
);
|
|
5404
|
+
throwCommandError("getPages", resp.error);
|
|
5368
5405
|
return resp.pages.map(pageInfoFromProto);
|
|
5369
5406
|
}
|
|
5370
5407
|
// ──────────────────────────────────────────────────────────────────
|
|
@@ -5383,7 +5420,16 @@ var CloudBrowser = class {
|
|
|
5383
5420
|
* @returns NavigateResult with the final resolved URL and the frameId
|
|
5384
5421
|
* of the main frame after navigation
|
|
5385
5422
|
*
|
|
5386
|
-
* @throws
|
|
5423
|
+
* @throws timeout - nothing committed before the deadline; the page may still
|
|
5424
|
+
* be loading, so a longer timeout can be the whole fix
|
|
5425
|
+
* @throws net_error - the URL never loaded: DNS, TLS, a refused connection, or
|
|
5426
|
+
* a proxy that could not reach it. The message carries the underlying net
|
|
5427
|
+
* error name, which is what separates a bad proxy from a bad host - worth
|
|
5428
|
+
* logging, since the two need different fixes
|
|
5429
|
+
* @throws crashed - the renderer died mid-navigation; the page is unusable and
|
|
5430
|
+
* has to be navigated again
|
|
5431
|
+
*
|
|
5432
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
5387
5433
|
*
|
|
5388
5434
|
* @example
|
|
5389
5435
|
* await browser.navigate("https://example.com");
|
|
@@ -5396,6 +5442,7 @@ var CloudBrowser = class {
|
|
|
5396
5442
|
});
|
|
5397
5443
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
5398
5444
|
const resp = await this.client.navigate(req);
|
|
5445
|
+
throwCommandError("navigate", resp.error);
|
|
5399
5446
|
return { frameId: resp.frameId, url: resp.url };
|
|
5400
5447
|
}
|
|
5401
5448
|
/**
|
|
@@ -5410,7 +5457,11 @@ var CloudBrowser = class {
|
|
|
5410
5457
|
* @param html - response body to serve
|
|
5411
5458
|
* @param opts - optional headers and statusCode (default 200)
|
|
5412
5459
|
*
|
|
5413
|
-
* @throws
|
|
5460
|
+
* @throws timeout - the page never requested the URL, so the prepared
|
|
5461
|
+
* response had nobody to hand it to; usually the navigation was cancelled
|
|
5462
|
+
* or redirected away before reaching it
|
|
5463
|
+
*
|
|
5464
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
5414
5465
|
*
|
|
5415
5466
|
* @example
|
|
5416
5467
|
* await browser.loadHTML("https://example.com", "<h1>hi</h1>");
|
|
@@ -5425,7 +5476,8 @@ var CloudBrowser = class {
|
|
|
5425
5476
|
headers: headersToProto(opts?.headers)
|
|
5426
5477
|
});
|
|
5427
5478
|
if (opts?.statusCode) req.statusCode = opts.statusCode;
|
|
5428
|
-
await this.client.loadHTML(req);
|
|
5479
|
+
const res = await this.client.loadHTML(req);
|
|
5480
|
+
throwCommandError("loadHTML", res.error);
|
|
5429
5481
|
}
|
|
5430
5482
|
// ──────────────────────────────────────────────────────────────────
|
|
5431
5483
|
// Evaluation
|
|
@@ -5442,16 +5494,34 @@ var CloudBrowser = class {
|
|
|
5442
5494
|
* The generic T is a TypeScript hint only — there is no runtime
|
|
5443
5495
|
* validation that the JS expression actually returned that type.
|
|
5444
5496
|
*
|
|
5497
|
+
* A falsy answer and a broken expression are different outcomes. Returning
|
|
5498
|
+
* null, false or undefined is a successful evaluation and resolves normally;
|
|
5499
|
+
* an expression that throws or will not compile rejects with a
|
|
5500
|
+
* {@link CommandError}, so a typo can never read as "the page says null".
|
|
5501
|
+
*
|
|
5445
5502
|
* @param expression - JavaScript expression evaluated in the main frame
|
|
5446
5503
|
*
|
|
5447
5504
|
* @returns EvaluateResult with either value (non-Element) or element
|
|
5448
5505
|
* metadata (Element)
|
|
5449
5506
|
*
|
|
5450
|
-
* @throws
|
|
5507
|
+
* @throws {@link CommandError} - code `"threw"` (the expression raised; the
|
|
5508
|
+
* message carries the exception text), `"not_run"` (it could not be
|
|
5509
|
+
* compiled, or execution never started), `"aborted"` (the browser stopped
|
|
5510
|
+
* execution) or `"no_context"` (the frame had no live script context)
|
|
5451
5511
|
*
|
|
5452
5512
|
* @example
|
|
5453
5513
|
* const res = await browser.evaluate<string>("document.title");
|
|
5454
5514
|
* console.log(res.value);
|
|
5515
|
+
*
|
|
5516
|
+
* @example
|
|
5517
|
+
* // Telling a false answer from a broken expression.
|
|
5518
|
+
* try {
|
|
5519
|
+
* const res = await browser.evaluate<boolean>("window.__ready === true");
|
|
5520
|
+
* if (!res.value) { /* legitimately not ready yet *\/ }
|
|
5521
|
+
* } catch (e) {
|
|
5522
|
+
* if (e instanceof CommandError) throw new Error(`expression broken: ${e.message}`);
|
|
5523
|
+
* throw e;
|
|
5524
|
+
* }
|
|
5455
5525
|
*/
|
|
5456
5526
|
async evaluate(expression) {
|
|
5457
5527
|
return this._evaluate("", expression);
|
|
@@ -5483,6 +5553,13 @@ var CloudBrowser = class {
|
|
|
5483
5553
|
});
|
|
5484
5554
|
if (frameId) req.frameId = frameId;
|
|
5485
5555
|
const resp = await this.client.evaluate(req);
|
|
5556
|
+
if (resp.error) {
|
|
5557
|
+
throw new CommandError({
|
|
5558
|
+
command: "evaluate",
|
|
5559
|
+
code: resp.error.code,
|
|
5560
|
+
message: resp.error.message
|
|
5561
|
+
});
|
|
5562
|
+
}
|
|
5486
5563
|
let value = null;
|
|
5487
5564
|
if (resp.result !== "") {
|
|
5488
5565
|
try {
|
|
@@ -5492,6 +5569,7 @@ var CloudBrowser = class {
|
|
|
5492
5569
|
}
|
|
5493
5570
|
}
|
|
5494
5571
|
return {
|
|
5572
|
+
success: resp.success,
|
|
5495
5573
|
value,
|
|
5496
5574
|
backendNodeId: resp.backendNodeId,
|
|
5497
5575
|
isVisible: resp.isVisible,
|
|
@@ -5579,7 +5657,8 @@ var CloudBrowser = class {
|
|
|
5579
5657
|
sessionId: this.sessionId,
|
|
5580
5658
|
apiKey: this.apiKey,
|
|
5581
5659
|
conditions: pbConds,
|
|
5582
|
-
|
|
5660
|
+
// Left unset unless the caller passed one, so the API applies its default.
|
|
5661
|
+
timeout: opts?.timeoutMs
|
|
5583
5662
|
});
|
|
5584
5663
|
if (frameId) req.frameId = frameId;
|
|
5585
5664
|
return unwrapWait(await this.client.waitForAny(req));
|
|
@@ -5893,7 +5972,9 @@ var CloudBrowser = class {
|
|
|
5893
5972
|
* @returns DOMResult with the JSON string in `.dom` (the `.hash` field
|
|
5894
5973
|
* is populated by {@link getDOMHash}, not by this call)
|
|
5895
5974
|
*
|
|
5896
|
-
*
|
|
5975
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
5976
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
5977
|
+
* are no error codes to branch on.
|
|
5897
5978
|
*
|
|
5898
5979
|
* @example
|
|
5899
5980
|
* const { dom } = await browser.getDOM();
|
|
@@ -5906,6 +5987,7 @@ var CloudBrowser = class {
|
|
|
5906
5987
|
if (frameId) req.frameId = frameId;
|
|
5907
5988
|
if (opts?.depth !== void 0) req.depth = opts.depth;
|
|
5908
5989
|
const resp = await this.client.getDOM(req);
|
|
5990
|
+
throwCommandError("getDOM", resp.error);
|
|
5909
5991
|
return { hash: "", dom: resp.dom };
|
|
5910
5992
|
}
|
|
5911
5993
|
/**
|
|
@@ -5920,7 +6002,9 @@ var CloudBrowser = class {
|
|
|
5920
6002
|
*
|
|
5921
6003
|
* @returns 16-char hex string (the first 8 bytes of sha256 of the DOM JSON)
|
|
5922
6004
|
*
|
|
5923
|
-
*
|
|
6005
|
+
* Rejects only on a transport failure. The hash is computed from a serialized
|
|
6006
|
+
* tree, so there is no semantic failure of its own and no error codes to branch
|
|
6007
|
+
* on.
|
|
5924
6008
|
*
|
|
5925
6009
|
* @example
|
|
5926
6010
|
* const hash = await browser.getDOMHash();
|
|
@@ -5968,7 +6052,11 @@ var CloudBrowser = class {
|
|
|
5968
6052
|
*
|
|
5969
6053
|
* @returns the observation in the requested format, ready to hand to a model
|
|
5970
6054
|
*
|
|
5971
|
-
* @throws
|
|
6055
|
+
* @throws not_found - the requested scope root is not on the page, so there
|
|
6056
|
+
* was nothing to observe. Distinct from an observation that comes back
|
|
6057
|
+
* empty, which means the scope exists and holds nothing worth reporting
|
|
6058
|
+
*
|
|
6059
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
5972
6060
|
*
|
|
5973
6061
|
* @example
|
|
5974
6062
|
* const obs = await browser.getObservation();
|
|
@@ -5992,6 +6080,7 @@ var CloudBrowser = class {
|
|
|
5992
6080
|
if (opts?.jsExpression !== void 0) req.jsExpression = opts.jsExpression;
|
|
5993
6081
|
if (opts?.frameId !== void 0) req.frameId = opts.frameId;
|
|
5994
6082
|
const resp = await this.client.getObservation(req);
|
|
6083
|
+
throwCommandError("getObservation", resp.error);
|
|
5995
6084
|
return resp.observation;
|
|
5996
6085
|
}
|
|
5997
6086
|
/**
|
|
@@ -6008,7 +6097,11 @@ var CloudBrowser = class {
|
|
|
6008
6097
|
* @returns ScreenshotResult with the base64 image in `dataBase64` and the
|
|
6009
6098
|
* physical pixel `width`/`height`
|
|
6010
6099
|
*
|
|
6011
|
-
* @throws
|
|
6100
|
+
* @throws capture_failed - the page had no frame to copy. A page that has not
|
|
6101
|
+
* produced one yet, or is not being composited at the moment, has nothing to
|
|
6102
|
+
* hand over; retrying after it renders usually works
|
|
6103
|
+
*
|
|
6104
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6012
6105
|
*
|
|
6013
6106
|
* @example
|
|
6014
6107
|
* const shot = await browser.screenshot({ format: "png" });
|
|
@@ -6022,6 +6115,7 @@ var CloudBrowser = class {
|
|
|
6022
6115
|
if (opts?.format !== void 0) req.format = opts.format;
|
|
6023
6116
|
if (opts?.quality !== void 0) req.quality = opts.quality;
|
|
6024
6117
|
const resp = await this.client.screenshot(req);
|
|
6118
|
+
throwCommandError("screenshot", resp.error);
|
|
6025
6119
|
return {
|
|
6026
6120
|
dataBase64: resp.dataBase64,
|
|
6027
6121
|
width: resp.width,
|
|
@@ -6045,11 +6139,15 @@ var CloudBrowser = class {
|
|
|
6045
6139
|
* canvas `width`/`height`, resolved `frameId`/`backendNodeId` and the
|
|
6046
6140
|
* `originClean` flag
|
|
6047
6141
|
*
|
|
6048
|
-
* @throws
|
|
6049
|
-
* @throws
|
|
6050
|
-
* @throws
|
|
6051
|
-
*
|
|
6052
|
-
*
|
|
6142
|
+
* @throws not_found - no element matched the locator
|
|
6143
|
+
* @throws not_element - the expression was truthy but did not yield an element
|
|
6144
|
+
* @throws not_readable - the target was found but is not a readable canvas
|
|
6145
|
+
*
|
|
6146
|
+
* A target that is empty, uses `at(x, y)` or names several things at once is
|
|
6147
|
+
* rejected before anything is sent. A closed page or a frame that is gone is a
|
|
6148
|
+
* transport failure rather than a code.
|
|
6149
|
+
*
|
|
6150
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6053
6151
|
*
|
|
6054
6152
|
* @example
|
|
6055
6153
|
* const res = await browser.readCanvas(css("#game canvas"));
|
|
@@ -6077,6 +6175,7 @@ var CloudBrowser = class {
|
|
|
6077
6175
|
req.sh = opts.sh;
|
|
6078
6176
|
}
|
|
6079
6177
|
const resp = await this.client.readCanvas(req);
|
|
6178
|
+
throwCommandError("readCanvas", resp.error);
|
|
6080
6179
|
return {
|
|
6081
6180
|
success: resp.success,
|
|
6082
6181
|
frameId: resp.frameId,
|
|
@@ -6100,7 +6199,9 @@ var CloudBrowser = class {
|
|
|
6100
6199
|
*
|
|
6101
6200
|
* @param patterns - URL wildcards to block; empty array clears the list
|
|
6102
6201
|
*
|
|
6103
|
-
*
|
|
6202
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6203
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6204
|
+
* are no error codes to branch on.
|
|
6104
6205
|
*
|
|
6105
6206
|
* @example
|
|
6106
6207
|
* await browser.setBlockList([
|
|
@@ -6109,13 +6210,14 @@ var CloudBrowser = class {
|
|
|
6109
6210
|
* ]);
|
|
6110
6211
|
*/
|
|
6111
6212
|
async setBlockList(patterns) {
|
|
6112
|
-
await this.client.setBlockList(
|
|
6213
|
+
const res = await this.client.setBlockList(
|
|
6113
6214
|
create(SetBlockListRequestSchema, {
|
|
6114
6215
|
sessionId: this.sessionId,
|
|
6115
6216
|
apiKey: this.apiKey,
|
|
6116
6217
|
patterns
|
|
6117
6218
|
})
|
|
6118
6219
|
);
|
|
6220
|
+
throwCommandError("setBlockList", res.error);
|
|
6119
6221
|
}
|
|
6120
6222
|
/**
|
|
6121
6223
|
* Configures the session to serve cached static responses for requests
|
|
@@ -6129,13 +6231,15 @@ var CloudBrowser = class {
|
|
|
6129
6231
|
* @param blobName - server-side identifier of the snapshot to serve from
|
|
6130
6232
|
* @param patterns - URL wildcards to redirect to the cache; empty disables
|
|
6131
6233
|
*
|
|
6132
|
-
*
|
|
6234
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6235
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6236
|
+
* are no error codes to branch on.
|
|
6133
6237
|
*
|
|
6134
6238
|
* @example
|
|
6135
6239
|
* await browser.setStaticPaths("snap-2026-05", ["*.example.com/*"]);
|
|
6136
6240
|
*/
|
|
6137
6241
|
async setStaticPaths(blobName, patterns) {
|
|
6138
|
-
await this.client.setStaticPaths(
|
|
6242
|
+
const res = await this.client.setStaticPaths(
|
|
6139
6243
|
create(SetStaticPathsRequestSchema, {
|
|
6140
6244
|
sessionId: this.sessionId,
|
|
6141
6245
|
apiKey: this.apiKey,
|
|
@@ -6143,6 +6247,7 @@ var CloudBrowser = class {
|
|
|
6143
6247
|
patterns
|
|
6144
6248
|
})
|
|
6145
6249
|
);
|
|
6250
|
+
throwCommandError("setStaticPaths", res.error);
|
|
6146
6251
|
}
|
|
6147
6252
|
/**
|
|
6148
6253
|
* Blocks until the next request whose URL matches one of the supplied
|
|
@@ -6159,7 +6264,12 @@ var CloudBrowser = class {
|
|
|
6159
6264
|
* (the captured method/URL/headers/body; null if intercepted with
|
|
6160
6265
|
* no body)
|
|
6161
6266
|
*
|
|
6162
|
-
* @throws
|
|
6267
|
+
* @throws timeout - no request matched any pattern before the deadline.
|
|
6268
|
+
* Nothing occurring is an answer, and it stays distinguishable from a
|
|
6269
|
+
* connection that died on the way. Supplying no patterns is a caller mistake
|
|
6270
|
+
* rather than an outcome, and rejects separately
|
|
6271
|
+
*
|
|
6272
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6163
6273
|
*
|
|
6164
6274
|
* @example
|
|
6165
6275
|
* const { index, request } = await browser.waitForAnyRequest(
|
|
@@ -6181,6 +6291,7 @@ var CloudBrowser = class {
|
|
|
6181
6291
|
});
|
|
6182
6292
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
6183
6293
|
const resp = await this.client.waitForAnyRequest(req);
|
|
6294
|
+
throwCommandError("waitForAnyRequest", resp.error);
|
|
6184
6295
|
return {
|
|
6185
6296
|
index: resp.index,
|
|
6186
6297
|
request: interceptedRequestFromProto(resp.request)
|
|
@@ -6199,6 +6310,13 @@ var CloudBrowser = class {
|
|
|
6199
6310
|
* @returns object with `index` (matched pattern index) and `response`
|
|
6200
6311
|
* (the captured status/headers/body; null if no body was returned)
|
|
6201
6312
|
*
|
|
6313
|
+
* @throws timeout - no response matched any pattern before the deadline.
|
|
6314
|
+
* Nothing occurring is an answer, and it stays distinguishable from a
|
|
6315
|
+
* connection that died on the way. Supplying no patterns is a caller mistake
|
|
6316
|
+
* rather than an outcome, and rejects separately
|
|
6317
|
+
*
|
|
6318
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6319
|
+
*
|
|
6202
6320
|
* @example
|
|
6203
6321
|
* const { index, response } = await browser.waitForAnyResponse(
|
|
6204
6322
|
* [{ url: "*\/api/login" }],
|
|
@@ -6219,6 +6337,7 @@ var CloudBrowser = class {
|
|
|
6219
6337
|
});
|
|
6220
6338
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
6221
6339
|
const resp = await this.client.waitForAnyResponse(req);
|
|
6340
|
+
throwCommandError("waitForAnyResponse", resp.error);
|
|
6222
6341
|
return {
|
|
6223
6342
|
index: resp.index,
|
|
6224
6343
|
response: interceptedResponseFromProto(resp.response)
|
|
@@ -6240,7 +6359,10 @@ var CloudBrowser = class {
|
|
|
6240
6359
|
* were actually sent on the wire after modifications were applied;
|
|
6241
6360
|
* null when no request payload was reported
|
|
6242
6361
|
*
|
|
6243
|
-
* @throws
|
|
6362
|
+
* @throws timeout - no matching request appeared before the deadline, so
|
|
6363
|
+
* nothing was modified
|
|
6364
|
+
*
|
|
6365
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6244
6366
|
*
|
|
6245
6367
|
* @example
|
|
6246
6368
|
* const req = await browser.modifyRequest("*\/api/me", {
|
|
@@ -6262,6 +6384,7 @@ var CloudBrowser = class {
|
|
|
6262
6384
|
if (opts?.body) req.body = opts.body;
|
|
6263
6385
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
6264
6386
|
const resp = await this.client.modifyRequest(req);
|
|
6387
|
+
throwCommandError("modifyRequest", resp.error);
|
|
6265
6388
|
return interceptedRequestFromProto(resp.request);
|
|
6266
6389
|
}
|
|
6267
6390
|
// ──────────────────────────────────────────────────────────────────
|
|
@@ -6291,7 +6414,9 @@ var CloudBrowser = class {
|
|
|
6291
6414
|
* @returns NetworkCapture handle for stopping the capture and inspecting how
|
|
6292
6415
|
* it ended
|
|
6293
6416
|
*
|
|
6294
|
-
*
|
|
6417
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6418
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6419
|
+
* are no error codes to branch on.
|
|
6295
6420
|
*
|
|
6296
6421
|
* @example
|
|
6297
6422
|
* const capture = await browser.captureNetwork(
|
|
@@ -6325,10 +6450,12 @@ var CloudBrowser = class {
|
|
|
6325
6450
|
*
|
|
6326
6451
|
* @param opts - which requests to capture and whether to keep bodies
|
|
6327
6452
|
*
|
|
6328
|
-
*
|
|
6453
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6454
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6455
|
+
* are no error codes to branch on.
|
|
6329
6456
|
*/
|
|
6330
6457
|
async startNetworkCapture(opts) {
|
|
6331
|
-
await this.client.startNetworkCapture(
|
|
6458
|
+
const res = await this.client.startNetworkCapture(
|
|
6332
6459
|
create(StartNetworkCaptureRequestSchema, {
|
|
6333
6460
|
sessionId: this.sessionId,
|
|
6334
6461
|
apiKey: this.apiKey,
|
|
@@ -6337,13 +6464,15 @@ var CloudBrowser = class {
|
|
|
6337
6464
|
bodyPatterns: opts.bodyPatterns ?? []
|
|
6338
6465
|
})
|
|
6339
6466
|
);
|
|
6467
|
+
throwCommandError("startNetworkCapture", res.error);
|
|
6340
6468
|
}
|
|
6341
6469
|
/**
|
|
6342
6470
|
* Disarms the session's capture.
|
|
6343
6471
|
*
|
|
6344
6472
|
* @returns whether a capture was running
|
|
6345
6473
|
*
|
|
6346
|
-
*
|
|
6474
|
+
* Rejects only on a transport failure. Stopping a capture that is not running
|
|
6475
|
+
* is a no-op rather than a failure, so there are no error codes to branch on.
|
|
6347
6476
|
*/
|
|
6348
6477
|
async stopNetworkCapture() {
|
|
6349
6478
|
const resp = await this.client.stopNetworkCapture(
|
|
@@ -6352,6 +6481,7 @@ var CloudBrowser = class {
|
|
|
6352
6481
|
apiKey: this.apiKey
|
|
6353
6482
|
})
|
|
6354
6483
|
);
|
|
6484
|
+
throwCommandError("stopNetworkCapture", resp.error);
|
|
6355
6485
|
return resp.stopped;
|
|
6356
6486
|
}
|
|
6357
6487
|
/**
|
|
@@ -6368,7 +6498,8 @@ var CloudBrowser = class {
|
|
|
6368
6498
|
* @returns NetworkCapture attached to whatever capture is running; onExchange
|
|
6369
6499
|
* simply never fires when none is
|
|
6370
6500
|
*
|
|
6371
|
-
*
|
|
6501
|
+
* Rejects only on a transport failure: opening the subscription has no semantic
|
|
6502
|
+
* failure of its own.
|
|
6372
6503
|
*/
|
|
6373
6504
|
async streamNetworkExchanges(onExchange) {
|
|
6374
6505
|
return this.subscribeNetworkExchanges(onExchange);
|
|
@@ -6454,7 +6585,10 @@ var CloudBrowser = class {
|
|
|
6454
6585
|
* @param onResync called when the copy had to be rebuilt, after the new tree
|
|
6455
6586
|
* is in place. Rebuilding is automatic; this is for telling the user why
|
|
6456
6587
|
* their expanded nodes collapsed.
|
|
6457
|
-
* @throws
|
|
6588
|
+
* @throws mirror_failed - the page could not be serialized, usually a document
|
|
6589
|
+
* that went away while the tree was being built. No mirror is left running
|
|
6590
|
+
*
|
|
6591
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6458
6592
|
*/
|
|
6459
6593
|
async mirrorDom(opts, onChange, onResync) {
|
|
6460
6594
|
const abort = new AbortController();
|
|
@@ -6504,6 +6638,11 @@ var CloudBrowser = class {
|
|
|
6504
6638
|
* Starts (or restarts) the page's mirror and returns the main document,
|
|
6505
6639
|
* without subscribing to changes. {@link CloudBrowser.mirrorDom} is what you
|
|
6506
6640
|
* normally want; this is the raw command.
|
|
6641
|
+
*
|
|
6642
|
+
* @throws mirror_failed - the page could not be serialized, usually a document
|
|
6643
|
+
* that went away while the tree was being built. No mirror is left running
|
|
6644
|
+
*
|
|
6645
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6507
6646
|
*/
|
|
6508
6647
|
async startDomMirror(opts = {}) {
|
|
6509
6648
|
const req = create(StartDomMirrorRequestSchema, {
|
|
@@ -6513,6 +6652,7 @@ var CloudBrowser = class {
|
|
|
6513
6652
|
if (opts.depth !== void 0) req.depth = opts.depth;
|
|
6514
6653
|
if (opts.pierce !== void 0) req.pierce = opts.pierce;
|
|
6515
6654
|
const resp = await this.client.startDomMirror(req);
|
|
6655
|
+
throwCommandError("startDomMirror", resp.error);
|
|
6516
6656
|
return {
|
|
6517
6657
|
root: resp.root,
|
|
6518
6658
|
frameId: resp.frameId,
|
|
@@ -6521,12 +6661,13 @@ var CloudBrowser = class {
|
|
|
6521
6661
|
}
|
|
6522
6662
|
/** Stops the page's mirror, every frame of it. Idempotent. */
|
|
6523
6663
|
async stopDomMirror() {
|
|
6524
|
-
await this.client.stopDomMirror(
|
|
6664
|
+
const res = await this.client.stopDomMirror(
|
|
6525
6665
|
create(StopDomMirrorRequestSchema, {
|
|
6526
6666
|
sessionId: this.sessionId,
|
|
6527
6667
|
apiKey: this.apiKey
|
|
6528
6668
|
})
|
|
6529
6669
|
);
|
|
6670
|
+
throwCommandError("stopDomMirror", res.error);
|
|
6530
6671
|
}
|
|
6531
6672
|
/**
|
|
6532
6673
|
* Fetches a node's children and starts reporting changes inside them.
|
|
@@ -6534,6 +6675,17 @@ var CloudBrowser = class {
|
|
|
6534
6675
|
*
|
|
6535
6676
|
* On an `<iframe>` the one child is the document it hosts, and this call is
|
|
6536
6677
|
* what starts mirroring that frame.
|
|
6678
|
+
*
|
|
6679
|
+
* An id that is simply unknown is not a failure: the call resolves with an
|
|
6680
|
+
* empty result.
|
|
6681
|
+
*
|
|
6682
|
+
* @throws not_mirrored - the page has no mirror, or frameId is not part of the
|
|
6683
|
+
* one it has; start a mirror first, and after a resync fetch the current tree
|
|
6684
|
+
* before addressing nodes again
|
|
6685
|
+
* @throws mirror_failed - the subtree could not be serialized, usually a
|
|
6686
|
+
* document that went away mid-read
|
|
6687
|
+
*
|
|
6688
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6537
6689
|
*/
|
|
6538
6690
|
async getDomChildren(backendNodeId, frameId = "", depth) {
|
|
6539
6691
|
const req = create(GetDomChildrenRequestSchema, {
|
|
@@ -6544,11 +6696,19 @@ var CloudBrowser = class {
|
|
|
6544
6696
|
if (frameId) req.frameId = frameId;
|
|
6545
6697
|
if (depth !== void 0) req.depth = depth;
|
|
6546
6698
|
const resp = await this.client.getDomChildren(req);
|
|
6699
|
+
throwCommandError("getDomChildren", resp.error);
|
|
6547
6700
|
return { children: resp.children, seq: Number(resp.seq) };
|
|
6548
6701
|
}
|
|
6549
6702
|
/**
|
|
6550
6703
|
* Stops reporting changes inside a node, and inside any frame below it.
|
|
6551
6704
|
* {@link DomMirror.collapse} calls this.
|
|
6705
|
+
*
|
|
6706
|
+
* @throws not_mirrored - the page has no mirror, or frameId is not part of
|
|
6707
|
+
* the one it has; this is what replaying ids from a tree that has since
|
|
6708
|
+
* been resynced looks like, so fetch the current tree and address the node
|
|
6709
|
+
* again
|
|
6710
|
+
*
|
|
6711
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6552
6712
|
*/
|
|
6553
6713
|
async releaseDomSubtree(backendNodeId, frameId = "") {
|
|
6554
6714
|
const req = create(ReleaseDomSubtreeRequestSchema, {
|
|
@@ -6557,13 +6717,24 @@ var CloudBrowser = class {
|
|
|
6557
6717
|
backendNodeId
|
|
6558
6718
|
});
|
|
6559
6719
|
if (frameId) req.frameId = frameId;
|
|
6560
|
-
await this.client.releaseDomSubtree(req);
|
|
6720
|
+
const res = await this.client.releaseDomSubtree(req);
|
|
6721
|
+
throwCommandError("releaseDomSubtree", res.error);
|
|
6561
6722
|
}
|
|
6562
6723
|
/**
|
|
6563
6724
|
* Returns the chain from the main document down to a node, each ancestor
|
|
6564
6725
|
* with its own children, crossing into frames where it has to and starting
|
|
6565
6726
|
* the ones it passes through. {@link DomMirror.reveal} calls this and
|
|
6566
6727
|
* splices it in.
|
|
6728
|
+
*
|
|
6729
|
+
* An id that is simply unknown is not a failure: the call resolves with an
|
|
6730
|
+
* empty result.
|
|
6731
|
+
*
|
|
6732
|
+
* @throws not_mirrored - the page has no mirror, or frameId is not part of the
|
|
6733
|
+
* one it has
|
|
6734
|
+
* @throws mirror_failed - the path could not be serialized, usually a document
|
|
6735
|
+
* that went away mid-read
|
|
6736
|
+
*
|
|
6737
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6567
6738
|
*/
|
|
6568
6739
|
async revealDomNode(backendNodeId, frameId = "") {
|
|
6569
6740
|
const req = create(RevealDomNodeRequestSchema, {
|
|
@@ -6573,6 +6744,7 @@ var CloudBrowser = class {
|
|
|
6573
6744
|
});
|
|
6574
6745
|
if (frameId) req.frameId = frameId;
|
|
6575
6746
|
const resp = await this.client.revealDomNode(req);
|
|
6747
|
+
throwCommandError("revealDomNode", resp.error);
|
|
6576
6748
|
return { path: resp.path, seq: Number(resp.seq) };
|
|
6577
6749
|
}
|
|
6578
6750
|
/**
|
|
@@ -6584,6 +6756,10 @@ var CloudBrowser = class {
|
|
|
6584
6756
|
* whole tree just to hash it. The two answer different questions: a hash
|
|
6585
6757
|
* compares content, a revision only says whether this document moved since
|
|
6586
6758
|
* you last asked.
|
|
6759
|
+
*
|
|
6760
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6761
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6762
|
+
* are no error codes to branch on.
|
|
6587
6763
|
*/
|
|
6588
6764
|
async getDomRevision(frameId = "") {
|
|
6589
6765
|
const req = create(GetDomRevisionRequestSchema, {
|
|
@@ -6592,6 +6768,7 @@ var CloudBrowser = class {
|
|
|
6592
6768
|
});
|
|
6593
6769
|
if (frameId) req.frameId = frameId;
|
|
6594
6770
|
const resp = await this.client.getDomRevision(req);
|
|
6771
|
+
throwCommandError("getDomRevision", resp.error);
|
|
6595
6772
|
return Number(resp.revision);
|
|
6596
6773
|
}
|
|
6597
6774
|
// ──────────────────────────────────────────────────────────────────
|
|
@@ -6602,7 +6779,9 @@ var CloudBrowser = class {
|
|
|
6602
6779
|
*
|
|
6603
6780
|
* @returns CookieParam[], one per cookie in the context
|
|
6604
6781
|
*
|
|
6605
|
-
*
|
|
6782
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6783
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6784
|
+
* are no error codes to branch on.
|
|
6606
6785
|
*
|
|
6607
6786
|
* @example
|
|
6608
6787
|
* const cookies = await browser.getCookies();
|
|
@@ -6615,6 +6794,7 @@ var CloudBrowser = class {
|
|
|
6615
6794
|
apiKey: this.apiKey
|
|
6616
6795
|
})
|
|
6617
6796
|
);
|
|
6797
|
+
throwCommandError("getCookies", resp.error);
|
|
6618
6798
|
return resp.cookies.map(cookieParamFromProto);
|
|
6619
6799
|
}
|
|
6620
6800
|
/**
|
|
@@ -6625,7 +6805,9 @@ var CloudBrowser = class {
|
|
|
6625
6805
|
*
|
|
6626
6806
|
* @param cookies - cookies to write; empty array is a no-op
|
|
6627
6807
|
*
|
|
6628
|
-
*
|
|
6808
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6809
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6810
|
+
* are no error codes to branch on.
|
|
6629
6811
|
*
|
|
6630
6812
|
* @example
|
|
6631
6813
|
* await browser.setCookies([
|
|
@@ -6633,29 +6815,33 @@ var CloudBrowser = class {
|
|
|
6633
6815
|
* ]);
|
|
6634
6816
|
*/
|
|
6635
6817
|
async setCookies(cookies) {
|
|
6636
|
-
await this.client.setCookies(
|
|
6818
|
+
const res = await this.client.setCookies(
|
|
6637
6819
|
create(SetCookiesRequestSchema, {
|
|
6638
6820
|
sessionId: this.sessionId,
|
|
6639
6821
|
apiKey: this.apiKey,
|
|
6640
6822
|
cookies: cookieParamsToProto(cookies)
|
|
6641
6823
|
})
|
|
6642
6824
|
);
|
|
6825
|
+
throwCommandError("setCookies", res.error);
|
|
6643
6826
|
}
|
|
6644
6827
|
/**
|
|
6645
6828
|
* Deletes every cookie in the browser context.
|
|
6646
6829
|
*
|
|
6647
|
-
*
|
|
6830
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6831
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6832
|
+
* are no error codes to branch on.
|
|
6648
6833
|
*
|
|
6649
6834
|
* @example
|
|
6650
6835
|
* await browser.clearCookies();
|
|
6651
6836
|
*/
|
|
6652
6837
|
async clearCookies() {
|
|
6653
|
-
await this.client.clearCookies(
|
|
6838
|
+
const res = await this.client.clearCookies(
|
|
6654
6839
|
create(ClearCookiesRequestSchema, {
|
|
6655
6840
|
sessionId: this.sessionId,
|
|
6656
6841
|
apiKey: this.apiKey
|
|
6657
6842
|
})
|
|
6658
6843
|
);
|
|
6844
|
+
throwCommandError("clearCookies", res.error);
|
|
6659
6845
|
}
|
|
6660
6846
|
// ──────────────────────────────────────────────────────────────────
|
|
6661
6847
|
// Storage (localStorage)
|
|
@@ -6673,7 +6859,9 @@ var CloudBrowser = class {
|
|
|
6673
6859
|
*
|
|
6674
6860
|
* @returns StorageOriginEntry[], one per origin with localStorage data
|
|
6675
6861
|
*
|
|
6676
|
-
*
|
|
6862
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6863
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6864
|
+
* are no error codes to branch on.
|
|
6677
6865
|
*
|
|
6678
6866
|
* @example
|
|
6679
6867
|
* const storage = await browser.getStorage();
|
|
@@ -6688,6 +6876,7 @@ var CloudBrowser = class {
|
|
|
6688
6876
|
});
|
|
6689
6877
|
if (origin) req.origin = origin;
|
|
6690
6878
|
const resp = await this.client.getStorage(req);
|
|
6879
|
+
throwCommandError("getStorage", resp.error);
|
|
6691
6880
|
return resp.storage.map(storageEntryFromProto);
|
|
6692
6881
|
}
|
|
6693
6882
|
/**
|
|
@@ -6701,7 +6890,9 @@ var CloudBrowser = class {
|
|
|
6701
6890
|
*
|
|
6702
6891
|
* @param storage - entries to write, grouped by origin
|
|
6703
6892
|
*
|
|
6704
|
-
*
|
|
6893
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6894
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6895
|
+
* are no error codes to branch on.
|
|
6705
6896
|
*
|
|
6706
6897
|
* @example
|
|
6707
6898
|
* await browser.setStorage([
|
|
@@ -6715,13 +6906,14 @@ var CloudBrowser = class {
|
|
|
6715
6906
|
* ]);
|
|
6716
6907
|
*/
|
|
6717
6908
|
async setStorage(storage) {
|
|
6718
|
-
await this.client.setStorage(
|
|
6909
|
+
const res = await this.client.setStorage(
|
|
6719
6910
|
create(SetStorageRequestSchema, {
|
|
6720
6911
|
sessionId: this.sessionId,
|
|
6721
6912
|
apiKey: this.apiKey,
|
|
6722
6913
|
storage: storageEntriesToProto(storage)
|
|
6723
6914
|
})
|
|
6724
6915
|
);
|
|
6916
|
+
throwCommandError("setStorage", res.error);
|
|
6725
6917
|
}
|
|
6726
6918
|
/**
|
|
6727
6919
|
* Deletes localStorage in the browser context.
|
|
@@ -6729,7 +6921,9 @@ var CloudBrowser = class {
|
|
|
6729
6921
|
* @param origin - if set, only this origin's storage is deleted
|
|
6730
6922
|
* (e.g. "https://example.com"); omit to delete all origins
|
|
6731
6923
|
*
|
|
6732
|
-
*
|
|
6924
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6925
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6926
|
+
* are no error codes to branch on.
|
|
6733
6927
|
*
|
|
6734
6928
|
* @example
|
|
6735
6929
|
* // Wipe one origin.
|
|
@@ -6744,7 +6938,8 @@ var CloudBrowser = class {
|
|
|
6744
6938
|
apiKey: this.apiKey
|
|
6745
6939
|
});
|
|
6746
6940
|
if (origin) req.origin = origin;
|
|
6747
|
-
await this.client.clearStorage(req);
|
|
6941
|
+
const res = await this.client.clearStorage(req);
|
|
6942
|
+
throwCommandError("clearStorage", res.error);
|
|
6748
6943
|
}
|
|
6749
6944
|
// ──────────────────────────────────────────────────────────────────
|
|
6750
6945
|
// Auth / DBSC (portable signed-in persona)
|
|
@@ -6759,7 +6954,9 @@ var CloudBrowser = class {
|
|
|
6759
6954
|
*
|
|
6760
6955
|
* @returns AuthSession, or undefined when there is nothing to export
|
|
6761
6956
|
*
|
|
6762
|
-
*
|
|
6957
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6958
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6959
|
+
* are no error codes to branch on.
|
|
6763
6960
|
*
|
|
6764
6961
|
* @example
|
|
6765
6962
|
* const auth = await browser.getAuthSession();
|
|
@@ -6772,6 +6969,7 @@ var CloudBrowser = class {
|
|
|
6772
6969
|
apiKey: this.apiKey
|
|
6773
6970
|
})
|
|
6774
6971
|
);
|
|
6972
|
+
throwCommandError("getAuthSession", resp.error);
|
|
6775
6973
|
return resp.session ? authSessionFromProto(resp.session) : void 0;
|
|
6776
6974
|
}
|
|
6777
6975
|
/**
|
|
@@ -6783,20 +6981,23 @@ var CloudBrowser = class {
|
|
|
6783
6981
|
*
|
|
6784
6982
|
* @param session - session as returned by getAuthSession()
|
|
6785
6983
|
*
|
|
6786
|
-
*
|
|
6984
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6985
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6986
|
+
* are no error codes to branch on.
|
|
6787
6987
|
*
|
|
6788
6988
|
* @example
|
|
6789
6989
|
* await browser.setAuthSession(saved);
|
|
6790
6990
|
* await browser.navigate("https://mail.google.com");
|
|
6791
6991
|
*/
|
|
6792
6992
|
async setAuthSession(session) {
|
|
6793
|
-
await this.client.setAuthSession(
|
|
6993
|
+
const res = await this.client.setAuthSession(
|
|
6794
6994
|
create(SetAuthSessionRequestSchema, {
|
|
6795
6995
|
sessionId: this.sessionId,
|
|
6796
6996
|
apiKey: this.apiKey,
|
|
6797
6997
|
session: authSessionToProto(session)
|
|
6798
6998
|
})
|
|
6799
6999
|
);
|
|
7000
|
+
throwCommandError("setAuthSession", res.error);
|
|
6800
7001
|
}
|
|
6801
7002
|
// ──────────────────────────────────────────────────────────────────
|
|
6802
7003
|
// Devtools / live-UI helpers
|
|
@@ -6816,7 +7017,9 @@ var CloudBrowser = class {
|
|
|
6816
7017
|
* @returns InspectResult with the resolved backendNodeId, frameId, tag
|
|
6817
7018
|
* name, trimmed textContent, visibility and bounds
|
|
6818
7019
|
*
|
|
6819
|
-
*
|
|
7020
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7021
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7022
|
+
* are no error codes to branch on.
|
|
6820
7023
|
*
|
|
6821
7024
|
* @example
|
|
6822
7025
|
* const r = await browser.inspectAtPosition(200, 300);
|
|
@@ -6831,6 +7034,7 @@ var CloudBrowser = class {
|
|
|
6831
7034
|
y
|
|
6832
7035
|
})
|
|
6833
7036
|
);
|
|
7037
|
+
throwCommandError("inspectAtPosition", resp.error);
|
|
6834
7038
|
return {
|
|
6835
7039
|
backendNodeId: resp.backendNodeId,
|
|
6836
7040
|
frameId: resp.frameId,
|
|
@@ -6850,7 +7054,9 @@ var CloudBrowser = class {
|
|
|
6850
7054
|
* @param frameId - id of the frame the node lives in; empty string
|
|
6851
7055
|
* targets the main frame
|
|
6852
7056
|
*
|
|
6853
|
-
*
|
|
7057
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7058
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7059
|
+
* are no error codes to branch on.
|
|
6854
7060
|
*
|
|
6855
7061
|
* @example
|
|
6856
7062
|
* await browser.highlightNode(res.backendNodeId, res.frameId);
|
|
@@ -6862,7 +7068,8 @@ var CloudBrowser = class {
|
|
|
6862
7068
|
backendNodeId
|
|
6863
7069
|
});
|
|
6864
7070
|
if (frameId) req.frameId = frameId;
|
|
6865
|
-
await this.client.highlightNode(req);
|
|
7071
|
+
const res = await this.client.highlightNode(req);
|
|
7072
|
+
throwCommandError("highlight", res.error);
|
|
6866
7073
|
}
|
|
6867
7074
|
/**
|
|
6868
7075
|
* Pastes text at the current caret using IME-style input.
|
|
@@ -6874,19 +7081,24 @@ var CloudBrowser = class {
|
|
|
6874
7081
|
*
|
|
6875
7082
|
* @param text - the text to insert at the caret
|
|
6876
7083
|
*
|
|
6877
|
-
* @throws
|
|
7084
|
+
* @throws no_focus - nothing in the page holds focus, so there is no caret to
|
|
7085
|
+
* insert at; click the field first
|
|
7086
|
+
* @throws busy - another action is already running on this page
|
|
7087
|
+
*
|
|
7088
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6878
7089
|
*
|
|
6879
7090
|
* @example
|
|
6880
7091
|
* await browser.insertText("hello world");
|
|
6881
7092
|
*/
|
|
6882
7093
|
async insertText(text) {
|
|
6883
|
-
await this.client.insertText(
|
|
7094
|
+
const res = await this.client.insertText(
|
|
6884
7095
|
create(InsertTextRequestSchema, {
|
|
6885
7096
|
sessionId: this.sessionId,
|
|
6886
7097
|
apiKey: this.apiKey,
|
|
6887
7098
|
text
|
|
6888
7099
|
})
|
|
6889
7100
|
);
|
|
7101
|
+
throwCommandError("insertText", res.error);
|
|
6890
7102
|
}
|
|
6891
7103
|
/**
|
|
6892
7104
|
* Types `text` into the currently focused element as a per-key stream of real
|
|
@@ -6908,7 +7120,10 @@ var CloudBrowser = class {
|
|
|
6908
7120
|
* @param opts - optional: `clearFirst` clears the focused field (Ctrl+A,
|
|
6909
7121
|
* Delete) before typing
|
|
6910
7122
|
*
|
|
6911
|
-
*
|
|
7123
|
+
* `type` has no semantic failure of its own: the keys land wherever focus
|
|
7124
|
+
* happens to be, so there is no target it can miss. Only the page or context
|
|
7125
|
+
* being torn down mid-stream surfaces, and that is a transport failure rather
|
|
7126
|
+
* than a code.
|
|
6912
7127
|
*
|
|
6913
7128
|
* @example
|
|
6914
7129
|
* // OTP field that auto-advances across boxes.
|
|
@@ -6922,7 +7137,7 @@ var CloudBrowser = class {
|
|
|
6922
7137
|
text
|
|
6923
7138
|
});
|
|
6924
7139
|
if (opts?.clearFirst) req.clearFirst = true;
|
|
6925
|
-
await this.client.type(req);
|
|
7140
|
+
throwCommandError("type", (await this.client.type(req)).error);
|
|
6926
7141
|
}
|
|
6927
7142
|
/**
|
|
6928
7143
|
* Fires a single key-down event.
|
|
@@ -6937,7 +7152,11 @@ var CloudBrowser = class {
|
|
|
6937
7152
|
* `modifiers` (bit-flag: Alt=1, Ctrl=2, Meta=4, Shift=8),
|
|
6938
7153
|
* `location` (0=standard, 1=left, 2=right, 3=numpad)
|
|
6939
7154
|
*
|
|
6940
|
-
* @throws
|
|
7155
|
+
* @throws no_focus - nothing in the page holds focus, so the key has nowhere
|
|
7156
|
+
* to go; click the field first
|
|
7157
|
+
* @throws busy - another action is already running on this page
|
|
7158
|
+
*
|
|
7159
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6941
7160
|
*
|
|
6942
7161
|
* @example
|
|
6943
7162
|
* // Ctrl+A
|
|
@@ -6953,7 +7172,8 @@ var CloudBrowser = class {
|
|
|
6953
7172
|
if (opts?.code) req.code = opts.code;
|
|
6954
7173
|
if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
|
|
6955
7174
|
if (opts?.location !== void 0) req.location = opts.location;
|
|
6956
|
-
await this.client.pressKey(req);
|
|
7175
|
+
const res = await this.client.pressKey(req);
|
|
7176
|
+
throwCommandError("pressKey", res.error);
|
|
6957
7177
|
}
|
|
6958
7178
|
/**
|
|
6959
7179
|
* Fires a single key-up event.
|
|
@@ -6976,7 +7196,8 @@ var CloudBrowser = class {
|
|
|
6976
7196
|
if (opts?.code) req.code = opts.code;
|
|
6977
7197
|
if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
|
|
6978
7198
|
if (opts?.location !== void 0) req.location = opts.location;
|
|
6979
|
-
await this.client.releaseKey(req);
|
|
7199
|
+
const res = await this.client.releaseKey(req);
|
|
7200
|
+
throwCommandError("releaseKey", res.error);
|
|
6980
7201
|
}
|
|
6981
7202
|
/**
|
|
6982
7203
|
* Returns the current text selection.
|
|
@@ -6987,7 +7208,9 @@ var CloudBrowser = class {
|
|
|
6987
7208
|
*
|
|
6988
7209
|
* @returns the selected text, or `""` when nothing is selected
|
|
6989
7210
|
*
|
|
6990
|
-
*
|
|
7211
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7212
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7213
|
+
* are no error codes to branch on.
|
|
6991
7214
|
*
|
|
6992
7215
|
* @example
|
|
6993
7216
|
* const sel = await browser.getSelection();
|
|
@@ -7000,32 +7223,35 @@ var CloudBrowser = class {
|
|
|
7000
7223
|
apiKey: this.apiKey
|
|
7001
7224
|
})
|
|
7002
7225
|
);
|
|
7226
|
+
throwCommandError("getSelection", resp.error);
|
|
7003
7227
|
return resp.text;
|
|
7004
7228
|
}
|
|
7005
7229
|
// ──────────────────────────────────────────────────────────────────
|
|
7006
7230
|
// Captcha solver
|
|
7007
7231
|
// ──────────────────────────────────────────────────────────────────
|
|
7008
7232
|
/**
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7025
|
-
|
|
7026
|
-
|
|
7027
|
-
|
|
7028
|
-
|
|
7233
|
+
* Detects and solves the first supported bot-challenge it finds
|
|
7234
|
+
* anywhere on the page.
|
|
7235
|
+
*
|
|
7236
|
+
* Detection covers the common challenge types you run into in the
|
|
7237
|
+
* wild. The challenge is completed in-page server-side (the resulting
|
|
7238
|
+
* token / bypass cookies are wired into the page automatically), so
|
|
7239
|
+
* callers can ignore the returned string.
|
|
7240
|
+
*
|
|
7241
|
+
* @param opts - optional `timeoutMs` (how long to wait for a captcha to
|
|
7242
|
+
* appear; omit for server default 60s) and `retryAmount` (failures
|
|
7243
|
+
* tolerated before giving up)
|
|
7244
|
+
*
|
|
7245
|
+
* @returns empty string on success — the solution is applied server-side
|
|
7246
|
+
*
|
|
7247
|
+
* Rejects when no captcha appeared within imeoutMs, or when the one that did
|
|
7248
|
+
* could not be solved within
|
|
7249
|
+
etryAmount attempts. Neither carries a code:
|
|
7250
|
+
* solving runs outside the page, so there is no per-command code set here.
|
|
7251
|
+
*
|
|
7252
|
+
* @example
|
|
7253
|
+
* await browser.solveCaptcha({ retryAmount: 2 });
|
|
7254
|
+
*/
|
|
7029
7255
|
async solveCaptcha(opts) {
|
|
7030
7256
|
const resp = await this.client.solveCaptcha(
|
|
7031
7257
|
create(SolveCaptchaRequestSchema, {
|
|
@@ -7051,7 +7277,8 @@ var CloudBrowser = class {
|
|
|
7051
7277
|
*
|
|
7052
7278
|
* @returns the ICE servers for the client `RTCPeerConnection`
|
|
7053
7279
|
*
|
|
7054
|
-
*
|
|
7280
|
+
* Rejects when TURN is not configured on the server. That is a deployment
|
|
7281
|
+
* condition rather than a per-call outcome, so it carries no code.
|
|
7055
7282
|
*
|
|
7056
7283
|
* @example
|
|
7057
7284
|
* const ice = await browser.getStreamConfig();
|
|
@@ -7080,8 +7307,16 @@ var CloudBrowser = class {
|
|
|
7080
7307
|
* @returns the SDP answer to apply as the remote description, plus the
|
|
7081
7308
|
* viewport to map input coordinates into
|
|
7082
7309
|
*
|
|
7083
|
-
* @throws
|
|
7084
|
-
*
|
|
7310
|
+
* @throws already_active - a stream is already running on this session; stop it
|
|
7311
|
+
* before starting another
|
|
7312
|
+
* @throws negotiation_failed - the browser could not agree on a connection. The
|
|
7313
|
+
* message carries the negotiator's own diagnostic, which is usually where the
|
|
7314
|
+
* actual cause is
|
|
7315
|
+
*
|
|
7316
|
+
* An empty offer or an unconfigured TURN setup is a caller mistake rather than
|
|
7317
|
+
* an outcome, and rejects separately.
|
|
7318
|
+
*
|
|
7319
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
7085
7320
|
*
|
|
7086
7321
|
* @example
|
|
7087
7322
|
* const { answerSdp, viewport } = await browser.startStream(offer.sdp);
|
|
@@ -7095,6 +7330,7 @@ var CloudBrowser = class {
|
|
|
7095
7330
|
offerSdp
|
|
7096
7331
|
})
|
|
7097
7332
|
);
|
|
7333
|
+
throwCommandError("startStream", resp.error);
|
|
7098
7334
|
return {
|
|
7099
7335
|
answerSdp: resp.answerSdp,
|
|
7100
7336
|
viewport: resp.viewport ? { width: resp.viewport.width, height: resp.viewport.height } : null
|
|
@@ -7104,27 +7340,29 @@ var CloudBrowser = class {
|
|
|
7104
7340
|
* Tears down the live video stream for the session's page. Safe to call even
|
|
7105
7341
|
* if no stream is running.
|
|
7106
7342
|
*
|
|
7107
|
-
*
|
|
7343
|
+
* Rejects only on a transport failure. Stopping a stream that is not running is
|
|
7344
|
+
* a no-op rather than a failure, so there are no error codes to branch on.
|
|
7108
7345
|
*
|
|
7109
7346
|
* @example
|
|
7110
7347
|
* await browser.stopStream();
|
|
7111
7348
|
*/
|
|
7112
7349
|
async stopStream() {
|
|
7113
|
-
await this.client.stopStream(
|
|
7350
|
+
const res = await this.client.stopStream(
|
|
7114
7351
|
create(StopStreamRequestSchema, {
|
|
7115
7352
|
sessionId: this.sessionId,
|
|
7116
7353
|
apiKey: this.apiKey
|
|
7117
7354
|
})
|
|
7118
7355
|
);
|
|
7356
|
+
throwCommandError("stopStream", res.error);
|
|
7119
7357
|
}
|
|
7120
7358
|
// ──────────────────────────────────────────────────────────────────
|
|
7121
7359
|
// Reactions
|
|
7122
7360
|
// ──────────────────────────────────────────────────────────────────
|
|
7123
7361
|
/**
|
|
7124
|
-
* Registers a one-shot "reaction":
|
|
7125
|
-
*
|
|
7126
|
-
*
|
|
7127
|
-
*
|
|
7362
|
+
* Registers a one-shot "reaction": the browser watches for the `match`
|
|
7363
|
+
* locator in the background and, as soon as it matches, clicks it the same
|
|
7364
|
+
* way {@link CloudBrowser.click} does (scroll, human path, occlusion check) —
|
|
7365
|
+
* then removes itself. The reaction yields to any in-flight input
|
|
7128
7366
|
* action and only fires while the pointer is idle, so a reaction naturally
|
|
7129
7367
|
* slots into the gaps of a retrying foreground action (e.g. it dismisses a
|
|
7130
7368
|
* newsletter modal blocking a {@link CloudBrowser.click}, after which the
|
|
@@ -7173,6 +7411,7 @@ var CloudBrowser = class {
|
|
|
7173
7411
|
if (opts?.clickCount) req.clickCount = opts.clickCount;
|
|
7174
7412
|
if (opts?.intervalMs) req.interval = opts.intervalMs;
|
|
7175
7413
|
const resp = await this.client.addReaction(req);
|
|
7414
|
+
throwCommandError("addReaction", resp.error);
|
|
7176
7415
|
return resp.reactionId;
|
|
7177
7416
|
}
|
|
7178
7417
|
/**
|
|
@@ -7183,6 +7422,10 @@ var CloudBrowser = class {
|
|
|
7183
7422
|
*
|
|
7184
7423
|
* @returns true if a pending reaction with this id existed and was removed
|
|
7185
7424
|
*
|
|
7425
|
+
* Removing an id that is not registered is a no-op rather than an error, so the
|
|
7426
|
+
* returned boolean - not a rejection - is what tells you whether anything was
|
|
7427
|
+
* there. Rejects only on a transport failure.
|
|
7428
|
+
*
|
|
7186
7429
|
* @example
|
|
7187
7430
|
* const removed = await browser.removeReaction(id);
|
|
7188
7431
|
*/
|
|
@@ -7194,6 +7437,7 @@ var CloudBrowser = class {
|
|
|
7194
7437
|
reactionId
|
|
7195
7438
|
})
|
|
7196
7439
|
);
|
|
7440
|
+
throwCommandError("removeReaction", resp.error);
|
|
7197
7441
|
return resp.removed;
|
|
7198
7442
|
}
|
|
7199
7443
|
/**
|
|
@@ -7202,6 +7446,10 @@ var CloudBrowser = class {
|
|
|
7202
7446
|
*
|
|
7203
7447
|
* @returns the pending reactions for the page
|
|
7204
7448
|
*
|
|
7449
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7450
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7451
|
+
* are no error codes to branch on.
|
|
7452
|
+
*
|
|
7205
7453
|
* @example
|
|
7206
7454
|
* const pending = await browser.listReactions();
|
|
7207
7455
|
* for (const r of pending) console.log(r.reactionId, r.matchSelector);
|
|
@@ -7213,6 +7461,7 @@ var CloudBrowser = class {
|
|
|
7213
7461
|
apiKey: this.apiKey
|
|
7214
7462
|
})
|
|
7215
7463
|
);
|
|
7464
|
+
throwCommandError("listReactions", resp.error);
|
|
7216
7465
|
return resp.reactions.map((r) => ({
|
|
7217
7466
|
reactionId: r.reactionId,
|
|
7218
7467
|
matchSelector: r.matchSelector ?? "",
|
|
@@ -7227,39 +7476,44 @@ var CloudBrowser = class {
|
|
|
7227
7476
|
// Scripts
|
|
7228
7477
|
// ──────────────────────────────────────────────────────────────────
|
|
7229
7478
|
/**
|
|
7230
|
-
|
|
7231
|
-
|
|
7232
|
-
|
|
7233
|
-
|
|
7234
|
-
|
|
7235
|
-
|
|
7236
|
-
|
|
7237
|
-
|
|
7238
|
-
|
|
7239
|
-
|
|
7240
|
-
|
|
7241
|
-
|
|
7242
|
-
|
|
7243
|
-
|
|
7244
|
-
|
|
7245
|
-
|
|
7246
|
-
|
|
7247
|
-
|
|
7248
|
-
|
|
7249
|
-
|
|
7250
|
-
|
|
7251
|
-
|
|
7252
|
-
|
|
7253
|
-
|
|
7254
|
-
|
|
7255
|
-
|
|
7256
|
-
|
|
7257
|
-
|
|
7258
|
-
|
|
7259
|
-
|
|
7260
|
-
|
|
7261
|
-
|
|
7262
|
-
|
|
7479
|
+
* Runs `source` in the session's browser and waits for it to finish.
|
|
7480
|
+
*
|
|
7481
|
+
* The script runs beside the browser, in a V8 isolate of its own rather than
|
|
7482
|
+
* in the page, and reaches the document through the engine: a cross-origin
|
|
7483
|
+
* `<iframe>` is read as plain `contentDocument` with no frame ids anywhere,
|
|
7484
|
+
* values come back as live objects it can assign to rather than snapshots, an
|
|
7485
|
+
* element can be handed straight to `browser.click`, and the page sees nothing
|
|
7486
|
+
* injected. Steps cost microseconds rather than network round trips, so work
|
|
7487
|
+
* that is chatty by nature — polling for a selector, walking a list,
|
|
7488
|
+
* following pagination — is affordable there. A guide for it is still to come.
|
|
7489
|
+
*
|
|
7490
|
+
* This waits for as long as the script runs, and cannot be bounded: the run
|
|
7491
|
+
* id needed to cancel only arrives with the reply. Use
|
|
7492
|
+
* {@link CloudBrowser.startScript} when the script may outlive the caller's
|
|
7493
|
+
* patience, or {@link CloudBrowser.stopScripts} to abandon what this session
|
|
7494
|
+
* is running.
|
|
7495
|
+
*
|
|
7496
|
+
* @param source - JavaScript to execute; its return value comes back as JSON
|
|
7497
|
+
*
|
|
7498
|
+
* @returns the return value and the script's whole console output. A script
|
|
7499
|
+
* that threw is reported as `success: false`, not as a rejection
|
|
7500
|
+
*
|
|
7501
|
+
* Rejects only on a transport failure. A script that fails to compile or throws
|
|
7502
|
+
* is not a rejection: the returned result has success: false and
|
|
7503
|
+
esult holds
|
|
7504
|
+
* the message, so a broken script stays distinguishable from a broken connection.
|
|
7505
|
+
*
|
|
7506
|
+
* @example
|
|
7507
|
+
* const result = await browser.runScript(`
|
|
7508
|
+
* await browser.navigate("https://example.com");
|
|
7509
|
+
* const items = [];
|
|
7510
|
+
* for (const el of await browser.getDOM().querySelectorAll("h1")) {
|
|
7511
|
+
* items.push(el.textContent);
|
|
7512
|
+
* }
|
|
7513
|
+
* return items;
|
|
7514
|
+
* `);
|
|
7515
|
+
* console.log(result.success, result.result);
|
|
7516
|
+
*/
|
|
7263
7517
|
async runScript(source) {
|
|
7264
7518
|
const resp = await this.client.runScript(
|
|
7265
7519
|
create(RunScriptRequestSchema, {
|
|
@@ -7297,7 +7551,8 @@ var CloudBrowser = class {
|
|
|
7297
7551
|
*
|
|
7298
7552
|
* @returns ScriptRun handle for awaiting or cancelling the run
|
|
7299
7553
|
*
|
|
7300
|
-
*
|
|
7554
|
+
* Rejects only on a transport failure: a script that fails to compile or throws
|
|
7555
|
+
* surfaces on the run itself rather than here.
|
|
7301
7556
|
*
|
|
7302
7557
|
* @example
|
|
7303
7558
|
* const run = await browser.startScript(source, (ev) => {
|
|
@@ -7376,7 +7631,8 @@ var CloudBrowser = class {
|
|
|
7376
7631
|
*
|
|
7377
7632
|
* @returns ScriptFollow handle for stopping the subscription
|
|
7378
7633
|
*
|
|
7379
|
-
*
|
|
7634
|
+
* Rejects only on a transport failure: opening the subscription has no semantic
|
|
7635
|
+
* failure of its own.
|
|
7380
7636
|
*
|
|
7381
7637
|
* @example
|
|
7382
7638
|
* const follow = await browser.followScript(runId, (ev) => {
|
|
@@ -7412,7 +7668,9 @@ var CloudBrowser = class {
|
|
|
7412
7668
|
* @returns how many runs were cancelled; 0 when the id named nothing in
|
|
7413
7669
|
* flight
|
|
7414
7670
|
*
|
|
7415
|
-
*
|
|
7671
|
+
* Rejects only on a transport failure. Cancelling runs that have already
|
|
7672
|
+
* finished, or none at all, is a no-op - read the returned count to learn how
|
|
7673
|
+
* many were actually stopped.
|
|
7416
7674
|
*
|
|
7417
7675
|
* @example
|
|
7418
7676
|
* await browser.stopScripts(""); // abandon everything running
|
|
@@ -7437,7 +7695,9 @@ var CloudBrowser = class {
|
|
|
7437
7695
|
*
|
|
7438
7696
|
* @returns one entry per run still executing
|
|
7439
7697
|
*
|
|
7440
|
-
*
|
|
7698
|
+
* Rejects only on a transport failure - a dead session, a broken connection.
|
|
7699
|
+
* This call has no semantic failure of its own, so there are no error codes to
|
|
7700
|
+
* branch on.
|
|
7441
7701
|
*
|
|
7442
7702
|
* @example
|
|
7443
7703
|
* for (const run of await browser.listScriptRuns()) {
|
|
@@ -7773,6 +8033,11 @@ var BrowserConfig = class {
|
|
|
7773
8033
|
}
|
|
7774
8034
|
};
|
|
7775
8035
|
|
|
8036
|
+
// src/defaults.ts
|
|
8037
|
+
var DefaultWaitTimeoutMs = 3e4;
|
|
8038
|
+
var DefaultVisible = true;
|
|
8039
|
+
var DefaultSteadyMs = 500;
|
|
8040
|
+
|
|
7776
8041
|
// src/browser.ts
|
|
7777
8042
|
function createWebSocketBrowser(wsUrl, sessionId, apiKey, fingerprint = "") {
|
|
7778
8043
|
const transport = new WebSocketTransport(wsUrl);
|