ngx-webauthn 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +922 -412
- package/fesm2022/ngx-webauthn.mjs +1117 -190
- package/fesm2022/ngx-webauthn.mjs.map +1 -1
- package/index.d.ts +841 -165
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-webauthn.mjs","sources":["../tmp-esm2022/lib/models/register-config.models.js","../tmp-esm2022/lib/presets/webauthn.presets.js","../tmp-esm2022/lib/utils/preset.utils.js","../tmp-esm2022/lib/errors/webauthn.errors.js","../tmp-esm2022/lib/config/webauthn.config.js","../tmp-esm2022/lib/utils/webauthn.utils.js","../tmp-esm2022/lib/services/webauthn.service.js","../tmp-esm2022/lib/providers/webauthn.providers.js","../tmp-esm2022/index.js","../tmp-esm2022/ngx-webauthn.js"],"sourcesContent":["/**\n * High-level configuration interfaces for WebAuthn operations\n *\n * These interfaces provide a convenient, preset-driven API while still allowing\n * full customization through override properties. They derive from standard WebAuthn\n * types where possible to reduce duplication and ensure compatibility.\n */\n/**\n * Type guard to check if input is a RegisterConfig\n */\nexport function isRegisterConfig(input) {\n return typeof input === 'object' && input !== null && 'username' in input;\n}\n/**\n * Type guard to check if input is an AuthenticateConfig\n */\nexport function isAuthenticateConfig(input) {\n return (typeof input === 'object' &&\n input !== null &&\n ('username' in input || 'preset' in input) &&\n !('rp' in input) && // WebAuthn options have 'rp'\n !('user' in input)); // WebAuthn options have 'user'\n}\n/**\n * Type guard to check if input is WebAuthn creation options\n */\nexport function isCreationOptions(input) {\n return (typeof input === 'object' &&\n input !== null &&\n 'rp' in input &&\n 'user' in input);\n}\n/**\n * Type guard to check if input is WebAuthn request options\n */\nexport function isRequestOptions(input) {\n return (typeof input === 'object' &&\n input !== null &&\n !('username' in input) &&\n !('rp' in input) &&\n !('user' in input));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItY29uZmlnLm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXdlYmF1dGhuL3NyYy9saWIvbW9kZWxzL3JlZ2lzdGVyLWNvbmZpZy5tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBc0tIOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxVQUFVLElBQUksS0FBSyxDQUFDO0FBQzVFLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsS0FBYztJQUVkLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsQ0FBQyxVQUFVLElBQUksS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUM7UUFDMUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSw2QkFBNkI7UUFDakQsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FDbkIsQ0FBQyxDQUFDLCtCQUErQjtBQUNwQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEtBQWM7SUFJZCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLEtBQUssSUFBSTtRQUNkLElBQUksSUFBSSxLQUFLO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FDaEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsS0FBYztJQUlkLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsQ0FBQyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDdEIsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDaEIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FDbkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogSGlnaC1sZXZlbCBjb25maWd1cmF0aW9uIGludGVyZmFjZXMgZm9yIFdlYkF1dGhuIG9wZXJhdGlvbnNcclxuICpcclxuICogVGhlc2UgaW50ZXJmYWNlcyBwcm92aWRlIGEgY29udmVuaWVudCwgcHJlc2V0LWRyaXZlbiBBUEkgd2hpbGUgc3RpbGwgYWxsb3dpbmdcclxuICogZnVsbCBjdXN0b21pemF0aW9uIHRocm91Z2ggb3ZlcnJpZGUgcHJvcGVydGllcy4gVGhleSBkZXJpdmUgZnJvbSBzdGFuZGFyZCBXZWJBdXRoblxyXG4gKiB0eXBlcyB3aGVyZSBwb3NzaWJsZSB0byByZWR1Y2UgZHVwbGljYXRpb24gYW5kIGVuc3VyZSBjb21wYXRpYmlsaXR5LlxyXG4gKi9cclxuXHJcbmltcG9ydCB0eXBlIHsgUHJlc2V0TmFtZSB9IGZyb20gJy4uL3ByZXNldHMvd2ViYXV0aG4ucHJlc2V0cyc7XHJcblxyXG4vLyBSZS1leHBvcnQgUHJlc2V0TmFtZSBmb3IgY29udmVuaWVuY2VcclxuZXhwb3J0IHR5cGUgeyBQcmVzZXROYW1lIH0gZnJvbSAnLi4vcHJlc2V0cy93ZWJhdXRobi5wcmVzZXRzJztcclxuXHJcbi8qKlxyXG4gKiBSZWx5aW5nIHBhcnR5IGNvbmZpZ3VyYXRpb24gdXNpbmcgc3RhbmRhcmQgV2ViQXV0aG4gdHlwZVxyXG4gKiBObyBkdXBsaWNhdGlvbiBuZWVkZWQgLSB1c2VzIFB1YmxpY0tleUNyZWRlbnRpYWxScEVudGl0eSBkaXJlY3RseVxyXG4gKi9cclxuZXhwb3J0IHR5cGUgRW5oYW5jZWRSZWx5aW5nUGFydHkgPSBQdWJsaWNLZXlDcmVkZW50aWFsUnBFbnRpdHk7XHJcblxyXG4vKipcclxuICogRmxleGlibGUgdXNlciBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIGEgc3RyaW5nIG9yIFVpbnQ4QXJyYXlcclxuICogUHJvdmlkZXMgYmV0dGVyIERYIHdoaWxlIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBXZWJBdXRobiBzdGFuZGFyZHNcclxuICovXHJcbmV4cG9ydCB0eXBlIEZsZXhpYmxlVXNlcklkID0gc3RyaW5nIHwgVWludDhBcnJheTtcclxuXHJcbi8qKlxyXG4gKiBGbGV4aWJsZSBjaGFsbGVuZ2UgdGhhdCBjYW4gYmUgYSBzdHJpbmcgb3IgVWludDhBcnJheVxyXG4gKiBQcm92aWRlcyBiZXR0ZXIgRFggd2hpbGUgbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIFdlYkF1dGhuIHN0YW5kYXJkc1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgRmxleGlibGVDaGFsbGVuZ2UgPSBzdHJpbmcgfCBVaW50OEFycmF5O1xyXG5cclxuLyoqXHJcbiAqIEZsZXhpYmxlIGNyZWRlbnRpYWwgZGVzY3JpcHRvcnMgdGhhdCBjYW4gYmUgZWl0aGVyIGZ1bGwgZGVzY3JpcHRvcnMgb3IganVzdCBJRCBzdHJpbmdzXHJcbiAqIFByb3ZpZGVzIGJldHRlciBEWCBmb3IgY29tbW9uIHVzZSBjYXNlcyB3aGlsZSBtYWludGFpbmluZyBmdWxsIGZsZXhpYmlsaXR5XHJcbiAqL1xyXG5leHBvcnQgdHlwZSBGbGV4aWJsZUNyZWRlbnRpYWxEZXNjcmlwdG9ycyA9XHJcbiAgfCBQdWJsaWNLZXlDcmVkZW50aWFsRGVzY3JpcHRvcltdXHJcbiAgfCBzdHJpbmdbXTtcclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIGZvciBXZWJBdXRobiBjcmVkZW50aWFsIHJlZ2lzdHJhdGlvblxyXG4gKlxyXG4gKiBUaGlzIGludGVyZmFjZSBleHRlbmRzIHN0YW5kYXJkIFdlYkF1dGhuIHR5cGVzIHdpdGggcHJlc2V0IHN1cHBvcnQgYW5kIGVuaGFuY2VkIFVYLlxyXG4gKiBJdCBkZXJpdmVzIGZyb20gUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyB3aGVyZSBwb3NzaWJsZSB0byBhdm9pZCBkdXBsaWNhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJDb25maWdcclxuICBleHRlbmRzIFBhcnRpYWw8XHJcbiAgICBQaWNrPFxyXG4gICAgICBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zLFxyXG4gICAgICB8ICd0aW1lb3V0J1xyXG4gICAgICB8ICdhdHRlc3RhdGlvbidcclxuICAgICAgfCAnYXV0aGVudGljYXRvclNlbGVjdGlvbidcclxuICAgICAgfCAncHViS2V5Q3JlZFBhcmFtcydcclxuICAgICAgfCAnZXh0ZW5zaW9ucydcclxuICAgID5cclxuICA+IHtcclxuICAvKipcclxuICAgKiBVc2VybmFtZSBmb3IgdGhlIGNyZWRlbnRpYWxcclxuICAgKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHVzZXIubmFtZSBhbmQgdXNlci5pZCBpZiBub3QgZXhwbGljaXRseSBwcm92aWRlZFxyXG4gICAqL1xyXG4gIHVzZXJuYW1lOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIHByZXNldCB0byB1c2UgYXMgYmFzZSBjb25maWd1cmF0aW9uXHJcbiAgICogLSAncGFzc2tleSc6IE1vZGVybiBwYXNzd29yZGxlc3MsIGNyb3NzLWRldmljZSBjcmVkZW50aWFsc1xyXG4gICAqIC0gJ3NlY29uZEZhY3Rvcic6IFNlY3VyaXR5IGtleSBhcyBzZWNvbmQgZmFjdG9yIGFmdGVyIHBhc3N3b3JkXHJcbiAgICogLSAnZGV2aWNlQm91bmQnOiBIaWdoLXNlY3VyaXR5LCBkZXZpY2UtYm91bmQgY3JlZGVudGlhbHNcclxuICAgKi9cclxuICBwcmVzZXQ/OiBQcmVzZXROYW1lO1xyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5IG5hbWUgZm9yIHRoZSB1c2VyIChvcHRpb25hbCBvdmVycmlkZSlcclxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvIHRoZSB1c2VybmFtZVxyXG4gICAqL1xyXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBSZWx5aW5nIFBhcnR5IGNvbmZpZ3VyYXRpb24gKG9wdGlvbmFsIG92ZXJyaWRlKVxyXG4gICAqIElmIG5vdCBwcm92aWRlZCwgd2lsbCBuZWVkIHRvIGJlIHNldCBieSB0aGUgYXBwbGljYXRpb24gb3Igc2VydmljZVxyXG4gICAqIFVzZXMgc3RhbmRhcmQgUHVibGljS2V5Q3JlZGVudGlhbFJwRW50aXR5IHN0cnVjdHVyZVxyXG4gICAqL1xyXG4gIHJwPzogRW5oYW5jZWRSZWx5aW5nUGFydHk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYWxsZW5nZSBmb3IgdGhlIHJlZ2lzdHJhdGlvbiAob3B0aW9uYWwgb3ZlcnJpZGUpXHJcbiAgICogSWYgbm90IHByb3ZpZGVkLCBhIHNlY3VyZSByYW5kb20gY2hhbGxlbmdlIHdpbGwgYmUgZ2VuZXJhdGVkXHJcbiAgICogQ2FuIGJlIGVpdGhlciBiYXNlNjR1cmwgc3RyaW5nIG9yIFVpbnQ4QXJyYXkgZm9yIGJldHRlciBEWFxyXG4gICAqL1xyXG4gIGNoYWxsZW5nZT86IEZsZXhpYmxlQ2hhbGxlbmdlO1xyXG5cclxuICAvKipcclxuICAgKiBDcmVkZW50aWFscyB0byBleGNsdWRlIGZyb20gcmVnaXN0cmF0aW9uIChvcHRpb25hbCBvdmVycmlkZSlcclxuICAgKiBDYW4gYmUgYW4gYXJyYXkgb2YgY3JlZGVudGlhbCBJRHMgKGJhc2U2NHVybCBzdHJpbmdzKSBvciBmdWxsIGRlc2NyaXB0b3JzXHJcbiAgICogRW5oYW5jZWQgdG8gYWNjZXB0IHNpbXBsZSBzdHJpbmcgYXJyYXlzIGZvciBiZXR0ZXIgRFhcclxuICAgKi9cclxuICBleGNsdWRlQ3JlZGVudGlhbHM/OiBGbGV4aWJsZUNyZWRlbnRpYWxEZXNjcmlwdG9ycztcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlciBJRCBvdmVycmlkZSAob3B0aW9uYWwpXHJcbiAgICogSWYgbm90IHByb3ZpZGVkLCBhIHVzZXIgSUQgd2lsbCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgdXNlcm5hbWVcclxuICAgKiBDYW4gYmUgZWl0aGVyIGJhc2U2NHVybCBzdHJpbmcgb3IgVWludDhBcnJheSBmb3IgYmV0dGVyIERYXHJcbiAgICovXHJcbiAgdXNlcklkPzogRmxleGlibGVVc2VySWQ7XHJcblxyXG4gIC8vIEFsbCBvdGhlciBwcm9wZXJ0aWVzICh0aW1lb3V0LCBhdHRlc3RhdGlvbiwgYXV0aGVudGljYXRvclNlbGVjdGlvbixcclxuICAvLyBwdWJLZXlDcmVkUGFyYW1zLCBleHRlbnNpb25zKSBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIFBhcnRpYWw8UGljazwuLi4+PlxyXG4gIC8vIFRoaXMgZWxpbWluYXRlcyBkdXBsaWNhdGlvbiB3aGlsZSBtYWludGFpbmluZyBmdWxsIHR5cGUgc2FmZXR5XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIGZvciBXZWJBdXRobiBhdXRoZW50aWNhdGlvblxyXG4gKlxyXG4gKiBUaGlzIGludGVyZmFjZSBleHRlbmRzIHN0YW5kYXJkIFdlYkF1dGhuIHR5cGVzIHdpdGggcHJlc2V0IHN1cHBvcnQgYW5kIGVuaGFuY2VkIFVYLlxyXG4gKiBJdCBkZXJpdmVzIGZyb20gUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIHdoZXJlIHBvc3NpYmxlIHRvIGF2b2lkIGR1cGxpY2F0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBdXRoZW50aWNhdGVDb25maWdcclxuICBleHRlbmRzIFBhcnRpYWw8XHJcbiAgICBQaWNrPFxyXG4gICAgICBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMsXHJcbiAgICAgICd0aW1lb3V0JyB8ICd1c2VyVmVyaWZpY2F0aW9uJyB8ICdleHRlbnNpb25zJ1xyXG4gICAgPlxyXG4gID4ge1xyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIHVzZXJuYW1lIGhpbnQgZm9yIGRpc2NvdmVyYWJsZSBjcmVkZW50aWFsc1xyXG4gICAqIE5vdCByZXF1aXJlZCBmb3IgYXV0aGVudGljYXRpb24sIGJ1dCBjYW4gYmUgdXNlZCBmb3IgdXNlciBleHBlcmllbmNlXHJcbiAgICovXHJcbiAgdXNlcm5hbWU/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIHByZXNldCB0byB1c2UgYXMgYmFzZSBjb25maWd1cmF0aW9uXHJcbiAgICogQWZmZWN0cyB1c2VyIHZlcmlmaWNhdGlvbiBhbmQgb3RoZXIgYXV0aGVudGljYXRpb24gcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIHByZXNldD86IFByZXNldE5hbWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYWxsZW5nZSBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIChvcHRpb25hbCBvdmVycmlkZSlcclxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgc2VjdXJlIHJhbmRvbSBjaGFsbGVuZ2Ugd2lsbCBiZSBnZW5lcmF0ZWRcclxuICAgKiBDYW4gYmUgZWl0aGVyIGJhc2U2NHVybCBzdHJpbmcgb3IgVWludDhBcnJheSBmb3IgYmV0dGVyIERYXHJcbiAgICovXHJcbiAgY2hhbGxlbmdlPzogRmxleGlibGVDaGFsbGVuZ2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwZWNpZmljIGNyZWRlbnRpYWxzIHRvIGFsbG93IGZvciBhdXRoZW50aWNhdGlvbiAob3B0aW9uYWwgb3ZlcnJpZGUpXHJcbiAgICogQ2FuIGJlIGFuIGFycmF5IG9mIGNyZWRlbnRpYWwgSURzIChiYXNlNjR1cmwgc3RyaW5ncykgb3IgZnVsbCBkZXNjcmlwdG9yc1xyXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYWxsb3dzIGFueSBjcmVkZW50aWFsIChkaXNjb3ZlcmFibGUgY3JlZGVudGlhbCBmbG93KVxyXG4gICAqIEVuaGFuY2VkIHRvIGFjY2VwdCBzaW1wbGUgc3RyaW5nIGFycmF5cyBmb3IgYmV0dGVyIERYXHJcbiAgICovXHJcbiAgYWxsb3dDcmVkZW50aWFscz86IEZsZXhpYmxlQ3JlZGVudGlhbERlc2NyaXB0b3JzO1xyXG5cclxuICAvLyBBbGwgb3RoZXIgcHJvcGVydGllcyAodGltZW91dCwgdXNlclZlcmlmaWNhdGlvbiwgZXh0ZW5zaW9ucykgYXJlIGluaGVyaXRlZFxyXG4gIC8vIGZyb20gdGhlIFBhcnRpYWw8UGljazwuLi4+PiBUaGlzIGVsaW1pbmF0ZXMgZHVwbGljYXRpb24gd2hpbGUgbWFpbnRhaW5pbmdcclxuICAvLyBmdWxsIHR5cGUgc2FmZXR5IGFuZCBjb21wYXRpYmlsaXR5IHdpdGggc3RhbmRhcmQgV2ViQXV0aG4gdHlwZXNcclxufVxyXG5cclxuLyoqXHJcbiAqIFVuaW9uIHR5cGUgZm9yIGFsbCBwb3NzaWJsZSByZWdpc3RlciBpbnB1dHNcclxuICogU3VwcG9ydHMgYm90aCBoaWdoLWxldmVsIGNvbmZpZyBhbmQgZGlyZWN0IFdlYkF1dGhuIG9wdGlvbnNcclxuICovXHJcbmV4cG9ydCB0eXBlIFJlZ2lzdGVySW5wdXQgPVxyXG4gIHwgUmVnaXN0ZXJDb25maWdcclxuICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNcclxuICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OO1xyXG5cclxuLyoqXHJcbiAqIFVuaW9uIHR5cGUgZm9yIGFsbCBwb3NzaWJsZSBhdXRoZW50aWNhdGUgaW5wdXRzXHJcbiAqIFN1cHBvcnRzIGJvdGggaGlnaC1sZXZlbCBjb25maWcgYW5kIGRpcmVjdCBXZWJBdXRobiBvcHRpb25zXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBBdXRoZW50aWNhdGVJbnB1dCA9XHJcbiAgfCBBdXRoZW50aWNhdGVDb25maWdcclxuICB8IFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc1xyXG4gIHwgUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zSlNPTjtcclxuXHJcbi8qKlxyXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGlucHV0IGlzIGEgUmVnaXN0ZXJDb25maWdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ2lzdGVyQ29uZmlnKGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVnaXN0ZXJDb25maWcge1xyXG4gIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0ICE9PSBudWxsICYmICd1c2VybmFtZScgaW4gaW5wdXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGlucHV0IGlzIGFuIEF1dGhlbnRpY2F0ZUNvbmZpZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aGVudGljYXRlQ29uZmlnKFxyXG4gIGlucHV0OiB1bmtub3duXHJcbik6IGlucHV0IGlzIEF1dGhlbnRpY2F0ZUNvbmZpZyB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiZcclxuICAgIGlucHV0ICE9PSBudWxsICYmXHJcbiAgICAoJ3VzZXJuYW1lJyBpbiBpbnB1dCB8fCAncHJlc2V0JyBpbiBpbnB1dCkgJiZcclxuICAgICEoJ3JwJyBpbiBpbnB1dCkgJiYgLy8gV2ViQXV0aG4gb3B0aW9ucyBoYXZlICdycCdcclxuICAgICEoJ3VzZXInIGluIGlucHV0KVxyXG4gICk7IC8vIFdlYkF1dGhuIG9wdGlvbnMgaGF2ZSAndXNlcidcclxufVxyXG5cclxuLyoqXHJcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgaW5wdXQgaXMgV2ViQXV0aG4gY3JlYXRpb24gb3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ3JlYXRpb25PcHRpb25zKFxyXG4gIGlucHV0OiB1bmtub3duXHJcbik6IGlucHV0IGlzXHJcbiAgfCBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zXHJcbiAgfCBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zSlNPTiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiZcclxuICAgIGlucHV0ICE9PSBudWxsICYmXHJcbiAgICAncnAnIGluIGlucHV0ICYmXHJcbiAgICAndXNlcicgaW4gaW5wdXRcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbnB1dCBpcyBXZWJBdXRobiByZXF1ZXN0IG9wdGlvbnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1JlcXVlc3RPcHRpb25zKFxyXG4gIGlucHV0OiB1bmtub3duXHJcbik6IGlucHV0IGlzXHJcbiAgfCBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNcclxuICB8IFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0pTT04ge1xyXG4gIHJldHVybiAoXHJcbiAgICB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXHJcbiAgICBpbnB1dCAhPT0gbnVsbCAmJlxyXG4gICAgISgndXNlcm5hbWUnIGluIGlucHV0KSAmJlxyXG4gICAgISgncnAnIGluIGlucHV0KSAmJlxyXG4gICAgISgndXNlcicgaW4gaW5wdXQpXHJcbiAgKTtcclxufVxyXG4iXX0=","/**\n * WebAuthn Preset Configurations\n *\n * This file contains predefined configurations for common WebAuthn use cases.\n * These presets provide sensible defaults while remaining fully customizable.\n */\n/**\n * A shared configuration for common, strong, and widely-supported\n * public key credential algorithms.\n */\nexport const COMMON_PUB_KEY_CRED_PARAMS = {\n pubKeyCredParams: [\n { type: 'public-key', alg: -7 }, // ES256 (ECDSA w/ SHA-256)\n { type: 'public-key', alg: -257 }, // RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256)\n ],\n};\n/**\n * Preset for modern, passwordless, cross-device credentials.\n *\n * Best for: Passkey-based authentication where users can sync credentials\n * across devices and use them for passwordless login.\n *\n * Features:\n * - Requires resident keys (discoverable credentials)\n * - Prefers user verification but doesn't require it\n * - Works with both platform and cross-platform authenticators\n * - Supports credential syncing across devices\n */\nexport const PASSKEY_PRESET = {\n ...COMMON_PUB_KEY_CRED_PARAMS,\n authenticatorSelection: {\n residentKey: 'required',\n userVerification: 'preferred',\n },\n};\n/**\n * Preset for using a security key as a second factor after a password.\n *\n * Best for: Traditional 2FA scenarios where users already have a password\n * and want to add hardware security key as a second factor.\n *\n * Features:\n * - Discourages resident keys (server-side credential storage)\n * - Prefers user verification\n * - Favors cross-platform authenticators (USB/NFC security keys)\n * - Credentials typically not synced between devices\n */\nexport const SECOND_FACTOR_PRESET = {\n ...COMMON_PUB_KEY_CRED_PARAMS,\n authenticatorSelection: {\n residentKey: 'discouraged',\n userVerification: 'preferred',\n authenticatorAttachment: 'cross-platform',\n },\n};\n/**\n * Preset for high-security, non-synced, single-device credentials.\n *\n * Best for: High-security scenarios where credentials must stay on a single\n * device and user verification is mandatory.\n *\n * Features:\n * - Requires platform authenticators (built-in biometrics/PIN)\n * - Requires resident keys for discoverability\n * - Requires user verification (biometric/PIN)\n * - Credentials bound to specific device (no syncing)\n */\nexport const DEVICE_BOUND_PRESET = {\n ...COMMON_PUB_KEY_CRED_PARAMS,\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n residentKey: 'required',\n userVerification: 'required',\n },\n};\n/**\n * Map of preset names to their configurations\n * Used internally for preset resolution\n */\nexport const PRESET_MAP = {\n passkey: PASSKEY_PRESET,\n secondFactor: SECOND_FACTOR_PRESET,\n deviceBound: DEVICE_BOUND_PRESET,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4ucHJlc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXdlYmF1dGhuL3NyYy9saWIvcHJlc2V0cy93ZWJhdXRobi5wcmVzZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsZ0JBQWdCLEVBQUU7UUFDaEIsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLDJCQUEyQjtRQUM1RCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsdUNBQXVDO0tBQzNFO0NBQ08sQ0FBQztBQUVYOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHO0lBQzVCLEdBQUcsMEJBQTBCO0lBQzdCLHNCQUFzQixFQUFFO1FBQ3RCLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLGdCQUFnQixFQUFFLFdBQVc7S0FDOUI7Q0FDTyxDQUFDO0FBRVg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxHQUFHLDBCQUEwQjtJQUM3QixzQkFBc0IsRUFBRTtRQUN0QixXQUFXLEVBQUUsYUFBYTtRQUMxQixnQkFBZ0IsRUFBRSxXQUFXO1FBQzdCLHVCQUF1QixFQUFFLGdCQUFnQjtLQUMxQztDQUNPLENBQUM7QUFFWDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLEdBQUcsMEJBQTBCO0lBQzdCLHNCQUFzQixFQUFFO1FBQ3RCLHVCQUF1QixFQUFFLFVBQVU7UUFDbkMsV0FBVyxFQUFFLFVBQVU7UUFDdkIsZ0JBQWdCLEVBQUUsVUFBVTtLQUM3QjtDQUNPLENBQUM7QUFFWDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUc7SUFDeEIsT0FBTyxFQUFFLGNBQWM7SUFDdkIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxXQUFXLEVBQUUsbUJBQW1CO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogV2ViQXV0aG4gUHJlc2V0IENvbmZpZ3VyYXRpb25zXHJcbiAqXHJcbiAqIFRoaXMgZmlsZSBjb250YWlucyBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gV2ViQXV0aG4gdXNlIGNhc2VzLlxyXG4gKiBUaGVzZSBwcmVzZXRzIHByb3ZpZGUgc2Vuc2libGUgZGVmYXVsdHMgd2hpbGUgcmVtYWluaW5nIGZ1bGx5IGN1c3RvbWl6YWJsZS5cclxuICovXHJcblxyXG4vKipcclxuICogQSBzaGFyZWQgY29uZmlndXJhdGlvbiBmb3IgY29tbW9uLCBzdHJvbmcsIGFuZCB3aWRlbHktc3VwcG9ydGVkXHJcbiAqIHB1YmxpYyBrZXkgY3JlZGVudGlhbCBhbGdvcml0aG1zLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IENPTU1PTl9QVUJfS0VZX0NSRURfUEFSQU1TID0ge1xyXG4gIHB1YktleUNyZWRQYXJhbXM6IFtcclxuICAgIHsgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC03IH0sIC8vIEVTMjU2IChFQ0RTQSB3LyBTSEEtMjU2KVxyXG4gICAgeyB0eXBlOiAncHVibGljLWtleScsIGFsZzogLTI1NyB9LCAvLyBSUzI1NiAoUlNBU1NBLVBLQ1MxLXYxXzUgdy8gU0hBLTI1NilcclxuICBdLFxyXG59IGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIFByZXNldCBmb3IgbW9kZXJuLCBwYXNzd29yZGxlc3MsIGNyb3NzLWRldmljZSBjcmVkZW50aWFscy5cclxuICpcclxuICogQmVzdCBmb3I6IFBhc3NrZXktYmFzZWQgYXV0aGVudGljYXRpb24gd2hlcmUgdXNlcnMgY2FuIHN5bmMgY3JlZGVudGlhbHNcclxuICogYWNyb3NzIGRldmljZXMgYW5kIHVzZSB0aGVtIGZvciBwYXNzd29yZGxlc3MgbG9naW4uXHJcbiAqXHJcbiAqIEZlYXR1cmVzOlxyXG4gKiAtIFJlcXVpcmVzIHJlc2lkZW50IGtleXMgKGRpc2NvdmVyYWJsZSBjcmVkZW50aWFscylcclxuICogLSBQcmVmZXJzIHVzZXIgdmVyaWZpY2F0aW9uIGJ1dCBkb2Vzbid0IHJlcXVpcmUgaXRcclxuICogLSBXb3JrcyB3aXRoIGJvdGggcGxhdGZvcm0gYW5kIGNyb3NzLXBsYXRmb3JtIGF1dGhlbnRpY2F0b3JzXHJcbiAqIC0gU3VwcG9ydHMgY3JlZGVudGlhbCBzeW5jaW5nIGFjcm9zcyBkZXZpY2VzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUEFTU0tFWV9QUkVTRVQgPSB7XHJcbiAgLi4uQ09NTU9OX1BVQl9LRVlfQ1JFRF9QQVJBTVMsXHJcbiAgYXV0aGVudGljYXRvclNlbGVjdGlvbjoge1xyXG4gICAgcmVzaWRlbnRLZXk6ICdyZXF1aXJlZCcsXHJcbiAgICB1c2VyVmVyaWZpY2F0aW9uOiAncHJlZmVycmVkJyxcclxuICB9LFxyXG59IGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIFByZXNldCBmb3IgdXNpbmcgYSBzZWN1cml0eSBrZXkgYXMgYSBzZWNvbmQgZmFjdG9yIGFmdGVyIGEgcGFzc3dvcmQuXHJcbiAqXHJcbiAqIEJlc3QgZm9yOiBUcmFkaXRpb25hbCAyRkEgc2NlbmFyaW9zIHdoZXJlIHVzZXJzIGFscmVhZHkgaGF2ZSBhIHBhc3N3b3JkXHJcbiAqIGFuZCB3YW50IHRvIGFkZCBoYXJkd2FyZSBzZWN1cml0eSBrZXkgYXMgYSBzZWNvbmQgZmFjdG9yLlxyXG4gKlxyXG4gKiBGZWF0dXJlczpcclxuICogLSBEaXNjb3VyYWdlcyByZXNpZGVudCBrZXlzIChzZXJ2ZXItc2lkZSBjcmVkZW50aWFsIHN0b3JhZ2UpXHJcbiAqIC0gUHJlZmVycyB1c2VyIHZlcmlmaWNhdGlvblxyXG4gKiAtIEZhdm9ycyBjcm9zcy1wbGF0Zm9ybSBhdXRoZW50aWNhdG9ycyAoVVNCL05GQyBzZWN1cml0eSBrZXlzKVxyXG4gKiAtIENyZWRlbnRpYWxzIHR5cGljYWxseSBub3Qgc3luY2VkIGJldHdlZW4gZGV2aWNlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNFQ09ORF9GQUNUT1JfUFJFU0VUID0ge1xyXG4gIC4uLkNPTU1PTl9QVUJfS0VZX0NSRURfUEFSQU1TLFxyXG4gIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHtcclxuICAgIHJlc2lkZW50S2V5OiAnZGlzY291cmFnZWQnLFxyXG4gICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXHJcbiAgICBhdXRoZW50aWNhdG9yQXR0YWNobWVudDogJ2Nyb3NzLXBsYXRmb3JtJyxcclxuICB9LFxyXG59IGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIFByZXNldCBmb3IgaGlnaC1zZWN1cml0eSwgbm9uLXN5bmNlZCwgc2luZ2xlLWRldmljZSBjcmVkZW50aWFscy5cclxuICpcclxuICogQmVzdCBmb3I6IEhpZ2gtc2VjdXJpdHkgc2NlbmFyaW9zIHdoZXJlIGNyZWRlbnRpYWxzIG11c3Qgc3RheSBvbiBhIHNpbmdsZVxyXG4gKiBkZXZpY2UgYW5kIHVzZXIgdmVyaWZpY2F0aW9uIGlzIG1hbmRhdG9yeS5cclxuICpcclxuICogRmVhdHVyZXM6XHJcbiAqIC0gUmVxdWlyZXMgcGxhdGZvcm0gYXV0aGVudGljYXRvcnMgKGJ1aWx0LWluIGJpb21ldHJpY3MvUElOKVxyXG4gKiAtIFJlcXVpcmVzIHJlc2lkZW50IGtleXMgZm9yIGRpc2NvdmVyYWJpbGl0eVxyXG4gKiAtIFJlcXVpcmVzIHVzZXIgdmVyaWZpY2F0aW9uIChiaW9tZXRyaWMvUElOKVxyXG4gKiAtIENyZWRlbnRpYWxzIGJvdW5kIHRvIHNwZWNpZmljIGRldmljZSAobm8gc3luY2luZylcclxuICovXHJcbmV4cG9ydCBjb25zdCBERVZJQ0VfQk9VTkRfUFJFU0VUID0ge1xyXG4gIC4uLkNPTU1PTl9QVUJfS0VZX0NSRURfUEFSQU1TLFxyXG4gIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHtcclxuICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAncGxhdGZvcm0nLFxyXG4gICAgcmVzaWRlbnRLZXk6ICdyZXF1aXJlZCcsXHJcbiAgICB1c2VyVmVyaWZpY2F0aW9uOiAncmVxdWlyZWQnLFxyXG4gIH0sXHJcbn0gYXMgY29uc3Q7XHJcblxyXG4vKipcclxuICogTWFwIG9mIHByZXNldCBuYW1lcyB0byB0aGVpciBjb25maWd1cmF0aW9uc1xyXG4gKiBVc2VkIGludGVybmFsbHkgZm9yIHByZXNldCByZXNvbHV0aW9uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUFJFU0VUX01BUCA9IHtcclxuICBwYXNza2V5OiBQQVNTS0VZX1BSRVNFVCxcclxuICBzZWNvbmRGYWN0b3I6IFNFQ09ORF9GQUNUT1JfUFJFU0VULFxyXG4gIGRldmljZUJvdW5kOiBERVZJQ0VfQk9VTkRfUFJFU0VULFxyXG59IGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIEF2YWlsYWJsZSBwcmVzZXQgbmFtZXMgYXMgYSB1bmlvbiB0eXBlXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBQcmVzZXROYW1lID0ga2V5b2YgdHlwZW9mIFBSRVNFVF9NQVA7XHJcbiJdfQ==","/**\n * Utility functions for resolving and merging WebAuthn presets\n *\n * These utilities handle the logic of taking a RegisterConfig or AuthenticateConfig,\n * resolving any preset, and merging it with user overrides to produce final\n * WebAuthn options ready for the browser API.\n */\nimport { PRESET_MAP } from '../presets/webauthn.presets';\n/**\n * Deep merge utility that properly handles nested objects\n * Later properties override earlier ones\n */\nfunction deepMerge(target, ...sources) {\n if (!sources.length)\n return target;\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key])\n Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return deepMerge(target, ...sources);\n}\n/**\n * Check if a value is a plain object\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Generate a secure random challenge as Uint8Array\n */\nfunction generateChallenge() {\n return crypto.getRandomValues(new Uint8Array(32));\n}\n/**\n * Generate a user ID from username\n * Uses TextEncoder to convert username to Uint8Array for consistency\n */\nfunction generateUserId(username) {\n return new TextEncoder().encode(username);\n}\n/**\n * Convert challenge to appropriate format\n * Handles both string (base64url) and Uint8Array inputs\n */\nfunction processChallenge(challenge) {\n if (!challenge) {\n return generateChallenge();\n }\n if (typeof challenge === 'string') {\n // Assume base64url string, convert to Uint8Array\n return Uint8Array.from(atob(challenge.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0));\n }\n return challenge;\n}\n/**\n * Convert user ID to appropriate format\n * Handles both string (base64url) and Uint8Array inputs\n */\nfunction processUserId(userId, username) {\n if (userId) {\n if (typeof userId === 'string') {\n // Assume base64url string, convert to Uint8Array\n return Uint8Array.from(atob(userId.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0));\n }\n return userId;\n }\n if (username) {\n return generateUserId(username);\n }\n // Fallback to random ID\n return crypto.getRandomValues(new Uint8Array(16));\n}\n/**\n * Convert string credential IDs to PublicKeyCredentialDescriptor format\n */\nfunction processCredentialDescriptors(credentials) {\n if (!credentials || credentials.length === 0) {\n return undefined;\n }\n // If already in descriptor format, return as-is\n if (typeof credentials[0] === 'object' && 'type' in credentials[0]) {\n return credentials;\n }\n // Convert string IDs to descriptors\n return credentials.map((id) => ({\n type: 'public-key',\n id: Uint8Array.from(atob(id.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0)),\n }));\n}\n/**\n * Resolve a preset configuration by name\n */\nexport function resolvePreset(presetName) {\n const preset = PRESET_MAP[presetName];\n if (!preset) {\n throw new Error(`Unknown preset: ${presetName}`);\n }\n return preset;\n}\n/**\n * Build complete PublicKeyCredentialCreationOptions from RegisterConfig\n * Now uses WebAuthnConfig for better defaults and relying party information\n */\nexport function buildCreationOptionsFromConfig(config, webAuthnConfig) {\n // Start with base configuration from WebAuthnConfig\n let options = {\n timeout: webAuthnConfig.defaultTimeout || 60000,\n attestation: webAuthnConfig.defaultAttestation || 'none',\n };\n // Apply preset if specified\n if (config.preset) {\n const preset = resolvePreset(config.preset);\n options = deepMerge(options, {\n authenticatorSelection: preset.authenticatorSelection,\n pubKeyCredParams: [...preset.pubKeyCredParams], // Convert readonly to mutable\n });\n }\n else {\n // Apply default authenticator selection from config\n if (webAuthnConfig.defaultAuthenticatorSelection) {\n options.authenticatorSelection =\n webAuthnConfig.defaultAuthenticatorSelection;\n }\n }\n // Apply user overrides\n if (config.timeout !== undefined) {\n options.timeout = config.timeout;\n }\n if (config.attestation !== undefined) {\n options.attestation = config.attestation;\n }\n if (config.authenticatorSelection !== undefined) {\n options.authenticatorSelection = deepMerge(options.authenticatorSelection || {}, config.authenticatorSelection);\n }\n if (config.pubKeyCredParams !== undefined) {\n options.pubKeyCredParams = config.pubKeyCredParams;\n }\n if (config.extensions !== undefined) {\n options.extensions = config.extensions;\n }\n // Handle required fields\n const challenge = processChallenge(config.challenge);\n const userId = processUserId(config.userId, config.username);\n // Use relying party from config, with user override capability\n const relyingParty = config.rp || webAuthnConfig.relyingParty;\n // Build final options\n const finalOptions = {\n ...options,\n rp: relyingParty,\n user: {\n id: userId,\n name: config.username,\n displayName: config.displayName || config.username,\n },\n challenge,\n pubKeyCredParams: options.pubKeyCredParams ||\n webAuthnConfig.defaultAlgorithms || [\n { type: 'public-key', alg: -7 }, // ES256\n { type: 'public-key', alg: -257 }, // RS256\n ],\n excludeCredentials: processCredentialDescriptors(config.excludeCredentials),\n };\n return finalOptions;\n}\n/**\n * Build complete PublicKeyCredentialRequestOptions from AuthenticateConfig\n * Now uses WebAuthnConfig for better defaults\n */\nexport function buildRequestOptionsFromConfig(config, webAuthnConfig) {\n // Start with base configuration from WebAuthnConfig\n const options = {\n timeout: webAuthnConfig.defaultTimeout || 60000,\n userVerification: webAuthnConfig.enforceUserVerification\n ? 'required'\n : 'preferred',\n };\n // Apply preset if specified\n if (config.preset) {\n const preset = resolvePreset(config.preset);\n // Extract relevant parts for authentication (userVerification from authenticatorSelection)\n if (preset.authenticatorSelection?.userVerification) {\n options.userVerification = preset.authenticatorSelection.userVerification;\n }\n }\n // Apply user overrides\n if (config.timeout !== undefined) {\n options.timeout = config.timeout;\n }\n if (config.userVerification !== undefined) {\n options.userVerification = config.userVerification;\n }\n if (config.extensions !== undefined) {\n options.extensions = config.extensions;\n }\n // Handle required fields\n const challenge = processChallenge(config.challenge);\n // Build final options\n const finalOptions = {\n ...options,\n challenge,\n allowCredentials: processCredentialDescriptors(config.allowCredentials),\n };\n return finalOptions;\n}\n/**\n * Validate that a RegisterConfig has all required fields\n */\nexport function validateRegisterConfig(config) {\n if (!config.username || typeof config.username !== 'string') {\n throw new Error('RegisterConfig must have a valid username');\n }\n if (config.preset && !PRESET_MAP[config.preset]) {\n throw new Error(`Invalid preset: ${config.preset}. Valid presets are: ${Object.keys(PRESET_MAP).join(', ')}`);\n }\n}\n/**\n * Validate that an AuthenticateConfig has all required fields\n */\nexport function validateAuthenticateConfig(config) {\n if (config.preset && !PRESET_MAP[config.preset]) {\n throw new Error(`Invalid preset: ${config.preset}. Valid presets are: ${Object.keys(PRESET_MAP).join(', ')}`);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi91dGlscy9wcmVzZXQudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztBQU8xRTs7O0dBR0c7QUFDSCxTQUFTLFNBQVMsQ0FDaEIsTUFBUyxFQUNULEdBQUcsT0FBYztJQUVqQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFL0IsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLEdB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O0dBRUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsTUFBMEI7SUFDbkUsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQ2IsbUJBQW1CLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixNQUFNLENBQUMsSUFBSSxDQUNqRSxVQUFVLENBQ1gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDZixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHJlc29sdmluZyBhbmQgbWVyZ2luZyBXZWJBdXRobiBwcmVzZXRzXHJcbiAqXHJcbiAqIFRoZXNlIHV0aWxpdGllcyBoYW5kbGUgdGhlIGxvZ2ljIG9mIHRha2luZyBhIFJlZ2lzdGVyQ29uZmlnIG9yIEF1dGhlbnRpY2F0ZUNvbmZpZyxcclxuICogcmVzb2x2aW5nIGFueSBwcmVzZXQsIGFuZCBtZXJnaW5nIGl0IHdpdGggdXNlciBvdmVycmlkZXMgdG8gcHJvZHVjZSBmaW5hbFxyXG4gKiBXZWJBdXRobiBvcHRpb25zIHJlYWR5IGZvciB0aGUgYnJvd3NlciBBUEkuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgUFJFU0VUX01BUCwgdHlwZSBQcmVzZXROYW1lIH0gZnJvbSAnLi4vcHJlc2V0cy93ZWJhdXRobi5wcmVzZXRzJztcclxuaW1wb3J0IHR5cGUge1xyXG4gIFJlZ2lzdGVyQ29uZmlnLFxyXG4gIEF1dGhlbnRpY2F0ZUNvbmZpZyxcclxufSBmcm9tICcuLi9tb2RlbHMvcmVnaXN0ZXItY29uZmlnLm1vZGVscyc7XHJcbmltcG9ydCB0eXBlIHsgV2ViQXV0aG5Db25maWcgfSBmcm9tICcuLi9jb25maWcvd2ViYXV0aG4uY29uZmlnJztcclxuXHJcbi8qKlxyXG4gKiBEZWVwIG1lcmdlIHV0aWxpdHkgdGhhdCBwcm9wZXJseSBoYW5kbGVzIG5lc3RlZCBvYmplY3RzXHJcbiAqIExhdGVyIHByb3BlcnRpZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxyXG4gIHRhcmdldDogVCxcclxuICAuLi5zb3VyY2VzOiBhbnlbXVxyXG4pOiBUIHtcclxuICBpZiAoIXNvdXJjZXMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0O1xyXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcclxuXHJcbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcclxuICAgICAgICBpZiAoIXRhcmdldFtrZXldKSBPYmplY3QuYXNzaWduKHRhcmdldCwgeyBba2V5XToge30gfSk7XHJcbiAgICAgICAgZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgLi4uc291cmNlcyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0XHJcbiAqL1xyXG5mdW5jdGlvbiBpc09iamVjdChpdGVtOiBhbnkpOiBpdGVtIGlzIFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gIHJldHVybiBpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgc2VjdXJlIHJhbmRvbSBjaGFsbGVuZ2UgYXMgVWludDhBcnJheVxyXG4gKi9cclxuZnVuY3Rpb24gZ2VuZXJhdGVDaGFsbGVuZ2UoKTogVWludDhBcnJheSB7XHJcbiAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMzIpKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgdXNlciBJRCBmcm9tIHVzZXJuYW1lXHJcbiAqIFVzZXMgVGV4dEVuY29kZXIgdG8gY29udmVydCB1c2VybmFtZSB0byBVaW50OEFycmF5IGZvciBjb25zaXN0ZW5jeVxyXG4gKi9cclxuZnVuY3Rpb24gZ2VuZXJhdGVVc2VySWQodXNlcm5hbWU6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xyXG4gIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodXNlcm5hbWUpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBjaGFsbGVuZ2UgdG8gYXBwcm9wcmlhdGUgZm9ybWF0XHJcbiAqIEhhbmRsZXMgYm90aCBzdHJpbmcgKGJhc2U2NHVybCkgYW5kIFVpbnQ4QXJyYXkgaW5wdXRzXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzQ2hhbGxlbmdlKGNoYWxsZW5nZT86IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcclxuICBpZiAoIWNoYWxsZW5nZSkge1xyXG4gICAgcmV0dXJuIGdlbmVyYXRlQ2hhbGxlbmdlKCk7XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIGNoYWxsZW5nZSA9PT0gJ3N0cmluZycpIHtcclxuICAgIC8vIEFzc3VtZSBiYXNlNjR1cmwgc3RyaW5nLCBjb252ZXJ0IHRvIFVpbnQ4QXJyYXlcclxuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXHJcbiAgICAgIGF0b2IoY2hhbGxlbmdlLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLFxyXG4gICAgICAoYykgPT4gYy5jaGFyQ29kZUF0KDApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNoYWxsZW5nZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgdXNlciBJRCB0byBhcHByb3ByaWF0ZSBmb3JtYXRcclxuICogSGFuZGxlcyBib3RoIHN0cmluZyAoYmFzZTY0dXJsKSBhbmQgVWludDhBcnJheSBpbnB1dHNcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NVc2VySWQoXHJcbiAgdXNlcklkPzogc3RyaW5nIHwgVWludDhBcnJheSxcclxuICB1c2VybmFtZT86IHN0cmluZ1xyXG4pOiBVaW50OEFycmF5IHtcclxuICBpZiAodXNlcklkKSB7XHJcbiAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgLy8gQXNzdW1lIGJhc2U2NHVybCBzdHJpbmcsIGNvbnZlcnQgdG8gVWludDhBcnJheVxyXG4gICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxyXG4gICAgICAgIGF0b2IodXNlcklkLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLFxyXG4gICAgICAgIChjKSA9PiBjLmNoYXJDb2RlQXQoMClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VySWQ7XHJcbiAgfVxyXG5cclxuICBpZiAodXNlcm5hbWUpIHtcclxuICAgIHJldHVybiBnZW5lcmF0ZVVzZXJJZCh1c2VybmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLyBGYWxsYmFjayB0byByYW5kb20gSURcclxuICByZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBzdHJpbmcgY3JlZGVudGlhbCBJRHMgdG8gUHVibGljS2V5Q3JlZGVudGlhbERlc2NyaXB0b3IgZm9ybWF0XHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzQ3JlZGVudGlhbERlc2NyaXB0b3JzKFxyXG4gIGNyZWRlbnRpYWxzPzogUHVibGljS2V5Q3JlZGVudGlhbERlc2NyaXB0b3JbXSB8IHN0cmluZ1tdXHJcbik6IFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yW10gfCB1bmRlZmluZWQge1xyXG4gIGlmICghY3JlZGVudGlhbHMgfHwgY3JlZGVudGlhbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8gSWYgYWxyZWFkeSBpbiBkZXNjcmlwdG9yIGZvcm1hdCwgcmV0dXJuIGFzLWlzXHJcbiAgaWYgKHR5cGVvZiBjcmVkZW50aWFsc1swXSA9PT0gJ29iamVjdCcgJiYgJ3R5cGUnIGluIGNyZWRlbnRpYWxzWzBdKSB7XHJcbiAgICByZXR1cm4gY3JlZGVudGlhbHMgYXMgUHVibGljS2V5Q3JlZGVudGlhbERlc2NyaXB0b3JbXTtcclxuICB9XHJcblxyXG4gIC8vIENvbnZlcnQgc3RyaW5nIElEcyB0byBkZXNjcmlwdG9yc1xyXG4gIHJldHVybiAoY3JlZGVudGlhbHMgYXMgc3RyaW5nW10pLm1hcCgoaWQpID0+ICh7XHJcbiAgICB0eXBlOiAncHVibGljLWtleScgYXMgY29uc3QsXHJcbiAgICBpZDogVWludDhBcnJheS5mcm9tKGF0b2IoaWQucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKSksIChjKSA9PlxyXG4gICAgICBjLmNoYXJDb2RlQXQoMClcclxuICAgICksXHJcbiAgfSkpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBhIHByZXNldCBjb25maWd1cmF0aW9uIGJ5IG5hbWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJlc2V0KHByZXNldE5hbWU6IFByZXNldE5hbWUpIHtcclxuICBjb25zdCBwcmVzZXQgPSBQUkVTRVRfTUFQW3ByZXNldE5hbWVdO1xyXG4gIGlmICghcHJlc2V0KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJlc2V0OiAke3ByZXNldE5hbWV9YCk7XHJcbiAgfVxyXG4gIHJldHVybiBwcmVzZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBjb21wbGV0ZSBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIGZyb20gUmVnaXN0ZXJDb25maWdcclxuICogTm93IHVzZXMgV2ViQXV0aG5Db25maWcgZm9yIGJldHRlciBkZWZhdWx0cyBhbmQgcmVseWluZyBwYXJ0eSBpbmZvcm1hdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ3JlYXRpb25PcHRpb25zRnJvbUNvbmZpZyhcclxuICBjb25maWc6IFJlZ2lzdGVyQ29uZmlnLFxyXG4gIHdlYkF1dGhuQ29uZmlnOiBXZWJBdXRobkNvbmZpZ1xyXG4pOiBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIHtcclxuICAvLyBTdGFydCB3aXRoIGJhc2UgY29uZmlndXJhdGlvbiBmcm9tIFdlYkF1dGhuQ29uZmlnXHJcbiAgbGV0IG9wdGlvbnM6IFBhcnRpYWw8UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucz4gPSB7XHJcbiAgICB0aW1lb3V0OiB3ZWJBdXRobkNvbmZpZy5kZWZhdWx0VGltZW91dCB8fCA2MDAwMCxcclxuICAgIGF0dGVzdGF0aW9uOiB3ZWJBdXRobkNvbmZpZy5kZWZhdWx0QXR0ZXN0YXRpb24gfHwgJ25vbmUnLFxyXG4gIH07XHJcblxyXG4gIC8vIEFwcGx5IHByZXNldCBpZiBzcGVjaWZpZWRcclxuICBpZiAoY29uZmlnLnByZXNldCkge1xyXG4gICAgY29uc3QgcHJlc2V0ID0gcmVzb2x2ZVByZXNldChjb25maWcucHJlc2V0KTtcclxuICAgIG9wdGlvbnMgPSBkZWVwTWVyZ2Uob3B0aW9ucywge1xyXG4gICAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiBwcmVzZXQuYXV0aGVudGljYXRvclNlbGVjdGlvbixcclxuICAgICAgcHViS2V5Q3JlZFBhcmFtczogWy4uLnByZXNldC5wdWJLZXlDcmVkUGFyYW1zXSwgLy8gQ29udmVydCByZWFkb25seSB0byBtdXRhYmxlXHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBhdXRoZW50aWNhdG9yIHNlbGVjdGlvbiBmcm9tIGNvbmZpZ1xyXG4gICAgaWYgKHdlYkF1dGhuQ29uZmlnLmRlZmF1bHRBdXRoZW50aWNhdG9yU2VsZWN0aW9uKSB7XHJcbiAgICAgIG9wdGlvbnMuYXV0aGVudGljYXRvclNlbGVjdGlvbiA9XHJcbiAgICAgICAgd2ViQXV0aG5Db25maWcuZGVmYXVsdEF1dGhlbnRpY2F0b3JTZWxlY3Rpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBBcHBseSB1c2VyIG92ZXJyaWRlc1xyXG4gIGlmIChjb25maWcudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBvcHRpb25zLnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcclxuICB9XHJcblxyXG4gIGlmIChjb25maWcuYXR0ZXN0YXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucy5hdHRlc3RhdGlvbiA9IGNvbmZpZy5hdHRlc3RhdGlvbjtcclxuICB9XHJcblxyXG4gIGlmIChjb25maWcuYXV0aGVudGljYXRvclNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBvcHRpb25zLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24gPSBkZWVwTWVyZ2UoXHJcbiAgICAgIG9wdGlvbnMuYXV0aGVudGljYXRvclNlbGVjdGlvbiB8fCB7fSxcclxuICAgICAgY29uZmlnLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpZiAoY29uZmlnLnB1YktleUNyZWRQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucy5wdWJLZXlDcmVkUGFyYW1zID0gY29uZmlnLnB1YktleUNyZWRQYXJhbXM7XHJcbiAgfVxyXG5cclxuICBpZiAoY29uZmlnLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucy5leHRlbnNpb25zID0gY29uZmlnLmV4dGVuc2lvbnM7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgcmVxdWlyZWQgZmllbGRzXHJcbiAgY29uc3QgY2hhbGxlbmdlID0gcHJvY2Vzc0NoYWxsZW5nZShjb25maWcuY2hhbGxlbmdlKTtcclxuICBjb25zdCB1c2VySWQgPSBwcm9jZXNzVXNlcklkKGNvbmZpZy51c2VySWQsIGNvbmZpZy51c2VybmFtZSk7XHJcblxyXG4gIC8vIFVzZSByZWx5aW5nIHBhcnR5IGZyb20gY29uZmlnLCB3aXRoIHVzZXIgb3ZlcnJpZGUgY2FwYWJpbGl0eVxyXG4gIGNvbnN0IHJlbHlpbmdQYXJ0eSA9IGNvbmZpZy5ycCB8fCB3ZWJBdXRobkNvbmZpZy5yZWx5aW5nUGFydHk7XHJcblxyXG4gIC8vIEJ1aWxkIGZpbmFsIG9wdGlvbnNcclxuICBjb25zdCBmaW5hbE9wdGlvbnM6IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgPSB7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgcnA6IHJlbHlpbmdQYXJ0eSxcclxuICAgIHVzZXI6IHtcclxuICAgICAgaWQ6IHVzZXJJZCxcclxuICAgICAgbmFtZTogY29uZmlnLnVzZXJuYW1lLFxyXG4gICAgICBkaXNwbGF5TmFtZTogY29uZmlnLmRpc3BsYXlOYW1lIHx8IGNvbmZpZy51c2VybmFtZSxcclxuICAgIH0sXHJcbiAgICBjaGFsbGVuZ2UsXHJcbiAgICBwdWJLZXlDcmVkUGFyYW1zOiBvcHRpb25zLnB1YktleUNyZWRQYXJhbXMgfHxcclxuICAgICAgd2ViQXV0aG5Db25maWcuZGVmYXVsdEFsZ29yaXRobXMgfHwgW1xyXG4gICAgICAgIHsgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC03IH0sIC8vIEVTMjU2XHJcbiAgICAgICAgeyB0eXBlOiAncHVibGljLWtleScsIGFsZzogLTI1NyB9LCAvLyBSUzI1NlxyXG4gICAgICBdLFxyXG4gICAgZXhjbHVkZUNyZWRlbnRpYWxzOiBwcm9jZXNzQ3JlZGVudGlhbERlc2NyaXB0b3JzKGNvbmZpZy5leGNsdWRlQ3JlZGVudGlhbHMpLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBmaW5hbE9wdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBjb21wbGV0ZSBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMgZnJvbSBBdXRoZW50aWNhdGVDb25maWdcclxuICogTm93IHVzZXMgV2ViQXV0aG5Db25maWcgZm9yIGJldHRlciBkZWZhdWx0c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVxdWVzdE9wdGlvbnNGcm9tQ29uZmlnKFxyXG4gIGNvbmZpZzogQXV0aGVudGljYXRlQ29uZmlnLFxyXG4gIHdlYkF1dGhuQ29uZmlnOiBXZWJBdXRobkNvbmZpZ1xyXG4pOiBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMge1xyXG4gIC8vIFN0YXJ0IHdpdGggYmFzZSBjb25maWd1cmF0aW9uIGZyb20gV2ViQXV0aG5Db25maWdcclxuICBjb25zdCBvcHRpb25zOiBQYXJ0aWFsPFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucz4gPSB7XHJcbiAgICB0aW1lb3V0OiB3ZWJBdXRobkNvbmZpZy5kZWZhdWx0VGltZW91dCB8fCA2MDAwMCxcclxuICAgIHVzZXJWZXJpZmljYXRpb246IHdlYkF1dGhuQ29uZmlnLmVuZm9yY2VVc2VyVmVyaWZpY2F0aW9uXHJcbiAgICAgID8gJ3JlcXVpcmVkJ1xyXG4gICAgICA6ICdwcmVmZXJyZWQnLFxyXG4gIH07XHJcblxyXG4gIC8vIEFwcGx5IHByZXNldCBpZiBzcGVjaWZpZWRcclxuICBpZiAoY29uZmlnLnByZXNldCkge1xyXG4gICAgY29uc3QgcHJlc2V0ID0gcmVzb2x2ZVByZXNldChjb25maWcucHJlc2V0KTtcclxuICAgIC8vIEV4dHJhY3QgcmVsZXZhbnQgcGFydHMgZm9yIGF1dGhlbnRpY2F0aW9uICh1c2VyVmVyaWZpY2F0aW9uIGZyb20gYXV0aGVudGljYXRvclNlbGVjdGlvbilcclxuICAgIGlmIChwcmVzZXQuYXV0aGVudGljYXRvclNlbGVjdGlvbj8udXNlclZlcmlmaWNhdGlvbikge1xyXG4gICAgICBvcHRpb25zLnVzZXJWZXJpZmljYXRpb24gPSBwcmVzZXQuYXV0aGVudGljYXRvclNlbGVjdGlvbi51c2VyVmVyaWZpY2F0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQXBwbHkgdXNlciBvdmVycmlkZXNcclxuICBpZiAoY29uZmlnLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucy50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XHJcbiAgfVxyXG5cclxuICBpZiAoY29uZmlnLnVzZXJWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucy51c2VyVmVyaWZpY2F0aW9uID0gY29uZmlnLnVzZXJWZXJpZmljYXRpb247XHJcbiAgfVxyXG5cclxuICBpZiAoY29uZmlnLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucy5leHRlbnNpb25zID0gY29uZmlnLmV4dGVuc2lvbnM7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgcmVxdWlyZWQgZmllbGRzXHJcbiAgY29uc3QgY2hhbGxlbmdlID0gcHJvY2Vzc0NoYWxsZW5nZShjb25maWcuY2hhbGxlbmdlKTtcclxuXHJcbiAgLy8gQnVpbGQgZmluYWwgb3B0aW9uc1xyXG4gIGNvbnN0IGZpbmFsT3B0aW9uczogUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zID0ge1xyXG4gICAgLi4ub3B0aW9ucyxcclxuICAgIGNoYWxsZW5nZSxcclxuICAgIGFsbG93Q3JlZGVudGlhbHM6IHByb2Nlc3NDcmVkZW50aWFsRGVzY3JpcHRvcnMoY29uZmlnLmFsbG93Q3JlZGVudGlhbHMpLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBmaW5hbE9wdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWYWxpZGF0ZSB0aGF0IGEgUmVnaXN0ZXJDb25maWcgaGFzIGFsbCByZXF1aXJlZCBmaWVsZHNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2lzdGVyQ29uZmlnKGNvbmZpZzogUmVnaXN0ZXJDb25maWcpOiB2b2lkIHtcclxuICBpZiAoIWNvbmZpZy51c2VybmFtZSB8fCB0eXBlb2YgY29uZmlnLnVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWdpc3RlckNvbmZpZyBtdXN0IGhhdmUgYSB2YWxpZCB1c2VybmFtZScpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGNvbmZpZy5wcmVzZXQgJiYgIVBSRVNFVF9NQVBbY29uZmlnLnByZXNldF0pIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYEludmFsaWQgcHJlc2V0OiAke2NvbmZpZy5wcmVzZXR9LiBWYWxpZCBwcmVzZXRzIGFyZTogJHtPYmplY3Qua2V5cyhcclxuICAgICAgICBQUkVTRVRfTUFQXHJcbiAgICAgICkuam9pbignLCAnKX1gXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRlIHRoYXQgYW4gQXV0aGVudGljYXRlQ29uZmlnIGhhcyBhbGwgcmVxdWlyZWQgZmllbGRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBdXRoZW50aWNhdGVDb25maWcoY29uZmlnOiBBdXRoZW50aWNhdGVDb25maWcpOiB2b2lkIHtcclxuICBpZiAoY29uZmlnLnByZXNldCAmJiAhUFJFU0VUX01BUFtjb25maWcucHJlc2V0XSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICBgSW52YWxpZCBwcmVzZXQ6ICR7Y29uZmlnLnByZXNldH0uIFZhbGlkIHByZXNldHMgYXJlOiAke09iamVjdC5rZXlzKFxyXG4gICAgICAgIFBSRVNFVF9NQVBcclxuICAgICAgKS5qb2luKCcsICcpfWBcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==","/**\n * Enhanced WebAuthn Error Classes\n * Provides specific, actionable error types for better developer experience\n */\nexport var WebAuthnErrorType;\n(function (WebAuthnErrorType) {\n WebAuthnErrorType[\"NOT_SUPPORTED\"] = \"NOT_SUPPORTED\";\n WebAuthnErrorType[\"USER_CANCELLED\"] = \"USER_CANCELLED\";\n WebAuthnErrorType[\"AUTHENTICATOR_ERROR\"] = \"AUTHENTICATOR_ERROR\";\n WebAuthnErrorType[\"INVALID_OPTIONS\"] = \"INVALID_OPTIONS\";\n WebAuthnErrorType[\"UNSUPPORTED_OPERATION\"] = \"UNSUPPORTED_OPERATION\";\n WebAuthnErrorType[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n WebAuthnErrorType[\"SECURITY_ERROR\"] = \"SECURITY_ERROR\";\n WebAuthnErrorType[\"TIMEOUT_ERROR\"] = \"TIMEOUT_ERROR\";\n WebAuthnErrorType[\"UNKNOWN\"] = \"UNKNOWN\";\n})(WebAuthnErrorType || (WebAuthnErrorType = {}));\n/**\n * Base WebAuthn error class with additional context\n */\nexport class WebAuthnError extends Error {\n type;\n originalError;\n constructor(type, message, originalError) {\n super(message);\n this.type = type;\n this.originalError = originalError;\n this.name = 'WebAuthnError';\n }\n static fromDOMException(error) {\n const type = WebAuthnError.mapDOMExceptionToType(error.name);\n return new WebAuthnError(type, error.message, error);\n }\n static mapDOMExceptionToType(name) {\n switch (name) {\n case 'NotSupportedError':\n return WebAuthnErrorType.NOT_SUPPORTED;\n case 'NotAllowedError':\n return WebAuthnErrorType.USER_CANCELLED;\n case 'InvalidStateError':\n return WebAuthnErrorType.AUTHENTICATOR_ERROR;\n case 'SecurityError':\n return WebAuthnErrorType.SECURITY_ERROR;\n case 'TimeoutError':\n return WebAuthnErrorType.TIMEOUT_ERROR;\n case 'NetworkError':\n return WebAuthnErrorType.NETWORK_ERROR;\n case 'EncodingError':\n return WebAuthnErrorType.INVALID_OPTIONS;\n default:\n return WebAuthnErrorType.UNKNOWN;\n }\n }\n}\n/**\n * Error thrown when user cancels the WebAuthn operation\n */\nexport class UserCancelledError extends WebAuthnError {\n constructor(originalError) {\n super(WebAuthnErrorType.USER_CANCELLED, 'User cancelled the WebAuthn operation', originalError);\n this.name = 'UserCancelledError';\n }\n}\n/**\n * Error thrown when there's an issue with the authenticator\n */\nexport class AuthenticatorError extends WebAuthnError {\n constructor(message, originalError) {\n super(WebAuthnErrorType.AUTHENTICATOR_ERROR, `Authenticator error: ${message}`, originalError);\n this.name = 'AuthenticatorError';\n }\n}\n/**\n * Error thrown when the provided options are invalid\n */\nexport class InvalidOptionsError extends WebAuthnError {\n constructor(message, originalError) {\n super(WebAuthnErrorType.INVALID_OPTIONS, `Invalid options: ${message}`, originalError);\n this.name = 'InvalidOptionsError';\n }\n}\n/**\n * Error thrown when the requested operation is not supported\n */\nexport class UnsupportedOperationError extends WebAuthnError {\n constructor(message, originalError) {\n super(WebAuthnErrorType.UNSUPPORTED_OPERATION, `Unsupported operation: ${message}`, originalError);\n this.name = 'UnsupportedOperationError';\n }\n}\n/**\n * Error thrown when there's a network-related issue\n */\nexport class NetworkError extends WebAuthnError {\n constructor(message, originalError) {\n super(WebAuthnErrorType.NETWORK_ERROR, `Network error: ${message}`, originalError);\n this.name = 'NetworkError';\n }\n}\n/**\n * Error thrown when there's a security-related issue\n */\nexport class SecurityError extends WebAuthnError {\n constructor(message, originalError) {\n super(WebAuthnErrorType.SECURITY_ERROR, `Security error: ${message}`, originalError);\n this.name = 'SecurityError';\n }\n}\n/**\n * Error thrown when the operation times out\n */\nexport class TimeoutError extends WebAuthnError {\n constructor(message, originalError) {\n super(WebAuthnErrorType.TIMEOUT_ERROR, `Timeout error: ${message}`, originalError);\n this.name = 'TimeoutError';\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4uZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi9lcnJvcnMvd2ViYXV0aG4uZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE1BQU0sQ0FBTixJQUFZLGlCQVVYO0FBVkQsV0FBWSxpQkFBaUI7SUFDM0Isb0RBQStCLENBQUE7SUFDL0Isc0RBQWlDLENBQUE7SUFDakMsZ0VBQTJDLENBQUE7SUFDM0Msd0RBQW1DLENBQUE7SUFDbkMsb0VBQStDLENBQUE7SUFDL0Msb0RBQStCLENBQUE7SUFDL0Isc0RBQWlDLENBQUE7SUFDakMsb0RBQStCLENBQUE7SUFDL0Isd0NBQW1CLENBQUE7QUFDckIsQ0FBQyxFQVZXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFVNUI7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsS0FBSztJQUVwQjtJQUVBO0lBSGxCLFlBQ2tCLElBQXVCLEVBQ3ZDLE9BQWUsRUFDQyxhQUFxQjtRQUVyQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFKQyxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUV2QixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUdyQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQW1CO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQVk7UUFDL0MsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssbUJBQW1CO2dCQUN0QixPQUFPLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztZQUN6QyxLQUFLLGlCQUFpQjtnQkFDcEIsT0FBTyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDMUMsS0FBSyxtQkFBbUI7Z0JBQ3RCLE9BQU8saUJBQWlCLENBQUMsbUJBQW1CLENBQUM7WUFDL0MsS0FBSyxlQUFlO2dCQUNsQixPQUFPLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztZQUMxQyxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8saUJBQWlCLENBQUMsYUFBYSxDQUFDO1lBQ3pDLEtBQUssY0FBYztnQkFDakIsT0FBTyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7WUFDekMsS0FBSyxlQUFlO2dCQUNsQixPQUFPLGlCQUFpQixDQUFDLGVBQWUsQ0FBQztZQUMzQztnQkFDRSxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsYUFBYTtJQUNuRCxZQUFZLGFBQXFCO1FBQy9CLEtBQUssQ0FDSCxpQkFBaUIsQ0FBQyxjQUFjLEVBQ2hDLHVDQUF1QyxFQUN2QyxhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsYUFBYTtJQUNuRCxZQUFZLE9BQWUsRUFBRSxhQUFxQjtRQUNoRCxLQUFLLENBQ0gsaUJBQWlCLENBQUMsbUJBQW1CLEVBQ3JDLHdCQUF3QixPQUFPLEVBQUUsRUFDakMsYUFBYSxDQUNkLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGFBQWE7SUFDcEQsWUFBWSxPQUFlLEVBQUUsYUFBcUI7UUFDaEQsS0FBSyxDQUNILGlCQUFpQixDQUFDLGVBQWUsRUFDakMsb0JBQW9CLE9BQU8sRUFBRSxFQUM3QixhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsYUFBYTtJQUMxRCxZQUFZLE9BQWUsRUFBRSxhQUFxQjtRQUNoRCxLQUFLLENBQ0gsaUJBQWlCLENBQUMscUJBQXFCLEVBQ3ZDLDBCQUEwQixPQUFPLEVBQUUsRUFDbkMsYUFBYSxDQUNkLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLDJCQUEyQixDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxhQUFhO0lBQzdDLFlBQVksT0FBZSxFQUFFLGFBQXFCO1FBQ2hELEtBQUssQ0FDSCxpQkFBaUIsQ0FBQyxhQUFhLEVBQy9CLGtCQUFrQixPQUFPLEVBQUUsRUFDM0IsYUFBYSxDQUNkLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsYUFBYTtJQUM5QyxZQUFZLE9BQWUsRUFBRSxhQUFxQjtRQUNoRCxLQUFLLENBQ0gsaUJBQWlCLENBQUMsY0FBYyxFQUNoQyxtQkFBbUIsT0FBTyxFQUFFLEVBQzVCLGFBQWEsQ0FDZCxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBYSxTQUFRLGFBQWE7SUFDN0MsWUFBWSxPQUFlLEVBQUUsYUFBcUI7UUFDaEQsS0FBSyxDQUNILGlCQUFpQixDQUFDLGFBQWEsRUFDL0Isa0JBQWtCLE9BQU8sRUFBRSxFQUMzQixhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5oYW5jZWQgV2ViQXV0aG4gRXJyb3IgQ2xhc3Nlc1xuICogUHJvdmlkZXMgc3BlY2lmaWMsIGFjdGlvbmFibGUgZXJyb3IgdHlwZXMgZm9yIGJldHRlciBkZXZlbG9wZXIgZXhwZXJpZW5jZVxuICovXG5cbmV4cG9ydCBlbnVtIFdlYkF1dGhuRXJyb3JUeXBlIHtcbiAgTk9UX1NVUFBPUlRFRCA9ICdOT1RfU1VQUE9SVEVEJyxcbiAgVVNFUl9DQU5DRUxMRUQgPSAnVVNFUl9DQU5DRUxMRUQnLFxuICBBVVRIRU5USUNBVE9SX0VSUk9SID0gJ0FVVEhFTlRJQ0FUT1JfRVJST1InLFxuICBJTlZBTElEX09QVElPTlMgPSAnSU5WQUxJRF9PUFRJT05TJyxcbiAgVU5TVVBQT1JURURfT1BFUkFUSU9OID0gJ1VOU1VQUE9SVEVEX09QRVJBVElPTicsXG4gIE5FVFdPUktfRVJST1IgPSAnTkVUV09SS19FUlJPUicsXG4gIFNFQ1VSSVRZX0VSUk9SID0gJ1NFQ1VSSVRZX0VSUk9SJyxcbiAgVElNRU9VVF9FUlJPUiA9ICdUSU1FT1VUX0VSUk9SJyxcbiAgVU5LTk9XTiA9ICdVTktOT1dOJyxcbn1cblxuLyoqXG4gKiBCYXNlIFdlYkF1dGhuIGVycm9yIGNsYXNzIHdpdGggYWRkaXRpb25hbCBjb250ZXh0XG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJBdXRobkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogV2ViQXV0aG5FcnJvclR5cGUsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5hbEVycm9yPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1dlYkF1dGhuRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGZyb21ET01FeGNlcHRpb24oZXJyb3I6IERPTUV4Y2VwdGlvbik6IFdlYkF1dGhuRXJyb3Ige1xuICAgIGNvbnN0IHR5cGUgPSBXZWJBdXRobkVycm9yLm1hcERPTUV4Y2VwdGlvblRvVHlwZShlcnJvci5uYW1lKTtcbiAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3IodHlwZSwgZXJyb3IubWVzc2FnZSwgZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwRE9NRXhjZXB0aW9uVG9UeXBlKG5hbWU6IHN0cmluZyk6IFdlYkF1dGhuRXJyb3JUeXBlIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ05vdFN1cHBvcnRlZEVycm9yJzpcbiAgICAgICAgcmV0dXJuIFdlYkF1dGhuRXJyb3JUeXBlLk5PVF9TVVBQT1JURUQ7XG4gICAgICBjYXNlICdOb3RBbGxvd2VkRXJyb3InOlxuICAgICAgICByZXR1cm4gV2ViQXV0aG5FcnJvclR5cGUuVVNFUl9DQU5DRUxMRUQ7XG4gICAgICBjYXNlICdJbnZhbGlkU3RhdGVFcnJvcic6XG4gICAgICAgIHJldHVybiBXZWJBdXRobkVycm9yVHlwZS5BVVRIRU5USUNBVE9SX0VSUk9SO1xuICAgICAgY2FzZSAnU2VjdXJpdHlFcnJvcic6XG4gICAgICAgIHJldHVybiBXZWJBdXRobkVycm9yVHlwZS5TRUNVUklUWV9FUlJPUjtcbiAgICAgIGNhc2UgJ1RpbWVvdXRFcnJvcic6XG4gICAgICAgIHJldHVybiBXZWJBdXRobkVycm9yVHlwZS5USU1FT1VUX0VSUk9SO1xuICAgICAgY2FzZSAnTmV0d29ya0Vycm9yJzpcbiAgICAgICAgcmV0dXJuIFdlYkF1dGhuRXJyb3JUeXBlLk5FVFdPUktfRVJST1I7XG4gICAgICBjYXNlICdFbmNvZGluZ0Vycm9yJzpcbiAgICAgICAgcmV0dXJuIFdlYkF1dGhuRXJyb3JUeXBlLklOVkFMSURfT1BUSU9OUztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBXZWJBdXRobkVycm9yVHlwZS5VTktOT1dOO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHVzZXIgY2FuY2VscyB0aGUgV2ViQXV0aG4gb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQ2FuY2VsbGVkRXJyb3IgZXh0ZW5kcyBXZWJBdXRobkVycm9yIHtcbiAgY29uc3RydWN0b3Iob3JpZ2luYWxFcnJvcj86IEVycm9yKSB7XG4gICAgc3VwZXIoXG4gICAgICBXZWJBdXRobkVycm9yVHlwZS5VU0VSX0NBTkNFTExFRCxcbiAgICAgICdVc2VyIGNhbmNlbGxlZCB0aGUgV2ViQXV0aG4gb3BlcmF0aW9uJyxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdVc2VyQ2FuY2VsbGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUncyBhbiBpc3N1ZSB3aXRoIHRoZSBhdXRoZW50aWNhdG9yXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdG9yRXJyb3IgZXh0ZW5kcyBXZWJBdXRobkVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcmlnaW5hbEVycm9yPzogRXJyb3IpIHtcbiAgICBzdXBlcihcbiAgICAgIFdlYkF1dGhuRXJyb3JUeXBlLkFVVEhFTlRJQ0FUT1JfRVJST1IsXG4gICAgICBgQXV0aGVudGljYXRvciBlcnJvcjogJHttZXNzYWdlfWAsXG4gICAgICBvcmlnaW5hbEVycm9yXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnQXV0aGVudGljYXRvckVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBwcm92aWRlZCBvcHRpb25zIGFyZSBpbnZhbGlkXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkT3B0aW9uc0Vycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3JpZ2luYWxFcnJvcj86IEVycm9yKSB7XG4gICAgc3VwZXIoXG4gICAgICBXZWJBdXRobkVycm9yVHlwZS5JTlZBTElEX09QVElPTlMsXG4gICAgICBgSW52YWxpZCBvcHRpb25zOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkT3B0aW9uc0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IgZXh0ZW5kcyBXZWJBdXRobkVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcmlnaW5hbEVycm9yPzogRXJyb3IpIHtcbiAgICBzdXBlcihcbiAgICAgIFdlYkF1dGhuRXJyb3JUeXBlLlVOU1VQUE9SVEVEX09QRVJBVElPTixcbiAgICAgIGBVbnN1cHBvcnRlZCBvcGVyYXRpb246ICR7bWVzc2FnZX1gLFxuICAgICAgb3JpZ2luYWxFcnJvclxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUncyBhIG5ldHdvcmstcmVsYXRlZCBpc3N1ZVxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya0Vycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3JpZ2luYWxFcnJvcj86IEVycm9yKSB7XG4gICAgc3VwZXIoXG4gICAgICBXZWJBdXRobkVycm9yVHlwZS5ORVRXT1JLX0VSUk9SLFxuICAgICAgYE5ldHdvcmsgZXJyb3I6ICR7bWVzc2FnZX1gLFxuICAgICAgb3JpZ2luYWxFcnJvclxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ05ldHdvcmtFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSdzIGEgc2VjdXJpdHktcmVsYXRlZCBpc3N1ZVxuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlFcnJvciBleHRlbmRzIFdlYkF1dGhuRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9yaWdpbmFsRXJyb3I/OiBFcnJvcikge1xuICAgIHN1cGVyKFxuICAgICAgV2ViQXV0aG5FcnJvclR5cGUuU0VDVVJJVFlfRVJST1IsXG4gICAgICBgU2VjdXJpdHkgZXJyb3I6ICR7bWVzc2FnZX1gLFxuICAgICAgb3JpZ2luYWxFcnJvclxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1NlY3VyaXR5RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIG9wZXJhdGlvbiB0aW1lcyBvdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIFdlYkF1dGhuRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9yaWdpbmFsRXJyb3I/OiBFcnJvcikge1xuICAgIHN1cGVyKFxuICAgICAgV2ViQXV0aG5FcnJvclR5cGUuVElNRU9VVF9FUlJPUixcbiAgICAgIGBUaW1lb3V0IGVycm9yOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuICB9XG59XG4iXX0=","/**\n * WebAuthn Configuration\n * Provides configuration interfaces and injection token for WebAuthn service\n */\nimport { InjectionToken } from '@angular/core';\n/**\n * Default configuration for WebAuthn service\n * Note: relyingParty must be provided by the application\n */\nexport const DEFAULT_WEBAUTHN_CONFIG = {\n defaultTimeout: 60000,\n defaultAlgorithms: [\n { type: 'public-key', alg: -7 }, // ES256 (ECDSA w/ SHA-256)\n { type: 'public-key', alg: -257 }, // RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256)\n ],\n enforceUserVerification: false,\n defaultAttestation: 'none',\n defaultAuthenticatorSelection: {\n userVerification: 'preferred',\n },\n};\n/**\n * Injection token for WebAuthn configuration\n */\nexport const WEBAUTHN_CONFIG = new InjectionToken('WEBAUTHN_CONFIG');\n/**\n * Creates a complete WebAuthn configuration with required relying party information\n * @param relyingParty Required relying party configuration\n * @param overrides Optional configuration overrides\n */\nexport function createWebAuthnConfig(relyingParty, overrides) {\n return {\n relyingParty,\n ...DEFAULT_WEBAUTHN_CONFIG,\n ...overrides,\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4uY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi9jb25maWcvd2ViYXV0aG4uY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUE0RC9DOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUF5QztJQUMzRSxjQUFjLEVBQUUsS0FBSztJQUNyQixpQkFBaUIsRUFBRTtRQUNqQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsMkJBQTJCO1FBQzVELEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSx1Q0FBdUM7S0FDM0U7SUFDRCx1QkFBdUIsRUFBRSxLQUFLO0lBQzlCLGtCQUFrQixFQUFFLE1BQU07SUFDMUIsNkJBQTZCLEVBQUU7UUFDN0IsZ0JBQWdCLEVBQUUsV0FBVztLQUM5QjtDQUNGLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FDL0MsaUJBQWlCLENBQ2xCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxZQUFnQyxFQUNoQyxTQUF5RDtJQUV6RCxPQUFPO1FBQ0wsWUFBWTtRQUNaLEdBQUcsdUJBQXVCO1FBQzFCLEdBQUcsU0FBUztLQUNiLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFdlYkF1dGhuIENvbmZpZ3VyYXRpb25cclxuICogUHJvdmlkZXMgY29uZmlndXJhdGlvbiBpbnRlcmZhY2VzIGFuZCBpbmplY3Rpb24gdG9rZW4gZm9yIFdlYkF1dGhuIHNlcnZpY2VcclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIFJlcXVpcmVkIHJlbHlpbmcgcGFydHkgY29uZmlndXJhdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZWx5aW5nUGFydHlDb25maWcge1xyXG4gIC8qKlxyXG4gICAqIEh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIHRoZSBSZWx5aW5nIFBhcnR5XHJcbiAgICogQGV4YW1wbGUgXCJBQ01FIENvcnBvcmF0aW9uXCJcclxuICAgKi9cclxuICBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgdmFsaWQgZG9tYWluIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIFJlbHlpbmcgUGFydHkgb24gd2hvc2UgYmVoYWxmIGEgZ2l2ZW4gcmVnaXN0cmF0aW9uIG9yIGF1dGhlbnRpY2F0aW9uIGNlcmVtb255IGlzIGJlaW5nIHBlcmZvcm1lZFxyXG4gICAqIEBleGFtcGxlIFwibG9naW4uZXhhbXBsZS5jb21cIiBvciBcImV4YW1wbGUuY29tXCJcclxuICAgKi9cclxuICBpZD86IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBXZWJBdXRobiBzZXJ2aWNlXHJcbiAqIE5vdyBpbmNsdWRlcyByZXF1aXJlZCByZWx5aW5nIHBhcnR5IGluZm9ybWF0aW9uIGFuZCBhZHZhbmNlZCBvcHRpb25zXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFdlYkF1dGhuQ29uZmlnIHtcclxuICAvKipcclxuICAgKiBSZXF1aXJlZCByZWx5aW5nIHBhcnR5IGluZm9ybWF0aW9uIGZvciBXZWJBdXRobiBvcGVyYXRpb25zXHJcbiAgICogVGhpcyBpcyBjcml0aWNhbCBmb3Igc2VjdXJpdHkgLSBtdXN0IGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkgZm9yIHByb2R1Y3Rpb24gdXNlXHJcbiAgICovXHJcbiAgcmVseWluZ1BhcnR5OiBSZWx5aW5nUGFydHlDb25maWc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmF1bHQgdGltZW91dCBmb3IgV2ViQXV0aG4gb3BlcmF0aW9ucyBpbiBtaWxsaXNlY29uZHNcclxuICAgKiBAZGVmYXVsdCA2MDAwMFxyXG4gICAqL1xyXG4gIGRlZmF1bHRUaW1lb3V0PzogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IHB1YmxpYyBrZXkgY3JlZGVudGlhbCBhbGdvcml0aG1zIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcclxuICAgKiBAZGVmYXVsdCBbRVMyNTYsIFJTMjU2XVxyXG4gICAqL1xyXG4gIGRlZmF1bHRBbGdvcml0aG1zPzogUHVibGljS2V5Q3JlZGVudGlhbFBhcmFtZXRlcnNbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBlbmZvcmNlIHVzZXIgdmVyaWZpY2F0aW9uIGJ5IGRlZmF1bHRcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqL1xyXG4gIGVuZm9yY2VVc2VyVmVyaWZpY2F0aW9uPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBhdHRlc3RhdGlvbiBjb252ZXlhbmNlIHByZWZlcmVuY2VcclxuICAgKiBAZGVmYXVsdCBcIm5vbmVcIlxyXG4gICAqL1xyXG4gIGRlZmF1bHRBdHRlc3RhdGlvbj86IEF0dGVzdGF0aW9uQ29udmV5YW5jZVByZWZlcmVuY2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmF1bHQgYXV0aGVudGljYXRvciBzZWxlY3Rpb24gY3JpdGVyaWFcclxuICAgKi9cclxuICBkZWZhdWx0QXV0aGVudGljYXRvclNlbGVjdGlvbj86IEF1dGhlbnRpY2F0b3JTZWxlY3Rpb25Dcml0ZXJpYTtcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgV2ViQXV0aG4gc2VydmljZVxyXG4gKiBOb3RlOiByZWx5aW5nUGFydHkgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb25cclxuICovXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1dFQkFVVEhOX0NPTkZJRzogT21pdDxXZWJBdXRobkNvbmZpZywgJ3JlbHlpbmdQYXJ0eSc+ID0ge1xyXG4gIGRlZmF1bHRUaW1lb3V0OiA2MDAwMCxcclxuICBkZWZhdWx0QWxnb3JpdGhtczogW1xyXG4gICAgeyB0eXBlOiAncHVibGljLWtleScsIGFsZzogLTcgfSwgLy8gRVMyNTYgKEVDRFNBIHcvIFNIQS0yNTYpXHJcbiAgICB7IHR5cGU6ICdwdWJsaWMta2V5JywgYWxnOiAtMjU3IH0sIC8vIFJTMjU2IChSU0FTU0EtUEtDUzEtdjFfNSB3LyBTSEEtMjU2KVxyXG4gIF0sXHJcbiAgZW5mb3JjZVVzZXJWZXJpZmljYXRpb246IGZhbHNlLFxyXG4gIGRlZmF1bHRBdHRlc3RhdGlvbjogJ25vbmUnLFxyXG4gIGRlZmF1bHRBdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XHJcbiAgICB1c2VyVmVyaWZpY2F0aW9uOiAncHJlZmVycmVkJyxcclxuICB9LFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgV2ViQXV0aG4gY29uZmlndXJhdGlvblxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFdFQkFVVEhOX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxXZWJBdXRobkNvbmZpZz4oXHJcbiAgJ1dFQkFVVEhOX0NPTkZJRydcclxuKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgY29tcGxldGUgV2ViQXV0aG4gY29uZmlndXJhdGlvbiB3aXRoIHJlcXVpcmVkIHJlbHlpbmcgcGFydHkgaW5mb3JtYXRpb25cclxuICogQHBhcmFtIHJlbHlpbmdQYXJ0eSBSZXF1aXJlZCByZWx5aW5nIHBhcnR5IGNvbmZpZ3VyYXRpb25cclxuICogQHBhcmFtIG92ZXJyaWRlcyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG92ZXJyaWRlc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYkF1dGhuQ29uZmlnKFxyXG4gIHJlbHlpbmdQYXJ0eTogUmVseWluZ1BhcnR5Q29uZmlnLFxyXG4gIG92ZXJyaWRlcz86IFBhcnRpYWw8T21pdDxXZWJBdXRobkNvbmZpZywgJ3JlbHlpbmdQYXJ0eSc+PlxyXG4pOiBXZWJBdXRobkNvbmZpZyB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlbHlpbmdQYXJ0eSxcclxuICAgIC4uLkRFRkFVTFRfV0VCQVVUSE5fQ09ORklHLFxyXG4gICAgLi4ub3ZlcnJpZGVzLFxyXG4gIH07XHJcbn1cclxuIl19","/**\n * WebAuthn Utility Functions\n * Centralized utilities for ArrayBuffer conversions and WebAuthn-specific operations\n * This is the single source of truth for data transformation functions\n */\n/**\n * Converts a string to ArrayBuffer\n */\nexport function stringToArrayBuffer(str) {\n const encoder = new TextEncoder();\n return encoder.encode(str);\n}\n/**\n * Converts ArrayBuffer to string\n */\nexport function arrayBufferToString(buffer) {\n const decoder = new TextDecoder();\n return decoder.decode(buffer);\n}\n/**\n * Converts ArrayBuffer to base64 string\n */\nexport function arrayBufferToBase64(buffer) {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n/**\n * Converts base64 string to ArrayBuffer\n */\nexport function base64ToArrayBuffer(base64) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n/**\n * Converts base64url string to ArrayBuffer\n */\nexport function base64urlToArrayBuffer(base64url) {\n // Convert base64url to base64\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n // Add padding if necessary\n const padded = base64 + '==='.slice(0, (4 - (base64.length % 4)) % 4);\n return base64ToArrayBuffer(padded);\n}\n/**\n * Converts ArrayBuffer to base64url string\n * This is the canonical implementation used throughout the library\n */\nexport function arrayBufferToBase64url(buffer) {\n const base64 = arrayBufferToBase64(buffer);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n/**\n * Generates a random challenge as ArrayBuffer\n */\nexport function generateChallenge(length = 32) {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return array.buffer;\n}\n/**\n * Generates a random user ID as ArrayBuffer\n */\nexport function generateUserId(length = 32) {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return array.buffer;\n}\n/**\n * Converts credential ID string to ArrayBuffer for WebAuthn API\n */\nexport function credentialIdToArrayBuffer(credentialId) {\n return base64urlToArrayBuffer(credentialId);\n}\n/**\n * Converts ArrayBuffer credential ID to string\n */\nexport function arrayBufferToCredentialId(buffer) {\n return arrayBufferToBase64url(buffer);\n}\n/**\n * Checks if the current environment supports WebAuthn\n */\nexport function isWebAuthnSupported() {\n return !!(typeof window !== 'undefined' &&\n window.PublicKeyCredential &&\n typeof navigator !== 'undefined' &&\n navigator.credentials &&\n typeof navigator.credentials.create === 'function' &&\n typeof navigator.credentials.get === 'function');\n}\n/**\n * Checks if platform authenticator is available\n */\nexport async function isPlatformAuthenticatorAvailable() {\n if (!isWebAuthnSupported()) {\n return false;\n }\n try {\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n catch {\n return false;\n }\n}\n/**\n * Gets supported authenticator transports for this platform\n * Enhanced detection with better browser compatibility\n */\nexport function getSupportedTransports() {\n const transports = ['usb', 'internal'];\n // Add NFC support for Android devices\n if (typeof navigator !== 'undefined' &&\n /Android/i.test(navigator.userAgent)) {\n transports.push('nfc');\n }\n // Add BLE support for modern browsers with Web Bluetooth API\n if (typeof navigator !== 'undefined' && navigator.bluetooth) {\n transports.push('ble');\n }\n return transports;\n}\n/**\n * Validates that required WebAuthn options are present\n */\nexport function validateRegistrationOptions(options) {\n if (!options.user) {\n throw new Error('User information is required for registration');\n }\n if (!options.user.id) {\n throw new Error('User ID is required for registration');\n }\n if (!options.user.name) {\n throw new Error('User name is required for registration');\n }\n if (!options.user.displayName) {\n throw new Error('User display name is required for registration');\n }\n if (!options.rp) {\n throw new Error('Relying party information is required for registration');\n }\n if (!options.rp.name) {\n throw new Error('Relying party name is required for registration');\n }\n}\n/**\n * Creates default public key credential parameters\n */\nexport function getDefaultPubKeyCredParams() {\n return [\n {\n type: 'public-key',\n alg: -7, // ES256\n },\n {\n type: 'public-key',\n alg: -257, // RS256\n },\n ];\n}\n/**\n * Enhanced type guard to detect JSON-formatted WebAuthn options\n * More robust than simple challenge type checking\n */\nexport function isJSONOptions(options) {\n if (!options || typeof options !== 'object') {\n return false;\n }\n // Check multiple indicators that this is JSON format (base64url strings)\n return (typeof options.challenge === 'string' ||\n (options.user && typeof options.user.id === 'string') ||\n (options.allowCredentials?.length > 0 &&\n typeof options.allowCredentials[0]?.id === 'string') ||\n (options.excludeCredentials?.length > 0 &&\n typeof options.excludeCredentials[0]?.id === 'string'));\n}\n/**\n * Type guard to check if input is a PublicKeyCredential\n */\nexport function isPublicKeyCredential(credential) {\n return credential !== null && credential.type === 'public-key';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC13ZWJhdXRobi9zcmMvbGliL3V0aWxzL3dlYmF1dGhuLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFXO0lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFtQjtJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBbUI7SUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFjO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixNQUFNLEtBQUssR0FB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Q0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxVQUE2QjtJQUU3QixPQUFPLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBXZWJBdXRobiBVdGlsaXR5IEZ1bmN0aW9uc1xyXG4gKiBDZW50cmFsaXplZCB1dGlsaXRpZXMgZm9yIEFycmF5QnVmZmVyIGNvbnZlcnNpb25zIGFuZCBXZWJBdXRobi1zcGVjaWZpYyBvcGVyYXRpb25zXHJcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGRhdGEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIEFycmF5QnVmZmVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9BcnJheUJ1ZmZlcihzdHI6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcclxuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XHJcbiAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKHN0cik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBBcnJheUJ1ZmZlciB0byBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvU3RyaW5nKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICByZXR1cm4gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIEFycmF5QnVmZmVyIHRvIGJhc2U2NCBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpKyspIHtcclxuICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcclxuICB9XHJcbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGJhc2U2NCBzdHJpbmcgdG8gQXJyYXlCdWZmZXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NDogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xyXG4gIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcclxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpO1xyXG4gIH1cclxuICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYmFzZTY0dXJsIHN0cmluZyB0byBBcnJheUJ1ZmZlclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NHVybFRvQXJyYXlCdWZmZXIoYmFzZTY0dXJsOiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XHJcbiAgLy8gQ29udmVydCBiYXNlNjR1cmwgdG8gYmFzZTY0XHJcbiAgY29uc3QgYmFzZTY0ID0gYmFzZTY0dXJsLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XHJcbiAgLy8gQWRkIHBhZGRpbmcgaWYgbmVjZXNzYXJ5XHJcbiAgY29uc3QgcGFkZGVkID0gYmFzZTY0ICsgJz09PScuc2xpY2UoMCwgKDQgLSAoYmFzZTY0Lmxlbmd0aCAlIDQpKSAlIDQpO1xyXG4gIHJldHVybiBiYXNlNjRUb0FycmF5QnVmZmVyKHBhZGRlZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBBcnJheUJ1ZmZlciB0byBiYXNlNjR1cmwgc3RyaW5nXHJcbiAqIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBpbXBsZW1lbnRhdGlvbiB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGJhc2U2NCA9IGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyKTtcclxuICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0vZywgJycpO1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIGNoYWxsZW5nZSBhcyBBcnJheUJ1ZmZlclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ2hhbGxlbmdlKGxlbmd0aCA9IDMyKTogQXJyYXlCdWZmZXIge1xyXG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcclxuICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcclxuICByZXR1cm4gYXJyYXkuYnVmZmVyO1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHVzZXIgSUQgYXMgQXJyYXlCdWZmZXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJJZChsZW5ndGggPSAzMik6IEFycmF5QnVmZmVyIHtcclxuICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XHJcbiAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XHJcbiAgcmV0dXJuIGFycmF5LmJ1ZmZlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGNyZWRlbnRpYWwgSUQgc3RyaW5nIHRvIEFycmF5QnVmZmVyIGZvciBXZWJBdXRobiBBUElcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVkZW50aWFsSWRUb0FycmF5QnVmZmVyKGNyZWRlbnRpYWxJZDogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xyXG4gIHJldHVybiBiYXNlNjR1cmxUb0FycmF5QnVmZmVyKGNyZWRlbnRpYWxJZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBBcnJheUJ1ZmZlciBjcmVkZW50aWFsIElEIHRvIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9DcmVkZW50aWFsSWQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGFycmF5QnVmZmVyVG9CYXNlNjR1cmwoYnVmZmVyKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBXZWJBdXRoblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViQXV0aG5TdXBwb3J0ZWQoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuICEhKFxyXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgIHdpbmRvdy5QdWJsaWNLZXlDcmVkZW50aWFsICYmXHJcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgbmF2aWdhdG9yLmNyZWRlbnRpYWxzICYmXHJcbiAgICB0eXBlb2YgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgdHlwZW9mIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQgPT09ICdmdW5jdGlvbidcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHBsYXRmb3JtIGF1dGhlbnRpY2F0b3IgaXMgYXZhaWxhYmxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQbGF0Zm9ybUF1dGhlbnRpY2F0b3JBdmFpbGFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgaWYgKCFpc1dlYkF1dGhuU3VwcG9ydGVkKCkpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gYXdhaXQgUHVibGljS2V5Q3JlZGVudGlhbC5pc1VzZXJWZXJpZnlpbmdQbGF0Zm9ybUF1dGhlbnRpY2F0b3JBdmFpbGFibGUoKTtcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHN1cHBvcnRlZCBhdXRoZW50aWNhdG9yIHRyYW5zcG9ydHMgZm9yIHRoaXMgcGxhdGZvcm1cclxuICogRW5oYW5jZWQgZGV0ZWN0aW9uIHdpdGggYmV0dGVyIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN1cHBvcnRlZFRyYW5zcG9ydHMoKTogQXV0aGVudGljYXRvclRyYW5zcG9ydFtdIHtcclxuICBjb25zdCB0cmFuc3BvcnRzOiBBdXRoZW50aWNhdG9yVHJhbnNwb3J0W10gPSBbJ3VzYicsICdpbnRlcm5hbCddO1xyXG5cclxuICAvLyBBZGQgTkZDIHN1cHBvcnQgZm9yIEFuZHJvaWQgZGV2aWNlc1xyXG4gIGlmIChcclxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAvQW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudClcclxuICApIHtcclxuICAgIHRyYW5zcG9ydHMucHVzaCgnbmZjJyk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGQgQkxFIHN1cHBvcnQgZm9yIG1vZGVybiBicm93c2VycyB3aXRoIFdlYiBCbHVldG9vdGggQVBJXHJcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IgYXMgYW55KS5ibHVldG9vdGgpIHtcclxuICAgIHRyYW5zcG9ydHMucHVzaCgnYmxlJyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJhbnNwb3J0cztcclxufVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRlcyB0aGF0IHJlcXVpcmVkIFdlYkF1dGhuIG9wdGlvbnMgYXJlIHByZXNlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2lzdHJhdGlvbk9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XHJcbiAgaWYgKCFvcHRpb25zLnVzZXIpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignVXNlciBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCBmb3IgcmVnaXN0cmF0aW9uJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoIW9wdGlvbnMudXNlci5pZCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIElEIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy51c2VyLm5hbWUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignVXNlciBuYW1lIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy51c2VyLmRpc3BsYXlOYW1lKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGlzcGxheSBuYW1lIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy5ycCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWx5aW5nIHBhcnR5IGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy5ycC5uYW1lKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbHlpbmcgcGFydHkgbmFtZSBpcyByZXF1aXJlZCBmb3IgcmVnaXN0cmF0aW9uJyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBkZWZhdWx0IHB1YmxpYyBrZXkgY3JlZGVudGlhbCBwYXJhbWV0ZXJzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFB1YktleUNyZWRQYXJhbXMoKTogUHVibGljS2V5Q3JlZGVudGlhbFBhcmFtZXRlcnNbXSB7XHJcbiAgcmV0dXJuIFtcclxuICAgIHtcclxuICAgICAgdHlwZTogJ3B1YmxpYy1rZXknLFxyXG4gICAgICBhbGc6IC03LCAvLyBFUzI1NlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogJ3B1YmxpYy1rZXknLFxyXG4gICAgICBhbGc6IC0yNTcsIC8vIFJTMjU2XHJcbiAgICB9LFxyXG4gIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFbmhhbmNlZCB0eXBlIGd1YXJkIHRvIGRldGVjdCBKU09OLWZvcm1hdHRlZCBXZWJBdXRobiBvcHRpb25zXHJcbiAqIE1vcmUgcm9idXN0IHRoYW4gc2ltcGxlIGNoYWxsZW5nZSB0eXBlIGNoZWNraW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNKU09OT3B0aW9ucyhvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcclxuICBpZiAoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBtdWx0aXBsZSBpbmRpY2F0b3JzIHRoYXQgdGhpcyBpcyBKU09OIGZvcm1hdCAoYmFzZTY0dXJsIHN0cmluZ3MpXHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGVvZiBvcHRpb25zLmNoYWxsZW5nZSA9PT0gJ3N0cmluZycgfHxcclxuICAgIChvcHRpb25zLnVzZXIgJiYgdHlwZW9mIG9wdGlvbnMudXNlci5pZCA9PT0gJ3N0cmluZycpIHx8XHJcbiAgICAob3B0aW9ucy5hbGxvd0NyZWRlbnRpYWxzPy5sZW5ndGggPiAwICYmXHJcbiAgICAgIHR5cGVvZiBvcHRpb25zLmFsbG93Q3JlZGVudGlhbHNbMF0/LmlkID09PSAnc3RyaW5nJykgfHxcclxuICAgIChvcHRpb25zLmV4Y2x1ZGVDcmVkZW50aWFscz8ubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5leGNsdWRlQ3JlZGVudGlhbHNbMF0/LmlkID09PSAnc3RyaW5nJylcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbnB1dCBpcyBhIFB1YmxpY0tleUNyZWRlbnRpYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1B1YmxpY0tleUNyZWRlbnRpYWwoXHJcbiAgY3JlZGVudGlhbDogQ3JlZGVudGlhbCB8IG51bGxcclxuKTogY3JlZGVudGlhbCBpcyBQdWJsaWNLZXlDcmVkZW50aWFsIHtcclxuICByZXR1cm4gY3JlZGVudGlhbCAhPT0gbnVsbCAmJiBjcmVkZW50aWFsLnR5cGUgPT09ICdwdWJsaWMta2V5JztcclxufVxyXG4iXX0=","/**\n * Enhanced WebAuthn Service\n *\n * Provides a clean, high-level API for WebAuthn operations with:\n * - Modern inject() pattern instead of constructor DI\n * - Flexible options (JSON base64url strings OR native ArrayBuffers)\n * - Enhanced error handling with specific error types\n * - Native browser parsing functions for optimal performance\n * - Clean, developer-friendly response objects\n */\nimport { Injectable, inject } from '@angular/core';\nimport { from, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { isRegisterConfig, isAuthenticateConfig, } from '../models/register-config.models';\nimport { buildCreationOptionsFromConfig, buildRequestOptionsFromConfig, validateRegisterConfig, validateAuthenticateConfig, } from '../utils/preset.utils';\nimport { WebAuthnError, WebAuthnErrorType, UserCancelledError, AuthenticatorError, InvalidOptionsError, UnsupportedOperationError, SecurityError, TimeoutError, } from '../errors/webauthn.errors';\nimport { WEBAUTHN_CONFIG } from '../config/webauthn.config';\n// Import consolidated utility functions\nimport { arrayBufferToBase64url, getSupportedTransports, isJSONOptions, isPublicKeyCredential, isWebAuthnSupported, } from '../utils/webauthn.utils';\nimport * as i0 from \"@angular/core\";\n/**\n * Enhanced Angular service for WebAuthn operations\n * Provides a clean abstraction over the WebAuthn API with RxJS observables\n * and enhanced error handling\n */\nexport class WebAuthnService {\n config = inject(WEBAUTHN_CONFIG);\n /**\n * Checks if WebAuthn is supported in the current browser\n */\n isSupported() {\n return isWebAuthnSupported();\n }\n /**\n * Gets comprehensive WebAuthn support information\n */\n getSupport() {\n if (!this.isSupported()) {\n return throwError(() => new UnsupportedOperationError('WebAuthn is not supported in this browser'));\n }\n return from(PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()).pipe(map((isPlatformAvailable) => ({\n isSupported: true,\n isPlatformAuthenticatorAvailable: isPlatformAvailable,\n supportedTransports: getSupportedTransports(),\n })), catchError((error) => throwError(() => new WebAuthnError(WebAuthnErrorType.UNKNOWN, 'Failed to check WebAuthn support', error))));\n }\n /**\n * Registers a new WebAuthn credential with flexible configuration support\n *\n * @param input Either a high-level RegisterConfig with presets, or direct WebAuthn creation options\n * @returns Observable of RegistrationResponse with clean, developer-friendly format\n *\n * @example\n * ```typescript\n * // Simple preset usage\n * this.webAuthnService.register({ username: 'john.doe', preset: 'passkey' });\n *\n * // Preset with overrides\n * this.webAuthnService.register({\n * username: 'john.doe',\n * preset: 'passkey',\n * authenticatorSelection: { userVerification: 'required' }\n * });\n *\n * // Direct WebAuthn options (native)\n * const nativeOptions: PublicKeyCredentialCreationOptions = {\n * challenge: new Uint8Array([...]),\n * rp: { name: \"My App\" },\n * user: { id: new Uint8Array([...]), name: \"user@example.com\", displayName: \"User\" },\n * pubKeyCredParams: [{ type: \"public-key\", alg: -7 }]\n * };\n * this.webAuthnService.register(nativeOptions);\n *\n * // Direct WebAuthn options (JSON)\n * const jsonOptions: PublicKeyCredentialCreationOptionsJSON = {\n * challenge: \"Y2hhbGxlbmdl\",\n * rp: { name: \"My App\" },\n * user: { id: \"dXNlcklk\", name: \"user@example.com\", displayName: \"User\" },\n * pubKeyCredParams: [{ type: \"public-key\", alg: -7 }]\n * };\n * this.webAuthnService.register(jsonOptions);\n * ```\n */\n register(input) {\n if (!this.isSupported()) {\n return throwError(() => new UnsupportedOperationError('WebAuthn is not supported in this browser'));\n }\n try {\n let creationOptions;\n if (isRegisterConfig(input)) {\n // High-level config path: validate, resolve preset, build options\n validateRegisterConfig(input);\n creationOptions = buildCreationOptionsFromConfig(input, this.config);\n }\n else {\n // Direct options path: use provided options\n creationOptions = input;\n }\n const parsedOptions = this.parseRegistrationOptions(creationOptions);\n return from(navigator.credentials.create({ publicKey: parsedOptions })).pipe(map((credential) => this.processRegistrationResult(credential)), catchError((error) => this.handleWebAuthnError(error)));\n }\n catch (error) {\n return throwError(() => new InvalidOptionsError('Failed to process registration input', error));\n }\n }\n /**\n * Authenticates using an existing WebAuthn credential with flexible configuration support\n *\n * @param input Either a high-level AuthenticateConfig with presets, or direct WebAuthn request options\n * @returns Observable of AuthenticationResponse with clean, developer-friendly format\n *\n * @example\n * ```typescript\n * // Simple preset usage\n * this.webAuthnService.authenticate({ preset: 'passkey' });\n *\n * // Config with credential filtering\n * this.webAuthnService.authenticate({\n * username: 'john.doe',\n * preset: 'secondFactor',\n * allowCredentials: ['credential-id-1', 'credential-id-2']\n * });\n *\n * // Direct WebAuthn options (JSON)\n * const jsonOptions: PublicKeyCredentialRequestOptionsJSON = {\n * challenge: \"Y2hhbGxlbmdl\",\n * allowCredentials: [{\n * type: \"public-key\",\n * id: \"Y3JlZElk\"\n * }]\n * };\n * this.webAuthnService.authenticate(jsonOptions);\n *\n * // Direct WebAuthn options (native)\n * const nativeOptions: PublicKeyCredentialRequestOptions = {\n * challenge: new Uint8Array([...]),\n * allowCredentials: [{\n * type: \"public-key\",\n * id: new Uint8Array([...])\n * }]\n * };\n * this.webAuthnService.authenticate(nativeOptions);\n * ```\n */\n authenticate(input) {\n if (!this.isSupported()) {\n return throwError(() => new UnsupportedOperationError('WebAuthn is not supported in this browser'));\n }\n try {\n let requestOptions;\n if (isAuthenticateConfig(input)) {\n // High-level config path: validate, resolve preset, build options\n validateAuthenticateConfig(input);\n requestOptions = buildRequestOptionsFromConfig(input, this.config);\n }\n else {\n // Direct options path: use provided options\n requestOptions = input;\n }\n const parsedOptions = this.parseAuthenticationOptions(requestOptions);\n return from(navigator.credentials.get({ publicKey: parsedOptions })).pipe(map((credential) => this.processAuthenticationResult(credential)), catchError((error) => this.handleWebAuthnError(error)));\n }\n catch (error) {\n return throwError(() => new InvalidOptionsError('Failed to process authentication input', error));\n }\n }\n /**\n * Parses registration options, handling both JSON and native formats\n */\n parseRegistrationOptions(options) {\n if (isJSONOptions(options)) {\n // Use native browser function for JSON options\n return PublicKeyCredential.parseCreationOptionsFromJSON(options);\n }\n else {\n // Options are already in native format\n return options;\n }\n }\n /**\n * Parses authentication options, handling both JSON and native formats\n */\n parseAuthenticationOptions(options) {\n if (isJSONOptions(options)) {\n // Use native browser function for JSON options\n return PublicKeyCredential.parseRequestOptionsFromJSON(options);\n }\n else {\n // Options are already in native format\n return options;\n }\n }\n /**\n * Processes the raw credential result into a clean RegistrationResponse\n */\n processRegistrationResult(credential) {\n if (!isPublicKeyCredential(credential)) {\n throw new AuthenticatorError('No credential returned from authenticator');\n }\n const response = credential.response;\n // Extract data using the response methods\n const credentialId = arrayBufferToBase64url(credential.rawId);\n const transports = (response.getTransports?.() ||\n []);\n let publicKey;\n try {\n const publicKeyBuffer = response.getPublicKey?.();\n if (publicKeyBuffer) {\n publicKey = arrayBufferToBase64url(publicKeyBuffer);\n }\n }\n catch {\n // Public key extraction failed - this is okay, not all algorithms are supported\n }\n // Create the raw response for backward compatibility\n const rawResponse = {\n credentialId,\n publicKey: publicKey ||\n arrayBufferToBase64url(response.getPublicKey?.() || new ArrayBuffer(0)),\n attestationObject: arrayBufferToBase64url(response.attestationObject),\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n transports: transports,\n };\n return {\n success: true,\n credentialId,\n publicKey,\n transports,\n rawResponse,\n };\n }\n /**\n * Processes the raw credential result into a clean AuthenticationResponse\n */\n processAuthenticationResult(credential) {\n if (!isPublicKeyCredential(credential)) {\n throw new AuthenticatorError('No credential returned from authenticator');\n }\n const response = credential.response;\n const credentialId = arrayBufferToBase64url(credential.rawId);\n let userHandle;\n if (response.userHandle) {\n userHandle = arrayBufferToBase64url(response.userHandle);\n }\n // Create the raw response for backward compatibility\n const rawResponse = {\n credentialId,\n authenticatorData: arrayBufferToBase64url(response.authenticatorData),\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n signature: arrayBufferToBase64url(response.signature),\n userHandle,\n };\n return {\n success: true,\n credentialId,\n userHandle,\n rawResponse,\n };\n }\n /**\n * Enhanced error handling that maps DOMExceptions to specific error types\n */\n handleWebAuthnError(error) {\n // Handle DOMExceptions from WebAuthn API\n if (error instanceof DOMException) {\n switch (error.name) {\n case 'NotAllowedError':\n return throwError(() => new UserCancelledError(error));\n case 'InvalidStateError':\n return throwError(() => new AuthenticatorError('Invalid authenticator state', error));\n case 'NotSupportedError':\n return throwError(() => new UnsupportedOperationError('Operation not supported', error));\n case 'SecurityError':\n return throwError(() => new SecurityError('Security error occurred', error));\n case 'TimeoutError':\n return throwError(() => new TimeoutError('Operation timed out', error));\n case 'EncodingError':\n return throwError(() => new InvalidOptionsError('Encoding error in options', error));\n default:\n return throwError(() => new WebAuthnError(WebAuthnErrorType.UNKNOWN, `Unknown WebAuthn error: ${error.message}`, error));\n }\n }\n // Handle JSON parsing errors\n if (error instanceof TypeError &&\n (error.message.includes('parseCreationOptionsFromJSON') ||\n error.message.includes('parseRequestOptionsFromJSON'))) {\n return throwError(() => new InvalidOptionsError('Invalid JSON options format', error));\n }\n // Handle other errors\n return throwError(() => new WebAuthnError(WebAuthnErrorType.UNKNOWN, `Unexpected error: ${error.message}`, error));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WebAuthnService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WebAuthnService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WebAuthnService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXdlYmF1dGhuL3NyYy9saWIvc2VydmljZXMvd2ViYXV0aG4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBVWpELE9BQU8sRUFHTCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sa0NBQWtDLENBQUM7QUFFMUMsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qiw2QkFBNkIsRUFDN0Isc0JBQXNCLEVBQ3RCLDBCQUEwQixHQUMzQixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixhQUFhLEVBQ2IsWUFBWSxHQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFFbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVELHdDQUF3QztBQUN4QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLG1CQUFtQixHQUNwQixNQUFNLHlCQUF5QixDQUFDOztBQUVqQzs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFDVCxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRWxEOztPQUVHO0lBQ0gsV0FBVztRQUNULE9BQU8sbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lB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QVUsQ0FDZixHQUFHLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUNwRSxDQUFDO1FBQ0osQ0FBQztRQUVELHNCQUFzQjtRQUN0QixPQUFPLFVBQVUsQ0FDZixHQUFHLEVBQUUsQ0FDSCxJQUFJLGFBQWEsQ0FDZixpQkFBaUIsQ0FBQyxPQUFPLEVBQ3pCLHFCQUFxQixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQ3BDLEtBQUssQ0FDTixDQUNKLENBQUM7SUFDSixDQUFDO3VHQWxZVSxlQUFlOzJHQUFmLGVBQWUsY0FGZCxNQUFNOzsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBFbmhhbmNlZCBXZWJBdXRobiBTZXJ2aWNlXHJcbiAqXHJcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIGhpZ2gtbGV2ZWwgQVBJIGZvciBXZWJBdXRobiBvcGVyYXRpb25zIHdpdGg6XHJcbiAqIC0gTW9kZXJuIGluamVjdCgpIHBhdHRlcm4gaW5zdGVhZCBvZiBjb25zdHJ1Y3RvciBESVxyXG4gKiAtIEZsZXhpYmxlIG9wdGlvbnMgKEpTT04gYmFzZTY0dXJsIHN0cmluZ3MgT1IgbmF0aXZlIEFycmF5QnVmZmVycylcclxuICogLSBFbmhhbmNlZCBlcnJvciBoYW5kbGluZyB3aXRoIHNwZWNpZmljIGVycm9yIHR5cGVzXHJcbiAqIC0gTmF0aXZlIGJyb3dzZXIgcGFyc2luZyBmdW5jdGlvbnMgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcclxuICogLSBDbGVhbiwgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlc3BvbnNlIG9iamVjdHNcclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIFdlYkF1dGhuU3VwcG9ydCxcclxuICBSZWdpc3RyYXRpb25SZXNwb25zZSxcclxuICBBdXRoZW50aWNhdGlvblJlc3BvbnNlLFxyXG4gIFdlYkF1dGhuUmVnaXN0cmF0aW9uUmVzdWx0LFxyXG4gIFdlYkF1dGhuQXV0aGVudGljYXRpb25SZXN1bHQsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3dlYmF1dGhuLm1vZGVscyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIFJlZ2lzdGVySW5wdXQsXHJcbiAgQXV0aGVudGljYXRlSW5wdXQsXHJcbiAgaXNSZWdpc3RlckNvbmZpZyxcclxuICBpc0F1dGhlbnRpY2F0ZUNvbmZpZyxcclxufSBmcm9tICcuLi9tb2RlbHMvcmVnaXN0ZXItY29uZmlnLm1vZGVscyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIGJ1aWxkQ3JlYXRpb25PcHRpb25zRnJvbUNvbmZpZyxcclxuICBidWlsZFJlcXVlc3RPcHRpb25zRnJvbUNvbmZpZyxcclxuICB2YWxpZGF0ZVJlZ2lzdGVyQ29uZmlnLFxyXG4gIHZhbGlkYXRlQXV0aGVudGljYXRlQ29uZmlnLFxyXG59IGZyb20gJy4uL3V0aWxzL3ByZXNldC51dGlscyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIFdlYkF1dGhuRXJyb3IsXHJcbiAgV2ViQXV0aG5FcnJvclR5cGUsXHJcbiAgVXNlckNhbmNlbGxlZEVycm9yLFxyXG4gIEF1dGhlbnRpY2F0b3JFcnJvcixcclxuICBJbnZhbGlkT3B0aW9uc0Vycm9yLFxyXG4gIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IsXHJcbiAgU2VjdXJpdHlFcnJvcixcclxuICBUaW1lb3V0RXJyb3IsXHJcbn0gZnJvbSAnLi4vZXJyb3JzL3dlYmF1dGhuLmVycm9ycyc7XHJcblxyXG5pbXBvcnQgeyBXRUJBVVRITl9DT05GSUcgfSBmcm9tICcuLi9jb25maWcvd2ViYXV0aG4uY29uZmlnJztcclxuXHJcbi8vIEltcG9ydCBjb25zb2xpZGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnNcclxuaW1wb3J0IHtcclxuICBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsLFxyXG4gIGdldFN1cHBvcnRlZFRyYW5zcG9ydHMsXHJcbiAgaXNKU09OT3B0aW9ucyxcclxuICBpc1B1YmxpY0tleUNyZWRlbnRpYWwsXHJcbiAgaXNXZWJBdXRoblN1cHBvcnRlZCxcclxufSBmcm9tICcuLi91dGlscy93ZWJhdXRobi51dGlscyc7XHJcblxyXG4vKipcclxuICogRW5oYW5jZWQgQW5ndWxhciBzZXJ2aWNlIGZvciBXZWJBdXRobiBvcGVyYXRpb25zXHJcbiAqIFByb3ZpZGVzIGEgY2xlYW4gYWJzdHJhY3Rpb24gb3ZlciB0aGUgV2ViQXV0aG4gQVBJIHdpdGggUnhKUyBvYnNlcnZhYmxlc1xyXG4gKiBhbmQgZW5oYW5jZWQgZXJyb3IgaGFuZGxpbmdcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWJBdXRoblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KFdFQkFVVEhOX0NPTkZJRyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBXZWJBdXRobiBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgYnJvd3NlclxyXG4gICAqL1xyXG4gIGlzU3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzV2ViQXV0aG5TdXBwb3J0ZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgY29tcHJlaGVuc2l2ZSBXZWJBdXRobiBzdXBwb3J0IGluZm9ybWF0aW9uXHJcbiAgICovXHJcbiAgZ2V0U3VwcG9ydCgpOiBPYnNlcnZhYmxlPFdlYkF1dGhuU3VwcG9ydD4ge1xyXG4gICAgaWYgKCF0aGlzLmlzU3VwcG9ydGVkKCkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXHJcbiAgICAgICAgKCkgPT5cclxuICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFxyXG4gICAgICAgICAgICAnV2ViQXV0aG4gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIFB1YmxpY0tleUNyZWRlbnRpYWwuaXNVc2VyVmVyaWZ5aW5nUGxhdGZvcm1BdXRoZW50aWNhdG9yQXZhaWxhYmxlKClcclxuICAgICkucGlwZShcclxuICAgICAgbWFwKChpc1BsYXRmb3JtQXZhaWxhYmxlKSA9PiAoe1xyXG4gICAgICAgIGlzU3VwcG9ydGVkOiB0cnVlLFxyXG4gICAgICAgIGlzUGxhdGZvcm1BdXRoZW50aWNhdG9yQXZhaWxhYmxlOiBpc1BsYXRmb3JtQXZhaWxhYmxlLFxyXG4gICAgICAgIHN1cHBvcnRlZFRyYW5zcG9ydHM6IGdldFN1cHBvcnRlZFRyYW5zcG9ydHMoKSxcclxuICAgICAgfSkpLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT5cclxuICAgICAgICB0aHJvd0Vycm9yKFxyXG4gICAgICAgICAgKCkgPT5cclxuICAgICAgICAgICAgbmV3IFdlYkF1dGhuRXJyb3IoXHJcbiAgICAgICAgICAgICAgV2ViQXV0aG5FcnJvclR5cGUuVU5LTk9XTixcclxuICAgICAgICAgICAgICAnRmFpbGVkIHRvIGNoZWNrIFdlYkF1dGhuIHN1cHBvcnQnLFxyXG4gICAgICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlcnMgYSBuZXcgV2ViQXV0aG4gY3JlZGVudGlhbCB3aXRoIGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24gc3VwcG9ydFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlucHV0IEVpdGhlciBhIGhpZ2gtbGV2ZWwgUmVnaXN0ZXJDb25maWcgd2l0aCBwcmVzZXRzLCBvciBkaXJlY3QgV2ViQXV0aG4gY3JlYXRpb24gb3B0aW9uc1xyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgUmVnaXN0cmF0aW9uUmVzcG9uc2Ugd2l0aCBjbGVhbiwgZGV2ZWxvcGVyLWZyaWVuZGx5IGZvcm1hdFxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogLy8gU2ltcGxlIHByZXNldCB1c2FnZVxyXG4gICAqIHRoaXMud2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyKHsgdXNlcm5hbWU6ICdqb2huLmRvZScsIHByZXNldDogJ3Bhc3NrZXknIH0pO1xyXG4gICAqXHJcbiAgICogLy8gUHJlc2V0IHdpdGggb3ZlcnJpZGVzXHJcbiAgICogdGhpcy53ZWJBdXRoblNlcnZpY2UucmVnaXN0ZXIoe1xyXG4gICAqICAgdXNlcm5hbWU6ICdqb2huLmRvZScsXHJcbiAgICogICBwcmVzZXQ6ICdwYXNza2V5JyxcclxuICAgKiAgIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHsgdXNlclZlcmlmaWNhdGlvbjogJ3JlcXVpcmVkJyB9XHJcbiAgICogfSk7XHJcbiAgICpcclxuICAgKiAvLyBEaXJlY3QgV2ViQXV0aG4gb3B0aW9ucyAobmF0aXZlKVxyXG4gICAqIGNvbnN0IG5hdGl2ZU9wdGlvbnM6IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgPSB7XHJcbiAgICogICBjaGFsbGVuZ2U6IG5ldyBVaW50OEFycmF5KFsuLi5dKSxcclxuICAgKiAgIHJwOiB7IG5hbWU6IFwiTXkgQXBwXCIgfSxcclxuICAgKiAgIHVzZXI6IHsgaWQ6IG5ldyBVaW50OEFycmF5KFsuLi5dKSwgbmFtZTogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIGRpc3BsYXlOYW1lOiBcIlVzZXJcIiB9LFxyXG4gICAqICAgcHViS2V5Q3JlZFBhcmFtczogW3sgdHlwZTogXCJwdWJsaWMta2V5XCIsIGFsZzogLTcgfV1cclxuICAgKiB9O1xyXG4gICAqIHRoaXMud2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyKG5hdGl2ZU9wdGlvbnMpO1xyXG4gICAqXHJcbiAgICogLy8gRGlyZWN0IFdlYkF1dGhuIG9wdGlvbnMgKEpTT04pXHJcbiAgICogY29uc3QganNvbk9wdGlvbnM6IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OID0ge1xyXG4gICAqICAgY2hhbGxlbmdlOiBcIlkyaGhiR3hsYm1kbFwiLFxyXG4gICAqICAgcnA6IHsgbmFtZTogXCJNeSBBcHBcIiB9LFxyXG4gICAqICAgdXNlcjogeyBpZDogXCJkWE5sY2tsa1wiLCBuYW1lOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgZGlzcGxheU5hbWU6IFwiVXNlclwiIH0sXHJcbiAgICogICBwdWJLZXlDcmVkUGFyYW1zOiBbeyB0eXBlOiBcInB1YmxpYy1rZXlcIiwgYWxnOiAtNyB9XVxyXG4gICAqIH07XHJcbiAgICogdGhpcy53ZWJBdXRoblNlcnZpY2UucmVnaXN0ZXIoanNvbk9wdGlvbnMpO1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyKGlucHV0OiBSZWdpc3RlcklucHV0KTogT2JzZXJ2YWJsZTxSZWdpc3RyYXRpb25SZXNwb25zZT4ge1xyXG4gICAgaWYgKCF0aGlzLmlzU3VwcG9ydGVkKCkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXHJcbiAgICAgICAgKCkgPT5cclxuICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFxyXG4gICAgICAgICAgICAnV2ViQXV0aG4gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGNyZWF0aW9uT3B0aW9uczpcclxuICAgICAgICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNcclxuICAgICAgICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OO1xyXG5cclxuICAgICAgaWYgKGlzUmVnaXN0ZXJDb25maWcoaW5wdXQpKSB7XHJcbiAgICAgICAgLy8gSGlnaC1sZXZlbCBjb25maWcgcGF0aDogdmFsaWRhdGUsIHJlc29sdmUgcHJlc2V0LCBidWlsZCBvcHRpb25zXHJcbiAgICAgICAgdmFsaWRhdGVSZWdpc3RlckNvbmZpZyhpbnB1dCk7XHJcbiAgICAgICAgY3JlYXRpb25PcHRpb25zID0gYnVpbGRDcmVhdGlvbk9wdGlvbnNGcm9tQ29uZmlnKGlucHV0LCB0aGlzLmNvbmZpZyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gRGlyZWN0IG9wdGlvbnMgcGF0aDogdXNlIHByb3ZpZGVkIG9wdGlvbnNcclxuICAgICAgICBjcmVhdGlvbk9wdGlvbnMgPSBpbnB1dDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHRoaXMucGFyc2VSZWdpc3RyYXRpb25PcHRpb25zKGNyZWF0aW9uT3B0aW9ucyk7XHJcblxyXG4gICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKHsgcHVibGljS2V5OiBwYXJzZWRPcHRpb25zIH0pXHJcbiAgICAgICkucGlwZShcclxuICAgICAgICBtYXAoKGNyZWRlbnRpYWwpID0+IHRoaXMucHJvY2Vzc1JlZ2lzdHJhdGlvblJlc3VsdChjcmVkZW50aWFsKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHRoaXMuaGFuZGxlV2ViQXV0aG5FcnJvcihlcnJvcikpXHJcbiAgICAgICk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcclxuICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgbmV3IEludmFsaWRPcHRpb25zRXJyb3IoXHJcbiAgICAgICAgICAgICdGYWlsZWQgdG8gcHJvY2VzcyByZWdpc3RyYXRpb24gaW5wdXQnLFxyXG4gICAgICAgICAgICBlcnJvciBhcyBFcnJvclxyXG4gICAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXV0aGVudGljYXRlcyB1c2luZyBhbiBleGlzdGluZyBXZWJBdXRobiBjcmVkZW50aWFsIHdpdGggZmxleGlibGUgY29uZmlndXJhdGlvbiBzdXBwb3J0XHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW5wdXQgRWl0aGVyIGEgaGlnaC1sZXZlbCBBdXRoZW50aWNhdGVDb25maWcgd2l0aCBwcmVzZXRzLCBvciBkaXJlY3QgV2ViQXV0aG4gcmVxdWVzdCBvcHRpb25zXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBBdXRoZW50aWNhdGlvblJlc3BvbnNlIHdpdGggY2xlYW4sIGRldmVsb3Blci1mcmllbmRseSBmb3JtYXRcclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIC8vIFNpbXBsZSBwcmVzZXQgdXNhZ2VcclxuICAgKiB0aGlzLndlYkF1dGhuU2VydmljZS5hdXRoZW50aWNhdGUoeyBwcmVzZXQ6ICdwYXNza2V5JyB9KTtcclxuICAgKlxyXG4gICAqIC8vIENvbmZpZyB3aXRoIGNyZWRlbnRpYWwgZmlsdGVyaW5nXHJcbiAgICogdGhpcy53ZWJBdXRoblNlcnZpY2UuYXV0aGVudGljYXRlKHtcclxuICAgKiAgIHVzZXJuYW1lOiAnam9obi5kb2UnLFxyXG4gICAqICAgcHJlc2V0OiAnc2Vjb25kRmFjdG9yJyxcclxuICAgKiAgIGFsbG93Q3JlZGVudGlhbHM6IFsnY3JlZGVudGlhbC1pZC0xJywgJ2NyZWRlbnRpYWwtaWQtMiddXHJcbiAgICogfSk7XHJcbiAgICpcclxuICAgKiAvLyBEaXJlY3QgV2ViQXV0aG4gb3B0aW9ucyAoSlNPTilcclxuICAgKiBjb25zdCBqc29uT3B0aW9uczogUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zSlNPTiA9IHtcclxuICAgKiAgIGNoYWxsZW5nZTogXCJZMmhoYkd4bGJtZGxcIixcclxuICAgKiAgIGFsbG93Q3JlZGVudGlhbHM6IFt7XHJcbiAgICogICAgIHR5cGU6IFwicHVibGljLWtleVwiLFxyXG4gICAqICAgICBpZDogXCJZM0psWkVsa1wiXHJcbiAgICogICB9XVxyXG4gICAqIH07XHJcbiAgICogdGhpcy53ZWJBdXRoblNlcnZpY2UuYXV0aGVudGljYXRlKGpzb25PcHRpb25zKTtcclxuICAgKlxyXG4gICAqIC8vIERpcmVjdCBXZWJBdXRobiBvcHRpb25zIChuYXRpdmUpXHJcbiAgICogY29uc3QgbmF0aXZlT3B0aW9uczogUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zID0ge1xyXG4gICAqICAgY2hhbGxlbmdlOiBuZXcgVWludDhBcnJheShbLi4uXSksXHJcbiAgICogICBhbGxvd0NyZWRlbnRpYWxzOiBbe1xyXG4gICAqICAgICB0eXBlOiBcInB1YmxpYy1rZXlcIixcclxuICAgKiAgICAgaWQ6IG5ldyBVaW50OEFycmF5KFsuLi5dKVxyXG4gICAqICAgfV1cclxuICAgKiB9O1xyXG4gICAqIHRoaXMud2ViQXV0aG5TZXJ2aWNlLmF1dGhlbnRpY2F0ZShuYXRpdmVPcHRpb25zKTtcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBhdXRoZW50aWNhdGUoaW5wdXQ6IEF1dGhlbnRpY2F0ZUlucHV0KTogT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGlvblJlc3BvbnNlPiB7XHJcbiAgICBpZiAoIXRoaXMuaXNTdXBwb3J0ZWQoKSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcclxuICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXHJcbiAgICAgICAgICAgICdXZWJBdXRobiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcidcclxuICAgICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnM6XHJcbiAgICAgICAgfCBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNcclxuICAgICAgICB8IFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0pTT047XHJcblxyXG4gICAgICBpZiAoaXNBdXRoZW50aWNhdGVDb25maWcoaW5wdXQpKSB7XHJcbiAgICAgICAgLy8gSGlnaC1sZXZlbCBjb25maWcgcGF0aDogdmFsaWRhdGUsIHJlc29sdmUgcHJlc2V0LCBidWlsZCBvcHRpb25zXHJcbiAgICAgICAgdmFsaWRhdGVBdXRoZW50aWNhdGVDb25maWcoaW5wdXQpO1xyXG4gICAgICAgIHJlcXVlc3RPcHRpb25zID0gYnVpbGRSZXF1ZXN0T3B0aW9uc0Zyb21Db25maWcoaW5wdXQsIHRoaXMuY29uZmlnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBEaXJlY3Qgb3B0aW9ucyBwYXRoOiB1c2UgcHJvdmlkZWQgb3B0aW9uc1xyXG4gICAgICAgIHJlcXVlc3RPcHRpb25zID0gaW5wdXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSB0aGlzLnBhcnNlQXV0aGVudGljYXRpb25PcHRpb25zKHJlcXVlc3RPcHRpb25zKTtcclxuXHJcbiAgICAgIHJldHVybiBmcm9tKG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoeyBwdWJsaWNLZXk6IHBhcnNlZE9wdGlvbnMgfSkpLnBpcGUoXHJcbiAgICAgICAgbWFwKChjcmVkZW50aWFsKSA9PiB0aGlzLnByb2Nlc3NBdXRoZW50aWNhdGlvblJlc3VsdChjcmVkZW50aWFsKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHRoaXMuaGFuZGxlV2ViQXV0aG5FcnJvcihlcnJvcikpXHJcbiAgICAgICk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcclxuICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgbmV3IEludmFsaWRPcHRpb25zRXJyb3IoXHJcbiAgICAgICAgICAgICdGYWlsZWQgdG8gcHJvY2VzcyBhdXRoZW50aWNhdGlvbiBpbnB1dCcsXHJcbiAgICAgICAgICAgIGVycm9yIGFzIEVycm9yXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZXMgcmVnaXN0cmF0aW9uIG9wdGlvbnMsIGhhbmRsaW5nIGJvdGggSlNPTiBhbmQgbmF0aXZlIGZvcm1hdHNcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlUmVnaXN0cmF0aW9uT3B0aW9ucyhcclxuICAgIG9wdGlvbnM6XHJcbiAgICAgIHwgUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc1xyXG4gICAgICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OXHJcbiAgKTogUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyB7XHJcbiAgICBpZiAoaXNKU09OT3B0aW9ucyhvcHRpb25zKSkge1xyXG4gICAgICAvLyBVc2UgbmF0aXZlIGJyb3dzZXIgZnVuY3Rpb24gZm9yIEpTT04gb3B0aW9uc1xyXG4gICAgICByZXR1cm4gUHVibGljS2V5Q3JlZGVudGlhbC5wYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OKFxyXG4gICAgICAgIG9wdGlvbnMgYXMgUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc0pTT05cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE9wdGlvbnMgYXJlIGFscmVhZHkgaW4gbmF0aXZlIGZvcm1hdFxyXG4gICAgICByZXR1cm4gb3B0aW9ucyBhcyBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2VzIGF1dGhlbnRpY2F0aW9uIG9wdGlvbnMsIGhhbmRsaW5nIGJvdGggSlNPTiBhbmQgbmF0aXZlIGZvcm1hdHNcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQXV0aGVudGljYXRpb25PcHRpb25zKFxyXG4gICAgb3B0aW9uczpcclxuICAgICAgfCBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNcclxuICAgICAgfCBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNKU09OXHJcbiAgKTogUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIHtcclxuICAgIGlmIChpc0pTT05PcHRpb25zKG9wdGlvbnMpKSB7XHJcbiAgICAgIC8vIFVzZSBuYXRpdmUgYnJvd3NlciBmdW5jdGlvbiBmb3IgSlNPTiBvcHRpb25zXHJcbiAgICAgIHJldHVybiBQdWJsaWNLZXlDcmVkZW50aWFsLnBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTihcclxuICAgICAgICBvcHRpb25zIGFzIFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0pTT05cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE9wdGlvbnMgYXJlIGFscmVhZHkgaW4gbmF0aXZlIGZvcm1hdFxyXG4gICAgICByZXR1cm4gb3B0aW9ucyBhcyBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9jZXNzZXMgdGhlIHJhdyBjcmVkZW50aWFsIHJlc3VsdCBpbnRvIGEgY2xlYW4gUmVnaXN0cmF0aW9uUmVzcG9uc2VcclxuICAgKi9cclxuICBwcml2YXRlIHByb2Nlc3NSZWdpc3RyYXRpb25SZXN1bHQoXHJcbiAgICBjcmVkZW50aWFsOiBDcmVkZW50aWFsIHwgbnVsbFxyXG4gICk6IFJlZ2lzdHJhdGlvblJlc3BvbnNlIHtcclxuICAgIGlmICghaXNQdWJsaWNLZXlDcmVkZW50aWFsKGNyZWRlbnRpYWwpKSB7XHJcbiAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdG9yRXJyb3IoJ05vIGNyZWRlbnRpYWwgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdG9yJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBjcmVkZW50aWFsLnJlc3BvbnNlIGFzIEF1dGhlbnRpY2F0b3JBdHRlc3RhdGlvblJlc3BvbnNlO1xyXG5cclxuICAgIC8vIEV4dHJhY3QgZGF0YSB1c2luZyB0aGUgcmVzcG9uc2UgbWV0aG9kc1xyXG4gICAgY29uc3QgY3JlZGVudGlhbElkID0gYXJyYXlCdWZmZXJUb0Jhc2U2NHVybChjcmVkZW50aWFsLnJhd0lkKTtcclxuICAgIGNvbnN0IHRyYW5zcG9ydHMgPSAocmVzcG9uc2UuZ2V0VHJhbnNwb3J0cz8uKCkgfHxcclxuICAgICAgW10pIGFzIEF1dGhlbnRpY2F0b3JUcmFuc3BvcnRbXTtcclxuXHJcbiAgICBsZXQgcHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwdWJsaWNLZXlCdWZmZXIgPSByZXNwb25zZS5nZXRQdWJsaWNLZXk/LigpO1xyXG4gICAgICBpZiAocHVibGljS2V5QnVmZmVyKSB7XHJcbiAgICAgICAgcHVibGljS2V5ID0gYXJyYXlCdWZmZXJUb0Jhc2U2NHVybChwdWJsaWNLZXlCdWZmZXIpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgLy8gUHVibGljIGtleSBleHRyYWN0aW9uIGZhaWxlZCAtIHRoaXMgaXMgb2theSwgbm90IGFsbCBhbGdvcml0aG1zIGFyZSBzdXBwb3J0ZWRcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIHJhdyByZXNwb25zZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxyXG4gICAgY29uc3QgcmF3UmVzcG9uc2U6IFdlYkF1dGhuUmVnaXN0cmF0aW9uUmVzdWx0ID0ge1xyXG4gICAgICBjcmVkZW50aWFsSWQsXHJcbiAgICAgIHB1YmxpY0tleTpcclxuICAgICAgICBwdWJsaWNLZXkgfHxcclxuICAgICAgICBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKHJlc3BvbnNlLmdldFB1YmxpY0tleT8uKCkgfHwgbmV3IEFycmF5QnVmZmVyKDApKSxcclxuICAgICAgYXR0ZXN0YXRpb25PYmplY3Q6IGFycmF5QnVmZmVyVG9CYXNlNjR1cmwocmVzcG9uc2UuYXR0ZXN0YXRpb25PYmplY3QpLFxyXG4gICAgICBjbGllbnREYXRhSlNPTjogYXJyYXlCdWZmZXJUb0Jhc2U2NHVybChyZXNwb25zZS5jbGllbnREYXRhSlNPTiksXHJcbiAgICAgIHRyYW5zcG9ydHM6IHRyYW5zcG9ydHMsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIGNyZWRlbnRpYWxJZCxcclxuICAgICAgcHVibGljS2V5LFxyXG4gICAgICB0cmFuc3BvcnRzLFxyXG4gICAgICByYXdSZXNwb25zZSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9jZXNzZXMgdGhlIHJhdyBjcmVkZW50aWFsIHJlc3VsdCBpbnRvIGEgY2xlYW4gQXV0aGVudGljYXRpb25SZXNwb25zZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcHJvY2Vzc0F1dGhlbnRpY2F0aW9uUmVzdWx0KFxyXG4gICAgY3JlZGVudGlhbDogQ3JlZGVudGlhbCB8IG51bGxcclxuICApOiBBdXRoZW50aWNhdGlvblJlc3BvbnNlIHtcclxuICAgIGlmICghaXNQdWJsaWNLZXlDcmVkZW50aWFsKGNyZWRlbnRpYWwpKSB7XHJcbiAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdG9yRXJyb3IoJ05vIGNyZWRlbnRpYWwgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdG9yJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBjcmVkZW50aWFsLnJlc3BvbnNlIGFzIEF1dGhlbnRpY2F0b3JBc3NlcnRpb25SZXNwb25zZTtcclxuICAgIGNvbnN0IGNyZWRlbnRpYWxJZCA9IGFycmF5QnVmZmVyVG9CYXNlNjR1cmwoY3JlZGVudGlhbC5yYXdJZCk7XHJcblxyXG4gICAgbGV0IHVzZXJIYW5kbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIGlmIChyZXNwb25zZS51c2VySGFuZGxlKSB7XHJcbiAgICAgIHVzZXJIYW5kbGUgPSBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKHJlc3BvbnNlLnVzZXJIYW5kbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgcmF3IHJlc3BvbnNlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcbiAgICBjb25zdCByYXdSZXNwb25zZTogV2ViQXV0aG5BdXRoZW50aWNhdGlvblJlc3VsdCA9IHtcclxuICAgICAgY3JlZGVudGlhbElkLFxyXG4gICAgICBhdXRoZW50aWNhdG9yRGF0YTogYXJyYXlCdWZmZXJUb0Jhc2U2NHVybChyZXNwb25zZS5hdXRoZW50aWNhdG9yRGF0YSksXHJcbiAgICAgIGNsaWVudERhdGFKU09OOiBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKHJlc3BvbnNlLmNsaWVudERhdGFKU09OKSxcclxuICAgICAgc2lnbmF0dXJlOiBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKHJlc3BvbnNlLnNpZ25hdHVyZSksXHJcbiAgICAgIHVzZXJIYW5kbGUsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIGNyZWRlbnRpYWxJZCxcclxuICAgICAgdXNlckhhbmRsZSxcclxuICAgICAgcmF3UmVzcG9uc2UsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5oYW5jZWQgZXJyb3IgaGFuZGxpbmcgdGhhdCBtYXBzIERPTUV4Y2VwdGlvbnMgdG8gc3BlY2lmaWMgZXJyb3IgdHlwZXNcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZVdlYkF1dGhuRXJyb3IoZXJyb3I6IGFueSk6IE9ic2VydmFibGU8bmV2ZXI+IHtcclxuICAgIC8vIEhhbmRsZSBET01FeGNlcHRpb25zIGZyb20gV2ViQXV0aG4gQVBJXHJcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24pIHtcclxuICAgICAgc3dpdGNoIChlcnJvci5uYW1lKSB7XHJcbiAgICAgICAgY2FzZSAnTm90QWxsb3dlZEVycm9yJzpcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBVc2VyQ2FuY2VsbGVkRXJyb3IoZXJyb3IpKTtcclxuICAgICAgICBjYXNlICdJbnZhbGlkU3RhdGVFcnJvcic6XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihcclxuICAgICAgICAgICAgKCkgPT4gbmV3IEF1dGhlbnRpY2F0b3JFcnJvcignSW52YWxpZCBhdXRoZW50aWNhdG9yIHN0YXRlJywgZXJyb3IpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIGNhc2UgJ05vdFN1cHBvcnRlZEVycm9yJzpcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxyXG4gICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZCcsIGVycm9yKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICBjYXNlICdTZWN1cml0eUVycm9yJzpcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgU2VjdXJpdHlFcnJvcignU2VjdXJpdHkgZXJyb3Igb2NjdXJyZWQnLCBlcnJvcilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgY2FzZSAnVGltZW91dEVycm9yJzpcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgVGltZW91dEVycm9yKCdPcGVyYXRpb24gdGltZWQgb3V0JywgZXJyb3IpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIGNhc2UgJ0VuY29kaW5nRXJyb3InOlxyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBJbnZhbGlkT3B0aW9uc0Vycm9yKCdFbmNvZGluZyBlcnJvciBpbiBvcHRpb25zJywgZXJyb3IpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihcclxuICAgICAgICAgICAgKCkgPT5cclxuICAgICAgICAgICAgICBuZXcgV2ViQXV0aG5FcnJvcihcclxuICAgICAgICAgICAgICAgIFdlYkF1dGhuRXJyb3JUeXBlLlVOS05PV04sXHJcbiAgICAgICAgICAgICAgICBgVW5rbm93biBXZWJBdXRobiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsXHJcbiAgICAgICAgICAgICAgICBlcnJvclxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgSlNPTiBwYXJzaW5nIGVycm9yc1xyXG4gICAgaWYgKFxyXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxyXG4gICAgICAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygncGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTicpIHx8XHJcbiAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygncGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OJykpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXHJcbiAgICAgICAgKCkgPT4gbmV3IEludmFsaWRPcHRpb25zRXJyb3IoJ0ludmFsaWQgSlNPTiBvcHRpb25zIGZvcm1hdCcsIGVycm9yKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnNcclxuICAgIHJldHVybiB0aHJvd0Vycm9yKFxyXG4gICAgICAoKSA9PlxyXG4gICAgICAgIG5ldyBXZWJBdXRobkVycm9yKFxyXG4gICAgICAgICAgV2ViQXV0aG5FcnJvclR5cGUuVU5LTk9XTixcclxuICAgICAgICAgIGBVbmV4cGVjdGVkIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCxcclxuICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19","/**\n * WebAuthn Providers\n * Modern Angular standalone provider function for WebAuthn service\n */\nimport { WebAuthnService } from '../services/webauthn.service';\nimport { WEBAUTHN_CONFIG, createWebAuthnConfig, } from '../config/webauthn.config';\n/**\n * Provides WebAuthn service with required relying party configuration\n *\n * @param relyingParty Required relying party configuration\n * @param config Optional configuration overrides\n * @returns Array of providers for WebAuthn functionality\n *\n * @example\n * ```typescript\n * // main.ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideWebAuthn(\n * { name: 'My App', id: 'myapp.com' },\n * { defaultTimeout: 30000 }\n * )\n * ]\n * });\n * ```\n */\nexport function provideWebAuthn(relyingParty, config = {}) {\n return [\n {\n provide: WEBAUTHN_CONFIG,\n useValue: createWebAuthnConfig(relyingParty, config),\n },\n WebAuthnService,\n ];\n}\n/**\n * @deprecated Use provideWebAuthn(relyingParty, config) instead.\n * This version is kept for backward compatibility but requires relying party information.\n */\nexport function provideWebAuthnLegacy(config) {\n if (!config.relyingParty) {\n throw new Error('WebAuthn configuration must include relying party information. Use provideWebAuthn(relyingParty, config) instead.');\n }\n return [\n {\n provide: WEBAUTHN_CONFIG,\n useValue: config,\n },\n WebAuthnService,\n ];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4ucHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi9wcm92aWRlcnMvd2ViYXV0aG4ucHJvdmlkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBR0wsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsWUFBZ0MsRUFDaEMsU0FBd0QsRUFBRTtJQUUxRCxPQUFPO1FBQ0w7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixRQUFRLEVBQUUsb0JBQW9CLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQztTQUNyRDtRQUNELGVBQWU7S0FDaEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBc0I7SUFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUNiLG1IQUFtSCxDQUNwSCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTDtZQUNFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLFFBQVEsRUFBRSxNQUFNO1NBQ2pCO1FBQ0QsZUFBZTtLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBXZWJBdXRobiBQcm92aWRlcnNcclxuICogTW9kZXJuIEFuZ3VsYXIgc3RhbmRhbG9uZSBwcm92aWRlciBmdW5jdGlvbiBmb3IgV2ViQXV0aG4gc2VydmljZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFdlYkF1dGhuU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3dlYmF1dGhuLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIFdlYkF1dGhuQ29uZmlnLFxyXG4gIFJlbHlpbmdQYXJ0eUNvbmZpZyxcclxuICBXRUJBVVRITl9DT05GSUcsXHJcbiAgY3JlYXRlV2ViQXV0aG5Db25maWcsXHJcbn0gZnJvbSAnLi4vY29uZmlnL3dlYmF1dGhuLmNvbmZpZyc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgV2ViQXV0aG4gc2VydmljZSB3aXRoIHJlcXVpcmVkIHJlbHlpbmcgcGFydHkgY29uZmlndXJhdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0gcmVseWluZ1BhcnR5IFJlcXVpcmVkIHJlbHlpbmcgcGFydHkgY29uZmlndXJhdGlvblxyXG4gKiBAcGFyYW0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzXHJcbiAqIEByZXR1cm5zIEFycmF5IG9mIHByb3ZpZGVycyBmb3IgV2ViQXV0aG4gZnVuY3Rpb25hbGl0eVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIC8vIG1haW4udHNcclxuICogYm9vdHN0cmFwQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LCB7XHJcbiAqICAgcHJvdmlkZXJzOiBbXHJcbiAqICAgICBwcm92aWRlV2ViQXV0aG4oXHJcbiAqICAgICAgIHsgbmFtZTogJ015IEFwcCcsIGlkOiAnbXlhcHAuY29tJyB9LFxyXG4gKiAgICAgICB7IGRlZmF1bHRUaW1lb3V0OiAzMDAwMCB9XHJcbiAqICAgICApXHJcbiAqICAgXVxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVdlYkF1dGhuKFxyXG4gIHJlbHlpbmdQYXJ0eTogUmVseWluZ1BhcnR5Q29uZmlnLFxyXG4gIGNvbmZpZzogUGFydGlhbDxPbWl0PFdlYkF1dGhuQ29uZmlnLCAncmVseWluZ1BhcnR5Jz4+ID0ge31cclxuKTogUHJvdmlkZXJbXSB7XHJcbiAgcmV0dXJuIFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogV0VCQVVUSE5fQ09ORklHLFxyXG4gICAgICB1c2VWYWx1ZTogY3JlYXRlV2ViQXV0aG5Db25maWcocmVseWluZ1BhcnR5LCBjb25maWcpLFxyXG4gICAgfSxcclxuICAgIFdlYkF1dGhuU2VydmljZSxcclxuICBdO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlcHJlY2F0ZWQgVXNlIHByb3ZpZGVXZWJBdXRobihyZWx5aW5nUGFydHksIGNvbmZpZykgaW5zdGVhZC5cclxuICogVGhpcyB2ZXJzaW9uIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IHJlcXVpcmVzIHJlbHlpbmcgcGFydHkgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVdlYkF1dGhuTGVnYWN5KGNvbmZpZzogV2ViQXV0aG5Db25maWcpOiBQcm92aWRlcltdIHtcclxuICBpZiAoIWNvbmZpZy5yZWx5aW5nUGFydHkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgJ1dlYkF1dGhuIGNvbmZpZ3VyYXRpb24gbXVzdCBpbmNsdWRlIHJlbHlpbmcgcGFydHkgaW5mb3JtYXRpb24uIFVzZSBwcm92aWRlV2ViQXV0aG4ocmVseWluZ1BhcnR5LCBjb25maWcpIGluc3RlYWQuJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IFdFQkFVVEhOX0NPTkZJRyxcclxuICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcclxuICAgIH0sXHJcbiAgICBXZWJBdXRoblNlcnZpY2UsXHJcbiAgXTtcclxufVxyXG4iXX0=","// Core service\nexport { WebAuthnService } from './lib/services/webauthn.service';\nexport { WEBAUTHN_CONFIG, createWebAuthnConfig, DEFAULT_WEBAUTHN_CONFIG, } from './lib/config/webauthn.config';\n// Providers\nexport { provideWebAuthn, provideWebAuthnLegacy, } from './lib/providers/webauthn.providers';\n// Error types for enhanced error handling\nexport { WebAuthnError, WebAuthnErrorType, UserCancelledError, AuthenticatorError, InvalidOptionsError, UnsupportedOperationError, SecurityError, TimeoutError, NetworkError, } from './lib/errors/webauthn.errors';\n// Utility functions\nexport { arrayBufferToBase64url, base64urlToArrayBuffer, arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString, generateChallenge, generateUserId, credentialIdToArrayBuffer, arrayBufferToCredentialId, isWebAuthnSupported, isPlatformAuthenticatorAvailable, getSupportedTransports, validateRegistrationOptions, getDefaultPubKeyCredParams, isJSONOptions, isPublicKeyCredential, } from './lib/utils/webauthn.utils';\n// Preset configurations\nexport { PRESET_MAP, PASSKEY_PRESET, SECOND_FACTOR_PRESET, DEVICE_BOUND_PRESET, } from './lib/presets/webauthn.presets';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25neC13ZWJhdXRobi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZTtBQUNmLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQU9sRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLG9CQUFvQixFQUNwQix1QkFBdUIsR0FDeEIsTUFBTSw4QkFBOEIsQ0FBQztBQUV0QyxZQUFZO0FBQ1osT0FBTyxFQUNMLGVBQWUsRUFDZixxQkFBcUIsR0FDdEIsTUFBTSxvQ0FBb0MsQ0FBQztBQXVCNUMsMENBQTBDO0FBQzFDLE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixhQUFhLEVBQ2IsWUFBWSxFQUNaLFlBQVksR0FDYixNQUFNLDhCQUE4QixDQUFDO0FBRXRDLG9CQUFvQjtBQUNwQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLG1CQUFtQixFQUNuQixnQ0FBZ0MsRUFDaEMsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFDMUIsYUFBYSxFQUNiLHFCQUFxQixHQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLHdCQUF3QjtBQUN4QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsbUJBQW1CLEdBQ3BCLE1BQU0sZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3JlIHNlcnZpY2VcclxuZXhwb3J0IHsgV2ViQXV0aG5TZXJ2aWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvd2ViYXV0aG4uc2VydmljZSc7XHJcblxyXG4vLyBDb25maWd1cmF0aW9uIHN5c3RlbVxyXG5leHBvcnQgdHlwZSB7XHJcbiAgV2ViQXV0aG5Db25maWcsXHJcbiAgUmVseWluZ1BhcnR5Q29uZmlnLFxyXG59IGZyb20gJy4vbGliL2NvbmZpZy93ZWJhdXRobi5jb25maWcnO1xyXG5leHBvcnQge1xyXG4gIFdFQkFVVEhOX0NPTkZJRyxcclxuICBjcmVhdGVXZWJBdXRobkNvbmZpZyxcclxuICBERUZBVUxUX1dFQkFVVEhOX0NPTkZJRyxcclxufSBmcm9tICcuL2xpYi9jb25maWcvd2ViYXV0aG4uY29uZmlnJztcclxuXHJcbi8vIFByb3ZpZGVyc1xyXG5leHBvcnQge1xyXG4gIHByb3ZpZGVXZWJBdXRobixcclxuICBwcm92aWRlV2ViQXV0aG5MZWdhY3ksXHJcbn0gZnJvbSAnLi9saWIvcHJvdmlkZXJzL3dlYmF1dGhuLnByb3ZpZGVycyc7XHJcblxyXG4vLyBDb3JlIG1vZGVscyBhbmQgcmVzcG9uc2UgdHlwZXNcclxuZXhwb3J0IHR5cGUge1xyXG4gIFdlYkF1dGhuUmVnaXN0cmF0aW9uUmVzdWx0LFxyXG4gIFdlYkF1dGhuQXV0aGVudGljYXRpb25SZXN1bHQsXHJcbiAgV2ViQXV0aG5TdXBwb3J0LFxyXG4gIFJlZ2lzdHJhdGlvblJlc3BvbnNlLFxyXG4gIEF1dGhlbnRpY2F0aW9uUmVzcG9uc2UsXHJcbiAgLy8gTmV3IGNvbmZpZ3VyYXRpb24gdHlwZXNcclxuICBSZWdpc3RlckNvbmZpZyxcclxuICBBdXRoZW50aWNhdGVDb25maWcsXHJcbiAgUmVnaXN0ZXJJbnB1dCxcclxuICBBdXRoZW50aWNhdGVJbnB1dCxcclxuICBQcmVzZXROYW1lLFxyXG59IGZyb20gJy4vbGliL21vZGVscy93ZWJhdXRobi5tb2RlbHMnO1xyXG5cclxuLy8gQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG1vZGVsc1xyXG5leHBvcnQgdHlwZSB7XHJcbiAgUmVnaXN0ZXJDb25maWcgYXMgUmVnaXN0ZXJDb25maWdNb2RlbCxcclxuICBBdXRoZW50aWNhdGVDb25maWcgYXMgQXV0aGVudGljYXRlQ29uZmlnTW9kZWwsXHJcbn0gZnJvbSAnLi9saWIvbW9kZWxzL3JlZ2lzdGVyLWNvbmZpZy5tb2RlbHMnO1xyXG5cclxuLy8gRXJyb3IgdHlwZXMgZm9yIGVuaGFuY2VkIGVycm9yIGhhbmRsaW5nXHJcbmV4cG9ydCB7XHJcbiAgV2ViQXV0aG5FcnJvcixcclxuICBXZWJBdXRobkVycm9yVHlwZSxcclxuICBVc2VyQ2FuY2VsbGVkRXJyb3IsXHJcbiAgQXV0aGVudGljYXRvckVycm9yLFxyXG4gIEludmFsaWRPcHRpb25zRXJyb3IsXHJcbiAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcixcclxuICBTZWN1cml0eUVycm9yLFxyXG4gIFRpbWVvdXRFcnJvcixcclxuICBOZXR3b3JrRXJyb3IsXHJcbn0gZnJvbSAnLi9saWIvZXJyb3JzL3dlYmF1dGhuLmVycm9ycyc7XHJcblxyXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xyXG5leHBvcnQge1xyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjR1cmwsXHJcbiAgYmFzZTY0dXJsVG9BcnJheUJ1ZmZlcixcclxuICBhcnJheUJ1ZmZlclRvQmFzZTY0LFxyXG4gIGJhc2U2NFRvQXJyYXlCdWZmZXIsXHJcbiAgc3RyaW5nVG9BcnJheUJ1ZmZlcixcclxuICBhcnJheUJ1ZmZlclRvU3RyaW5nLFxyXG4gIGdlbmVyYXRlQ2hhbGxlbmdlLFxyXG4gIGdlbmVyYXRlVXNlcklkLFxyXG4gIGNyZWRlbnRpYWxJZFRvQXJyYXlCdWZmZXIsXHJcbiAgYXJyYXlCdWZmZXJUb0NyZWRlbnRpYWxJZCxcclxuICBpc1dlYkF1dGhuU3VwcG9ydGVkLFxyXG4gIGlzUGxhdGZvcm1BdXRoZW50aWNhdG9yQXZhaWxhYmxlLFxyXG4gIGdldFN1cHBvcnRlZFRyYW5zcG9ydHMsXHJcbiAgdmFsaWRhdGVSZWdpc3RyYXRpb25PcHRpb25zLFxyXG4gIGdldERlZmF1bHRQdWJLZXlDcmVkUGFyYW1zLFxyXG4gIGlzSlNPTk9wdGlvbnMsXHJcbiAgaXNQdWJsaWNLZXlDcmVkZW50aWFsLFxyXG59IGZyb20gJy4vbGliL3V0aWxzL3dlYmF1dGhuLnV0aWxzJztcclxuXHJcbi8vIFByZXNldCBjb25maWd1cmF0aW9uc1xyXG5leHBvcnQge1xyXG4gIFBSRVNFVF9NQVAsXHJcbiAgUEFTU0tFWV9QUkVTRVQsXHJcbiAgU0VDT05EX0ZBQ1RPUl9QUkVTRVQsXHJcbiAgREVWSUNFX0JPVU5EX1BSRVNFVCxcclxufSBmcm9tICcuL2xpYi9wcmVzZXRzL3dlYmF1dGhuLnByZXNldHMnO1xyXG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXdlYmF1dGhuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL25neC13ZWJhdXRobi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":["generateChallenge","generateUserId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-webauthn.mjs","sources":["../tmp-esm2022/lib/utils/type-guards.js","../tmp-esm2022/lib/presets/webauthn.presets.js","../tmp-esm2022/lib/utils/preset.utils.js","../tmp-esm2022/lib/errors/webauthn.errors.js","../tmp-esm2022/lib/model/service-config.js","../tmp-esm2022/lib/utils/webauthn.utils.js","../tmp-esm2022/lib/utils/remote.utils.js","../tmp-esm2022/lib/services/webauthn.service.js","../tmp-esm2022/lib/providers/webauthn.providers.js","../tmp-esm2022/index.js","../tmp-esm2022/ngx-webauthn.js"],"sourcesContent":["/**\n * Type guard utilities for WebAuthn operations\n *\n * These functions help determine the type of input provided to WebAuthn operations,\n * enabling proper handling of different input formats (high-level configs vs native WebAuthn options).\n */\n/**\n * Type guard to determine if input is a high-level RegisterConfig object.\n * Distinguishes between RegisterConfig and direct WebAuthn creation options.\n *\n * @param input The input to check\n * @returns True if the input is a RegisterConfig, false otherwise\n *\n * @example\n * ```typescript\n * if (isRegisterConfig(input)) {\n * // Handle high-level config with preset support\n * const options = buildCreationOptionsFromConfig(input, config);\n * } else {\n * // Handle direct WebAuthn options\n * const options = parseRegistrationOptions(input);\n * }\n * ```\n */\nexport function isRegisterConfig(input) {\n return typeof input === 'object' && input !== null && 'username' in input;\n}\n/**\n * Type guard to determine if input is a high-level AuthenticateConfig object.\n * Distinguishes between AuthenticateConfig and direct WebAuthn request options.\n *\n * Uses the presence of 'username' or 'preset' fields and absence of WebAuthn-specific\n * fields ('rp', 'user') to identify AuthenticateConfig objects.\n *\n * @param input The input to check\n * @returns True if the input is an AuthenticateConfig, false otherwise\n *\n * @example\n * ```typescript\n * if (isAuthenticateConfig(input)) {\n * // Handle high-level config with preset support\n * const options = buildRequestOptionsFromConfig(input, config);\n * } else {\n * // Handle direct WebAuthn options\n * const options = parseAuthenticationOptions(input);\n * }\n * ```\n */\nexport function isAuthenticateConfig(input) {\n return (typeof input === 'object' &&\n input !== null &&\n ('username' in input || 'preset' in input) &&\n !('rp' in input) && // WebAuthn options have 'rp'\n !('user' in input)); // WebAuthn options have 'user'\n}\n/**\n * Type guard to check if input contains WebAuthn creation options.\n * Identifies objects that have the structure of PublicKeyCredentialCreationOptions\n * by checking for required fields like 'rp' and 'user'.\n *\n * @param input The input to check\n * @returns True if the input has creation options structure, false otherwise\n *\n * @example\n * ```typescript\n * if (isCreationOptions(input)) {\n * // Input is already in WebAuthn format\n * return navigator.credentials.create({ publicKey: input });\n * }\n * ```\n */\nexport function isCreationOptions(input) {\n return (typeof input === 'object' &&\n input !== null &&\n 'rp' in input &&\n 'user' in input);\n}\n/**\n * Type guard to check if input contains WebAuthn request options.\n * Identifies objects that have the structure of PublicKeyCredentialRequestOptions\n * by checking for the required 'challenge' field.\n *\n * @param input The input to check\n * @returns True if the input has request options structure, false otherwise\n *\n * @example\n * ```typescript\n * if (isRequestOptions(input)) {\n * // Input is already in WebAuthn format\n * return navigator.credentials.get({ publicKey: input });\n * }\n * ```\n */\nexport function isRequestOptions(input) {\n return (typeof input === 'object' &&\n input !== null &&\n !('username' in input) &&\n !('rp' in input) &&\n !('user' in input));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1ndWFyZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC13ZWJhdXRobi9zcmMvbGliL3V0aWxzL3R5cGUtZ3VhcmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBT0g7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxVQUFVLElBQUksS0FBSyxDQUFDO0FBQzVFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQWM7SUFFZCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLEtBQUssSUFBSTtRQUNkLENBQUMsVUFBVSxJQUFJLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksNkJBQTZCO1FBQ2pELENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQ25CLENBQUMsQ0FBQywrQkFBK0I7QUFDcEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsS0FBYztJQUlkLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsSUFBSSxJQUFJLEtBQUs7UUFDYixNQUFNLElBQUksS0FBSyxDQUNoQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsS0FBYztJQUlkLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsQ0FBQyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDdEIsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDaEIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FDbkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUgZ3VhcmQgdXRpbGl0aWVzIGZvciBXZWJBdXRobiBvcGVyYXRpb25zXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGhlbHAgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGlucHV0IHByb3ZpZGVkIHRvIFdlYkF1dGhuIG9wZXJhdGlvbnMsXG4gKiBlbmFibGluZyBwcm9wZXIgaGFuZGxpbmcgb2YgZGlmZmVyZW50IGlucHV0IGZvcm1hdHMgKGhpZ2gtbGV2ZWwgY29uZmlncyB2cyBuYXRpdmUgV2ViQXV0aG4gb3B0aW9ucykuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBSZWdpc3RlckNvbmZpZyxcbiAgQXV0aGVudGljYXRlQ29uZmlnLFxufSBmcm9tICcuLi9tb2RlbC9vcGVyYXRpb24tY29uZmlnJztcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGRldGVybWluZSBpZiBpbnB1dCBpcyBhIGhpZ2gtbGV2ZWwgUmVnaXN0ZXJDb25maWcgb2JqZWN0LlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIFJlZ2lzdGVyQ29uZmlnIGFuZCBkaXJlY3QgV2ViQXV0aG4gY3JlYXRpb24gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBpbnB1dCBpcyBhIFJlZ2lzdGVyQ29uZmlnLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzUmVnaXN0ZXJDb25maWcoaW5wdXQpKSB7XG4gKiAgIC8vIEhhbmRsZSBoaWdoLWxldmVsIGNvbmZpZyB3aXRoIHByZXNldCBzdXBwb3J0XG4gKiAgIGNvbnN0IG9wdGlvbnMgPSBidWlsZENyZWF0aW9uT3B0aW9uc0Zyb21Db25maWcoaW5wdXQsIGNvbmZpZyk7XG4gKiB9IGVsc2Uge1xuICogICAvLyBIYW5kbGUgZGlyZWN0IFdlYkF1dGhuIG9wdGlvbnNcbiAqICAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlUmVnaXN0cmF0aW9uT3B0aW9ucyhpbnB1dCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnaXN0ZXJDb25maWcoaW5wdXQ6IHVua25vd24pOiBpbnB1dCBpcyBSZWdpc3RlckNvbmZpZyB7XG4gIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0ICE9PSBudWxsICYmICd1c2VybmFtZScgaW4gaW5wdXQ7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBkZXRlcm1pbmUgaWYgaW5wdXQgaXMgYSBoaWdoLWxldmVsIEF1dGhlbnRpY2F0ZUNvbmZpZyBvYmplY3QuXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gQXV0aGVudGljYXRlQ29uZmlnIGFuZCBkaXJlY3QgV2ViQXV0aG4gcmVxdWVzdCBvcHRpb25zLlxuICpcbiAqIFVzZXMgdGhlIHByZXNlbmNlIG9mICd1c2VybmFtZScgb3IgJ3ByZXNldCcgZmllbGRzIGFuZCBhYnNlbmNlIG9mIFdlYkF1dGhuLXNwZWNpZmljXG4gKiBmaWVsZHMgKCdycCcsICd1c2VyJykgdG8gaWRlbnRpZnkgQXV0aGVudGljYXRlQ29uZmlnIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgaW5wdXQgaXMgYW4gQXV0aGVudGljYXRlQ29uZmlnLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzQXV0aGVudGljYXRlQ29uZmlnKGlucHV0KSkge1xuICogICAvLyBIYW5kbGUgaGlnaC1sZXZlbCBjb25maWcgd2l0aCBwcmVzZXQgc3VwcG9ydFxuICogICBjb25zdCBvcHRpb25zID0gYnVpbGRSZXF1ZXN0T3B0aW9uc0Zyb21Db25maWcoaW5wdXQsIGNvbmZpZyk7XG4gKiB9IGVsc2Uge1xuICogICAvLyBIYW5kbGUgZGlyZWN0IFdlYkF1dGhuIG9wdGlvbnNcbiAqICAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXV0aGVudGljYXRpb25PcHRpb25zKGlucHV0KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoZW50aWNhdGVDb25maWcoXG4gIGlucHV0OiB1bmtub3duXG4pOiBpbnB1dCBpcyBBdXRoZW50aWNhdGVDb25maWcge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiZcbiAgICBpbnB1dCAhPT0gbnVsbCAmJlxuICAgICgndXNlcm5hbWUnIGluIGlucHV0IHx8ICdwcmVzZXQnIGluIGlucHV0KSAmJlxuICAgICEoJ3JwJyBpbiBpbnB1dCkgJiYgLy8gV2ViQXV0aG4gb3B0aW9ucyBoYXZlICdycCdcbiAgICAhKCd1c2VyJyBpbiBpbnB1dClcbiAgKTsgLy8gV2ViQXV0aG4gb3B0aW9ucyBoYXZlICd1c2VyJ1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgaW5wdXQgY29udGFpbnMgV2ViQXV0aG4gY3JlYXRpb24gb3B0aW9ucy5cbiAqIElkZW50aWZpZXMgb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHN0cnVjdHVyZSBvZiBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zXG4gKiBieSBjaGVja2luZyBmb3IgcmVxdWlyZWQgZmllbGRzIGxpa2UgJ3JwJyBhbmQgJ3VzZXInLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGlucHV0IGhhcyBjcmVhdGlvbiBvcHRpb25zIHN0cnVjdHVyZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0NyZWF0aW9uT3B0aW9ucyhpbnB1dCkpIHtcbiAqICAgLy8gSW5wdXQgaXMgYWxyZWFkeSBpbiBXZWJBdXRobiBmb3JtYXRcbiAqICAgcmV0dXJuIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoeyBwdWJsaWNLZXk6IGlucHV0IH0pO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NyZWF0aW9uT3B0aW9ucyhcbiAgaW5wdXQ6IHVua25vd25cbik6IGlucHV0IGlzXG4gIHwgUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc1xuICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXG4gICAgaW5wdXQgIT09IG51bGwgJiZcbiAgICAncnAnIGluIGlucHV0ICYmXG4gICAgJ3VzZXInIGluIGlucHV0XG4gICk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbnB1dCBjb250YWlucyBXZWJBdXRobiByZXF1ZXN0IG9wdGlvbnMuXG4gKiBJZGVudGlmaWVzIG9iamVjdHMgdGhhdCBoYXZlIHRoZSBzdHJ1Y3R1cmUgb2YgUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zXG4gKiBieSBjaGVja2luZyBmb3IgdGhlIHJlcXVpcmVkICdjaGFsbGVuZ2UnIGZpZWxkLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGlucHV0IGhhcyByZXF1ZXN0IG9wdGlvbnMgc3RydWN0dXJlLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzUmVxdWVzdE9wdGlvbnMoaW5wdXQpKSB7XG4gKiAgIC8vIElucHV0IGlzIGFscmVhZHkgaW4gV2ViQXV0aG4gZm9ybWF0XG4gKiAgIHJldHVybiBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KHsgcHVibGljS2V5OiBpbnB1dCB9KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0T3B0aW9ucyhcbiAgaW5wdXQ6IHVua25vd25cbik6IGlucHV0IGlzXG4gIHwgUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zXG4gIHwgUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zSlNPTiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJlxuICAgIGlucHV0ICE9PSBudWxsICYmXG4gICAgISgndXNlcm5hbWUnIGluIGlucHV0KSAmJlxuICAgICEoJ3JwJyBpbiBpbnB1dCkgJiZcbiAgICAhKCd1c2VyJyBpbiBpbnB1dClcbiAgKTtcbn1cbiJdfQ==","/**\n * WebAuthn Preset Configurations\n *\n * This file contains predefined configurations for common WebAuthn use cases.\n * These presets provide sensible defaults while remaining fully customizable.\n */\n/**\n * A shared configuration for common, strong, and widely-supported\n * public key credential algorithms.\n */\nexport const COMMON_PUB_KEY_CRED_PARAMS = {\n pubKeyCredParams: [\n { type: 'public-key', alg: -7 }, // ES256 (ECDSA w/ SHA-256)\n { type: 'public-key', alg: -257 }, // RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256)\n ],\n};\n/**\n * Preset for modern, passwordless, cross-device credentials.\n *\n * Best for: Passkey-based authentication where users can sync credentials\n * across devices and use them for passwordless login.\n *\n * Features:\n * - Requires resident keys (discoverable credentials)\n * - Prefers user verification but doesn't require it\n * - Works with both platform and cross-platform authenticators\n * - Supports credential syncing across devices\n */\nexport const PASSKEY_PRESET = {\n ...COMMON_PUB_KEY_CRED_PARAMS,\n authenticatorSelection: {\n residentKey: 'required',\n userVerification: 'preferred',\n },\n};\n/**\n * Preset for using an external security key as a second factor after a password.\n *\n * Best for: Traditional 2FA scenarios where users already have a password\n * and want to add hardware security key as a second factor.\n *\n * Features:\n * - Discourages resident keys (server-side credential storage)\n * - Prefers user verification\n * - Favors cross-platform authenticators (USB/NFC security keys)\n * - Credentials typically not synced between devices\n */\nexport const EXTERNAL_SECURITY_KEY_PRESET = {\n ...COMMON_PUB_KEY_CRED_PARAMS,\n authenticatorSelection: {\n residentKey: 'discouraged',\n userVerification: 'preferred',\n authenticatorAttachment: 'cross-platform',\n },\n};\n/**\n * Preset for high-security, non-synced, platform authenticator credentials.\n *\n * Best for: High-security scenarios where credentials must stay on a single\n * device and user verification is mandatory using built-in platform authenticators.\n *\n * Features:\n * - Requires platform authenticators (built-in biometrics/PIN)\n * - Requires resident keys for discoverability\n * - Requires user verification (biometric/PIN)\n * - Credentials bound to specific device (no syncing)\n */\nexport const PLATFORM_AUTHENTICATOR_PRESET = {\n ...COMMON_PUB_KEY_CRED_PARAMS,\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n residentKey: 'required',\n userVerification: 'required',\n },\n};\n/**\n * Map of preset names to their configurations\n * Used internally for preset resolution\n */\nexport const PRESET_MAP = {\n passkey: PASSKEY_PRESET,\n externalSecurityKey: EXTERNAL_SECURITY_KEY_PRESET,\n platformAuthenticator: PLATFORM_AUTHENTICATOR_PRESET,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4ucHJlc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXdlYmF1dGhuL3NyYy9saWIvcHJlc2V0cy93ZWJhdXRobi5wcmVzZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsZ0JBQWdCLEVBQUU7UUFDaEIsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLDJCQUEyQjtRQUM1RCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsdUNBQXVDO0tBQzNFO0NBQ08sQ0FBQztBQUVYOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHO0lBQzVCLEdBQUcsMEJBQTBCO0lBQzdCLHNCQUFzQixFQUFFO1FBQ3RCLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLGdCQUFnQixFQUFFLFdBQVc7S0FDOUI7Q0FDTyxDQUFDO0FBRVg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxHQUFHLDBCQUEwQjtJQUM3QixzQkFBc0IsRUFBRTtRQUN0QixXQUFXLEVBQUUsYUFBYTtRQUMxQixnQkFBZ0IsRUFBRSxXQUFXO1FBQzdCLHVCQUF1QixFQUFFLGdCQUFnQjtLQUMxQztDQUNPLENBQUM7QUFFWDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHO0lBQzNDLEdBQUcsMEJBQTBCO0lBQzdCLHNCQUFzQixFQUFFO1FBQ3RCLHVCQUF1QixFQUFFLFVBQVU7UUFDbkMsV0FBVyxFQUFFLFVBQVU7UUFDdkIsZ0JBQWdCLEVBQUUsVUFBVTtLQUM3QjtDQUNPLENBQUM7QUFFWDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUc7SUFDeEIsT0FBTyxFQUFFLGNBQWM7SUFDdkIsbUJBQW1CLEVBQUUsNEJBQTRCO0lBQ2pELHFCQUFxQixFQUFFLDZCQUE2QjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFdlYkF1dGhuIFByZXNldCBDb25maWd1cmF0aW9uc1xyXG4gKlxyXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9ucyBmb3IgY29tbW9uIFdlYkF1dGhuIHVzZSBjYXNlcy5cclxuICogVGhlc2UgcHJlc2V0cyBwcm92aWRlIHNlbnNpYmxlIGRlZmF1bHRzIHdoaWxlIHJlbWFpbmluZyBmdWxseSBjdXN0b21pemFibGUuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc2hhcmVkIGNvbmZpZ3VyYXRpb24gZm9yIGNvbW1vbiwgc3Ryb25nLCBhbmQgd2lkZWx5LXN1cHBvcnRlZFxyXG4gKiBwdWJsaWMga2V5IGNyZWRlbnRpYWwgYWxnb3JpdGhtcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBDT01NT05fUFVCX0tFWV9DUkVEX1BBUkFNUyA9IHtcclxuICBwdWJLZXlDcmVkUGFyYW1zOiBbXHJcbiAgICB7IHR5cGU6ICdwdWJsaWMta2V5JywgYWxnOiAtNyB9LCAvLyBFUzI1NiAoRUNEU0Egdy8gU0hBLTI1NilcclxuICAgIHsgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC0yNTcgfSwgLy8gUlMyNTYgKFJTQVNTQS1QS0NTMS12MV81IHcvIFNIQS0yNTYpXHJcbiAgXSxcclxufSBhcyBjb25zdDtcclxuXHJcbi8qKlxyXG4gKiBQcmVzZXQgZm9yIG1vZGVybiwgcGFzc3dvcmRsZXNzLCBjcm9zcy1kZXZpY2UgY3JlZGVudGlhbHMuXHJcbiAqXHJcbiAqIEJlc3QgZm9yOiBQYXNza2V5LWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdoZXJlIHVzZXJzIGNhbiBzeW5jIGNyZWRlbnRpYWxzXHJcbiAqIGFjcm9zcyBkZXZpY2VzIGFuZCB1c2UgdGhlbSBmb3IgcGFzc3dvcmRsZXNzIGxvZ2luLlxyXG4gKlxyXG4gKiBGZWF0dXJlczpcclxuICogLSBSZXF1aXJlcyByZXNpZGVudCBrZXlzIChkaXNjb3ZlcmFibGUgY3JlZGVudGlhbHMpXHJcbiAqIC0gUHJlZmVycyB1c2VyIHZlcmlmaWNhdGlvbiBidXQgZG9lc24ndCByZXF1aXJlIGl0XHJcbiAqIC0gV29ya3Mgd2l0aCBib3RoIHBsYXRmb3JtIGFuZCBjcm9zcy1wbGF0Zm9ybSBhdXRoZW50aWNhdG9yc1xyXG4gKiAtIFN1cHBvcnRzIGNyZWRlbnRpYWwgc3luY2luZyBhY3Jvc3MgZGV2aWNlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBBU1NLRVlfUFJFU0VUID0ge1xyXG4gIC4uLkNPTU1PTl9QVUJfS0VZX0NSRURfUEFSQU1TLFxyXG4gIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHtcclxuICAgIHJlc2lkZW50S2V5OiAncmVxdWlyZWQnLFxyXG4gICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXHJcbiAgfSxcclxufSBhcyBjb25zdDtcclxuXHJcbi8qKlxyXG4gKiBQcmVzZXQgZm9yIHVzaW5nIGFuIGV4dGVybmFsIHNlY3VyaXR5IGtleSBhcyBhIHNlY29uZCBmYWN0b3IgYWZ0ZXIgYSBwYXNzd29yZC5cclxuICpcclxuICogQmVzdCBmb3I6IFRyYWRpdGlvbmFsIDJGQSBzY2VuYXJpb3Mgd2hlcmUgdXNlcnMgYWxyZWFkeSBoYXZlIGEgcGFzc3dvcmRcclxuICogYW5kIHdhbnQgdG8gYWRkIGhhcmR3YXJlIHNlY3VyaXR5IGtleSBhcyBhIHNlY29uZCBmYWN0b3IuXHJcbiAqXHJcbiAqIEZlYXR1cmVzOlxyXG4gKiAtIERpc2NvdXJhZ2VzIHJlc2lkZW50IGtleXMgKHNlcnZlci1zaWRlIGNyZWRlbnRpYWwgc3RvcmFnZSlcclxuICogLSBQcmVmZXJzIHVzZXIgdmVyaWZpY2F0aW9uXHJcbiAqIC0gRmF2b3JzIGNyb3NzLXBsYXRmb3JtIGF1dGhlbnRpY2F0b3JzIChVU0IvTkZDIHNlY3VyaXR5IGtleXMpXHJcbiAqIC0gQ3JlZGVudGlhbHMgdHlwaWNhbGx5IG5vdCBzeW5jZWQgYmV0d2VlbiBkZXZpY2VzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRVhURVJOQUxfU0VDVVJJVFlfS0VZX1BSRVNFVCA9IHtcclxuICAuLi5DT01NT05fUFVCX0tFWV9DUkVEX1BBUkFNUyxcclxuICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XHJcbiAgICByZXNpZGVudEtleTogJ2Rpc2NvdXJhZ2VkJyxcclxuICAgIHVzZXJWZXJpZmljYXRpb246ICdwcmVmZXJyZWQnLFxyXG4gICAgYXV0aGVudGljYXRvckF0dGFjaG1lbnQ6ICdjcm9zcy1wbGF0Zm9ybScsXHJcbiAgfSxcclxufSBhcyBjb25zdDtcclxuXHJcbi8qKlxyXG4gKiBQcmVzZXQgZm9yIGhpZ2gtc2VjdXJpdHksIG5vbi1zeW5jZWQsIHBsYXRmb3JtIGF1dGhlbnRpY2F0b3IgY3JlZGVudGlhbHMuXHJcbiAqXHJcbiAqIEJlc3QgZm9yOiBIaWdoLXNlY3VyaXR5IHNjZW5hcmlvcyB3aGVyZSBjcmVkZW50aWFscyBtdXN0IHN0YXkgb24gYSBzaW5nbGVcclxuICogZGV2aWNlIGFuZCB1c2VyIHZlcmlmaWNhdGlvbiBpcyBtYW5kYXRvcnkgdXNpbmcgYnVpbHQtaW4gcGxhdGZvcm0gYXV0aGVudGljYXRvcnMuXHJcbiAqXHJcbiAqIEZlYXR1cmVzOlxyXG4gKiAtIFJlcXVpcmVzIHBsYXRmb3JtIGF1dGhlbnRpY2F0b3JzIChidWlsdC1pbiBiaW9tZXRyaWNzL1BJTilcclxuICogLSBSZXF1aXJlcyByZXNpZGVudCBrZXlzIGZvciBkaXNjb3ZlcmFiaWxpdHlcclxuICogLSBSZXF1aXJlcyB1c2VyIHZlcmlmaWNhdGlvbiAoYmlvbWV0cmljL1BJTilcclxuICogLSBDcmVkZW50aWFscyBib3VuZCB0byBzcGVjaWZpYyBkZXZpY2UgKG5vIHN5bmNpbmcpXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUExBVEZPUk1fQVVUSEVOVElDQVRPUl9QUkVTRVQgPSB7XHJcbiAgLi4uQ09NTU9OX1BVQl9LRVlfQ1JFRF9QQVJBTVMsXHJcbiAgYXV0aGVudGljYXRvclNlbGVjdGlvbjoge1xyXG4gICAgYXV0aGVudGljYXRvckF0dGFjaG1lbnQ6ICdwbGF0Zm9ybScsXHJcbiAgICByZXNpZGVudEtleTogJ3JlcXVpcmVkJyxcclxuICAgIHVzZXJWZXJpZmljYXRpb246ICdyZXF1aXJlZCcsXHJcbiAgfSxcclxufSBhcyBjb25zdDtcclxuXHJcbi8qKlxyXG4gKiBNYXAgb2YgcHJlc2V0IG5hbWVzIHRvIHRoZWlyIGNvbmZpZ3VyYXRpb25zXHJcbiAqIFVzZWQgaW50ZXJuYWxseSBmb3IgcHJlc2V0IHJlc29sdXRpb25cclxuICovXHJcbmV4cG9ydCBjb25zdCBQUkVTRVRfTUFQID0ge1xyXG4gIHBhc3NrZXk6IFBBU1NLRVlfUFJFU0VULFxyXG4gIGV4dGVybmFsU2VjdXJpdHlLZXk6IEVYVEVSTkFMX1NFQ1VSSVRZX0tFWV9QUkVTRVQsXHJcbiAgcGxhdGZvcm1BdXRoZW50aWNhdG9yOiBQTEFURk9STV9BVVRIRU5USUNBVE9SX1BSRVNFVCxcclxufSBhcyBjb25zdDtcclxuXHJcbi8qKlxyXG4gKiBBdmFpbGFibGUgcHJlc2V0IG5hbWVzIGFzIGEgdW5pb24gdHlwZVxyXG4gKi9cclxuZXhwb3J0IHR5cGUgUHJlc2V0TmFtZSA9IGtleW9mIHR5cGVvZiBQUkVTRVRfTUFQO1xyXG4iXX0=","/**\n * Utility functions for resolving and merging WebAuthn presets\n *\n * These utilities handle the logic of taking a RegisterConfig or AuthenticateConfig,\n * resolving any preset, and merging it with user overrides to produce final\n * WebAuthn options ready for the browser API.\n */\nimport { PRESET_MAP } from '../presets/webauthn.presets';\n/**\n * Deep merge utility that properly handles nested objects.\n * Later properties override earlier ones, with recursive merging for nested objects.\n *\n * @param target The target object to merge into\n * @param sources Source objects to merge from (processed left to right)\n * @returns The merged target object\n * @example\n * ```typescript\n * const result = deepMerge(\n * { a: 1, b: { x: 1 } },\n * { b: { y: 2 } },\n * { c: 3 }\n * );\n * // Result: { a: 1, b: { x: 1, y: 2 }, c: 3 }\n * ```\n */\nfunction deepMerge(target, ...sources) {\n if (!sources.length)\n return target;\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key])\n Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return deepMerge(target, ...sources);\n}\n/**\n * Type guard to check if a value is a plain object (not array, null, or primitive).\n *\n * @param item The value to check\n * @returns True if the item is a plain object, false otherwise\n */\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n/**\n * Generates a cryptographically secure random challenge for WebAuthn operations.\n * Uses the Web Crypto API for secure random number generation.\n *\n * @returns A 32-byte Uint8Array containing the random challenge\n */\nfunction generateChallenge() {\n return crypto.getRandomValues(new Uint8Array(32));\n}\n/**\n * Generates a unique user ID based on the username.\n * Creates a consistent, URL-safe identifier for the user.\n *\n * @param username The username to generate an ID from\n * @returns A Uint8Array containing the encoded user ID\n */\nfunction generateUserId(username) {\n return new TextEncoder().encode(username);\n}\n/**\n * Processes and normalizes challenge values from various input formats.\n * Handles string (base64url), Uint8Array, or generates a new challenge if none provided.\n *\n * @param challenge Optional challenge as string or Uint8Array\n * @returns Normalized Uint8Array challenge ready for WebAuthn API\n * @throws {Error} When provided string challenge is not valid base64url\n */\nfunction processChallenge(challenge) {\n if (!challenge) {\n return generateChallenge();\n }\n if (typeof challenge === 'string') {\n // Assume base64url string, convert to Uint8Array\n return Uint8Array.from(atob(challenge.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0));\n }\n return challenge;\n}\n/**\n * Processes and normalizes user ID values from various input formats.\n * Handles string (base64url), Uint8Array, or generates from username if none provided.\n *\n * @param userId Optional user ID as string or Uint8Array\n * @param username Username to generate ID from if userId not provided\n * @returns Normalized Uint8Array user ID ready for WebAuthn API\n * @throws {Error} When no userId provided and no username available for generation\n * @throws {Error} When provided string userId is not valid base64url\n */\nfunction processUserId(userId, username) {\n if (userId) {\n if (typeof userId === 'string') {\n // Assume base64url string, convert to Uint8Array\n return Uint8Array.from(atob(userId.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0));\n }\n return userId;\n }\n if (username) {\n return generateUserId(username);\n }\n // Fallback to random ID\n return crypto.getRandomValues(new Uint8Array(16));\n}\n/**\n * Processes and normalizes credential descriptors from various input formats.\n * Converts string credential IDs to proper PublicKeyCredentialDescriptor objects.\n *\n * @param credentials Optional array of credential IDs (strings) or full descriptors\n * @returns Array of normalized PublicKeyCredentialDescriptor objects, or undefined if none provided\n * @throws {Error} When a credential ID string is not valid base64url\n */\nfunction processCredentialDescriptors(credentials) {\n if (!credentials || credentials.length === 0) {\n return undefined;\n }\n // If already in descriptor format, return as-is\n if (typeof credentials[0] === 'object' && 'type' in credentials[0]) {\n return credentials;\n }\n // Convert string IDs to descriptors\n return credentials.map((id) => ({\n type: 'public-key',\n id: Uint8Array.from(atob(id.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0)),\n }));\n}\n/**\n * Resolves a preset configuration by name.\n * Returns the complete preset configuration object for the specified preset.\n *\n * @param presetName The name of the preset to resolve\n * @returns The preset configuration object\n * @throws {Error} When the preset name is not found in PRESET_MAP\n *\n * @example\n * ```typescript\n * const preset = resolvePreset('passkey');\n * console.log(preset.authenticatorSelection.userVerification); // 'preferred'\n * ```\n */\nexport function resolvePreset(presetName) {\n const preset = PRESET_MAP[presetName];\n if (!preset) {\n throw new Error(`Unknown preset: ${presetName}`);\n }\n return preset;\n}\n/**\n * Creates base creation options from WebAuthn service configuration.\n * Establishes default timeout and attestation settings that can be overridden later.\n *\n * @param webAuthnConfig The global WebAuthn service configuration\n * @returns Partial creation options with base settings applied\n */\nfunction createBaseCreationOptions(webAuthnConfig) {\n return {\n timeout: webAuthnConfig.defaultTimeout || 60000,\n attestation: webAuthnConfig.defaultAttestation || 'none',\n };\n}\n/**\n * Applies preset configuration to base creation options.\n * Merges preset-specific authenticator selection and public key parameters into the options.\n *\n * @param config The register configuration containing preset information\n * @param baseOptions The base options to apply preset configuration to\n * @param webAuthnConfig The global WebAuthn service configuration\n * @returns Options with preset configuration applied\n */\nfunction applyPresetConfiguration(config, baseOptions, webAuthnConfig) {\n if (config.preset) {\n const preset = resolvePreset(config.preset);\n return deepMerge(baseOptions, {\n authenticatorSelection: preset.authenticatorSelection,\n pubKeyCredParams: [...preset.pubKeyCredParams], // Convert readonly to mutable\n });\n }\n // Apply default authenticator selection from config when no preset\n if (webAuthnConfig.defaultAuthenticatorSelection) {\n return {\n ...baseOptions,\n authenticatorSelection: webAuthnConfig.defaultAuthenticatorSelection,\n };\n }\n return baseOptions;\n}\n/**\n * Applies user-specified overrides to creation options.\n * Allows users to override any preset or default settings with their own values.\n *\n * @param config The register configuration containing user overrides\n * @param options The options to apply user overrides to\n * @returns Options with user overrides applied\n */\nfunction applyUserOverrides(config, options) {\n const result = { ...options };\n if (config.timeout !== undefined) {\n result.timeout = config.timeout;\n }\n if (config.attestation !== undefined) {\n result.attestation = config.attestation;\n }\n if (config.authenticatorSelection !== undefined) {\n result.authenticatorSelection = deepMerge(result.authenticatorSelection || {}, config.authenticatorSelection);\n }\n if (config.pubKeyCredParams !== undefined) {\n result.pubKeyCredParams = config.pubKeyCredParams;\n }\n if (config.extensions !== undefined) {\n result.extensions = config.extensions;\n }\n return result;\n}\n/**\n * Assembles final creation options with all required WebAuthn fields.\n * Processes user information, challenge, and applies final service configuration.\n *\n * @param options The partially built options from previous steps\n * @param config The register configuration containing user and RP information\n * @param webAuthnConfig The global WebAuthn service configuration\n * @returns Complete PublicKeyCredentialCreationOptions ready for WebAuthn API\n */\nfunction assembleFinalCreationOptions(options, config, webAuthnConfig) {\n const challenge = processChallenge(config.challenge);\n const userId = processUserId(config.userId, config.username);\n const relyingParty = config.rp || webAuthnConfig.relyingParty;\n return {\n ...options,\n rp: relyingParty,\n user: {\n id: userId,\n name: config.username,\n displayName: config.displayName || config.username,\n },\n challenge,\n pubKeyCredParams: options.pubKeyCredParams ||\n webAuthnConfig.defaultAlgorithms || [\n { type: 'public-key', alg: -7 }, // ES256\n { type: 'public-key', alg: -257 }, // RS256\n ],\n excludeCredentials: processCredentialDescriptors(config.excludeCredentials),\n };\n}\n/**\n * Builds complete WebAuthn creation options from a high-level register configuration.\n *\n * This function orchestrates the creation option building process by:\n * 1. Creating base options from service configuration\n * 2. Applying preset-specific settings if specified\n * 3. Applying user overrides for customization\n * 4. Assembling final options with all required fields\n *\n * @param config The high-level register configuration with preset support\n * @param webAuthnConfig The global WebAuthn service configuration\n * @returns Complete PublicKeyCredentialCreationOptions ready for navigator.credentials.create()\n *\n * @example\n * ```typescript\n * const config: RegisterConfig = {\n * preset: 'passkey',\n * user: {\n * id: 'user123',\n * name: 'user@example.com',\n * displayName: 'John Doe'\n * },\n * challenge: 'custom-challenge'\n * };\n *\n * const options = buildCreationOptionsFromConfig(config, webAuthnConfig);\n * // Returns complete creation options ready for WebAuthn API\n * ```\n */\nexport function buildCreationOptionsFromConfig(config, webAuthnConfig) {\n const baseOptions = createBaseCreationOptions(webAuthnConfig);\n const presetOptions = applyPresetConfiguration(config, baseOptions, webAuthnConfig);\n const finalOptions = applyUserOverrides(config, presetOptions);\n return assembleFinalCreationOptions(finalOptions, config, webAuthnConfig);\n}\n/**\n * Builds complete WebAuthn request options from a high-level authenticate configuration.\n *\n * Handles preset resolution, user overrides, and proper field processing to create\n * request options suitable for navigator.credentials.get().\n *\n * @param config The high-level authenticate configuration with preset support\n * @param webAuthnConfig The global WebAuthn service configuration\n * @returns Complete PublicKeyCredentialRequestOptions ready for navigator.credentials.get()\n *\n * @example\n * ```typescript\n * const config: AuthenticateConfig = {\n * preset: 'passkey',\n * challenge: 'auth-challenge',\n * allowCredentials: ['cred-id-1', 'cred-id-2']\n * };\n *\n * const options = buildRequestOptionsFromConfig(config, webAuthnConfig);\n * // Returns complete request options ready for WebAuthn API\n * ```\n */\nexport function buildRequestOptionsFromConfig(config, webAuthnConfig) {\n // Start with base configuration from WebAuthnConfig\n const options = {\n timeout: webAuthnConfig.defaultTimeout || 60000,\n userVerification: webAuthnConfig.enforceUserVerification\n ? 'required'\n : 'preferred',\n };\n // Apply preset if specified\n if (config.preset) {\n const preset = resolvePreset(config.preset);\n // Extract relevant parts for authentication (userVerification from authenticatorSelection)\n if (preset.authenticatorSelection?.userVerification) {\n options.userVerification = preset.authenticatorSelection.userVerification;\n }\n }\n // Apply user overrides\n if (config.timeout !== undefined) {\n options.timeout = config.timeout;\n }\n if (config.userVerification !== undefined) {\n options.userVerification = config.userVerification;\n }\n if (config.extensions !== undefined) {\n options.extensions = config.extensions;\n }\n // Handle required fields\n const challenge = processChallenge(config.challenge);\n // Build final options\n const finalOptions = {\n ...options,\n challenge,\n allowCredentials: processCredentialDescriptors(config.allowCredentials),\n };\n return finalOptions;\n}\n/**\n * Validates a register configuration for completeness and correctness.\n * Ensures all required fields are present and properly formatted.\n *\n * @param config The register configuration to validate\n * @throws {Error} When required fields are missing or invalid\n *\n * @example\n * ```typescript\n * try {\n * validateRegisterConfig(config);\n * // Config is valid, proceed with registration\n * } catch (error) {\n * console.error('Invalid register config:', error.message);\n * }\n * ```\n */\nexport function validateRegisterConfig(config) {\n if (!config.username || typeof config.username !== 'string') {\n throw new Error('RegisterConfig must have a valid username');\n }\n if (config.preset && !PRESET_MAP[config.preset]) {\n throw new Error(`Invalid preset: ${config.preset}. Valid presets are: ${Object.keys(PRESET_MAP).join(', ')}`);\n }\n}\n/**\n * Validates an authenticate configuration for completeness and correctness.\n * Ensures all required fields are present and properly formatted.\n *\n * @param config The authenticate configuration to validate\n * @throws {Error} When required fields are missing or invalid\n *\n * @example\n * ```typescript\n * try {\n * validateAuthenticateConfig(config);\n * // Config is valid, proceed with authentication\n * } catch (error) {\n * console.error('Invalid authenticate config:', error.message);\n * }\n * ```\n */\nexport function validateAuthenticateConfig(config) {\n if (config.preset && !PRESET_MAP[config.preset]) {\n throw new Error(`Invalid preset: ${config.preset}. Valid presets are: ${Object.keys(PRESET_MAP).join(', ')}`);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi91dGlscy9wcmVzZXQudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztBQUkxRTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsU0FBUyxDQUNoQixNQUFTLEVBQ1QsR0FBRyxPQUFjO0lBRWpCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUUvQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO29CQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FB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dGlvbnMgZm9yIHJlc29sdmluZyBhbmQgbWVyZ2luZyBXZWJBdXRobiBwcmVzZXRzXG4gKlxuICogVGhlc2UgdXRpbGl0aWVzIGhhbmRsZSB0aGUgbG9naWMgb2YgdGFraW5nIGEgUmVnaXN0ZXJDb25maWcgb3IgQXV0aGVudGljYXRlQ29uZmlnLFxuICogcmVzb2x2aW5nIGFueSBwcmVzZXQsIGFuZCBtZXJnaW5nIGl0IHdpdGggdXNlciBvdmVycmlkZXMgdG8gcHJvZHVjZSBmaW5hbFxuICogV2ViQXV0aG4gb3B0aW9ucyByZWFkeSBmb3IgdGhlIGJyb3dzZXIgQVBJLlxuICovXG5cbmltcG9ydCB7IFBSRVNFVF9NQVAsIHR5cGUgUHJlc2V0TmFtZSB9IGZyb20gJy4uL3ByZXNldHMvd2ViYXV0aG4ucHJlc2V0cyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lzdGVyQ29uZmlnLCBBdXRoZW50aWNhdGVDb25maWcgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQgdHlwZSB7IFdlYkF1dGhuQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWwvc2VydmljZS1jb25maWcnO1xuXG4vKipcbiAqIERlZXAgbWVyZ2UgdXRpbGl0eSB0aGF0IHByb3Blcmx5IGhhbmRsZXMgbmVzdGVkIG9iamVjdHMuXG4gKiBMYXRlciBwcm9wZXJ0aWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcywgd2l0aCByZWN1cnNpdmUgbWVyZ2luZyBmb3IgbmVzdGVkIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBtZXJnZSBpbnRvXG4gKiBAcGFyYW0gc291cmNlcyBTb3VyY2Ugb2JqZWN0cyB0byBtZXJnZSBmcm9tIChwcm9jZXNzZWQgbGVmdCB0byByaWdodClcbiAqIEByZXR1cm5zIFRoZSBtZXJnZWQgdGFyZ2V0IG9iamVjdFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGRlZXBNZXJnZShcbiAqICAgeyBhOiAxLCBiOiB7IHg6IDEgfSB9LFxuICogICB7IGI6IHsgeTogMiB9IH0sXG4gKiAgIHsgYzogMyB9XG4gKiApO1xuICogLy8gUmVzdWx0OiB7IGE6IDEsIGI6IHsgeDogMSwgeTogMiB9LCBjOiAzIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICB0YXJnZXQ6IFQsXG4gIC4uLnNvdXJjZXM6IGFueVtdXG4pOiBUIHtcbiAgaWYgKCFzb3VyY2VzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuXG4gIGlmIChpc09iamVjdCh0YXJnZXQpICYmIGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pO1xuICAgICAgICBkZWVwTWVyZ2UodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYXJyYXksIG51bGwsIG9yIHByaW1pdGl2ZSkuXG4gKlxuICogQHBhcmFtIGl0ZW0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBpdGVtIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20gY2hhbGxlbmdlIGZvciBXZWJBdXRobiBvcGVyYXRpb25zLlxuICogVXNlcyB0aGUgV2ViIENyeXB0byBBUEkgZm9yIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24uXG4gKlxuICogQHJldHVybnMgQSAzMi1ieXRlIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgcmFuZG9tIGNoYWxsZW5nZVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUNoYWxsZW5nZSgpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMzIpKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgdXNlciBJRCBiYXNlZCBvbiB0aGUgdXNlcm5hbWUuXG4gKiBDcmVhdGVzIGEgY29uc2lzdGVudCwgVVJMLXNhZmUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIuXG4gKlxuICogQHBhcmFtIHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBnZW5lcmF0ZSBhbiBJRCBmcm9tXG4gKiBAcmV0dXJucyBBIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgZW5jb2RlZCB1c2VyIElEXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVXNlcklkKHVzZXJuYW1lOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh1c2VybmFtZSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFuZCBub3JtYWxpemVzIGNoYWxsZW5nZSB2YWx1ZXMgZnJvbSB2YXJpb3VzIGlucHV0IGZvcm1hdHMuXG4gKiBIYW5kbGVzIHN0cmluZyAoYmFzZTY0dXJsKSwgVWludDhBcnJheSwgb3IgZ2VuZXJhdGVzIGEgbmV3IGNoYWxsZW5nZSBpZiBub25lIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBjaGFsbGVuZ2UgT3B0aW9uYWwgY2hhbGxlbmdlIGFzIHN0cmluZyBvciBVaW50OEFycmF5XG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIFVpbnQ4QXJyYXkgY2hhbGxlbmdlIHJlYWR5IGZvciBXZWJBdXRobiBBUElcbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHByb3ZpZGVkIHN0cmluZyBjaGFsbGVuZ2UgaXMgbm90IHZhbGlkIGJhc2U2NHVybFxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2hhbGxlbmdlKGNoYWxsZW5nZT86IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKCFjaGFsbGVuZ2UpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVDaGFsbGVuZ2UoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY2hhbGxlbmdlID09PSAnc3RyaW5nJykge1xuICAgIC8vIEFzc3VtZSBiYXNlNjR1cmwgc3RyaW5nLCBjb252ZXJ0IHRvIFVpbnQ4QXJyYXlcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxuICAgICAgYXRvYihjaGFsbGVuZ2UucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKSksXG4gICAgICAoYykgPT4gYy5jaGFyQ29kZUF0KDApXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjaGFsbGVuZ2U7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFuZCBub3JtYWxpemVzIHVzZXIgSUQgdmFsdWVzIGZyb20gdmFyaW91cyBpbnB1dCBmb3JtYXRzLlxuICogSGFuZGxlcyBzdHJpbmcgKGJhc2U2NHVybCksIFVpbnQ4QXJyYXksIG9yIGdlbmVyYXRlcyBmcm9tIHVzZXJuYW1lIGlmIG5vbmUgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHVzZXJJZCBPcHRpb25hbCB1c2VyIElEIGFzIHN0cmluZyBvciBVaW50OEFycmF5XG4gKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgdG8gZ2VuZXJhdGUgSUQgZnJvbSBpZiB1c2VySWQgbm90IHByb3ZpZGVkXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIFVpbnQ4QXJyYXkgdXNlciBJRCByZWFkeSBmb3IgV2ViQXV0aG4gQVBJXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBubyB1c2VySWQgcHJvdmlkZWQgYW5kIG5vIHVzZXJuYW1lIGF2YWlsYWJsZSBmb3IgZ2VuZXJhdGlvblxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gcHJvdmlkZWQgc3RyaW5nIHVzZXJJZCBpcyBub3QgdmFsaWQgYmFzZTY0dXJsXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NVc2VySWQoXG4gIHVzZXJJZD86IHN0cmluZyB8IFVpbnQ4QXJyYXksXG4gIHVzZXJuYW1lPzogc3RyaW5nXG4pOiBVaW50OEFycmF5IHtcbiAgaWYgKHVzZXJJZCkge1xuICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gQXNzdW1lIGJhc2U2NHVybCBzdHJpbmcsIGNvbnZlcnQgdG8gVWludDhBcnJheVxuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgYXRvYih1c2VySWQucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKSksXG4gICAgICAgIChjKSA9PiBjLmNoYXJDb2RlQXQoMClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB1c2VySWQ7XG4gIH1cblxuICBpZiAodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVVc2VySWQodXNlcm5hbWUpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gcmFuZG9tIElEXG4gIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDE2KSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFuZCBub3JtYWxpemVzIGNyZWRlbnRpYWwgZGVzY3JpcHRvcnMgZnJvbSB2YXJpb3VzIGlucHV0IGZvcm1hdHMuXG4gKiBDb252ZXJ0cyBzdHJpbmcgY3JlZGVudGlhbCBJRHMgdG8gcHJvcGVyIFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGNyZWRlbnRpYWxzIE9wdGlvbmFsIGFycmF5IG9mIGNyZWRlbnRpYWwgSURzIChzdHJpbmdzKSBvciBmdWxsIGRlc2NyaXB0b3JzXG4gKiBAcmV0dXJucyBBcnJheSBvZiBub3JtYWxpemVkIFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yIG9iamVjdHMsIG9yIHVuZGVmaW5lZCBpZiBub25lIHByb3ZpZGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBhIGNyZWRlbnRpYWwgSUQgc3RyaW5nIGlzIG5vdCB2YWxpZCBiYXNlNjR1cmxcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NyZWRlbnRpYWxEZXNjcmlwdG9ycyhcbiAgY3JlZGVudGlhbHM/OiBQdWJsaWNLZXlDcmVkZW50aWFsRGVzY3JpcHRvcltdIHwgc3RyaW5nW11cbik6IFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yW10gfCB1bmRlZmluZWQge1xuICBpZiAoIWNyZWRlbnRpYWxzIHx8IGNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBJZiBhbHJlYWR5IGluIGRlc2NyaXB0b3IgZm9ybWF0LCByZXR1cm4gYXMtaXNcbiAgaWYgKHR5cGVvZiBjcmVkZW50aWFsc1swXSA9PT0gJ29iamVjdCcgJiYgJ3R5cGUnIGluIGNyZWRlbnRpYWxzWzBdKSB7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzIGFzIFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yW107XG4gIH1cblxuICAvLyBDb252ZXJ0IHN0cmluZyBJRHMgdG8gZGVzY3JpcHRvcnNcbiAgcmV0dXJuIChjcmVkZW50aWFscyBhcyBzdHJpbmdbXSkubWFwKChpZCkgPT4gKHtcbiAgICB0eXBlOiAncHVibGljLWtleScgYXMgY29uc3QsXG4gICAgaWQ6IFVpbnQ4QXJyYXkuZnJvbShhdG9iKGlkLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLCAoYykgPT5cbiAgICAgIGMuY2hhckNvZGVBdCgwKVxuICAgICksXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHByZXNldCBjb25maWd1cmF0aW9uIGJ5IG5hbWUuXG4gKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBwcmVzZXQgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgcHJlc2V0LlxuICpcbiAqIEBwYXJhbSBwcmVzZXROYW1lIFRoZSBuYW1lIG9mIHRoZSBwcmVzZXQgdG8gcmVzb2x2ZVxuICogQHJldHVybnMgVGhlIHByZXNldCBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gdGhlIHByZXNldCBuYW1lIGlzIG5vdCBmb3VuZCBpbiBQUkVTRVRfTUFQXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHByZXNldCA9IHJlc29sdmVQcmVzZXQoJ3Bhc3NrZXknKTtcbiAqIGNvbnNvbGUubG9nKHByZXNldC5hdXRoZW50aWNhdG9yU2VsZWN0aW9uLnVzZXJWZXJpZmljYXRpb24pOyAvLyAncHJlZmVycmVkJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJlc2V0KHByZXNldE5hbWU6IFByZXNldE5hbWUpIHtcbiAgY29uc3QgcHJlc2V0ID0gUFJFU0VUX01BUFtwcmVzZXROYW1lXTtcbiAgaWYgKCFwcmVzZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJlc2V0OiAke3ByZXNldE5hbWV9YCk7XG4gIH1cbiAgcmV0dXJuIHByZXNldDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGJhc2UgY3JlYXRpb24gb3B0aW9ucyBmcm9tIFdlYkF1dGhuIHNlcnZpY2UgY29uZmlndXJhdGlvbi5cbiAqIEVzdGFibGlzaGVzIGRlZmF1bHQgdGltZW91dCBhbmQgYXR0ZXN0YXRpb24gc2V0dGluZ3MgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBsYXRlci5cbiAqXG4gKiBAcGFyYW0gd2ViQXV0aG5Db25maWcgVGhlIGdsb2JhbCBXZWJBdXRobiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFBhcnRpYWwgY3JlYXRpb24gb3B0aW9ucyB3aXRoIGJhc2Ugc2V0dGluZ3MgYXBwbGllZFxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlQ3JlYXRpb25PcHRpb25zKFxuICB3ZWJBdXRobkNvbmZpZzogV2ViQXV0aG5Db25maWdcbik6IFBhcnRpYWw8UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucz4ge1xuICByZXR1cm4ge1xuICAgIHRpbWVvdXQ6IHdlYkF1dGhuQ29uZmlnLmRlZmF1bHRUaW1lb3V0IHx8IDYwMDAwLFxuICAgIGF0dGVzdGF0aW9uOiB3ZWJBdXRobkNvbmZpZy5kZWZhdWx0QXR0ZXN0YXRpb24gfHwgJ25vbmUnLFxuICB9O1xufVxuXG4vKipcbiAqIEFwcGxpZXMgcHJlc2V0IGNvbmZpZ3VyYXRpb24gdG8gYmFzZSBjcmVhdGlvbiBvcHRpb25zLlxuICogTWVyZ2VzIHByZXNldC1zcGVjaWZpYyBhdXRoZW50aWNhdG9yIHNlbGVjdGlvbiBhbmQgcHVibGljIGtleSBwYXJhbWV0ZXJzIGludG8gdGhlIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIGNvbmZpZyBUaGUgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBjb250YWluaW5nIHByZXNldCBpbmZvcm1hdGlvblxuICogQHBhcmFtIGJhc2VPcHRpb25zIFRoZSBiYXNlIG9wdGlvbnMgdG8gYXBwbHkgcHJlc2V0IGNvbmZpZ3VyYXRpb24gdG9cbiAqIEBwYXJhbSB3ZWJBdXRobkNvbmZpZyBUaGUgZ2xvYmFsIFdlYkF1dGhuIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgT3B0aW9ucyB3aXRoIHByZXNldCBjb25maWd1cmF0aW9uIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYXBwbHlQcmVzZXRDb25maWd1cmF0aW9uKFxuICBjb25maWc6IFJlZ2lzdGVyQ29uZmlnLFxuICBiYXNlT3B0aW9uczogUGFydGlhbDxQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zPixcbiAgd2ViQXV0aG5Db25maWc6IFdlYkF1dGhuQ29uZmlnXG4pOiBQYXJ0aWFsPFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnM+IHtcbiAgaWYgKGNvbmZpZy5wcmVzZXQpIHtcbiAgICBjb25zdCBwcmVzZXQgPSByZXNvbHZlUHJlc2V0KGNvbmZpZy5wcmVzZXQpO1xuICAgIHJldHVybiBkZWVwTWVyZ2UoYmFzZU9wdGlvbnMsIHtcbiAgICAgIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHByZXNldC5hdXRoZW50aWNhdG9yU2VsZWN0aW9uLFxuICAgICAgcHViS2V5Q3JlZFBhcmFtczogWy4uLnByZXNldC5wdWJLZXlDcmVkUGFyYW1zXSwgLy8gQ29udmVydCByZWFkb25seSB0byBtdXRhYmxlXG4gICAgfSk7XG4gIH1cblxuICAvLyBBcHBseSBkZWZhdWx0IGF1dGhlbnRpY2F0b3Igc2VsZWN0aW9uIGZyb20gY29uZmlnIHdoZW4gbm8gcHJlc2V0XG4gIGlmICh3ZWJBdXRobkNvbmZpZy5kZWZhdWx0QXV0aGVudGljYXRvclNlbGVjdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlT3B0aW9ucyxcbiAgICAgIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHdlYkF1dGhuQ29uZmlnLmRlZmF1bHRBdXRoZW50aWNhdG9yU2VsZWN0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gYmFzZU9wdGlvbnM7XG59XG5cbi8qKlxuICogQXBwbGllcyB1c2VyLXNwZWNpZmllZCBvdmVycmlkZXMgdG8gY3JlYXRpb24gb3B0aW9ucy5cbiAqIEFsbG93cyB1c2VycyB0byBvdmVycmlkZSBhbnkgcHJlc2V0IG9yIGRlZmF1bHQgc2V0dGluZ3Mgd2l0aCB0aGVpciBvd24gdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gY29udGFpbmluZyB1c2VyIG92ZXJyaWRlc1xuICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYXBwbHkgdXNlciBvdmVycmlkZXMgdG9cbiAqIEByZXR1cm5zIE9wdGlvbnMgd2l0aCB1c2VyIG92ZXJyaWRlcyBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VXNlck92ZXJyaWRlcyhcbiAgY29uZmlnOiBSZWdpc3RlckNvbmZpZyxcbiAgb3B0aW9uczogUGFydGlhbDxQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zPlxuKTogUGFydGlhbDxQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zPiB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4ub3B0aW9ucyB9O1xuXG4gIGlmIChjb25maWcudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcbiAgfVxuXG4gIGlmIChjb25maWcuYXR0ZXN0YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHJlc3VsdC5hdHRlc3RhdGlvbiA9IGNvbmZpZy5hdHRlc3RhdGlvbjtcbiAgfVxuXG4gIGlmIChjb25maWcuYXV0aGVudGljYXRvclNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24gPSBkZWVwTWVyZ2UoXG4gICAgICByZXN1bHQuYXV0aGVudGljYXRvclNlbGVjdGlvbiB8fCB7fSxcbiAgICAgIGNvbmZpZy5hdXRoZW50aWNhdG9yU2VsZWN0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGlmIChjb25maWcucHViS2V5Q3JlZFBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0LnB1YktleUNyZWRQYXJhbXMgPSBjb25maWcucHViS2V5Q3JlZFBhcmFtcztcbiAgfVxuXG4gIGlmIChjb25maWcuZXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0LmV4dGVuc2lvbnMgPSBjb25maWcuZXh0ZW5zaW9ucztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXNzZW1ibGVzIGZpbmFsIGNyZWF0aW9uIG9wdGlvbnMgd2l0aCBhbGwgcmVxdWlyZWQgV2ViQXV0aG4gZmllbGRzLlxuICogUHJvY2Vzc2VzIHVzZXIgaW5mb3JtYXRpb24sIGNoYWxsZW5nZSwgYW5kIGFwcGxpZXMgZmluYWwgc2VydmljZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBwYXJ0aWFsbHkgYnVpbHQgb3B0aW9ucyBmcm9tIHByZXZpb3VzIHN0ZXBzXG4gKiBAcGFyYW0gY29uZmlnIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIGNvbnRhaW5pbmcgdXNlciBhbmQgUlAgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB3ZWJBdXRobkNvbmZpZyBUaGUgZ2xvYmFsIFdlYkF1dGhuIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ29tcGxldGUgUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyByZWFkeSBmb3IgV2ViQXV0aG4gQVBJXG4gKi9cbmZ1bmN0aW9uIGFzc2VtYmxlRmluYWxDcmVhdGlvbk9wdGlvbnMoXG4gIG9wdGlvbnM6IFBhcnRpYWw8UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucz4sXG4gIGNvbmZpZzogUmVnaXN0ZXJDb25maWcsXG4gIHdlYkF1dGhuQ29uZmlnOiBXZWJBdXRobkNvbmZpZ1xuKTogUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyB7XG4gIGNvbnN0IGNoYWxsZW5nZSA9IHByb2Nlc3NDaGFsbGVuZ2UoY29uZmlnLmNoYWxsZW5nZSk7XG4gIGNvbnN0IHVzZXJJZCA9IHByb2Nlc3NVc2VySWQoY29uZmlnLnVzZXJJZCwgY29uZmlnLnVzZXJuYW1lKTtcbiAgY29uc3QgcmVseWluZ1BhcnR5ID0gY29uZmlnLnJwIHx8IHdlYkF1dGhuQ29uZmlnLnJlbHlpbmdQYXJ0eTtcblxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcnA6IHJlbHlpbmdQYXJ0eSxcbiAgICB1c2VyOiB7XG4gICAgICBpZDogdXNlcklkLFxuICAgICAgbmFtZTogY29uZmlnLnVzZXJuYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IGNvbmZpZy5kaXNwbGF5TmFtZSB8fCBjb25maWcudXNlcm5hbWUsXG4gICAgfSxcbiAgICBjaGFsbGVuZ2UsXG4gICAgcHViS2V5Q3JlZFBhcmFtczogb3B0aW9ucy5wdWJLZXlDcmVkUGFyYW1zIHx8XG4gICAgICB3ZWJBdXRobkNvbmZpZy5kZWZhdWx0QWxnb3JpdGhtcyB8fCBbXG4gICAgICAgIHsgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC03IH0sIC8vIEVTMjU2XG4gICAgICAgIHsgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC0yNTcgfSwgLy8gUlMyNTZcbiAgICAgIF0sXG4gICAgZXhjbHVkZUNyZWRlbnRpYWxzOiBwcm9jZXNzQ3JlZGVudGlhbERlc2NyaXB0b3JzKGNvbmZpZy5leGNsdWRlQ3JlZGVudGlhbHMpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBjb21wbGV0ZSBXZWJBdXRobiBjcmVhdGlvbiBvcHRpb25zIGZyb20gYSBoaWdoLWxldmVsIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBvcmNoZXN0cmF0ZXMgdGhlIGNyZWF0aW9uIG9wdGlvbiBidWlsZGluZyBwcm9jZXNzIGJ5OlxuICogMS4gQ3JlYXRpbmcgYmFzZSBvcHRpb25zIGZyb20gc2VydmljZSBjb25maWd1cmF0aW9uXG4gKiAyLiBBcHBseWluZyBwcmVzZXQtc3BlY2lmaWMgc2V0dGluZ3MgaWYgc3BlY2lmaWVkXG4gKiAzLiBBcHBseWluZyB1c2VyIG92ZXJyaWRlcyBmb3IgY3VzdG9taXphdGlvblxuICogNC4gQXNzZW1ibGluZyBmaW5hbCBvcHRpb25zIHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkc1xuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGhpZ2gtbGV2ZWwgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiB3aXRoIHByZXNldCBzdXBwb3J0XG4gKiBAcGFyYW0gd2ViQXV0aG5Db25maWcgVGhlIGdsb2JhbCBXZWJBdXRobiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBsZXRlIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IFJlZ2lzdGVyQ29uZmlnID0ge1xuICogICBwcmVzZXQ6ICdwYXNza2V5JyxcbiAqICAgdXNlcjoge1xuICogICAgIGlkOiAndXNlcjEyMycsXG4gKiAgICAgbmFtZTogJ3VzZXJAZXhhbXBsZS5jb20nLFxuICogICAgIGRpc3BsYXlOYW1lOiAnSm9obiBEb2UnXG4gKiAgIH0sXG4gKiAgIGNoYWxsZW5nZTogJ2N1c3RvbS1jaGFsbGVuZ2UnXG4gKiB9O1xuICpcbiAqIGNvbnN0IG9wdGlvbnMgPSBidWlsZENyZWF0aW9uT3B0aW9uc0Zyb21Db25maWcoY29uZmlnLCB3ZWJBdXRobkNvbmZpZyk7XG4gKiAvLyBSZXR1cm5zIGNvbXBsZXRlIGNyZWF0aW9uIG9wdGlvbnMgcmVhZHkgZm9yIFdlYkF1dGhuIEFQSVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENyZWF0aW9uT3B0aW9uc0Zyb21Db25maWcoXG4gIGNvbmZpZzogUmVnaXN0ZXJDb25maWcsXG4gIHdlYkF1dGhuQ29uZmlnOiBXZWJBdXRobkNvbmZpZ1xuKTogUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyB7XG4gIGNvbnN0IGJhc2VPcHRpb25zID0gY3JlYXRlQmFzZUNyZWF0aW9uT3B0aW9ucyh3ZWJBdXRobkNvbmZpZyk7XG4gIGNvbnN0IHByZXNldE9wdGlvbnMgPSBhcHBseVByZXNldENvbmZpZ3VyYXRpb24oXG4gICAgY29uZmlnLFxuICAgIGJhc2VPcHRpb25zLFxuICAgIHdlYkF1dGhuQ29uZmlnXG4gICk7XG4gIGNvbnN0IGZpbmFsT3B0aW9ucyA9IGFwcGx5VXNlck92ZXJyaWRlcyhjb25maWcsIHByZXNldE9wdGlvbnMpO1xuICByZXR1cm4gYXNzZW1ibGVGaW5hbENyZWF0aW9uT3B0aW9ucyhmaW5hbE9wdGlvbnMsIGNvbmZpZywgd2ViQXV0aG5Db25maWcpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBjb21wbGV0ZSBXZWJBdXRobiByZXF1ZXN0IG9wdGlvbnMgZnJvbSBhIGhpZ2gtbGV2ZWwgYXV0aGVudGljYXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogSGFuZGxlcyBwcmVzZXQgcmVzb2x1dGlvbiwgdXNlciBvdmVycmlkZXMsIGFuZCBwcm9wZXIgZmllbGQgcHJvY2Vzc2luZyB0byBjcmVhdGVcbiAqIHJlcXVlc3Qgb3B0aW9ucyBzdWl0YWJsZSBmb3IgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGhpZ2gtbGV2ZWwgYXV0aGVudGljYXRlIGNvbmZpZ3VyYXRpb24gd2l0aCBwcmVzZXQgc3VwcG9ydFxuICogQHBhcmFtIHdlYkF1dGhuQ29uZmlnIFRoZSBnbG9iYWwgV2ViQXV0aG4gc2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDb21wbGV0ZSBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IEF1dGhlbnRpY2F0ZUNvbmZpZyA9IHtcbiAqICAgcHJlc2V0OiAncGFzc2tleScsXG4gKiAgIGNoYWxsZW5nZTogJ2F1dGgtY2hhbGxlbmdlJyxcbiAqICAgYWxsb3dDcmVkZW50aWFsczogWydjcmVkLWlkLTEnLCAnY3JlZC1pZC0yJ11cbiAqIH07XG4gKlxuICogY29uc3Qgb3B0aW9ucyA9IGJ1aWxkUmVxdWVzdE9wdGlvbnNGcm9tQ29uZmlnKGNvbmZpZywgd2ViQXV0aG5Db25maWcpO1xuICogLy8gUmV0dXJucyBjb21wbGV0ZSByZXF1ZXN0IG9wdGlvbnMgcmVhZHkgZm9yIFdlYkF1dGhuIEFQSVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlcXVlc3RPcHRpb25zRnJvbUNvbmZpZyhcbiAgY29uZmlnOiBBdXRoZW50aWNhdGVDb25maWcsXG4gIHdlYkF1dGhuQ29uZmlnOiBXZWJBdXRobkNvbmZpZ1xuKTogUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIHtcbiAgLy8gU3RhcnQgd2l0aCBiYXNlIGNvbmZpZ3VyYXRpb24gZnJvbSBXZWJBdXRobkNvbmZpZ1xuICBjb25zdCBvcHRpb25zOiBQYXJ0aWFsPFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucz4gPSB7XG4gICAgdGltZW91dDogd2ViQXV0aG5Db25maWcuZGVmYXVsdFRpbWVvdXQgfHwgNjAwMDAsXG4gICAgdXNlclZlcmlmaWNhdGlvbjogd2ViQXV0aG5Db25maWcuZW5mb3JjZVVzZXJWZXJpZmljYXRpb25cbiAgICAgID8gJ3JlcXVpcmVkJ1xuICAgICAgOiAncHJlZmVycmVkJyxcbiAgfTtcblxuICAvLyBBcHBseSBwcmVzZXQgaWYgc3BlY2lmaWVkXG4gIGlmIChjb25maWcucHJlc2V0KSB7XG4gICAgY29uc3QgcHJlc2V0ID0gcmVzb2x2ZVByZXNldChjb25maWcucHJlc2V0KTtcbiAgICAvLyBFeHRyYWN0IHJlbGV2YW50IHBhcnRzIGZvciBhdXRoZW50aWNhdGlvbiAodXNlclZlcmlmaWNhdGlvbiBmcm9tIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pXG4gICAgaWYgKHByZXNldC5hdXRoZW50aWNhdG9yU2VsZWN0aW9uPy51c2VyVmVyaWZpY2F0aW9uKSB7XG4gICAgICBvcHRpb25zLnVzZXJWZXJpZmljYXRpb24gPSBwcmVzZXQuYXV0aGVudGljYXRvclNlbGVjdGlvbi51c2VyVmVyaWZpY2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGx5IHVzZXIgb3ZlcnJpZGVzXG4gIGlmIChjb25maWcudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucy50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG4gIH1cblxuICBpZiAoY29uZmlnLnVzZXJWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMudXNlclZlcmlmaWNhdGlvbiA9IGNvbmZpZy51c2VyVmVyaWZpY2F0aW9uO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5leHRlbnNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBvcHRpb25zLmV4dGVuc2lvbnMgPSBjb25maWcuZXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8vIEhhbmRsZSByZXF1aXJlZCBmaWVsZHNcbiAgY29uc3QgY2hhbGxlbmdlID0gcHJvY2Vzc0NoYWxsZW5nZShjb25maWcuY2hhbGxlbmdlKTtcblxuICAvLyBCdWlsZCBmaW5hbCBvcHRpb25zXG4gIGNvbnN0IGZpbmFsT3B0aW9uczogUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY2hhbGxlbmdlLFxuICAgIGFsbG93Q3JlZGVudGlhbHM6IHByb2Nlc3NDcmVkZW50aWFsRGVzY3JpcHRvcnMoY29uZmlnLmFsbG93Q3JlZGVudGlhbHMpLFxuICB9O1xuXG4gIHJldHVybiBmaW5hbE9wdGlvbnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBmb3IgY29tcGxldGVuZXNzIGFuZCBjb3JyZWN0bmVzcy5cbiAqIEVuc3VyZXMgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCBhbmQgcHJvcGVybHkgZm9ybWF0dGVkLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZyBvciBpbnZhbGlkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIHZhbGlkYXRlUmVnaXN0ZXJDb25maWcoY29uZmlnKTtcbiAqICAgLy8gQ29uZmlnIGlzIHZhbGlkLCBwcm9jZWVkIHdpdGggcmVnaXN0cmF0aW9uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHJlZ2lzdGVyIGNvbmZpZzonLCBlcnJvci5tZXNzYWdlKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZWdpc3RlckNvbmZpZyhjb25maWc6IFJlZ2lzdGVyQ29uZmlnKTogdm9pZCB7XG4gIGlmICghY29uZmlnLnVzZXJuYW1lIHx8IHR5cGVvZiBjb25maWcudXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWdpc3RlckNvbmZpZyBtdXN0IGhhdmUgYSB2YWxpZCB1c2VybmFtZScpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5wcmVzZXQgJiYgIVBSRVNFVF9NQVBbY29uZmlnLnByZXNldF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBwcmVzZXQ6ICR7Y29uZmlnLnByZXNldH0uIFZhbGlkIHByZXNldHMgYXJlOiAke09iamVjdC5rZXlzKFxuICAgICAgICBQUkVTRVRfTUFQXG4gICAgICApLmpvaW4oJywgJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gYXV0aGVudGljYXRlIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsZXRlbmVzcyBhbmQgY29ycmVjdG5lc3MuXG4gKiBFbnN1cmVzIGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQgYW5kIHByb3Blcmx5IGZvcm1hdHRlZC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIFRoZSBhdXRoZW50aWNhdGUgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nIG9yIGludmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgdmFsaWRhdGVBdXRoZW50aWNhdGVDb25maWcoY29uZmlnKTtcbiAqICAgLy8gQ29uZmlnIGlzIHZhbGlkLCBwcm9jZWVkIHdpdGggYXV0aGVudGljYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgYXV0aGVudGljYXRlIGNvbmZpZzonLCBlcnJvci5tZXNzYWdlKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBdXRoZW50aWNhdGVDb25maWcoY29uZmlnOiBBdXRoZW50aWNhdGVDb25maWcpOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5wcmVzZXQgJiYgIVBSRVNFVF9NQVBbY29uZmlnLnByZXNldF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBwcmVzZXQ6ICR7Y29uZmlnLnByZXNldH0uIFZhbGlkIHByZXNldHMgYXJlOiAke09iamVjdC5rZXlzKFxuICAgICAgICBQUkVTRVRfTUFQXG4gICAgICApLmpvaW4oJywgJyl9YFxuICAgICk7XG4gIH1cbn1cbiJdfQ==","/**\n * Enhanced WebAuthn Error Classes\n * Provides specific, actionable error types for better developer experience\n */\n/**\n * Enumeration of WebAuthn error types for categorizing different failure scenarios.\n * Provides semantic error classification for better error handling and user experience.\n */\nexport var WebAuthnErrorType;\n(function (WebAuthnErrorType) {\n WebAuthnErrorType[\"NOT_SUPPORTED\"] = \"NOT_SUPPORTED\";\n WebAuthnErrorType[\"USER_CANCELLED\"] = \"USER_CANCELLED\";\n WebAuthnErrorType[\"AUTHENTICATOR_ERROR\"] = \"AUTHENTICATOR_ERROR\";\n WebAuthnErrorType[\"INVALID_OPTIONS\"] = \"INVALID_OPTIONS\";\n WebAuthnErrorType[\"UNSUPPORTED_OPERATION\"] = \"UNSUPPORTED_OPERATION\";\n WebAuthnErrorType[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n WebAuthnErrorType[\"SECURITY_ERROR\"] = \"SECURITY_ERROR\";\n WebAuthnErrorType[\"TIMEOUT_ERROR\"] = \"TIMEOUT_ERROR\";\n WebAuthnErrorType[\"REMOTE_ENDPOINT_ERROR\"] = \"REMOTE_ENDPOINT_ERROR\";\n WebAuthnErrorType[\"INVALID_REMOTE_OPTIONS\"] = \"INVALID_REMOTE_OPTIONS\";\n WebAuthnErrorType[\"UNKNOWN\"] = \"UNKNOWN\";\n})(WebAuthnErrorType || (WebAuthnErrorType = {}));\n/**\n * Base WebAuthn error class that provides enhanced error information.\n * All WebAuthn-specific errors extend from this class for consistent error handling.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.register(config);\n * } catch (error) {\n * if (error instanceof WebAuthnError) {\n * console.log('Error type:', error.type);\n * console.log('Original error:', error.originalError);\n * }\n * }\n * ```\n */\nexport class WebAuthnError extends Error {\n type;\n originalError;\n /**\n * Creates a new WebAuthnError instance.\n *\n * @param type The semantic error type\n * @param message Human-readable error message\n * @param originalError The original error that caused this WebAuthn error (optional)\n */\n constructor(type, message, originalError) {\n super(message);\n this.type = type;\n this.originalError = originalError;\n this.name = 'WebAuthnError';\n }\n /**\n * Factory method to create WebAuthnError from DOMException.\n * Maps browser DOMException types to semantic WebAuthn error types.\n *\n * @param error The DOMException thrown by WebAuthn API\n * @returns Appropriate WebAuthnError subclass based on the DOMException type\n */\n static fromDOMException(error) {\n const type = WebAuthnError.mapDOMExceptionToType(error.name);\n return new WebAuthnError(type, error.message, error);\n }\n /**\n * Maps DOMException names to WebAuthn error types.\n * Provides semantic classification of browser-level errors.\n *\n * @param name The DOMException name\n * @returns Corresponding WebAuthnErrorType\n * @private\n */\n static mapDOMExceptionToType(name) {\n switch (name) {\n case 'NotSupportedError':\n return WebAuthnErrorType.NOT_SUPPORTED;\n case 'NotAllowedError':\n return WebAuthnErrorType.USER_CANCELLED;\n case 'InvalidStateError':\n return WebAuthnErrorType.AUTHENTICATOR_ERROR;\n case 'SecurityError':\n return WebAuthnErrorType.SECURITY_ERROR;\n case 'TimeoutError':\n return WebAuthnErrorType.TIMEOUT_ERROR;\n case 'NetworkError':\n return WebAuthnErrorType.NETWORK_ERROR;\n case 'EncodingError':\n return WebAuthnErrorType.INVALID_OPTIONS;\n default:\n return WebAuthnErrorType.UNKNOWN;\n }\n }\n}\n/**\n * Error thrown when the user cancels a WebAuthn operation.\n * This is the most common error and typically requires no action from the developer.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.register(config);\n * } catch (error) {\n * if (error instanceof UserCancelledError) {\n * // User chose not to proceed - this is normal behavior\n * console.log('User cancelled the operation');\n * }\n * }\n * ```\n */\nexport class UserCancelledError extends WebAuthnError {\n /**\n * Creates a new UserCancelledError.\n *\n * @param originalError The original DOMException that triggered this error (optional)\n */\n constructor(originalError) {\n super(WebAuthnErrorType.USER_CANCELLED, 'User cancelled the WebAuthn operation', originalError);\n this.name = 'UserCancelledError';\n }\n}\n/**\n * Error thrown when there's an issue with the authenticator device.\n * This could indicate hardware problems, invalid state, or other device-specific issues.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.authenticate(config);\n * } catch (error) {\n * if (error instanceof AuthenticatorError) {\n * // Show user-friendly message about trying again or using different authenticator\n * console.log('Authenticator issue:', error.message);\n * }\n * }\n * ```\n */\nexport class AuthenticatorError extends WebAuthnError {\n /**\n * Creates a new AuthenticatorError.\n *\n * @param message Descriptive error message\n * @param originalError The original error that caused this authenticator error (optional)\n */\n constructor(message, originalError) {\n super(WebAuthnErrorType.AUTHENTICATOR_ERROR, `Authenticator error: ${message}`, originalError);\n this.name = 'AuthenticatorError';\n }\n}\n/**\n * Error thrown when the provided WebAuthn options are invalid or malformed.\n * This typically indicates a programming error in option construction.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.register(invalidConfig);\n * } catch (error) {\n * if (error instanceof InvalidOptionsError) {\n * // Check your configuration and options\n * console.error('Invalid options provided:', error.message);\n * }\n * }\n * ```\n */\nexport class InvalidOptionsError extends WebAuthnError {\n /**\n * Creates a new InvalidOptionsError.\n *\n * @param message Descriptive error message explaining what's invalid\n * @param originalError The original error that revealed the invalid options (optional)\n */\n constructor(message, originalError) {\n super(WebAuthnErrorType.INVALID_OPTIONS, `Invalid options: ${message}`, originalError);\n this.name = 'InvalidOptionsError';\n }\n}\n/**\n * Error thrown when a WebAuthn operation is not supported in the current environment.\n * This could be due to browser limitations or missing hardware capabilities.\n *\n * @example\n * ```typescript\n * if (!webAuthnService.isSupported()) {\n * // Handle unsupported environment\n * }\n *\n * try {\n * await webAuthnService.register(config);\n * } catch (error) {\n * if (error instanceof UnsupportedOperationError) {\n * // Show fallback authentication method\n * console.log('WebAuthn not supported, using fallback');\n * }\n * }\n * ```\n */\nexport class UnsupportedOperationError extends WebAuthnError {\n /**\n * Creates a new UnsupportedOperationError.\n *\n * @param message Descriptive error message explaining what's not supported\n * @param originalError The original error that indicated lack of support (optional)\n */\n constructor(message, originalError) {\n super(WebAuthnErrorType.UNSUPPORTED_OPERATION, `Unsupported operation: ${message}`, originalError);\n this.name = 'UnsupportedOperationError';\n }\n}\n/**\n * Error thrown when there's a network-related issue during WebAuthn operations.\n * This is rare but can occur in certain network conditions.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.authenticate(config);\n * } catch (error) {\n * if (error instanceof NetworkError) {\n * // Suggest user check connection and retry\n * console.log('Network issue during authentication:', error.message);\n * }\n * }\n * ```\n */\nexport class NetworkError extends WebAuthnError {\n /**\n * Creates a new NetworkError.\n *\n * @param message Descriptive error message about the network issue\n * @param originalError The original network-related error (optional)\n */\n constructor(message, originalError) {\n super(WebAuthnErrorType.NETWORK_ERROR, `Network error: ${message}`, originalError);\n this.name = 'NetworkError';\n }\n}\n/**\n * Error thrown when a security violation occurs during WebAuthn operations.\n * This typically indicates issues with origin validation or other security checks.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.register(config);\n * } catch (error) {\n * if (error instanceof SecurityError) {\n * // Security issue - check origin, HTTPS, etc.\n * console.error('Security violation:', error.message);\n * }\n * }\n * ```\n */\nexport class SecurityError extends WebAuthnError {\n /**\n * Creates a new SecurityError.\n *\n * @param message Descriptive error message about the security issue\n * @param originalError The original security-related error (optional)\n */\n constructor(message, originalError) {\n super(WebAuthnErrorType.SECURITY_ERROR, `Security error: ${message}`, originalError);\n this.name = 'SecurityError';\n }\n}\n/**\n * Error thrown when a WebAuthn operation times out.\n * This can happen when the user takes too long to interact with their authenticator.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.register(config);\n * } catch (error) {\n * if (error instanceof TimeoutError) {\n * // Suggest user try again and respond more quickly\n * console.log('Operation timed out - please try again');\n * }\n * }\n * ```\n */\nexport class TimeoutError extends WebAuthnError {\n /**\n * Creates a new TimeoutError.\n *\n * @param message Descriptive error message about the timeout\n * @param originalError The original timeout-related error (optional)\n */\n constructor(message, originalError) {\n super(WebAuthnErrorType.TIMEOUT_ERROR, `Timeout error: ${message}`, originalError);\n this.name = 'TimeoutError';\n }\n}\n/**\n * Error thrown when remote endpoint request fails.\n * Includes network errors, HTTP errors, and timeout errors.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.registerRemote(request);\n * } catch (error) {\n * if (error instanceof RemoteEndpointError) {\n * console.log('Endpoint:', error.context.url);\n * console.log('Status:', error.context.status);\n * }\n * }\n * ```\n */\nexport class RemoteEndpointError extends WebAuthnError {\n context;\n /**\n * Creates a new RemoteEndpointError.\n *\n * @param message Descriptive error message about the remote endpoint failure\n * @param context Contextual information about the failed request\n * @param originalError The original error that caused this remote endpoint error (optional)\n */\n constructor(message, context, originalError) {\n super(WebAuthnErrorType.REMOTE_ENDPOINT_ERROR, `Remote endpoint error: ${message}`, originalError);\n this.context = context;\n this.name = 'RemoteEndpointError';\n }\n}\n/**\n * Error thrown when remote server returns invalid WebAuthn options.\n * This indicates the server response doesn't match expected WebAuthn option format.\n *\n * @example\n * ```typescript\n * try {\n * await webAuthnService.registerRemote(request);\n * } catch (error) {\n * if (error instanceof InvalidRemoteOptionsError) {\n * console.log('Invalid server response:', error.message);\n * }\n * }\n * ```\n */\nexport class InvalidRemoteOptionsError extends WebAuthnError {\n /**\n * Creates a new InvalidRemoteOptionsError.\n *\n * @param message Descriptive error message about the invalid remote options\n * @param originalError The original error that revealed the invalid options (optional)\n */\n constructor(message, originalError) {\n super(WebAuthnErrorType.INVALID_REMOTE_OPTIONS, `Invalid remote options: ${message}`, originalError);\n this.name = 'InvalidRemoteOptionsError';\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4uZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi9lcnJvcnMvd2ViYXV0aG4uZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBTixJQUFZLGlCQVlYO0FBWkQsV0FBWSxpQkFBaUI7SUFDM0Isb0RBQStCLENBQUE7SUFDL0Isc0RBQWlDLENBQUE7SUFDakMsZ0VBQTJDLENBQUE7SUFDM0Msd0RBQW1DLENBQUE7SUFDbkMsb0VBQStDLENBQUE7SUFDL0Msb0RBQStCLENBQUE7SUFDL0Isc0RBQWlDLENBQUE7SUFDakMsb0RBQStCLENBQUE7SUFDL0Isb0VBQStDLENBQUE7SUFDL0Msc0VBQWlELENBQUE7SUFDakQsd0NBQW1CLENBQUE7QUFDckIsQ0FBQyxFQVpXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFZNUI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLEtBQUs7SUFTcEI7SUFFQTtJQVZsQjs7Ozs7O09BTUc7SUFDSCxZQUNrQixJQUF1QixFQUN2QyxPQUFlLEVBQ0MsYUFBcUI7UUFFckMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSkMsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFFdkIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFHckMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFtQjtRQUN6QyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxD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ZCxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxhQUFhO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFBWSxPQUFlLEVBQUUsYUFBcUI7UUFDaEQsS0FBSyxDQUNILGlCQUFpQixDQUFDLGFBQWEsRUFDL0Isa0JBQWtCLE9BQU8sRUFBRSxFQUMzQixhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQWNEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxhQUFhO0lBVWxDO0lBVGxCOzs7Ozs7T0FNRztJQUNILFlBQ0UsT0FBZSxFQUNDLE9BQTJCLEVBQzNDLGFBQXFCO1FBRXJCLEtBQUssQ0FDSCxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFDdkMsMEJBQTBCLE9BQU8sRUFBRSxFQUNuQyxhQUFhLENBQ2QsQ0FBQztRQVBjLFlBQU8sR0FBUCxPQUFPLENBQW9CO1FBUTNDLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsYUFBYTtJQUMxRDs7Ozs7T0FLRztJQUNILFlBQVksT0FBZSxFQUFFLGFBQXFCO1FBQ2hELEtBQUssQ0FDSCxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFDeEMsMkJBQTJCLE9BQU8sRUFBRSxFQUNwQyxhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUM7SUFDMUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbmhhbmNlZCBXZWJBdXRobiBFcnJvciBDbGFzc2VzXG4gKiBQcm92aWRlcyBzcGVjaWZpYywgYWN0aW9uYWJsZSBlcnJvciB0eXBlcyBmb3IgYmV0dGVyIGRldmVsb3BlciBleHBlcmllbmNlXG4gKi9cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBXZWJBdXRobiBlcnJvciB0eXBlcyBmb3IgY2F0ZWdvcml6aW5nIGRpZmZlcmVudCBmYWlsdXJlIHNjZW5hcmlvcy5cbiAqIFByb3ZpZGVzIHNlbWFudGljIGVycm9yIGNsYXNzaWZpY2F0aW9uIGZvciBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgYW5kIHVzZXIgZXhwZXJpZW5jZS5cbiAqL1xuZXhwb3J0IGVudW0gV2ViQXV0aG5FcnJvclR5cGUge1xuICBOT1RfU1VQUE9SVEVEID0gJ05PVF9TVVBQT1JURUQnLFxuICBVU0VSX0NBTkNFTExFRCA9ICdVU0VSX0NBTkNFTExFRCcsXG4gIEFVVEhFTlRJQ0FUT1JfRVJST1IgPSAnQVVUSEVOVElDQVRPUl9FUlJPUicsXG4gIElOVkFMSURfT1BUSU9OUyA9ICdJTlZBTElEX09QVElPTlMnLFxuICBVTlNVUFBPUlRFRF9PUEVSQVRJT04gPSAnVU5TVVBQT1JURURfT1BFUkFUSU9OJyxcbiAgTkVUV09SS19FUlJPUiA9ICdORVRXT1JLX0VSUk9SJyxcbiAgU0VDVVJJVFlfRVJST1IgPSAnU0VDVVJJVFlfRVJST1InLFxuICBUSU1FT1VUX0VSUk9SID0gJ1RJTUVPVVRfRVJST1InLFxuICBSRU1PVEVfRU5EUE9JTlRfRVJST1IgPSAnUkVNT1RFX0VORFBPSU5UX0VSUk9SJyxcbiAgSU5WQUxJRF9SRU1PVEVfT1BUSU9OUyA9ICdJTlZBTElEX1JFTU9URV9PUFRJT05TJyxcbiAgVU5LTk9XTiA9ICdVTktOT1dOJyxcbn1cblxuLyoqXG4gKiBCYXNlIFdlYkF1dGhuIGVycm9yIGNsYXNzIHRoYXQgcHJvdmlkZXMgZW5oYW5jZWQgZXJyb3IgaW5mb3JtYXRpb24uXG4gKiBBbGwgV2ViQXV0aG4tc3BlY2lmaWMgZXJyb3JzIGV4dGVuZCBmcm9tIHRoaXMgY2xhc3MgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHdlYkF1dGhuU2VydmljZS5yZWdpc3Rlcihjb25maWcpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2ViQXV0aG5FcnJvcikge1xuICogICAgIGNvbnNvbGUubG9nKCdFcnJvciB0eXBlOicsIGVycm9yLnR5cGUpO1xuICogICAgIGNvbnNvbGUubG9nKCdPcmlnaW5hbCBlcnJvcjonLCBlcnJvci5vcmlnaW5hbEVycm9yKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJBdXRobkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBXZWJBdXRobkVycm9yIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgc2VtYW50aWMgZXJyb3IgdHlwZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBvcmlnaW5hbEVycm9yIFRoZSBvcmlnaW5hbCBlcnJvciB0aGF0IGNhdXNlZCB0aGlzIFdlYkF1dGhuIGVycm9yIChvcHRpb25hbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBXZWJBdXRobkVycm9yVHlwZSxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IG9yaWdpbmFsRXJyb3I/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnV2ViQXV0aG5FcnJvcic7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIFdlYkF1dGhuRXJyb3IgZnJvbSBET01FeGNlcHRpb24uXG4gICAqIE1hcHMgYnJvd3NlciBET01FeGNlcHRpb24gdHlwZXMgdG8gc2VtYW50aWMgV2ViQXV0aG4gZXJyb3IgdHlwZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgRE9NRXhjZXB0aW9uIHRocm93biBieSBXZWJBdXRobiBBUElcbiAgICogQHJldHVybnMgQXBwcm9wcmlhdGUgV2ViQXV0aG5FcnJvciBzdWJjbGFzcyBiYXNlZCBvbiB0aGUgRE9NRXhjZXB0aW9uIHR5cGVcbiAgICovXG4gIHN0YXRpYyBmcm9tRE9NRXhjZXB0aW9uKGVycm9yOiBET01FeGNlcHRpb24pOiBXZWJBdXRobkVycm9yIHtcbiAgICBjb25zdCB0eXBlID0gV2ViQXV0aG5FcnJvci5tYXBET01FeGNlcHRpb25Ub1R5cGUoZXJyb3IubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHR5cGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIERPTUV4Y2VwdGlvbiBuYW1lcyB0byBXZWJBdXRobiBlcnJvciB0eXBlcy5cbiAgICogUHJvdmlkZXMgc2VtYW50aWMgY2xhc3NpZmljYXRpb24gb2YgYnJvd3Nlci1sZXZlbCBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBET01FeGNlcHRpb24gbmFtZVxuICAgKiBAcmV0dXJucyBDb3JyZXNwb25kaW5nIFdlYkF1dGhuRXJyb3JUeXBlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtYXBET01FeGNlcHRpb25Ub1R5cGUobmFtZTogc3RyaW5nKTogV2ViQXV0aG5FcnJvclR5cGUge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnTm90U3VwcG9ydGVkRXJyb3InOlxuICAgICAgICByZXR1cm4gV2ViQXV0aG5FcnJvclR5cGUuTk9UX1NVUFBPUlRFRDtcbiAgICAgIGNhc2UgJ05vdEFsbG93ZWRFcnJvcic6XG4gICAgICAgIHJldHVybiBXZWJBdXRobkVycm9yVHlwZS5VU0VSX0NBTkNFTExFRDtcbiAgICAgIGNhc2UgJ0ludmFsaWRTdGF0ZUVycm9yJzpcbiAgICAgICAgcmV0dXJuIFdlYkF1dGhuRXJyb3JUeXBlLkFVVEhFTlRJQ0FUT1JfRVJST1I7XG4gICAgICBjYXNlICdTZWN1cml0eUVycm9yJzpcbiAgICAgICAgcmV0dXJuIFdlYkF1dGhuRXJyb3JUeXBlLlNFQ1VSSVRZX0VSUk9SO1xuICAgICAgY2FzZSAnVGltZW91dEVycm9yJzpcbiAgICAgICAgcmV0dXJuIFdlYkF1dGhuRXJyb3JUeXBlLlRJTUVPVVRfRVJST1I7XG4gICAgICBjYXNlICdOZXR3b3JrRXJyb3InOlxuICAgICAgICByZXR1cm4gV2ViQXV0aG5FcnJvclR5cGUuTkVUV09SS19FUlJPUjtcbiAgICAgIGNhc2UgJ0VuY29kaW5nRXJyb3InOlxuICAgICAgICByZXR1cm4gV2ViQXV0aG5FcnJvclR5cGUuSU5WQUxJRF9PUFRJT05TO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFdlYkF1dGhuRXJyb3JUeXBlLlVOS05PV047XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIHVzZXIgY2FuY2VscyBhIFdlYkF1dGhuIG9wZXJhdGlvbi5cbiAqIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGVycm9yIGFuZCB0eXBpY2FsbHkgcmVxdWlyZXMgbm8gYWN0aW9uIGZyb20gdGhlIGRldmVsb3Blci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgd2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyKGNvbmZpZyk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVc2VyQ2FuY2VsbGVkRXJyb3IpIHtcbiAqICAgICAvLyBVc2VyIGNob3NlIG5vdCB0byBwcm9jZWVkIC0gdGhpcyBpcyBub3JtYWwgYmVoYXZpb3JcbiAqICAgICBjb25zb2xlLmxvZygnVXNlciBjYW5jZWxsZWQgdGhlIG9wZXJhdGlvbicpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJDYW5jZWxsZWRFcnJvciBleHRlbmRzIFdlYkF1dGhuRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBVc2VyQ2FuY2VsbGVkRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBvcmlnaW5hbEVycm9yIFRoZSBvcmlnaW5hbCBET01FeGNlcHRpb24gdGhhdCB0cmlnZ2VyZWQgdGhpcyBlcnJvciAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcmlnaW5hbEVycm9yPzogRXJyb3IpIHtcbiAgICBzdXBlcihcbiAgICAgIFdlYkF1dGhuRXJyb3JUeXBlLlVTRVJfQ0FOQ0VMTEVELFxuICAgICAgJ1VzZXIgY2FuY2VsbGVkIHRoZSBXZWJBdXRobiBvcGVyYXRpb24nLFxuICAgICAgb3JpZ2luYWxFcnJvclxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1VzZXJDYW5jZWxsZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSdzIGFuIGlzc3VlIHdpdGggdGhlIGF1dGhlbnRpY2F0b3IgZGV2aWNlLlxuICogVGhpcyBjb3VsZCBpbmRpY2F0ZSBoYXJkd2FyZSBwcm9ibGVtcywgaW52YWxpZCBzdGF0ZSwgb3Igb3RoZXIgZGV2aWNlLXNwZWNpZmljIGlzc3Vlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgd2ViQXV0aG5TZXJ2aWNlLmF1dGhlbnRpY2F0ZShjb25maWcpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXV0aGVudGljYXRvckVycm9yKSB7XG4gKiAgICAgLy8gU2hvdyB1c2VyLWZyaWVuZGx5IG1lc3NhZ2UgYWJvdXQgdHJ5aW5nIGFnYWluIG9yIHVzaW5nIGRpZmZlcmVudCBhdXRoZW50aWNhdG9yXG4gKiAgICAgY29uc29sZS5sb2coJ0F1dGhlbnRpY2F0b3IgaXNzdWU6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRvckVycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF1dGhlbnRpY2F0b3JFcnJvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgRGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gb3JpZ2luYWxFcnJvciBUaGUgb3JpZ2luYWwgZXJyb3IgdGhhdCBjYXVzZWQgdGhpcyBhdXRoZW50aWNhdG9yIGVycm9yIChvcHRpb25hbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3JpZ2luYWxFcnJvcj86IEVycm9yKSB7XG4gICAgc3VwZXIoXG4gICAgICBXZWJBdXRobkVycm9yVHlwZS5BVVRIRU5USUNBVE9SX0VSUk9SLFxuICAgICAgYEF1dGhlbnRpY2F0b3IgZXJyb3I6ICR7bWVzc2FnZX1gLFxuICAgICAgb3JpZ2luYWxFcnJvclxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ0F1dGhlbnRpY2F0b3JFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgcHJvdmlkZWQgV2ViQXV0aG4gb3B0aW9ucyBhcmUgaW52YWxpZCBvciBtYWxmb3JtZWQuXG4gKiBUaGlzIHR5cGljYWxseSBpbmRpY2F0ZXMgYSBwcm9ncmFtbWluZyBlcnJvciBpbiBvcHRpb24gY29uc3RydWN0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICBhd2FpdCB3ZWJBdXRoblNlcnZpY2UucmVnaXN0ZXIoaW52YWxpZENvbmZpZyk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBJbnZhbGlkT3B0aW9uc0Vycm9yKSB7XG4gKiAgICAgLy8gQ2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBvcHRpb25zIHByb3ZpZGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRPcHRpb25zRXJyb3IgZXh0ZW5kcyBXZWJBdXRobkVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSW52YWxpZE9wdGlvbnNFcnJvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgRGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBleHBsYWluaW5nIHdoYXQncyBpbnZhbGlkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEVycm9yIFRoZSBvcmlnaW5hbCBlcnJvciB0aGF0IHJldmVhbGVkIHRoZSBpbnZhbGlkIG9wdGlvbnMgKG9wdGlvbmFsKVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcmlnaW5hbEVycm9yPzogRXJyb3IpIHtcbiAgICBzdXBlcihcbiAgICAgIFdlYkF1dGhuRXJyb3JUeXBlLklOVkFMSURfT1BUSU9OUyxcbiAgICAgIGBJbnZhbGlkIG9wdGlvbnM6ICR7bWVzc2FnZX1gLFxuICAgICAgb3JpZ2luYWxFcnJvclxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRPcHRpb25zRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBXZWJBdXRobiBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cbiAqIFRoaXMgY291bGQgYmUgZHVlIHRvIGJyb3dzZXIgbGltaXRhdGlvbnMgb3IgbWlzc2luZyBoYXJkd2FyZSBjYXBhYmlsaXRpZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmICghd2ViQXV0aG5TZXJ2aWNlLmlzU3VwcG9ydGVkKCkpIHtcbiAqICAgLy8gSGFuZGxlIHVuc3VwcG9ydGVkIGVudmlyb25tZW50XG4gKiB9XG4gKlxuICogdHJ5IHtcbiAqICAgYXdhaXQgd2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyKGNvbmZpZyk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKSB7XG4gKiAgICAgLy8gU2hvdyBmYWxsYmFjayBhdXRoZW50aWNhdGlvbiBtZXRob2RcbiAqICAgICBjb25zb2xlLmxvZygnV2ViQXV0aG4gbm90IHN1cHBvcnRlZCwgdXNpbmcgZmFsbGJhY2snKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIERlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgZXhwbGFpbmluZyB3aGF0J3Mgbm90IHN1cHBvcnRlZFxuICAgKiBAcGFyYW0gb3JpZ2luYWxFcnJvciBUaGUgb3JpZ2luYWwgZXJyb3IgdGhhdCBpbmRpY2F0ZWQgbGFjayBvZiBzdXBwb3J0IChvcHRpb25hbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3JpZ2luYWxFcnJvcj86IEVycm9yKSB7XG4gICAgc3VwZXIoXG4gICAgICBXZWJBdXRobkVycm9yVHlwZS5VTlNVUFBPUlRFRF9PUEVSQVRJT04sXG4gICAgICBgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZXJlJ3MgYSBuZXR3b3JrLXJlbGF0ZWQgaXNzdWUgZHVyaW5nIFdlYkF1dGhuIG9wZXJhdGlvbnMuXG4gKiBUaGlzIGlzIHJhcmUgYnV0IGNhbiBvY2N1ciBpbiBjZXJ0YWluIG5ldHdvcmsgY29uZGl0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgd2ViQXV0aG5TZXJ2aWNlLmF1dGhlbnRpY2F0ZShjb25maWcpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTmV0d29ya0Vycm9yKSB7XG4gKiAgICAgLy8gU3VnZ2VzdCB1c2VyIGNoZWNrIGNvbm5lY3Rpb24gYW5kIHJldHJ5XG4gKiAgICAgY29uc29sZS5sb2coJ05ldHdvcmsgaXNzdWUgZHVyaW5nIGF1dGhlbnRpY2F0aW9uOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtFcnJvciBleHRlbmRzIFdlYkF1dGhuRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBOZXR3b3JrRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIERlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIG5ldHdvcmsgaXNzdWVcbiAgICogQHBhcmFtIG9yaWdpbmFsRXJyb3IgVGhlIG9yaWdpbmFsIG5ldHdvcmstcmVsYXRlZCBlcnJvciAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9yaWdpbmFsRXJyb3I/OiBFcnJvcikge1xuICAgIHN1cGVyKFxuICAgICAgV2ViQXV0aG5FcnJvclR5cGUuTkVUV09SS19FUlJPUixcbiAgICAgIGBOZXR3b3JrIGVycm9yOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdOZXR3b3JrRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBzZWN1cml0eSB2aW9sYXRpb24gb2NjdXJzIGR1cmluZyBXZWJBdXRobiBvcGVyYXRpb25zLlxuICogVGhpcyB0eXBpY2FsbHkgaW5kaWNhdGVzIGlzc3VlcyB3aXRoIG9yaWdpbiB2YWxpZGF0aW9uIG9yIG90aGVyIHNlY3VyaXR5IGNoZWNrcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgd2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyKGNvbmZpZyk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yKSB7XG4gKiAgICAgLy8gU2VjdXJpdHkgaXNzdWUgLSBjaGVjayBvcmlnaW4sIEhUVFBTLCBldGMuXG4gKiAgICAgY29uc29sZS5lcnJvcignU2VjdXJpdHkgdmlvbGF0aW9uOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyaXR5RXJyb3IgZXh0ZW5kcyBXZWJBdXRobkVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU2VjdXJpdHlFcnJvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgRGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBhYm91dCB0aGUgc2VjdXJpdHkgaXNzdWVcbiAgICogQHBhcmFtIG9yaWdpbmFsRXJyb3IgVGhlIG9yaWdpbmFsIHNlY3VyaXR5LXJlbGF0ZWQgZXJyb3IgKG9wdGlvbmFsKVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcmlnaW5hbEVycm9yPzogRXJyb3IpIHtcbiAgICBzdXBlcihcbiAgICAgIFdlYkF1dGhuRXJyb3JUeXBlLlNFQ1VSSVRZX0VSUk9SLFxuICAgICAgYFNlY3VyaXR5IGVycm9yOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdTZWN1cml0eUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgV2ViQXV0aG4gb3BlcmF0aW9uIHRpbWVzIG91dC5cbiAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB1c2VyIHRha2VzIHRvbyBsb25nIHRvIGludGVyYWN0IHdpdGggdGhlaXIgYXV0aGVudGljYXRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgd2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyKGNvbmZpZyk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAqICAgICAvLyBTdWdnZXN0IHVzZXIgdHJ5IGFnYWluIGFuZCByZXNwb25kIG1vcmUgcXVpY2tseVxuICogICAgIGNvbnNvbGUubG9nKCdPcGVyYXRpb24gdGltZWQgb3V0IC0gcGxlYXNlIHRyeSBhZ2FpbicpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIFdlYkF1dGhuRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBUaW1lb3V0RXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIERlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHRpbWVvdXRcbiAgICogQHBhcmFtIG9yaWdpbmFsRXJyb3IgVGhlIG9yaWdpbmFsIHRpbWVvdXQtcmVsYXRlZCBlcnJvciAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9yaWdpbmFsRXJyb3I/OiBFcnJvcikge1xuICAgIHN1cGVyKFxuICAgICAgV2ViQXV0aG5FcnJvclR5cGUuVElNRU9VVF9FUlJPUixcbiAgICAgIGBUaW1lb3V0IGVycm9yOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQ29udGV4dCBpbmZvcm1hdGlvbiBmb3IgcmVtb3RlIGVuZHBvaW50IGVycm9ycyAoc2VjdXJpdHktY29uc2Npb3VzKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUVycm9yQ29udGV4dCB7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcbiAgcmVhZG9ubHkgb3BlcmF0aW9uOiAncmVnaXN0cmF0aW9uJyB8ICdhdXRoZW50aWNhdGlvbic7XG4gIHJlYWRvbmx5IHN0YXR1cz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RhdHVzVGV4dD86IHN0cmluZztcbiAgLy8gSW50ZW50aW9uYWxseSBleGNsdWRlcyByZXF1ZXN0L3Jlc3BvbnNlIGJvZGllcyBmb3Igc2VjdXJpdHlcbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiByZW1vdGUgZW5kcG9pbnQgcmVxdWVzdCBmYWlscy5cbiAqIEluY2x1ZGVzIG5ldHdvcmsgZXJyb3JzLCBIVFRQIGVycm9ycywgYW5kIHRpbWVvdXQgZXJyb3JzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICBhd2FpdCB3ZWJBdXRoblNlcnZpY2UucmVnaXN0ZXJSZW1vdGUocmVxdWVzdCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZW1vdGVFbmRwb2ludEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0VuZHBvaW50OicsIGVycm9yLmNvbnRleHQudXJsKTtcbiAqICAgICBjb25zb2xlLmxvZygnU3RhdHVzOicsIGVycm9yLmNvbnRleHQuc3RhdHVzKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW1vdGVFbmRwb2ludEVycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFJlbW90ZUVuZHBvaW50RXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIERlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHJlbW90ZSBlbmRwb2ludCBmYWlsdXJlXG4gICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHR1YWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZhaWxlZCByZXF1ZXN0XG4gICAqIEBwYXJhbSBvcmlnaW5hbEVycm9yIFRoZSBvcmlnaW5hbCBlcnJvciB0aGF0IGNhdXNlZCB0aGlzIHJlbW90ZSBlbmRwb2ludCBlcnJvciAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQ6IFJlbW90ZUVycm9yQ29udGV4dCxcbiAgICBvcmlnaW5hbEVycm9yPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBXZWJBdXRobkVycm9yVHlwZS5SRU1PVEVfRU5EUE9JTlRfRVJST1IsXG4gICAgICBgUmVtb3RlIGVuZHBvaW50IGVycm9yOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdSZW1vdGVFbmRwb2ludEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHJlbW90ZSBzZXJ2ZXIgcmV0dXJucyBpbnZhbGlkIFdlYkF1dGhuIG9wdGlvbnMuXG4gKiBUaGlzIGluZGljYXRlcyB0aGUgc2VydmVyIHJlc3BvbnNlIGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgV2ViQXV0aG4gb3B0aW9uIGZvcm1hdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgd2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyUmVtb3RlKHJlcXVlc3QpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcikge1xuICogICAgIGNvbnNvbGUubG9nKCdJbnZhbGlkIHNlcnZlciByZXNwb25zZTonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIERlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIGludmFsaWQgcmVtb3RlIG9wdGlvbnNcbiAgICogQHBhcmFtIG9yaWdpbmFsRXJyb3IgVGhlIG9yaWdpbmFsIGVycm9yIHRoYXQgcmV2ZWFsZWQgdGhlIGludmFsaWQgb3B0aW9ucyAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9yaWdpbmFsRXJyb3I/OiBFcnJvcikge1xuICAgIHN1cGVyKFxuICAgICAgV2ViQXV0aG5FcnJvclR5cGUuSU5WQUxJRF9SRU1PVEVfT1BUSU9OUyxcbiAgICAgIGBJbnZhbGlkIHJlbW90ZSBvcHRpb25zOiAke21lc3NhZ2V9YCxcbiAgICAgIG9yaWdpbmFsRXJyb3JcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yJztcbiAgfVxufVxuIl19","/**\n * Service-level configuration for WebAuthn operations\n *\n * These interfaces define the global configuration that affects the entire WebAuthn service,\n * including relying party information and default settings.\n */\nimport { InjectionToken } from '@angular/core';\n/**\n * Default configuration for WebAuthn service\n * Note: relyingParty must be provided by the application\n */\nexport const DEFAULT_WEBAUTHN_CONFIG = {\n defaultTimeout: 60000,\n defaultAlgorithms: [\n { type: 'public-key', alg: -7 }, // ES256 (ECDSA w/ SHA-256)\n { type: 'public-key', alg: -257 }, // RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256)\n ],\n enforceUserVerification: false,\n defaultAttestation: 'none',\n defaultAuthenticatorSelection: {\n userVerification: 'preferred',\n },\n};\n/**\n * Injection token for WebAuthn configuration\n */\nexport const WEBAUTHN_CONFIG = new InjectionToken('WEBAUTHN_CONFIG');\n/**\n * Creates a complete WebAuthn configuration with required relying party information\n * @param relyingParty Required relying party configuration\n * @param overrides Optional configuration overrides\n */\nexport function createWebAuthnConfig(relyingParty, overrides) {\n return {\n relyingParty,\n ...DEFAULT_WEBAUTHN_CONFIG,\n ...overrides,\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC13ZWJhdXRobi9zcmMvbGliL21vZGVsL3NlcnZpY2UtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQW1GL0M7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXlDO0lBQzNFLGNBQWMsRUFBRSxLQUFLO0lBQ3JCLGlCQUFpQixFQUFFO1FBQ2pCLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSwyQkFBMkI7UUFDNUQsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLHVDQUF1QztLQUMzRTtJQUNELHVCQUF1QixFQUFFLEtBQUs7SUFDOUIsa0JBQWtCLEVBQUUsTUFBTTtJQUMxQiw2QkFBNkIsRUFBRTtRQUM3QixnQkFBZ0IsRUFBRSxXQUFXO0tBQzlCO0NBQ0YsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLElBQUksY0FBYyxDQUMvQyxpQkFBaUIsQ0FDbEIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFlBQWdDLEVBQ2hDLFNBQXlEO0lBRXpELE9BQU87UUFDTCxZQUFZO1FBQ1osR0FBRyx1QkFBdUI7UUFDMUIsR0FBRyxTQUFTO0tBQ2IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcnZpY2UtbGV2ZWwgY29uZmlndXJhdGlvbiBmb3IgV2ViQXV0aG4gb3BlcmF0aW9uc1xuICpcbiAqIFRoZXNlIGludGVyZmFjZXMgZGVmaW5lIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGVudGlyZSBXZWJBdXRobiBzZXJ2aWNlLFxuICogaW5jbHVkaW5nIHJlbHlpbmcgcGFydHkgaW5mb3JtYXRpb24gYW5kIGRlZmF1bHQgc2V0dGluZ3MuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBSZXF1aXJlZCByZWx5aW5nIHBhcnR5IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWx5aW5nUGFydHlDb25maWcge1xuICAvKipcbiAgICogSHVtYW4tcmVhZGFibGUgaWRlbnRpZmllciBmb3IgdGhlIFJlbHlpbmcgUGFydHlcbiAgICogQGV4YW1wbGUgXCJBQ01FIENvcnBvcmF0aW9uXCJcbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSB2YWxpZCBkb21haW4gc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgUmVseWluZyBQYXJ0eSBvbiB3aG9zZSBiZWhhbGYgYSBnaXZlbiByZWdpc3RyYXRpb24gb3IgYXV0aGVudGljYXRpb24gY2VyZW1vbnkgaXMgYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBleGFtcGxlIFwibG9naW4uZXhhbXBsZS5jb21cIiBvciBcImV4YW1wbGUuY29tXCJcbiAgICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBXZWJBdXRobiBzZXJ2aWNlXG4gKiBOb3cgaW5jbHVkZXMgcmVxdWlyZWQgcmVseWluZyBwYXJ0eSBpbmZvcm1hdGlvbiBhbmQgYWR2YW5jZWQgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkF1dGhuQ29uZmlnIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIHJlbHlpbmcgcGFydHkgaW5mb3JtYXRpb24gZm9yIFdlYkF1dGhuIG9wZXJhdGlvbnNcbiAgICogVGhpcyBpcyBjcml0aWNhbCBmb3Igc2VjdXJpdHkgLSBtdXN0IGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkgZm9yIHByb2R1Y3Rpb24gdXNlXG4gICAqL1xuICByZWx5aW5nUGFydHk6IFJlbHlpbmdQYXJ0eUNvbmZpZztcblxuICAvKipcbiAgICogRGVmYXVsdCB0aW1lb3V0IGZvciBXZWJBdXRobiBvcGVyYXRpb25zIGluIG1pbGxpc2Vjb25kc1xuICAgKiBAZGVmYXVsdCA2MDAwMFxuICAgKi9cbiAgZGVmYXVsdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcHVibGljIGtleSBjcmVkZW50aWFsIGFsZ29yaXRobXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICAgKiBAZGVmYXVsdCBbRVMyNTYsIFJTMjU2XVxuICAgKi9cbiAgZGVmYXVsdEFsZ29yaXRobXM/OiBQdWJsaWNLZXlDcmVkZW50aWFsUGFyYW1ldGVyc1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuZm9yY2UgdXNlciB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZW5mb3JjZVVzZXJWZXJpZmljYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGF0dGVzdGF0aW9uIGNvbnZleWFuY2UgcHJlZmVyZW5jZVxuICAgKiBAZGVmYXVsdCBcIm5vbmVcIlxuICAgKi9cbiAgZGVmYXVsdEF0dGVzdGF0aW9uPzogQXR0ZXN0YXRpb25Db252ZXlhbmNlUHJlZmVyZW5jZTtcblxuICAvKipcbiAgICogRGVmYXVsdCBhdXRoZW50aWNhdG9yIHNlbGVjdGlvbiBjcml0ZXJpYVxuICAgKi9cbiAgZGVmYXVsdEF1dGhlbnRpY2F0b3JTZWxlY3Rpb24/OiBBdXRoZW50aWNhdG9yU2VsZWN0aW9uQ3JpdGVyaWE7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHJlbW90ZSBlbmRwb2ludHMgZm9yIGZldGNoaW5nIFdlYkF1dGhuIG9wdGlvbnMgZnJvbSBzZXJ2ZXJcbiAgICovXG4gIHJlbW90ZUVuZHBvaW50cz86IHtcbiAgICAvKipcbiAgICAgKiBBYnNvbHV0ZSBVUkwgZm9yIGZldGNoaW5nIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OXG4gICAgICogQGV4YW1wbGUgXCJodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJhdXRobi9yZWdpc3RyYXRpb24vb3B0aW9uc1wiXG4gICAgICovXG4gICAgcmVnaXN0cmF0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQWJzb2x1dGUgVVJMIGZvciBmZXRjaGluZyBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNKU09OXG4gICAgICogQGV4YW1wbGUgXCJodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJhdXRobi9hdXRoZW50aWNhdGlvbi9vcHRpb25zXCJcbiAgICAgKi9cbiAgICBhdXRoZW50aWNhdGlvbj86IHN0cmluZztcblxuICAgIC8qKiBIVFRQIHJlcXVlc3QgY29uZmlndXJhdGlvbiAqL1xuICAgIHJlcXVlc3RPcHRpb25zPzoge1xuICAgICAgLyoqIE5ldHdvcmsgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKHNlcGFyYXRlIGZyb20gV2ViQXV0aG4gdGltZW91dCkgKi9cbiAgICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIFdlYkF1dGhuIHNlcnZpY2VcbiAqIE5vdGU6IHJlbHlpbmdQYXJ0eSBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9XRUJBVVRITl9DT05GSUc6IE9taXQ8V2ViQXV0aG5Db25maWcsICdyZWx5aW5nUGFydHknPiA9IHtcbiAgZGVmYXVsdFRpbWVvdXQ6IDYwMDAwLFxuICBkZWZhdWx0QWxnb3JpdGhtczogW1xuICAgIHsgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC03IH0sIC8vIEVTMjU2IChFQ0RTQSB3LyBTSEEtMjU2KVxuICAgIHsgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC0yNTcgfSwgLy8gUlMyNTYgKFJTQVNTQS1QS0NTMS12MV81IHcvIFNIQS0yNTYpXG4gIF0sXG4gIGVuZm9yY2VVc2VyVmVyaWZpY2F0aW9uOiBmYWxzZSxcbiAgZGVmYXVsdEF0dGVzdGF0aW9uOiAnbm9uZScsXG4gIGRlZmF1bHRBdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XG4gICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXG4gIH0sXG59O1xuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgV2ViQXV0aG4gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY29uc3QgV0VCQVVUSE5fQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFdlYkF1dGhuQ29uZmlnPihcbiAgJ1dFQkFVVEhOX0NPTkZJRydcbik7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIFdlYkF1dGhuIGNvbmZpZ3VyYXRpb24gd2l0aCByZXF1aXJlZCByZWx5aW5nIHBhcnR5IGluZm9ybWF0aW9uXG4gKiBAcGFyYW0gcmVseWluZ1BhcnR5IFJlcXVpcmVkIHJlbHlpbmcgcGFydHkgY29uZmlndXJhdGlvblxuICogQHBhcmFtIG92ZXJyaWRlcyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG92ZXJyaWRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViQXV0aG5Db25maWcoXG4gIHJlbHlpbmdQYXJ0eTogUmVseWluZ1BhcnR5Q29uZmlnLFxuICBvdmVycmlkZXM/OiBQYXJ0aWFsPE9taXQ8V2ViQXV0aG5Db25maWcsICdyZWx5aW5nUGFydHknPj5cbik6IFdlYkF1dGhuQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICByZWx5aW5nUGFydHksXG4gICAgLi4uREVGQVVMVF9XRUJBVVRITl9DT05GSUcsXG4gICAgLi4ub3ZlcnJpZGVzLFxuICB9O1xufVxuIl19","/**\n * WebAuthn Utility Functions\n * Centralized utilities for ArrayBuffer conversions and WebAuthn-specific operations\n * This is the single source of truth for data transformation functions\n */\n/**\n * Converts a string to ArrayBuffer\n */\nexport function stringToArrayBuffer(str) {\n const encoder = new TextEncoder();\n return encoder.encode(str);\n}\n/**\n * Converts ArrayBuffer to string\n */\nexport function arrayBufferToString(buffer) {\n const decoder = new TextDecoder();\n return decoder.decode(buffer);\n}\n/**\n * Converts ArrayBuffer to base64 string\n */\nexport function arrayBufferToBase64(buffer) {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n/**\n * Converts base64 string to ArrayBuffer\n */\nexport function base64ToArrayBuffer(base64) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n/**\n * Converts base64url string to ArrayBuffer\n */\nexport function base64urlToArrayBuffer(base64url) {\n // Convert base64url to base64\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n // Add padding if necessary\n const padded = base64 + '==='.slice(0, (4 - (base64.length % 4)) % 4);\n return base64ToArrayBuffer(padded);\n}\n/**\n * Converts ArrayBuffer to base64url string\n * This is the canonical implementation used throughout the library\n */\nexport function arrayBufferToBase64url(buffer) {\n const base64 = arrayBufferToBase64(buffer);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n/**\n * Generates a random challenge as ArrayBuffer\n */\nexport function generateChallenge(length = 32) {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return array.buffer;\n}\n/**\n * Generates a random user ID as ArrayBuffer\n */\nexport function generateUserId(length = 32) {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return array.buffer;\n}\n/**\n * Converts credential ID string to ArrayBuffer for WebAuthn API\n */\nexport function credentialIdToArrayBuffer(credentialId) {\n return base64urlToArrayBuffer(credentialId);\n}\n/**\n * Converts ArrayBuffer credential ID to string\n */\nexport function arrayBufferToCredentialId(buffer) {\n return arrayBufferToBase64url(buffer);\n}\n/**\n * Checks if the current environment supports WebAuthn\n */\nexport function isWebAuthnSupported() {\n return !!(typeof window !== 'undefined' &&\n window.PublicKeyCredential &&\n typeof navigator !== 'undefined' &&\n navigator.credentials &&\n typeof navigator.credentials.create === 'function' &&\n typeof navigator.credentials.get === 'function');\n}\n/**\n * Checks if platform authenticator is available\n */\nexport async function isPlatformAuthenticatorAvailable() {\n if (!isWebAuthnSupported()) {\n return false;\n }\n try {\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n catch {\n return false;\n }\n}\n/**\n * Gets supported authenticator transports for this platform\n * Enhanced detection with better browser compatibility\n */\nexport function getSupportedTransports() {\n const transports = ['usb', 'internal'];\n // Add NFC support for Android devices\n if (typeof navigator !== 'undefined' &&\n /Android/i.test(navigator.userAgent)) {\n transports.push('nfc');\n }\n // Add BLE support for modern browsers with Web Bluetooth API\n if (typeof navigator !== 'undefined' && navigator.bluetooth) {\n transports.push('ble');\n }\n return transports;\n}\n/**\n * Validates that required WebAuthn options are present\n */\nexport function validateRegistrationOptions(options) {\n if (!options.user) {\n throw new Error('User information is required for registration');\n }\n if (!options.user.id) {\n throw new Error('User ID is required for registration');\n }\n if (!options.user.name) {\n throw new Error('User name is required for registration');\n }\n if (!options.user.displayName) {\n throw new Error('User display name is required for registration');\n }\n if (!options.rp) {\n throw new Error('Relying party information is required for registration');\n }\n if (!options.rp.name) {\n throw new Error('Relying party name is required for registration');\n }\n}\n/**\n * Creates default public key credential parameters\n */\nexport function getDefaultPubKeyCredParams() {\n return [\n {\n type: 'public-key',\n alg: -7, // ES256\n },\n {\n type: 'public-key',\n alg: -257, // RS256\n },\n ];\n}\n/**\n * Enhanced type guard to detect JSON-formatted WebAuthn options\n * More robust than simple challenge type checking\n */\nexport function isJSONOptions(options) {\n if (!options || typeof options !== 'object') {\n return false;\n }\n // Check multiple indicators that this is JSON format (base64url strings)\n return (typeof options.challenge === 'string' ||\n (options.user && typeof options.user.id === 'string') ||\n (options.allowCredentials?.length > 0 &&\n typeof options.allowCredentials[0]?.id === 'string') ||\n (options.excludeCredentials?.length > 0 &&\n typeof options.excludeCredentials[0]?.id === 'string'));\n}\n/**\n * Type guard to check if input is a PublicKeyCredential\n */\nexport function isPublicKeyCredential(credential) {\n return credential !== null && credential.type === 'public-key';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC13ZWJhdXRobi9zcmMvbGliL3V0aWxzL3dlYmF1dGhuLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFXO0lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFtQjtJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBbUI7SUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFjO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixNQUFNLEtBQUssR0FB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Q0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxVQUE2QjtJQUU3QixPQUFPLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBXZWJBdXRobiBVdGlsaXR5IEZ1bmN0aW9uc1xyXG4gKiBDZW50cmFsaXplZCB1dGlsaXRpZXMgZm9yIEFycmF5QnVmZmVyIGNvbnZlcnNpb25zIGFuZCBXZWJBdXRobi1zcGVjaWZpYyBvcGVyYXRpb25zXHJcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGRhdGEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIEFycmF5QnVmZmVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9BcnJheUJ1ZmZlcihzdHI6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcclxuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XHJcbiAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKHN0cik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBBcnJheUJ1ZmZlciB0byBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvU3RyaW5nKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICByZXR1cm4gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIEFycmF5QnVmZmVyIHRvIGJhc2U2NCBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpKyspIHtcclxuICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcclxuICB9XHJcbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGJhc2U2NCBzdHJpbmcgdG8gQXJyYXlCdWZmZXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NDogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xyXG4gIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcclxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpO1xyXG4gIH1cclxuICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYmFzZTY0dXJsIHN0cmluZyB0byBBcnJheUJ1ZmZlclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NHVybFRvQXJyYXlCdWZmZXIoYmFzZTY0dXJsOiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XHJcbiAgLy8gQ29udmVydCBiYXNlNjR1cmwgdG8gYmFzZTY0XHJcbiAgY29uc3QgYmFzZTY0ID0gYmFzZTY0dXJsLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XHJcbiAgLy8gQWRkIHBhZGRpbmcgaWYgbmVjZXNzYXJ5XHJcbiAgY29uc3QgcGFkZGVkID0gYmFzZTY0ICsgJz09PScuc2xpY2UoMCwgKDQgLSAoYmFzZTY0Lmxlbmd0aCAlIDQpKSAlIDQpO1xyXG4gIHJldHVybiBiYXNlNjRUb0FycmF5QnVmZmVyKHBhZGRlZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBBcnJheUJ1ZmZlciB0byBiYXNlNjR1cmwgc3RyaW5nXHJcbiAqIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBpbXBsZW1lbnRhdGlvbiB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGJhc2U2NCA9IGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyKTtcclxuICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0vZywgJycpO1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIGNoYWxsZW5nZSBhcyBBcnJheUJ1ZmZlclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ2hhbGxlbmdlKGxlbmd0aCA9IDMyKTogQXJyYXlCdWZmZXIge1xyXG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcclxuICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcclxuICByZXR1cm4gYXJyYXkuYnVmZmVyO1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHVzZXIgSUQgYXMgQXJyYXlCdWZmZXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJJZChsZW5ndGggPSAzMik6IEFycmF5QnVmZmVyIHtcclxuICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XHJcbiAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XHJcbiAgcmV0dXJuIGFycmF5LmJ1ZmZlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGNyZWRlbnRpYWwgSUQgc3RyaW5nIHRvIEFycmF5QnVmZmVyIGZvciBXZWJBdXRobiBBUElcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVkZW50aWFsSWRUb0FycmF5QnVmZmVyKGNyZWRlbnRpYWxJZDogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xyXG4gIHJldHVybiBiYXNlNjR1cmxUb0FycmF5QnVmZmVyKGNyZWRlbnRpYWxJZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBBcnJheUJ1ZmZlciBjcmVkZW50aWFsIElEIHRvIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9DcmVkZW50aWFsSWQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGFycmF5QnVmZmVyVG9CYXNlNjR1cmwoYnVmZmVyKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBXZWJBdXRoblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViQXV0aG5TdXBwb3J0ZWQoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuICEhKFxyXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgIHdpbmRvdy5QdWJsaWNLZXlDcmVkZW50aWFsICYmXHJcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgbmF2aWdhdG9yLmNyZWRlbnRpYWxzICYmXHJcbiAgICB0eXBlb2YgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgdHlwZW9mIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQgPT09ICdmdW5jdGlvbidcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHBsYXRmb3JtIGF1dGhlbnRpY2F0b3IgaXMgYXZhaWxhYmxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQbGF0Zm9ybUF1dGhlbnRpY2F0b3JBdmFpbGFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgaWYgKCFpc1dlYkF1dGhuU3VwcG9ydGVkKCkpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gYXdhaXQgUHVibGljS2V5Q3JlZGVudGlhbC5pc1VzZXJWZXJpZnlpbmdQbGF0Zm9ybUF1dGhlbnRpY2F0b3JBdmFpbGFibGUoKTtcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHN1cHBvcnRlZCBhdXRoZW50aWNhdG9yIHRyYW5zcG9ydHMgZm9yIHRoaXMgcGxhdGZvcm1cclxuICogRW5oYW5jZWQgZGV0ZWN0aW9uIHdpdGggYmV0dGVyIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN1cHBvcnRlZFRyYW5zcG9ydHMoKTogQXV0aGVudGljYXRvclRyYW5zcG9ydFtdIHtcclxuICBjb25zdCB0cmFuc3BvcnRzOiBBdXRoZW50aWNhdG9yVHJhbnNwb3J0W10gPSBbJ3VzYicsICdpbnRlcm5hbCddO1xyXG5cclxuICAvLyBBZGQgTkZDIHN1cHBvcnQgZm9yIEFuZHJvaWQgZGV2aWNlc1xyXG4gIGlmIChcclxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAvQW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudClcclxuICApIHtcclxuICAgIHRyYW5zcG9ydHMucHVzaCgnbmZjJyk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGQgQkxFIHN1cHBvcnQgZm9yIG1vZGVybiBicm93c2VycyB3aXRoIFdlYiBCbHVldG9vdGggQVBJXHJcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IgYXMgYW55KS5ibHVldG9vdGgpIHtcclxuICAgIHRyYW5zcG9ydHMucHVzaCgnYmxlJyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJhbnNwb3J0cztcclxufVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRlcyB0aGF0IHJlcXVpcmVkIFdlYkF1dGhuIG9wdGlvbnMgYXJlIHByZXNlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2lzdHJhdGlvbk9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XHJcbiAgaWYgKCFvcHRpb25zLnVzZXIpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignVXNlciBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCBmb3IgcmVnaXN0cmF0aW9uJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoIW9wdGlvbnMudXNlci5pZCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIElEIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy51c2VyLm5hbWUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignVXNlciBuYW1lIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy51c2VyLmRpc3BsYXlOYW1lKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGlzcGxheSBuYW1lIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy5ycCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWx5aW5nIHBhcnR5IGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkIGZvciByZWdpc3RyYXRpb24nKTtcclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy5ycC5uYW1lKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbHlpbmcgcGFydHkgbmFtZSBpcyByZXF1aXJlZCBmb3IgcmVnaXN0cmF0aW9uJyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBkZWZhdWx0IHB1YmxpYyBrZXkgY3JlZGVudGlhbCBwYXJhbWV0ZXJzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFB1YktleUNyZWRQYXJhbXMoKTogUHVibGljS2V5Q3JlZGVudGlhbFBhcmFtZXRlcnNbXSB7XHJcbiAgcmV0dXJuIFtcclxuICAgIHtcclxuICAgICAgdHlwZTogJ3B1YmxpYy1rZXknLFxyXG4gICAgICBhbGc6IC03LCAvLyBFUzI1NlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogJ3B1YmxpYy1rZXknLFxyXG4gICAgICBhbGc6IC0yNTcsIC8vIFJTMjU2XHJcbiAgICB9LFxyXG4gIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFbmhhbmNlZCB0eXBlIGd1YXJkIHRvIGRldGVjdCBKU09OLWZvcm1hdHRlZCBXZWJBdXRobiBvcHRpb25zXHJcbiAqIE1vcmUgcm9idXN0IHRoYW4gc2ltcGxlIGNoYWxsZW5nZSB0eXBlIGNoZWNraW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNKU09OT3B0aW9ucyhvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcclxuICBpZiAoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBtdWx0aXBsZSBpbmRpY2F0b3JzIHRoYXQgdGhpcyBpcyBKU09OIGZvcm1hdCAoYmFzZTY0dXJsIHN0cmluZ3MpXHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGVvZiBvcHRpb25zLmNoYWxsZW5nZSA9PT0gJ3N0cmluZycgfHxcclxuICAgIChvcHRpb25zLnVzZXIgJiYgdHlwZW9mIG9wdGlvbnMudXNlci5pZCA9PT0gJ3N0cmluZycpIHx8XHJcbiAgICAob3B0aW9ucy5hbGxvd0NyZWRlbnRpYWxzPy5sZW5ndGggPiAwICYmXHJcbiAgICAgIHR5cGVvZiBvcHRpb25zLmFsbG93Q3JlZGVudGlhbHNbMF0/LmlkID09PSAnc3RyaW5nJykgfHxcclxuICAgIChvcHRpb25zLmV4Y2x1ZGVDcmVkZW50aWFscz8ubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5leGNsdWRlQ3JlZGVudGlhbHNbMF0/LmlkID09PSAnc3RyaW5nJylcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbnB1dCBpcyBhIFB1YmxpY0tleUNyZWRlbnRpYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1B1YmxpY0tleUNyZWRlbnRpYWwoXHJcbiAgY3JlZGVudGlhbDogQ3JlZGVudGlhbCB8IG51bGxcclxuKTogY3JlZGVudGlhbCBpcyBQdWJsaWNLZXlDcmVkZW50aWFsIHtcclxuICByZXR1cm4gY3JlZGVudGlhbCAhPT0gbnVsbCAmJiBjcmVkZW50aWFsLnR5cGUgPT09ICdwdWJsaWMta2V5JztcclxufVxyXG4iXX0=","/**\n * Utility functions for remote WebAuthn option validation\n *\n * These utilities provide comprehensive validation of server responses\n * to ensure they contain valid WebAuthn options before processing.\n * All validation is done without external dependencies for minimal\n * bundle size impact.\n */\nimport { InvalidRemoteOptionsError } from '../errors/webauthn.errors';\n/**\n * Validates that server response contains valid WebAuthn creation options.\n * Performs essential validation without external dependencies.\n *\n * @param options Response from registration endpoint\n * @throws {InvalidRemoteOptionsError} When options are invalid or incomplete\n *\n * @example\n * ```typescript\n * try {\n * validateRemoteCreationOptions(serverResponse);\n * // Options are valid, proceed with registration\n * } catch (error) {\n * console.error('Invalid server response:', error.message);\n * }\n * ```\n */\nexport function validateRemoteCreationOptions(options) {\n if (!options || typeof options !== 'object' || Array.isArray(options)) {\n throw new InvalidRemoteOptionsError('Response must be an object');\n }\n const opts = options;\n // Validate relying party (required)\n if (!opts.rp || typeof opts.rp !== 'object') {\n throw new InvalidRemoteOptionsError('Missing or invalid rp (relying party) field');\n }\n if (typeof opts.rp.name !== 'string' || opts.rp.name.trim() === '') {\n throw new InvalidRemoteOptionsError('rp.name must be a non-empty string');\n }\n if (opts.rp.id !== undefined && typeof opts.rp.id !== 'string') {\n throw new InvalidRemoteOptionsError('rp.id must be a string when provided');\n }\n // Validate user (required)\n if (!opts.user || typeof opts.user !== 'object') {\n throw new InvalidRemoteOptionsError('Missing or invalid user field');\n }\n if (typeof opts.user.id !== 'string' || opts.user.id.trim() === '') {\n throw new InvalidRemoteOptionsError('user.id must be a non-empty base64url string');\n }\n if (typeof opts.user.name !== 'string' || opts.user.name.trim() === '') {\n throw new InvalidRemoteOptionsError('user.name must be a non-empty string');\n }\n if (typeof opts.user.displayName !== 'string' ||\n opts.user.displayName.trim() === '') {\n throw new InvalidRemoteOptionsError('user.displayName must be a non-empty string');\n }\n // Validate challenge (required)\n if (!opts.challenge ||\n typeof opts.challenge !== 'string' ||\n opts.challenge.trim() === '') {\n throw new InvalidRemoteOptionsError('Missing or invalid challenge field - must be a non-empty base64url string');\n }\n // Validate pubKeyCredParams (required)\n if (!Array.isArray(opts.pubKeyCredParams)) {\n throw new InvalidRemoteOptionsError('pubKeyCredParams must be an array');\n }\n if (opts.pubKeyCredParams.length === 0) {\n throw new InvalidRemoteOptionsError('pubKeyCredParams cannot be empty');\n }\n // Validate each pubKeyCredParams entry\n for (let i = 0; i < opts.pubKeyCredParams.length; i++) {\n const param = opts.pubKeyCredParams[i];\n if (!param || typeof param !== 'object') {\n throw new InvalidRemoteOptionsError(`pubKeyCredParams[${i}] must be an object`);\n }\n if (param.type !== 'public-key') {\n throw new InvalidRemoteOptionsError(`pubKeyCredParams[${i}].type must be \"public-key\"`);\n }\n if (typeof param.alg !== 'number') {\n throw new InvalidRemoteOptionsError(`pubKeyCredParams[${i}].alg must be a number`);\n }\n }\n // Validate optional fields if present\n if (opts.timeout !== undefined &&\n (typeof opts.timeout !== 'number' || opts.timeout <= 0)) {\n throw new InvalidRemoteOptionsError('timeout must be a positive number when provided');\n }\n if (opts.attestation !== undefined &&\n !['none', 'indirect', 'direct', 'enterprise'].includes(opts.attestation)) {\n throw new InvalidRemoteOptionsError('attestation must be one of: none, indirect, direct, enterprise');\n }\n // Validate authenticatorSelection if present\n if (opts.authenticatorSelection !== undefined) {\n if (typeof opts.authenticatorSelection !== 'object') {\n throw new InvalidRemoteOptionsError('authenticatorSelection must be an object when provided');\n }\n const authSel = opts.authenticatorSelection;\n if (authSel.authenticatorAttachment !== undefined &&\n !['platform', 'cross-platform'].includes(authSel.authenticatorAttachment)) {\n throw new InvalidRemoteOptionsError('authenticatorAttachment must be \"platform\" or \"cross-platform\"');\n }\n if (authSel.userVerification !== undefined &&\n !['required', 'preferred', 'discouraged'].includes(authSel.userVerification)) {\n throw new InvalidRemoteOptionsError('userVerification must be \"required\", \"preferred\", or \"discouraged\"');\n }\n if (authSel.residentKey !== undefined &&\n !['discouraged', 'preferred', 'required'].includes(authSel.residentKey)) {\n throw new InvalidRemoteOptionsError('residentKey must be \"discouraged\", \"preferred\", or \"required\"');\n }\n }\n // Validate excludeCredentials if present\n if (opts.excludeCredentials !== undefined) {\n if (!Array.isArray(opts.excludeCredentials)) {\n throw new InvalidRemoteOptionsError('excludeCredentials must be an array when provided');\n }\n for (let i = 0; i < opts.excludeCredentials.length; i++) {\n const cred = opts.excludeCredentials[i];\n if (!cred || typeof cred !== 'object') {\n throw new InvalidRemoteOptionsError(`excludeCredentials[${i}] must be an object`);\n }\n if (cred.type !== 'public-key') {\n throw new InvalidRemoteOptionsError(`excludeCredentials[${i}].type must be \"public-key\"`);\n }\n if (typeof cred.id !== 'string' || cred.id.trim() === '') {\n throw new InvalidRemoteOptionsError(`excludeCredentials[${i}].id must be a non-empty base64url string`);\n }\n }\n }\n}\n/**\n * Validates that server response contains valid WebAuthn request options.\n * Performs essential validation without external dependencies.\n *\n * @param options Response from authentication endpoint\n * @throws {InvalidRemoteOptionsError} When options are invalid or incomplete\n *\n * @example\n * ```typescript\n * try {\n * validateRemoteRequestOptions(serverResponse);\n * // Options are valid, proceed with authentication\n * } catch (error) {\n * console.error('Invalid server response:', error.message);\n * }\n * ```\n */\nexport function validateRemoteRequestOptions(options) {\n if (!options || typeof options !== 'object' || Array.isArray(options)) {\n throw new InvalidRemoteOptionsError('Response must be an object');\n }\n const opts = options;\n // Validate challenge (required)\n if (!opts.challenge ||\n typeof opts.challenge !== 'string' ||\n opts.challenge.trim() === '') {\n throw new InvalidRemoteOptionsError('Missing or invalid challenge field - must be a non-empty base64url string');\n }\n // Validate optional fields if present\n if (opts.timeout !== undefined &&\n (typeof opts.timeout !== 'number' || opts.timeout <= 0)) {\n throw new InvalidRemoteOptionsError('timeout must be a positive number when provided');\n }\n if (opts.userVerification !== undefined &&\n !['required', 'preferred', 'discouraged'].includes(opts.userVerification)) {\n throw new InvalidRemoteOptionsError('userVerification must be \"required\", \"preferred\", or \"discouraged\"');\n }\n // Validate allowCredentials if present\n if (opts.allowCredentials !== undefined) {\n if (!Array.isArray(opts.allowCredentials)) {\n throw new InvalidRemoteOptionsError('allowCredentials must be an array when provided');\n }\n for (let i = 0; i < opts.allowCredentials.length; i++) {\n const cred = opts.allowCredentials[i];\n if (!cred || typeof cred !== 'object') {\n throw new InvalidRemoteOptionsError(`allowCredentials[${i}] must be an object`);\n }\n if (cred.type !== 'public-key') {\n throw new InvalidRemoteOptionsError(`allowCredentials[${i}].type must be \"public-key\"`);\n }\n if (typeof cred.id !== 'string' || cred.id.trim() === '') {\n throw new InvalidRemoteOptionsError(`allowCredentials[${i}].id must be a non-empty base64url string`);\n }\n // Validate transports if present\n if (cred.transports !== undefined) {\n if (!Array.isArray(cred.transports)) {\n throw new InvalidRemoteOptionsError(`allowCredentials[${i}].transports must be an array when provided`);\n }\n const validTransports = ['usb', 'nfc', 'ble', 'internal'];\n for (let j = 0; j < cred.transports.length; j++) {\n if (!validTransports.includes(cred.transports[j])) {\n throw new InvalidRemoteOptionsError(`allowCredentials[${i}].transports[${j}] must be one of: ${validTransports.join(', ')}`);\n }\n }\n }\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi91dGlscy9yZW1vdGUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXRFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxPQUFnQjtJQUVoQixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEUsTUFBTSxJQUFJLHlCQUF5QixDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE9BQWMsQ0FBQztJQUU1QixvQ0FBb0M7SUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSx5QkFBeUIsQ0FDakMsNkNBQTZDLENBQzlDLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUkseUJBQXlCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUkseUJBQXlCLENBQUMs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RSxVQUFVLENBQUMsQ0FBQztnQkFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNsRCxNQUFNLElBQUkseUJBQXlCLENBQ2pDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixlQUFlLENBQUMsSUFBSSxDQUM3RSxJQUFJLENBQ0wsRUFBRSxDQUNKLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHJlbW90ZSBXZWJBdXRobiBvcHRpb24gdmFsaWRhdGlvblxuICpcbiAqIFRoZXNlIHV0aWxpdGllcyBwcm92aWRlIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBvZiBzZXJ2ZXIgcmVzcG9uc2VzXG4gKiB0byBlbnN1cmUgdGhleSBjb250YWluIHZhbGlkIFdlYkF1dGhuIG9wdGlvbnMgYmVmb3JlIHByb2Nlc3NpbmcuXG4gKiBBbGwgdmFsaWRhdGlvbiBpcyBkb25lIHdpdGhvdXQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZvciBtaW5pbWFsXG4gKiBidW5kbGUgc2l6ZSBpbXBhY3QuXG4gKi9cblxuaW1wb3J0IHsgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvciB9IGZyb20gJy4uL2Vycm9ycy93ZWJhdXRobi5lcnJvcnMnO1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IHNlcnZlciByZXNwb25zZSBjb250YWlucyB2YWxpZCBXZWJBdXRobiBjcmVhdGlvbiBvcHRpb25zLlxuICogUGVyZm9ybXMgZXNzZW50aWFsIHZhbGlkYXRpb24gd2l0aG91dCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgUmVzcG9uc2UgZnJvbSByZWdpc3RyYXRpb24gZW5kcG9pbnRcbiAqIEB0aHJvd3Mge0ludmFsaWRSZW1vdGVPcHRpb25zRXJyb3J9IFdoZW4gb3B0aW9ucyBhcmUgaW52YWxpZCBvciBpbmNvbXBsZXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIHZhbGlkYXRlUmVtb3RlQ3JlYXRpb25PcHRpb25zKHNlcnZlclJlc3BvbnNlKTtcbiAqICAgLy8gT3B0aW9ucyBhcmUgdmFsaWQsIHByb2NlZWQgd2l0aCByZWdpc3RyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgc2VydmVyIHJlc3BvbnNlOicsIGVycm9yLm1lc3NhZ2UpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlbW90ZUNyZWF0aW9uT3B0aW9ucyhcbiAgb3B0aW9uczogdW5rbm93blxuKTogYXNzZXJ0cyBvcHRpb25zIGlzIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OIHtcbiAgaWYgKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoJ1Jlc3BvbnNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyBhcyBhbnk7XG5cbiAgLy8gVmFsaWRhdGUgcmVseWluZyBwYXJ0eSAocmVxdWlyZWQpXG4gIGlmICghb3B0cy5ycCB8fCB0eXBlb2Ygb3B0cy5ycCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICdNaXNzaW5nIG9yIGludmFsaWQgcnAgKHJlbHlpbmcgcGFydHkpIGZpZWxkJ1xuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMucnAubmFtZSAhPT0gJ3N0cmluZycgfHwgb3B0cy5ycC5uYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcigncnAubmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgaWYgKG9wdHMucnAuaWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0cy5ycC5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcigncnAuaWQgbXVzdCBiZSBhIHN0cmluZyB3aGVuIHByb3ZpZGVkJyk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB1c2VyIChyZXF1aXJlZClcbiAgaWYgKCFvcHRzLnVzZXIgfHwgdHlwZW9mIG9wdHMudXNlciAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIHVzZXIgZmllbGQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy51c2VyLmlkICE9PSAnc3RyaW5nJyB8fCBvcHRzLnVzZXIuaWQudHJpbSgpID09PSAnJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgJ3VzZXIuaWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBiYXNlNjR1cmwgc3RyaW5nJ1xuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMudXNlci5uYW1lICE9PSAnc3RyaW5nJyB8fCBvcHRzLnVzZXIubmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoJ3VzZXIubmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBvcHRzLnVzZXIuZGlzcGxheU5hbWUgIT09ICdzdHJpbmcnIHx8XG4gICAgb3B0cy51c2VyLmRpc3BsYXlOYW1lLnRyaW0oKSA9PT0gJydcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoXG4gICAgICAndXNlci5kaXNwbGF5TmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZydcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgY2hhbGxlbmdlIChyZXF1aXJlZClcbiAgaWYgKFxuICAgICFvcHRzLmNoYWxsZW5nZSB8fFxuICAgIHR5cGVvZiBvcHRzLmNoYWxsZW5nZSAhPT0gJ3N0cmluZycgfHxcbiAgICBvcHRzLmNoYWxsZW5nZS50cmltKCkgPT09ICcnXG4gICkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgJ01pc3Npbmcgb3IgaW52YWxpZCBjaGFsbGVuZ2UgZmllbGQgLSBtdXN0IGJlIGEgbm9uLWVtcHR5IGJhc2U2NHVybCBzdHJpbmcnXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHB1YktleUNyZWRQYXJhbXMgKHJlcXVpcmVkKVxuICBpZiAoIUFycmF5LmlzQXJyYXkob3B0cy5wdWJLZXlDcmVkUGFyYW1zKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKCdwdWJLZXlDcmVkUGFyYW1zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgfVxuXG4gIGlmIChvcHRzLnB1YktleUNyZWRQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoJ3B1YktleUNyZWRQYXJhbXMgY2Fubm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBlYWNoIHB1YktleUNyZWRQYXJhbXMgZW50cnlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRzLnB1YktleUNyZWRQYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwYXJhbSA9IG9wdHMucHViS2V5Q3JlZFBhcmFtc1tpXTtcbiAgICBpZiAoIXBhcmFtIHx8IHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICBgcHViS2V5Q3JlZFBhcmFtc1ske2l9XSBtdXN0IGJlIGFuIG9iamVjdGBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXJhbS50eXBlICE9PSAncHVibGljLWtleScpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICBgcHViS2V5Q3JlZFBhcmFtc1ske2l9XS50eXBlIG11c3QgYmUgXCJwdWJsaWMta2V5XCJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtLmFsZyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICBgcHViS2V5Q3JlZFBhcmFtc1ske2l9XS5hbGcgbXVzdCBiZSBhIG51bWJlcmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgb3B0aW9uYWwgZmllbGRzIGlmIHByZXNlbnRcbiAgaWYgKFxuICAgIG9wdHMudGltZW91dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgKHR5cGVvZiBvcHRzLnRpbWVvdXQgIT09ICdudW1iZXInIHx8IG9wdHMudGltZW91dCA8PSAwKVxuICApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICd0aW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgd2hlbiBwcm92aWRlZCdcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIG9wdHMuYXR0ZXN0YXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICFbJ25vbmUnLCAnaW5kaXJlY3QnLCAnZGlyZWN0JywgJ2VudGVycHJpc2UnXS5pbmNsdWRlcyhvcHRzLmF0dGVzdGF0aW9uKVxuICApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICdhdHRlc3RhdGlvbiBtdXN0IGJlIG9uZSBvZjogbm9uZSwgaW5kaXJlY3QsIGRpcmVjdCwgZW50ZXJwcmlzZSdcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgYXV0aGVudGljYXRvclNlbGVjdGlvbiBpZiBwcmVzZW50XG4gIGlmIChvcHRzLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy5hdXRoZW50aWNhdG9yU2VsZWN0aW9uICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoXG4gICAgICAgICdhdXRoZW50aWNhdG9yU2VsZWN0aW9uIG11c3QgYmUgYW4gb2JqZWN0IHdoZW4gcHJvdmlkZWQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGF1dGhTZWwgPSBvcHRzLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb247XG5cbiAgICBpZiAoXG4gICAgICBhdXRoU2VsLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFbJ3BsYXRmb3JtJywgJ2Nyb3NzLXBsYXRmb3JtJ10uaW5jbHVkZXMoYXV0aFNlbC5hdXRoZW50aWNhdG9yQXR0YWNobWVudClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICAnYXV0aGVudGljYXRvckF0dGFjaG1lbnQgbXVzdCBiZSBcInBsYXRmb3JtXCIgb3IgXCJjcm9zcy1wbGF0Zm9ybVwiJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBhdXRoU2VsLnVzZXJWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIVsncmVxdWlyZWQnLCAncHJlZmVycmVkJywgJ2Rpc2NvdXJhZ2VkJ10uaW5jbHVkZXMoXG4gICAgICAgIGF1dGhTZWwudXNlclZlcmlmaWNhdGlvblxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoXG4gICAgICAgICd1c2VyVmVyaWZpY2F0aW9uIG11c3QgYmUgXCJyZXF1aXJlZFwiLCBcInByZWZlcnJlZFwiLCBvciBcImRpc2NvdXJhZ2VkXCInXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGF1dGhTZWwucmVzaWRlbnRLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIVsnZGlzY291cmFnZWQnLCAncHJlZmVycmVkJywgJ3JlcXVpcmVkJ10uaW5jbHVkZXMoYXV0aFNlbC5yZXNpZGVudEtleSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICAncmVzaWRlbnRLZXkgbXVzdCBiZSBcImRpc2NvdXJhZ2VkXCIsIFwicHJlZmVycmVkXCIsIG9yIFwicmVxdWlyZWRcIidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgZXhjbHVkZUNyZWRlbnRpYWxzIGlmIHByZXNlbnRcbiAgaWYgKG9wdHMuZXhjbHVkZUNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob3B0cy5leGNsdWRlQ3JlZGVudGlhbHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICAgJ2V4Y2x1ZGVDcmVkZW50aWFscyBtdXN0IGJlIGFuIGFycmF5IHdoZW4gcHJvdmlkZWQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5leGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNyZWQgPSBvcHRzLmV4Y2x1ZGVDcmVkZW50aWFsc1tpXTtcbiAgICAgIGlmICghY3JlZCB8fCB0eXBlb2YgY3JlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoXG4gICAgICAgICAgYGV4Y2x1ZGVDcmVkZW50aWFsc1ske2l9XSBtdXN0IGJlIGFuIG9iamVjdGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjcmVkLnR5cGUgIT09ICdwdWJsaWMta2V5Jykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICAgICBgZXhjbHVkZUNyZWRlbnRpYWxzWyR7aX1dLnR5cGUgbXVzdCBiZSBcInB1YmxpYy1rZXlcImBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY3JlZC5pZCAhPT0gJ3N0cmluZycgfHwgY3JlZC5pZC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICAgIGBleGNsdWRlQ3JlZGVudGlhbHNbJHtpfV0uaWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBiYXNlNjR1cmwgc3RyaW5nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IHNlcnZlciByZXNwb25zZSBjb250YWlucyB2YWxpZCBXZWJBdXRobiByZXF1ZXN0IG9wdGlvbnMuXG4gKiBQZXJmb3JtcyBlc3NlbnRpYWwgdmFsaWRhdGlvbiB3aXRob3V0IGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBSZXNwb25zZSBmcm9tIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50XG4gKiBAdGhyb3dzIHtJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yfSBXaGVuIG9wdGlvbnMgYXJlIGludmFsaWQgb3IgaW5jb21wbGV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICB2YWxpZGF0ZVJlbW90ZVJlcXVlc3RPcHRpb25zKHNlcnZlclJlc3BvbnNlKTtcbiAqICAgLy8gT3B0aW9ucyBhcmUgdmFsaWQsIHByb2NlZWQgd2l0aCBhdXRoZW50aWNhdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignSW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2U6JywgZXJyb3IubWVzc2FnZSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVtb3RlUmVxdWVzdE9wdGlvbnMoXG4gIG9wdGlvbnM6IHVua25vd25cbik6IGFzc2VydHMgb3B0aW9ucyBpcyBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNKU09OIHtcbiAgaWYgKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoJ1Jlc3BvbnNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyBhcyBhbnk7XG5cbiAgLy8gVmFsaWRhdGUgY2hhbGxlbmdlIChyZXF1aXJlZClcbiAgaWYgKFxuICAgICFvcHRzLmNoYWxsZW5nZSB8fFxuICAgIHR5cGVvZiBvcHRzLmNoYWxsZW5nZSAhPT0gJ3N0cmluZycgfHxcbiAgICBvcHRzLmNoYWxsZW5nZS50cmltKCkgPT09ICcnXG4gICkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgJ01pc3Npbmcgb3IgaW52YWxpZCBjaGFsbGVuZ2UgZmllbGQgLSBtdXN0IGJlIGEgbm9uLWVtcHR5IGJhc2U2NHVybCBzdHJpbmcnXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIGZpZWxkcyBpZiBwcmVzZW50XG4gIGlmIChcbiAgICBvcHRzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICh0eXBlb2Ygb3B0cy50aW1lb3V0ICE9PSAnbnVtYmVyJyB8fCBvcHRzLnRpbWVvdXQgPD0gMClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoXG4gICAgICAndGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIHdoZW4gcHJvdmlkZWQnXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICBvcHRzLnVzZXJWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICFbJ3JlcXVpcmVkJywgJ3ByZWZlcnJlZCcsICdkaXNjb3VyYWdlZCddLmluY2x1ZGVzKG9wdHMudXNlclZlcmlmaWNhdGlvbilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoXG4gICAgICAndXNlclZlcmlmaWNhdGlvbiBtdXN0IGJlIFwicmVxdWlyZWRcIiwgXCJwcmVmZXJyZWRcIiwgb3IgXCJkaXNjb3VyYWdlZFwiJ1xuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBhbGxvd0NyZWRlbnRpYWxzIGlmIHByZXNlbnRcbiAgaWYgKG9wdHMuYWxsb3dDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdHMuYWxsb3dDcmVkZW50aWFscykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICAnYWxsb3dDcmVkZW50aWFscyBtdXN0IGJlIGFuIGFycmF5IHdoZW4gcHJvdmlkZWQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5hbGxvd0NyZWRlbnRpYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjcmVkID0gb3B0cy5hbGxvd0NyZWRlbnRpYWxzW2ldO1xuICAgICAgaWYgKCFjcmVkIHx8IHR5cGVvZiBjcmVkICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICAgICBgYWxsb3dDcmVkZW50aWFsc1ske2l9XSBtdXN0IGJlIGFuIG9iamVjdGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjcmVkLnR5cGUgIT09ICdwdWJsaWMta2V5Jykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICAgICBgYWxsb3dDcmVkZW50aWFsc1ske2l9XS50eXBlIG11c3QgYmUgXCJwdWJsaWMta2V5XCJgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNyZWQuaWQgIT09ICdzdHJpbmcnIHx8IGNyZWQuaWQudHJpbSgpID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcihcbiAgICAgICAgICBgYWxsb3dDcmVkZW50aWFsc1ske2l9XS5pZCBtdXN0IGJlIGEgbm9uLWVtcHR5IGJhc2U2NHVybCBzdHJpbmdgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRyYW5zcG9ydHMgaWYgcHJlc2VudFxuICAgICAgaWYgKGNyZWQudHJhbnNwb3J0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjcmVkLnRyYW5zcG9ydHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZW1vdGVPcHRpb25zRXJyb3IoXG4gICAgICAgICAgICBgYWxsb3dDcmVkZW50aWFsc1ske2l9XS50cmFuc3BvcnRzIG11c3QgYmUgYW4gYXJyYXkgd2hlbiBwcm92aWRlZGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRUcmFuc3BvcnRzID0gWyd1c2InLCAnbmZjJywgJ2JsZScsICdpbnRlcm5hbCddO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNyZWQudHJhbnNwb3J0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghdmFsaWRUcmFuc3BvcnRzLmluY2x1ZGVzKGNyZWQudHJhbnNwb3J0c1tqXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yKFxuICAgICAgICAgICAgICBgYWxsb3dDcmVkZW50aWFsc1ske2l9XS50cmFuc3BvcnRzWyR7an1dIG11c3QgYmUgb25lIG9mOiAke3ZhbGlkVHJhbnNwb3J0cy5qb2luKFxuICAgICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19","/**\n * Enhanced WebAuthn Service\n *\n * Provides a clean, high-level API for WebAuthn operations with:\n * - Modern inject() pattern instead of constructor DI\n * - Flexible options (JSON base64url strings OR native ArrayBuffers)\n * - Enhanced error handling with specific error types\n * - Native browser parsing functions for optimal performance\n * - Clean, developer-friendly response objects\n */\nimport { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { from, throwError } from 'rxjs';\nimport { map, catchError, switchMap, timeout } from 'rxjs/operators';\nimport { isRegisterConfig, isAuthenticateConfig } from '../utils/type-guards';\nimport { buildCreationOptionsFromConfig, buildRequestOptionsFromConfig, validateRegisterConfig, validateAuthenticateConfig, } from '../utils/preset.utils';\nimport { WebAuthnError, WebAuthnErrorType, UserCancelledError, AuthenticatorError, InvalidOptionsError, UnsupportedOperationError, SecurityError, TimeoutError, RemoteEndpointError, InvalidRemoteOptionsError, } from '../errors/webauthn.errors';\nimport { WEBAUTHN_CONFIG } from '../model/service-config';\n// Import consolidated utility functions\nimport { arrayBufferToBase64url, getSupportedTransports, isJSONOptions, isPublicKeyCredential, isWebAuthnSupported, } from '../utils/webauthn.utils';\n// Import remote validation utilities\nimport { validateRemoteCreationOptions, validateRemoteRequestOptions, } from '../utils/remote.utils';\nimport * as i0 from \"@angular/core\";\n/**\n * Enhanced Angular service for WebAuthn operations\n * Provides a clean abstraction over the WebAuthn API with RxJS observables\n * and enhanced error handling\n */\nexport class WebAuthnService {\n config = inject(WEBAUTHN_CONFIG);\n http = inject(HttpClient);\n /**\n * Checks if WebAuthn is supported in the current browser environment.\n *\n * @returns True if WebAuthn is supported, false otherwise\n * @example\n * ```typescript\n * if (this.webAuthnService.isSupported()) {\n * // Proceed with WebAuthn operations\n * } else {\n * // Show fallback authentication method\n * }\n * ```\n */\n isSupported() {\n return isWebAuthnSupported();\n }\n /**\n * Gets detailed WebAuthn support information for the current browser.\n * Provides information about available authenticator types and capabilities.\n *\n * @returns Observable containing WebAuthn support details\n * @example\n * ```typescript\n * this.webAuthnService.getSupport().subscribe(support => {\n * console.log('Platform authenticator:', support.platformAuthenticator);\n * console.log('Cross-platform authenticator:', support.crossPlatformAuthenticator);\n * });\n * ```\n */\n getSupport() {\n if (!this.isSupported()) {\n return throwError(() => new UnsupportedOperationError('WebAuthn is not supported in this browser'));\n }\n return from(PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()).pipe(map((isPlatformAvailable) => ({\n isSupported: true,\n isPlatformAuthenticatorAvailable: isPlatformAvailable,\n supportedTransports: getSupportedTransports(),\n })), catchError((error) => throwError(() => new WebAuthnError(WebAuthnErrorType.UNKNOWN, 'Failed to check WebAuthn support', error))));\n }\n /**\n * Registers a new WebAuthn credential for a user.\n *\n * Supports two input formats:\n * 1. High-level RegisterConfig with preset support and automatic option building\n * 2. Direct PublicKeyCredentialCreationOptions for full control\n *\n * @param input Either a RegisterConfig object or raw WebAuthn creation options\n * @returns Observable containing the registration response with credential details\n *\n * @throws {UnsupportedOperationError} When WebAuthn is not supported\n * @throws {InvalidOptionsError} When provided options are invalid\n * @throws {UserCancelledError} When user cancels the registration\n * @throws {AuthenticatorError} When authenticator encounters an error\n * @throws {TimeoutError} When the operation times out\n * @throws {SecurityError} When a security violation occurs\n *\n * @example Using high-level config:\n * ```typescript\n * const config: RegisterConfig = {\n * preset: 'passkey',\n * user: {\n * id: 'user123',\n * name: 'user@example.com',\n * displayName: 'John Doe'\n * },\n * challenge: 'random-challenge'\n * };\n *\n * this.webAuthnService.register(config).subscribe({\n * next: (response) => {\n * console.log('Registration successful:', response.credential.id);\n * },\n * error: (error) => {\n * if (error instanceof UserCancelledError) {\n * console.log('User cancelled registration');\n * }\n * }\n * });\n * ```\n *\n * @example Using direct options:\n * ```typescript\n * const options: PublicKeyCredentialCreationOptions = {\n * rp: { name: \"Example Corp\" },\n * user: { id: new Uint8Array([1,2,3]), name: \"user@example.com\", displayName: \"User\" },\n * challenge: new Uint8Array([4,5,6]),\n * pubKeyCredParams: [{ type: \"public-key\", alg: -7 }]\n * };\n * this.webAuthnService.register(options).subscribe(response => {\n * // Handle response\n * });\n * ```\n */\n register(input) {\n if (!this.isSupported()) {\n return throwError(() => new UnsupportedOperationError('WebAuthn is not supported in this browser'));\n }\n try {\n let creationOptions;\n if (isRegisterConfig(input)) {\n // High-level config path: validate, resolve preset, build options\n validateRegisterConfig(input);\n creationOptions = buildCreationOptionsFromConfig(input, this.config);\n }\n else {\n // Direct options path: use provided options\n creationOptions = input;\n }\n const parsedOptions = this.parseRegistrationOptions(creationOptions);\n return from(navigator.credentials.create({ publicKey: parsedOptions })).pipe(map((credential) => this.processRegistrationResult(credential)), catchError((error) => this.handleWebAuthnError(error)));\n }\n catch (error) {\n return throwError(() => new InvalidOptionsError('Failed to process registration input', error));\n }\n }\n /**\n * Authenticates a user using an existing WebAuthn credential.\n *\n * Supports two input formats:\n * 1. High-level AuthenticateConfig with preset support and automatic option building\n * 2. Direct PublicKeyCredentialRequestOptions for full control\n *\n * @param input Either an AuthenticateConfig object or raw WebAuthn request options\n * @returns Observable containing the authentication response with assertion details\n *\n * @throws {UnsupportedOperationError} When WebAuthn is not supported\n * @throws {InvalidOptionsError} When provided options are invalid\n * @throws {UserCancelledError} When user cancels the authentication\n * @throws {AuthenticatorError} When authenticator encounters an error\n * @throws {TimeoutError} When the operation times out\n * @throws {SecurityError} When a security violation occurs\n *\n * @example Using high-level config:\n * ```typescript\n * const config: AuthenticateConfig = {\n * preset: 'passkey',\n * challenge: 'auth-challenge',\n * allowCredentials: ['credential-id-1', 'credential-id-2']\n * };\n *\n * this.webAuthnService.authenticate(config).subscribe({\n * next: (response) => {\n * console.log('Authentication successful:', response.credential.id);\n * },\n * error: (error) => {\n * if (error instanceof UserCancelledError) {\n * console.log('User cancelled authentication');\n * }\n * }\n * });\n * ```\n *\n * @example Using direct options:\n * ```typescript\n * const options: PublicKeyCredentialRequestOptions = {\n * challenge: new Uint8Array([1,2,3]),\n * allowCredentials: [{ type: 'public-key', id: new Uint8Array([4,5,6]) }]\n * };\n * this.webAuthnService.authenticate(options).subscribe(response => {\n * // Handle response\n * });\n * ```\n */\n authenticate(input) {\n if (!this.isSupported()) {\n return throwError(() => new UnsupportedOperationError('WebAuthn is not supported in this browser'));\n }\n try {\n let requestOptions;\n if (isAuthenticateConfig(input)) {\n validateAuthenticateConfig(input);\n requestOptions = buildRequestOptionsFromConfig(input, this.config);\n }\n else {\n requestOptions = input;\n }\n const parsedOptions = this.parseAuthenticationOptions(requestOptions);\n return from(navigator.credentials.get({ publicKey: parsedOptions })).pipe(map((credential) => this.processAuthenticationResult(credential)), catchError((error) => this.handleWebAuthnError(error)));\n }\n catch (error) {\n return throwError(() => new InvalidOptionsError('Failed to process authentication input', error));\n }\n }\n /**\n * Registers a new WebAuthn credential using options fetched from a remote server.\n *\n * Sends request data via POST to the configured registration endpoint,\n * receives PublicKeyCredentialCreationOptionsJSON, then proceeds with\n * standard WebAuthn registration flow.\n *\n * @param request Data to send to server (can be any object your server expects)\n * @template T Type constraint for the request payload\n * @returns Observable containing the registration response\n *\n * @throws {InvalidOptionsError} When remote registration endpoint is not configured\n * @throws {RemoteEndpointError} When server request fails\n * @throws {InvalidRemoteOptionsError} When server returns invalid options\n *\n * @example\n * ```typescript\n * // Simple request\n * this.webAuthnService.registerRemote({\n * username: 'john.doe@example.com'\n * }).subscribe(response => console.log('Success:', response));\n *\n * // Typed request with additional context\n * interface ServerPayload {\n * tenantId: string;\n * department: string;\n * }\n *\n * this.webAuthnService.registerRemote<ServerPayload>({\n * tenantId: 'acme-corp',\n * department: 'engineering'\n * }).subscribe(response => console.log('Success:', response));\n * ```\n */\n registerRemote(request) {\n this.validateRemoteRegistrationConfig();\n const endpoint = this.config.remoteEndpoints.registration;\n const timeoutMs = this.config.remoteEndpoints?.requestOptions?.timeout || 10000;\n return this.http\n .post(endpoint, request)\n .pipe(timeout(timeoutMs), map((options) => {\n validateRemoteCreationOptions(options);\n return options;\n }), switchMap((options) => this.register(options)), catchError((error) => this.handleRemoteError(error, endpoint, 'registration')));\n }\n /**\n * Authenticates using WebAuthn with options fetched from a remote server.\n *\n * Sends request data via POST to the configured authentication endpoint,\n * receives PublicKeyCredentialRequestOptionsJSON, then proceeds with\n * standard WebAuthn authentication flow.\n *\n * @param request Optional data to send to server (defaults to empty object)\n * @template T Type constraint for the request payload\n * @returns Observable containing the authentication response\n *\n * @throws {InvalidOptionsError} When remote authentication endpoint is not configured\n * @throws {RemoteEndpointError} When server request fails\n * @throws {InvalidRemoteOptionsError} When server returns invalid options\n *\n * @example\n * ```typescript\n * // Simple request\n * this.webAuthnService.authenticateRemote({\n * username: 'john.doe@example.com'\n * }).subscribe(response => console.log('Success:', response));\n *\n * // Request with no payload (server uses session/context)\n * this.webAuthnService.authenticateRemote()\n * .subscribe(response => console.log('Success:', response));\n * ```\n */\n authenticateRemote(request = {}) {\n this.validateRemoteAuthenticationConfig();\n const endpoint = this.config.remoteEndpoints.authentication;\n const timeoutMs = this.config.remoteEndpoints?.requestOptions?.timeout || 10000;\n return this.http\n .post(endpoint, request)\n .pipe(timeout(timeoutMs), map((options) => {\n validateRemoteRequestOptions(options);\n return options;\n }), switchMap((options) => this.authenticate(options)), catchError((error) => this.handleRemoteError(error, endpoint, 'authentication')));\n }\n /**\n * Validates that remote registration endpoint is configured\n * @private\n */\n validateRemoteRegistrationConfig() {\n if (!this.config.remoteEndpoints?.registration) {\n throw new InvalidOptionsError('Remote registration endpoint not configured. Add remoteEndpoints.registration to your WebAuthn config.');\n }\n }\n /**\n * Validates that remote authentication endpoint is configured\n * @private\n */\n validateRemoteAuthenticationConfig() {\n if (!this.config.remoteEndpoints?.authentication) {\n throw new InvalidOptionsError('Remote authentication endpoint not configured. Add remoteEndpoints.authentication to your WebAuthn config.');\n }\n }\n /**\n * Handles errors from remote HTTP requests\n * @private\n */\n handleRemoteError(error, url, operation) {\n if (error instanceof HttpErrorResponse) {\n const context = {\n url,\n method: 'POST',\n operation,\n status: error.status,\n statusText: error.statusText,\n };\n return throwError(() => new RemoteEndpointError(`${operation} request failed`, context, error));\n }\n // Preserve InvalidRemoteOptionsError instances (validation errors)\n if (error instanceof InvalidRemoteOptionsError) {\n return throwError(() => error);\n }\n return throwError(() => new WebAuthnError(WebAuthnErrorType.UNKNOWN, `Unexpected error during remote ${operation}`, error));\n }\n /**\n * Parses and normalizes registration options from either native or JSON format.\n * Converts base64url-encoded strings to Uint8Array where necessary.\n *\n * @param options Registration options in either native or JSON format\n * @returns Normalized PublicKeyCredentialCreationOptions for browser API\n * @private\n */\n parseRegistrationOptions(options) {\n if (isJSONOptions(options)) {\n return PublicKeyCredential.parseCreationOptionsFromJSON(options);\n }\n else {\n return options;\n }\n }\n /**\n * Parses and normalizes authentication options from either native or JSON format.\n * Converts base64url-encoded strings to Uint8Array where necessary.\n *\n * @param options Authentication options in either native or JSON format\n * @returns Normalized PublicKeyCredentialRequestOptions for browser API\n * @private\n */\n parseAuthenticationOptions(options) {\n if (isJSONOptions(options)) {\n return PublicKeyCredential.parseRequestOptionsFromJSON(options);\n }\n else {\n return options;\n }\n }\n /**\n * Validates that the credential is a valid PublicKeyCredential.\n *\n * @param credential Raw credential from navigator.credentials.create()\n * @returns Validated PublicKeyCredential\n * @throws {AuthenticatorError} When credential is invalid or null\n * @private\n */\n validateRegistrationCredential(credential) {\n if (!isPublicKeyCredential(credential)) {\n throw new AuthenticatorError('No credential returned from authenticator');\n }\n return credential;\n }\n /**\n * Extracts basic credential information (ID and transports).\n *\n * @param credential Validated PublicKeyCredential\n * @returns Object containing credential ID and supported transports\n * @private\n */\n extractCredentialInfo(credential) {\n const response = credential.response;\n return {\n credentialId: arrayBufferToBase64url(credential.rawId),\n transports: (response.getTransports?.() ||\n []),\n };\n }\n /**\n * Safely extracts the public key with proper error handling.\n *\n * @param response AuthenticatorAttestationResponse\n * @returns Public key as base64url string, or undefined if extraction fails\n * @private\n */\n extractPublicKey(response) {\n try {\n const publicKeyBuffer = response.getPublicKey?.();\n if (publicKeyBuffer) {\n return arrayBufferToBase64url(publicKeyBuffer);\n }\n }\n catch {\n // Public key extraction failed - this is okay, not all algorithms are supported\n // Some authenticators or algorithms don't provide extractable public keys\n }\n return undefined;\n }\n /**\n * Creates the complete raw WebAuthn response for advanced use cases.\n * Provides access to all WebAuthn data including attestation objects and metadata.\n *\n * @param credential Validated PublicKeyCredential\n * @param credentialId Already extracted credential ID\n * @param publicKey Extracted public key (may be undefined)\n * @returns Complete WebAuthnRegistrationResult with all WebAuthn data\n * @private\n */\n createRawRegistrationResponse(credential, credentialId, publicKey) {\n const response = credential.response;\n return {\n credentialId,\n publicKey: publicKey || arrayBufferToBase64url(new ArrayBuffer(0)), // Clean fallback\n attestationObject: arrayBufferToBase64url(response.attestationObject),\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n transports: (response.getTransports?.() ||\n []),\n };\n }\n /**\n * Assembles the final registration response.\n * Combines all extracted data into the final response format.\n *\n * @param credentialInfo Basic credential information\n * @param publicKey Extracted public key\n * @param rawResponse Raw WebAuthn response\n * @returns Complete RegistrationResponse\n * @private\n */\n assembleRegistrationResponse(credentialInfo, publicKey, rawResponse) {\n return {\n success: true,\n credentialId: credentialInfo.credentialId,\n publicKey,\n transports: credentialInfo.transports,\n rawResponse,\n };\n }\n /**\n * Processes the result of a WebAuthn registration operation.\n * Converts the browser credential response into a structured RegistrationResponse.\n *\n * @param credential The credential returned by navigator.credentials.create()\n * @returns Structured registration response with parsed credential data\n * @throws {AuthenticatorError} When credential creation fails or returns null\n * @private\n */\n processRegistrationResult(credential) {\n const validCredential = this.validateRegistrationCredential(credential);\n const credentialInfo = this.extractCredentialInfo(validCredential);\n const response = validCredential.response;\n const publicKey = this.extractPublicKey(response);\n const rawResponse = this.createRawRegistrationResponse(validCredential, credentialInfo.credentialId, publicKey);\n return this.assembleRegistrationResponse(credentialInfo, publicKey, rawResponse);\n }\n /**\n * Processes the result of a WebAuthn authentication operation.\n * Converts the browser credential response into a structured AuthenticationResponse.\n *\n * @param credential The credential returned by navigator.credentials.get()\n * @returns Structured authentication response with parsed assertion data\n * @throws {AuthenticatorError} When authentication fails or returns null\n * @private\n */\n processAuthenticationResult(credential) {\n if (!isPublicKeyCredential(credential)) {\n throw new AuthenticatorError('No credential returned from authenticator');\n }\n const response = credential.response;\n const credentialId = arrayBufferToBase64url(credential.rawId);\n let userHandle;\n if (response.userHandle) {\n userHandle = arrayBufferToBase64url(response.userHandle);\n }\n // Create the complete raw response for advanced use cases\n const rawResponse = {\n credentialId,\n authenticatorData: arrayBufferToBase64url(response.authenticatorData),\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n signature: arrayBufferToBase64url(response.signature),\n userHandle,\n };\n return {\n success: true,\n credentialId,\n userHandle,\n rawResponse,\n };\n }\n /**\n * Central error handling dispatcher for WebAuthn operations.\n * Routes different error types to specialized handlers for proper error classification.\n *\n * @param error The error to handle (can be DOMException, TypeError, or any other error)\n * @returns Observable that throws an appropriate WebAuthnError subclass\n * @private\n */\n handleWebAuthnError(error) {\n if (error instanceof DOMException) {\n return this.handleDOMException(error);\n }\n if (this.isJSONParsingError(error)) {\n return this.handleJSONParsingError(error);\n }\n return this.handleUnknownError(error);\n }\n /**\n * Handles DOMExceptions from the WebAuthn API using a mapping approach.\n * Maps specific DOMException names to appropriate WebAuthnError subclasses.\n *\n * @param error The DOMException thrown by the WebAuthn API\n * @returns Observable that throws an appropriate WebAuthnError subclass\n * @private\n */\n handleDOMException(error) {\n const errorMap = {\n NotAllowedError: () => new UserCancelledError(error),\n InvalidStateError: () => new AuthenticatorError('Invalid authenticator state', error),\n NotSupportedError: () => new UnsupportedOperationError('Operation not supported', error),\n SecurityError: () => new SecurityError('Security error occurred', error),\n TimeoutError: () => new TimeoutError('Operation timed out', error),\n EncodingError: () => new InvalidOptionsError('Encoding error in options', error),\n };\n const errorFactory = errorMap[error.name];\n const webAuthnError = errorFactory\n ? errorFactory()\n : new WebAuthnError(WebAuthnErrorType.UNKNOWN, `Unknown WebAuthn error: ${error.message}`, error);\n return throwError(() => webAuthnError);\n }\n /**\n * Determines if an error is related to JSON parsing issues.\n * Specifically checks for TypeError messages indicating JSON parsing failures.\n *\n * @param error The error to check\n * @returns True if the error is a JSON parsing error, false otherwise\n * @private\n */\n isJSONParsingError(error) {\n return (error instanceof TypeError &&\n (error.message.includes('parseCreationOptionsFromJSON') ||\n error.message.includes('parseRequestOptionsFromJSON')));\n }\n /**\n * Handles JSON parsing errors specifically.\n * These errors occur when invalid JSON format options are provided.\n *\n * @param error The TypeError from JSON parsing\n * @returns Observable that throws an InvalidOptionsError\n * @private\n */\n handleJSONParsingError(error) {\n // At this point we know it's a TypeError from isJSONParsingError check\n return throwError(() => new InvalidOptionsError('Invalid JSON options format', error));\n }\n /**\n * Handles any unexpected errors that don't fall into other categories.\n * Provides a fallback for errors that aren't DOMExceptions or JSON parsing errors.\n *\n * @param error The unexpected error\n * @returns Observable that throws a generic WebAuthnError\n * @private\n */\n handleUnknownError(error) {\n const message = error instanceof Error ? error.message : 'Unknown error occurred';\n return throwError(() => new WebAuthnError(WebAuthnErrorType.UNKNOWN, `Unexpected error: ${message}`, error instanceof Error ? error : new Error(String(error))));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WebAuthnService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WebAuthnService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WebAuthnService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXdlYmF1dGhuL3NyYy9saWIvc2VydmljZXMvd2ViYXV0aG4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckUsT0FBTyxFQUFjLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBZ0JyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLDZCQUE2QixFQUM3QixzQkFBc0IsRUFDdEIsMEJBQTBCLEdBQzNCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLGFBQWEsRUFDYixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLHlCQUF5QixHQUUxQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCx3Q0FBd0M7QUFDeEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixtQkFBbUIsR0FDcEIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxxQ0FBcUM7QUFDckMsT0FBTyxFQUNMLDZCQUE2QixF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QU8sQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUM7UUFDcEUsT0FBTyxVQUFVLENBQ2YsR0FBRyxFQUFFLENBQ0gsSUFBSSxhQUFhLENBQ2YsaUJBQWlCLENBQUMsT0FBTyxFQUN6QixxQkFBcUIsT0FBTyxFQUFFLEVBQzlCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzFELENBQ0osQ0FBQztJQUNKLENBQUM7dUdBcnZCVSxlQUFlOzJHQUFmLGVBQWUsY0FGZCxNQUFNOzsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5oYW5jZWQgV2ViQXV0aG4gU2VydmljZVxuICpcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIGhpZ2gtbGV2ZWwgQVBJIGZvciBXZWJBdXRobiBvcGVyYXRpb25zIHdpdGg6XG4gKiAtIE1vZGVybiBpbmplY3QoKSBwYXR0ZXJuIGluc3RlYWQgb2YgY29uc3RydWN0b3IgRElcbiAqIC0gRmxleGlibGUgb3B0aW9ucyAoSlNPTiBiYXNlNjR1cmwgc3RyaW5ncyBPUiBuYXRpdmUgQXJyYXlCdWZmZXJzKVxuICogLSBFbmhhbmNlZCBlcnJvciBoYW5kbGluZyB3aXRoIHNwZWNpZmljIGVycm9yIHR5cGVzXG4gKiAtIE5hdGl2ZSBicm93c2VyIHBhcnNpbmcgZnVuY3Rpb25zIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKiAtIENsZWFuLCBkZXZlbG9wZXItZnJpZW5kbHkgcmVzcG9uc2Ugb2JqZWN0c1xuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IsIHN3aXRjaE1hcCwgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgV2ViQXV0aG5TdXBwb3J0LFxuICBSZWdpc3RyYXRpb25SZXNwb25zZSxcbiAgQXV0aGVudGljYXRpb25SZXNwb25zZSxcbiAgV2ViQXV0aG5SZWdpc3RyYXRpb25SZXN1bHQsXG4gIFdlYkF1dGhuQXV0aGVudGljYXRpb25SZXN1bHQsXG59IGZyb20gJy4uL21vZGVsJztcblxuaW1wb3J0IHsgUmVnaXN0ZXJJbnB1dCwgQXV0aGVudGljYXRlSW5wdXQgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1xuICBSZW1vdGVSZWdpc3RyYXRpb25SZXF1ZXN0LFxuICBSZW1vdGVBdXRoZW50aWNhdGlvblJlcXVlc3QsXG59IGZyb20gJy4uL21vZGVsL3JlbW90ZS1jb25maWcnO1xuXG5pbXBvcnQgeyBpc1JlZ2lzdGVyQ29uZmlnLCBpc0F1dGhlbnRpY2F0ZUNvbmZpZyB9IGZyb20gJy4uL3V0aWxzL3R5cGUtZ3VhcmRzJztcblxuaW1wb3J0IHtcbiAgYnVpbGRDcmVhdGlvbk9wdGlvbnNGcm9tQ29uZmlnLFxuICBidWlsZFJlcXVlc3RPcHRpb25zRnJvbUNvbmZpZyxcbiAgdmFsaWRhdGVSZWdpc3RlckNvbmZpZyxcbiAgdmFsaWRhdGVBdXRoZW50aWNhdGVDb25maWcsXG59IGZyb20gJy4uL3V0aWxzL3ByZXNldC51dGlscyc7XG5cbmltcG9ydCB7XG4gIFdlYkF1dGhuRXJyb3IsXG4gIFdlYkF1dGhuRXJyb3JUeXBlLFxuICBVc2VyQ2FuY2VsbGVkRXJyb3IsXG4gIEF1dGhlbnRpY2F0b3JFcnJvcixcbiAgSW52YWxpZE9wdGlvbnNFcnJvcixcbiAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcixcbiAgU2VjdXJpdHlFcnJvcixcbiAgVGltZW91dEVycm9yLFxuICBSZW1vdGVFbmRwb2ludEVycm9yLFxuICBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yLFxuICBSZW1vdGVFcnJvckNvbnRleHQsXG59IGZyb20gJy4uL2Vycm9ycy93ZWJhdXRobi5lcnJvcnMnO1xuXG5pbXBvcnQgeyBXRUJBVVRITl9DT05GSUcgfSBmcm9tICcuLi9tb2RlbC9zZXJ2aWNlLWNvbmZpZyc7XG5cbi8vIEltcG9ydCBjb25zb2xpZGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnNcbmltcG9ydCB7XG4gIGFycmF5QnVmZmVyVG9CYXNlNjR1cmwsXG4gIGdldFN1cHBvcnRlZFRyYW5zcG9ydHMsXG4gIGlzSlNPTk9wdGlvbnMsXG4gIGlzUHVibGljS2V5Q3JlZGVudGlhbCxcbiAgaXNXZWJBdXRoblN1cHBvcnRlZCxcbn0gZnJvbSAnLi4vdXRpbHMvd2ViYXV0aG4udXRpbHMnO1xuXG4vLyBJbXBvcnQgcmVtb3RlIHZhbGlkYXRpb24gdXRpbGl0aWVzXG5pbXBvcnQge1xuICB2YWxpZGF0ZVJlbW90ZUNyZWF0aW9uT3B0aW9ucyxcbiAgdmFsaWRhdGVSZW1vdGVSZXF1ZXN0T3B0aW9ucyxcbn0gZnJvbSAnLi4vdXRpbHMvcmVtb3RlLnV0aWxzJztcblxuLyoqXG4gKiBFbmhhbmNlZCBBbmd1bGFyIHNlcnZpY2UgZm9yIFdlYkF1dGhuIG9wZXJhdGlvbnNcbiAqIFByb3ZpZGVzIGEgY2xlYW4gYWJzdHJhY3Rpb24gb3ZlciB0aGUgV2ViQXV0aG4gQVBJIHdpdGggUnhKUyBvYnNlcnZhYmxlc1xuICogYW5kIGVuaGFuY2VkIGVycm9yIGhhbmRsaW5nXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBXZWJBdXRoblNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdChXRUJBVVRITl9DT05GSUcpO1xuICBwcml2YXRlIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBXZWJBdXRobiBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBXZWJBdXRobiBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmICh0aGlzLndlYkF1dGhuU2VydmljZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAqICAgLy8gUHJvY2VlZCB3aXRoIFdlYkF1dGhuIG9wZXJhdGlvbnNcbiAgICogfSBlbHNlIHtcbiAgICogICAvLyBTaG93IGZhbGxiYWNrIGF1dGhlbnRpY2F0aW9uIG1ldGhvZFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgaXNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzV2ViQXV0aG5TdXBwb3J0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGRldGFpbGVkIFdlYkF1dGhuIHN1cHBvcnQgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGJyb3dzZXIuXG4gICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBhdXRoZW50aWNhdG9yIHR5cGVzIGFuZCBjYXBhYmlsaXRpZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29udGFpbmluZyBXZWJBdXRobiBzdXBwb3J0IGRldGFpbHNcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLndlYkF1dGhuU2VydmljZS5nZXRTdXBwb3J0KCkuc3Vic2NyaWJlKHN1cHBvcnQgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdQbGF0Zm9ybSBhdXRoZW50aWNhdG9yOicsIHN1cHBvcnQucGxhdGZvcm1BdXRoZW50aWNhdG9yKTtcbiAgICogICBjb25zb2xlLmxvZygnQ3Jvc3MtcGxhdGZvcm0gYXV0aGVudGljYXRvcjonLCBzdXBwb3J0LmNyb3NzUGxhdGZvcm1BdXRoZW50aWNhdG9yKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3VwcG9ydCgpOiBPYnNlcnZhYmxlPFdlYkF1dGhuU3VwcG9ydD4ge1xuICAgIGlmICghdGhpcy5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcbiAgICAgICAgICAgICdXZWJBdXRobiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcidcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tKFxuICAgICAgUHVibGljS2V5Q3JlZGVudGlhbC5pc1VzZXJWZXJpZnlpbmdQbGF0Zm9ybUF1dGhlbnRpY2F0b3JBdmFpbGFibGUoKVxuICAgICkucGlwZShcbiAgICAgIG1hcCgoaXNQbGF0Zm9ybUF2YWlsYWJsZSkgPT4gKHtcbiAgICAgICAgaXNTdXBwb3J0ZWQ6IHRydWUsXG4gICAgICAgIGlzUGxhdGZvcm1BdXRoZW50aWNhdG9yQXZhaWxhYmxlOiBpc1BsYXRmb3JtQXZhaWxhYmxlLFxuICAgICAgICBzdXBwb3J0ZWRUcmFuc3BvcnRzOiBnZXRTdXBwb3J0ZWRUcmFuc3BvcnRzKCksXG4gICAgICB9KSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT5cbiAgICAgICAgdGhyb3dFcnJvcihcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgbmV3IFdlYkF1dGhuRXJyb3IoXG4gICAgICAgICAgICAgIFdlYkF1dGhuRXJyb3JUeXBlLlVOS05PV04sXG4gICAgICAgICAgICAgICdGYWlsZWQgdG8gY2hlY2sgV2ViQXV0aG4gc3VwcG9ydCcsXG4gICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBXZWJBdXRobiBjcmVkZW50aWFsIGZvciBhIHVzZXIuXG4gICAqXG4gICAqIFN1cHBvcnRzIHR3byBpbnB1dCBmb3JtYXRzOlxuICAgKiAxLiBIaWdoLWxldmVsIFJlZ2lzdGVyQ29uZmlnIHdpdGggcHJlc2V0IHN1cHBvcnQgYW5kIGF1dG9tYXRpYyBvcHRpb24gYnVpbGRpbmdcbiAgICogMi4gRGlyZWN0IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgZm9yIGZ1bGwgY29udHJvbFxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgRWl0aGVyIGEgUmVnaXN0ZXJDb25maWcgb2JqZWN0IG9yIHJhdyBXZWJBdXRobiBjcmVhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29udGFpbmluZyB0aGUgcmVnaXN0cmF0aW9uIHJlc3BvbnNlIHdpdGggY3JlZGVudGlhbCBkZXRhaWxzXG4gICAqXG4gICAqIEB0aHJvd3Mge1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3J9IFdoZW4gV2ViQXV0aG4gaXMgbm90IHN1cHBvcnRlZFxuICAgKiBAdGhyb3dzIHtJbnZhbGlkT3B0aW9uc0Vycm9yfSBXaGVuIHByb3ZpZGVkIG9wdGlvbnMgYXJlIGludmFsaWRcbiAgICogQHRocm93cyB7VXNlckNhbmNlbGxlZEVycm9yfSBXaGVuIHVzZXIgY2FuY2VscyB0aGUgcmVnaXN0cmF0aW9uXG4gICAqIEB0aHJvd3Mge0F1dGhlbnRpY2F0b3JFcnJvcn0gV2hlbiBhdXRoZW50aWNhdG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAgICogQHRocm93cyB7VGltZW91dEVycm9yfSBXaGVuIHRoZSBvcGVyYXRpb24gdGltZXMgb3V0XG4gICAqIEB0aHJvd3Mge1NlY3VyaXR5RXJyb3J9IFdoZW4gYSBzZWN1cml0eSB2aW9sYXRpb24gb2NjdXJzXG4gICAqXG4gICAqIEBleGFtcGxlIFVzaW5nIGhpZ2gtbGV2ZWwgY29uZmlnOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbmZpZzogUmVnaXN0ZXJDb25maWcgPSB7XG4gICAqICAgcHJlc2V0OiAncGFzc2tleScsXG4gICAqICAgdXNlcjoge1xuICAgKiAgICAgaWQ6ICd1c2VyMTIzJyxcbiAgICogICAgIG5hbWU6ICd1c2VyQGV4YW1wbGUuY29tJyxcbiAgICogICAgIGRpc3BsYXlOYW1lOiAnSm9obiBEb2UnXG4gICAqICAgfSxcbiAgICogICBjaGFsbGVuZ2U6ICdyYW5kb20tY2hhbGxlbmdlJ1xuICAgKiB9O1xuICAgKlxuICAgKiB0aGlzLndlYkF1dGhuU2VydmljZS5yZWdpc3Rlcihjb25maWcpLnN1YnNjcmliZSh7XG4gICAqICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAqICAgICBjb25zb2xlLmxvZygnUmVnaXN0cmF0aW9uIHN1Y2Nlc3NmdWw6JywgcmVzcG9uc2UuY3JlZGVudGlhbC5pZCk7XG4gICAqICAgfSxcbiAgICogICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAqICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVc2VyQ2FuY2VsbGVkRXJyb3IpIHtcbiAgICogICAgICAgY29uc29sZS5sb2coJ1VzZXIgY2FuY2VsbGVkIHJlZ2lzdHJhdGlvbicpO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBVc2luZyBkaXJlY3Qgb3B0aW9uczpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBvcHRpb25zOiBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zID0ge1xuICAgKiAgIHJwOiB7IG5hbWU6IFwiRXhhbXBsZSBDb3JwXCIgfSxcbiAgICogICB1c2VyOiB7IGlkOiBuZXcgVWludDhBcnJheShbMSwyLDNdKSwgbmFtZTogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIGRpc3BsYXlOYW1lOiBcIlVzZXJcIiB9LFxuICAgKiAgIGNoYWxsZW5nZTogbmV3IFVpbnQ4QXJyYXkoWzQsNSw2XSksXG4gICAqICAgcHViS2V5Q3JlZFBhcmFtczogW3sgdHlwZTogXCJwdWJsaWMta2V5XCIsIGFsZzogLTcgfV1cbiAgICogfTtcbiAgICogdGhpcy53ZWJBdXRoblNlcnZpY2UucmVnaXN0ZXIob3B0aW9ucykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICogICAvLyBIYW5kbGUgcmVzcG9uc2VcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXIoaW5wdXQ6IFJlZ2lzdGVySW5wdXQpOiBPYnNlcnZhYmxlPFJlZ2lzdHJhdGlvblJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dlYkF1dGhuIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJ1xuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBjcmVhdGlvbk9wdGlvbnM6XG4gICAgICAgIHwgUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc1xuICAgICAgICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OO1xuXG4gICAgICBpZiAoaXNSZWdpc3RlckNvbmZpZyhpbnB1dCkpIHtcbiAgICAgICAgLy8gSGlnaC1sZXZlbCBjb25maWcgcGF0aDogdmFsaWRhdGUsIHJlc29sdmUgcHJlc2V0LCBidWlsZCBvcHRpb25zXG4gICAgICAgIHZhbGlkYXRlUmVnaXN0ZXJDb25maWcoaW5wdXQpO1xuICAgICAgICBjcmVhdGlvbk9wdGlvbnMgPSBidWlsZENyZWF0aW9uT3B0aW9uc0Zyb21Db25maWcoaW5wdXQsIHRoaXMuY29uZmlnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBvcHRpb25zIHBhdGg6IHVzZSBwcm92aWRlZCBvcHRpb25zXG4gICAgICAgIGNyZWF0aW9uT3B0aW9ucyA9IGlucHV0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWRPcHRpb25zID0gdGhpcy5wYXJzZVJlZ2lzdHJhdGlvbk9wdGlvbnMoY3JlYXRpb25PcHRpb25zKTtcblxuICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoeyBwdWJsaWNLZXk6IHBhcnNlZE9wdGlvbnMgfSlcbiAgICAgICkucGlwZShcbiAgICAgICAgbWFwKChjcmVkZW50aWFsKSA9PiB0aGlzLnByb2Nlc3NSZWdpc3RyYXRpb25SZXN1bHQoY3JlZGVudGlhbCkpLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4gdGhpcy5oYW5kbGVXZWJBdXRobkVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBJbnZhbGlkT3B0aW9uc0Vycm9yKFxuICAgICAgICAgICAgJ0ZhaWxlZCB0byBwcm9jZXNzIHJlZ2lzdHJhdGlvbiBpbnB1dCcsXG4gICAgICAgICAgICBlcnJvciBhcyBFcnJvclxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZXMgYSB1c2VyIHVzaW5nIGFuIGV4aXN0aW5nIFdlYkF1dGhuIGNyZWRlbnRpYWwuXG4gICAqXG4gICAqIFN1cHBvcnRzIHR3byBpbnB1dCBmb3JtYXRzOlxuICAgKiAxLiBIaWdoLWxldmVsIEF1dGhlbnRpY2F0ZUNvbmZpZyB3aXRoIHByZXNldCBzdXBwb3J0IGFuZCBhdXRvbWF0aWMgb3B0aW9uIGJ1aWxkaW5nXG4gICAqIDIuIERpcmVjdCBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMgZm9yIGZ1bGwgY29udHJvbFxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgRWl0aGVyIGFuIEF1dGhlbnRpY2F0ZUNvbmZpZyBvYmplY3Qgb3IgcmF3IFdlYkF1dGhuIHJlcXVlc3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHdpdGggYXNzZXJ0aW9uIGRldGFpbHNcbiAgICpcbiAgICogQHRocm93cyB7VW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcn0gV2hlbiBXZWJBdXRobiBpcyBub3Qgc3VwcG9ydGVkXG4gICAqIEB0aHJvd3Mge0ludmFsaWRPcHRpb25zRXJyb3J9IFdoZW4gcHJvdmlkZWQgb3B0aW9ucyBhcmUgaW52YWxpZFxuICAgKiBAdGhyb3dzIHtVc2VyQ2FuY2VsbGVkRXJyb3J9IFdoZW4gdXNlciBjYW5jZWxzIHRoZSBhdXRoZW50aWNhdGlvblxuICAgKiBAdGhyb3dzIHtBdXRoZW50aWNhdG9yRXJyb3J9IFdoZW4gYXV0aGVudGljYXRvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gICAqIEB0aHJvd3Mge1RpbWVvdXRFcnJvcn0gV2hlbiB0aGUgb3BlcmF0aW9uIHRpbWVzIG91dFxuICAgKiBAdGhyb3dzIHtTZWN1cml0eUVycm9yfSBXaGVuIGEgc2VjdXJpdHkgdmlvbGF0aW9uIG9jY3Vyc1xuICAgKlxuICAgKiBAZXhhbXBsZSBVc2luZyBoaWdoLWxldmVsIGNvbmZpZzpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb25maWc6IEF1dGhlbnRpY2F0ZUNvbmZpZyA9IHtcbiAgICogICBwcmVzZXQ6ICdwYXNza2V5JyxcbiAgICogICBjaGFsbGVuZ2U6ICdhdXRoLWNoYWxsZW5nZScsXG4gICAqICAgYWxsb3dDcmVkZW50aWFsczogWydjcmVkZW50aWFsLWlkLTEnLCAnY3JlZGVudGlhbC1pZC0yJ11cbiAgICogfTtcbiAgICpcbiAgICogdGhpcy53ZWJBdXRoblNlcnZpY2UuYXV0aGVudGljYXRlKGNvbmZpZykuc3Vic2NyaWJlKHtcbiAgICogICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdBdXRoZW50aWNhdGlvbiBzdWNjZXNzZnVsOicsIHJlc3BvbnNlLmNyZWRlbnRpYWwuaWQpO1xuICAgKiAgIH0sXG4gICAqICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgKiAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVXNlckNhbmNlbGxlZEVycm9yKSB7XG4gICAqICAgICAgIGNvbnNvbGUubG9nKCdVc2VyIGNhbmNlbGxlZCBhdXRoZW50aWNhdGlvbicpO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBVc2luZyBkaXJlY3Qgb3B0aW9uczpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBvcHRpb25zOiBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAqICAgY2hhbGxlbmdlOiBuZXcgVWludDhBcnJheShbMSwyLDNdKSxcbiAgICogICBhbGxvd0NyZWRlbnRpYWxzOiBbeyB0eXBlOiAncHVibGljLWtleScsIGlkOiBuZXcgVWludDhBcnJheShbNCw1LDZdKSB9XVxuICAgKiB9O1xuICAgKiB0aGlzLndlYkF1dGhuU2VydmljZS5hdXRoZW50aWNhdGUob3B0aW9ucykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICogICAvLyBIYW5kbGUgcmVzcG9uc2VcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXV0aGVudGljYXRlKGlucHV0OiBBdXRoZW50aWNhdGVJbnB1dCk6IE9ic2VydmFibGU8QXV0aGVudGljYXRpb25SZXNwb25zZT4ge1xuICAgIGlmICghdGhpcy5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcbiAgICAgICAgICAgICdXZWJBdXRobiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcidcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnM6XG4gICAgICAgIHwgUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zXG4gICAgICAgIHwgUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zSlNPTjtcblxuICAgICAgaWYgKGlzQXV0aGVudGljYXRlQ29uZmlnKGlucHV0KSkge1xuICAgICAgICB2YWxpZGF0ZUF1dGhlbnRpY2F0ZUNvbmZpZyhpbnB1dCk7XG4gICAgICAgIHJlcXVlc3RPcHRpb25zID0gYnVpbGRSZXF1ZXN0T3B0aW9uc0Zyb21Db25maWcoaW5wdXQsIHRoaXMuY29uZmlnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RPcHRpb25zID0gaW5wdXQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSB0aGlzLnBhcnNlQXV0aGVudGljYXRpb25PcHRpb25zKHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgcmV0dXJuIGZyb20obmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCh7IHB1YmxpY0tleTogcGFyc2VkT3B0aW9ucyB9KSkucGlwZShcbiAgICAgICAgbWFwKChjcmVkZW50aWFsKSA9PiB0aGlzLnByb2Nlc3NBdXRoZW50aWNhdGlvblJlc3VsdChjcmVkZW50aWFsKSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB0aGlzLmhhbmRsZVdlYkF1dGhuRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEludmFsaWRPcHRpb25zRXJyb3IoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIHByb2Nlc3MgYXV0aGVudGljYXRpb24gaW5wdXQnLFxuICAgICAgICAgICAgZXJyb3IgYXMgRXJyb3JcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgV2ViQXV0aG4gY3JlZGVudGlhbCB1c2luZyBvcHRpb25zIGZldGNoZWQgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFNlbmRzIHJlcXVlc3QgZGF0YSB2aWEgUE9TVCB0byB0aGUgY29uZmlndXJlZCByZWdpc3RyYXRpb24gZW5kcG9pbnQsXG4gICAqIHJlY2VpdmVzIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OLCB0aGVuIHByb2NlZWRzIHdpdGhcbiAgICogc3RhbmRhcmQgV2ViQXV0aG4gcmVnaXN0cmF0aW9uIGZsb3cuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IERhdGEgdG8gc2VuZCB0byBzZXJ2ZXIgKGNhbiBiZSBhbnkgb2JqZWN0IHlvdXIgc2VydmVyIGV4cGVjdHMpXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgY29uc3RyYWludCBmb3IgdGhlIHJlcXVlc3QgcGF5bG9hZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lzdHJhdGlvbiByZXNwb25zZVxuICAgKlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkT3B0aW9uc0Vycm9yfSBXaGVuIHJlbW90ZSByZWdpc3RyYXRpb24gZW5kcG9pbnQgaXMgbm90IGNvbmZpZ3VyZWRcbiAgICogQHRocm93cyB7UmVtb3RlRW5kcG9pbnRFcnJvcn0gV2hlbiBzZXJ2ZXIgcmVxdWVzdCBmYWlsc1xuICAgKiBAdGhyb3dzIHtJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yfSBXaGVuIHNlcnZlciByZXR1cm5zIGludmFsaWQgb3B0aW9uc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFNpbXBsZSByZXF1ZXN0XG4gICAqIHRoaXMud2ViQXV0aG5TZXJ2aWNlLnJlZ2lzdGVyUmVtb3RlKHtcbiAgICogICB1c2VybmFtZTogJ2pvaG4uZG9lQGV4YW1wbGUuY29tJ1xuICAgKiB9KS5zdWJzY3JpYmUocmVzcG9uc2UgPT4gY29uc29sZS5sb2coJ1N1Y2Nlc3M6JywgcmVzcG9uc2UpKTtcbiAgICpcbiAgICogLy8gVHlwZWQgcmVxdWVzdCB3aXRoIGFkZGl0aW9uYWwgY29udGV4dFxuICAgKiBpbnRlcmZhY2UgU2VydmVyUGF5bG9hZCB7XG4gICAqICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICogICBkZXBhcnRtZW50OiBzdHJpbmc7XG4gICAqIH1cbiAgICpcbiAgICogdGhpcy53ZWJBdXRoblNlcnZpY2UucmVnaXN0ZXJSZW1vdGU8U2VydmVyUGF5bG9hZD4oe1xuICAgKiAgIHRlbmFudElkOiAnYWNtZS1jb3JwJyxcbiAgICogICBkZXBhcnRtZW50OiAnZW5naW5lZXJpbmcnXG4gICAqIH0pLnN1YnNjcmliZShyZXNwb25zZSA9PiBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXNwb25zZSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlZ2lzdGVyUmVtb3RlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gICAgcmVxdWVzdDogUmVtb3RlUmVnaXN0cmF0aW9uUmVxdWVzdDxUPlxuICApOiBPYnNlcnZhYmxlPFJlZ2lzdHJhdGlvblJlc3BvbnNlPiB7XG4gICAgdGhpcy52YWxpZGF0ZVJlbW90ZVJlZ2lzdHJhdGlvbkNvbmZpZygpO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmNvbmZpZy5yZW1vdGVFbmRwb2ludHMhLnJlZ2lzdHJhdGlvbiE7XG4gICAgY29uc3QgdGltZW91dE1zID1cbiAgICAgIHRoaXMuY29uZmlnLnJlbW90ZUVuZHBvaW50cz8ucmVxdWVzdE9wdGlvbnM/LnRpbWVvdXQgfHwgMTAwMDA7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zSlNPTj4oZW5kcG9pbnQsIHJlcXVlc3QpXG4gICAgICAucGlwZShcbiAgICAgICAgdGltZW91dCh0aW1lb3V0TXMpLFxuICAgICAgICBtYXAoKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICB2YWxpZGF0ZVJlbW90ZUNyZWF0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgob3B0aW9ucykgPT4gdGhpcy5yZWdpc3RlcihvcHRpb25zKSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PlxuICAgICAgICAgIHRoaXMuaGFuZGxlUmVtb3RlRXJyb3IoZXJyb3IsIGVuZHBvaW50LCAncmVnaXN0cmF0aW9uJylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHVzaW5nIFdlYkF1dGhuIHdpdGggb3B0aW9ucyBmZXRjaGVkIGZyb20gYSByZW1vdGUgc2VydmVyLlxuICAgKlxuICAgKiBTZW5kcyByZXF1ZXN0IGRhdGEgdmlhIFBPU1QgdG8gdGhlIGNvbmZpZ3VyZWQgYXV0aGVudGljYXRpb24gZW5kcG9pbnQsXG4gICAqIHJlY2VpdmVzIFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0pTT04sIHRoZW4gcHJvY2VlZHMgd2l0aFxuICAgKiBzdGFuZGFyZCBXZWJBdXRobiBhdXRoZW50aWNhdGlvbiBmbG93LlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBPcHRpb25hbCBkYXRhIHRvIHNlbmQgdG8gc2VydmVyIChkZWZhdWx0cyB0byBlbXB0eSBvYmplY3QpXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgY29uc3RyYWludCBmb3IgdGhlIHJlcXVlc3QgcGF5bG9hZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlXG4gICAqXG4gICAqIEB0aHJvd3Mge0ludmFsaWRPcHRpb25zRXJyb3J9IFdoZW4gcmVtb3RlIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50IGlzIG5vdCBjb25maWd1cmVkXG4gICAqIEB0aHJvd3Mge1JlbW90ZUVuZHBvaW50RXJyb3J9IFdoZW4gc2VydmVyIHJlcXVlc3QgZmFpbHNcbiAgICogQHRocm93cyB7SW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcn0gV2hlbiBzZXJ2ZXIgcmV0dXJucyBpbnZhbGlkIG9wdGlvbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW1wbGUgcmVxdWVzdFxuICAgKiB0aGlzLndlYkF1dGhuU2VydmljZS5hdXRoZW50aWNhdGVSZW1vdGUoe1xuICAgKiAgIHVzZXJuYW1lOiAnam9obi5kb2VAZXhhbXBsZS5jb20nXG4gICAqIH0pLnN1YnNjcmliZShyZXNwb25zZSA9PiBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXNwb25zZSkpO1xuICAgKlxuICAgKiAvLyBSZXF1ZXN0IHdpdGggbm8gcGF5bG9hZCAoc2VydmVyIHVzZXMgc2Vzc2lvbi9jb250ZXh0KVxuICAgKiB0aGlzLndlYkF1dGhuU2VydmljZS5hdXRoZW50aWNhdGVSZW1vdGUoKVxuICAgKiAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4gY29uc29sZS5sb2coJ1N1Y2Nlc3M6JywgcmVzcG9uc2UpKTtcbiAgICogYGBgXG4gICAqL1xuICBhdXRoZW50aWNhdGVSZW1vdGU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgICByZXF1ZXN0OiBSZW1vdGVBdXRoZW50aWNhdGlvblJlcXVlc3Q8VD4gPSB7fSBhcyBUXG4gICk6IE9ic2VydmFibGU8QXV0aGVudGljYXRpb25SZXNwb25zZT4ge1xuICAgIHRoaXMudmFsaWRhdGVSZW1vdGVBdXRoZW50aWNhdGlvbkNvbmZpZygpO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmNvbmZpZy5yZW1vdGVFbmRwb2ludHMhLmF1dGhlbnRpY2F0aW9uITtcbiAgICBjb25zdCB0aW1lb3V0TXMgPVxuICAgICAgdGhpcy5jb25maWcucmVtb3RlRW5kcG9pbnRzPy5yZXF1ZXN0T3B0aW9ucz8udGltZW91dCB8fCAxMDAwMDtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0pTT04+KGVuZHBvaW50LCByZXF1ZXN0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRpbWVvdXQodGltZW91dE1zKSxcbiAgICAgICAgbWFwKChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdGVSZW1vdGVSZXF1ZXN0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgob3B0aW9ucykgPT4gdGhpcy5hdXRoZW50aWNhdGUob3B0aW9ucykpLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT5cbiAgICAgICAgICB0aGlzLmhhbmRsZVJlbW90ZUVycm9yKGVycm9yLCBlbmRwb2ludCwgJ2F1dGhlbnRpY2F0aW9uJylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCByZW1vdGUgcmVnaXN0cmF0aW9uIGVuZHBvaW50IGlzIGNvbmZpZ3VyZWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZW1vdGVSZWdpc3RyYXRpb25Db25maWcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5yZW1vdGVFbmRwb2ludHM/LnJlZ2lzdHJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRPcHRpb25zRXJyb3IoXG4gICAgICAgICdSZW1vdGUgcmVnaXN0cmF0aW9uIGVuZHBvaW50IG5vdCBjb25maWd1cmVkLiBBZGQgcmVtb3RlRW5kcG9pbnRzLnJlZ2lzdHJhdGlvbiB0byB5b3VyIFdlYkF1dGhuIGNvbmZpZy4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCByZW1vdGUgYXV0aGVudGljYXRpb24gZW5kcG9pbnQgaXMgY29uZmlndXJlZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlbW90ZUF1dGhlbnRpY2F0aW9uQ29uZmlnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcucmVtb3RlRW5kcG9pbnRzPy5hdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRPcHRpb25zRXJyb3IoXG4gICAgICAgICdSZW1vdGUgYXV0aGVudGljYXRpb24gZW5kcG9pbnQgbm90IGNvbmZpZ3VyZWQuIEFkZCByZW1vdGVFbmRwb2ludHMuYXV0aGVudGljYXRpb24gdG8geW91ciBXZWJBdXRobiBjb25maWcuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBlcnJvcnMgZnJvbSByZW1vdGUgSFRUUCByZXF1ZXN0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVSZW1vdGVFcnJvcihcbiAgICBlcnJvcjogYW55LFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogJ3JlZ2lzdHJhdGlvbicgfCAnYXV0aGVudGljYXRpb24nXG4gICk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgY29uc3QgY29udGV4dDogUmVtb3RlRXJyb3JDb250ZXh0ID0ge1xuICAgICAgICB1cmwsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIHN0YXR1czogZXJyb3Iuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiBlcnJvci5zdGF0dXNUZXh0LFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IFJlbW90ZUVuZHBvaW50RXJyb3IoYCR7b3BlcmF0aW9ufSByZXF1ZXN0IGZhaWxlZGAsIGNvbnRleHQsIGVycm9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yIGluc3RhbmNlcyAodmFsaWRhdGlvbiBlcnJvcnMpXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW52YWxpZFJlbW90ZU9wdGlvbnNFcnJvcikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IFdlYkF1dGhuRXJyb3IoXG4gICAgICAgICAgV2ViQXV0aG5FcnJvclR5cGUuVU5LTk9XTixcbiAgICAgICAgICBgVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgcmVtb3RlICR7b3BlcmF0aW9ufWAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuZCBub3JtYWxpemVzIHJlZ2lzdHJhdGlvbiBvcHRpb25zIGZyb20gZWl0aGVyIG5hdGl2ZSBvciBKU09OIGZvcm1hdC5cbiAgICogQ29udmVydHMgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5ncyB0byBVaW50OEFycmF5IHdoZXJlIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgUmVnaXN0cmF0aW9uIG9wdGlvbnMgaW4gZWl0aGVyIG5hdGl2ZSBvciBKU09OIGZvcm1hdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgZm9yIGJyb3dzZXIgQVBJXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUmVnaXN0cmF0aW9uT3B0aW9ucyhcbiAgICBvcHRpb25zOlxuICAgICAgfCBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zXG4gICAgICB8IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OXG4gICk6IFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMge1xuICAgIGlmIChpc0pTT05PcHRpb25zKG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gUHVibGljS2V5Q3JlZGVudGlhbC5wYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OKFxuICAgICAgICBvcHRpb25zIGFzIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNKU09OXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9ucyBhcyBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW5kIG5vcm1hbGl6ZXMgYXV0aGVudGljYXRpb24gb3B0aW9ucyBmcm9tIGVpdGhlciBuYXRpdmUgb3IgSlNPTiBmb3JtYXQuXG4gICAqIENvbnZlcnRzIGJhc2U2NHVybC1lbmNvZGVkIHN0cmluZ3MgdG8gVWludDhBcnJheSB3aGVyZSBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIEF1dGhlbnRpY2F0aW9uIG9wdGlvbnMgaW4gZWl0aGVyIG5hdGl2ZSBvciBKU09OIGZvcm1hdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyBmb3IgYnJvd3NlciBBUElcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2VBdXRoZW50aWNhdGlvbk9wdGlvbnMoXG4gICAgb3B0aW9uczpcbiAgICAgIHwgUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zXG4gICAgICB8IFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0pTT05cbiAgKTogUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIHtcbiAgICBpZiAoaXNKU09OT3B0aW9ucyhvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIFB1YmxpY0tleUNyZWRlbnRpYWwucGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OKFxuICAgICAgICBvcHRpb25zIGFzIFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0pTT05cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zIGFzIFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGNyZWRlbnRpYWwgaXMgYSB2YWxpZCBQdWJsaWNLZXlDcmVkZW50aWFsLlxuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbCBSYXcgY3JlZGVudGlhbCBmcm9tIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKVxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgUHVibGljS2V5Q3JlZGVudGlhbFxuICAgKiBAdGhyb3dzIHtBdXRoZW50aWNhdG9yRXJyb3J9IFdoZW4gY3JlZGVudGlhbCBpcyBpbnZhbGlkIG9yIG51bGxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZWdpc3RyYXRpb25DcmVkZW50aWFsKFxuICAgIGNyZWRlbnRpYWw6IENyZWRlbnRpYWwgfCBudWxsXG4gICk6IFB1YmxpY0tleUNyZWRlbnRpYWwge1xuICAgIGlmICghaXNQdWJsaWNLZXlDcmVkZW50aWFsKGNyZWRlbnRpYWwpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRvckVycm9yKCdObyBjcmVkZW50aWFsIHJldHVybmVkIGZyb20gYXV0aGVudGljYXRvcicpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlZGVudGlhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBiYXNpYyBjcmVkZW50aWFsIGluZm9ybWF0aW9uIChJRCBhbmQgdHJhbnNwb3J0cykuXG4gICAqXG4gICAqIEBwYXJhbSBjcmVkZW50aWFsIFZhbGlkYXRlZCBQdWJsaWNLZXlDcmVkZW50aWFsXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGNyZWRlbnRpYWwgSUQgYW5kIHN1cHBvcnRlZCB0cmFuc3BvcnRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RDcmVkZW50aWFsSW5mbyhjcmVkZW50aWFsOiBQdWJsaWNLZXlDcmVkZW50aWFsKToge1xuICAgIGNyZWRlbnRpYWxJZDogc3RyaW5nO1xuICAgIHRyYW5zcG9ydHM6IEF1dGhlbnRpY2F0b3JUcmFuc3BvcnRbXTtcbiAgfSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjcmVkZW50aWFsLnJlc3BvbnNlIGFzIEF1dGhlbnRpY2F0b3JBdHRlc3RhdGlvblJlc3BvbnNlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWRlbnRpYWxJZDogYXJyYXlCdWZmZXJUb0Jhc2U2NHVybChjcmVkZW50aWFsLnJhd0lkKSxcbiAgICAgIHRyYW5zcG9ydHM6IChyZXNwb25zZS5nZXRUcmFuc3BvcnRzPy4oKSB8fFxuICAgICAgICBbXSkgYXMgQXV0aGVudGljYXRvclRyYW5zcG9ydFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGV4dHJhY3RzIHRoZSBwdWJsaWMga2V5IHdpdGggcHJvcGVyIGVycm9yIGhhbmRsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgQXV0aGVudGljYXRvckF0dGVzdGF0aW9uUmVzcG9uc2VcbiAgICogQHJldHVybnMgUHVibGljIGtleSBhcyBiYXNlNjR1cmwgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgZXh0cmFjdGlvbiBmYWlsc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0UHVibGljS2V5KFxuICAgIHJlc3BvbnNlOiBBdXRoZW50aWNhdG9yQXR0ZXN0YXRpb25SZXNwb25zZVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwdWJsaWNLZXlCdWZmZXIgPSByZXNwb25zZS5nZXRQdWJsaWNLZXk/LigpO1xuICAgICAgaWYgKHB1YmxpY0tleUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gYXJyYXlCdWZmZXJUb0Jhc2U2NHVybChwdWJsaWNLZXlCdWZmZXIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUHVibGljIGtleSBleHRyYWN0aW9uIGZhaWxlZCAtIHRoaXMgaXMgb2theSwgbm90IGFsbCBhbGdvcml0aG1zIGFyZSBzdXBwb3J0ZWRcbiAgICAgIC8vIFNvbWUgYXV0aGVudGljYXRvcnMgb3IgYWxnb3JpdGhtcyBkb24ndCBwcm92aWRlIGV4dHJhY3RhYmxlIHB1YmxpYyBrZXlzXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBjb21wbGV0ZSByYXcgV2ViQXV0aG4gcmVzcG9uc2UgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcy5cbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBXZWJBdXRobiBkYXRhIGluY2x1ZGluZyBhdHRlc3RhdGlvbiBvYmplY3RzIGFuZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGNyZWRlbnRpYWwgVmFsaWRhdGVkIFB1YmxpY0tleUNyZWRlbnRpYWxcbiAgICogQHBhcmFtIGNyZWRlbnRpYWxJZCBBbHJlYWR5IGV4dHJhY3RlZCBjcmVkZW50aWFsIElEXG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgRXh0cmFjdGVkIHB1YmxpYyBrZXkgKG1heSBiZSB1bmRlZmluZWQpXG4gICAqIEByZXR1cm5zIENvbXBsZXRlIFdlYkF1dGhuUmVnaXN0cmF0aW9uUmVzdWx0IHdpdGggYWxsIFdlYkF1dGhuIGRhdGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUmF3UmVnaXN0cmF0aW9uUmVzcG9uc2UoXG4gICAgY3JlZGVudGlhbDogUHVibGljS2V5Q3JlZGVudGlhbCxcbiAgICBjcmVkZW50aWFsSWQ6IHN0cmluZyxcbiAgICBwdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBXZWJBdXRoblJlZ2lzdHJhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjcmVkZW50aWFsLnJlc3BvbnNlIGFzIEF1dGhlbnRpY2F0b3JBdHRlc3RhdGlvblJlc3BvbnNlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWRlbnRpYWxJZCxcbiAgICAgIHB1YmxpY0tleTogcHVibGljS2V5IHx8IGFycmF5QnVmZmVyVG9CYXNlNjR1cmwobmV3IEFycmF5QnVmZmVyKDApKSwgLy8gQ2xlYW4gZmFsbGJhY2tcbiAgICAgIGF0dGVzdGF0aW9uT2JqZWN0OiBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKHJlc3BvbnNlLmF0dGVzdGF0aW9uT2JqZWN0KSxcbiAgICAgIGNsaWVudERhdGFKU09OOiBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKHJlc3BvbnNlLmNsaWVudERhdGFKU09OKSxcbiAgICAgIHRyYW5zcG9ydHM6IChyZXNwb25zZS5nZXRUcmFuc3BvcnRzPy4oKSB8fFxuICAgICAgICBbXSkgYXMgQXV0aGVudGljYXRvclRyYW5zcG9ydFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGVzIHRoZSBmaW5hbCByZWdpc3RyYXRpb24gcmVzcG9uc2UuXG4gICAqIENvbWJpbmVzIGFsbCBleHRyYWN0ZWQgZGF0YSBpbnRvIHRoZSBmaW5hbCByZXNwb25zZSBmb3JtYXQuXG4gICAqXG4gICAqIEBwYXJhbSBjcmVkZW50aWFsSW5mbyBCYXNpYyBjcmVkZW50aWFsIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgRXh0cmFjdGVkIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHJhd1Jlc3BvbnNlIFJhdyBXZWJBdXRobiByZXNwb25zZVxuICAgKiBAcmV0dXJucyBDb21wbGV0ZSBSZWdpc3RyYXRpb25SZXNwb25zZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlbWJsZVJlZ2lzdHJhdGlvblJlc3BvbnNlKFxuICAgIGNyZWRlbnRpYWxJbmZvOiB7XG4gICAgICBjcmVkZW50aWFsSWQ6IHN0cmluZztcbiAgICAgIHRyYW5zcG9ydHM6IEF1dGhlbnRpY2F0b3JUcmFuc3BvcnRbXTtcbiAgICB9LFxuICAgIHB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJhd1Jlc3BvbnNlOiBXZWJBdXRoblJlZ2lzdHJhdGlvblJlc3VsdFxuICApOiBSZWdpc3RyYXRpb25SZXNwb25zZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBjcmVkZW50aWFsSWQ6IGNyZWRlbnRpYWxJbmZvLmNyZWRlbnRpYWxJZCxcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHRyYW5zcG9ydHM6IGNyZWRlbnRpYWxJbmZvLnRyYW5zcG9ydHMsXG4gICAgICByYXdSZXNwb25zZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyB0aGUgcmVzdWx0IG9mIGEgV2ViQXV0aG4gcmVnaXN0cmF0aW9uIG9wZXJhdGlvbi5cbiAgICogQ29udmVydHMgdGhlIGJyb3dzZXIgY3JlZGVudGlhbCByZXNwb25zZSBpbnRvIGEgc3RydWN0dXJlZCBSZWdpc3RyYXRpb25SZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIGNyZWRlbnRpYWwgVGhlIGNyZWRlbnRpYWwgcmV0dXJuZWQgYnkgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpXG4gICAqIEByZXR1cm5zIFN0cnVjdHVyZWQgcmVnaXN0cmF0aW9uIHJlc3BvbnNlIHdpdGggcGFyc2VkIGNyZWRlbnRpYWwgZGF0YVxuICAgKiBAdGhyb3dzIHtBdXRoZW50aWNhdG9yRXJyb3J9IFdoZW4gY3JlZGVudGlhbCBjcmVhdGlvbiBmYWlscyBvciByZXR1cm5zIG51bGxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1JlZ2lzdHJhdGlvblJlc3VsdChcbiAgICBjcmVkZW50aWFsOiBDcmVkZW50aWFsIHwgbnVsbFxuICApOiBSZWdpc3RyYXRpb25SZXNwb25zZSB7XG4gICAgY29uc3QgdmFsaWRDcmVkZW50aWFsID0gdGhpcy52YWxpZGF0ZVJlZ2lzdHJhdGlvbkNyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAgY29uc3QgY3JlZGVudGlhbEluZm8gPSB0aGlzLmV4dHJhY3RDcmVkZW50aWFsSW5mbyh2YWxpZENyZWRlbnRpYWwpO1xuICAgIGNvbnN0IHJlc3BvbnNlID1cbiAgICAgIHZhbGlkQ3JlZGVudGlhbC5yZXNwb25zZSBhcyBBdXRoZW50aWNhdG9yQXR0ZXN0YXRpb25SZXNwb25zZTtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSB0aGlzLmV4dHJhY3RQdWJsaWNLZXkocmVzcG9uc2UpO1xuICAgIGNvbnN0IHJhd1Jlc3BvbnNlID0gdGhpcy5jcmVhdGVSYXdSZWdpc3RyYXRpb25SZXNwb25zZShcbiAgICAgIHZhbGlkQ3JlZGVudGlhbCxcbiAgICAgIGNyZWRlbnRpYWxJbmZvLmNyZWRlbnRpYWxJZCxcbiAgICAgIHB1YmxpY0tleVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5hc3NlbWJsZVJlZ2lzdHJhdGlvblJlc3BvbnNlKFxuICAgICAgY3JlZGVudGlhbEluZm8sXG4gICAgICBwdWJsaWNLZXksXG4gICAgICByYXdSZXNwb25zZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIHRoZSByZXN1bHQgb2YgYSBXZWJBdXRobiBhdXRoZW50aWNhdGlvbiBvcGVyYXRpb24uXG4gICAqIENvbnZlcnRzIHRoZSBicm93c2VyIGNyZWRlbnRpYWwgcmVzcG9uc2UgaW50byBhIHN0cnVjdHVyZWQgQXV0aGVudGljYXRpb25SZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIGNyZWRlbnRpYWwgVGhlIGNyZWRlbnRpYWwgcmV0dXJuZWQgYnkgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpXG4gICAqIEByZXR1cm5zIFN0cnVjdHVyZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2Ugd2l0aCBwYXJzZWQgYXNzZXJ0aW9uIGRhdGFcbiAgICogQHRocm93cyB7QXV0aGVudGljYXRvckVycm9yfSBXaGVuIGF1dGhlbnRpY2F0aW9uIGZhaWxzIG9yIHJldHVybnMgbnVsbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzQXV0aGVudGljYXRpb25SZXN1bHQoXG4gICAgY3JlZGVudGlhbDogQ3JlZGVudGlhbCB8IG51bGxcbiAgKTogQXV0aGVudGljYXRpb25SZXNwb25zZSB7XG4gICAgaWYgKCFpc1B1YmxpY0tleUNyZWRlbnRpYWwoY3JlZGVudGlhbCkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdG9yRXJyb3IoJ05vIGNyZWRlbnRpYWwgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdG9yJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBjcmVkZW50aWFsLnJlc3BvbnNlIGFzIEF1dGhlbnRpY2F0b3JBc3NlcnRpb25SZXNwb25zZTtcbiAgICBjb25zdCBjcmVkZW50aWFsSWQgPSBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKGNyZWRlbnRpYWwucmF3SWQpO1xuXG4gICAgbGV0IHVzZXJIYW5kbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVzcG9uc2UudXNlckhhbmRsZSkge1xuICAgICAgdXNlckhhbmRsZSA9IGFycmF5QnVmZmVyVG9CYXNlNjR1cmwocmVzcG9uc2UudXNlckhhbmRsZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wbGV0ZSByYXcgcmVzcG9uc2UgZm9yIGFkdmFuY2VkIHVzZSBjYXNlc1xuICAgIGNvbnN0IHJhd1Jlc3BvbnNlOiBXZWJBdXRobkF1dGhlbnRpY2F0aW9uUmVzdWx0ID0ge1xuICAgICAgY3JlZGVudGlhbElkLFxuICAgICAgYXV0aGVudGljYXRvckRhdGE6IGFycmF5QnVmZmVyVG9CYXNlNjR1cmwocmVzcG9uc2UuYXV0aGVudGljYXRvckRhdGEpLFxuICAgICAgY2xpZW50RGF0YUpTT046IGFycmF5QnVmZmVyVG9CYXNlNjR1cmwocmVzcG9uc2UuY2xpZW50RGF0YUpTT04pLFxuICAgICAgc2lnbmF0dXJlOiBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsKHJlc3BvbnNlLnNpZ25hdHVyZSksXG4gICAgICB1c2VySGFuZGxlLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGNyZWRlbnRpYWxJZCxcbiAgICAgIHVzZXJIYW5kbGUsXG4gICAgICByYXdSZXNwb25zZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENlbnRyYWwgZXJyb3IgaGFuZGxpbmcgZGlzcGF0Y2hlciBmb3IgV2ViQXV0aG4gb3BlcmF0aW9ucy5cbiAgICogUm91dGVzIGRpZmZlcmVudCBlcnJvciB0eXBlcyB0byBzcGVjaWFsaXplZCBoYW5kbGVycyBmb3IgcHJvcGVyIGVycm9yIGNsYXNzaWZpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGhhbmRsZSAoY2FuIGJlIERPTUV4Y2VwdGlvbiwgVHlwZUVycm9yLCBvciBhbnkgb3RoZXIgZXJyb3IpXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCB0aHJvd3MgYW4gYXBwcm9wcmlhdGUgV2ViQXV0aG5FcnJvciBzdWJjbGFzc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVXZWJBdXRobkVycm9yKGVycm9yOiB1bmtub3duKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRE9NRXhjZXB0aW9uKGVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0pTT05QYXJzaW5nRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVKU09OUGFyc2luZ0Vycm9yKGVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVVbmtub3duRXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgRE9NRXhjZXB0aW9ucyBmcm9tIHRoZSBXZWJBdXRobiBBUEkgdXNpbmcgYSBtYXBwaW5nIGFwcHJvYWNoLlxuICAgKiBNYXBzIHNwZWNpZmljIERPTUV4Y2VwdGlvbiBuYW1lcyB0byBhcHByb3ByaWF0ZSBXZWJBdXRobkVycm9yIHN1YmNsYXNzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgRE9NRXhjZXB0aW9uIHRocm93biBieSB0aGUgV2ViQXV0aG4gQVBJXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCB0aHJvd3MgYW4gYXBwcm9wcmlhdGUgV2ViQXV0aG5FcnJvciBzdWJjbGFzc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVET01FeGNlcHRpb24oZXJyb3I6IERPTUV4Y2VwdGlvbik6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICBjb25zdCBlcnJvck1hcDogUmVjb3JkPHN0cmluZywgKCkgPT4gV2ViQXV0aG5FcnJvcj4gPSB7XG4gICAgICBOb3RBbGxvd2VkRXJyb3I6ICgpID0+IG5ldyBVc2VyQ2FuY2VsbGVkRXJyb3IoZXJyb3IpLFxuICAgICAgSW52YWxpZFN0YXRlRXJyb3I6ICgpID0+XG4gICAgICAgIG5ldyBBdXRoZW50aWNhdG9yRXJyb3IoJ0ludmFsaWQgYXV0aGVudGljYXRvciBzdGF0ZScsIGVycm9yKSxcbiAgICAgIE5vdFN1cHBvcnRlZEVycm9yOiAoKSA9PlxuICAgICAgICBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcignT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQnLCBlcnJvciksXG4gICAgICBTZWN1cml0eUVycm9yOiAoKSA9PiBuZXcgU2VjdXJpdHlFcnJvcignU2VjdXJpdHkgZXJyb3Igb2NjdXJyZWQnLCBlcnJvciksXG4gICAgICBUaW1lb3V0RXJyb3I6ICgpID0+IG5ldyBUaW1lb3V0RXJyb3IoJ09wZXJhdGlvbiB0aW1lZCBvdXQnLCBlcnJvciksXG4gICAgICBFbmNvZGluZ0Vycm9yOiAoKSA9PlxuICAgICAgICBuZXcgSW52YWxpZE9wdGlvbnNFcnJvcignRW5jb2RpbmcgZXJyb3IgaW4gb3B0aW9ucycsIGVycm9yKSxcbiAgICB9O1xuXG4gICAgY29uc3QgZXJyb3JGYWN0b3J5ID0gZXJyb3JNYXBbZXJyb3IubmFtZV07XG4gICAgY29uc3Qgd2ViQXV0aG5FcnJvciA9IGVycm9yRmFjdG9yeVxuICAgICAgPyBlcnJvckZhY3RvcnkoKVxuICAgICAgOiBuZXcgV2ViQXV0aG5FcnJvcihcbiAgICAgICAgICBXZWJBdXRobkVycm9yVHlwZS5VTktOT1dOLFxuICAgICAgICAgIGBVbmtub3duIFdlYkF1dGhuIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuXG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gd2ViQXV0aG5FcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhbiBlcnJvciBpcyByZWxhdGVkIHRvIEpTT04gcGFyc2luZyBpc3N1ZXMuXG4gICAqIFNwZWNpZmljYWxseSBjaGVja3MgZm9yIFR5cGVFcnJvciBtZXNzYWdlcyBpbmRpY2F0aW5nIEpTT04gcGFyc2luZyBmYWlsdXJlcy5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlcnJvciBpcyBhIEpTT04gcGFyc2luZyBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGlzSlNPTlBhcnNpbmdFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxuICAgICAgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ3BhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT04nKSB8fFxuICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdwYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04nKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgSlNPTiBwYXJzaW5nIGVycm9ycyBzcGVjaWZpY2FsbHkuXG4gICAqIFRoZXNlIGVycm9ycyBvY2N1ciB3aGVuIGludmFsaWQgSlNPTiBmb3JtYXQgb3B0aW9ucyBhcmUgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgVHlwZUVycm9yIGZyb20gSlNPTiBwYXJzaW5nXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCB0aHJvd3MgYW4gSW52YWxpZE9wdGlvbnNFcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVKU09OUGFyc2luZ0Vycm9yKGVycm9yOiB1bmtub3duKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyBpdCdzIGEgVHlwZUVycm9yIGZyb20gaXNKU09OUGFyc2luZ0Vycm9yIGNoZWNrXG4gICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgSW52YWxpZE9wdGlvbnNFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OIG9wdGlvbnMgZm9ybWF0JyxcbiAgICAgICAgICBlcnJvciBhcyBUeXBlRXJyb3JcbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbnkgdW5leHBlY3RlZCBlcnJvcnMgdGhhdCBkb24ndCBmYWxsIGludG8gb3RoZXIgY2F0ZWdvcmllcy5cbiAgICogUHJvdmlkZXMgYSBmYWxsYmFjayBmb3IgZXJyb3JzIHRoYXQgYXJlbid0IERPTUV4Y2VwdGlvbnMgb3IgSlNPTiBwYXJzaW5nIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIFRoZSB1bmV4cGVjdGVkIGVycm9yXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCB0aHJvd3MgYSBnZW5lcmljIFdlYkF1dGhuRXJyb3JcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlVW5rbm93bkVycm9yKGVycm9yOiB1bmtub3duKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvciBvY2N1cnJlZCc7XG4gICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgV2ViQXV0aG5FcnJvcihcbiAgICAgICAgICBXZWJBdXRobkVycm9yVHlwZS5VTktOT1dOLFxuICAgICAgICAgIGBVbmV4cGVjdGVkIGVycm9yOiAke21lc3NhZ2V9YCxcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSlcbiAgICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==","/**\n * WebAuthn Providers\n * Modern Angular standalone provider function for WebAuthn service\n */\nimport { WebAuthnService } from '../services/webauthn.service';\nimport { WEBAUTHN_CONFIG, createWebAuthnConfig, } from '../model/service-config';\n/**\n * Provides WebAuthn service with required relying party configuration\n *\n * @param relyingParty Required relying party configuration\n * @param config Optional configuration overrides\n * @returns Array of providers for WebAuthn functionality\n *\n * @example\n * ```typescript\n * // main.ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideWebAuthn(\n * { name: 'My App', id: 'myapp.com' },\n * { defaultTimeout: 30000 }\n * )\n * ]\n * });\n * ```\n */\nexport function provideWebAuthn(relyingParty, config = {}) {\n return [\n {\n provide: WEBAUTHN_CONFIG,\n useValue: createWebAuthnConfig(relyingParty, config),\n },\n WebAuthnService,\n ];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4ucHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL2xpYi9wcm92aWRlcnMvd2ViYXV0aG4ucHJvdmlkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBR0wsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsWUFBZ0MsRUFDaEMsU0FBd0QsRUFBRTtJQUUxRCxPQUFPO1FBQ0w7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixRQUFRLEVBQUUsb0JBQW9CLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQztTQUNyRDtRQUNELGVBQWU7S0FDaEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdlYkF1dGhuIFByb3ZpZGVyc1xuICogTW9kZXJuIEFuZ3VsYXIgc3RhbmRhbG9uZSBwcm92aWRlciBmdW5jdGlvbiBmb3IgV2ViQXV0aG4gc2VydmljZVxuICovXG5cbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXZWJBdXRoblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy93ZWJhdXRobi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFdlYkF1dGhuQ29uZmlnLFxuICBSZWx5aW5nUGFydHlDb25maWcsXG4gIFdFQkFVVEhOX0NPTkZJRyxcbiAgY3JlYXRlV2ViQXV0aG5Db25maWcsXG59IGZyb20gJy4uL21vZGVsL3NlcnZpY2UtY29uZmlnJztcblxuLyoqXG4gKiBQcm92aWRlcyBXZWJBdXRobiBzZXJ2aWNlIHdpdGggcmVxdWlyZWQgcmVseWluZyBwYXJ0eSBjb25maWd1cmF0aW9uXG4gKlxuICogQHBhcmFtIHJlbHlpbmdQYXJ0eSBSZXF1aXJlZCByZWx5aW5nIHBhcnR5IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvdmVycmlkZXNcbiAqIEByZXR1cm5zIEFycmF5IG9mIHByb3ZpZGVycyBmb3IgV2ViQXV0aG4gZnVuY3Rpb25hbGl0eVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBtYWluLnRzXG4gKiBib290c3RyYXBBcHBsaWNhdGlvbihBcHBDb21wb25lbnQsIHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgcHJvdmlkZVdlYkF1dGhuKFxuICogICAgICAgeyBuYW1lOiAnTXkgQXBwJywgaWQ6ICdteWFwcC5jb20nIH0sXG4gKiAgICAgICB7IGRlZmF1bHRUaW1lb3V0OiAzMDAwMCB9XG4gKiAgICAgKVxuICogICBdXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVdlYkF1dGhuKFxuICByZWx5aW5nUGFydHk6IFJlbHlpbmdQYXJ0eUNvbmZpZyxcbiAgY29uZmlnOiBQYXJ0aWFsPE9taXQ8V2ViQXV0aG5Db25maWcsICdyZWx5aW5nUGFydHknPj4gPSB7fVxuKTogUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogV0VCQVVUSE5fQ09ORklHLFxuICAgICAgdXNlVmFsdWU6IGNyZWF0ZVdlYkF1dGhuQ29uZmlnKHJlbHlpbmdQYXJ0eSwgY29uZmlnKSxcbiAgICB9LFxuICAgIFdlYkF1dGhuU2VydmljZSxcbiAgXTtcbn1cbiJdfQ==","// Core service\nexport { WebAuthnService } from './lib/services/webauthn.service';\nexport { WEBAUTHN_CONFIG, createWebAuthnConfig, DEFAULT_WEBAUTHN_CONFIG, } from './lib/model/service-config';\n// Providers\nexport { provideWebAuthn } from './lib/providers/webauthn.providers';\n// Error types for enhanced error handling\nexport { WebAuthnError, WebAuthnErrorType, UserCancelledError, AuthenticatorError, InvalidOptionsError, UnsupportedOperationError, SecurityError, TimeoutError, NetworkError, RemoteEndpointError, InvalidRemoteOptionsError, } from './lib/errors/webauthn.errors';\n// Utility functions\nexport { arrayBufferToBase64url, base64urlToArrayBuffer, arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString, generateChallenge, generateUserId, credentialIdToArrayBuffer, arrayBufferToCredentialId, isWebAuthnSupported, isPlatformAuthenticatorAvailable, getSupportedTransports, validateRegistrationOptions, getDefaultPubKeyCredParams, isJSONOptions, isPublicKeyCredential, } from './lib/utils/webauthn.utils';\n// Remote validation utilities\nexport { validateRemoteCreationOptions, validateRemoteRequestOptions, } from './lib/utils/remote.utils';\n// Type guards\nexport { isRegisterConfig, isAuthenticateConfig, isCreationOptions, isRequestOptions, } from './lib/utils/type-guards';\n// Preset configurations\nexport { PRESET_MAP, PASSKEY_PRESET, EXTERNAL_SECURITY_KEY_PRESET, PLATFORM_AUTHENTICATOR_PRESET, } from './lib/presets/webauthn.presets';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25neC13ZWJhdXRobi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZTtBQUNmLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQU9sRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLG9CQUFvQixFQUNwQix1QkFBdUIsR0FDeEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxZQUFZO0FBQ1osT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBc0JyRSwwQ0FBMEM7QUFDMUMsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLGFBQWEsRUFDYixZQUFZLEVBQ1osWUFBWSxFQUNaLG1CQUFtQixFQUNuQix5QkFBeUIsR0FDMUIsTUFBTSw4QkFBOEIsQ0FBQztBQUt0QyxvQkFBb0I7QUFDcEIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsZ0NBQWdDLEVBQ2hDLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGFBQWEsRUFDYixxQkFBcUIsR0FDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyw4QkFBOEI7QUFDOUIsT0FBTyxFQUNMLDZCQUE2QixFQUM3Qiw0QkFBNEIsR0FDN0IsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxjQUFjO0FBQ2QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixHQUNqQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLHdCQUF3QjtBQUN4QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFDZCw0QkFBNEIsRUFDNUIsNkJBQTZCLEdBQzlCLE1BQU0sZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3JlIHNlcnZpY2VcclxuZXhwb3J0IHsgV2ViQXV0aG5TZXJ2aWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvd2ViYXV0aG4uc2VydmljZSc7XHJcblxyXG4vLyBDb25maWd1cmF0aW9uIHN5c3RlbVxyXG5leHBvcnQgdHlwZSB7XHJcbiAgV2ViQXV0aG5Db25maWcsXHJcbiAgUmVseWluZ1BhcnR5Q29uZmlnLFxyXG59IGZyb20gJy4vbGliL21vZGVsL3NlcnZpY2UtY29uZmlnJztcclxuZXhwb3J0IHtcclxuICBXRUJBVVRITl9DT05GSUcsXHJcbiAgY3JlYXRlV2ViQXV0aG5Db25maWcsXHJcbiAgREVGQVVMVF9XRUJBVVRITl9DT05GSUcsXHJcbn0gZnJvbSAnLi9saWIvbW9kZWwvc2VydmljZS1jb25maWcnO1xyXG5cclxuLy8gUHJvdmlkZXJzXHJcbmV4cG9ydCB7IHByb3ZpZGVXZWJBdXRobiB9IGZyb20gJy4vbGliL3Byb3ZpZGVycy93ZWJhdXRobi5wcm92aWRlcnMnO1xyXG5cclxuLy8gQ29yZSBtb2RlbHMgYW5kIHJlc3BvbnNlIHR5cGVzXHJcbmV4cG9ydCB0eXBlIHtcclxuICBXZWJBdXRoblJlZ2lzdHJhdGlvblJlc3VsdCxcclxuICBXZWJBdXRobkF1dGhlbnRpY2F0aW9uUmVzdWx0LFxyXG4gIFdlYkF1dGhuU3VwcG9ydCxcclxuICBSZWdpc3RyYXRpb25SZXNwb25zZSxcclxuICBBdXRoZW50aWNhdGlvblJlc3BvbnNlLFxyXG4gIFJlZ2lzdGVyQ29uZmlnLFxyXG4gIEF1dGhlbnRpY2F0ZUNvbmZpZyxcclxuICBSZWdpc3RlcklucHV0LFxyXG4gIEF1dGhlbnRpY2F0ZUlucHV0LFxyXG4gIFByZXNldE5hbWUsXHJcbiAgRW5oYW5jZWRSZWx5aW5nUGFydHksXHJcbiAgRmxleGlibGVVc2VySWQsXHJcbiAgRmxleGlibGVDaGFsbGVuZ2UsXHJcbiAgRmxleGlibGVDcmVkZW50aWFsRGVzY3JpcHRvcnMsXHJcbiAgUmVtb3RlUmVnaXN0cmF0aW9uUmVxdWVzdCxcclxuICBSZW1vdGVBdXRoZW50aWNhdGlvblJlcXVlc3QsXHJcbn0gZnJvbSAnLi9saWIvbW9kZWwnO1xyXG5cclxuLy8gRXJyb3IgdHlwZXMgZm9yIGVuaGFuY2VkIGVycm9yIGhhbmRsaW5nXHJcbmV4cG9ydCB7XHJcbiAgV2ViQXV0aG5FcnJvcixcclxuICBXZWJBdXRobkVycm9yVHlwZSxcclxuICBVc2VyQ2FuY2VsbGVkRXJyb3IsXHJcbiAgQXV0aGVudGljYXRvckVycm9yLFxyXG4gIEludmFsaWRPcHRpb25zRXJyb3IsXHJcbiAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcixcclxuICBTZWN1cml0eUVycm9yLFxyXG4gIFRpbWVvdXRFcnJvcixcclxuICBOZXR3b3JrRXJyb3IsXHJcbiAgUmVtb3RlRW5kcG9pbnRFcnJvcixcclxuICBJbnZhbGlkUmVtb3RlT3B0aW9uc0Vycm9yLFxyXG59IGZyb20gJy4vbGliL2Vycm9ycy93ZWJhdXRobi5lcnJvcnMnO1xyXG5cclxuLy8gUmVtb3RlIGVycm9yIGNvbnRleHQgdHlwZVxyXG5leHBvcnQgdHlwZSB7IFJlbW90ZUVycm9yQ29udGV4dCB9IGZyb20gJy4vbGliL2Vycm9ycy93ZWJhdXRobi5lcnJvcnMnO1xyXG5cclxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcclxuZXhwb3J0IHtcclxuICBhcnJheUJ1ZmZlclRvQmFzZTY0dXJsLFxyXG4gIGJhc2U2NHVybFRvQXJyYXlCdWZmZXIsXHJcbiAgYXJyYXlCdWZmZXJUb0Jhc2U2NCxcclxuICBiYXNlNjRUb0FycmF5QnVmZmVyLFxyXG4gIHN0cmluZ1RvQXJyYXlCdWZmZXIsXHJcbiAgYXJyYXlCdWZmZXJUb1N0cmluZyxcclxuICBnZW5lcmF0ZUNoYWxsZW5nZSxcclxuICBnZW5lcmF0ZVVzZXJJZCxcclxuICBjcmVkZW50aWFsSWRUb0FycmF5QnVmZmVyLFxyXG4gIGFycmF5QnVmZmVyVG9DcmVkZW50aWFsSWQsXHJcbiAgaXNXZWJBdXRoblN1cHBvcnRlZCxcclxuICBpc1BsYXRmb3JtQXV0aGVudGljYXRvckF2YWlsYWJsZSxcclxuICBnZXRTdXBwb3J0ZWRUcmFuc3BvcnRzLFxyXG4gIHZhbGlkYXRlUmVnaXN0cmF0aW9uT3B0aW9ucyxcclxuICBnZXREZWZhdWx0UHViS2V5Q3JlZFBhcmFtcyxcclxuICBpc0pTT05PcHRpb25zLFxyXG4gIGlzUHVibGljS2V5Q3JlZGVudGlhbCxcclxufSBmcm9tICcuL2xpYi91dGlscy93ZWJhdXRobi51dGlscyc7XHJcblxyXG4vLyBSZW1vdGUgdmFsaWRhdGlvbiB1dGlsaXRpZXNcclxuZXhwb3J0IHtcclxuICB2YWxpZGF0ZVJlbW90ZUNyZWF0aW9uT3B0aW9ucyxcclxuICB2YWxpZGF0ZVJlbW90ZVJlcXVlc3RPcHRpb25zLFxyXG59IGZyb20gJy4vbGliL3V0aWxzL3JlbW90ZS51dGlscyc7XHJcblxyXG4vLyBUeXBlIGd1YXJkc1xyXG5leHBvcnQge1xyXG4gIGlzUmVnaXN0ZXJDb25maWcsXHJcbiAgaXNBdXRoZW50aWNhdGVDb25maWcsXHJcbiAgaXNDcmVhdGlvbk9wdGlvbnMsXHJcbiAgaXNSZXF1ZXN0T3B0aW9ucyxcclxufSBmcm9tICcuL2xpYi91dGlscy90eXBlLWd1YXJkcyc7XHJcblxyXG4vLyBQcmVzZXQgY29uZmlndXJhdGlvbnNcclxuZXhwb3J0IHtcclxuICBQUkVTRVRfTUFQLFxyXG4gIFBBU1NLRVlfUFJFU0VULFxyXG4gIEVYVEVSTkFMX1NFQ1VSSVRZX0tFWV9QUkVTRVQsXHJcbiAgUExBVEZPUk1fQVVUSEVOVElDQVRPUl9QUkVTRVQsXHJcbn0gZnJvbSAnLi9saWIvcHJlc2V0cy93ZWJhdXRobi5wcmVzZXRzJztcclxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXdlYmF1dGhuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9uZ3gtd2ViYXV0aG4vc3JjL25neC13ZWJhdXRobi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":["generateChallenge","generateUserId"],"mappings":"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"}
|