valtech-components 2.0.979 → 2.0.981
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/esm2022/lib/components/atoms/countdown/countdown.component.mjs +3 -3
- package/esm2022/lib/components/atoms/image/image.component.mjs +3 -3
- package/esm2022/lib/components/atoms/price-tag/price-tag.component.mjs +3 -3
- package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +3 -3
- package/esm2022/lib/components/molecules/accordion/accordion.component.mjs +3 -3
- package/esm2022/lib/components/molecules/action-card/action-card.component.mjs +3 -3
- package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +3 -3
- package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -3
- package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +3 -3
- package/esm2022/lib/components/molecules/comment/comment.component.mjs +3 -3
- package/esm2022/lib/components/molecules/content-reaction/content-reaction.component.mjs +3 -3
- package/esm2022/lib/components/molecules/currency-input/currency-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/date-range-input/date-range-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/footer-links/footer-links.component.mjs +3 -3
- package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +3 -3
- package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +3 -3
- package/esm2022/lib/components/molecules/number-stepper/number-stepper.component.mjs +3 -3
- package/esm2022/lib/components/molecules/page-links/page-links.component.mjs +3 -3
- package/esm2022/lib/components/molecules/pagination/pagination.component.mjs +3 -3
- package/esm2022/lib/components/molecules/phone-input/phone-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +3 -3
- package/esm2022/lib/components/molecules/rating/rating.component.mjs +3 -3
- package/esm2022/lib/components/molecules/segment-control/segment-control.component.mjs +3 -3
- package/esm2022/lib/components/molecules/share-buttons/share-buttons.component.mjs +3 -3
- package/esm2022/lib/components/molecules/stats-card/stats-card.component.mjs +3 -3
- package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -3
- package/esm2022/lib/components/molecules/swipe-carousel/swipe-carousel.component.mjs +3 -3
- package/esm2022/lib/components/molecules/tabs/tabs.component.mjs +3 -3
- package/esm2022/lib/components/molecules/textarea-input/textarea-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/timeline/timeline.component.mjs +3 -3
- package/esm2022/lib/components/organisms/attachment-uploader/attachment-uploader.component.mjs +3 -3
- package/esm2022/lib/components/organisms/bottom-nav/bottom-nav.component.mjs +3 -3
- package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +3 -3
- package/esm2022/lib/components/organisms/cookie-banner/cookie-banner.component.mjs +3 -3
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +3 -3
- package/esm2022/lib/components/organisms/debug-console/debug-console.component.mjs +2 -2
- package/esm2022/lib/components/organisms/mfa-modal/mfa-modal.component.mjs +3 -3
- package/esm2022/lib/components/organisms/preferences-view/preferences-view.component.mjs +59 -26
- package/esm2022/lib/services/preferences/preferences.service.mjs +3 -2
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +136 -102
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/preferences-view/preferences-view.component.d.ts +8 -4
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/components/styles/alert.scss +4 -4
|
@@ -498,7 +498,7 @@ export class MfaModalComponent {
|
|
|
498
498
|
this.toast.show({ message, duration: 3500 });
|
|
499
499
|
}
|
|
500
500
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MfaModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
501
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MfaModalComponent, isStandalone: true, selector: "val-mfa-modal", inputs: { isOpen: "isOpen", prefillCode: "prefillCode" }, outputs: { changed: "changed", enabledViaDeeplink: "enabledViaDeeplink", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\n <div class=\"mfa-secret-row\">\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n <ion-button fill=\"clear\" size=\"small\" (click)=\"copySecret(setup.secret)\" [attr.aria-label]=\"t('copy')\">\n @if (copiedSecret()) {\n <ion-icon name=\"checkmark-outline\"></ion-icon>\n } @else {\n <ion-icon name=\"copy-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span>{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"medium\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{display:inline-flex;align-items:center;width:fit-content;padding:4px 10px;border-radius:999px;font-size:13px;font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade);background:rgba(var(--ion-color-success-rgb),.12)}.mfa-status--off{color:var(--ion-color-medium-shade);background:var(--ion-color-light)}.mfa-secret-row{display:flex;align-items:center;gap:8px}.mfa-secret-row .mfa-secret{flex:1;margin:0}.mfa-secret-row ion-button{flex-shrink:0;--color: var(--ion-color-dark);margin:0}.mfa-error{color:var(--ion-color-danger);font-size:13px;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:20px;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:15px;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:15px;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:13px;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:14px;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: QrCodeComponent, selector: "val-qr-code", inputs: ["props"], outputs: ["actionComplete", "imageLoad", "imageError"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }] }); }
|
|
501
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MfaModalComponent, isStandalone: true, selector: "val-mfa-modal", inputs: { isOpen: "isOpen", prefillCode: "prefillCode" }, outputs: { changed: "changed", enabledViaDeeplink: "enabledViaDeeplink", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\n <div class=\"mfa-secret-row\">\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n <ion-button fill=\"clear\" size=\"small\" (click)=\"copySecret(setup.secret)\" [attr.aria-label]=\"t('copy')\">\n @if (copiedSecret()) {\n <ion-icon name=\"checkmark-outline\"></ion-icon>\n } @else {\n <ion-icon name=\"copy-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span>{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"medium\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{display:inline-flex;align-items:center;width:fit-content;padding:4px 10px;border-radius:999px;font-size:.8125rem;font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade);background:rgba(var(--ion-color-success-rgb),.12)}.mfa-status--off{color:var(--ion-color-medium-shade);background:var(--ion-color-light)}.mfa-secret-row{display:flex;align-items:center;gap:8px}.mfa-secret-row .mfa-secret{flex:1;margin:0}.mfa-secret-row ion-button{flex-shrink:0;--color: var(--ion-color-dark);margin:0}.mfa-error{color:var(--ion-color-danger);font-size:.8125rem;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:1.25rem;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:.8125rem;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9375rem;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.8125rem;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:.9375rem;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:.8125rem;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:.875rem;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: QrCodeComponent, selector: "val-qr-code", inputs: ["props"], outputs: ["actionComplete", "imageLoad", "imageError"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }] }); }
|
|
502
502
|
}
|
|
503
503
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MfaModalComponent, decorators: [{
|
|
504
504
|
type: Component,
|
|
@@ -523,7 +523,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
523
523
|
TextComponent,
|
|
524
524
|
TitleComponent,
|
|
525
525
|
PinInputComponent,
|
|
526
|
-
], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\n <div class=\"mfa-secret-row\">\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n <ion-button fill=\"clear\" size=\"small\" (click)=\"copySecret(setup.secret)\" [attr.aria-label]=\"t('copy')\">\n @if (copiedSecret()) {\n <ion-icon name=\"checkmark-outline\"></ion-icon>\n } @else {\n <ion-icon name=\"copy-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span>{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"medium\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{display:inline-flex;align-items:center;width:fit-content;padding:4px 10px;border-radius:999px;font-size:13px;font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade);background:rgba(var(--ion-color-success-rgb),.12)}.mfa-status--off{color:var(--ion-color-medium-shade);background:var(--ion-color-light)}.mfa-secret-row{display:flex;align-items:center;gap:8px}.mfa-secret-row .mfa-secret{flex:1;margin:0}.mfa-secret-row ion-button{flex-shrink:0;--color: var(--ion-color-dark);margin:0}.mfa-error{color:var(--ion-color-danger);font-size:13px;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:20px;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:15px;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:15px;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:13px;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:14px;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"] }]
|
|
526
|
+
], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n <ion-content class=\"ion-padding\">\n <section class=\"mfa-modal\">\n <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n @switch (step()) { @case ('loading') {\n <div class=\"mfa-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @case ('status') { @if (mfaEnabled()) {\n <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} \u00B7 {{ methodLabel(mfaMethod()) }}</p>\n\n @if (mfaMethod() === 'TOTP') {\n <div class=\"mfa-block\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n />\n\n @if (regeneratedCodes(); as codes) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of codes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n } @else { @if (backupCodesCount() < 3) {\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesLow') }}</p>\n </div>\n }\n <ion-button\n expand=\"block\"\n color=\"dark\"\n fill=\"outline\"\n [disabled]=\"working()\"\n (click)=\"regenerateBackupCodes()\"\n >\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaRegenerateCodes') }} }\n </ion-button>\n }\n </div>\n }\n\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n {{ t('mfaDisableButton') }}\n </ion-button>\n } @else {\n <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n } } @case ('method-select') {\n <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n <div class=\"mfa-method-list\" role=\"radiogroup\">\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n (click)=\"selectedMethod.set('TOTP')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodTotp') }}</strong>\n <span>{{ t('mfaMethodTotpHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n (click)=\"selectedMethod.set('EMAIL')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodEmail') }}</strong>\n <span>{{ t('mfaMethodEmailHint') }}</span>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"mfa-method-card\"\n [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n (click)=\"selectedMethod.set('SMS')\"\n role=\"radio\"\n [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n >\n <span class=\"mfa-method-card__dot\"></span>\n <span class=\"mfa-method-card__body\">\n <strong>{{ t('mfaMethodSms') }}</strong>\n <span>{{ t('mfaMethodSmsHint') }}</span>\n </span>\n </button>\n </div>\n\n @if (selectedMethod() === 'SMS' && !userPhone()) {\n <ion-input\n label=\"{{ t('mfaPhoneLabel') }}\"\n labelPlacement=\"floating\"\n fill=\"outline\"\n type=\"tel\"\n placeholder=\"+56912345678\"\n [formControl]=\"phoneControl\"\n ></ion-input>\n @if (phoneControl.invalid && phoneControl.touched) {\n <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n />\n }\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaContinue') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('totp-setup') {\n <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\n\n @if (totpQr(); as qr) {\n <div class=\"mfa-qr\">\n <val-qr-code [props]=\"{ qr: qr }\" />\n </div>\n } @if (totpSetup(); as setup) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\n <div class=\"mfa-secret-row\">\n <code class=\"mfa-secret\">{{ setup.secret }}</code>\n <ion-button fill=\"clear\" size=\"small\" (click)=\"copySecret(setup.secret)\" [attr.aria-label]=\"t('copy')\">\n @if (copiedSecret()) {\n <ion-icon name=\"checkmark-outline\"></ion-icon>\n } @else {\n <ion-icon name=\"copy-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaTotpVerify') }} }\n </ion-button>\n\n <div class=\"mfa-backup\">\n <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n <div class=\"mfa-alert\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n </div>\n <div class=\"mfa-codes\">\n @for (code of setup.backupCodes; track code) {\n <code class=\"mfa-code\">{{ code }}</code>\n }\n </div>\n <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n {{ t('mfaCopyCodes') }}\n </ion-button>\n </div>\n }\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('code-confirm') {\n <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n <val-text\n [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n />\n\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaConfirmButton') }} }\n </ion-button>\n\n <p class=\"mfa-resend\">\n {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n <span>{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n }\n </p>\n\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } @case ('disable') { @if (hasPassword()) {\n <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n } @else if (mfaMethod() === 'TOTP') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n @if (!disableCodeSent()) {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableSendCode') }} }\n </ion-button>\n } @else {\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n <div class=\"mfa-pin\">\n <val-pin-input [props]=\"pinInputProps\" />\n </div>\n <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n @if (working()) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ t('mfaDisableButton') }} }\n </ion-button>\n <ion-button expand=\"block\" fill=\"clear\" color=\"medium\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n {{ t('mfaDisableResendCode') }}\n </ion-button>\n } } @else {\n <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n }\n <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n {{ t('mfaCancel') }}\n </ion-button>\n } }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".mfa-modal{display:flex;flex-direction:column;gap:14px;padding-top:4px}.mfa-loading{display:flex;justify-content:center;padding:40px 0}.mfa-status{display:inline-flex;align-items:center;width:fit-content;padding:4px 10px;border-radius:999px;font-size:.8125rem;font-weight:600;margin:0}.mfa-status--on{color:var(--ion-color-success-shade);background:rgba(var(--ion-color-success-rgb),.12)}.mfa-status--off{color:var(--ion-color-medium-shade);background:var(--ion-color-light)}.mfa-secret-row{display:flex;align-items:center;gap:8px}.mfa-secret-row .mfa-secret{flex:1;margin:0}.mfa-secret-row ion-button{flex-shrink:0;--color: var(--ion-color-dark);margin:0}.mfa-error{color:var(--ion-color-danger);font-size:.8125rem;margin:4px 0 0}.mfa-block,.mfa-backup{display:flex;flex-direction:column;gap:12px}.mfa-block{padding:16px;border-radius:14px;background:var(--ion-color-light)}.mfa-alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light);border-left:3px solid var(--ion-color-primary)}.mfa-alert ion-icon{font-size:1.25rem;color:var(--ion-color-primary);flex-shrink:0;margin-top:1px}.mfa-alert p{margin:0;font-size:.8125rem;line-height:1.45;color:var(--ion-color-dark)}.mfa-qr{display:flex;justify-content:center;padding:8px 0}.mfa-secret{display:block;padding:10px 12px;border-radius:8px;background:var(--ion-color-light);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9375rem;letter-spacing:.04em;word-break:break-all;text-align:center}.mfa-pin{display:flex;justify-content:center;padding:8px 0}.mfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:12px;border-radius:12px;background:var(--ion-color-light)}.mfa-code{padding:8px;border-radius:6px;background:var(--ion-background-color, #fff);color:var(--ion-color-dark);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.8125rem;text-align:center}.mfa-method-list{display:flex;flex-direction:column;gap:8px}.mfa-method-card{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(var(--ion-color-dark-rgb), .14));background:transparent;cursor:pointer;text-align:left;width:100%;transition:border-color .15s ease,background .15s ease}.mfa-method-card--active{border-color:var(--ion-color-primary);background:rgba(var(--ion-color-primary-rgb),.07)}.mfa-method-card__dot{flex-shrink:0;width:18px;height:18px;border-radius:50%;border:2px solid var(--ion-color-medium);margin-top:2px;transition:border-color .15s,box-shadow .15s}.mfa-method-card--active .mfa-method-card__dot{border-color:var(--ion-color-primary);box-shadow:inset 0 0 0 4px var(--ion-color-primary)}.mfa-method-card__body{display:flex;flex-direction:column;gap:3px}.mfa-method-card__body strong{font-size:.9375rem;font-weight:600;color:var(--ion-color-dark)}.mfa-method-card__body span{font-size:.8125rem;color:var(--ion-color-medium);line-height:1.4}.mfa-resend{text-align:center;font-size:.875rem;color:var(--ion-color-dark);margin:4px 0}.mfa-resend a{color:var(--ion-color-primary);cursor:pointer;font-weight:600}\n"] }]
|
|
527
527
|
}], ctorParameters: () => [], propDecorators: { isOpen: [{
|
|
528
528
|
type: Input
|
|
529
529
|
}], prefillCode: [{
|
|
@@ -535,4 +535,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
535
535
|
}], dismissed: [{
|
|
536
536
|
type: Output
|
|
537
537
|
}] } });
|
|
538
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWZhLW1vZGFsL21mYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21mYS1tb2RhbC9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFj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QVEsc0RBR1IsVUFBVSx5R0FDVixVQUFVLG1GQUNWLGdCQUFnQiwyRUFDaEIsYUFBYSw4SEFDYixlQUFlLG1JQUNmLGFBQWEsd0VBQ2IsY0FBYyx5RUFDZCxpQkFBaUI7OzRGQUtSLGlCQUFpQjtrQkE1QjdCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLFNBQVM7d0JBQ1QsVUFBVTt3QkFDVixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLE9BQU87d0JBQ1AsUUFBUTt3QkFDUixRQUFRO3dCQUNSLFFBQVE7d0JBQ1IsYUFBYTt3QkFDYixVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGlCQUFpQjtxQkFDbEI7d0RBU0csTUFBTTtzQkFEVCxLQUFLO2dCQXFCRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLE9BQU87c0JBQWhCLE1BQU07Z0JBT0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgSW9uQnV0dG9uLFxuICBJb25CdXR0b25zLFxuICBJb25Db250ZW50LFxuICBJb25IZWFkZXIsXG4gIElvbkljb24sXG4gIElvbklucHV0LFxuICBJb25JdGVtLFxuICBJb25MYWJlbCxcbiAgSW9uTW9kYWwsXG4gIElvblJhZGlvLFxuICBJb25SYWRpb0dyb3VwLFxuICBJb25TcGlubmVyLFxuICBJb25Ub29sYmFyLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgaW5mb3JtYXRpb25DaXJjbGVPdXRsaW5lLCBjb3B5T3V0bGluZSwgY2hlY2ttYXJrT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcblxuaW1wb3J0IHsgU29saWREZWZhdWx0QmxvY2sgfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vZmFjdG9yeSc7XG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBRckNvZGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9xci1jb2RlL3FyLWNvZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBpbklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3Bpbi1pbnB1dC9waW4taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlcywgRm9ybU1ldGFkYXRhLCBGb3JtU3VibWl0LCBJbnB1dFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgnO1xuaW1wb3J0IHsgTUZBTWV0aG9kLCBUT1RQU2V0dXBSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UsIElucHV0STE4bkhlbHBlciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgUXJHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcXItZ2VuZXJhdG9yL3FyLWdlbmVyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFFyUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcXItZ2VuZXJhdG9yL3R5cGVzJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuXG4vKiogUGFzbyBkZWwgZmx1am8gZGVsIG1vZGFsLiAqL1xudHlwZSBNZmFTdGVwID0gJ2xvYWRpbmcnIHwgJ3N0YXR1cycgfCAnbWV0aG9kLXNlbGVjdCcgfCAndG90cC1zZXR1cCcgfCAnY29kZS1jb25maXJtJyB8ICdkaXNhYmxlJztcblxuLyoqIFNlZ3VuZG9zIGRlIGVzcGVyYSBhbnRlcyBkZSBwb2RlciByZWVudmlhciBlbCBjw7NkaWdvIEVNQUlML1NNUy4gKi9cbmNvbnN0IFJFU0VORF9DT09MRE9XTl9TRUNPTkRTID0gMzA7XG5cbi8qKlxuICogYHZhbC1tZmEtbW9kYWxgIOKAlCBtb2RhbCBkZSBnZXN0acOzbiBkZSBhdXRlbnRpY2FjacOzbiBkZSBkb3MgZmFjdG9yZXMgKE1GQSlcbiAqIHBhcmEgdW4gdXN1YXJpbyBhdXRlbnRpY2Fkby4gTWlzbW8gcGF0csOzbiBxdWUgYHZhbC1jaGFuZ2UtcGFzc3dvcmQtbW9kYWxgLlxuICpcbiAqIEZsdWpvIChtw6FxdWluYSBkZSBlc3RhZG9zIGludGVybmEpOlxuICogIC0gYGxvYWRpbmdgIOKGkiBgZ2V0UHJvZmlsZSgpYCBwYXJhIGNvbm9jZXIgZWwgZXN0YWRvIE1GQS5cbiAqICAtIGBzdGF0dXNgIOKGkiBtdWVzdHJhIE1GQSBoYWJpbGl0YWRvL2Rlc2hhYmlsaXRhZG8uIFNpIGVzdMOhIGhhYmlsaXRhZG86XG4gKiAgICBnZXN0acOzbiBkZSBiYWNrdXAgY29kZXMgKFRPVFApICsgZGVzaGFiaWxpdGFyLiBTaSBubzogYm90w7NuIGhhYmlsaXRhci5cbiAqICAtIGBtZXRob2Qtc2VsZWN0YCDihpIgZWxlZ2lyIFRPVFAgLyBFTUFJTCAvIFNNUy5cbiAqICAtIGB0b3RwLXNldHVwYCDihpIgUVIgKyBzZWNyZXRvIG1hbnVhbCArIGJhY2t1cCBjb2RlcyDihpIgdmVyaWZpY2FyIGPDs2RpZ28uXG4gKiAgLSBgY29kZS1jb25maXJtYCDihpIgKEVNQUlML1NNUykgaW5ncmVzYXIgY8OzZGlnbyByZWNpYmlkbywgY29uIHJlZW52w61vLlxuICogIC0gYGRpc2FibGVgIOKGkiBjb250cmFzZcOxYSBwYXJhIGRlc2hhYmlsaXRhciBNRkEuXG4gKlxuICogRWwgUVIgc2UgZ2VuZXJhICoqY2xpZW50LXNpZGUqKiAoYFFyR2VuZXJhdG9yU2VydmljZWApIOKAlCBlbCBzZWNyZXRvIFRPVFBcbiAqIG51bmNhIHNhbGUgZGVsIG5hdmVnYWRvci5cbiAqXG4gKiBTZWxmLWNvbnRhaW5lZDogaW55ZWN0YSBgQXV0aFNlcnZpY2VgIHkgbGxhbWEgbG9zIGVuZHBvaW50cyBkaXJlY3RvLiBMYSBhcHBcbiAqIGNvbnRyb2xhIGBbaXNPcGVuXWAgeSByZWFjY2lvbmEgYSBgKGNoYW5nZWQpYCAvIGAoZGlzbWlzc2VkKWAuXG4gKlxuICogaTE4bjogbmFtZXNwYWNlIGNvbXBhcnRpZG8gYF9hdXRoYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1tZmEtbW9kYWxcbiAqICAgW2lzT3Blbl09XCJpc01vZGFsT3BlbigpXCJcbiAqICAgKGRpc21pc3NlZCk9XCJpc01vZGFsT3Blbi5zZXQoZmFsc2UpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW1mYS1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25CdXR0b25zLFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uSGVhZGVyLFxuICAgIElvbkljb24sXG4gICAgSW9uSW5wdXQsXG4gICAgSW9uSXRlbSxcbiAgICBJb25MYWJlbCxcbiAgICBJb25Nb2RhbCxcbiAgICBJb25SYWRpbyxcbiAgICBJb25SYWRpb0dyb3VwLFxuICAgIElvblNwaW5uZXIsXG4gICAgSW9uVG9vbGJhcixcbiAgICBEaXNwbGF5Q29tcG9uZW50LFxuICAgIEZvcm1Db21wb25lbnQsXG4gICAgUXJDb2RlQ29tcG9uZW50LFxuICAgIFRleHRDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgUGluSW5wdXRDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZmEtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWZhTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKiogQ29udHJvbGEgbGEgdmlzaWJpbGlkYWQuIENhZGEgYXBlcnR1cmEgcmUtcmVzdWVsdmUgZWwgZXN0YWRvIE1GQS4gKi9cbiAgQElucHV0KClcbiAgc2V0IGlzT3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9wZW5pbmcgPSB2YWx1ZSAmJiAhdGhpcy5faXNPcGVuO1xuICAgIHRoaXMuX2lzT3BlbiA9IHZhbHVlO1xuICAgIGlmIChvcGVuaW5nKSB7XG4gICAgICAvLyBEaWZlcmltb3MgYWwgcHLDs3hpbW8gbWljcm90YXNrIHBhcmEgcXVlIGVsIHJlc3RvIGRlIEBJbnB1dFxuICAgICAgLy8gKGBwcmVmaWxsQ29kZWApIHlhIGVzdMOpbiBhc2lnbmFkb3Mg4oCUIEFuZ3VsYXIgcHJvY2VzYSBsb3MgaW5wdXRzIGVuXG4gICAgICAvLyBvcmRlbiBkZSBkZWNsYXJhY2nDs24sIHkgc2luIGVzdG8gYG9wZW4oKWAgbGVlIGBwcmVmaWxsQ29kZWAgdW5kZWZpbmVkXG4gICAgICAvLyBjdWFuZG8gZWwgcGFkcmUgc2V0ZWEgYW1ib3MgZW4gZWwgbWlzbW8gdGljayAoZGVlcC1saW5rIE1GQS1lbWFpbCkuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLm9wZW4oKSk7XG4gICAgfVxuICB9XG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDw7NkaWdvIE1GQSBwcmUtY2FyZ2FkbyAoZGVlcC1saW5rIGRlc2RlIGVsIGVtYWlsIGRlIHNldHVwIE1GQS1lbWFpbCkuIFNpXG4gICAqIGVzdMOhIHByZXNlbnRlIGFsIGFicmlyLCBlbCBtb2RhbCBzYWx0YSBkaXJlY3RvIGFsIHBhc28gZGUgY29uZmlybWFjacOzblxuICAgKiBjb24gZWwgY8OzZGlnbyByZWxsZW5hZG8uXG4gICAqL1xuICBASW5wdXQoKSBwcmVmaWxsQ29kZT86IHN0cmluZztcblxuICAvKiogRW1pdGUgY3VhbmRvIGVsIGVzdGFkbyBNRkEgY2FtYmlhIChoYWJpbGl0YWRvIC8gZGVzaGFiaWxpdGFkbykuICovXG4gIEBPdXRwdXQoKSBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0aWRvIGN1YW5kbyB1biBzZXR1cCBNRkEgc2UgY29uZmlybWEgZXhpdG9zYW1lbnRlIHkgZWwgbW9kYWwgZnVlIGFiaWVydG9cbiAgICogdsOtYSBkZWVwLWxpbmsgKGNvbiBgcHJlZmlsbENvZGVgKS4gRWwgaG9zdCBwdWVkZSB1c2FybG8gcGFyYSBjZXJyYXIgZWxcbiAgICogbW9kYWwgeSBuYXZlZ2FyIChlai4gYSBob21lKSBlbiBsdWdhciBkZSBxdWVkYXJzZSBlbiBsYSBww6FnaW5hIGRlIFNlY3VyaXR5LlxuICAgKi9cbiAgQE91dHB1dCgpIGVuYWJsZWRWaWFEZWVwbGluayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdGUgY3VhbmRvIGVsIHVzZXIgY2llcnJhIGVsIG1vZGFsIChib3TDs24gWCBvIGJhY2tkcm9wKS4gKi9cbiAgQE91dHB1dCgpIGRpc21pc3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0ID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgaTE4bkhlbHBlciA9IGluamVjdChJbnB1dEkxOG5IZWxwZXIpO1xuICBwcml2YXRlIHFyR2VuID0gaW5qZWN0KFFyR2VuZXJhdG9yU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RlcCA9IHNpZ25hbDxNZmFTdGVwPignbG9hZGluZycpO1xuICAvKiogUGFzbyBhY3R1YWwgZGVsIGZsdWpvLiAqL1xuICByZWFkb25seSBzdGVwID0gdGhpcy5fc3RlcC5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqIGB0cnVlYCBtaWVudHJhcyB1bmEgbGxhbWFkYSBhbCBiYWNrZW5kIGVzdMOhIGVuIGN1cnNvLiAqL1xuICByZWFkb25seSB3b3JraW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBFc3RhZG8gTUZBIGFjdHVhbC5cbiAgcmVhZG9ubHkgbWZhRW5hYmxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IG1mYU1ldGhvZCA9IHNpZ25hbDxNRkFNZXRob2QgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdXNlclBob25lID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBiYWNrdXBDb2Rlc0NvdW50ID0gc2lnbmFsKDApO1xuICAvKiogRGVmYXVsdCB0cnVlIHBhcmEgbm8gcm9tcGVyIGVsIGZsb3cgdmllam8gc2kgZWwgYmFja2VuZCBubyBkZXZ1ZWx2ZSBlbCBjYW1wby4gKi9cbiAgcmVhZG9ubHkgaGFzUGFzc3dvcmQgPSBzaWduYWwodHJ1ZSk7XG5cbiAgLy8gRXN0YWRvIGRlbCBmbHVqbyBkZSBoYWJpbGl0YWNpw7NuLlxuICByZWFkb25seSBzZWxlY3RlZE1ldGhvZCA9IHNpZ25hbDxNRkFNZXRob2Q+KCdUT1RQJyk7XG4gIHJlYWRvbmx5IHRvdHBTZXR1cCA9IHNpZ25hbDxUT1RQU2V0dXBSZXNwb25zZSB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSB0b3RwUXIgPSBzaWduYWw8UXJSZXN1bHQgfCBudWxsPihudWxsKTtcbiAgLyoqIEPDs2RpZ29zIGRlIHJlc3BhbGRvIHJlY2nDqW4gcmVnZW5lcmFkb3Mg4oCUIHNlIG11ZXN0cmFuIHVuYSBzb2xhIHZlei4gKi9cbiAgcmVhZG9ubHkgcmVnZW5lcmF0ZWRDb2RlcyA9IHNpZ25hbDxzdHJpbmdbXSB8IG51bGw+KG51bGwpO1xuICAvKiogTWFyY2EgbW9tZW50w6FuZWEgY3VhbmRvIGVsIHNlY3JldG8gVE9UUCBzZSBhY2FiYSBkZSBjb3BpYXIgKGZlZWRiYWNrIHZpc3VhbCkuICovXG4gIHJlYWRvbmx5IGNvcGllZFNlY3JldCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHJlc2VuZENvb2xkb3duID0gc2lnbmFsKDApO1xuICByZWFkb25seSBkaXNhYmxlQ29kZVNlbnQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IHBpbkNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNildKTtcbiAgcmVhZG9ubHkgcGhvbmVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKC9eXFwrWzEtOV1cXGR7NiwxNH0kLyldKTtcblxuICByZWFkb25seSBwaW5JbnB1dFByb3BzID0ge1xuICAgIGNvbnRyb2w6IHRoaXMucGluQ29udHJvbCxcbiAgICB0b2tlbjogJ21mYS1jb2RlJyxcbiAgICBsZW5ndGg6IDYsXG4gICAgYWxsb3dOdW1iZXJzT25seTogdHJ1ZSxcbiAgICBhdXRvRm9jdXM6IHRydWUsXG4gIH07XG5cbiAgLyoqIEZvcm0gZGUgZGVzaGFiaWxpdGFjacOzbiDigJQgYHZhbC1mb3JtYCBjb24gdW4gY2FtcG8gZGUgY29udHJhc2XDsWEuICovXG4gIHJlYWRvbmx5IGRpc2FibGVGb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGE+KCgpID0+XG4gICAgdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdtZmFEaXNhYmxlVGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLnQoJ21mYURpc2FibGVQcm9tcHQnKSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBBU1NXT1JELFxuICAgICAgICAgICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICB0b2tlbjogJ21mYS1kaXNhYmxlLXBhc3N3b3JkJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdtZmFQYXNzd29yZExhYmVsJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czogeyByZXF1aXJlZDogJ21mYVBhc3N3b3JkUmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLlNvbGlkRGVmYXVsdEJsb2NrKCcnLCAnc3VibWl0JyksXG4gICAgICAgIHRva2VuOiAnbWZhLWRpc2FibGUtc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ21mYURpc2FibGVCdXR0b24nLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLndvcmtpbmcoKSA/IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfSlcbiAgKTtcblxuICBwcml2YXRlIHJlc2VuZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZGRJY29ucyh7IGluZm9ybWF0aW9uQ2lyY2xlT3V0bGluZSwgY29weU91dGxpbmUsIGNoZWNrbWFya091dGxpbmUgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICB9XG5cbiAgLyoqIFRyYWR1Y2UgdW5hIGNsYXZlIGRlbCBuYW1lc3BhY2UgYF9hdXRoYC4gKi9cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ19hdXRoJyk7XG4gIH1cblxuICAvKiogQ2llcnJlIGluaWNpYWRvIHBvciBlbCB1c2VyIChYIC8gYmFja2Ryb3ApLiAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogUHVudG8gZGUgZW50cmFkYSBhbCBhYnJpciBlbCBtb2RhbC4gQ29uIGBwcmVmaWxsQ29kZWAgKGRlZXAtbGluayBkZWwgZW1haWxcbiAgICogZGUgc2V0dXAgTUZBLWVtYWlsKSBzYWx0YSBkaXJlY3RvIGEgbGEgY29uZmlybWFjacOzbjsgc2kgbm8sIHJlc3VlbHZlIGVsXG4gICAqIGVzdGFkbyBNRkEgYWN0dWFsLlxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWZpbGxDb2RlKSB7XG4gICAgICB0aGlzLnJlc2V0RmxvdygpO1xuICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZC5zZXQoJ0VNQUlMJyk7XG4gICAgICB0aGlzLnBpbkNvbnRyb2wuc2V0VmFsdWUodGhpcy5wcmVmaWxsQ29kZSk7XG4gICAgICB0aGlzLl9zdGVwLnNldCgnY29kZS1jb25maXJtJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENhcmdhIGRlIGVzdGFkb1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ29uc3VsdGEgZWwgcGVyZmlsIHBhcmEgY29ub2NlciBlbCBlc3RhZG8gTUZBIHkgcG9zaWNpb25hciBlbCBmbHVqby4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlU3RhdHVzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXAuc2V0KCdsb2FkaW5nJyk7XG4gICAgdGhpcy5yZXNldEZsb3coKTtcbiAgICB0aGlzLmF1dGguZ2V0UHJvZmlsZSgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBwcm9maWxlID0+IHtcbiAgICAgICAgdGhpcy5tZmFFbmFibGVkLnNldChwcm9maWxlLm1mYUVuYWJsZWQpO1xuICAgICAgICB0aGlzLm1mYU1ldGhvZC5zZXQocHJvZmlsZS5tZmFNZXRob2QgPz8gbnVsbCk7XG4gICAgICAgIHRoaXMudXNlclBob25lLnNldChwcm9maWxlLnBob25lID8/IG51bGwpO1xuICAgICAgICB0aGlzLmhhc1Bhc3N3b3JkLnNldChwcm9maWxlLmhhc1Bhc3N3b3JkID8/IHRydWUpO1xuICAgICAgICBpZiAocHJvZmlsZS5tZmFFbmFibGVkICYmIHByb2ZpbGUubWZhTWV0aG9kID09PSAnVE9UUCcpIHtcbiAgICAgICAgICB0aGlzLmxvYWRCYWNrdXBDb3VudCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0ZXAuc2V0KCdzdGF0dXMnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAvLyBGYWxsYmFjazogdXNhciBlbCBzaWduYWwgZGUgdXN1YXJpbyBlbiBzZXNpw7NuLlxuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoLnVzZXIoKTtcbiAgICAgICAgdGhpcy5tZmFFbmFibGVkLnNldCh1c2VyPy5tZmFFbmFibGVkID8/IGZhbHNlKTtcbiAgICAgICAgdGhpcy5tZmFNZXRob2Quc2V0KHVzZXI/Lm1mYU1ldGhvZCA/PyBudWxsKTtcbiAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ3N0YXR1cycpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJhY2t1cENvdW50KCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aC5nZXRCYWNrdXBDb2Rlc0NvdW50KCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB0aGlzLmJhY2t1cENvZGVzQ291bnQuc2V0KHJlcy5jb3VudCksXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5iYWNrdXBDb2Rlc0NvdW50LnNldCgwKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOYXZlZ2FjacOzbiBlbnRyZSBwYXNvc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBnb1RvTWV0aG9kU2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMucmVnZW5lcmF0ZWRDb2Rlcy5zZXQobnVsbCk7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ21ldGhvZC1zZWxlY3QnKTtcbiAgfVxuXG4gIGdvVG9EaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMuX3N0ZXAuc2V0KCdkaXNhYmxlJyk7XG4gIH1cblxuICBiYWNrVG9TdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgICB0aGlzLmRpc2FibGVDb2RlU2VudC5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhhYmlsaXRhciBNRkFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvbnRpbsO6YSBkZXNkZSBlbCBzZWxlY3RvciBkZSBtw6l0b2RvIGFsIHNldHVwIGNvcnJlc3BvbmRpZW50ZS4gKi9cbiAgcHJvY2VlZFdpdGhNZXRob2QoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCgpO1xuICAgIGlmIChtZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgdGhpcy5zZXR1cFRvdHAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGhvbmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobWV0aG9kID09PSAnU01TJyAmJiAhdGhpcy51c2VyUGhvbmUoKSkge1xuICAgICAgaWYgKHRoaXMucGhvbmVDb250cm9sLmludmFsaWQpIHtcbiAgICAgICAgdGhpcy5waG9uZUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBob25lSW52YWxpZCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGhvbmUgPSB0aGlzLnBob25lQ29udHJvbC52YWx1ZSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguc2V0dXBNRkEobWV0aG9kLCBwaG9uZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmNvZGVTZW50KSB7XG4gICAgICAgICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ2NvZGUtY29uZmlybScpO1xuICAgICAgICAgIHRoaXMuc3RhcnRDb29sZG93bigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwVG90cCgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZXR1cFRPVFAoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy50b3RwU2V0dXAuc2V0KHJlcyk7XG4gICAgICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgICAgICB0aGlzLnFyR2VuXG4gICAgICAgICAgLmdlbmVyYXRlKHsgZGF0YTogcmVzLnFyQ29kZVVybCwgd2lkdGg6IDIyMCB9KVxuICAgICAgICAgIC50aGVuKHFyID0+IHRoaXMudG90cFFyLnNldChxcikpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMudG90cFFyLnNldChudWxsKSk7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgndG90cC1zZXR1cCcpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFZlcmlmaWNhIGVsIGPDs2RpZ28gVE9UUCBkZSBsYSBhcHAgZGUgYXV0ZW50aWNhY2nDs24geSBhY3RpdmEgTUZBLiAqL1xuICB2ZXJpZnlUb3RwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLnBpbkNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVJbnZhbGlkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC52ZXJpZnlUT1RQU2V0dXAoY29kZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUVuYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uZmlybWEgZWwgY8OzZGlnbyBFTUFJTC9TTVMgeSBhY3RpdmEgTUZBLiAqL1xuICBjb25maXJtQ29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5waW5Db250cm9sLnZhbHVlO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFDb2RlSW52YWxpZCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICBjb25zdCBjYW1lRnJvbURlZXBsaW5rID0gISF0aGlzLnByZWZpbGxDb2RlO1xuICAgIHRoaXMuYXV0aC5jb25maXJtTUZBKGNvZGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlcy5tZmFFbmFibGVkKSB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFFbmFibGVkT2snKSk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkLmVtaXQoKTtcbiAgICAgICAgICBpZiAoY2FtZUZyb21EZWVwbGluaykge1xuICAgICAgICAgICAgLy8gRWwgdXNlciBsbGVnw7MgdsOtYSBsaW5rIGRlbCBlbWFpbCDihpIgZWwgaG9zdCBzZSBlbmNhcmdhIGRlIGNlcnJhclxuICAgICAgICAgICAgLy8gZWwgbW9kYWwgeSBuYXZlZ2FyIChlai4gYSBob21lKS4gTm8gcmVzb2x2ZW1vcyBzdGF0dXMgYWPDoSBwb3JxdWVcbiAgICAgICAgICAgIC8vIGltcGxpY2Fyw61hIGRlamFyIGVsIG1vZGFsIGFiaWVydG8gbW9zdHJhbmRvIGVsIGVzdGFkbyBudWV2by5cbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZFZpYURlZXBsaW5rLmVtaXQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVlbnbDrWEgZWwgY8OzZGlnbyBFTUFJTC9TTVMgKHJlLWVqZWN1dGEgZWwgc2V0dXApLiAqL1xuICByZXNlbmRDb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZENvb2xkb3duKCkgPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJvY2VlZFdpdGhNZXRob2QoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHZXN0acOzbiAoTUZBIGhhYmlsaXRhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZWdlbmVyYSBsb3MgY8OzZGlnb3MgZGUgcmVzcGFsZG8gVE9UUCB5IGxvcyBtdWVzdHJhIHVuYSB2ZXouICovXG4gIHJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5yZWdlbmVyYXRlQmFja3VwQ29kZXMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuYmFja3VwQ29kZXNDb3VudC5zZXQocmVzLmJhY2t1cENvZGVzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVnZW5lcmF0ZWRDb2Rlcy5zZXQocmVzLmJhY2t1cENvZGVzKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZXNoYWJpbGl0YSBNRkEgdXNhbmRvIGxhIGNvbnRyYXNlw7FhIGRlIGxhIGN1ZW50YS4gKi9cbiAgb25EaXNhYmxlU3VibWl0KGV2ZW50OiBGb3JtU3VibWl0KTogdm9pZCB7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBldmVudC5maWVsZHNbJ3Bhc3N3b3JkJ107XG4gICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFQYXNzd29yZFJlcXVpcmVkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGUoeyBwYXNzd29yZCB9KTtcbiAgfVxuXG4gIC8qKiBEZXNoYWJpbGl0YSBNRkEgdXNhbmRvIHVuIGPDs2RpZ28gVE9UUCDigJQgcGFyYSBjdWVudGFzIE9BdXRoLW9ubHkgc2luIGNvbnRyYXNlw7FhLiAqL1xuICBkaXNhYmxlV2l0aE1mYUNvZGUoKTogdm9pZCB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMucGluQ29udHJvbC52YWx1ZTtcbiAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhQ29kZUludmFsaWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZSh7IG1mYUNvZGU6IGNvZGUgfSk7XG4gIH1cblxuICBzZW5kRGlzYWJsZUNvZGUoKTogdm9pZCB7XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguc2VuZE1GQURpc2FibGVDb2RlKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUNvZGVTZW50LnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFEaXNhYmxlQ29kZVNlbnQnKSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGUoaW5wdXQ6IHsgcGFzc3dvcmQ/OiBzdHJpbmc7IG1mYUNvZGU/OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLmRpc2FibGVNRkEoaW5wdXQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlcy5tZmFEaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRGlzYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29waWEgdW5hIGxpc3RhIGRlIGPDs2RpZ29zIGRlIHJlc3BhbGRvIGFsIHBvcnRhcGFwZWxlcy4gKi9cbiAgYXN5bmMgY29weUNvZGVzKGNvZGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb2Rlcy5qb2luKCdcXG4nKSk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVzQ29waWVkJykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogc2luIHJlY3Vyc28gZGUgY29waWEgZGlzcG9uaWJsZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDb3BpYSBlbCBzZWNyZXRvIFRPVFAgYWwgcG9ydGFwYXBlbGVzICsgZmVlZGJhY2sgdmlzdWFsIChjaGVjaykgZHVyYW50ZSAycy4gKi9cbiAgYXN5bmMgY29weVNlY3JldChzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWNyZXQpO1xuICAgICAgdGhpcy5jb3BpZWRTZWNyZXQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFTZWNyZXRDb3BpZWQnKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29waWVkU2VjcmV0LnNldChmYWxzZSksIDIwMDApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogc2luIHJlY3Vyc28gZGUgY29waWEgZGlzcG9uaWJsZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFdGlxdWV0YSBpMThuIGxlZ2libGUgcGFyYSB1biBtw6l0b2RvIE1GQS4gKi9cbiAgbWV0aG9kTGFiZWwobWV0aG9kOiBNRkFNZXRob2QgfCBudWxsKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnVE9UUCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFRvdHAnKTtcbiAgICAgIGNhc2UgJ0VNQUlMJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kRW1haWwnKTtcbiAgICAgIGNhc2UgJ1NNUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFNtcycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVzZXRGbG93KCk6IHZvaWQge1xuICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMucGhvbmVDb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy50b3RwU2V0dXAuc2V0KG51bGwpO1xuICAgIHRoaXMudG90cFFyLnNldChudWxsKTtcbiAgICB0aGlzLnJlZ2VuZXJhdGVkQ29kZXMuc2V0KG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRNZXRob2Quc2V0KCdUT1RQJyk7XG4gICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDb29sZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KFJFU0VORF9DT09MRE9XTl9TRUNPTkRTKTtcbiAgICB0aGlzLnJlc2VuZFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNlbmRDb29sZG93bi51cGRhdGUodiA9PiB2IC0gMSk7XG4gICAgICBpZiAodGhpcy5yZXNlbmRDb29sZG93bigpIDw9IDApIHtcbiAgICAgICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENvb2xkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVzZW5kVGltZXIpO1xuICAgICAgdGhpcy5yZXNlbmRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KDApO1xuICB9XG5cbiAgLyoqIE1hcGVhIGxvcyBjw7NkaWdvcyBkZSBlcnJvciBNRkEgZGVsIGJhY2tlbmQgYSBtZW5zYWplcyBkZWwgbmFtZXNwYWNlIGBfYXV0aGAuICovXG4gIHByaXZhdGUgcmVzb2x2ZUVycm9yKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IChlcnIgYXMgeyBjb2RlPzogc3RyaW5nIH0pPy5jb2RlO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9JTlZBTElEX0NPREUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckludmFsaWRDb2RlJyk7XG4gICAgICBjYXNlICdBVVRIVjJfRVhQSVJFRF9DT0RFJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JFeHBpcmVkQ29kZScpO1xuICAgICAgY2FzZSAnQVVUSFYyX0NPREVfVVNFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yQ29kZVVzZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfQUxSRUFEWV9BQ1RJVkUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckFscmVhZHlBY3RpdmUnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfTk9UX0VOQUJMRUQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvck5vdEVuYWJsZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9QSE9ORV9SRVFVSVJFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVSZXF1aXJlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BIT05FX0VYSVNUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVFeGlzdHMnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9UT09fTUFOWV9BVFRFTVBUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ2Vycm9yVG9vTWFueUF0dGVtcHRzJyk7XG4gICAgICBjYXNlICdBVVRIVjJfSU5WQUxJRF9DVVJSRU5UX1BBU1NXT1JEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JDdXJyZW50UGFzc3dvcmRXcm9uZycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JHZW5lcmljJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHsgbWVzc2FnZSwgZHVyYXRpb246IDM1MDAgfSk7XG4gIH1cbn1cbiIsIjxpb24tbW9kYWwgW2lzT3Blbl09XCJpc09wZW5cIiAoZGlkRGlzbWlzcyk9XCJjbG9zZSgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJtZmEtbW9kYWxcIj5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYU1hbmFnZVRpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG5cbiAgICAgICAgQHN3aXRjaCAoc3RlcCgpKSB7IEBjYXNlICgnbG9hZGluZycpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1sb2FkaW5nXCI+XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBjYXNlICgnc3RhdHVzJykgeyBAaWYgKG1mYUVuYWJsZWQoKSkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb25cIj57eyB0KCdtZmFFbmFibGVkTGFiZWwnKSB9fSDCtyB7eyBtZXRob2RMYWJlbChtZmFNZXRob2QoKSkgfX08L3A+XG5cbiAgICAgICAgQGlmIChtZmFNZXRob2QoKSA9PT0gJ1RPVFAnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmxvY2tcIj5cbiAgICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IHRydWUsIGNvbnRlbnQ6IHQoJ21mYUJhY2t1cENvZGVzVGl0bGUnKSB9XCIgLz5cbiAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgIFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhQmFja3VwQ29kZXNBdmFpbGFibGUnKSArICc6ICcgKyBiYWNrdXBDb2Rlc0NvdW50KCkgfVwiXG4gICAgICAgICAgLz5cblxuICAgICAgICAgIEBpZiAocmVnZW5lcmF0ZWRDb2RlcygpOyBhcyBjb2Rlcykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYWxlcnRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHA+e3sgdCgnbWZhQmFja3VwQ29kZXNTYXZlV2FybmluZycpIH19IHt7IHQoJ21mYUJhY2t1cENvZGVzRXhwbGFpbicpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtY29kZXNcIj5cbiAgICAgICAgICAgIEBmb3IgKGNvZGUgb2YgY29kZXM7IHRyYWNrIGNvZGUpIHtcbiAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwibWZhLWNvZGVcIj57eyBjb2RlIH19PC9jb2RlPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJkYXJrXCIgZmlsbD1cIm91dGxpbmVcIiAoY2xpY2spPVwiY29weUNvZGVzKGNvZGVzKVwiPlxuICAgICAgICAgICAge3sgdCgnbWZhQ29weUNvZGVzJykgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfSBAZWxzZSB7IEBpZiAoYmFja3VwQ29kZXNDb3VudCgpIDwgMykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYWxlcnRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHA+e3sgdCgnbWZhQmFja3VwQ29kZXNMb3cnKSB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgICAgICBmaWxsPVwib3V0bGluZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid29ya2luZygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZWdlbmVyYXRlQmFja3VwQ29kZXMoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYVJlZ2VuZXJhdGVDb2RlcycpIH19IH1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJkYXJrXCIgZmlsbD1cIm91dGxpbmVcIiAoY2xpY2spPVwiZ29Ub0Rpc2FibGUoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVCdXR0b24nKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb2ZmXCI+e3sgdCgnbWZhRGlzYWJsZWRMYWJlbCcpIH19PC9wPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlZEhpbnQnKSB9XCIgLz5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiAoY2xpY2spPVwiZ29Ub01ldGhvZFNlbGVjdCgpXCI+IHt7IHQoJ21mYUVuYWJsZUJ1dHRvbicpIH19IDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSB9IEBjYXNlICgnbWV0aG9kLXNlbGVjdCcpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFFbmFibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhTWV0aG9kUHJvbXB0JykgfVwiIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1tZXRob2QtbGlzdFwiIHJvbGU9XCJyYWRpb2dyb3VwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3MubWZhLW1ldGhvZC1jYXJkLS1hY3RpdmVdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1RPVFAnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZE1ldGhvZC5zZXQoJ1RPVFAnKVwiXG4gICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdUT1RQJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19ib2R5XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kVG90cCcpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ21mYU1ldGhvZFRvdHBIaW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3MubWZhLW1ldGhvZC1jYXJkLS1hY3RpdmVdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ0VNQUlMJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRNZXRob2Quc2V0KCdFTUFJTCcpXCJcbiAgICAgICAgICAgIHJvbGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ0VNQUlMJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19ib2R5XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kRW1haWwnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFNZXRob2RFbWFpbEhpbnQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkXCJcbiAgICAgICAgICAgIFtjbGFzcy5tZmEtbWV0aG9kLWNhcmQtLWFjdGl2ZV09XCJzZWxlY3RlZE1ldGhvZCgpID09PSAnU01TJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRNZXRob2Quc2V0KCdTTVMnKVwiXG4gICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZF9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2JvZHlcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdtZmFNZXRob2RTbXMnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFNZXRob2RTbXNIaW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoc2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1NNUycgJiYgIXVzZXJQaG9uZSgpKSB7XG4gICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICBsYWJlbD1cInt7IHQoJ21mYVBob25lTGFiZWwnKSB9fVwiXG4gICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJmbG9hdGluZ1wiXG4gICAgICAgICAgZmlsbD1cIm91dGxpbmVcIlxuICAgICAgICAgIHR5cGU9XCJ0ZWxcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiKzU2OTEyMzQ1Njc4XCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicGhvbmVDb250cm9sXCJcbiAgICAgICAgPjwvaW9uLWlucHV0PlxuICAgICAgICBAaWYgKHBob25lQ29udHJvbC5pbnZhbGlkICYmIHBob25lQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLWVycm9yXCI+e3sgdCgnbWZhUGhvbmVJbnZhbGlkJykgfX08L3A+XG4gICAgICAgIH0gfSBAaWYgKHNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnICYmIHVzZXJQaG9uZSgpOyBhcyBwaG9uZSkge1xuICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVBob25lUmVnaXN0ZXJlZCcpICsgJzogJyArIHBob25lIH1cIlxuICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cInByb2NlZWRXaXRoTWV0aG9kKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFDb250aW51ZScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ3RvdHAtc2V0dXAnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhVG90cFNldHVwVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhVG90cFN0ZXAxJykgfVwiIC8+XG5cbiAgICAgICAgQGlmICh0b3RwUXIoKTsgYXMgcXIpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1xclwiPlxuICAgICAgICAgIDx2YWwtcXItY29kZSBbcHJvcHNdPVwieyBxcjogcXIgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBpZiAodG90cFNldHVwKCk7IGFzIHNldHVwKSB7XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVRvdHBNYW51YWxFbnRyeScpIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLXNlY3JldC1yb3dcIj5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cIm1mYS1zZWNyZXRcIj57eyBzZXR1cC5zZWNyZXQgfX08L2NvZGU+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImNvcHlTZWNyZXQoc2V0dXAuc2VjcmV0KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnY29weScpXCI+XG4gICAgICAgICAgICBAaWYgKGNvcGllZFNlY3JldCgpKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZWNrbWFyay1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjb3B5LW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhVG90cFN0ZXAyJykgfVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwidmVyaWZ5VG90cCgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhVG90cFZlcmlmeScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmFja3VwXCI+XG4gICAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnLCBib2xkOiB0cnVlLCBjb250ZW50OiB0KCdtZmFCYWNrdXBDb2Rlc1RpdGxlJykgfVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBzZXR1cC5iYWNrdXBDb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJjb3B5Q29kZXMoc2V0dXAuYmFja3VwQ29kZXMpXCI+XG4gICAgICAgICAgICB7eyB0KCdtZmFDb3B5Q29kZXMnKSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2NvZGUtY29uZmlybScpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFDb25maXJtVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiBzZWxlY3RlZE1ldGhvZCgpID09PSAnRU1BSUwnID8gdCgnbWZhQ29uZmlybVByb21wdEVtYWlsJykgOiB0KCdtZmFDb25maXJtUHJvbXB0U21zJykgfVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJjb25maXJtQ29kZSgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhQ29uZmlybUJ1dHRvbicpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXJlc2VuZFwiPlxuICAgICAgICAgIHt7IHQoJ21mYU5vQ29kZScpIH19IEBpZiAocmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFSZXNlbmRJbicpIH19IHt7IHJlc2VuZENvb2xkb3duKCkgfX1zPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxhIChjbGljayk9XCJyZXNlbmRDb2RlKClcIj57eyB0KCdtZmFSZXNlbmQnKSB9fTwvYT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvcD5cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2Rpc2FibGUnKSB7IEBpZiAoaGFzUGFzc3dvcmQoKSkge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cImRpc2FibGVGb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJvbkRpc2FibGVTdWJtaXQoJGV2ZW50KVwiIC8+XG4gICAgICAgIH0gQGVsc2UgaWYgKG1mYU1ldGhvZCgpID09PSAnVE9UUCcpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFEaXNhYmxlVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhRGlzYWJsZVRvdHBQcm9tcHQnKSB9XCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwiZGlzYWJsZVdpdGhNZmFDb2RlKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFEaXNhYmxlQnV0dG9uJykgfX0gfVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2UgaWYgKG1mYU1ldGhvZCgpID09PSAnRU1BSUwnIHx8IG1mYU1ldGhvZCgpID09PSAnU01TJykge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICBAaWYgKCFkaXNhYmxlQ29kZVNlbnQoKSkge1xuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlQ29kZVByb21wdCcpIH1cIiAvPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwic2VuZERpc2FibGVDb2RlKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFEaXNhYmxlU2VuZENvZGUnKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYURpc2FibGVDb2RlUHJvbXB0JykgfVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cImRpc2FibGVXaXRoTWZhQ29kZSgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhRGlzYWJsZUJ1dHRvbicpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwibWVkaXVtXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJzZW5kRGlzYWJsZUNvZGUoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVSZXNlbmRDb2RlJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH0gQGVsc2Uge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlTmVlZHNQYXNzd29yZCcpIH1cIiAvPlxuICAgICAgICB9XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImJhY2tUb1N0YXR1cygpXCI+XG4gICAgICAgICAge3sgdCgnbWZhQ2FuY2VsJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=
|
|
538
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWZhLW1vZGFsL21mYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21mYS1tb2RhbC9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFj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QVEsc0RBR1IsVUFBVSx5R0FDVixVQUFVLG1GQUNWLGdCQUFnQiwyRUFDaEIsYUFBYSw4SEFDYixlQUFlLG1JQUNmLGFBQWEsd0VBQ2IsY0FBYyx5RUFDZCxpQkFBaUI7OzRGQUtSLGlCQUFpQjtrQkE1QjdCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLFNBQVM7d0JBQ1QsVUFBVTt3QkFDVixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLE9BQU87d0JBQ1AsUUFBUTt3QkFDUixRQUFRO3dCQUNSLFFBQVE7d0JBQ1IsYUFBYTt3QkFDYixVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGlCQUFpQjtxQkFDbEI7d0RBU0csTUFBTTtzQkFEVCxLQUFLO2dCQXFCRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLE9BQU87c0JBQWhCLE1BQU07Z0JBT0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgSW9uQnV0dG9uLFxuICBJb25CdXR0b25zLFxuICBJb25Db250ZW50LFxuICBJb25IZWFkZXIsXG4gIElvbkljb24sXG4gIElvbklucHV0LFxuICBJb25JdGVtLFxuICBJb25MYWJlbCxcbiAgSW9uTW9kYWwsXG4gIElvblJhZGlvLFxuICBJb25SYWRpb0dyb3VwLFxuICBJb25TcGlubmVyLFxuICBJb25Ub29sYmFyLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgaW5mb3JtYXRpb25DaXJjbGVPdXRsaW5lLCBjb3B5T3V0bGluZSwgY2hlY2ttYXJrT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcblxuaW1wb3J0IHsgU29saWREZWZhdWx0QmxvY2sgfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vZmFjdG9yeSc7XG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBRckNvZGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9xci1jb2RlL3FyLWNvZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBpbklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3Bpbi1pbnB1dC9waW4taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlcywgRm9ybU1ldGFkYXRhLCBGb3JtU3VibWl0LCBJbnB1dFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgnO1xuaW1wb3J0IHsgTUZBTWV0aG9kLCBUT1RQU2V0dXBSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UsIElucHV0STE4bkhlbHBlciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgUXJHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcXItZ2VuZXJhdG9yL3FyLWdlbmVyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFFyUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcXItZ2VuZXJhdG9yL3R5cGVzJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuXG4vKiogUGFzbyBkZWwgZmx1am8gZGVsIG1vZGFsLiAqL1xudHlwZSBNZmFTdGVwID0gJ2xvYWRpbmcnIHwgJ3N0YXR1cycgfCAnbWV0aG9kLXNlbGVjdCcgfCAndG90cC1zZXR1cCcgfCAnY29kZS1jb25maXJtJyB8ICdkaXNhYmxlJztcblxuLyoqIFNlZ3VuZG9zIGRlIGVzcGVyYSBhbnRlcyBkZSBwb2RlciByZWVudmlhciBlbCBjw7NkaWdvIEVNQUlML1NNUy4gKi9cbmNvbnN0IFJFU0VORF9DT09MRE9XTl9TRUNPTkRTID0gMzA7XG5cbi8qKlxuICogYHZhbC1tZmEtbW9kYWxgIOKAlCBtb2RhbCBkZSBnZXN0acOzbiBkZSBhdXRlbnRpY2FjacOzbiBkZSBkb3MgZmFjdG9yZXMgKE1GQSlcbiAqIHBhcmEgdW4gdXN1YXJpbyBhdXRlbnRpY2Fkby4gTWlzbW8gcGF0csOzbiBxdWUgYHZhbC1jaGFuZ2UtcGFzc3dvcmQtbW9kYWxgLlxuICpcbiAqIEZsdWpvIChtw6FxdWluYSBkZSBlc3RhZG9zIGludGVybmEpOlxuICogIC0gYGxvYWRpbmdgIOKGkiBgZ2V0UHJvZmlsZSgpYCBwYXJhIGNvbm9jZXIgZWwgZXN0YWRvIE1GQS5cbiAqICAtIGBzdGF0dXNgIOKGkiBtdWVzdHJhIE1GQSBoYWJpbGl0YWRvL2Rlc2hhYmlsaXRhZG8uIFNpIGVzdMOhIGhhYmlsaXRhZG86XG4gKiAgICBnZXN0acOzbiBkZSBiYWNrdXAgY29kZXMgKFRPVFApICsgZGVzaGFiaWxpdGFyLiBTaSBubzogYm90w7NuIGhhYmlsaXRhci5cbiAqICAtIGBtZXRob2Qtc2VsZWN0YCDihpIgZWxlZ2lyIFRPVFAgLyBFTUFJTCAvIFNNUy5cbiAqICAtIGB0b3RwLXNldHVwYCDihpIgUVIgKyBzZWNyZXRvIG1hbnVhbCArIGJhY2t1cCBjb2RlcyDihpIgdmVyaWZpY2FyIGPDs2RpZ28uXG4gKiAgLSBgY29kZS1jb25maXJtYCDihpIgKEVNQUlML1NNUykgaW5ncmVzYXIgY8OzZGlnbyByZWNpYmlkbywgY29uIHJlZW52w61vLlxuICogIC0gYGRpc2FibGVgIOKGkiBjb250cmFzZcOxYSBwYXJhIGRlc2hhYmlsaXRhciBNRkEuXG4gKlxuICogRWwgUVIgc2UgZ2VuZXJhICoqY2xpZW50LXNpZGUqKiAoYFFyR2VuZXJhdG9yU2VydmljZWApIOKAlCBlbCBzZWNyZXRvIFRPVFBcbiAqIG51bmNhIHNhbGUgZGVsIG5hdmVnYWRvci5cbiAqXG4gKiBTZWxmLWNvbnRhaW5lZDogaW55ZWN0YSBgQXV0aFNlcnZpY2VgIHkgbGxhbWEgbG9zIGVuZHBvaW50cyBkaXJlY3RvLiBMYSBhcHBcbiAqIGNvbnRyb2xhIGBbaXNPcGVuXWAgeSByZWFjY2lvbmEgYSBgKGNoYW5nZWQpYCAvIGAoZGlzbWlzc2VkKWAuXG4gKlxuICogaTE4bjogbmFtZXNwYWNlIGNvbXBhcnRpZG8gYF9hdXRoYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1tZmEtbW9kYWxcbiAqICAgW2lzT3Blbl09XCJpc01vZGFsT3BlbigpXCJcbiAqICAgKGRpc21pc3NlZCk9XCJpc01vZGFsT3Blbi5zZXQoZmFsc2UpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW1mYS1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25CdXR0b25zLFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uSGVhZGVyLFxuICAgIElvbkljb24sXG4gICAgSW9uSW5wdXQsXG4gICAgSW9uSXRlbSxcbiAgICBJb25MYWJlbCxcbiAgICBJb25Nb2RhbCxcbiAgICBJb25SYWRpbyxcbiAgICBJb25SYWRpb0dyb3VwLFxuICAgIElvblNwaW5uZXIsXG4gICAgSW9uVG9vbGJhcixcbiAgICBEaXNwbGF5Q29tcG9uZW50LFxuICAgIEZvcm1Db21wb25lbnQsXG4gICAgUXJDb2RlQ29tcG9uZW50LFxuICAgIFRleHRDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgUGluSW5wdXRDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tZmEtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZmEtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWZhTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKiogQ29udHJvbGEgbGEgdmlzaWJpbGlkYWQuIENhZGEgYXBlcnR1cmEgcmUtcmVzdWVsdmUgZWwgZXN0YWRvIE1GQS4gKi9cbiAgQElucHV0KClcbiAgc2V0IGlzT3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9wZW5pbmcgPSB2YWx1ZSAmJiAhdGhpcy5faXNPcGVuO1xuICAgIHRoaXMuX2lzT3BlbiA9IHZhbHVlO1xuICAgIGlmIChvcGVuaW5nKSB7XG4gICAgICAvLyBEaWZlcmltb3MgYWwgcHLDs3hpbW8gbWljcm90YXNrIHBhcmEgcXVlIGVsIHJlc3RvIGRlIEBJbnB1dFxuICAgICAgLy8gKGBwcmVmaWxsQ29kZWApIHlhIGVzdMOpbiBhc2lnbmFkb3Mg4oCUIEFuZ3VsYXIgcHJvY2VzYSBsb3MgaW5wdXRzIGVuXG4gICAgICAvLyBvcmRlbiBkZSBkZWNsYXJhY2nDs24sIHkgc2luIGVzdG8gYG9wZW4oKWAgbGVlIGBwcmVmaWxsQ29kZWAgdW5kZWZpbmVkXG4gICAgICAvLyBjdWFuZG8gZWwgcGFkcmUgc2V0ZWEgYW1ib3MgZW4gZWwgbWlzbW8gdGljayAoZGVlcC1saW5rIE1GQS1lbWFpbCkuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLm9wZW4oKSk7XG4gICAgfVxuICB9XG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDw7NkaWdvIE1GQSBwcmUtY2FyZ2FkbyAoZGVlcC1saW5rIGRlc2RlIGVsIGVtYWlsIGRlIHNldHVwIE1GQS1lbWFpbCkuIFNpXG4gICAqIGVzdMOhIHByZXNlbnRlIGFsIGFicmlyLCBlbCBtb2RhbCBzYWx0YSBkaXJlY3RvIGFsIHBhc28gZGUgY29uZmlybWFjacOzblxuICAgKiBjb24gZWwgY8OzZGlnbyByZWxsZW5hZG8uXG4gICAqL1xuICBASW5wdXQoKSBwcmVmaWxsQ29kZT86IHN0cmluZztcblxuICAvKiogRW1pdGUgY3VhbmRvIGVsIGVzdGFkbyBNRkEgY2FtYmlhIChoYWJpbGl0YWRvIC8gZGVzaGFiaWxpdGFkbykuICovXG4gIEBPdXRwdXQoKSBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0aWRvIGN1YW5kbyB1biBzZXR1cCBNRkEgc2UgY29uZmlybWEgZXhpdG9zYW1lbnRlIHkgZWwgbW9kYWwgZnVlIGFiaWVydG9cbiAgICogdsOtYSBkZWVwLWxpbmsgKGNvbiBgcHJlZmlsbENvZGVgKS4gRWwgaG9zdCBwdWVkZSB1c2FybG8gcGFyYSBjZXJyYXIgZWxcbiAgICogbW9kYWwgeSBuYXZlZ2FyIChlai4gYSBob21lKSBlbiBsdWdhciBkZSBxdWVkYXJzZSBlbiBsYSBww6FnaW5hIGRlIFNlY3VyaXR5LlxuICAgKi9cbiAgQE91dHB1dCgpIGVuYWJsZWRWaWFEZWVwbGluayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdGUgY3VhbmRvIGVsIHVzZXIgY2llcnJhIGVsIG1vZGFsIChib3TDs24gWCBvIGJhY2tkcm9wKS4gKi9cbiAgQE91dHB1dCgpIGRpc21pc3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0ID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgaTE4bkhlbHBlciA9IGluamVjdChJbnB1dEkxOG5IZWxwZXIpO1xuICBwcml2YXRlIHFyR2VuID0gaW5qZWN0KFFyR2VuZXJhdG9yU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RlcCA9IHNpZ25hbDxNZmFTdGVwPignbG9hZGluZycpO1xuICAvKiogUGFzbyBhY3R1YWwgZGVsIGZsdWpvLiAqL1xuICByZWFkb25seSBzdGVwID0gdGhpcy5fc3RlcC5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqIGB0cnVlYCBtaWVudHJhcyB1bmEgbGxhbWFkYSBhbCBiYWNrZW5kIGVzdMOhIGVuIGN1cnNvLiAqL1xuICByZWFkb25seSB3b3JraW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBFc3RhZG8gTUZBIGFjdHVhbC5cbiAgcmVhZG9ubHkgbWZhRW5hYmxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IG1mYU1ldGhvZCA9IHNpZ25hbDxNRkFNZXRob2QgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdXNlclBob25lID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBiYWNrdXBDb2Rlc0NvdW50ID0gc2lnbmFsKDApO1xuICAvKiogRGVmYXVsdCB0cnVlIHBhcmEgbm8gcm9tcGVyIGVsIGZsb3cgdmllam8gc2kgZWwgYmFja2VuZCBubyBkZXZ1ZWx2ZSBlbCBjYW1wby4gKi9cbiAgcmVhZG9ubHkgaGFzUGFzc3dvcmQgPSBzaWduYWwodHJ1ZSk7XG5cbiAgLy8gRXN0YWRvIGRlbCBmbHVqbyBkZSBoYWJpbGl0YWNpw7NuLlxuICByZWFkb25seSBzZWxlY3RlZE1ldGhvZCA9IHNpZ25hbDxNRkFNZXRob2Q+KCdUT1RQJyk7XG4gIHJlYWRvbmx5IHRvdHBTZXR1cCA9IHNpZ25hbDxUT1RQU2V0dXBSZXNwb25zZSB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSB0b3RwUXIgPSBzaWduYWw8UXJSZXN1bHQgfCBudWxsPihudWxsKTtcbiAgLyoqIEPDs2RpZ29zIGRlIHJlc3BhbGRvIHJlY2nDqW4gcmVnZW5lcmFkb3Mg4oCUIHNlIG11ZXN0cmFuIHVuYSBzb2xhIHZlei4gKi9cbiAgcmVhZG9ubHkgcmVnZW5lcmF0ZWRDb2RlcyA9IHNpZ25hbDxzdHJpbmdbXSB8IG51bGw+KG51bGwpO1xuICAvKiogTWFyY2EgbW9tZW50w6FuZWEgY3VhbmRvIGVsIHNlY3JldG8gVE9UUCBzZSBhY2FiYSBkZSBjb3BpYXIgKGZlZWRiYWNrIHZpc3VhbCkuICovXG4gIHJlYWRvbmx5IGNvcGllZFNlY3JldCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHJlc2VuZENvb2xkb3duID0gc2lnbmFsKDApO1xuICByZWFkb25seSBkaXNhYmxlQ29kZVNlbnQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IHBpbkNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNildKTtcbiAgcmVhZG9ubHkgcGhvbmVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKC9eXFwrWzEtOV1cXGR7NiwxNH0kLyldKTtcblxuICByZWFkb25seSBwaW5JbnB1dFByb3BzID0ge1xuICAgIGNvbnRyb2w6IHRoaXMucGluQ29udHJvbCxcbiAgICB0b2tlbjogJ21mYS1jb2RlJyxcbiAgICBsZW5ndGg6IDYsXG4gICAgYWxsb3dOdW1iZXJzT25seTogdHJ1ZSxcbiAgICBhdXRvRm9jdXM6IHRydWUsXG4gIH07XG5cbiAgLyoqIEZvcm0gZGUgZGVzaGFiaWxpdGFjacOzbiDigJQgYHZhbC1mb3JtYCBjb24gdW4gY2FtcG8gZGUgY29udHJhc2XDsWEuICovXG4gIHJlYWRvbmx5IGRpc2FibGVGb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGE+KCgpID0+XG4gICAgdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdtZmFEaXNhYmxlVGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLnQoJ21mYURpc2FibGVQcm9tcHQnKSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBBU1NXT1JELFxuICAgICAgICAgICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICB0b2tlbjogJ21mYS1kaXNhYmxlLXBhc3N3b3JkJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdtZmFQYXNzd29yZExhYmVsJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czogeyByZXF1aXJlZDogJ21mYVBhc3N3b3JkUmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLlNvbGlkRGVmYXVsdEJsb2NrKCcnLCAnc3VibWl0JyksXG4gICAgICAgIHRva2VuOiAnbWZhLWRpc2FibGUtc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ21mYURpc2FibGVCdXR0b24nLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLndvcmtpbmcoKSA/IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfSlcbiAgKTtcblxuICBwcml2YXRlIHJlc2VuZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZGRJY29ucyh7IGluZm9ybWF0aW9uQ2lyY2xlT3V0bGluZSwgY29weU91dGxpbmUsIGNoZWNrbWFya091dGxpbmUgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICB9XG5cbiAgLyoqIFRyYWR1Y2UgdW5hIGNsYXZlIGRlbCBuYW1lc3BhY2UgYF9hdXRoYC4gKi9cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ19hdXRoJyk7XG4gIH1cblxuICAvKiogQ2llcnJlIGluaWNpYWRvIHBvciBlbCB1c2VyIChYIC8gYmFja2Ryb3ApLiAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogUHVudG8gZGUgZW50cmFkYSBhbCBhYnJpciBlbCBtb2RhbC4gQ29uIGBwcmVmaWxsQ29kZWAgKGRlZXAtbGluayBkZWwgZW1haWxcbiAgICogZGUgc2V0dXAgTUZBLWVtYWlsKSBzYWx0YSBkaXJlY3RvIGEgbGEgY29uZmlybWFjacOzbjsgc2kgbm8sIHJlc3VlbHZlIGVsXG4gICAqIGVzdGFkbyBNRkEgYWN0dWFsLlxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWZpbGxDb2RlKSB7XG4gICAgICB0aGlzLnJlc2V0RmxvdygpO1xuICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZC5zZXQoJ0VNQUlMJyk7XG4gICAgICB0aGlzLnBpbkNvbnRyb2wuc2V0VmFsdWUodGhpcy5wcmVmaWxsQ29kZSk7XG4gICAgICB0aGlzLl9zdGVwLnNldCgnY29kZS1jb25maXJtJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENhcmdhIGRlIGVzdGFkb1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ29uc3VsdGEgZWwgcGVyZmlsIHBhcmEgY29ub2NlciBlbCBlc3RhZG8gTUZBIHkgcG9zaWNpb25hciBlbCBmbHVqby4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlU3RhdHVzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXAuc2V0KCdsb2FkaW5nJyk7XG4gICAgdGhpcy5yZXNldEZsb3coKTtcbiAgICB0aGlzLmF1dGguZ2V0UHJvZmlsZSgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBwcm9maWxlID0+IHtcbiAgICAgICAgdGhpcy5tZmFFbmFibGVkLnNldChwcm9maWxlLm1mYUVuYWJsZWQpO1xuICAgICAgICB0aGlzLm1mYU1ldGhvZC5zZXQocHJvZmlsZS5tZmFNZXRob2QgPz8gbnVsbCk7XG4gICAgICAgIHRoaXMudXNlclBob25lLnNldChwcm9maWxlLnBob25lID8/IG51bGwpO1xuICAgICAgICB0aGlzLmhhc1Bhc3N3b3JkLnNldChwcm9maWxlLmhhc1Bhc3N3b3JkID8/IHRydWUpO1xuICAgICAgICBpZiAocHJvZmlsZS5tZmFFbmFibGVkICYmIHByb2ZpbGUubWZhTWV0aG9kID09PSAnVE9UUCcpIHtcbiAgICAgICAgICB0aGlzLmxvYWRCYWNrdXBDb3VudCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0ZXAuc2V0KCdzdGF0dXMnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAvLyBGYWxsYmFjazogdXNhciBlbCBzaWduYWwgZGUgdXN1YXJpbyBlbiBzZXNpw7NuLlxuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoLnVzZXIoKTtcbiAgICAgICAgdGhpcy5tZmFFbmFibGVkLnNldCh1c2VyPy5tZmFFbmFibGVkID8/IGZhbHNlKTtcbiAgICAgICAgdGhpcy5tZmFNZXRob2Quc2V0KHVzZXI/Lm1mYU1ldGhvZCA/PyBudWxsKTtcbiAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ3N0YXR1cycpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJhY2t1cENvdW50KCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aC5nZXRCYWNrdXBDb2Rlc0NvdW50KCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB0aGlzLmJhY2t1cENvZGVzQ291bnQuc2V0KHJlcy5jb3VudCksXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5iYWNrdXBDb2Rlc0NvdW50LnNldCgwKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOYXZlZ2FjacOzbiBlbnRyZSBwYXNvc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBnb1RvTWV0aG9kU2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMucmVnZW5lcmF0ZWRDb2Rlcy5zZXQobnVsbCk7XG4gICAgdGhpcy5fc3RlcC5zZXQoJ21ldGhvZC1zZWxlY3QnKTtcbiAgfVxuXG4gIGdvVG9EaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMuX3N0ZXAuc2V0KCdkaXNhYmxlJyk7XG4gIH1cblxuICBiYWNrVG9TdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgICB0aGlzLmRpc2FibGVDb2RlU2VudC5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhhYmlsaXRhciBNRkFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvbnRpbsO6YSBkZXNkZSBlbCBzZWxlY3RvciBkZSBtw6l0b2RvIGFsIHNldHVwIGNvcnJlc3BvbmRpZW50ZS4gKi9cbiAgcHJvY2VlZFdpdGhNZXRob2QoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCgpO1xuICAgIGlmIChtZXRob2QgPT09ICdUT1RQJykge1xuICAgICAgdGhpcy5zZXR1cFRvdHAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGhvbmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobWV0aG9kID09PSAnU01TJyAmJiAhdGhpcy51c2VyUGhvbmUoKSkge1xuICAgICAgaWYgKHRoaXMucGhvbmVDb250cm9sLmludmFsaWQpIHtcbiAgICAgICAgdGhpcy5waG9uZUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYVBob25lSW52YWxpZCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGhvbmUgPSB0aGlzLnBob25lQ29udHJvbC52YWx1ZSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguc2V0dXBNRkEobWV0aG9kLCBwaG9uZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmNvZGVTZW50KSB7XG4gICAgICAgICAgdGhpcy5waW5Db250cm9sLnJlc2V0KCk7XG4gICAgICAgICAgdGhpcy5fc3RlcC5zZXQoJ2NvZGUtY29uZmlybScpO1xuICAgICAgICAgIHRoaXMuc3RhcnRDb29sZG93bigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwVG90cCgpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5zZXR1cFRPVFAoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy50b3RwU2V0dXAuc2V0KHJlcyk7XG4gICAgICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgICAgICB0aGlzLnFyR2VuXG4gICAgICAgICAgLmdlbmVyYXRlKHsgZGF0YTogcmVzLnFyQ29kZVVybCwgd2lkdGg6IDIyMCB9KVxuICAgICAgICAgIC50aGVuKHFyID0+IHRoaXMudG90cFFyLnNldChxcikpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMudG90cFFyLnNldChudWxsKSk7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9zdGVwLnNldCgndG90cC1zZXR1cCcpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZXNvbHZlRXJyb3IoZXJyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFZlcmlmaWNhIGVsIGPDs2RpZ28gVE9UUCBkZSBsYSBhcHAgZGUgYXV0ZW50aWNhY2nDs24geSBhY3RpdmEgTUZBLiAqL1xuICB2ZXJpZnlUb3RwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLnBpbkNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVJbnZhbGlkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC52ZXJpZnlUT1RQU2V0dXAoY29kZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzLmVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUVuYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uZmlybWEgZWwgY8OzZGlnbyBFTUFJTC9TTVMgeSBhY3RpdmEgTUZBLiAqL1xuICBjb25maXJtQ29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5waW5Db250cm9sLnZhbHVlO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFDb2RlSW52YWxpZCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICBjb25zdCBjYW1lRnJvbURlZXBsaW5rID0gISF0aGlzLnByZWZpbGxDb2RlO1xuICAgIHRoaXMuYXV0aC5jb25maXJtTUZBKGNvZGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlcy5tZmFFbmFibGVkKSB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFFbmFibGVkT2snKSk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkLmVtaXQoKTtcbiAgICAgICAgICBpZiAoY2FtZUZyb21EZWVwbGluaykge1xuICAgICAgICAgICAgLy8gRWwgdXNlciBsbGVnw7MgdsOtYSBsaW5rIGRlbCBlbWFpbCDihpIgZWwgaG9zdCBzZSBlbmNhcmdhIGRlIGNlcnJhclxuICAgICAgICAgICAgLy8gZWwgbW9kYWwgeSBuYXZlZ2FyIChlai4gYSBob21lKS4gTm8gcmVzb2x2ZW1vcyBzdGF0dXMgYWPDoSBwb3JxdWVcbiAgICAgICAgICAgIC8vIGltcGxpY2Fyw61hIGRlamFyIGVsIG1vZGFsIGFiaWVydG8gbW9zdHJhbmRvIGVsIGVzdGFkbyBudWV2by5cbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZFZpYURlZXBsaW5rLmVtaXQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlU3RhdHVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVlbnbDrWEgZWwgY8OzZGlnbyBFTUFJTC9TTVMgKHJlLWVqZWN1dGEgZWwgc2V0dXApLiAqL1xuICByZXNlbmRDb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZENvb2xkb3duKCkgPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJvY2VlZFdpdGhNZXRob2QoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHZXN0acOzbiAoTUZBIGhhYmlsaXRhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZWdlbmVyYSBsb3MgY8OzZGlnb3MgZGUgcmVzcGFsZG8gVE9UUCB5IGxvcyBtdWVzdHJhIHVuYSB2ZXouICovXG4gIHJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuYXV0aC5yZWdlbmVyYXRlQmFja3VwQ29kZXMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuYmFja3VwQ29kZXNDb3VudC5zZXQocmVzLmJhY2t1cENvZGVzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVnZW5lcmF0ZWRDb2Rlcy5zZXQocmVzLmJhY2t1cENvZGVzKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVzb2x2ZUVycm9yKGVycikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZXNoYWJpbGl0YSBNRkEgdXNhbmRvIGxhIGNvbnRyYXNlw7FhIGRlIGxhIGN1ZW50YS4gKi9cbiAgb25EaXNhYmxlU3VibWl0KGV2ZW50OiBGb3JtU3VibWl0KTogdm9pZCB7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBldmVudC5maWVsZHNbJ3Bhc3N3b3JkJ107XG4gICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFQYXNzd29yZFJlcXVpcmVkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGUoeyBwYXNzd29yZCB9KTtcbiAgfVxuXG4gIC8qKiBEZXNoYWJpbGl0YSBNRkEgdXNhbmRvIHVuIGPDs2RpZ28gVE9UUCDigJQgcGFyYSBjdWVudGFzIE9BdXRoLW9ubHkgc2luIGNvbnRyYXNlw7FhLiAqL1xuICBkaXNhYmxlV2l0aE1mYUNvZGUoKTogdm9pZCB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMucGluQ29udHJvbC52YWx1ZTtcbiAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhQ29kZUludmFsaWQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZSh7IG1mYUNvZGU6IGNvZGUgfSk7XG4gIH1cblxuICBzZW5kRGlzYWJsZUNvZGUoKTogdm9pZCB7XG4gICAgdGhpcy53b3JraW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmF1dGguc2VuZE1GQURpc2FibGVDb2RlKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUNvZGVTZW50LnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFEaXNhYmxlQ29kZVNlbnQnKSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGUoaW5wdXQ6IHsgcGFzc3dvcmQ/OiBzdHJpbmc7IG1mYUNvZGU/OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hdXRoLmRpc2FibGVNRkEoaW5wdXQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlcy5tZmFEaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhRGlzYWJsZWRPaycpKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVN0YXR1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnJlc29sdmVFcnJvcihlcnIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29waWEgdW5hIGxpc3RhIGRlIGPDs2RpZ29zIGRlIHJlc3BhbGRvIGFsIHBvcnRhcGFwZWxlcy4gKi9cbiAgYXN5bmMgY29weUNvZGVzKGNvZGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb2Rlcy5qb2luKCdcXG4nKSk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ21mYUNvZGVzQ29waWVkJykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogc2luIHJlY3Vyc28gZGUgY29waWEgZGlzcG9uaWJsZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDb3BpYSBlbCBzZWNyZXRvIFRPVFAgYWwgcG9ydGFwYXBlbGVzICsgZmVlZGJhY2sgdmlzdWFsIChjaGVjaykgZHVyYW50ZSAycy4gKi9cbiAgYXN5bmMgY29weVNlY3JldChzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWNyZXQpO1xuICAgICAgdGhpcy5jb3BpZWRTZWNyZXQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFTZWNyZXRDb3BpZWQnKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29waWVkU2VjcmV0LnNldChmYWxzZSksIDIwMDApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogc2luIHJlY3Vyc28gZGUgY29waWEgZGlzcG9uaWJsZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFdGlxdWV0YSBpMThuIGxlZ2libGUgcGFyYSB1biBtw6l0b2RvIE1GQS4gKi9cbiAgbWV0aG9kTGFiZWwobWV0aG9kOiBNRkFNZXRob2QgfCBudWxsKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnVE9UUCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFRvdHAnKTtcbiAgICAgIGNhc2UgJ0VNQUlMJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhTWV0aG9kRW1haWwnKTtcbiAgICAgIGNhc2UgJ1NNUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYU1ldGhvZFNtcycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVzZXRGbG93KCk6IHZvaWQge1xuICAgIHRoaXMucGluQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMucGhvbmVDb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy50b3RwU2V0dXAuc2V0KG51bGwpO1xuICAgIHRoaXMudG90cFFyLnNldChudWxsKTtcbiAgICB0aGlzLnJlZ2VuZXJhdGVkQ29kZXMuc2V0KG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRNZXRob2Quc2V0KCdUT1RQJyk7XG4gICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDb29sZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BDb29sZG93bigpO1xuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KFJFU0VORF9DT09MRE9XTl9TRUNPTkRTKTtcbiAgICB0aGlzLnJlc2VuZFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNlbmRDb29sZG93bi51cGRhdGUodiA9PiB2IC0gMSk7XG4gICAgICBpZiAodGhpcy5yZXNlbmRDb29sZG93bigpIDw9IDApIHtcbiAgICAgICAgdGhpcy5zdG9wQ29vbGRvd24oKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENvb2xkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVzZW5kVGltZXIpO1xuICAgICAgdGhpcy5yZXNlbmRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVzZW5kQ29vbGRvd24uc2V0KDApO1xuICB9XG5cbiAgLyoqIE1hcGVhIGxvcyBjw7NkaWdvcyBkZSBlcnJvciBNRkEgZGVsIGJhY2tlbmQgYSBtZW5zYWplcyBkZWwgbmFtZXNwYWNlIGBfYXV0aGAuICovXG4gIHByaXZhdGUgcmVzb2x2ZUVycm9yKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IChlcnIgYXMgeyBjb2RlPzogc3RyaW5nIH0pPy5jb2RlO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSAnQVVUSFYyX01GQV9JTlZBTElEX0NPREUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckludmFsaWRDb2RlJyk7XG4gICAgICBjYXNlICdBVVRIVjJfRVhQSVJFRF9DT0RFJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnbWZhRXJyb3JFeHBpcmVkQ29kZScpO1xuICAgICAgY2FzZSAnQVVUSFYyX0NPREVfVVNFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yQ29kZVVzZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfQUxSRUFEWV9BQ1RJVkUnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvckFscmVhZHlBY3RpdmUnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9NRkFfTk9UX0VOQUJMRUQnOlxuICAgICAgICByZXR1cm4gdGhpcy50KCdtZmFFcnJvck5vdEVuYWJsZWQnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9QSE9ORV9SRVFVSVJFRCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVSZXF1aXJlZCcpO1xuICAgICAgY2FzZSAnQVVUSFYyX1BIT05FX0VYSVNUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ21mYUVycm9yUGhvbmVFeGlzdHMnKTtcbiAgICAgIGNhc2UgJ0FVVEhWMl9UT09fTUFOWV9BVFRFTVBUUyc6XG4gICAgICAgIHJldHVybiB0aGlzLnQoJ2Vycm9yVG9vTWFueUF0dGVtcHRzJyk7XG4gICAgICBjYXNlICdBVVRIVjJfSU5WQUxJRF9DVVJSRU5UX1BBU1NXT1JEJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JDdXJyZW50UGFzc3dvcmRXcm9uZycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMudCgnZXJyb3JHZW5lcmljJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHsgbWVzc2FnZSwgZHVyYXRpb246IDM1MDAgfSk7XG4gIH1cbn1cbiIsIjxpb24tbW9kYWwgW2lzT3Blbl09XCJpc09wZW5cIiAoZGlkRGlzbWlzcyk9XCJjbG9zZSgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJtZmEtbW9kYWxcIj5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYU1hbmFnZVRpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG5cbiAgICAgICAgQHN3aXRjaCAoc3RlcCgpKSB7IEBjYXNlICgnbG9hZGluZycpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1sb2FkaW5nXCI+XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBjYXNlICgnc3RhdHVzJykgeyBAaWYgKG1mYUVuYWJsZWQoKSkge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb25cIj57eyB0KCdtZmFFbmFibGVkTGFiZWwnKSB9fSDCtyB7eyBtZXRob2RMYWJlbChtZmFNZXRob2QoKSkgfX08L3A+XG5cbiAgICAgICAgQGlmIChtZmFNZXRob2QoKSA9PT0gJ1RPVFAnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmxvY2tcIj5cbiAgICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IHRydWUsIGNvbnRlbnQ6IHQoJ21mYUJhY2t1cENvZGVzVGl0bGUnKSB9XCIgLz5cbiAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgIFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhQmFja3VwQ29kZXNBdmFpbGFibGUnKSArICc6ICcgKyBiYWNrdXBDb2Rlc0NvdW50KCkgfVwiXG4gICAgICAgICAgLz5cblxuICAgICAgICAgIEBpZiAocmVnZW5lcmF0ZWRDb2RlcygpOyBhcyBjb2Rlcykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYWxlcnRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHA+e3sgdCgnbWZhQmFja3VwQ29kZXNTYXZlV2FybmluZycpIH19IHt7IHQoJ21mYUJhY2t1cENvZGVzRXhwbGFpbicpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtY29kZXNcIj5cbiAgICAgICAgICAgIEBmb3IgKGNvZGUgb2YgY29kZXM7IHRyYWNrIGNvZGUpIHtcbiAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwibWZhLWNvZGVcIj57eyBjb2RlIH19PC9jb2RlPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJkYXJrXCIgZmlsbD1cIm91dGxpbmVcIiAoY2xpY2spPVwiY29weUNvZGVzKGNvZGVzKVwiPlxuICAgICAgICAgICAge3sgdCgnbWZhQ29weUNvZGVzJykgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfSBAZWxzZSB7IEBpZiAoYmFja3VwQ29kZXNDb3VudCgpIDwgMykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYWxlcnRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHA+e3sgdCgnbWZhQmFja3VwQ29kZXNMb3cnKSB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgICAgICBmaWxsPVwib3V0bGluZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid29ya2luZygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZWdlbmVyYXRlQmFja3VwQ29kZXMoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgICAgfSBAZWxzZSB7IHt7IHQoJ21mYVJlZ2VuZXJhdGVDb2RlcycpIH19IH1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJkYXJrXCIgZmlsbD1cIm91dGxpbmVcIiAoY2xpY2spPVwiZ29Ub0Rpc2FibGUoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVCdXR0b24nKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8cCBjbGFzcz1cIm1mYS1zdGF0dXMgbWZhLXN0YXR1cy0tb2ZmXCI+e3sgdCgnbWZhRGlzYWJsZWRMYWJlbCcpIH19PC9wPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlZEhpbnQnKSB9XCIgLz5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiAoY2xpY2spPVwiZ29Ub01ldGhvZFNlbGVjdCgpXCI+IHt7IHQoJ21mYUVuYWJsZUJ1dHRvbicpIH19IDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSB9IEBjYXNlICgnbWV0aG9kLXNlbGVjdCcpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFFbmFibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhTWV0aG9kUHJvbXB0JykgfVwiIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1tZXRob2QtbGlzdFwiIHJvbGU9XCJyYWRpb2dyb3VwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3MubWZhLW1ldGhvZC1jYXJkLS1hY3RpdmVdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1RPVFAnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZE1ldGhvZC5zZXQoJ1RPVFAnKVwiXG4gICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdUT1RQJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19ib2R5XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kVG90cCcpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ21mYU1ldGhvZFRvdHBIaW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3MubWZhLW1ldGhvZC1jYXJkLS1hY3RpdmVdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ0VNQUlMJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRNZXRob2Quc2V0KCdFTUFJTCcpXCJcbiAgICAgICAgICAgIHJvbGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwic2VsZWN0ZWRNZXRob2QoKSA9PT0gJ0VNQUlMJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkX19ib2R5XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnbWZhTWV0aG9kRW1haWwnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFNZXRob2RFbWFpbEhpbnQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWZhLW1ldGhvZC1jYXJkXCJcbiAgICAgICAgICAgIFtjbGFzcy5tZmEtbWV0aG9kLWNhcmQtLWFjdGl2ZV09XCJzZWxlY3RlZE1ldGhvZCgpID09PSAnU01TJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRNZXRob2Quc2V0KCdTTVMnKVwiXG4gICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1mYS1tZXRob2QtY2FyZF9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZmEtbWV0aG9kLWNhcmRfX2JvZHlcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdtZmFNZXRob2RTbXMnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFNZXRob2RTbXNIaW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoc2VsZWN0ZWRNZXRob2QoKSA9PT0gJ1NNUycgJiYgIXVzZXJQaG9uZSgpKSB7XG4gICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICBsYWJlbD1cInt7IHQoJ21mYVBob25lTGFiZWwnKSB9fVwiXG4gICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJmbG9hdGluZ1wiXG4gICAgICAgICAgZmlsbD1cIm91dGxpbmVcIlxuICAgICAgICAgIHR5cGU9XCJ0ZWxcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiKzU2OTEyMzQ1Njc4XCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicGhvbmVDb250cm9sXCJcbiAgICAgICAgPjwvaW9uLWlucHV0PlxuICAgICAgICBAaWYgKHBob25lQ29udHJvbC5pbnZhbGlkICYmIHBob25lQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgIDxwIGNsYXNzPVwibWZhLWVycm9yXCI+e3sgdCgnbWZhUGhvbmVJbnZhbGlkJykgfX08L3A+XG4gICAgICAgIH0gfSBAaWYgKHNlbGVjdGVkTWV0aG9kKCkgPT09ICdTTVMnICYmIHVzZXJQaG9uZSgpOyBhcyBwaG9uZSkge1xuICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVBob25lUmVnaXN0ZXJlZCcpICsgJzogJyArIHBob25lIH1cIlxuICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cInByb2NlZWRXaXRoTWV0aG9kKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFDb250aW51ZScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ3RvdHAtc2V0dXAnKSB7XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnbWZhVG90cFNldHVwVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhVG90cFN0ZXAxJykgfVwiIC8+XG5cbiAgICAgICAgQGlmICh0b3RwUXIoKTsgYXMgcXIpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1xclwiPlxuICAgICAgICAgIDx2YWwtcXItY29kZSBbcHJvcHNdPVwieyBxcjogcXIgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBpZiAodG90cFNldHVwKCk7IGFzIHNldHVwKSB7XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYVRvdHBNYW51YWxFbnRyeScpIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWZhLXNlY3JldC1yb3dcIj5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cIm1mYS1zZWNyZXRcIj57eyBzZXR1cC5zZWNyZXQgfX08L2NvZGU+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImNvcHlTZWNyZXQoc2V0dXAuc2VjcmV0KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnY29weScpXCI+XG4gICAgICAgICAgICBAaWYgKGNvcGllZFNlY3JldCgpKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZWNrbWFyay1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjb3B5LW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhVG90cFN0ZXAyJykgfVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwidmVyaWZ5VG90cCgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhVG90cFZlcmlmeScpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtYmFja3VwXCI+XG4gICAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnLCBib2xkOiB0cnVlLCBjb250ZW50OiB0KCdtZmFCYWNrdXBDb2Rlc1RpdGxlJykgfVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1hbGVydFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8cD57eyB0KCdtZmFCYWNrdXBDb2Rlc1NhdmVXYXJuaW5nJykgfX0ge3sgdCgnbWZhQmFja3VwQ29kZXNFeHBsYWluJykgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1jb2Rlc1wiPlxuICAgICAgICAgICAgQGZvciAoY29kZSBvZiBzZXR1cC5iYWNrdXBDb2RlczsgdHJhY2sgY29kZSkge1xuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJtZmEtY29kZVwiPnt7IGNvZGUgfX08L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImRhcmtcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJjb3B5Q29kZXMoc2V0dXAuYmFja3VwQ29kZXMpXCI+XG4gICAgICAgICAgICB7eyB0KCdtZmFDb3B5Q29kZXMnKSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2NvZGUtY29uZmlybScpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFDb25maXJtVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiBzZWxlY3RlZE1ldGhvZCgpID09PSAnRU1BSUwnID8gdCgnbWZhQ29uZmlybVByb21wdEVtYWlsJykgOiB0KCdtZmFDb25maXJtUHJvbXB0U21zJykgfVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJjb25maXJtQ29kZSgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhQ29uZmlybUJ1dHRvbicpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxwIGNsYXNzPVwibWZhLXJlc2VuZFwiPlxuICAgICAgICAgIHt7IHQoJ21mYU5vQ29kZScpIH19IEBpZiAocmVzZW5kQ29vbGRvd24oKSA+IDApIHtcbiAgICAgICAgICA8c3Bhbj57eyB0KCdtZmFSZXNlbmRJbicpIH19IHt7IHJlc2VuZENvb2xkb3duKCkgfX1zPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxhIChjbGljayk9XCJyZXNlbmRDb2RlKClcIj57eyB0KCdtZmFSZXNlbmQnKSB9fTwvYT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvcD5cblxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJiYWNrVG9TdGF0dXMoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYUNhbmNlbCcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAY2FzZSAoJ2Rpc2FibGUnKSB7IEBpZiAoaGFzUGFzc3dvcmQoKSkge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cImRpc2FibGVGb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJvbkRpc2FibGVTdWJtaXQoJGV2ZW50KVwiIC8+XG4gICAgICAgIH0gQGVsc2UgaWYgKG1mYU1ldGhvZCgpID09PSAnVE9UUCcpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdtZmFEaXNhYmxlVGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJ7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgY29udGVudDogdCgnbWZhRGlzYWJsZVRvdHBQcm9tcHQnKSB9XCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1mYS1waW5cIj5cbiAgICAgICAgICA8dmFsLXBpbi1pbnB1dCBbcHJvcHNdPVwicGluSW5wdXRQcm9wc1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwiZGlzYWJsZVdpdGhNZmFDb2RlKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFEaXNhYmxlQnV0dG9uJykgfX0gfVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH0gQGVsc2UgaWYgKG1mYU1ldGhvZCgpID09PSAnRU1BSUwnIHx8IG1mYU1ldGhvZCgpID09PSAnU01TJykge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICBAaWYgKCFkaXNhYmxlQ29kZVNlbnQoKSkge1xuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlQ29kZVByb21wdCcpIH1cIiAvPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFtkaXNhYmxlZF09XCJ3b3JraW5nKClcIiAoY2xpY2spPVwic2VuZERpc2FibGVDb2RlKClcIj5cbiAgICAgICAgICBAaWYgKHdvcmtpbmcoKSkge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIH0gQGVsc2UgeyB7eyB0KCdtZmFEaXNhYmxlU2VuZENvZGUnKSB9fSB9XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwieyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIGNvbnRlbnQ6IHQoJ21mYURpc2FibGVDb2RlUHJvbXB0JykgfVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZmEtcGluXCI+XG4gICAgICAgICAgPHZhbC1waW4taW5wdXQgW3Byb3BzXT1cInBpbklucHV0UHJvcHNcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBbZGlzYWJsZWRdPVwid29ya2luZygpXCIgKGNsaWNrKT1cImRpc2FibGVXaXRoTWZhQ29kZSgpXCI+XG4gICAgICAgICAgQGlmICh3b3JraW5nKCkpIHtcbiAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhRGlzYWJsZUJ1dHRvbicpIH19IH1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwibWVkaXVtXCIgW2Rpc2FibGVkXT1cIndvcmtpbmcoKVwiIChjbGljayk9XCJzZW5kRGlzYWJsZUNvZGUoKVwiPlxuICAgICAgICAgIHt7IHQoJ21mYURpc2FibGVSZXNlbmRDb2RlJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH0gQGVsc2Uge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ21mYURpc2FibGVUaXRsZScpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlLCBjb250ZW50OiB0KCdtZmFEaXNhYmxlTmVlZHNQYXNzd29yZCcpIH1cIiAvPlxuICAgICAgICB9XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImJhY2tUb1N0YXR1cygpXCI+XG4gICAgICAgICAge3sgdCgnbWZhQ2FuY2VsJykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9IH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=
|