@keycloakify/angular 0.0.6 → 0.0.7

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.
@@ -24,6 +24,8 @@ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
24
24
  this.socialProvidersNode = viewChild('socialProvidersNode');
25
25
  this.toggleRecoveryCodesConfirmation = signal(false);
26
26
  this.olRecoveryCodesListId = 'kc-recovery-codes-list';
27
+ }
28
+ ngAfterViewInit() {
27
29
  this.loginResourceInjectorService.insertAdditionalScripts([
28
30
  {
29
31
  type: 'text/javascript',
@@ -159,4 +161,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
159
161
  }
160
162
  ], template: "@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n" }]
161
163
  }], ctorParameters: () => [] });
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xvZ2luL3BhZ2VzL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dpbi9wYWdlcy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFvQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzVGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBR2xGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOENBQThDLENBQUM7O0FBZ0JoRixNQUFNLE9BQU8scUNBQXNDLFNBQVEsa0JBQWtCO0lBdUJ6RTtRQUNJLEtBQUssRUFBRSxDQUFDO1FBdkJaLGNBQVMsR0FBRyxNQUFNLENBQXlFLGdCQUFnQixDQUFDLENBQUM7UUFDN0csU0FBSSxHQUFHLE1BQU0sQ0FBTyxVQUFVLENBQUMsQ0FBQztRQUNoQyxpQ0FBNEIsR0FBRyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUUzRCxvQkFBZSxHQUFHLE1BQU0sQ0FBVSxlQUFlLENBQUMsQ0FBQztRQUNuRCxZQUFPLEdBQUcsTUFBTSxDQUFvQyxhQUFhLENBQUMsQ0FBQztRQUs1RSwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV6RSxlQUFVLEdBQUcsU0FBUyxDQUEyQixZQUFZLENBQUMsQ0FBQztRQUMvRCxhQUFRLEdBQUcsU0FBUyxDQUEyQixVQUFVLENBQUMsQ0FBQztRQUMzRCx3QkFBbUIsR0FBRyxTQUFTLENBQTJCLHFCQUFxQixDQUFDLENBQUM7UUFFakYsb0NBQStCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhELDBCQUFxQixHQUFHLHdCQUF3QixDQUFDO1FBSTdDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN0RDtnQkFDSSxJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLFNBQVM7Z0JBQzFDLFdBQVcsRUFBRTs7OztrRUFJcUMsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswRUErQmxCLElBQUksQ0FBQyxxQkFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4QkF3QnRFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQzs7OEJBRXZFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMENBQTBDLENBQUMsQ0FBQzs4QkFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzhFQXNCckIsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7OztzQ0FVbEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDOztzQ0FFdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO3NDQUM1RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7aUJBYTFGO2FBQ0o7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDOzhHQTlJUSxxQ0FBcUM7a0dBQXJDLHFDQUFxQyxrRkFQbkM7WUFDUDtnQkFDSSxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO2FBQ3ZFO1NBQ0osK1lDeEJMLDY1SUFrSkEsNENEbkljLGdCQUFnQiwrRkFBRSw0QkFBNEI7OzJGQVcvQyxxQ0FBcUM7a0JBYmpELFNBQVM7aUNBQ00sSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUMsWUFDL0MscUNBQXFDLG1CQUU5Qix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNDQUFzQyxDQUFDO3lCQUN2RTtxQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGZvcndhcmRSZWYsIGluamVjdCwgc2lnbmFsLCB0eXBlIFRlbXBsYXRlUmVmLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVTRV9ERUZBVUxUX0NTUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xpYi90b2tlbnMvdXNlLWRlZmF1bHQtY3NzJztcbmltcG9ydCB7IENvbXBvbmVudFJlZmVyZW5jZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2NsYXNzZXMvY29tcG9uZW50LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50IH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vY29tcG9uZW50cy9sb2dvdXQtb3RoZXItc2Vzc2lvbnMnO1xuaW1wb3J0IHsgS2NDbGFzc0RpcmVjdGl2ZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2RpcmVjdGl2ZXMva2MtY2xhc3MnO1xuaW1wb3J0IHR5cGUgeyBJMThuIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vaTE4bic7XG5pbXBvcnQgdHlwZSB7IEtjQ29udGV4dCB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL0tjQ29udGV4dCc7XG5pbXBvcnQgeyBMb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vc2VydmljZXMvbG9naW4tcmVzb3VyY2UtaW5qZWN0b3InO1xuaW1wb3J0IHsgTE9HSU5fQ0xBU1NFUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL3Rva2Vucy9jbGFzc2VzJztcbmltcG9ydCB7IExPR0lOX0kxOE4gfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi90b2tlbnMvaTE4bic7XG5pbXBvcnQgeyBLQ19MT0dJTl9DT05URVhUIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vdG9rZW5zL2tjLWNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBDbGFzc0tleSB9IGZyb20gJ2tleWNsb2FraWZ5L2xvZ2luL2xpYi9rY0Nsc3gnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtLY0NsYXNzRGlyZWN0aXZlLCBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50XSxcbiAgICBzZWxlY3RvcjogJ2tjLWxvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQ29tcG9uZW50UmVmZXJlbmNlLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFJlZmVyZW5jZSB7XG4gICAga2NDb250ZXh0ID0gaW5qZWN0PEV4dHJhY3Q8S2NDb250ZXh0LCB7IHBhZ2VJZDogJ2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmZ0bCcgfT4+KEtDX0xPR0lOX0NPTlRFWFQpO1xuICAgIGkxOG4gPSBpbmplY3Q8STE4bj4oTE9HSU5fSTE4Tik7XG4gICAgbG9naW5SZXNvdXJjZUluamVjdG9yU2VydmljZSA9IGluamVjdChMb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlKTtcblxuICAgIG92ZXJyaWRlIGRvVXNlRGVmYXVsdENzcyA9IGluamVjdDxib29sZWFuPihVU0VfREVGQVVMVF9DU1MpO1xuICAgIG92ZXJyaWRlIGNsYXNzZXMgPSBpbmplY3Q8UGFydGlhbDxSZWNvcmQ8Q2xhc3NLZXksIHN0cmluZz4+PihMT0dJTl9DTEFTU0VTKTtcblxuICAgIGRvY3VtZW50VGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBib2R5Q2xhc3NOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkaXNwbGF5UmVxdWlyZWRGaWVsZHMgPSBmYWxzZTtcbiAgICBkaXNwbGF5SW5mbyA9IHRydWU7XG4gICAgZGlzcGxheU1lc3NhZ2UgPSB0aGlzLmtjQ29udGV4dC5tZXNzYWdlc1BlckZpZWxkLmV4aXN0c0Vycm9yKCdwYXNzd29yZCcpO1xuXG4gICAgaGVhZGVyTm9kZSA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4+KCdoZWFkZXJOb2RlJyk7XG4gICAgaW5mb05vZGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PignaW5mb05vZGUnKTtcbiAgICBzb2NpYWxQcm92aWRlcnNOb2RlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oJ3NvY2lhbFByb3ZpZGVyc05vZGUnKTtcblxuICAgIHRvZ2dsZVJlY292ZXJ5Q29kZXNDb25maXJtYXRpb24gPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgb2xSZWNvdmVyeUNvZGVzTGlzdElkID0gJ2tjLXJlY292ZXJ5LWNvZGVzLWxpc3QnO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9naW5SZXNvdXJjZUluamVjdG9yU2VydmljZS5pbnNlcnRBZGRpdGlvbmFsU2NyaXB0cyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG4gICAgICAgICAgICAgICAgaWQ6IGAke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfS1zY3JpcHRgLFxuICAgICAgICAgICAgICAgIHRleHRDb250ZW50OiBgXG4gICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgcmVjb3ZlcnkgY29kZXMgICovXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlSZWNvdmVyeUNvZGVzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcFRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiMke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfSBsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFRleHRhcmVhLnZhbHVlID0gdG1wVGV4dGFyZWEudmFsdWUgKyBjb2Rlc1tpXS5pbm5lclRleHQgKyBcIlxcXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRtcFRleHRhcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFRleHRhcmVhLnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0bXBUZXh0YXJlYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgY29weUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29weVJlY292ZXJ5Q29kZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvcHlCdXR0b24gJiYgY29weUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29weVJlY292ZXJ5Q29kZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLyogZG93bmxvYWQgcmVjb3ZlcnkgY29kZXMgICovXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdEN1cnJlbnREYXRlVGltZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXJzZVJlY292ZXJ5Q29kZUxpc3QoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIjJHt0aGlzLm9sUmVjb3ZlcnlDb2Rlc0xpc3RJZH0gbGlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlTGlzdCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcnlDb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVMaUVsZW1lbnQgPSByZWNvdmVyeUNvZGVzW2ldLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyeUNvZGVMaXN0ICs9IHJlY292ZXJ5Q29kZUxpRWxlbWVudCArIFwiXFxcXHJcXFxcblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3ZlcnlDb2RlTGlzdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ1aWxkRG93bmxvYWRDb250ZW50KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlY292ZXJ5Q29kZUxpc3QgPSBwYXJzZVJlY292ZXJ5Q29kZUxpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUJvZHlDb250ZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KHRoaXMuaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWRvd25sb2FkLWZpbGUtaGVhZGVyJykpfSArIFwiXFxcXG5cXFxcblwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyeUNvZGVMaXN0ICsgXCJcXFxcblwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KHRoaXMuaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWRvd25sb2FkLWZpbGUtZGVzY3JpcHRpb24nKSl9ICsgXCJcXFxcblxcXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kYXRlJykpfSArIFwiIFwiICsgZm9ybWF0Q3VycmVudERhdGVUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRVcERvd25sb2FkTGlua0FuZERvd25sb2FkKGZpbGVuYW1lLCB0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZG93bmxvYWRSZWNvdmVyeUNvZGVzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBEb3dubG9hZExpbmtBbmREb3dubG9hZCgna2MtZG93bmxvYWQtcmVjb3ZlcnktY29kZXMudHh0JywgYnVpbGREb3dubG9hZENvbnRlbnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRvd25sb2FkUmVjb3ZlcnlDb2Rlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXR0b24gJiYgZG93bmxvYWRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGRvd25sb2FkUmVjb3ZlcnlDb2Rlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLyogcHJpbnQgcmVjb3ZlcnkgY29kZXMgKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRQcmludENvbnRlbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlTGlzdEhUTUwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHt0aGlzLm9sUmVjb3ZlcnlDb2Rlc0xpc3RJZH0nKS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXGBAcGFnZSB7IHNpemU6IGF1dG87ICBtYXJnaW4tdG9wOiAwOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSB7IHdpZHRoOiA0ODBweDsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdiB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcDpmaXJzdC1vZi10eXBlIHsgbWFyZ2luLXRvcDogNDhweCB9XFxgO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpbnRGaWxlQ29udGVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8aHRtbD48c3R5bGU+XCIgKyBzdHlsZXMgKyBcIjwvc3R5bGU+PGJvZHk+XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPHRpdGxlPmtjLWRvd25sb2FkLXJlY292ZXJ5LWNvZGVzPC90aXRsZT5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1oZWFkZXInKSl9ICsgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPGRpdj5cIiArIHJlY292ZXJ5Q29kZUxpc3RIVE1MICsgXCI8L2Rpdj5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kZXNjcmlwdGlvbicpKX0gKyBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kYXRlJykpfSArIFwiIFwiICsgZm9ybWF0Q3VycmVudERhdGVUaW1lKCkgKyBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L2JvZHk+PC9odG1sPlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJpbnRSZWNvdmVyeUNvZGVzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSB3aW5kb3cub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdy5kb2N1bWVudC53cml0ZShidWlsZFByaW50Q29udGVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmludEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJpbnRSZWNvdmVyeUNvZGVzXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcmludEJ1dHRvbiAmJiBwcmludEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcHJpbnRSZWNvdmVyeUNvZGVzKTtcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICB9XG4gICAgICAgIF0pO1xuICAgIH1cbn1cbiIsIkBsZXQgcmVjb3ZlcnlBdXRobkNvZGVzQ29uZmlnQmVhbiA9IGtjQ29udGV4dC5yZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuO1xuQGxldCBpc0FwcEluaXRpYXRlZEFjdGlvbiA9IGtjQ29udGV4dC5pc0FwcEluaXRpYXRlZEFjdGlvbjtcblxuPG5nLXRlbXBsYXRlICNoZWFkZXJOb2RlPlxuICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2RlLWNvbmZpZy1oZWFkZXInKSB9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdlxuICAgIGNsYXNzPVwicGYtYy1hbGVydCBwZi1tLXdhcm5pbmcgcGYtbS1pbmxpbmVcIlxuICAgIGFyaWEtbGFiZWw9XCJXYXJuaW5nIGFsZXJ0XCJcbiAgICBba2NDbGFzc109XCIna2NSZWNvdmVyeUNvZGVzV2FybmluZydcIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJwZi1jLWFsZXJ0X19pY29uXCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cInBmaWNvbi13YXJuaW5nLXRyaWFuZ2xlLW9cIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8aDQgY2xhc3M9XCJwZi1jLWFsZXJ0X190aXRsZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBmLXNjcmVlbi1yZWFkZXJcIj5XYXJuaW5nIGFsZXJ0Ojwvc3Bhbj5cbiAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLXdhcm5pbmctdGl0bGUnKSB9fVxuICAgIDwvaDQ+XG4gICAgPGRpdiBjbGFzcz1cInBmLWMtYWxlcnRfX2Rlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxwPnt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2RlLWNvbmZpZy13YXJuaW5nLW1lc3NhZ2UnKSB9fTwvcD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48b2xcbiAgICBbaWRdPVwib2xSZWNvdmVyeUNvZGVzTGlzdElkXCJcbiAgICBba2NDbGFzc109XCIna2NSZWNvdmVyeUNvZGVzTGlzdCdcIlxuPlxuICAgIEBmb3IgKGNvZGUgb2YgcmVjb3ZlcnlBdXRobkNvZGVzQ29uZmlnQmVhbi5nZW5lcmF0ZWRSZWNvdmVyeUF1dGhuQ29kZXNMaXN0OyB0cmFjayBjb2RlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICA8bGk+XG4gICAgICAgICAgICA8c3Bhbj57eyBpICsgMSB9fTo8L3NwYW4+IHt7IGNvZGUuc2xpY2UoMCwgNCkgfX0te3sgY29kZS5zbGljZSg0LCA4KSB9fS17eyBjb2RlLnNsaWNlKDgpIH19XG4gICAgICAgIDwvbGk+XG4gICAgfVxuPC9vbD5cblxuPCEtLSBhY3Rpb25zIC0tPlxuPGRpdiBba2NDbGFzc109XCIna2NSZWNvdmVyeUNvZGVzQWN0aW9ucydcIj5cbiAgICA8YnV0dG9uXG4gICAgICAgIGlkPVwicHJpbnRSZWNvdmVyeUNvZGVzXCJcbiAgICAgICAgY2xhc3M9XCJwZi1jLWJ1dHRvbiBwZi1tLWxpbmtcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cInBmaWNvbi1wcmludFwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtcHJpbnQnKSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJkb3dubG9hZFJlY292ZXJ5Q29kZXNcIlxuICAgICAgICBjbGFzcz1cInBmLWMtYnV0dG9uIHBmLW0tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXNhdmVcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWRvd25sb2FkJykgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAgIGlkPVwiY29weVJlY292ZXJ5Q29kZXNcIlxuICAgICAgICBjbGFzcz1cInBmLWMtYnV0dG9uIHBmLW0tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLWJsdWVwcmludFwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtY29weScpIH19XG4gICAgPC9idXR0b24+XG48L2Rpdj5cblxuPCEtLSBjb25maXJtYXRpb24gY2hlY2tib3ggLS0+XG5cbjxkaXZcbiAgICBjbGFzcz1cImNoZWNrYm94XCJcbiAgICBba2NDbGFzc109XCIna2NGb3JtT3B0aW9uc0NsYXNzJ1wiXG4+XG4gICAgPGxhYmVsIGZvcj1cImtjUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbkNoZWNrXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIGlkPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIlxuICAgICAgICAgICAgbmFtZT1cImtjUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbkNoZWNrXCJcbiAgICAgICAgICAgIFtrY0NsYXNzXT1cIidrY0NoZWNrSW5wdXRDbGFzcydcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbigpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbi5zZXQoJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiXG4gICAgICAgIC8+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1jb25maXJtYXRpb24tbWVzc2FnZScpIH19XG4gICAgPC9sYWJlbD5cbjwvZGl2PlxuXG48Zm9ybVxuICAgIGlkPVwia2MtcmVjb3ZlcnktY29kZXMtc2V0dGluZ3MtZm9ybVwiXG4gICAgbWV0aG9kPVwicG9zdFwiXG4gICAgW2FjdGlvbl09XCJrY0NvbnRleHQudXJsLmxvZ2luQWN0aW9uXCJcbiAgICBba2NDbGFzc109XCIna2NGb3JtR3JvdXBDbGFzcydcIlxuPlxuICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwiaGlkZGVuXCJcbiAgICAgICAgbmFtZT1cImdlbmVyYXRlZFJlY292ZXJ5QXV0aG5Db2Rlc1wiXG4gICAgICAgIFt2YWx1ZV09XCJyZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuLmdlbmVyYXRlZFJlY292ZXJ5QXV0aG5Db2Rlc0FzU3RyaW5nXCJcbiAgICAvPlxuICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwiaGlkZGVuXCJcbiAgICAgICAgbmFtZT1cImdlbmVyYXRlZEF0XCJcbiAgICAgICAgW3ZhbHVlXT1cInJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW4uZ2VuZXJhdGVkQXRcIlxuICAgIC8+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBpZD1cInVzZXJMYWJlbFwiXG4gICAgICAgIG5hbWU9XCJ1c2VyTGFiZWxcIlxuICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWxhYmVsLWRlZmF1bHQnKVwiXG4gICAgLz5cblxuICAgIDxrYy1sb2dvdXQtb3RoZXItc2Vzc2lvbnMgLz5cblxuICAgIEBpZiAoaXNBcHBJbml0aWF0ZWRBY3Rpb24pIHtcbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIGlkPVwic2F2ZVJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBba2NDbGFzc109XCJbJ2tjQnV0dG9uQ2xhc3MnLCAna2NCdXR0b25QcmltYXJ5Q2xhc3MnLCAna2NCdXR0b25MYXJnZUNsYXNzJ11cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1hY3Rpb24tY29tcGxldGUnKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRvZ2dsZVJlY292ZXJ5Q29kZXNDb25maXJtYXRpb24oKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgaWQ9XCJjYW5jZWxSZWNvdmVyeUF1dGhuQ29kZXNCdG5cIlxuICAgICAgICAgICAgbmFtZT1cImNhbmNlbC1haWFcIlxuICAgICAgICAgICAgdmFsdWU9XCJ0cnVlXCJcbiAgICAgICAgICAgIFtrY0NsYXNzXT1cIlsna2NCdXR0b25DbGFzcycsICdrY0J1dHRvbkRlZmF1bHRDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1hY3Rpb24tY2FuY2VsJykgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfSBAZWxzZSB7XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBpZD1cInNhdmVSZWNvdmVyeUF1dGhuQ29kZXNCdG5cIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiWydrY0J1dHRvbkNsYXNzJywgJ2tjQnV0dG9uUHJpbWFyeUNsYXNzJywgJ2tjQnV0dG9uQmxvY2tDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jb21wbGV0ZScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICB9XG48L2Zvcm0+XG4iXX0=
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xvZ2luL3BhZ2VzL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dpbi9wYWdlcy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBb0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUM1RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUdsRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOztBQWdCaEYsTUFBTSxPQUFPLHFDQUFzQyxTQUFRLGtCQUFrQjtJQXVCekU7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQXZCWixjQUFTLEdBQUcsTUFBTSxDQUF5RSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdHLFNBQUksR0FBRyxNQUFNLENBQU8sVUFBVSxDQUFDLENBQUM7UUFDaEMsaUNBQTRCLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFM0Qsb0JBQWUsR0FBRyxNQUFNLENBQVUsZUFBZSxDQUFDLENBQUM7UUFDbkQsWUFBTyxHQUFHLE1BQU0sQ0FBb0MsYUFBYSxDQUFDLENBQUM7UUFLNUUsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLG1CQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekUsZUFBVSxHQUFHLFNBQVMsQ0FBMkIsWUFBWSxDQUFDLENBQUM7UUFDL0QsYUFBUSxHQUFHLFNBQVMsQ0FBMkIsVUFBVSxDQUFDLENBQUM7UUFDM0Qsd0JBQW1CLEdBQUcsU0FBUyxDQUEyQixxQkFBcUIsQ0FBQyxDQUFDO1FBRWpGLG9DQUErQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRCwwQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztJQUlqRCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN0RDtnQkFDSSxJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLFNBQVM7Z0JBQzFDLFdBQVcsRUFBRTs7OztrRUFJcUMsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswRUErQmxCLElBQUksQ0FBQyxxQkFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4QkF3QnRFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQzs7OEJBRXZFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMENBQTBDLENBQUMsQ0FBQzs4QkFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzhFQXNCckIsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7OztzQ0FVbEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDOztzQ0FFdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO3NDQUM1RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7aUJBYTFGO2FBQ0o7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDOzhHQWpKUSxxQ0FBcUM7a0dBQXJDLHFDQUFxQyxrRkFQbkM7WUFDUDtnQkFDSSxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO2FBQ3ZFO1NBQ0osK1lDeEJMLDY1SUFrSkEsNENEbkljLGdCQUFnQiwrRkFBRSw0QkFBNEI7OzJGQVcvQyxxQ0FBcUM7a0JBYmpELFNBQVM7aUNBQ00sSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUMsWUFDL0MscUNBQXFDLG1CQUU5Qix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNDQUFzQyxDQUFDO3lCQUN2RTtxQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGZvcndhcmRSZWYsIGluamVjdCwgc2lnbmFsLCB0eXBlIFRlbXBsYXRlUmVmLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVTRV9ERUZBVUxUX0NTUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xpYi90b2tlbnMvdXNlLWRlZmF1bHQtY3NzJztcbmltcG9ydCB7IENvbXBvbmVudFJlZmVyZW5jZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2NsYXNzZXMvY29tcG9uZW50LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50IH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vY29tcG9uZW50cy9sb2dvdXQtb3RoZXItc2Vzc2lvbnMnO1xuaW1wb3J0IHsgS2NDbGFzc0RpcmVjdGl2ZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2RpcmVjdGl2ZXMva2MtY2xhc3MnO1xuaW1wb3J0IHR5cGUgeyBJMThuIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vaTE4bic7XG5pbXBvcnQgdHlwZSB7IEtjQ29udGV4dCB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL0tjQ29udGV4dCc7XG5pbXBvcnQgeyBMb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vc2VydmljZXMvbG9naW4tcmVzb3VyY2UtaW5qZWN0b3InO1xuaW1wb3J0IHsgTE9HSU5fQ0xBU1NFUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL3Rva2Vucy9jbGFzc2VzJztcbmltcG9ydCB7IExPR0lOX0kxOE4gfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi90b2tlbnMvaTE4bic7XG5pbXBvcnQgeyBLQ19MT0dJTl9DT05URVhUIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vdG9rZW5zL2tjLWNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBDbGFzc0tleSB9IGZyb20gJ2tleWNsb2FraWZ5L2xvZ2luL2xpYi9rY0Nsc3gnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtLY0NsYXNzRGlyZWN0aXZlLCBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50XSxcbiAgICBzZWxlY3RvcjogJ2tjLWxvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQ29tcG9uZW50UmVmZXJlbmNlLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFJlZmVyZW5jZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAgIGtjQ29udGV4dCA9IGluamVjdDxFeHRyYWN0PEtjQ29udGV4dCwgeyBwYWdlSWQ6ICdsb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy5mdGwnIH0+PihLQ19MT0dJTl9DT05URVhUKTtcbiAgICBpMThuID0gaW5qZWN0PEkxOG4+KExPR0lOX0kxOE4pO1xuICAgIGxvZ2luUmVzb3VyY2VJbmplY3RvclNlcnZpY2UgPSBpbmplY3QoTG9naW5SZXNvdXJjZUluamVjdG9yU2VydmljZSk7XG5cbiAgICBvdmVycmlkZSBkb1VzZURlZmF1bHRDc3MgPSBpbmplY3Q8Ym9vbGVhbj4oVVNFX0RFRkFVTFRfQ1NTKTtcbiAgICBvdmVycmlkZSBjbGFzc2VzID0gaW5qZWN0PFBhcnRpYWw8UmVjb3JkPENsYXNzS2V5LCBzdHJpbmc+Pj4oTE9HSU5fQ0xBU1NFUyk7XG5cbiAgICBkb2N1bWVudFRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgYm9keUNsYXNzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZGlzcGxheVJlcXVpcmVkRmllbGRzID0gZmFsc2U7XG4gICAgZGlzcGxheUluZm8gPSB0cnVlO1xuICAgIGRpc3BsYXlNZXNzYWdlID0gdGhpcy5rY0NvbnRleHQubWVzc2FnZXNQZXJGaWVsZC5leGlzdHNFcnJvcigncGFzc3dvcmQnKTtcblxuICAgIGhlYWRlck5vZGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PignaGVhZGVyTm9kZScpO1xuICAgIGluZm9Ob2RlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oJ2luZm9Ob2RlJyk7XG4gICAgc29jaWFsUHJvdmlkZXJzTm9kZSA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4+KCdzb2NpYWxQcm92aWRlcnNOb2RlJyk7XG5cbiAgICB0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIG9sUmVjb3ZlcnlDb2Rlc0xpc3RJZCA9ICdrYy1yZWNvdmVyeS1jb2Rlcy1saXN0JztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5sb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlLmluc2VydEFkZGl0aW9uYWxTY3JpcHRzKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyxcbiAgICAgICAgICAgICAgICBpZDogYCR7dGhpcy5vbFJlY292ZXJ5Q29kZXNMaXN0SWR9LXNjcmlwdGAsXG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6IGBcbiAgICAgICAgICAgICAgICAgICAgLyogY29weSByZWNvdmVyeSBjb2RlcyAgKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29weVJlY292ZXJ5Q29kZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wVGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiIyR7dGhpcy5vbFJlY292ZXJ5Q29kZXNMaXN0SWR9IGxpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVGV4dGFyZWEudmFsdWUgPSB0bXBUZXh0YXJlYS52YWx1ZSArIGNvZGVzW2ldLmlubmVyVGV4dCArIFwiXFxcXG5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG1wVGV4dGFyZWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG1wVGV4dGFyZWEuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRtcFRleHRhcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb3B5QnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb3B5UmVjb3ZlcnlDb2Rlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29weUJ1dHRvbiAmJiBjb3B5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5UmVjb3ZlcnlDb2RlcygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvKiBkb3dubG9hZCByZWNvdmVyeSBjb2RlcyAgKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0Q3VycmVudERhdGVUaW1lKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU5hbWU6ICdzaG9ydCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkdC50b0xvY2FsZVN0cmluZygnZW4tVVMnLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBhcnNlUmVjb3ZlcnlDb2RlTGlzdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiMke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfSBsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVMaXN0ID0gXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyeUNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlY292ZXJ5Q29kZUxpRWxlbWVudCA9IHJlY292ZXJ5Q29kZXNbaV0uaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJ5Q29kZUxpc3QgKz0gcmVjb3ZlcnlDb2RlTGlFbGVtZW50ICsgXCJcXFxcclxcXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNvdmVyeUNvZGVMaXN0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGREb3dubG9hZENvbnRlbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlTGlzdCA9IHBhcnNlUmVjb3ZlcnlDb2RlTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU5hbWU6ICdzaG9ydCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlQm9keUNvbnRlbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1oZWFkZXInKSl9ICsgXCJcXFxcblxcXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJ5Q29kZUxpc3QgKyBcIlxcXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kZXNjcmlwdGlvbicpKX0gKyBcIlxcXFxuXFxcXG5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWRhdGUnKSl9ICsgXCIgXCIgKyBmb3JtYXRDdXJyZW50RGF0ZVRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFVwRG93bmxvYWRMaW5rQW5kRG93bmxvYWQoZmlsZW5hbWUsIHRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaHJlZicsICdkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb3dubG9hZFJlY292ZXJ5Q29kZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRVcERvd25sb2FkTGlua0FuZERvd25sb2FkKCdrYy1kb3dubG9hZC1yZWNvdmVyeS1jb2Rlcy50eHQnLCBidWlsZERvd25sb2FkQ29udGVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZG93bmxvYWRSZWNvdmVyeUNvZGVzXCIpO1xuICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dHRvbiAmJiBkb3dubG9hZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZG93bmxvYWRSZWNvdmVyeUNvZGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAvKiBwcmludCByZWNvdmVyeSBjb2RlcyAqL1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBidWlsZFByaW50Q29udGVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVMaXN0SFRNTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfScpLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcYEBwYWdlIHsgc2l6ZTogYXV0bzsgIG1hcmdpbi10b3A6IDA7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IHsgd2lkdGg6IDQ4MHB4OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2IHsgbGlzdC1zdHlsZS10eXBlOiBub25lOyBmb250LWZhbWlseTogbW9ub3NwYWNlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmZpcnN0LW9mLXR5cGUgeyBtYXJnaW4tdG9wOiA0OHB4IH1cXGA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmludEZpbGVDb250ZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxodG1sPjxzdHlsZT5cIiArIHN0eWxlcyArIFwiPC9zdHlsZT48Ym9keT5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8dGl0bGU+a2MtZG93bmxvYWQtcmVjb3ZlcnktY29kZXM8L3RpdGxlPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICsgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWhlYWRlcicpKX0gKyBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8ZGl2PlwiICsgcmVjb3ZlcnlDb2RlTGlzdEhUTUwgKyBcIjwvZGl2PlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICsgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWRlc2NyaXB0aW9uJykpfSArIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICsgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWRhdGUnKSl9ICsgXCIgXCIgKyBmb3JtYXRDdXJyZW50RGF0ZVRpbWUoKSArIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvYm9keT48L2h0bWw+XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcmludFJlY292ZXJ5Q29kZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IHdpbmRvdy5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3LmRvY3VtZW50LndyaXRlKGJ1aWxkUHJpbnRDb250ZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByaW50QnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcmludFJlY292ZXJ5Q29kZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIHByaW50QnV0dG9uICYmIHByaW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBwcmludFJlY292ZXJ5Q29kZXMpO1xuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgfVxufVxuIiwiQGxldCByZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuID0ga2NDb250ZXh0LnJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW47XG5AbGV0IGlzQXBwSW5pdGlhdGVkQWN0aW9uID0ga2NDb250ZXh0LmlzQXBwSW5pdGlhdGVkQWN0aW9uO1xuXG48bmctdGVtcGxhdGUgI2hlYWRlck5vZGU+XG4gICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLWhlYWRlcicpIH19XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2XG4gICAgY2xhc3M9XCJwZi1jLWFsZXJ0IHBmLW0td2FybmluZyBwZi1tLWlubGluZVwiXG4gICAgYXJpYS1sYWJlbD1cIldhcm5pbmcgYWxlcnRcIlxuICAgIFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNXYXJuaW5nJ1wiXG4+XG4gICAgPGRpdiBjbGFzcz1cInBmLWMtYWxlcnRfX2ljb25cIj5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXdhcm5pbmctdHJpYW5nbGUtb1wiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxoNCBjbGFzcz1cInBmLWMtYWxlcnRfX3RpdGxlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGYtc2NyZWVuLXJlYWRlclwiPldhcm5pbmcgYWxlcnQ6PC9zcGFuPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZS1jb25maWctd2FybmluZy10aXRsZScpIH19XG4gICAgPC9oND5cbiAgICA8ZGl2IGNsYXNzPVwicGYtYy1hbGVydF9fZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPHA+e3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLXdhcm5pbmctbWVzc2FnZScpIH19PC9wPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxvbFxuICAgIFtpZF09XCJvbFJlY292ZXJ5Q29kZXNMaXN0SWRcIlxuICAgIFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNMaXN0J1wiXG4+XG4gICAgQGZvciAoY29kZSBvZiByZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuLmdlbmVyYXRlZFJlY292ZXJ5QXV0aG5Db2Rlc0xpc3Q7IHRyYWNrIGNvZGU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19Ojwvc3Bhbj4ge3sgY29kZS5zbGljZSgwLCA0KSB9fS17eyBjb2RlLnNsaWNlKDQsIDgpIH19LXt7IGNvZGUuc2xpY2UoOCkgfX1cbiAgICAgICAgPC9saT5cbiAgICB9XG48L29sPlxuXG48IS0tIGFjdGlvbnMgLS0+XG48ZGl2IFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNBY3Rpb25zJ1wiPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJwcmludFJlY292ZXJ5Q29kZXNcIlxuICAgICAgICBjbGFzcz1cInBmLWMtYnV0dG9uIHBmLW0tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXByaW50XCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1wcmludCcpIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgICBpZD1cImRvd25sb2FkUmVjb3ZlcnlDb2Rlc1wiXG4gICAgICAgIGNsYXNzPVwicGYtYy1idXR0b24gcGYtbS1saW5rXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJwZmljb24tc2F2ZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQnKSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJjb3B5UmVjb3ZlcnlDb2Rlc1wiXG4gICAgICAgIGNsYXNzPVwicGYtYy1idXR0b24gcGYtbS1saW5rXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJwZmljb24tYmx1ZXByaW50XCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1jb3B5JykgfX1cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48IS0tIGNvbmZpcm1hdGlvbiBjaGVja2JveCAtLT5cblxuPGRpdlxuICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1PcHRpb25zQ2xhc3MnXCJcbj5cbiAgICA8bGFiZWwgZm9yPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgaWQ9XCJrY1JlY292ZXJ5Q29kZXNDb25maXJtYXRpb25DaGVja1wiXG4gICAgICAgICAgICBuYW1lPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiJ2tjQ2hlY2tJbnB1dENsYXNzJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uKClcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uLnNldCgkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCJcbiAgICAgICAgLz5cbiAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWNvbmZpcm1hdGlvbi1tZXNzYWdlJykgfX1cbiAgICA8L2xhYmVsPlxuPC9kaXY+XG5cbjxmb3JtXG4gICAgaWQ9XCJrYy1yZWNvdmVyeS1jb2Rlcy1zZXR0aW5ncy1mb3JtXCJcbiAgICBtZXRob2Q9XCJwb3N0XCJcbiAgICBbYWN0aW9uXT1cImtjQ29udGV4dC51cmwubG9naW5BY3Rpb25cIlxuICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1Hcm91cENsYXNzJ1wiXG4+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBuYW1lPVwiZ2VuZXJhdGVkUmVjb3ZlcnlBdXRobkNvZGVzXCJcbiAgICAgICAgW3ZhbHVlXT1cInJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW4uZ2VuZXJhdGVkUmVjb3ZlcnlBdXRobkNvZGVzQXNTdHJpbmdcIlxuICAgIC8+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBuYW1lPVwiZ2VuZXJhdGVkQXRcIlxuICAgICAgICBbdmFsdWVdPVwicmVjb3ZlcnlBdXRobkNvZGVzQ29uZmlnQmVhbi5nZW5lcmF0ZWRBdFwiXG4gICAgLz5cbiAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImhpZGRlblwiXG4gICAgICAgIGlkPVwidXNlckxhYmVsXCJcbiAgICAgICAgbmFtZT1cInVzZXJMYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtbGFiZWwtZGVmYXVsdCcpXCJcbiAgICAvPlxuXG4gICAgPGtjLWxvZ291dC1vdGhlci1zZXNzaW9ucyAvPlxuXG4gICAgQGlmIChpc0FwcEluaXRpYXRlZEFjdGlvbikge1xuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgaWQ9XCJzYXZlUmVjb3ZlcnlBdXRobkNvZGVzQnRuXCJcbiAgICAgICAgICAgIFtrY0NsYXNzXT1cIlsna2NCdXR0b25DbGFzcycsICdrY0J1dHRvblByaW1hcnlDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jb21wbGV0ZScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBpZD1cImNhbmNlbFJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBuYW1lPVwiY2FuY2VsLWFpYVwiXG4gICAgICAgICAgICB2YWx1ZT1cInRydWVcIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiWydrY0J1dHRvbkNsYXNzJywgJ2tjQnV0dG9uRGVmYXVsdENsYXNzJywgJ2tjQnV0dG9uTGFyZ2VDbGFzcyddXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jYW5jZWwnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIGlkPVwic2F2ZVJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBba2NDbGFzc109XCJbJ2tjQnV0dG9uQ2xhc3MnLCAna2NCdXR0b25QcmltYXJ5Q2xhc3MnLCAna2NCdXR0b25CbG9ja0NsYXNzJywgJ2tjQnV0dG9uTGFyZ2VDbGFzcyddXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtYWN0aW9uLWNvbXBsZXRlJylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uKClcIlxuICAgICAgICAvPlxuICAgIH1cbjwvZm9ybT5cbiJdfQ==
@@ -25,6 +25,8 @@ class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
25
25
  this.socialProvidersNode = viewChild('socialProvidersNode');
26
26
  this.toggleRecoveryCodesConfirmation = signal(false);
27
27
  this.olRecoveryCodesListId = 'kc-recovery-codes-list';
28
+ }
29
+ ngAfterViewInit() {
28
30
  this.loginResourceInjectorService.insertAdditionalScripts([
29
31
  {
30
32
  type: 'text/javascript',
@@ -1 +1 @@
1
- {"version":3,"file":"keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs","sources":["../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts","../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html","../../src/login/pages/login-recovery-authn-code-config/keycloakify-angular-login-pages-login-recovery-authn-code-config.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, LogoutOtherSessionsComponent],\n selector: 'kc-login-recovery-authn-code-config',\n templateUrl: 'login-recovery-authn-code-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)\n }\n ]\n})\nexport class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {\n kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n loginResourceInjectorService = inject(LoginResourceInjectorService);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = false;\n displayInfo = true;\n displayMessage = this.kcContext.messagesPerField.existsError('password');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n toggleRecoveryCodesConfirmation = signal(false);\n\n olRecoveryCodesListId = 'kc-recovery-codes-list';\n\n constructor() {\n super();\n this.loginResourceInjectorService.insertAdditionalScripts([\n {\n type: 'text/javascript',\n id: `${this.olRecoveryCodesListId}-script`,\n textContent: `\n /* copy recovery codes */\n function copyRecoveryCodes() {\n var tmpTextarea = document.createElement(\"textarea\");\n var codes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n for (i = 0; i < codes.length; i++) {\n tmpTextarea.value = tmpTextarea.value + codes[i].innerText + \"\\\\n\";\n }\n document.body.appendChild(tmpTextarea);\n tmpTextarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(tmpTextarea);\n }\n\n var copyButton = document.getElementById(\"copyRecoveryCodes\");\n copyButton && copyButton.addEventListener(\"click\", function () {\n copyRecoveryCodes();\n });\n\n /* download recovery codes */\n function formatCurrentDateTime() {\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return dt.toLocaleString('en-US', options);\n }\n\n function parseRecoveryCodeList() {\n var recoveryCodes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n var recoveryCodeList = \"\";\n\n for (var i = 0; i < recoveryCodes.length; i++) {\n var recoveryCodeLiElement = recoveryCodes[i].innerText;\n recoveryCodeList += recoveryCodeLiElement + \"\\\\r\\\\n\";\n }\n\n return recoveryCodeList;\n }\n\n function buildDownloadContent() {\n var recoveryCodeList = parseRecoveryCodeList();\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return fileBodyContent =\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"\\\\n\\\\n\" +\n recoveryCodeList + \"\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"\\\\n\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime();\n }\n\n function setUpDownloadLinkAndDownload(filename, text) {\n var el = document.createElement('a');\n el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n el.setAttribute('download', filename);\n el.style.display = 'none';\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n }\n\n function downloadRecoveryCodes() {\n setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());\n }\n\n var downloadButton = document.getElementById(\"downloadRecoveryCodes\");\n downloadButton && downloadButton.addEventListener(\"click\", downloadRecoveryCodes);\n\n /* print recovery codes */\n function buildPrintContent() {\n var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;\n var styles =\n \\`@page { size: auto; margin-top: 0; }\n body { width: 480px; }\n div { list-style-type: none; font-family: monospace }\n p:first-of-type { margin-top: 48px }\\`;\n\n return printFileContent =\n \"<html><style>\" + styles + \"</style><body>\" +\n \"<title>kc-download-recovery-codes</title>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"</p>\" +\n \"<div>\" + recoveryCodeListHTML + \"</div>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"</p>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime() + \"</p>\" +\n \"</body></html>\";\n }\n\n function printRecoveryCodes() {\n var w = window.open();\n w.document.write(buildPrintContent());\n w.print();\n w.close();\n }\n\n var printButton = document.getElementById(\"printRecoveryCodes\");\n printButton && printButton.addEventListener(\"click\", printRecoveryCodes);\n `\n }\n ]);\n }\n}\n","@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs","sources":["../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts","../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html","../../src/login/pages/login-recovery-authn-code-config/keycloakify-angular-login-pages-login-recovery-authn-code-config.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, LogoutOtherSessionsComponent],\n selector: 'kc-login-recovery-authn-code-config',\n templateUrl: 'login-recovery-authn-code-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)\n }\n ]\n})\nexport class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference implements AfterViewInit {\n kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n loginResourceInjectorService = inject(LoginResourceInjectorService);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = false;\n displayInfo = true;\n displayMessage = this.kcContext.messagesPerField.existsError('password');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n toggleRecoveryCodesConfirmation = signal(false);\n\n olRecoveryCodesListId = 'kc-recovery-codes-list';\n\n constructor() {\n super();\n }\n\n ngAfterViewInit() {\n this.loginResourceInjectorService.insertAdditionalScripts([\n {\n type: 'text/javascript',\n id: `${this.olRecoveryCodesListId}-script`,\n textContent: `\n /* copy recovery codes */\n function copyRecoveryCodes() {\n var tmpTextarea = document.createElement(\"textarea\");\n var codes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n for (i = 0; i < codes.length; i++) {\n tmpTextarea.value = tmpTextarea.value + codes[i].innerText + \"\\\\n\";\n }\n document.body.appendChild(tmpTextarea);\n tmpTextarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(tmpTextarea);\n }\n\n var copyButton = document.getElementById(\"copyRecoveryCodes\");\n copyButton && copyButton.addEventListener(\"click\", function () {\n copyRecoveryCodes();\n });\n\n /* download recovery codes */\n function formatCurrentDateTime() {\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return dt.toLocaleString('en-US', options);\n }\n\n function parseRecoveryCodeList() {\n var recoveryCodes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n var recoveryCodeList = \"\";\n\n for (var i = 0; i < recoveryCodes.length; i++) {\n var recoveryCodeLiElement = recoveryCodes[i].innerText;\n recoveryCodeList += recoveryCodeLiElement + \"\\\\r\\\\n\";\n }\n\n return recoveryCodeList;\n }\n\n function buildDownloadContent() {\n var recoveryCodeList = parseRecoveryCodeList();\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return fileBodyContent =\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"\\\\n\\\\n\" +\n recoveryCodeList + \"\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"\\\\n\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime();\n }\n\n function setUpDownloadLinkAndDownload(filename, text) {\n var el = document.createElement('a');\n el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n el.setAttribute('download', filename);\n el.style.display = 'none';\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n }\n\n function downloadRecoveryCodes() {\n setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());\n }\n\n var downloadButton = document.getElementById(\"downloadRecoveryCodes\");\n downloadButton && downloadButton.addEventListener(\"click\", downloadRecoveryCodes);\n\n /* print recovery codes */\n function buildPrintContent() {\n var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;\n var styles =\n \\`@page { size: auto; margin-top: 0; }\n body { width: 480px; }\n div { list-style-type: none; font-family: monospace }\n p:first-of-type { margin-top: 48px }\\`;\n\n return printFileContent =\n \"<html><style>\" + styles + \"</style><body>\" +\n \"<title>kc-download-recovery-codes</title>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"</p>\" +\n \"<div>\" + recoveryCodeListHTML + \"</div>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"</p>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime() + \"</p>\" +\n \"</body></html>\";\n }\n\n function printRecoveryCodes() {\n var w = window.open();\n w.document.write(buildPrintContent());\n w.print();\n w.close();\n }\n\n var printButton = document.getElementById(\"printRecoveryCodes\");\n printButton && printButton.addEventListener(\"click\", printRecoveryCodes);\n `\n }\n ]);\n }\n}\n","@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { type TemplateRef } from '@angular/core';
1
+ import { AfterViewInit, type TemplateRef } from '@angular/core';
2
2
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
3
3
  import type { I18n } from '@keycloakify/angular/login/i18n';
4
4
  import type { KcContext } from '@keycloakify/angular/login/KcContext';
5
5
  import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';
6
6
  import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
7
7
  import * as i0 from "@angular/core";
8
- export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
8
+ export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference implements AfterViewInit {
9
9
  kcContext: KcContext.LoginRecoveryAuthnCodeConfig;
10
10
  i18n: I18n;
11
11
  loginResourceInjectorService: LoginResourceInjectorService;
@@ -22,6 +22,7 @@ export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentRefe
22
22
  toggleRecoveryCodesConfirmation: import("@angular/core").WritableSignal<boolean>;
23
23
  olRecoveryCodesListId: string;
24
24
  constructor();
25
+ ngAfterViewInit(): void;
25
26
  static ɵfac: i0.ɵɵFactoryDeclaration<LoginRecoveryAuthnCodeConfigComponent, never>;
26
27
  static ɵcmp: i0.ɵɵComponentDeclaration<LoginRecoveryAuthnCodeConfigComponent, "kc-login-recovery-authn-code-config", never, {}, {}, never, never, true, never>;
27
28
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keycloakify/angular",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "peerDependencies": {
5
5
  "keycloakify": "^11.3.9",
6
6
  "@angular/core": "^18.0.0",
@@ -309,6 +309,12 @@
309
309
  "esm": "./esm2022/login/directives/kc-class/keycloakify-angular-login-directives-kc-class.mjs",
310
310
  "default": "./fesm2022/keycloakify-angular-login-directives-kc-class.mjs"
311
311
  },
312
+ "./login/providers/keycloakify-angular": {
313
+ "types": "./login/providers/keycloakify-angular/index.d.ts",
314
+ "esm2022": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
315
+ "esm": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
316
+ "default": "./fesm2022/keycloakify-angular-login-providers-keycloakify-angular.mjs"
317
+ },
312
318
  "./login/pages/code": {
313
319
  "types": "./login/pages/code/index.d.ts",
314
320
  "esm2022": "./esm2022/login/pages/code/keycloakify-angular-login-pages-code.mjs",
@@ -525,12 +531,6 @@
525
531
  "esm": "./esm2022/login/pages/webauthn-register/keycloakify-angular-login-pages-webauthn-register.mjs",
526
532
  "default": "./fesm2022/keycloakify-angular-login-pages-webauthn-register.mjs"
527
533
  },
528
- "./login/providers/keycloakify-angular": {
529
- "types": "./login/providers/keycloakify-angular/index.d.ts",
530
- "esm2022": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
531
- "esm": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
532
- "default": "./fesm2022/keycloakify-angular-login-providers-keycloakify-angular.mjs"
533
- },
534
534
  "./login/services/i18n": {
535
535
  "types": "./login/services/i18n/index.d.ts",
536
536
  "esm2022": "./esm2022/login/services/i18n/keycloakify-angular-login-services-i18n.mjs",
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';
1
+ import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';
2
2
  import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';
3
3
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
4
4
  import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';
@@ -24,7 +24,7 @@ import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
24
24
  }
25
25
  ]
26
26
  })
27
- export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
27
+ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference implements AfterViewInit {
28
28
  kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);
29
29
  i18n = inject<I18n>(LOGIN_I18N);
30
30
  loginResourceInjectorService = inject(LoginResourceInjectorService);
@@ -49,6 +49,9 @@ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
49
49
 
50
50
  constructor() {
51
51
  super();
52
+ }
53
+
54
+ ngAfterViewInit() {
52
55
  this.loginResourceInjectorService.insertAdditionalScripts([
53
56
  {
54
57
  type: 'text/javascript',