browserscale-ts 1.7.1 → 1.9.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.
@@ -3799,82 +3799,78 @@ 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/Cg1wYXJ0aXRpb25fa2V5GA0gASgLMiMuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcnRpdGlvbktleUgIiAEBQgYKBF91cmxCCQoHX3NlY3VyZUIMCgpfaHR0cF9vbmx5QgwKCl9zYW1lX3NpdGVCCgoIX2V4cGlyZXNCCwoJX3ByaW9yaXR5QhAKDl9zb3VyY2Vfc2NoZW1lQg4KDF9zb3VyY2VfcG9ydEIQCg5fcGFydGl0aW9uX2tleSKtAQoNV2FpdENvbmRpdGlvbhIVCghzZWxlY3RvchgBIAEoCUgAiAEBEhoKDWpzX2V4cHJlc3Npb24YAiABKAlIAYgBARIUCgd2aXNpYmxlGAMgASgISAKIAQESGAoLc3RlYWR5X3RpbWUYBCABKAFIA4gBAUILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCgoIX3Zpc2libGVCDgoMX3N0ZWFkeV90aW1lIswBCgpXYWl0UmVzdWx0Eg0KBWluZGV4GAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYByABKAgSLgoFZXJyb3IYBiABKAsyGi5icm93c2Vyc2NhbGUudjEuV2FpdEVycm9ySACIAQFCCAoGX2Vycm9yIuwBChNXYWl0Q29uZGl0aW9uU3RhdHVzEg0KBWluZGV4GAEgASgFEg0KBXN0YXRlGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIQCghmcmFtZV9pZBgEIAEoCRISCgppc192aXNpYmxlGAUgASgIEioKBmJvdW5kcxgGIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0SACIAQESNAoIb2NjbHVkZXIYByABKAsyHS5icm93c2Vyc2NhbGUudjEuT2NjbHVkZXJJbmZvSAGIAQFCCQoHX2JvdW5kc0ILCglfb2NjbHVkZXIiZAoJV2FpdEVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI4Cgpjb25kaXRpb25zGAMgAygLMiQuYnJvd3NlcnNjYWxlLnYxLldhaXRDb25kaXRpb25TdGF0dXMipgEKDUVsZW1lbnRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIOCgZyb290X3gYBiABKAESDgoGcm9vdF95GAcgASgBItIDCgxPY2NsdWRlckluZm8SFwoPYmFja2VuZF9ub2RlX2lkGAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhAKCHRhZ19uYW1lGAMgASgJEg8KAmlkGAQgASgJSACIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgBiAEBEhEKBHRleHQYBiABKAlIAogBARIlCgZib3VuZHMYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIbCg5wb2ludGVyX2V2ZW50cxgIIAEoCUgDiAEBEhcKCnZpc2liaWxpdHkYCSABKAlIBIgBARIUCgdvcGFjaXR5GAogASgBSAWIAQESFAoHel9pbmRleBgLIAEoCUgGiAEBEiUKGGhpdHRhYmxlX3doaWxlX2ludmlzaWJsZRgMIAEoCEgHiAEBEhUKCHBvc2l0aW9uGA0gASgJSAiIAQFCBQoDX2lkQg0KC19jbGFzc19uYW1lQgcKBV90ZXh0QhEKD19wb2ludGVyX2V2ZW50c0INCgtfdmlzaWJpbGl0eUIKCghfb3BhY2l0eUIKCghfel9pbmRleEIbChlfaGl0dGFibGVfd2hpbGVfaW52aXNpYmxlQgsKCV9wb3NpdGlvbiItCgxDb21tYW5kRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIl0KDUNvbW1hbmRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIxCgVlcnJvchgCIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IioAEKCkNsaWNrRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjQKCG9jY2x1ZGVyGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gAiAEBEhwKD2V2YWRlX2F0dGVtcHRlZBgEIAEoCEgBiAEBQgsKCV9vY2NsdWRlckISChBfZXZhZGVfYXR0ZW1wdGVkIt8BCgtDbGlja1Jlc3VsdBIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLwoFZXJyb3IYCCABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBQggKBl9lcnJvciKeAgoMUmVhY3Rpb25JbmZvEhMKC3JlYWN0aW9uX2lkGAEgASgJEhsKDm1hdGNoX3NlbGVjdG9yGAIgASgJSACIAQESIAoTbWF0Y2hfanNfZXhwcmVzc2lvbhgDIAEoCUgBiAEBEhwKD2FjdGlvbl9zZWxlY3RvchgEIAEoCUgCiAEBEiEKFGFjdGlvbl9qc19leHByZXNzaW9uGAUgASgJSAOIAQESEAoIZnJhbWVfaWQYBiABKAkSDwoHdmlzaWJsZRgHIAEoCEIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CEgoQX2FjdGlvbl9zZWxlY3RvckIXChVfYWN0aW9uX2pzX2V4cHJlc3Npb24i1gMKEkFkZFJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIbCg5tYXRjaF9zZWxlY3RvchgEIAEoCUgAiAEBEiAKE21hdGNoX2pzX2V4cHJlc3Npb24YBSABKAlIAYgBARIVCghmcmFtZV9pZBgGIAEoCUgCiAEBEhQKB3Zpc2libGUYByABKAhIA4gBARIcCg9hY3Rpb25fc2VsZWN0b3IYCCABKAlIBIgBARIhChRhY3Rpb25fanNfZXhwcmVzc2lvbhgJIAEoCUgFiAEBEhMKBmJ1dHRvbhgKIAEoCUgGiAEBEhgKC2NsaWNrX2NvdW50GAsgASgFSAeIAQESFQoIaW50ZXJ2YWwYDCABKAFICIgBAUIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgoKCF92aXNpYmxlQhIKEF9hY3Rpb25fc2VsZWN0b3JCFwoVX2FjdGlvbl9qc19leHByZXNzaW9uQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgsKCV9pbnRlcnZhbCJ4ChNBZGRSZWFjdGlvblJlc3BvbnNlEhMKC3JlYWN0aW9uX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIlEKFVJlbW92ZVJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLcmVhY3Rpb25faWQYAyABKAkidwoWUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRIPCgdyZW1vdmVkGAEgASgIEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIkwKFExpc3RSZWFjdGlvbnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIpcBChVMaXN0UmVhY3Rpb25zUmVzcG9uc2USMAoJcmVhY3Rpb25zGAEgAygLMh0uYnJvd3NlcnNjYWxlLnYxLlJlYWN0aW9uSW5mbxIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciLpAQoKRWxlbWVudFJlZhIXCg9iYWNrZW5kX25vZGVfaWQYASABKAUSEAoIdGFnX25hbWUYAiABKAkSDwoCaWQYAyABKAlIAIgBARIRCgRuYW1lGAQgASgJSAGIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgCiAEBEhcKCmlucHV0X3R5cGUYBiABKAlIA4gBARIRCgR0ZXh0GAcgASgJSASIAQESEAoIZWRpdGFibGUYCCABKAhCBQoDX2lkQgcKBV9uYW1lQg0KC19jbGFzc19uYW1lQg0KC19pbnB1dF90eXBlQgcKBV90ZXh0Iu4CCglGaWxsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjUKC2NsaWNrX2Vycm9yGAMgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkNsaWNrRXJyb3JIAIgBARIkChdmb2N1c2VkX2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgBiAEBEjkKD2ZvY3VzZWRfZWxlbWVudBgFIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5FbGVtZW50UmVmSAKIAQESHAoPdGFyZ2V0X2VkaXRhYmxlGAYgASgISAOIAQESIAoTdGFyZ2V0X3ZhbHVlX2xlbmd0aBgHIAEoBUgEiAEBQg4KDF9jbGlja19lcnJvckIaChhfZm9jdXNlZF9iYWNrZW5kX25vZGVfaWRCEgoQX2ZvY3VzZWRfZWxlbWVudEISChBfdGFyZ2V0X2VkaXRhYmxlQhYKFF90YXJnZXRfdmFsdWVfbGVuZ3RoIqIBCgpGaWxsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLgoFZXJyb3IYCCABKAsyGi5icm93c2Vyc2NhbGUudjEuRmlsbEVycm9ySACIAQFCCAoGX2Vycm9yIsIBCgpEcmFnUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg8KB3N0YXJ0X3gYBCABKAESDwoHc3RhcnRfeRgFIAEoARINCgVlbmRfeBgGIAEoARINCgVlbmRfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5EcmFnRXJyb3JIAIgBAUIICgZfZXJyb3IicQoJRHJhZ0Vycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI1CgtjbGlja19lcnJvchgDIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5DbGlja0Vycm9ySACIAQFCDgoMX2NsaWNrX2Vycm9yIq4BChJTZWxlY3RPcHRpb25SZXN1bHQSFgoOc2VsZWN0ZWRfaW5kZXgYASABKAUSFgoOc2VsZWN0ZWRfdmFsdWUYAiABKAkSFQoNc2VsZWN0ZWRfdGV4dBgDIAEoCRIPCgdzdWNjZXNzGAQgASgIEjYKBWVycm9yGAUgASgLMiIuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvbkVycm9ySACIAQFCCAoGX2Vycm9yIjIKEVNlbGVjdE9wdGlvbkVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLBAQoMU2Nyb2xsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSMAoFZXJyb3IYCCABKAsyHC5icm93c2Vyc2NhbGUudjEuU2Nyb2xsRXJyb3JIAIgBAUIICgZfZXJyb3IiLAoLU2Nyb2xsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIt0BCgpNb3ZlUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Nb3ZlRXJyb3JIAIgBAUIICgZfZXJyb3IiKgoJTW92ZUVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLmAQoPU2V0UHJveHlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIXCgpwcm94eV9ob3N0GAMgASgJSACIAQESFwoKcHJveHlfcG9ydBgEIAEoBUgBiAEBEhsKDnByb3h5X3VzZXJuYW1lGAUgASgJSAKIAQESGwoOcHJveHlfcGFzc3dvcmQYBiABKAlIA4gBAUINCgtfcHJveHlfaG9zdEINCgtfcHJveHlfcG9ydEIRCg9fcHJveHlfdXNlcm5hbWVCEQoPX3Byb3h5X3Bhc3N3b3JkIjYKD0dldFBhZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiigEKEEdldFBhZ2VzUmVzcG9uc2USKAoFcGFnZXMYASADKAsyGS5icm93c2Vyc2NhbGUudjEuUGFnZUluZm8SDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IipAEKDFNlc3Npb25Vc2FnZRIRCgl3YWxsX3RpbWUYASABKAESEAoIY3B1X3RpbWUYAiABKAESEgoKbWluX21lbW9yeRgDIAEoARIWCg5hdmVyYWdlX21lbW9yeRgEIAEoARITCgtwZWFrX21lbW9yeRgFIAEoARIWCg5yZW5kZXJlcnNfdXNlZBgGIAEoBRIWCg5mcmFtZXNfY3JlYXRlZBgHIAEoBSI2Cg9HZXRVc2FnZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIo4BChBHZXRVc2FnZVJlc3BvbnNlEiwKBXVzYWdlGAEgASgLMh0uYnJvd3NlcnNjYWxlLnYxLlNlc3Npb25Vc2FnZRIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKaAQoPTmF2aWdhdGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA3VybBgEIAEoCRIVCghyZWZlcnJlchgFIAEoCUgAiAEBEhQKB3RpbWVvdXQYBiABKAFIAYgBAUILCglfcmVmZXJyZXJCCgoIX3RpbWVvdXQifwoQTmF2aWdhdGVSZXNwb25zZRIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IitgEKD0xvYWRIVE1MUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgN1cmwYBCABKAkSDAoEaHRtbBgFIAEoCRIoCgdoZWFkZXJzGAYgAygLMhcuYnJvd3NlcnNjYWxlLnYxLkhlYWRlchIYCgtzdGF0dXNfY29kZRgHIAEoBUgAiAEBQg4KDF9zdGF0dXNfY29kZSJ/Cg9FdmFsdWF0ZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSEgoKZXhwcmVzc2lvbhgEIAEoCRIVCghmcmFtZV9pZBgFIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCLEAQoQRXZhbHVhdGVSZXNwb25zZRIOCgZyZXN1bHQYASABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAIgASgFEhIKCmlzX3Zpc2libGUYAyABKAgSJQoGYm91bmRzGAQgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDwoHc3VjY2VzcxgFIAEoCBIxCgVlcnJvchgGIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiwgEKEFdhaXRGb3JBbnlQYXJhbXMSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSMgoKY29uZGl0aW9ucxgEIAMoCzIeLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uEhUKCGZyYW1lX2lkGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9mcmFtZV9pZEIKCghfdGltZW91dCL1AgoTU2VsZWN0T3B0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEhIKBWluZGV4GAggASgFSASIAQESEgoFdmFsdWUYCSABKAlIBYgBARIRCgR0ZXh0GAogASgJSAaIAQESGAoLZmlyZV9ldmVudHMYCyABKAhIB4gBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCCAoGX2luZGV4QggKBl92YWx1ZUIHCgVfdGV4dEIOCgxfZmlyZV9ldmVudHMi7wEKD1Njcm9sbFRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZCKZAgoNTW92ZVRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEg4KAXgYCCABKAFIBIgBARIOCgF5GAkgASgBSAWIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgQKAl94QgQKAl95IoIDCgxDbGlja1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARITCgZidXR0b24YCCABKAlIBIgBARIYCgtjbGlja19jb3VudBgJIAEoBUgFiAEBEg4KAXgYCiABKAFIBogBARIOCgF5GAsgASgBSAeIAQESEwoGYWN0aW9uGAwgASgJSAiIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgQKAl94QgQKAl95QgkKB19hY3Rpb24igwMKC0RyYWdSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESFQoIb2Zmc2V0X3gYCCABKAFIBIgBARIVCghvZmZzZXRfeRgJIAEoAUgFiAEBEhcKCmFic29sdXRlX3gYCiABKAFIBogBARIXCgphYnNvbHV0ZV95GAsgASgBSAeIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgsKCV9vZmZzZXRfeEILCglfb2Zmc2V0X3lCDQoLX2Fic29sdXRlX3hCDQoLX2Fic29sdXRlX3ki7wIKC0ZpbGxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESDAoEdGV4dBgIIAEoCRIYCgtjbGVhcl9maXJzdBgJIAEoCEgEiAEBEhQKB3RpbWVvdXQYCiABKAFIBYgBARIYCgtzdGVhZHlfdGltZRgLIAEoAUgGiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIOCgxfY2xlYXJfZmlyc3RCCgoIX3RpbWVvdXRCDgoMX3N0ZWFkeV90aW1lIkwKE1NldEJsb2NrTGlzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJImEKFVNldFN0YXRpY1BhdGhzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSEQoJYmxvYl9uYW1lGAQgASgJIogBChhXYWl0Rm9yQW55UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhMKC2Fib3J0X2ZsYWdzGAQgAygFEhQKB3RpbWVvdXQYBSABKAFIAIgBAUIKCghfdGltZW91dCKuAQoZV2FpdEZvckFueVJlcXVlc3RSZXNwb25zZRINCgVpbmRleBgBIAEoBRI0CgdyZXF1ZXN0GAIgASgLMiMuYnJvd3NlcnNjYWxlLnYxLkludGVyY2VwdGVkUmVxdWVzdBIPCgdzdWNjZXNzGAMgASgIEjEKBWVycm9yGAQgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKJAQoZV2FpdEZvckFueVJlc3BvbnNlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSEwoLYWJvcnRfZmxhZ3MYBCADKAUSFAoHdGltZW91dBgFIAEoAUgAiAEBQgoKCF90aW1lb3V0IrEBChpXYWl0Rm9yQW55UmVzcG9uc2VSZXNwb25zZRINCgVpbmRleBgBIAEoBRI2CghyZXNwb25zZRgCIAEoCzIkLmJyb3dzZXJzY2FsZS52MS5JbnRlcmNlcHRlZFJlc3BvbnNlEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIsoBChRNb2RpZnlSZXF1ZXN0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLdXJsX3BhdHRlcm4YAyABKAkSOgoNbW9kaWZpY2F0aW9ucxgEIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5IZWFkZXJNb2RpZmljYXRpb24SEQoEYm9keRgFIAEoCUgAiAEBEhQKB3RpbWVvdXQYBiABKAFIAYgBAUIHCgVfYm9keUIKCghfdGltZW91dCKbAQoVTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEjQKB3JlcXVlc3QYASABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0Eg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIoYBChpTdGFydE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSDgoGYm9kaWVzGAQgASgJEhUKDWJvZHlfcGF0dGVybnMYBSADKAlKBAgGEAdKBAgHEAgiQAoZU3RvcE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiewoaU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2USDwoHc3RvcHBlZBgBIAEoCBIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJECh1TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiWwoUTmV0d29ya0V4Y2hhbmdlRXZlbnQSMgoIZXhjaGFuZ2UYASABKAsyIC5icm93c2Vyc2NhbGUudjEuTmV0d29ya0V4Y2hhbmdlEg8KB2Ryb3BwZWQYAiABKAQitAUKD05ldHdvcmtFeGNoYW5nZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGNoYWluX2lkGAIgASgJEhYKDnJlZGlyZWN0X2luZGV4GAMgASgFEhAKCGZyYW1lX2lkGAQgASgJEhAKCGlzX29vcGlmGAUgASgIEhUKDXJlc291cmNlX3R5cGUYBiABKAkSDgoGbWV0aG9kGAcgASgJEgsKA3VybBgIIAEoCRIVCg1pbml0aWF0b3JfdXJsGAkgASgJEjAKD3JlcXVlc3RfaGVhZGVycxgKIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIAoYcmVxdWVzdF9oZWFkZXJzX2FyZV93aXJlGAsgASgIEhQKDHJlcXVlc3RfYm9keRgMIAEoDBIeChZyZXF1ZXN0X2JvZHlfdHJ1bmNhdGVkGA0gASgIEhQKDGhhc19yZXNwb25zZRgOIAEoCBITCgtzdGF0dXNfY29kZRgPIAEoBRITCgtzdGF0dXNfdGV4dBgQIAEoCRIRCgltaW1lX3R5cGUYESABKAkSEAoIcHJvdG9jb2wYEiABKAkSFgoOcmVtb3RlX2FkZHJlc3MYEyABKAkSEwoLc2VydmVkX2Zyb20YFCABKAkSMQoQcmVzcG9uc2VfaGVhZGVycxgVIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIQoZcmVzcG9uc2VfaGVhZGVyc19hcmVfd2lyZRgWIAEoCBIVCg1yZXNwb25zZV9ib2R5GBcgASgMEh8KF3Jlc3BvbnNlX2JvZHlfdHJ1bmNhdGVkGBggASgIEh4KFnJlc3BvbnNlX2JvZHlfY2FwdHVyZWQYGSABKAgSGwoTZW5jb2RlZF9kYXRhX2xlbmd0aBgaIAEoAxINCgVlcnJvchgbIAEoCSI4ChFHZXRDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkikQEKEkdldENvb2tpZXNSZXNwb25zZRItCgdjb29raWVzGAEgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcmFtEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yImcKEVNldENvb2tpZXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRItCgdjb29raWVzGAMgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcmFtIjoKE0NsZWFyQ29va2llc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIikKC1N0b3JhZ2VJdGVtEgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCSJRChJTdG9yYWdlT3JpZ2luRW50cnkSDgoGb3JpZ2luGAEgASgJEisKBWl0ZW1zGAIgAygLMhwuYnJvd3NlcnNjYWxlLnYxLlN0b3JhZ2VJdGVtIlgKEUdldFN0b3JhZ2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRITCgZvcmlnaW4YAyABKAlIAIgBAUIJCgdfb3JpZ2luIpgBChJHZXRTdG9yYWdlUmVzcG9uc2USNAoHc3RvcmFnZRgBIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlT3JpZ2luRW50cnkSDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IimAEKEVNldFN0b3JhZ2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRI0CgdzdG9yYWdlGAMgAygLMiMuYnJvd3NlcnNjYWxlLnYxLlN0b3JhZ2VPcmlnaW5FbnRyeRIYCgtjbGVhcl9maXJzdBgEIAEoCEgAiAEBQg4KDF9jbGVhcl9maXJzdCJaChNDbGVhclN0b3JhZ2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRITCgZvcmlnaW4YAyABKAlIAIgBAUIJCgdfb3JpZ2luIiwKC0Ric2NTZXNzaW9uEgwKBHNpdGUYASABKAkSDwoHc2Vzc2lvbhgCIAEoCSLYAgoLQXV0aFNlc3Npb24SFAoHZ2FpYV9pZBgBIAEoCUgAiAEBEhIKBWVtYWlsGAIgASgJSAGIAQESGgoNcmVmcmVzaF90b2tlbhgDIAEoCUgCiAEBEiAKE3dyYXBwZWRfYmluZGluZ19rZXkYBCABKAlIA4gBARIkChdzaWduaW5fc2NvcGVkX2RldmljZV9pZBgFIAEoCUgEiAEBEhkKDHN5bmNfY29uc2VudBgGIAEoCEgFiAEBEjMKDWRic2Nfc2Vzc2lvbnMYByADKAsyHC5icm93c2Vyc2NhbGUudjEuRGJzY1Nlc3Npb25CCgoIX2dhaWFfaWRCCAoGX2VtYWlsQhAKDl9yZWZyZXNoX3Rva2VuQhYKFF93cmFwcGVkX2JpbmRpbmdfa2V5QhoKGF9zaWduaW5fc2NvcGVkX2RldmljZV9pZEIPCg1fc3luY19jb25zZW50IjwKFUdldEF1dGhTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkipgEKFkdldEF1dGhTZXNzaW9uUmVzcG9uc2USMgoHc2Vzc2lvbhgBIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbkgAiAEBEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySAGIAQFCCgoIX3Nlc3Npb25CCAoGX2Vycm9yImsKFVNldEF1dGhTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSLQoHc2Vzc2lvbhgDIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbiKHAQoNR2V0RE9NUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCJrCg5HZXRET01SZXNwb25zZRILCgNkb20YASABKAkSDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IimQQKFUdldE9ic2VydmF0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIjChZtYXhfZWxlbWVudHNfcGVyX2ZyYW1lGAQgASgFSACIAQESHAoPbWF4X3RleHRfbGVuZ3RoGAUgASgFSAGIAQESEwoGZm9ybWF0GAYgASgJSAKIAQESHQoQbWF4X3RvdGFsX3Rva2VucxgHIAEoBUgDiAEBEhsKDmluY2x1ZGVfYm91bmRzGAggASgISASIAQESGgoNdmlld3BvcnRfb25seRgJIAEoCEgFiAEBEhwKD2JhY2tlbmRfbm9kZV9pZBgKIAEoBUgGiAEBEhUKCHNlbGVjdG9yGAsgASgJSAeIAQESGgoNanNfZXhwcmVzc2lvbhgMIAEoCUgIiAEBEhUKCGZyYW1lX2lkGA0gASgJSAmIAQFCGQoXX21heF9lbGVtZW50c19wZXJfZnJhbWVCEgoQX21heF90ZXh0X2xlbmd0aEIJCgdfZm9ybWF0QhMKEV9tYXhfdG90YWxfdG9rZW5zQhEKD19pbmNsdWRlX2JvdW5kc0IQCg5fdmlld3BvcnRfb25seUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWQikwEKFkdldE9ic2VydmF0aW9uUmVzcG9uc2USEwoLb2JzZXJ2YXRpb24YASABKAkSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3JKBAgCEANSEG9ic2VydmF0aW9uX2pzb24ibQoRR2V0RE9NSGFzaFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSFQoIZnJhbWVfaWQYBCABKAlIAIgBAUILCglfZnJhbWVfaWQiIgoSR2V0RE9NSGFzaFJlc3BvbnNlEgwKBGhhc2gYASABKAkigAEKFVN0YXJ0RG9tTWlycm9yUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEgoFZGVwdGgYBCABKAVIAIgBARITCgZwaWVyY2UYBSABKAhIAYgBAUIICgZfZGVwdGhCCQoHX3BpZXJjZUoECAMQBCKZAQoWU3RhcnREb21NaXJyb3JSZXNwb25zZRIMCgRyb290GAEgASgJEhAKCGZyYW1lX2lkGAIgASgJEgsKA3NlcRgDIAEoBBIPCgdzdWNjZXNzGAUgASgIEjEKBWVycm9yGAYgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvckoECAQQBSJBChRTdG9wRG9tTWlycm9yUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAlKBAgDEAQilwEKFUdldERvbUNoaWxkcmVuUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhUKCGZyYW1lX2lkGAQgASgJSACIAQESEgoFZGVwdGgYBSABKAVIAYgBAUILCglfZnJhbWVfaWRCCAoGX2RlcHRoIoUBChZHZXREb21DaGlsZHJlblJlc3BvbnNlEhAKCGNoaWxkcmVuGAEgASgJEgsKA3NlcRgCIAEoBBIPCgdzdWNjZXNzGAMgASgIEjEKBWVycm9yGAQgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJ8ChhSZWxlYXNlRG9tU3VidHJlZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJ4ChRSZXZlYWxEb21Ob2RlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhUKCGZyYW1lX2lkGAQgASgJSACIAQFCCwoJX2ZyYW1lX2lkIoABChVSZXZlYWxEb21Ob2RlUmVzcG9uc2USDAoEcGF0aBgBIAEoCRILCgNzZXEYAiABKAQSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiYAoVR2V0RG9tUmV2aXNpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIVCghmcmFtZV9pZBgDIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJ4ChZHZXREb21SZXZpc2lvblJlc3BvbnNlEhAKCHJldmlzaW9uGAEgASgEEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIj0KFlN0cmVhbURvbUV2ZW50c1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIjkKCURvbVVwZGF0ZRIQCghmcmFtZV9pZBgBIAEoCRILCgNzZXEYAiABKAQSDQoFZWRpdHMYAyABKAkiIQoJRG9tUmVzeW5jEg4KBnJlYXNvbhgCIAEoCUoECAEQAiJ7CghEb21FdmVudBIsCgZ1cGRhdGUYASABKAsyGi5icm93c2Vyc2NhbGUudjEuRG9tVXBkYXRlSAASLAoGcmVzeW5jGAIgASgLMhouYnJvd3NlcnNjYWxlLnYxLkRvbVJlc3luY0gAQgcKBWV2ZW50SgQIAxAESgQIBBAFImYKGEluc3BlY3RBdFBvc2l0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIJCgF4GAQgASgBEgkKAXkYBSABKAEi9wEKGUluc3BlY3RBdFBvc2l0aW9uUmVzcG9uc2USFwoPYmFja2VuZF9ub2RlX2lkGAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhAKCHRhZ19uYW1lGAMgASgJEhQKDHRleHRfY29udGVudBgEIAEoCRISCgppc192aXNpYmxlGAUgASgIEiUKBmJvdW5kcxgGIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYByABKAgSMQoFZXJyb3IYCCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIokBChRIaWdobGlnaHROb2RlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYBCABKAUSFQoIZnJhbWVfaWQYBSABKAlIAIgBAUILCglfZnJhbWVfaWQiVwoRSW5zZXJ0VGV4dFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSDAoEdGV4dBgEIAEoCSJ7CgtUeXBlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIMCgR0ZXh0GAQgASgJEhgKC2NsZWFyX2ZpcnN0GAUgASgISACIAQFCDgoMX2NsZWFyX2ZpcnN0IroBCg9QcmVzc0tleVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDa2V5GAQgASgJEhEKBGNvZGUYBSABKAlIAIgBARIWCgltb2RpZmllcnMYBiABKAVIAYgBARIVCghsb2NhdGlvbhgHIAEoBUgCiAEBQgcKBV9jb2RlQgwKCl9tb2RpZmllcnNCCwoJX2xvY2F0aW9uIrwBChFSZWxlYXNlS2V5UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgNrZXkYBCABKAkSEQoEY29kZRgFIAEoCUgAiAEBEhYKCW1vZGlmaWVycxgGIAEoBUgBiAEBEhUKCGxvY2F0aW9uGAcgASgFSAKIAQFCBwoFX2NvZGVCDAoKX21vZGlmaWVyc0ILCglfbG9jYXRpb24iSwoTR2V0U2VsZWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCSJyChRHZXRTZWxlY3Rpb25SZXNwb25zZRIMCgR0ZXh0GAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIosBChFTY3JlZW5zaG90UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRITCgZmb3JtYXQYBCABKAlIAIgBARIUCgdxdWFsaXR5GAUgASgFSAGIAQFCCQoHX2Zvcm1hdEIKCghfcXVhbGl0eSKWAQoSU2NyZWVuc2hvdFJlc3BvbnNlEhMKC2RhdGFfYmFzZTY0GAEgASgJEg0KBXdpZHRoGAIgASgFEg4KBmhlaWdodBgDIAEoBRIPCgdzdWNjZXNzGAQgASgIEjEKBWVycm9yGAUgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKTAwoRUmVhZENhbnZhc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARITCgZmb3JtYXQYCCABKAlIBIgBARIUCgdxdWFsaXR5GAkgASgFSAWIAQESDwoCc3gYCiABKAVIBogBARIPCgJzeRgLIAEoBUgHiAEBEg8KAnN3GAwgASgFSAiIAQESDwoCc2gYDSABKAVICYgBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCCQoHX2Zvcm1hdEIKCghfcXVhbGl0eUIFCgNfc3hCBQoDX3N5QgUKA19zd0IFCgNfc2gi1wEKElJlYWRDYW52YXNSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRITCgtkYXRhX2Jhc2U2NBgEIAEoCRINCgV3aWR0aBgFIAEoBRIOCgZoZWlnaHQYBiABKAUSFAoMb3JpZ2luX2NsZWFuGAcgASgIEjEKBWVycm9yGAggASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJkChNTb2x2ZUNhcHRjaGFSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgp0aW1lb3V0X21zGAMgASgFEhQKDHJldHJ5X2Ftb3VudBgEIAEoBSImChRTb2x2ZUNhcHRjaGFSZXNwb25zZRIOCgZyZXN1bHQYASABKAkiZQoJSWNlU2VydmVyEgwKBHVybHMYASADKAkSFQoIdXNlcm5hbWUYAiABKAlIAIgBARIXCgpjcmVkZW50aWFsGAMgASgJSAGIAQFCCwoJX3VzZXJuYW1lQg0KC19jcmVkZW50aWFsIj0KFkdldFN0cmVhbUNvbmZpZ1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkoKF0dldFN0cmVhbUNvbmZpZ1Jlc3BvbnNlEi8KC2ljZV9zZXJ2ZXJzGAEgAygLMhouYnJvd3NlcnNjYWxlLnYxLkljZVNlcnZlciJMChJTdGFydFN0cmVhbVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhEKCW9mZmVyX3NkcBgDIAEoCSKgAQoTU3RhcnRTdHJlYW1SZXNwb25zZRISCgphbnN3ZXJfc2RwGAEgASgJEicKCHZpZXdwb3J0GAIgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiOAoRU3RvcFN0cmVhbVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkMKDlNjcmlwdExvZ0VudHJ5Eg0KBWxldmVsGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDIkcKEFJ1blNjcmlwdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCSKFAQoRUnVuU2NyaXB0UmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkSDgoGcnVuX2lkGAMgASgJEiwKA2xvZxgEIAMoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeRIRCgl0cnVuY2F0ZWQYBSABKAgiSQoSU3RhcnRTY3JpcHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZzb3VyY2UYAyABKAkiJQoTU3RhcnRTY3JpcHRSZXNwb25zZRIOCgZydW5faWQYASABKAkiSQoSU3RvcFNjcmlwdHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZydW5faWQYAyABKAkiJgoTU3RvcFNjcmlwdHNSZXNwb25zZRIPCgdzdG9wcGVkGAEgASgFIi8KCVNjcmlwdFJ1bhIOCgZydW5faWQYASABKAkSEgoKcnVubmluZ19tcxgCIAEoAyI8ChVMaXN0U2NyaXB0UnVuc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkIKFkxpc3RTY3JpcHRSdW5zUmVzcG9uc2USKAoEcnVucxgBIAMoCzIaLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRSdW4iUAoZU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGcnVuX2lkGAMgASgJIkoKCVNjcmlwdExvZxIOCgZydW5faWQYASABKAkSLQoEbGluZRgCIAEoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeSJSCg5TY3JpcHRGaW5pc2hlZBIOCgZydW5faWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIOCgZyZXN1bHQYAyABKAkSDwoHc3RvcHBlZBgEIAEoCCKHAQoLU2NyaXB0RXZlbnQSKQoDbG9nGAEgASgLMhouYnJvd3NlcnNjYWxlLnYxLlNjcmlwdExvZ0gAEjMKCGZpbmlzaGVkGAIgASgLMh8uYnJvd3NlcnNjYWxlLnYxLlNjcmlwdEZpbmlzaGVkSAASDwoHZHJvcHBlZBgDIAEoBEIHCgVldmVudDLdKQoHQnJvd3NlchJMCghTZXRQcm94eRIgLmJyb3dzZXJzY2FsZS52MS5TZXRQcm94eVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJPCghHZXRQYWdlcxIgLmJyb3dzZXJzY2FsZS52MS5HZXRQYWdlc1JlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuR2V0UGFnZXNSZXNwb25zZRJPCghHZXRVc2FnZRIgLmJyb3dzZXJzY2FsZS52MS5HZXRVc2FnZVJlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuR2V0VXNhZ2VSZXNwb25zZRJPCghOYXZpZ2F0ZRIgLmJyb3dzZXJzY2FsZS52MS5OYXZpZ2F0ZVJlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuTmF2aWdhdGVSZXNwb25zZRJMCghMb2FkSFRNTBIgLmJyb3dzZXJzY2FsZS52MS5Mb2FkSFRNTFJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJPCghFdmFsdWF0ZRIgLmJyb3dzZXJzY2FsZS52MS5FdmFsdWF0ZVJlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuRXZhbHVhdGVSZXNwb25zZRJMCgpXYWl0Rm9yQW55EiEuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlQYXJhbXMaGy5icm93c2Vyc2NhbGUudjEuV2FpdFJlc3VsdBJZCgxTZWxlY3RPcHRpb24SJC5icm93c2Vyc2NhbGUudjEuU2VsZWN0T3B0aW9uUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5TZWxlY3RPcHRpb25SZXN1bHQSSwoIU2Nyb2xsVG8SIC5icm93c2Vyc2NhbGUudjEuU2Nyb2xsVG9SZXF1ZXN0Gh0uYnJvd3NlcnNjYWxlLnYxLlNjcm9sbFJlc3VsdBJFCgZNb3ZlVG8SHi5icm93c2Vyc2NhbGUudjEuTW92ZVRvUmVxdWVzdBobLmJyb3dzZXJzY2FsZS52MS5Nb3ZlUmVzdWx0EkQKBUNsaWNrEh0uYnJvd3NlcnNjYWxlLnYxLkNsaWNrUmVxdWVzdBocLmJyb3dzZXJzY2FsZS52MS5DbGlja1Jlc3VsdBJBCgREcmFnEhwuYnJvd3NlcnNjYWxlLnYxLkRyYWdSZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLkRyYWdSZXN1bHQSQQoERmlsbBIcLmJyb3dzZXJzY2FsZS52MS5GaWxsUmVxdWVzdBobLmJyb3dzZXJzY2FsZS52MS5GaWxsUmVzdWx0ElgKC0FkZFJlYWN0aW9uEiMuYnJvd3NlcnNjYWxlLnYxLkFkZFJlYWN0aW9uUmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5BZGRSZWFjdGlvblJlc3BvbnNlEmEKDlJlbW92ZVJlYWN0aW9uEiYuYnJvd3NlcnNjYWxlLnYxLlJlbW92ZVJlYWN0aW9uUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5SZW1vdmVSZWFjdGlvblJlc3BvbnNlEl4KDUxpc3RSZWFjdGlvbnMSJS5icm93c2Vyc2NhbGUudjEuTGlzdFJlYWN0aW9uc1JlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuTGlzdFJlYWN0aW9uc1Jlc3BvbnNlElQKDFNldEJsb2NrTGlzdBIkLmJyb3dzZXJzY2FsZS52MS5TZXRCbG9ja0xpc3RSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSWAoOU2V0U3RhdGljUGF0aHMSJi5icm93c2Vyc2NhbGUudjEuU2V0U3RhdGljUGF0aHNSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSagoRV2FpdEZvckFueVJlcXVlc3QSKS5icm93c2Vyc2NhbGUudjEuV2FpdEZvckFueVJlcXVlc3RSZXF1ZXN0GiouYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXF1ZXN0UmVzcG9uc2USbQoSV2FpdEZvckFueVJlc3BvbnNlEiouYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXNwb25zZVJlcXVlc3QaKy5icm93c2Vyc2NhbGUudjEuV2FpdEZvckFueVJlc3BvbnNlUmVzcG9uc2USXgoNTW9kaWZ5UmVxdWVzdBIlLmJyb3dzZXJzY2FsZS52MS5Nb2RpZnlSZXF1ZXN0UmVxdWVzdBomLmJyb3dzZXJzY2FsZS52MS5Nb2RpZnlSZXF1ZXN0UmVzcG9uc2USYgoTU3RhcnROZXR3b3JrQ2FwdHVyZRIrLmJyb3dzZXJzY2FsZS52MS5TdGFydE5ldHdvcmtDYXB0dXJlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0Em0KElN0b3BOZXR3b3JrQ2FwdHVyZRIqLmJyb3dzZXJzY2FsZS52MS5TdG9wTmV0d29ya0NhcHR1cmVSZXF1ZXN0GisuYnJvd3NlcnNjYWxlLnYxLlN0b3BOZXR3b3JrQ2FwdHVyZVJlc3BvbnNlEnEKFlN0cmVhbU5ldHdvcmtFeGNoYW5nZXMSLi5icm93c2Vyc2NhbGUudjEuU3RyZWFtTmV0d29ya0V4Y2hhbmdlc1JlcXVlc3QaJS5icm93c2Vyc2NhbGUudjEuTmV0d29ya0V4Y2hhbmdlRXZlbnQwARJVCgpHZXRDb29raWVzEiIuYnJvd3NlcnNjYWxlLnYxLkdldENvb2tpZXNSZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLkdldENvb2tpZXNSZXNwb25zZRJQCgpTZXRDb29raWVzEiIuYnJvd3NlcnNjYWxlLnYxLlNldENvb2tpZXNSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSVAoMQ2xlYXJDb29raWVzEiQuYnJvd3NlcnNjYWxlLnYxLkNsZWFyQ29va2llc1JlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJVCgpHZXRTdG9yYWdlEiIuYnJvd3NlcnNjYWxlLnYxLkdldFN0b3JhZ2VSZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLkdldFN0b3JhZ2VSZXNwb25zZRJQCgpTZXRTdG9yYWdlEiIuYnJvd3NlcnNjYWxlLnYxLlNldFN0b3JhZ2VSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSVAoMQ2xlYXJTdG9yYWdlEiQuYnJvd3NlcnNjYWxlLnYxLkNsZWFyU3RvcmFnZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJhCg5HZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXRBdXRoU2Vzc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0QXV0aFNlc3Npb25SZXNwb25zZRJYCg5TZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5TZXRBdXRoU2Vzc2lvblJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJJCgZHZXRET00SHi5icm93c2Vyc2NhbGUudjEuR2V0RE9NUmVxdWVzdBofLmJyb3dzZXJzY2FsZS52MS5HZXRET01SZXNwb25zZRJVCgpHZXRET01IYXNoEiIuYnJvd3NlcnNjYWxlLnYxLkdldERPTUhhc2hSZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLkdldERPTUhhc2hSZXNwb25zZRJhCg5HZXRPYnNlcnZhdGlvbhImLmJyb3dzZXJzY2FsZS52MS5HZXRPYnNlcnZhdGlvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0T2JzZXJ2YXRpb25SZXNwb25zZRJqChFJbnNwZWN0QXRQb3NpdGlvbhIpLmJyb3dzZXJzY2FsZS52MS5JbnNwZWN0QXRQb3NpdGlvblJlcXVlc3QaKi5icm93c2Vyc2NhbGUudjEuSW5zcGVjdEF0UG9zaXRpb25SZXNwb25zZRJWCg1IaWdobGlnaHROb2RlEiUuYnJvd3NlcnNjYWxlLnYxLkhpZ2hsaWdodE5vZGVSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSYQoOU3RhcnREb21NaXJyb3ISJi5icm93c2Vyc2NhbGUudjEuU3RhcnREb21NaXJyb3JSZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0RG9tTWlycm9yUmVzcG9uc2USVgoNU3RvcERvbU1pcnJvchIlLmJyb3dzZXJzY2FsZS52MS5TdG9wRG9tTWlycm9yUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EmEKDkdldERvbUNoaWxkcmVuEiYuYnJvd3NlcnNjYWxlLnYxLkdldERvbUNoaWxkcmVuUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5HZXREb21DaGlsZHJlblJlc3BvbnNlEl4KEVJlbGVhc2VEb21TdWJ0cmVlEikuYnJvd3NlcnNjYWxlLnYxLlJlbGVhc2VEb21TdWJ0cmVlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0El4KDVJldmVhbERvbU5vZGUSJS5icm93c2Vyc2NhbGUudjEuUmV2ZWFsRG9tTm9kZVJlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuUmV2ZWFsRG9tTm9kZVJlc3BvbnNlEmEKDkdldERvbVJldmlzaW9uEiYuYnJvd3NlcnNjYWxlLnYxLkdldERvbVJldmlzaW9uUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5HZXREb21SZXZpc2lvblJlc3BvbnNlElcKD1N0cmVhbURvbUV2ZW50cxInLmJyb3dzZXJzY2FsZS52MS5TdHJlYW1Eb21FdmVudHNSZXF1ZXN0GhkuYnJvd3NlcnNjYWxlLnYxLkRvbUV2ZW50MAESVQoKU2NyZWVuc2hvdBIiLmJyb3dzZXJzY2FsZS52MS5TY3JlZW5zaG90UmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5TY3JlZW5zaG90UmVzcG9uc2USVQoKUmVhZENhbnZhcxIiLmJyb3dzZXJzY2FsZS52MS5SZWFkQ2FudmFzUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5SZWFkQ2FudmFzUmVzcG9uc2USUAoKSW5zZXJ0VGV4dBIiLmJyb3dzZXJzY2FsZS52MS5JbnNlcnRUZXh0UmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EkQKBFR5cGUSHC5icm93c2Vyc2NhbGUudjEuVHlwZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJMCghQcmVzc0tleRIgLmJyb3dzZXJzY2FsZS52MS5QcmVzc0tleVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJQCgpSZWxlYXNlS2V5EiIuYnJvd3NlcnNjYWxlLnYxLlJlbGVhc2VLZXlSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSWwoMR2V0U2VsZWN0aW9uEiQuYnJvd3NlcnNjYWxlLnYxLkdldFNlbGVjdGlvblJlcXVlc3QaJS5icm93c2Vyc2NhbGUudjEuR2V0U2VsZWN0aW9uUmVzcG9uc2USWwoMU29sdmVDYXB0Y2hhEiQuYnJvd3NlcnNjYWxlLnYxLlNvbHZlQ2FwdGNoYVJlcXVlc3QaJS5icm93c2Vyc2NhbGUudjEuU29sdmVDYXB0Y2hhUmVzcG9uc2USZAoPR2V0U3RyZWFtQ29uZmlnEicuYnJvd3NlcnNjYWxlLnYxLkdldFN0cmVhbUNvbmZpZ1JlcXVlc3QaKC5icm93c2Vyc2NhbGUudjEuR2V0U3RyZWFtQ29uZmlnUmVzcG9uc2USWAoLU3RhcnRTdHJlYW0SIy5icm93c2Vyc2NhbGUudjEuU3RhcnRTdHJlYW1SZXF1ZXN0GiQuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0U3RyZWFtUmVzcG9uc2USUAoKU3RvcFN0cmVhbRIiLmJyb3dzZXJzY2FsZS52MS5TdG9wU3RyZWFtUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElIKCVJ1blNjcmlwdBIhLmJyb3dzZXJzY2FsZS52MS5SdW5TY3JpcHRSZXF1ZXN0GiIuYnJvd3NlcnNjYWxlLnYxLlJ1blNjcmlwdFJlc3BvbnNlElgKC1N0YXJ0U2NyaXB0EiMuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0U2NyaXB0UmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5TdGFydFNjcmlwdFJlc3BvbnNlElgKC1N0b3BTY3JpcHRzEiMuYnJvd3NlcnNjYWxlLnYxLlN0b3BTY3JpcHRzUmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5TdG9wU2NyaXB0c1Jlc3BvbnNlEmEKDkxpc3RTY3JpcHRSdW5zEiYuYnJvd3NlcnNjYWxlLnYxLkxpc3RTY3JpcHRSdW5zUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5MaXN0U2NyaXB0UnVuc1Jlc3BvbnNlEmAKElN0cmVhbVNjcmlwdEV2ZW50cxIqLmJyb3dzZXJzY2FsZS52MS5TdHJlYW1TY3JpcHRFdmVudHNSZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLlNjcmlwdEV2ZW50MAFCM1oxZ2l0aHViLmNvbS9icm93c2Vyc2NhbGUvYnJvd3NlcnNjYWxlLWdvL2dlbmVyYXRlZGIGcHJvdG8z", [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, 18);
3809
- var RemoveReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 20);
3810
- var ListReactionsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 22);
3811
- var SetProxyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 35);
3812
- var GetPagesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 36);
3813
- var NavigateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 38);
3814
- var LoadHTMLRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 40);
3815
- var EvaluateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 41);
3816
- var WaitForAnyParamsSchema = /* @__PURE__ */ messageDesc(file_wrc, 45);
3817
- var SelectOptionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 46);
3818
- var ScrollToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 47);
3819
- var MoveToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 48);
3820
- var ClickRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 49);
3821
- var DragRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 50);
3822
- var FillRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 51);
3823
- var SetBlockListRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 52);
3824
- var SetStaticPathsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 53);
3825
- var WaitForAnyRequestRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 54);
3826
- var WaitForAnyResponseRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 56);
3827
- var ModifyRequestRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 58);
3828
- var StartNetworkCaptureRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 60);
3829
- var StopNetworkCaptureRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 61);
3830
- var StreamNetworkExchangesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 63);
3831
- var GetCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 66);
3832
- var SetCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 68);
3833
- var ClearCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 69);
3834
- var StorageItemSchema = /* @__PURE__ */ messageDesc(file_wrc, 70);
3835
- var StorageOriginEntrySchema = /* @__PURE__ */ messageDesc(file_wrc, 71);
3836
- var GetStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 72);
3837
- var SetStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 74);
3838
- var ClearStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 75);
3839
- var DbscSessionSchema = /* @__PURE__ */ messageDesc(file_wrc, 76);
3840
- var AuthSessionSchema = /* @__PURE__ */ messageDesc(file_wrc, 77);
3841
- var GetAuthSessionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 78);
3842
- var SetAuthSessionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 80);
3843
- var GetDOMRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 81);
3844
- var GetObservationRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 83);
3845
- var GetDOMHashRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 85);
3846
- var StartDomMirrorRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 87);
3847
- var StopDomMirrorRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 89);
3848
- var GetDomChildrenRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 90);
3849
- var ReleaseDomSubtreeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 92);
3850
- var RevealDomNodeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 93);
3851
- var GetDomRevisionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 95);
3852
- var StreamDomEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 97);
3853
- var InspectAtPositionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 101);
3854
- var HighlightNodeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 103);
3855
- var InsertTextRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 104);
3856
- var TypeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 105);
3857
- var PressKeyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 106);
3858
- var ReleaseKeyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 107);
3859
- var GetSelectionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 108);
3860
- var ScreenshotRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 110);
3861
- var ReadCanvasRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 112);
3862
- var SolveCaptchaRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 114);
3863
- var GetStreamConfigRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 117);
3864
- var StartStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 119);
3865
- var StopStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 121);
3866
- var RunScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 124);
3867
- var StartScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 126);
3868
- var StopScriptsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 128);
3869
- var ListScriptRunsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 131);
3870
- var StreamScriptEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 133);
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 GetUsageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 41);
3814
+ var NavigateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 43);
3815
+ var LoadHTMLRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 45);
3816
+ var EvaluateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 46);
3817
+ var WaitForAnyParamsSchema = /* @__PURE__ */ messageDesc(file_wrc, 48);
3818
+ var SelectOptionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 49);
3819
+ var ScrollToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 50);
3820
+ var MoveToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 51);
3821
+ var ClickRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 52);
3822
+ var DragRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 53);
3823
+ var FillRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 54);
3824
+ var SetBlockListRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 55);
3825
+ var SetStaticPathsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 56);
3826
+ var WaitForAnyRequestRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 57);
3827
+ var WaitForAnyResponseRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 59);
3828
+ var ModifyRequestRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 61);
3829
+ var StartNetworkCaptureRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 63);
3830
+ var StopNetworkCaptureRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 64);
3831
+ var StreamNetworkExchangesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 66);
3832
+ var GetCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 69);
3833
+ var SetCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 71);
3834
+ var ClearCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 72);
3835
+ var StorageItemSchema = /* @__PURE__ */ messageDesc(file_wrc, 73);
3836
+ var StorageOriginEntrySchema = /* @__PURE__ */ messageDesc(file_wrc, 74);
3837
+ var GetStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 75);
3838
+ var SetStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 77);
3839
+ var ClearStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 78);
3840
+ var DbscSessionSchema = /* @__PURE__ */ messageDesc(file_wrc, 79);
3841
+ var AuthSessionSchema = /* @__PURE__ */ messageDesc(file_wrc, 80);
3842
+ var GetAuthSessionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 81);
3843
+ var SetAuthSessionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 83);
3844
+ var GetDOMRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 84);
3845
+ var GetObservationRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 86);
3846
+ var GetDOMHashRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 88);
3847
+ var StartDomMirrorRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 90);
3848
+ var StopDomMirrorRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 92);
3849
+ var GetDomChildrenRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 93);
3850
+ var ReleaseDomSubtreeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 95);
3851
+ var RevealDomNodeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 96);
3852
+ var GetDomRevisionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 98);
3853
+ var StreamDomEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 100);
3854
+ var InspectAtPositionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 104);
3855
+ var HighlightNodeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 106);
3856
+ var InsertTextRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 107);
3857
+ var TypeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 108);
3858
+ var PressKeyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 109);
3859
+ var ReleaseKeyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 110);
3860
+ var GetSelectionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 111);
3861
+ var ScreenshotRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 113);
3862
+ var ReadCanvasRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 115);
3863
+ var SolveCaptchaRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 117);
3864
+ var GetStreamConfigRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 120);
3865
+ var StartStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 122);
3866
+ var StopStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 124);
3867
+ var RunScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 126);
3868
+ var StartScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 128);
3869
+ var StopScriptsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 130);
3870
+ var ListScriptRunsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 133);
3871
+ var StreamScriptEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 135);
3871
3872
  var Browser = /* @__PURE__ */ serviceDesc(file_wrc, 0);
3872
3873
 
3873
- // src/defaults.ts
3874
- var DefaultWaitTimeoutMs = 3e4;
3875
- var DefaultVisible = true;
3876
- var DefaultSteadyMs = 500;
3877
-
3878
3874
  // src/errors.ts
3879
3875
  var BrowserScaleError = class extends Error {
3880
3876
  constructor(message, cause) {
@@ -3883,6 +3879,19 @@ var BrowserScaleError = class extends Error {
3883
3879
  this.name = "BrowserScaleError";
3884
3880
  }
3885
3881
  };
3882
+ function throwCommandError(command, error) {
3883
+ if (error) {
3884
+ throw new CommandError({ command, code: error.code, message: error.message });
3885
+ }
3886
+ }
3887
+ var CommandError = class extends BrowserScaleError {
3888
+ constructor(init) {
3889
+ super(formatMessage(init.command, init.code, init.message));
3890
+ this.name = "CommandError";
3891
+ this.command = init.command;
3892
+ this.code = init.code;
3893
+ }
3894
+ };
3886
3895
  var ClickError = class extends BrowserScaleError {
3887
3896
  constructor(init) {
3888
3897
  super(formatMessage("click", init.code, init.message));
@@ -3982,9 +3991,9 @@ var Locator = class _Locator {
3982
3991
  * Enforces or disables the visibility check for this Locator's wait
3983
3992
  * condition.
3984
3993
  *
3985
- * Pass `false` to opt out of the default `DefaultVisible` (true). Has
3986
- * no effect when used as an action target — actions never check
3987
- * visibility before dispatching.
3994
+ * Visibility is required by default, so pass `false` to wait for DOM
3995
+ * presence alone. Has no effect when used as an action target — actions
3996
+ * never check visibility before dispatching.
3988
3997
  *
3989
3998
  * @param v - true to require visibility, false to skip the check
3990
3999
  *
@@ -4000,9 +4009,9 @@ var Locator = class _Locator {
4000
4009
  * Requires the element to keep a stable position and size for at least
4001
4010
  * `ms` milliseconds before the wait matches.
4002
4011
  *
4003
- * Pass 0 to disable the default `DefaultSteadyMs` (500). Has no effect
4004
- * for js() expressions that return a non-Element value, nor when used
4005
- * as an action target.
4012
+ * Settling defaults to 500ms, so pass 0 to match the instant the element
4013
+ * is found. Has no effect for js() expressions that return a non-Element
4014
+ * value, nor when used as an action target.
4006
4015
  *
4007
4016
  * @param ms - steady-state duration in milliseconds; 0 disables
4008
4017
  *
@@ -4065,19 +4074,11 @@ var Locator = class _Locator {
4065
4074
  // ── Constructors (top-level functions re-export these) ──────────────
4066
4075
  /** @internal */
4067
4076
  static _css(selector) {
4068
- return new _Locator({
4069
- selector,
4070
- visibleFlag: DefaultVisible,
4071
- steadyMs: DefaultSteadyMs
4072
- });
4077
+ return new _Locator({ selector });
4073
4078
  }
4074
4079
  /** @internal */
4075
4080
  static _js(expression) {
4076
- return new _Locator({
4077
- jsExpression: expression,
4078
- visibleFlag: DefaultVisible,
4079
- steadyMs: DefaultSteadyMs
4080
- });
4081
+ return new _Locator({ jsExpression: expression });
4081
4082
  }
4082
4083
  /** @internal */
4083
4084
  static _node(backendNodeId) {
@@ -4260,6 +4261,7 @@ function waitConditionStatusFromProto(c) {
4260
4261
  }
4261
4262
  function unwrapWait(r) {
4262
4263
  const res = {
4264
+ success: r.success,
4263
4265
  index: r.index,
4264
4266
  frameId: r.frameId,
4265
4267
  backendNodeId: r.backendNodeId,
@@ -4299,6 +4301,17 @@ function pageInfoFromProto(p) {
4299
4301
  frameTree: p.frameTree ? frameInfoFromProto(p.frameTree) : {}
4300
4302
  };
4301
4303
  }
4304
+ function sessionUsageFromProto(u) {
4305
+ return {
4306
+ wallTime: u.wallTime,
4307
+ cpuTime: u.cpuTime,
4308
+ minMemory: u.minMemory,
4309
+ averageMemory: u.averageMemory,
4310
+ peakMemory: u.peakMemory,
4311
+ renderersUsed: u.renderersUsed,
4312
+ framesCreated: u.framesCreated
4313
+ };
4314
+ }
4302
4315
  function headerFromProto(h) {
4303
4316
  return { name: h.name, value: h.value };
4304
4317
  }
@@ -4558,8 +4571,9 @@ var NetworkCapture = class {
4558
4571
  * {@link CloudBrowser.stopNetworkCapture} instead: stop awaits the reader,
4559
4572
  * which cannot finish while the handler it called is still running.
4560
4573
  *
4561
- * @throws UNKNOWN_ERROR - the capture could not be disarmed; the local reader
4562
- * is shut down regardless
4574
+ * Rejects only on a transport failure, and the local reader is shut down
4575
+ * regardless. Disarming a capture that is not running is a no-op rather than a
4576
+ * failure, so there are no error codes to branch on.
4563
4577
  */
4564
4578
  async stop() {
4565
4579
  if (this.stopped) return;
@@ -4680,7 +4694,8 @@ var ScriptRun = class {
4680
4694
  *
4681
4695
  * @returns how the script ended
4682
4696
  *
4683
- * @throws UNKNOWN_ERROR - the outcome could not be observed
4697
+ * Rejects only on a transport failure - the connection dying, or the run being
4698
+ * abandoned. A script that threw is a normal outcome and arrives in the result.
4684
4699
  */
4685
4700
  async wait() {
4686
4701
  await this.endedPromise;
@@ -4698,8 +4713,8 @@ var ScriptRun = class {
4698
4713
  * at its next operation in the page. Either way the handler sees a `finished`
4699
4714
  * with `stopped` set, unless the local reader is torn down first.
4700
4715
  *
4701
- * @throws UNKNOWN_ERROR - the run could not be cancelled server-side; the
4702
- * local reader is detached regardless
4716
+ * Rejects only on a transport failure, and the local reader is detached
4717
+ * regardless. Cancelling a run that has already finished is a no-op.
4703
4718
  */
4704
4719
  async stop() {
4705
4720
  if (this.detached) return;
@@ -4874,6 +4889,14 @@ var DomMirror = class {
4874
4889
  * boundary was crossed; it is a child list like any other.
4875
4890
  *
4876
4891
  * @param depth levels below the node, default 1
4892
+ *
4893
+ * @throws not_mirrored - the page has no mirror, or the node's frame is not
4894
+ * part of the one it has; after a resync, fetch the current tree before
4895
+ * addressing nodes again
4896
+ * @throws mirror_failed - the subtree could not be serialized, usually a
4897
+ * document that went away mid-read
4898
+ *
4899
+ * @see {@link CommandError} for reading the code off the rejection
4877
4900
  */
4878
4901
  async expand(node2, depth) {
4879
4902
  if (this.stopped) return;
@@ -4899,6 +4922,13 @@ var DomMirror = class {
4899
4922
  *
4900
4923
  * Skipping this is not an error, it is a slow leak: the browser's revealed
4901
4924
  * set only grows, and eventually it is no longer filtering anything.
4925
+ *
4926
+ * @throws not_mirrored - the page has no mirror, or the node's frame is not
4927
+ * part of the one it has; this is what collapsing a node from a tree that has
4928
+ * since been resynced looks like, so fetch the current tree and address the
4929
+ * node again
4930
+ *
4931
+ * @see {@link CommandError} for reading the code off the rejection
4902
4932
  */
4903
4933
  async collapse(node2) {
4904
4934
  if (this.stopped) return;
@@ -4925,6 +4955,13 @@ var DomMirror = class {
4925
4955
  *
4926
4956
  * @returns the ancestor chain, the main document first, or an empty array if
4927
4957
  * the node is not on the page
4958
+ *
4959
+ * @throws not_mirrored - the page has no mirror, or the given frame is not part
4960
+ * of the one it has
4961
+ * @throws mirror_failed - the path could not be serialized, usually a document
4962
+ * that went away mid-read
4963
+ *
4964
+ * @see {@link CommandError} for reading the code off the rejection
4928
4965
  */
4929
4966
  async reveal(backendNodeId, frameId) {
4930
4967
  if (this.stopped) return [];
@@ -4960,6 +4997,11 @@ var DomMirror = class {
4960
4997
  * Throws away the local copy of the whole page and fetches a fresh one.
4961
4998
  * Happens automatically whenever the browser says the copy is void, so you
4962
4999
  * rarely need to call it.
5000
+ *
5001
+ * @throws mirror_failed - the page could not be serialized, usually a document
5002
+ * that went away while the tree was being rebuilt. The mirror then ends
5003
+ *
5004
+ * @see {@link CommandError} for reading the code off the rejection
4963
5005
  */
4964
5006
  async resync(reason = "manual") {
4965
5007
  if (this.stopped) return;
@@ -5299,15 +5341,25 @@ var CloudBrowser = class {
5299
5341
  * {@link createWebSocketBrowser} the rental stays untouched; only the
5300
5342
  * transport is closed.
5301
5343
  *
5302
- * @throws UNKNOWN_ERROR - the stop API or the transport close failed
5344
+ * @returns SessionUsage what the session consumed over its whole life, read
5345
+ * as it was torn down - no {@link CloudBrowser.getUsage} call is needed
5346
+ * before stopping. Undefined when the server could not report it, and for
5347
+ * a handle that owns no rental.
5348
+ *
5349
+ * Rejects only when the stop API or the transport close fails. The session is
5350
+ * released either way; retrying a stop is safe.
5303
5351
  *
5304
5352
  * @example
5305
- * await browser.stopBrowser();
5353
+ * const usage = await browser.stopBrowser();
5354
+ * if (usage) {
5355
+ * console.log(`ran ${usage.wallTime}s, ${usage.cpuTime}s CPU, peak ${usage.peakMemory} bytes`);
5356
+ * }
5306
5357
  */
5307
5358
  async stopBrowser() {
5308
5359
  if (this._stopFn) {
5309
- await this._stopFn();
5360
+ return await this._stopFn();
5310
5361
  }
5362
+ return void 0;
5311
5363
  }
5312
5364
  // ──────────────────────────────────────────────────────────────────
5313
5365
  // Context-level
@@ -5324,7 +5376,9 @@ var CloudBrowser = class {
5324
5376
  * @param proxyUsername - proxy auth user; empty for unauthenticated proxies
5325
5377
  * @param proxyPassword - proxy auth password; empty for unauthenticated proxies
5326
5378
  *
5327
- * @throws UNKNOWN_ERROR - the proxy could not be applied
5379
+ * Rejects only on a transport failure - a dead session, a page that is gone,
5380
+ * a broken connection. This call has no semantic failure of its own, so there
5381
+ * are no error codes to branch on.
5328
5382
  *
5329
5383
  * @example
5330
5384
  * await browser.setProxy("proxy.example.com", 8080, "user", "pass");
@@ -5340,7 +5394,8 @@ var CloudBrowser = class {
5340
5394
  if (proxyUsername) req.proxyUsername = proxyUsername;
5341
5395
  if (proxyPassword) req.proxyPassword = proxyPassword;
5342
5396
  }
5343
- await this.client.setProxy(req);
5397
+ const res = await this.client.setProxy(req);
5398
+ throwCommandError("setProxy", res.error);
5344
5399
  }
5345
5400
  /**
5346
5401
  * Returns all open pages (tabs and popups) for this session's browser
@@ -5352,7 +5407,9 @@ var CloudBrowser = class {
5352
5407
  *
5353
5408
  * @returns PageInfo[] for every page currently open in the context
5354
5409
  *
5355
- * @throws UNKNOWN_ERROR - the pages could not be enumerated
5410
+ * Rejects only on a transport failure - a dead session, a page that is gone,
5411
+ * a broken connection. This call has no semantic failure of its own, so there
5412
+ * are no error codes to branch on.
5356
5413
  *
5357
5414
  * @example
5358
5415
  * const pages = await browser.getPages();
@@ -5365,8 +5422,42 @@ var CloudBrowser = class {
5365
5422
  apiKey: this.apiKey
5366
5423
  })
5367
5424
  );
5425
+ throwCommandError("getPages", resp.error);
5368
5426
  return resp.pages.map(pageInfoFromProto);
5369
5427
  }
5428
+ /**
5429
+ * Reports what this session's browser has consumed so far.
5430
+ *
5431
+ * Everything but minMemory and averageMemory only ever grows, so polling and
5432
+ * diffing two readings gives the cost of what ran in between. The final
5433
+ * figures need no call of their own: {@link CloudBrowser.stopBrowser} resolves
5434
+ * with them.
5435
+ *
5436
+ * @returns SessionUsage as of now
5437
+ *
5438
+ * Rejects only on a transport failure - a dead session, a broken connection.
5439
+ * This call has no semantic failure of its own, so there are no error codes to
5440
+ * branch on.
5441
+ *
5442
+ * @example
5443
+ * const before = await browser.getUsage();
5444
+ * await browser.navigate("https://example.com");
5445
+ * const after = await browser.getUsage();
5446
+ * console.log(`navigation cost ${after.cpuTime - before.cpuTime}s of CPU`);
5447
+ */
5448
+ async getUsage() {
5449
+ const resp = await this.client.getUsage(
5450
+ create(GetUsageRequestSchema, {
5451
+ sessionId: this.sessionId,
5452
+ apiKey: this.apiKey
5453
+ })
5454
+ );
5455
+ throwCommandError("getUsage", resp.error);
5456
+ if (!resp.usage) {
5457
+ throw new BrowserScaleError("getUsage: the server sent no usage");
5458
+ }
5459
+ return sessionUsageFromProto(resp.usage);
5460
+ }
5370
5461
  // ──────────────────────────────────────────────────────────────────
5371
5462
  // Page navigation / content
5372
5463
  // ──────────────────────────────────────────────────────────────────
@@ -5383,7 +5474,16 @@ var CloudBrowser = class {
5383
5474
  * @returns NavigateResult with the final resolved URL and the frameId
5384
5475
  * of the main frame after navigation
5385
5476
  *
5386
- * @throws UNKNOWN_ERROR - the navigation failed or timed out
5477
+ * @throws timeout - nothing committed before the deadline; the page may still
5478
+ * be loading, so a longer timeout can be the whole fix
5479
+ * @throws net_error - the URL never loaded: DNS, TLS, a refused connection, or
5480
+ * a proxy that could not reach it. The message carries the underlying net
5481
+ * error name, which is what separates a bad proxy from a bad host - worth
5482
+ * logging, since the two need different fixes
5483
+ * @throws crashed - the renderer died mid-navigation; the page is unusable and
5484
+ * has to be navigated again
5485
+ *
5486
+ * @see {@link CommandError} for reading the code off the rejection
5387
5487
  *
5388
5488
  * @example
5389
5489
  * await browser.navigate("https://example.com");
@@ -5396,6 +5496,7 @@ var CloudBrowser = class {
5396
5496
  });
5397
5497
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
5398
5498
  const resp = await this.client.navigate(req);
5499
+ throwCommandError("navigate", resp.error);
5399
5500
  return { frameId: resp.frameId, url: resp.url };
5400
5501
  }
5401
5502
  /**
@@ -5410,7 +5511,11 @@ var CloudBrowser = class {
5410
5511
  * @param html - response body to serve
5411
5512
  * @param opts - optional headers and statusCode (default 200)
5412
5513
  *
5413
- * @throws UNKNOWN_ERROR - the interceptor could not be installed
5514
+ * @throws timeout - the page never requested the URL, so the prepared
5515
+ * response had nobody to hand it to; usually the navigation was cancelled
5516
+ * or redirected away before reaching it
5517
+ *
5518
+ * @see {@link CommandError} for reading the code off the rejection
5414
5519
  *
5415
5520
  * @example
5416
5521
  * await browser.loadHTML("https://example.com", "<h1>hi</h1>");
@@ -5425,7 +5530,8 @@ var CloudBrowser = class {
5425
5530
  headers: headersToProto(opts?.headers)
5426
5531
  });
5427
5532
  if (opts?.statusCode) req.statusCode = opts.statusCode;
5428
- await this.client.loadHTML(req);
5533
+ const res = await this.client.loadHTML(req);
5534
+ throwCommandError("loadHTML", res.error);
5429
5535
  }
5430
5536
  // ──────────────────────────────────────────────────────────────────
5431
5537
  // Evaluation
@@ -5442,16 +5548,34 @@ var CloudBrowser = class {
5442
5548
  * The generic T is a TypeScript hint only — there is no runtime
5443
5549
  * validation that the JS expression actually returned that type.
5444
5550
  *
5551
+ * A falsy answer and a broken expression are different outcomes. Returning
5552
+ * null, false or undefined is a successful evaluation and resolves normally;
5553
+ * an expression that throws or will not compile rejects with a
5554
+ * {@link CommandError}, so a typo can never read as "the page says null".
5555
+ *
5445
5556
  * @param expression - JavaScript expression evaluated in the main frame
5446
5557
  *
5447
5558
  * @returns EvaluateResult with either value (non-Element) or element
5448
5559
  * metadata (Element)
5449
5560
  *
5450
- * @throws UNKNOWN_ERROR - the expression threw or could not be compiled
5561
+ * @throws {@link CommandError} - code `"threw"` (the expression raised; the
5562
+ * message carries the exception text), `"not_run"` (it could not be
5563
+ * compiled, or execution never started), `"aborted"` (the browser stopped
5564
+ * execution) or `"no_context"` (the frame had no live script context)
5451
5565
  *
5452
5566
  * @example
5453
5567
  * const res = await browser.evaluate<string>("document.title");
5454
5568
  * console.log(res.value);
5569
+ *
5570
+ * @example
5571
+ * // Telling a false answer from a broken expression.
5572
+ * try {
5573
+ * const res = await browser.evaluate<boolean>("window.__ready === true");
5574
+ * if (!res.value) { /* legitimately not ready yet *\/ }
5575
+ * } catch (e) {
5576
+ * if (e instanceof CommandError) throw new Error(`expression broken: ${e.message}`);
5577
+ * throw e;
5578
+ * }
5455
5579
  */
5456
5580
  async evaluate(expression) {
5457
5581
  return this._evaluate("", expression);
@@ -5483,6 +5607,13 @@ var CloudBrowser = class {
5483
5607
  });
5484
5608
  if (frameId) req.frameId = frameId;
5485
5609
  const resp = await this.client.evaluate(req);
5610
+ if (resp.error) {
5611
+ throw new CommandError({
5612
+ command: "evaluate",
5613
+ code: resp.error.code,
5614
+ message: resp.error.message
5615
+ });
5616
+ }
5486
5617
  let value = null;
5487
5618
  if (resp.result !== "") {
5488
5619
  try {
@@ -5492,6 +5623,7 @@ var CloudBrowser = class {
5492
5623
  }
5493
5624
  }
5494
5625
  return {
5626
+ success: resp.success,
5495
5627
  value,
5496
5628
  backendNodeId: resp.backendNodeId,
5497
5629
  isVisible: resp.isVisible,
@@ -5579,7 +5711,8 @@ var CloudBrowser = class {
5579
5711
  sessionId: this.sessionId,
5580
5712
  apiKey: this.apiKey,
5581
5713
  conditions: pbConds,
5582
- timeout: opts?.timeoutMs ?? DefaultWaitTimeoutMs
5714
+ // Left unset unless the caller passed one, so the API applies its default.
5715
+ timeout: opts?.timeoutMs
5583
5716
  });
5584
5717
  if (frameId) req.frameId = frameId;
5585
5718
  return unwrapWait(await this.client.waitForAny(req));
@@ -5893,7 +6026,9 @@ var CloudBrowser = class {
5893
6026
  * @returns DOMResult with the JSON string in `.dom` (the `.hash` field
5894
6027
  * is populated by {@link getDOMHash}, not by this call)
5895
6028
  *
5896
- * @throws UNKNOWN_ERROR - the DOM could not be retrieved
6029
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6030
+ * a broken connection. This call has no semantic failure of its own, so there
6031
+ * are no error codes to branch on.
5897
6032
  *
5898
6033
  * @example
5899
6034
  * const { dom } = await browser.getDOM();
@@ -5906,6 +6041,7 @@ var CloudBrowser = class {
5906
6041
  if (frameId) req.frameId = frameId;
5907
6042
  if (opts?.depth !== void 0) req.depth = opts.depth;
5908
6043
  const resp = await this.client.getDOM(req);
6044
+ throwCommandError("getDOM", resp.error);
5909
6045
  return { hash: "", dom: resp.dom };
5910
6046
  }
5911
6047
  /**
@@ -5920,7 +6056,9 @@ var CloudBrowser = class {
5920
6056
  *
5921
6057
  * @returns 16-char hex string (the first 8 bytes of sha256 of the DOM JSON)
5922
6058
  *
5923
- * @throws UNKNOWN_ERROR - the hash could not be computed
6059
+ * Rejects only on a transport failure. The hash is computed from a serialized
6060
+ * tree, so there is no semantic failure of its own and no error codes to branch
6061
+ * on.
5924
6062
  *
5925
6063
  * @example
5926
6064
  * const hash = await browser.getDOMHash();
@@ -5968,7 +6106,11 @@ var CloudBrowser = class {
5968
6106
  *
5969
6107
  * @returns the observation in the requested format, ready to hand to a model
5970
6108
  *
5971
- * @throws UNKNOWN_ERROR - the observation could not be produced
6109
+ * @throws not_found - the requested scope root is not on the page, so there
6110
+ * was nothing to observe. Distinct from an observation that comes back
6111
+ * empty, which means the scope exists and holds nothing worth reporting
6112
+ *
6113
+ * @see {@link CommandError} for reading the code off the rejection
5972
6114
  *
5973
6115
  * @example
5974
6116
  * const obs = await browser.getObservation();
@@ -5992,6 +6134,7 @@ var CloudBrowser = class {
5992
6134
  if (opts?.jsExpression !== void 0) req.jsExpression = opts.jsExpression;
5993
6135
  if (opts?.frameId !== void 0) req.frameId = opts.frameId;
5994
6136
  const resp = await this.client.getObservation(req);
6137
+ throwCommandError("getObservation", resp.error);
5995
6138
  return resp.observation;
5996
6139
  }
5997
6140
  /**
@@ -6008,7 +6151,11 @@ var CloudBrowser = class {
6008
6151
  * @returns ScreenshotResult with the base64 image in `dataBase64` and the
6009
6152
  * physical pixel `width`/`height`
6010
6153
  *
6011
- * @throws UNKNOWN_ERROR - the screenshot could not be captured
6154
+ * @throws capture_failed - the page had no frame to copy. A page that has not
6155
+ * produced one yet, or is not being composited at the moment, has nothing to
6156
+ * hand over; retrying after it renders usually works
6157
+ *
6158
+ * @see {@link CommandError} for reading the code off the rejection
6012
6159
  *
6013
6160
  * @example
6014
6161
  * const shot = await browser.screenshot({ format: "png" });
@@ -6022,6 +6169,7 @@ var CloudBrowser = class {
6022
6169
  if (opts?.format !== void 0) req.format = opts.format;
6023
6170
  if (opts?.quality !== void 0) req.quality = opts.quality;
6024
6171
  const resp = await this.client.screenshot(req);
6172
+ throwCommandError("screenshot", resp.error);
6025
6173
  return {
6026
6174
  dataBase64: resp.dataBase64,
6027
6175
  width: resp.width,
@@ -6045,11 +6193,15 @@ var CloudBrowser = class {
6045
6193
  * canvas `width`/`height`, resolved `frameId`/`backendNodeId` and the
6046
6194
  * `originClean` flag
6047
6195
  *
6048
- * @throws INVALID_LOCATOR - target is empty, uses at(x,y), or has multiple targets
6049
- * @throws ELEMENT_NOT_FOUND - no element matched the locator
6050
- * @throws FRAME_NOT_FOUND - the requested frame does not exist
6051
- * @throws TIMEOUT - the operation exceeded the server-side timeout
6052
- * @throws PAGE_NOT_ALIVE - the page has been closed
6196
+ * @throws not_found - no element matched the locator
6197
+ * @throws not_element - the expression was truthy but did not yield an element
6198
+ * @throws not_readable - the target was found but is not a readable canvas
6199
+ *
6200
+ * A target that is empty, uses `at(x, y)` or names several things at once is
6201
+ * rejected before anything is sent. A closed page or a frame that is gone is a
6202
+ * transport failure rather than a code.
6203
+ *
6204
+ * @see {@link CommandError} for reading the code off the rejection
6053
6205
  *
6054
6206
  * @example
6055
6207
  * const res = await browser.readCanvas(css("#game canvas"));
@@ -6077,6 +6229,7 @@ var CloudBrowser = class {
6077
6229
  req.sh = opts.sh;
6078
6230
  }
6079
6231
  const resp = await this.client.readCanvas(req);
6232
+ throwCommandError("readCanvas", resp.error);
6080
6233
  return {
6081
6234
  success: resp.success,
6082
6235
  frameId: resp.frameId,
@@ -6100,7 +6253,9 @@ var CloudBrowser = class {
6100
6253
  *
6101
6254
  * @param patterns - URL wildcards to block; empty array clears the list
6102
6255
  *
6103
- * @throws UNKNOWN_ERROR - the blocklist could not be applied
6256
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6257
+ * a broken connection. This call has no semantic failure of its own, so there
6258
+ * are no error codes to branch on.
6104
6259
  *
6105
6260
  * @example
6106
6261
  * await browser.setBlockList([
@@ -6109,13 +6264,14 @@ var CloudBrowser = class {
6109
6264
  * ]);
6110
6265
  */
6111
6266
  async setBlockList(patterns) {
6112
- await this.client.setBlockList(
6267
+ const res = await this.client.setBlockList(
6113
6268
  create(SetBlockListRequestSchema, {
6114
6269
  sessionId: this.sessionId,
6115
6270
  apiKey: this.apiKey,
6116
6271
  patterns
6117
6272
  })
6118
6273
  );
6274
+ throwCommandError("setBlockList", res.error);
6119
6275
  }
6120
6276
  /**
6121
6277
  * Configures the session to serve cached static responses for requests
@@ -6129,13 +6285,15 @@ var CloudBrowser = class {
6129
6285
  * @param blobName - server-side identifier of the snapshot to serve from
6130
6286
  * @param patterns - URL wildcards to redirect to the cache; empty disables
6131
6287
  *
6132
- * @throws UNKNOWN_ERROR - the static paths could not be configured
6288
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6289
+ * a broken connection. This call has no semantic failure of its own, so there
6290
+ * are no error codes to branch on.
6133
6291
  *
6134
6292
  * @example
6135
6293
  * await browser.setStaticPaths("snap-2026-05", ["*.example.com/*"]);
6136
6294
  */
6137
6295
  async setStaticPaths(blobName, patterns) {
6138
- await this.client.setStaticPaths(
6296
+ const res = await this.client.setStaticPaths(
6139
6297
  create(SetStaticPathsRequestSchema, {
6140
6298
  sessionId: this.sessionId,
6141
6299
  apiKey: this.apiKey,
@@ -6143,6 +6301,7 @@ var CloudBrowser = class {
6143
6301
  patterns
6144
6302
  })
6145
6303
  );
6304
+ throwCommandError("setStaticPaths", res.error);
6146
6305
  }
6147
6306
  /**
6148
6307
  * Blocks until the next request whose URL matches one of the supplied
@@ -6159,7 +6318,12 @@ var CloudBrowser = class {
6159
6318
  * (the captured method/URL/headers/body; null if intercepted with
6160
6319
  * no body)
6161
6320
  *
6162
- * @throws UNKNOWN_ERROR - the wait timed out or no patterns were supplied
6321
+ * @throws timeout - no request matched any pattern before the deadline.
6322
+ * Nothing occurring is an answer, and it stays distinguishable from a
6323
+ * connection that died on the way. Supplying no patterns is a caller mistake
6324
+ * rather than an outcome, and rejects separately
6325
+ *
6326
+ * @see {@link CommandError} for reading the code off the rejection
6163
6327
  *
6164
6328
  * @example
6165
6329
  * const { index, request } = await browser.waitForAnyRequest(
@@ -6181,6 +6345,7 @@ var CloudBrowser = class {
6181
6345
  });
6182
6346
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
6183
6347
  const resp = await this.client.waitForAnyRequest(req);
6348
+ throwCommandError("waitForAnyRequest", resp.error);
6184
6349
  return {
6185
6350
  index: resp.index,
6186
6351
  request: interceptedRequestFromProto(resp.request)
@@ -6199,6 +6364,13 @@ var CloudBrowser = class {
6199
6364
  * @returns object with `index` (matched pattern index) and `response`
6200
6365
  * (the captured status/headers/body; null if no body was returned)
6201
6366
  *
6367
+ * @throws timeout - no response matched any pattern before the deadline.
6368
+ * Nothing occurring is an answer, and it stays distinguishable from a
6369
+ * connection that died on the way. Supplying no patterns is a caller mistake
6370
+ * rather than an outcome, and rejects separately
6371
+ *
6372
+ * @see {@link CommandError} for reading the code off the rejection
6373
+ *
6202
6374
  * @example
6203
6375
  * const { index, response } = await browser.waitForAnyResponse(
6204
6376
  * [{ url: "*\/api/login" }],
@@ -6219,6 +6391,7 @@ var CloudBrowser = class {
6219
6391
  });
6220
6392
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
6221
6393
  const resp = await this.client.waitForAnyResponse(req);
6394
+ throwCommandError("waitForAnyResponse", resp.error);
6222
6395
  return {
6223
6396
  index: resp.index,
6224
6397
  response: interceptedResponseFromProto(resp.response)
@@ -6240,7 +6413,10 @@ var CloudBrowser = class {
6240
6413
  * were actually sent on the wire after modifications were applied;
6241
6414
  * null when no request payload was reported
6242
6415
  *
6243
- * @throws UNKNOWN_ERROR - no matching request appeared within the timeout
6416
+ * @throws timeout - no matching request appeared before the deadline, so
6417
+ * nothing was modified
6418
+ *
6419
+ * @see {@link CommandError} for reading the code off the rejection
6244
6420
  *
6245
6421
  * @example
6246
6422
  * const req = await browser.modifyRequest("*\/api/me", {
@@ -6262,6 +6438,7 @@ var CloudBrowser = class {
6262
6438
  if (opts?.body) req.body = opts.body;
6263
6439
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
6264
6440
  const resp = await this.client.modifyRequest(req);
6441
+ throwCommandError("modifyRequest", resp.error);
6265
6442
  return interceptedRequestFromProto(resp.request);
6266
6443
  }
6267
6444
  // ──────────────────────────────────────────────────────────────────
@@ -6291,7 +6468,9 @@ var CloudBrowser = class {
6291
6468
  * @returns NetworkCapture handle for stopping the capture and inspecting how
6292
6469
  * it ended
6293
6470
  *
6294
- * @throws UNKNOWN_ERROR - the capture could not be started
6471
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6472
+ * a broken connection. This call has no semantic failure of its own, so there
6473
+ * are no error codes to branch on.
6295
6474
  *
6296
6475
  * @example
6297
6476
  * const capture = await browser.captureNetwork(
@@ -6325,10 +6504,12 @@ var CloudBrowser = class {
6325
6504
  *
6326
6505
  * @param opts - which requests to capture and whether to keep bodies
6327
6506
  *
6328
- * @throws UNKNOWN_ERROR - the capture could not be started
6507
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6508
+ * a broken connection. This call has no semantic failure of its own, so there
6509
+ * are no error codes to branch on.
6329
6510
  */
6330
6511
  async startNetworkCapture(opts) {
6331
- await this.client.startNetworkCapture(
6512
+ const res = await this.client.startNetworkCapture(
6332
6513
  create(StartNetworkCaptureRequestSchema, {
6333
6514
  sessionId: this.sessionId,
6334
6515
  apiKey: this.apiKey,
@@ -6337,13 +6518,15 @@ var CloudBrowser = class {
6337
6518
  bodyPatterns: opts.bodyPatterns ?? []
6338
6519
  })
6339
6520
  );
6521
+ throwCommandError("startNetworkCapture", res.error);
6340
6522
  }
6341
6523
  /**
6342
6524
  * Disarms the session's capture.
6343
6525
  *
6344
6526
  * @returns whether a capture was running
6345
6527
  *
6346
- * @throws UNKNOWN_ERROR - the capture could not be stopped
6528
+ * Rejects only on a transport failure. Stopping a capture that is not running
6529
+ * is a no-op rather than a failure, so there are no error codes to branch on.
6347
6530
  */
6348
6531
  async stopNetworkCapture() {
6349
6532
  const resp = await this.client.stopNetworkCapture(
@@ -6352,6 +6535,7 @@ var CloudBrowser = class {
6352
6535
  apiKey: this.apiKey
6353
6536
  })
6354
6537
  );
6538
+ throwCommandError("stopNetworkCapture", resp.error);
6355
6539
  return resp.stopped;
6356
6540
  }
6357
6541
  /**
@@ -6368,7 +6552,8 @@ var CloudBrowser = class {
6368
6552
  * @returns NetworkCapture attached to whatever capture is running; onExchange
6369
6553
  * simply never fires when none is
6370
6554
  *
6371
- * @throws UNKNOWN_ERROR - the subscription could not be opened
6555
+ * Rejects only on a transport failure: opening the subscription has no semantic
6556
+ * failure of its own.
6372
6557
  */
6373
6558
  async streamNetworkExchanges(onExchange) {
6374
6559
  return this.subscribeNetworkExchanges(onExchange);
@@ -6454,7 +6639,10 @@ var CloudBrowser = class {
6454
6639
  * @param onResync called when the copy had to be rebuilt, after the new tree
6455
6640
  * is in place. Rebuilding is automatic; this is for telling the user why
6456
6641
  * their expanded nodes collapsed.
6457
- * @throws UNKNOWN_ERROR - the mirror could not be started
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
6458
6646
  */
6459
6647
  async mirrorDom(opts, onChange, onResync) {
6460
6648
  const abort = new AbortController();
@@ -6504,6 +6692,11 @@ var CloudBrowser = class {
6504
6692
  * Starts (or restarts) the page's mirror and returns the main document,
6505
6693
  * without subscribing to changes. {@link CloudBrowser.mirrorDom} is what you
6506
6694
  * normally want; this is the raw command.
6695
+ *
6696
+ * @throws mirror_failed - the page could not be serialized, usually a document
6697
+ * that went away while the tree was being built. No mirror is left running
6698
+ *
6699
+ * @see {@link CommandError} for reading the code off the rejection
6507
6700
  */
6508
6701
  async startDomMirror(opts = {}) {
6509
6702
  const req = create(StartDomMirrorRequestSchema, {
@@ -6513,6 +6706,7 @@ var CloudBrowser = class {
6513
6706
  if (opts.depth !== void 0) req.depth = opts.depth;
6514
6707
  if (opts.pierce !== void 0) req.pierce = opts.pierce;
6515
6708
  const resp = await this.client.startDomMirror(req);
6709
+ throwCommandError("startDomMirror", resp.error);
6516
6710
  return {
6517
6711
  root: resp.root,
6518
6712
  frameId: resp.frameId,
@@ -6521,12 +6715,13 @@ var CloudBrowser = class {
6521
6715
  }
6522
6716
  /** Stops the page's mirror, every frame of it. Idempotent. */
6523
6717
  async stopDomMirror() {
6524
- await this.client.stopDomMirror(
6718
+ const res = await this.client.stopDomMirror(
6525
6719
  create(StopDomMirrorRequestSchema, {
6526
6720
  sessionId: this.sessionId,
6527
6721
  apiKey: this.apiKey
6528
6722
  })
6529
6723
  );
6724
+ throwCommandError("stopDomMirror", res.error);
6530
6725
  }
6531
6726
  /**
6532
6727
  * Fetches a node's children and starts reporting changes inside them.
@@ -6534,6 +6729,17 @@ var CloudBrowser = class {
6534
6729
  *
6535
6730
  * On an `<iframe>` the one child is the document it hosts, and this call is
6536
6731
  * what starts mirroring that frame.
6732
+ *
6733
+ * An id that is simply unknown is not a failure: the call resolves with an
6734
+ * empty result.
6735
+ *
6736
+ * @throws not_mirrored - the page has no mirror, or frameId is not part of the
6737
+ * one it has; start a mirror first, and after a resync fetch the current tree
6738
+ * before addressing nodes again
6739
+ * @throws mirror_failed - the subtree could not be serialized, usually a
6740
+ * document that went away mid-read
6741
+ *
6742
+ * @see {@link CommandError} for reading the code off the rejection
6537
6743
  */
6538
6744
  async getDomChildren(backendNodeId, frameId = "", depth) {
6539
6745
  const req = create(GetDomChildrenRequestSchema, {
@@ -6544,11 +6750,19 @@ var CloudBrowser = class {
6544
6750
  if (frameId) req.frameId = frameId;
6545
6751
  if (depth !== void 0) req.depth = depth;
6546
6752
  const resp = await this.client.getDomChildren(req);
6753
+ throwCommandError("getDomChildren", resp.error);
6547
6754
  return { children: resp.children, seq: Number(resp.seq) };
6548
6755
  }
6549
6756
  /**
6550
6757
  * Stops reporting changes inside a node, and inside any frame below it.
6551
6758
  * {@link DomMirror.collapse} calls this.
6759
+ *
6760
+ * @throws not_mirrored - the page has no mirror, or frameId is not part of
6761
+ * the one it has; this is what replaying ids from a tree that has since
6762
+ * been resynced looks like, so fetch the current tree and address the node
6763
+ * again
6764
+ *
6765
+ * @see {@link CommandError} for reading the code off the rejection
6552
6766
  */
6553
6767
  async releaseDomSubtree(backendNodeId, frameId = "") {
6554
6768
  const req = create(ReleaseDomSubtreeRequestSchema, {
@@ -6557,13 +6771,24 @@ var CloudBrowser = class {
6557
6771
  backendNodeId
6558
6772
  });
6559
6773
  if (frameId) req.frameId = frameId;
6560
- await this.client.releaseDomSubtree(req);
6774
+ const res = await this.client.releaseDomSubtree(req);
6775
+ throwCommandError("releaseDomSubtree", res.error);
6561
6776
  }
6562
6777
  /**
6563
6778
  * Returns the chain from the main document down to a node, each ancestor
6564
6779
  * with its own children, crossing into frames where it has to and starting
6565
6780
  * the ones it passes through. {@link DomMirror.reveal} calls this and
6566
6781
  * splices it in.
6782
+ *
6783
+ * An id that is simply unknown is not a failure: the call resolves with an
6784
+ * empty result.
6785
+ *
6786
+ * @throws not_mirrored - the page has no mirror, or frameId is not part of the
6787
+ * one it has
6788
+ * @throws mirror_failed - the path could not be serialized, usually a document
6789
+ * that went away mid-read
6790
+ *
6791
+ * @see {@link CommandError} for reading the code off the rejection
6567
6792
  */
6568
6793
  async revealDomNode(backendNodeId, frameId = "") {
6569
6794
  const req = create(RevealDomNodeRequestSchema, {
@@ -6573,6 +6798,7 @@ var CloudBrowser = class {
6573
6798
  });
6574
6799
  if (frameId) req.frameId = frameId;
6575
6800
  const resp = await this.client.revealDomNode(req);
6801
+ throwCommandError("revealDomNode", resp.error);
6576
6802
  return { path: resp.path, seq: Number(resp.seq) };
6577
6803
  }
6578
6804
  /**
@@ -6584,6 +6810,10 @@ var CloudBrowser = class {
6584
6810
  * whole tree just to hash it. The two answer different questions: a hash
6585
6811
  * compares content, a revision only says whether this document moved since
6586
6812
  * you last asked.
6813
+ *
6814
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6815
+ * a broken connection. This call has no semantic failure of its own, so there
6816
+ * are no error codes to branch on.
6587
6817
  */
6588
6818
  async getDomRevision(frameId = "") {
6589
6819
  const req = create(GetDomRevisionRequestSchema, {
@@ -6592,6 +6822,7 @@ var CloudBrowser = class {
6592
6822
  });
6593
6823
  if (frameId) req.frameId = frameId;
6594
6824
  const resp = await this.client.getDomRevision(req);
6825
+ throwCommandError("getDomRevision", resp.error);
6595
6826
  return Number(resp.revision);
6596
6827
  }
6597
6828
  // ──────────────────────────────────────────────────────────────────
@@ -6602,7 +6833,9 @@ var CloudBrowser = class {
6602
6833
  *
6603
6834
  * @returns CookieParam[], one per cookie in the context
6604
6835
  *
6605
- * @throws UNKNOWN_ERROR - the cookies could not be read
6836
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6837
+ * a broken connection. This call has no semantic failure of its own, so there
6838
+ * are no error codes to branch on.
6606
6839
  *
6607
6840
  * @example
6608
6841
  * const cookies = await browser.getCookies();
@@ -6615,6 +6848,7 @@ var CloudBrowser = class {
6615
6848
  apiKey: this.apiKey
6616
6849
  })
6617
6850
  );
6851
+ throwCommandError("getCookies", resp.error);
6618
6852
  return resp.cookies.map(cookieParamFromProto);
6619
6853
  }
6620
6854
  /**
@@ -6625,7 +6859,9 @@ var CloudBrowser = class {
6625
6859
  *
6626
6860
  * @param cookies - cookies to write; empty array is a no-op
6627
6861
  *
6628
- * @throws UNKNOWN_ERROR - the cookies could not be written
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.
6629
6865
  *
6630
6866
  * @example
6631
6867
  * await browser.setCookies([
@@ -6633,29 +6869,33 @@ var CloudBrowser = class {
6633
6869
  * ]);
6634
6870
  */
6635
6871
  async setCookies(cookies) {
6636
- await this.client.setCookies(
6872
+ const res = await this.client.setCookies(
6637
6873
  create(SetCookiesRequestSchema, {
6638
6874
  sessionId: this.sessionId,
6639
6875
  apiKey: this.apiKey,
6640
6876
  cookies: cookieParamsToProto(cookies)
6641
6877
  })
6642
6878
  );
6879
+ throwCommandError("setCookies", res.error);
6643
6880
  }
6644
6881
  /**
6645
6882
  * Deletes every cookie in the browser context.
6646
6883
  *
6647
- * @throws UNKNOWN_ERROR - the cookies could not be cleared
6884
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6885
+ * a broken connection. This call has no semantic failure of its own, so there
6886
+ * are no error codes to branch on.
6648
6887
  *
6649
6888
  * @example
6650
6889
  * await browser.clearCookies();
6651
6890
  */
6652
6891
  async clearCookies() {
6653
- await this.client.clearCookies(
6892
+ const res = await this.client.clearCookies(
6654
6893
  create(ClearCookiesRequestSchema, {
6655
6894
  sessionId: this.sessionId,
6656
6895
  apiKey: this.apiKey
6657
6896
  })
6658
6897
  );
6898
+ throwCommandError("clearCookies", res.error);
6659
6899
  }
6660
6900
  // ──────────────────────────────────────────────────────────────────
6661
6901
  // Storage (localStorage)
@@ -6673,7 +6913,9 @@ var CloudBrowser = class {
6673
6913
  *
6674
6914
  * @returns StorageOriginEntry[], one per origin with localStorage data
6675
6915
  *
6676
- * @throws UNKNOWN_ERROR - the storage could not be read
6916
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6917
+ * a broken connection. This call has no semantic failure of its own, so there
6918
+ * are no error codes to branch on.
6677
6919
  *
6678
6920
  * @example
6679
6921
  * const storage = await browser.getStorage();
@@ -6688,6 +6930,7 @@ var CloudBrowser = class {
6688
6930
  });
6689
6931
  if (origin) req.origin = origin;
6690
6932
  const resp = await this.client.getStorage(req);
6933
+ throwCommandError("getStorage", resp.error);
6691
6934
  return resp.storage.map(storageEntryFromProto);
6692
6935
  }
6693
6936
  /**
@@ -6701,7 +6944,9 @@ var CloudBrowser = class {
6701
6944
  *
6702
6945
  * @param storage - entries to write, grouped by origin
6703
6946
  *
6704
- * @throws UNKNOWN_ERROR - the storage could not be written
6947
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6948
+ * a broken connection. This call has no semantic failure of its own, so there
6949
+ * are no error codes to branch on.
6705
6950
  *
6706
6951
  * @example
6707
6952
  * await browser.setStorage([
@@ -6715,13 +6960,14 @@ var CloudBrowser = class {
6715
6960
  * ]);
6716
6961
  */
6717
6962
  async setStorage(storage) {
6718
- await this.client.setStorage(
6963
+ const res = await this.client.setStorage(
6719
6964
  create(SetStorageRequestSchema, {
6720
6965
  sessionId: this.sessionId,
6721
6966
  apiKey: this.apiKey,
6722
6967
  storage: storageEntriesToProto(storage)
6723
6968
  })
6724
6969
  );
6970
+ throwCommandError("setStorage", res.error);
6725
6971
  }
6726
6972
  /**
6727
6973
  * Deletes localStorage in the browser context.
@@ -6729,7 +6975,9 @@ var CloudBrowser = class {
6729
6975
  * @param origin - if set, only this origin's storage is deleted
6730
6976
  * (e.g. "https://example.com"); omit to delete all origins
6731
6977
  *
6732
- * @throws UNKNOWN_ERROR - the storage could not be cleared
6978
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6979
+ * a broken connection. This call has no semantic failure of its own, so there
6980
+ * are no error codes to branch on.
6733
6981
  *
6734
6982
  * @example
6735
6983
  * // Wipe one origin.
@@ -6744,7 +6992,8 @@ var CloudBrowser = class {
6744
6992
  apiKey: this.apiKey
6745
6993
  });
6746
6994
  if (origin) req.origin = origin;
6747
- await this.client.clearStorage(req);
6995
+ const res = await this.client.clearStorage(req);
6996
+ throwCommandError("clearStorage", res.error);
6748
6997
  }
6749
6998
  // ──────────────────────────────────────────────────────────────────
6750
6999
  // Auth / DBSC (portable signed-in persona)
@@ -6759,7 +7008,9 @@ var CloudBrowser = class {
6759
7008
  *
6760
7009
  * @returns AuthSession, or undefined when there is nothing to export
6761
7010
  *
6762
- * @throws UNKNOWN_ERROR - the auth session could not be read
7011
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7012
+ * a broken connection. This call has no semantic failure of its own, so there
7013
+ * are no error codes to branch on.
6763
7014
  *
6764
7015
  * @example
6765
7016
  * const auth = await browser.getAuthSession();
@@ -6772,6 +7023,7 @@ var CloudBrowser = class {
6772
7023
  apiKey: this.apiKey
6773
7024
  })
6774
7025
  );
7026
+ throwCommandError("getAuthSession", resp.error);
6775
7027
  return resp.session ? authSessionFromProto(resp.session) : void 0;
6776
7028
  }
6777
7029
  /**
@@ -6783,20 +7035,23 @@ var CloudBrowser = class {
6783
7035
  *
6784
7036
  * @param session - session as returned by getAuthSession()
6785
7037
  *
6786
- * @throws UNKNOWN_ERROR - the auth session could not be written
7038
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7039
+ * a broken connection. This call has no semantic failure of its own, so there
7040
+ * are no error codes to branch on.
6787
7041
  *
6788
7042
  * @example
6789
7043
  * await browser.setAuthSession(saved);
6790
7044
  * await browser.navigate("https://mail.google.com");
6791
7045
  */
6792
7046
  async setAuthSession(session) {
6793
- await this.client.setAuthSession(
7047
+ const res = await this.client.setAuthSession(
6794
7048
  create(SetAuthSessionRequestSchema, {
6795
7049
  sessionId: this.sessionId,
6796
7050
  apiKey: this.apiKey,
6797
7051
  session: authSessionToProto(session)
6798
7052
  })
6799
7053
  );
7054
+ throwCommandError("setAuthSession", res.error);
6800
7055
  }
6801
7056
  // ──────────────────────────────────────────────────────────────────
6802
7057
  // Devtools / live-UI helpers
@@ -6816,7 +7071,9 @@ var CloudBrowser = class {
6816
7071
  * @returns InspectResult with the resolved backendNodeId, frameId, tag
6817
7072
  * name, trimmed textContent, visibility and bounds
6818
7073
  *
6819
- * @throws UNKNOWN_ERROR - the hit-test failed
7074
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7075
+ * a broken connection. This call has no semantic failure of its own, so there
7076
+ * are no error codes to branch on.
6820
7077
  *
6821
7078
  * @example
6822
7079
  * const r = await browser.inspectAtPosition(200, 300);
@@ -6831,6 +7088,7 @@ var CloudBrowser = class {
6831
7088
  y
6832
7089
  })
6833
7090
  );
7091
+ throwCommandError("inspectAtPosition", resp.error);
6834
7092
  return {
6835
7093
  backendNodeId: resp.backendNodeId,
6836
7094
  frameId: resp.frameId,
@@ -6850,7 +7108,9 @@ var CloudBrowser = class {
6850
7108
  * @param frameId - id of the frame the node lives in; empty string
6851
7109
  * targets the main frame
6852
7110
  *
6853
- * @throws UNKNOWN_ERROR - the highlight could not be applied
7111
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7112
+ * a broken connection. This call has no semantic failure of its own, so there
7113
+ * are no error codes to branch on.
6854
7114
  *
6855
7115
  * @example
6856
7116
  * await browser.highlightNode(res.backendNodeId, res.frameId);
@@ -6862,7 +7122,8 @@ var CloudBrowser = class {
6862
7122
  backendNodeId
6863
7123
  });
6864
7124
  if (frameId) req.frameId = frameId;
6865
- await this.client.highlightNode(req);
7125
+ const res = await this.client.highlightNode(req);
7126
+ throwCommandError("highlight", res.error);
6866
7127
  }
6867
7128
  /**
6868
7129
  * Pastes text at the current caret using IME-style input.
@@ -6874,19 +7135,24 @@ var CloudBrowser = class {
6874
7135
  *
6875
7136
  * @param text - the text to insert at the caret
6876
7137
  *
6877
- * @throws UNKNOWN_ERROR - the text could not be inserted
7138
+ * @throws no_focus - nothing in the page holds focus, so there is no caret to
7139
+ * insert at; click the field first
7140
+ * @throws busy - another action is already running on this page
7141
+ *
7142
+ * @see {@link CommandError} for reading the code off the rejection
6878
7143
  *
6879
7144
  * @example
6880
7145
  * await browser.insertText("hello world");
6881
7146
  */
6882
7147
  async insertText(text) {
6883
- await this.client.insertText(
7148
+ const res = await this.client.insertText(
6884
7149
  create(InsertTextRequestSchema, {
6885
7150
  sessionId: this.sessionId,
6886
7151
  apiKey: this.apiKey,
6887
7152
  text
6888
7153
  })
6889
7154
  );
7155
+ throwCommandError("insertText", res.error);
6890
7156
  }
6891
7157
  /**
6892
7158
  * Types `text` into the currently focused element as a per-key stream of real
@@ -6908,7 +7174,10 @@ var CloudBrowser = class {
6908
7174
  * @param opts - optional: `clearFirst` clears the focused field (Ctrl+A,
6909
7175
  * Delete) before typing
6910
7176
  *
6911
- * @throws UNKNOWN_ERROR - the page/context was torn down mid-stream
7177
+ * `type` has no semantic failure of its own: the keys land wherever focus
7178
+ * happens to be, so there is no target it can miss. Only the page or context
7179
+ * being torn down mid-stream surfaces, and that is a transport failure rather
7180
+ * than a code.
6912
7181
  *
6913
7182
  * @example
6914
7183
  * // OTP field that auto-advances across boxes.
@@ -6922,7 +7191,7 @@ var CloudBrowser = class {
6922
7191
  text
6923
7192
  });
6924
7193
  if (opts?.clearFirst) req.clearFirst = true;
6925
- await this.client.type(req);
7194
+ throwCommandError("type", (await this.client.type(req)).error);
6926
7195
  }
6927
7196
  /**
6928
7197
  * Fires a single key-down event.
@@ -6937,7 +7206,11 @@ var CloudBrowser = class {
6937
7206
  * `modifiers` (bit-flag: Alt=1, Ctrl=2, Meta=4, Shift=8),
6938
7207
  * `location` (0=standard, 1=left, 2=right, 3=numpad)
6939
7208
  *
6940
- * @throws UNKNOWN_ERROR - the event could not be dispatched
7209
+ * @throws no_focus - nothing in the page holds focus, so the key has nowhere
7210
+ * to go; click the field first
7211
+ * @throws busy - another action is already running on this page
7212
+ *
7213
+ * @see {@link CommandError} for reading the code off the rejection
6941
7214
  *
6942
7215
  * @example
6943
7216
  * // Ctrl+A
@@ -6953,7 +7226,8 @@ var CloudBrowser = class {
6953
7226
  if (opts?.code) req.code = opts.code;
6954
7227
  if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
6955
7228
  if (opts?.location !== void 0) req.location = opts.location;
6956
- await this.client.pressKey(req);
7229
+ const res = await this.client.pressKey(req);
7230
+ throwCommandError("pressKey", res.error);
6957
7231
  }
6958
7232
  /**
6959
7233
  * Fires a single key-up event.
@@ -6976,7 +7250,8 @@ var CloudBrowser = class {
6976
7250
  if (opts?.code) req.code = opts.code;
6977
7251
  if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
6978
7252
  if (opts?.location !== void 0) req.location = opts.location;
6979
- await this.client.releaseKey(req);
7253
+ const res = await this.client.releaseKey(req);
7254
+ throwCommandError("releaseKey", res.error);
6980
7255
  }
6981
7256
  /**
6982
7257
  * Returns the current text selection.
@@ -6987,7 +7262,9 @@ var CloudBrowser = class {
6987
7262
  *
6988
7263
  * @returns the selected text, or `""` when nothing is selected
6989
7264
  *
6990
- * @throws UNKNOWN_ERROR - the selection could not be read
7265
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7266
+ * a broken connection. This call has no semantic failure of its own, so there
7267
+ * are no error codes to branch on.
6991
7268
  *
6992
7269
  * @example
6993
7270
  * const sel = await browser.getSelection();
@@ -7000,32 +7277,35 @@ var CloudBrowser = class {
7000
7277
  apiKey: this.apiKey
7001
7278
  })
7002
7279
  );
7280
+ throwCommandError("getSelection", resp.error);
7003
7281
  return resp.text;
7004
7282
  }
7005
7283
  // ──────────────────────────────────────────────────────────────────
7006
7284
  // Captcha solver
7007
7285
  // ──────────────────────────────────────────────────────────────────
7008
7286
  /**
7009
- * Detects and solves the first supported bot-challenge it finds
7010
- * anywhere on the page.
7011
- *
7012
- * Detection covers the common challenge types you run into in the
7013
- * wild. The challenge is completed in-page server-side (the resulting
7014
- * token / bypass cookies are wired into the page automatically), so
7015
- * callers can ignore the returned string.
7016
- *
7017
- * @param opts - optional `timeoutMs` (how long to wait for a captcha to
7018
- * appear; omit for server default 60s) and `retryAmount` (failures
7019
- * tolerated before giving up)
7020
- *
7021
- * @returns empty string on success — the solution is applied server-side
7022
- *
7023
- * @throws UNKNOWN_ERROR - no captcha appeared within timeoutMs, or the
7024
- * detected captcha could not be solved within retryAmount attempts
7025
- *
7026
- * @example
7027
- * await browser.solveCaptcha({ retryAmount: 2 });
7028
- */
7287
+ * Detects and solves the first supported bot-challenge it finds
7288
+ * anywhere on the page.
7289
+ *
7290
+ * Detection covers the common challenge types you run into in the
7291
+ * wild. The challenge is completed in-page server-side (the resulting
7292
+ * token / bypass cookies are wired into the page automatically), so
7293
+ * callers can ignore the returned string.
7294
+ *
7295
+ * @param opts - optional `timeoutMs` (how long to wait for a captcha to
7296
+ * appear; omit for server default 60s) and `retryAmount` (failures
7297
+ * tolerated before giving up)
7298
+ *
7299
+ * @returns empty string on success — the solution is applied server-side
7300
+ *
7301
+ * Rejects when no captcha appeared within imeoutMs, or when the one that did
7302
+ * could not be solved within
7303
+ etryAmount attempts. Neither carries a code:
7304
+ * solving runs outside the page, so there is no per-command code set here.
7305
+ *
7306
+ * @example
7307
+ * await browser.solveCaptcha({ retryAmount: 2 });
7308
+ */
7029
7309
  async solveCaptcha(opts) {
7030
7310
  const resp = await this.client.solveCaptcha(
7031
7311
  create(SolveCaptchaRequestSchema, {
@@ -7051,7 +7331,8 @@ var CloudBrowser = class {
7051
7331
  *
7052
7332
  * @returns the ICE servers for the client `RTCPeerConnection`
7053
7333
  *
7054
- * @throws UNKNOWN_ERROR - TURN is not configured on the server
7334
+ * Rejects when TURN is not configured on the server. That is a deployment
7335
+ * condition rather than a per-call outcome, so it carries no code.
7055
7336
  *
7056
7337
  * @example
7057
7338
  * const ice = await browser.getStreamConfig();
@@ -7080,8 +7361,16 @@ var CloudBrowser = class {
7080
7361
  * @returns the SDP answer to apply as the remote description, plus the
7081
7362
  * viewport to map input coordinates into
7082
7363
  *
7083
- * @throws UNKNOWN_ERROR - the offer was empty, TURN is unconfigured, or the
7084
- * browser could not negotiate the stream
7364
+ * @throws already_active - a stream is already running on this session; stop it
7365
+ * before starting another
7366
+ * @throws negotiation_failed - the browser could not agree on a connection. The
7367
+ * message carries the negotiator's own diagnostic, which is usually where the
7368
+ * actual cause is
7369
+ *
7370
+ * An empty offer or an unconfigured TURN setup is a caller mistake rather than
7371
+ * an outcome, and rejects separately.
7372
+ *
7373
+ * @see {@link CommandError} for reading the code off the rejection
7085
7374
  *
7086
7375
  * @example
7087
7376
  * const { answerSdp, viewport } = await browser.startStream(offer.sdp);
@@ -7095,6 +7384,7 @@ var CloudBrowser = class {
7095
7384
  offerSdp
7096
7385
  })
7097
7386
  );
7387
+ throwCommandError("startStream", resp.error);
7098
7388
  return {
7099
7389
  answerSdp: resp.answerSdp,
7100
7390
  viewport: resp.viewport ? { width: resp.viewport.width, height: resp.viewport.height } : null
@@ -7104,27 +7394,29 @@ var CloudBrowser = class {
7104
7394
  * Tears down the live video stream for the session's page. Safe to call even
7105
7395
  * if no stream is running.
7106
7396
  *
7107
- * @throws UNKNOWN_ERROR - the stream could not be stopped
7397
+ * Rejects only on a transport failure. Stopping a stream that is not running is
7398
+ * a no-op rather than a failure, so there are no error codes to branch on.
7108
7399
  *
7109
7400
  * @example
7110
7401
  * await browser.stopStream();
7111
7402
  */
7112
7403
  async stopStream() {
7113
- await this.client.stopStream(
7404
+ const res = await this.client.stopStream(
7114
7405
  create(StopStreamRequestSchema, {
7115
7406
  sessionId: this.sessionId,
7116
7407
  apiKey: this.apiKey
7117
7408
  })
7118
7409
  );
7410
+ throwCommandError("stopStream", res.error);
7119
7411
  }
7120
7412
  // ──────────────────────────────────────────────────────────────────
7121
7413
  // Reactions
7122
7414
  // ──────────────────────────────────────────────────────────────────
7123
7415
  /**
7124
- * Registers a one-shot "reaction": a background poller (one shared loop per
7125
- * page) watches for the `match` locator and, as soon as it matches, clicks it
7126
- * with the full smart-click machinery (scroll, human path, occlusion gate,
7127
- * evade) — then removes itself. The poller yields to any in-flight input
7416
+ * Registers a one-shot "reaction": the browser watches for the `match`
7417
+ * locator in the background and, as soon as it matches, clicks it the same
7418
+ * way {@link CloudBrowser.click} does (scroll, human path, occlusion check) —
7419
+ * then removes itself. The reaction yields to any in-flight input
7128
7420
  * action and only fires while the pointer is idle, so a reaction naturally
7129
7421
  * slots into the gaps of a retrying foreground action (e.g. it dismisses a
7130
7422
  * newsletter modal blocking a {@link CloudBrowser.click}, after which the
@@ -7173,6 +7465,7 @@ var CloudBrowser = class {
7173
7465
  if (opts?.clickCount) req.clickCount = opts.clickCount;
7174
7466
  if (opts?.intervalMs) req.interval = opts.intervalMs;
7175
7467
  const resp = await this.client.addReaction(req);
7468
+ throwCommandError("addReaction", resp.error);
7176
7469
  return resp.reactionId;
7177
7470
  }
7178
7471
  /**
@@ -7183,6 +7476,10 @@ var CloudBrowser = class {
7183
7476
  *
7184
7477
  * @returns true if a pending reaction with this id existed and was removed
7185
7478
  *
7479
+ * Removing an id that is not registered is a no-op rather than an error, so the
7480
+ * returned boolean - not a rejection - is what tells you whether anything was
7481
+ * there. Rejects only on a transport failure.
7482
+ *
7186
7483
  * @example
7187
7484
  * const removed = await browser.removeReaction(id);
7188
7485
  */
@@ -7194,6 +7491,7 @@ var CloudBrowser = class {
7194
7491
  reactionId
7195
7492
  })
7196
7493
  );
7494
+ throwCommandError("removeReaction", resp.error);
7197
7495
  return resp.removed;
7198
7496
  }
7199
7497
  /**
@@ -7202,6 +7500,10 @@ var CloudBrowser = class {
7202
7500
  *
7203
7501
  * @returns the pending reactions for the page
7204
7502
  *
7503
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7504
+ * a broken connection. This call has no semantic failure of its own, so there
7505
+ * are no error codes to branch on.
7506
+ *
7205
7507
  * @example
7206
7508
  * const pending = await browser.listReactions();
7207
7509
  * for (const r of pending) console.log(r.reactionId, r.matchSelector);
@@ -7213,6 +7515,7 @@ var CloudBrowser = class {
7213
7515
  apiKey: this.apiKey
7214
7516
  })
7215
7517
  );
7518
+ throwCommandError("listReactions", resp.error);
7216
7519
  return resp.reactions.map((r) => ({
7217
7520
  reactionId: r.reactionId,
7218
7521
  matchSelector: r.matchSelector ?? "",
@@ -7227,41 +7530,44 @@ var CloudBrowser = class {
7227
7530
  // Scripts
7228
7531
  // ──────────────────────────────────────────────────────────────────
7229
7532
  /**
7230
- * Runs `source` in the session's browser and waits for it to finish.
7231
- *
7232
- * The script runs beside the browser, in a V8 isolate of its own rather than
7233
- * in the page, and reaches the document through the engine: a cross-origin
7234
- * `<iframe>` is read as plain `contentDocument` with no frame ids anywhere,
7235
- * values come back as live objects it can assign to rather than snapshots, an
7236
- * element can be handed straight to `browser.click`, and the page sees nothing
7237
- * injected. Steps cost microseconds rather than network round trips, so work
7238
- * that is chatty by nature — polling for a selector, walking a list,
7239
- * following pagination — is affordable there. A guide for it is still to come.
7240
- *
7241
- * This waits for as long as the script runs, and cannot be bounded: the run
7242
- * id needed to cancel only arrives with the reply. Use
7243
- * {@link CloudBrowser.startScript} when the script may outlive the caller's
7244
- * patience, or {@link CloudBrowser.stopScripts} to abandon what this session
7245
- * is running.
7246
- *
7247
- * @param source - JavaScript to execute; its return value comes back as JSON
7248
- *
7249
- * @returns the return value and the script's whole console output. A script
7250
- * that threw is reported as `success: false`, not as a rejection
7251
- *
7252
- * @throws UNKNOWN_ERROR - the script could not be delivered to the browser
7253
- *
7254
- * @example
7255
- * const result = await browser.runScript(`
7256
- * await browser.navigate("https://example.com");
7257
- * const items = [];
7258
- * for (const el of await browser.getDOM().querySelectorAll("h1")) {
7259
- * items.push(el.textContent);
7260
- * }
7261
- * return items;
7262
- * `);
7263
- * console.log(result.success, result.result);
7264
- */
7533
+ * Runs `source` in the session's browser and waits for it to finish.
7534
+ *
7535
+ * The script runs beside the browser, in a V8 isolate of its own rather than
7536
+ * in the page, and reaches the document through the engine: a cross-origin
7537
+ * `<iframe>` is read as plain `contentDocument` with no frame ids anywhere,
7538
+ * values come back as live objects it can assign to rather than snapshots, an
7539
+ * element can be handed straight to `browser.click`, and the page sees nothing
7540
+ * injected. Steps cost microseconds rather than network round trips, so work
7541
+ * that is chatty by nature — polling for a selector, walking a list,
7542
+ * following pagination — is affordable there. A guide for it is still to come.
7543
+ *
7544
+ * This waits for as long as the script runs, and cannot be bounded: the run
7545
+ * id needed to cancel only arrives with the reply. Use
7546
+ * {@link CloudBrowser.startScript} when the script may outlive the caller's
7547
+ * patience, or {@link CloudBrowser.stopScripts} to abandon what this session
7548
+ * is running.
7549
+ *
7550
+ * @param source - JavaScript to execute; its return value comes back as JSON
7551
+ *
7552
+ * @returns the return value and the script's whole console output. A script
7553
+ * that threw is reported as `success: false`, not as a rejection
7554
+ *
7555
+ * Rejects only on a transport failure. A script that fails to compile or throws
7556
+ * is not a rejection: the returned result has success: false and
7557
+ esult holds
7558
+ * the message, so a broken script stays distinguishable from a broken connection.
7559
+ *
7560
+ * @example
7561
+ * const result = await browser.runScript(`
7562
+ * await browser.navigate("https://example.com");
7563
+ * const items = [];
7564
+ * for (const el of await browser.getDOM().querySelectorAll("h1")) {
7565
+ * items.push(el.textContent);
7566
+ * }
7567
+ * return items;
7568
+ * `);
7569
+ * console.log(result.success, result.result);
7570
+ */
7265
7571
  async runScript(source) {
7266
7572
  const resp = await this.client.runScript(
7267
7573
  create(RunScriptRequestSchema, {
@@ -7299,7 +7605,8 @@ var CloudBrowser = class {
7299
7605
  *
7300
7606
  * @returns ScriptRun handle for awaiting or cancelling the run
7301
7607
  *
7302
- * @throws UNKNOWN_ERROR - the run could not be started
7608
+ * Rejects only on a transport failure: a script that fails to compile or throws
7609
+ * surfaces on the run itself rather than here.
7303
7610
  *
7304
7611
  * @example
7305
7612
  * const run = await browser.startScript(source, (ev) => {
@@ -7378,7 +7685,8 @@ var CloudBrowser = class {
7378
7685
  *
7379
7686
  * @returns ScriptFollow handle for stopping the subscription
7380
7687
  *
7381
- * @throws UNKNOWN_ERROR - the subscription could not be opened
7688
+ * Rejects only on a transport failure: opening the subscription has no semantic
7689
+ * failure of its own.
7382
7690
  *
7383
7691
  * @example
7384
7692
  * const follow = await browser.followScript(runId, (ev) => {
@@ -7414,7 +7722,9 @@ var CloudBrowser = class {
7414
7722
  * @returns how many runs were cancelled; 0 when the id named nothing in
7415
7723
  * flight
7416
7724
  *
7417
- * @throws UNKNOWN_ERROR - the cancel could not be delivered
7725
+ * Rejects only on a transport failure. Cancelling runs that have already
7726
+ * finished, or none at all, is a no-op - read the returned count to learn how
7727
+ * many were actually stopped.
7418
7728
  *
7419
7729
  * @example
7420
7730
  * await browser.stopScripts(""); // abandon everything running
@@ -7439,7 +7749,9 @@ var CloudBrowser = class {
7439
7749
  *
7440
7750
  * @returns one entry per run still executing
7441
7751
  *
7442
- * @throws UNKNOWN_ERROR - the session could not be queried
7752
+ * Rejects only on a transport failure - a dead session, a broken connection.
7753
+ * This call has no semantic failure of its own, so there are no error codes to
7754
+ * branch on.
7443
7755
  *
7444
7756
  * @example
7445
7757
  * for (const run of await browser.listScriptRuns()) {
@@ -7775,6 +8087,11 @@ var BrowserConfig = class {
7775
8087
  }
7776
8088
  };
7777
8089
 
8090
+ // src/defaults.ts
8091
+ var DefaultWaitTimeoutMs = 3e4;
8092
+ var DefaultVisible = true;
8093
+ var DefaultSteadyMs = 500;
8094
+
7778
8095
  // src/browser.ts
7779
8096
  function createWebSocketBrowser(wsUrl, sessionId, apiKey, fingerprint = "") {
7780
8097
  const transport = new WebSocketTransport(wsUrl);