UNPKG

@spartacus/checkout

Version:

Checkout feature library for Spartacus

135 lines 19.3 kB
import { Injectable, isDevMode } from '@angular/core'; import { CheckoutStepType, } from '@spartacus/checkout/root'; import { combineLatest, of } from 'rxjs'; import { map, switchMap, take, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@spartacus/checkout/root"; import * as i2 from "../services/checkout-step.service"; import * as i3 from "../services/checkout-details.service"; import * as i4 from "@spartacus/core"; import * as i5 from "@angular/router"; export class CheckoutStepsSetGuard { constructor(paymentTypeService, checkoutStepService, checkoutDetailsService, routingConfigService, checkoutCostCenterService, router) { this.paymentTypeService = paymentTypeService; this.checkoutStepService = checkoutStepService; this.checkoutDetailsService = checkoutDetailsService; this.routingConfigService = routingConfigService; this.checkoutCostCenterService = checkoutCostCenterService; this.router = router; } canActivate(route, _) { let currentIndex = -1; const currentRouteUrl = '/' + route.url.join('/'); // check whether the previous step is set return combineLatest([ this.checkoutStepService.steps$, this.paymentTypeService.isAccountPayment(), ]).pipe(tap(([, isAccount]) => { this.checkoutStepService.disableEnableStep(CheckoutStepType.PAYMENT_DETAILS, isAccount); }), take(1), switchMap(([steps, isAccount]) => { currentIndex = steps.findIndex((step) => { var _a; const stepRouteUrl = `/${(_a = this.routingConfigService.getRouteConfig(step.routeName).paths) === null || _a === void 0 ? void 0 : _a[0]}`; return stepRouteUrl === currentRouteUrl; }); // get current step let currentStep; if (currentIndex >= 0) { currentStep = steps[currentIndex]; } if (Boolean(currentStep)) { return this.isStepSet(steps[currentIndex - 1], isAccount); } else { if (isDevMode()) { console.warn(`Missing step with route '${currentRouteUrl}' in checkout configuration or this step is disabled.`); } return of(this.getUrl('checkout')); } })); } isStepSet(step, isAccountPayment) { if (step && !step.disabled) { switch (step.type[0]) { case CheckoutStepType.PAYMENT_TYPE: { return this.isPaymentTypeSet(step); } case CheckoutStepType.SHIPPING_ADDRESS: { return this.isShippingAddressAndCostCenterSet(step, isAccountPayment); } case CheckoutStepType.DELIVERY_MODE: { return this.isDeliveryModeSet(step); } case CheckoutStepType.PAYMENT_DETAILS: { return this.isPaymentDetailsSet(step); } case CheckoutStepType.REVIEW_ORDER: { break; } } } return of(true); } isPaymentTypeSet(step) { return this.paymentTypeService.getSelectedPaymentType().pipe(map((paymentType) => { if (Boolean(paymentType)) { return true; } else { return this.getUrl(step.routeName); } })); } isShippingAddressAndCostCenterSet(step, isAccountPayment) { return combineLatest([ this.checkoutDetailsService.getDeliveryAddress(), this.checkoutCostCenterService.getCostCenter(), ]).pipe(map(([deliveryAddress, costCenter]) => { if (isAccountPayment) { if (deliveryAddress && Object.keys(deliveryAddress).length && Boolean(costCenter)) { return true; } else { return this.getUrl(step.routeName); } } else { if (deliveryAddress && Object.keys(deliveryAddress).length && costCenter === undefined) { return true; } else { return this.getUrl(step.routeName); } } })); } isDeliveryModeSet(step) { return this.checkoutDetailsService .getSelectedDeliveryModeCode() .pipe(map((mode) => mode && mode.length ? true : this.getUrl(step.routeName))); } isPaymentDetailsSet(step) { return this.checkoutDetailsService .getPaymentDetails() .pipe(map((paymentDetails) => paymentDetails && Object.keys(paymentDetails).length !== 0 ? true : this.getUrl(step.routeName))); } getUrl(routeName) { var _a; return this.router.parseUrl((_a = this.routingConfigService.getRouteConfig(routeName).paths) === null || _a === void 0 ? void 0 : _a[0]); } } CheckoutStepsSetGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CheckoutStepsSetGuard, deps: [{ token: i1.PaymentTypeFacade }, { token: i2.CheckoutStepService }, { token: i3.CheckoutDetailsService }, { token: i4.RoutingConfigService }, { token: i1.CheckoutCostCenterFacade }, { token: i5.Router }], target: i0.ɵɵFactoryTarget.Injectable }); CheckoutStepsSetGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CheckoutStepsSetGuard, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CheckoutStepsSetGuard, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.PaymentTypeFacade }, { type: i2.CheckoutStepService }, { type: i3.CheckoutDetailsService }, { type: i4.RoutingConfigService }, { type: i1.CheckoutCostCenterFacade }, { type: i5.Router }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQtc3RlcHMtc2V0Lmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZmVhdHVyZS1saWJzL2NoZWNrb3V0L2NvbXBvbmVudHMvZ3VhcmRzL2NoZWNrb3V0LXN0ZXBzLXNldC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVF0RCxPQUFPLEVBR0wsZ0JBQWdCLEdBRWpCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTzNELE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsWUFDWSxrQkFBcUMsRUFDckMsbUJBQXdDLEVBQ3hDLHNCQUE4QyxFQUM5QyxvQkFBMEMsRUFDMUMseUJBQW1ELEVBQ25ELE1BQWM7UUFMZCx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3JDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMEI7UUFDbkQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUN2QixDQUFDO0lBRUosV0FBVyxDQUNULEtBQTZCLEVBQzdCLENBQXNCO1FBRXRCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sZUFBZSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVsRCx5Q0FBeUM7UUFDekMsT0FBTyxhQUFhLENBQUM7WUFDbkIsSUFB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QUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUN6RCxDQUNGLENBQUM7SUFDTixDQUFDO0lBRVMsbUJBQW1CLENBQzNCLElBQWtCO1FBRWxCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQjthQUMvQixpQkFBaUIsRUFBRTthQUNuQixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FDckIsY0FBYyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDeEQsQ0FBQyxDQUFDLElBQUk7WUFDTixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQ2hDLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFTyxNQUFNLENBQUMsU0FBaUI7O1FBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3pCLE1BQUEsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLDBDQUFHLENBQUMsQ0FBVyxDQUN6RSxDQUFDO0lBQ0osQ0FBQzs7a0hBL0pVLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRnBCLE1BQU07MkZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgQ2FuQWN0aXZhdGUsXG4gIFJvdXRlcixcbiAgUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgVXJsVHJlZSxcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIENoZWNrb3V0Q29zdENlbnRlckZhY2FkZSxcbiAgQ2hlY2tvdXRTdGVwLFxuICBDaGVja291dFN0ZXBUeXBlLFxuICBQYXltZW50VHlwZUZhY2FkZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jaGVja291dC9yb290JztcbmltcG9ydCB7IFJvdXRpbmdDb25maWdTZXJ2aWNlIH0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2hlY2tvdXREZXRhaWxzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NoZWNrb3V0LWRldGFpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBDaGVja291dFN0ZXBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2hlY2tvdXQtc3RlcC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrb3V0U3RlcHNTZXRHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHBheW1lbnRUeXBlU2VydmljZTogUGF5bWVudFR5cGVGYWNhZGUsXG4gICAgcHJvdGVjdGVkIGNoZWNrb3V0U3RlcFNlcnZpY2U6IENoZWNrb3V0U3RlcFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNoZWNrb3V0RGV0YWlsc1NlcnZpY2U6IENoZWNrb3V0RGV0YWlsc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJvdXRpbmdDb25maWdTZXJ2aWNlOiBSb3V0aW5nQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2hlY2tvdXRDb3N0Q2VudGVyU2VydmljZTogQ2hlY2tvdXRDb3N0Q2VudGVyRmFjYWRlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlclxuICApIHt9XG5cbiAgY2FuQWN0aXZhdGUoXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gICAgXzogUm91dGVyU3RhdGVTbmFwc2hvdFxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IC0xO1xuICAgIGNvbnN0IGN1cnJlbnRSb3V0ZVVybCA9ICcvJyArIHJvdXRlLnVybC5qb2luKCcvJyk7XG5cbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBwcmV2aW91cyBzdGVwIGlzIHNldFxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY2hlY2tvdXRTdGVwU2VydmljZS5zdGVwcyQsXG4gICAgICB0aGlzLnBheW1lbnRUeXBlU2VydmljZS5pc0FjY291bnRQYXltZW50KCksXG4gICAgXSkucGlwZShcbiAgICAgIHRhcCgoWywgaXNBY2NvdW50XSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0U3RlcFNlcnZpY2UuZGlzYWJsZUVuYWJsZVN0ZXAoXG4gICAgICAgICAgQ2hlY2tvdXRTdGVwVHlwZS5QQVlNRU5UX0RFVEFJTFMsXG4gICAgICAgICAgaXNBY2NvdW50XG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHRha2UoMSksXG4gICAgICBzd2l0Y2hNYXAoKFtzdGVwcywgaXNBY2NvdW50XSkgPT4ge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBzdGVwcy5maW5kSW5kZXgoKHN0ZXApID0+IHtcbiAgICAgICAgICBjb25zdCBzdGVwUm91dGVVcmwgPSBgLyR7XG4gICAgICAgICAgICB0aGlzLnJvdXRpbmdDb25maWdTZXJ2aWNlLmdldFJvdXRlQ29uZmlnKHN0ZXAucm91dGVOYW1lKS5wYXRocz8uWzBdXG4gICAgICAgICAgfWA7XG4gICAgICAgICAgcmV0dXJuIHN0ZXBSb3V0ZVVybCA9PT0gY3VycmVudFJvdXRlVXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2V0IGN1cnJlbnQgc3RlcFxuICAgICAgICBsZXQgY3VycmVudFN0ZXA7XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgIGN1cnJlbnRTdGVwID0gc3RlcHNbY3VycmVudEluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQm9vbGVhbihjdXJyZW50U3RlcCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc1N0ZXBTZXQoc3RlcHNbY3VycmVudEluZGV4IC0gMV0sIGlzQWNjb3VudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBNaXNzaW5nIHN0ZXAgd2l0aCByb3V0ZSAnJHtjdXJyZW50Um91dGVVcmx9JyBpbiBjaGVja291dCBjb25maWd1cmF0aW9uIG9yIHRoaXMgc3RlcCBpcyBkaXNhYmxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2YodGhpcy5nZXRVcmwoJ2NoZWNrb3V0JykpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdGVwU2V0KFxuICAgIHN0ZXA6IENoZWNrb3V0U3RlcCxcbiAgICBpc0FjY291bnRQYXltZW50OiBib29sZWFuXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHtcbiAgICBpZiAoc3RlcCAmJiAhc3RlcC5kaXNhYmxlZCkge1xuICAgICAgc3dpdGNoIChzdGVwLnR5cGVbMF0pIHtcbiAgICAgICAgY2FzZSBDaGVja291dFN0ZXBUeXBlLlBBWU1FTlRfVFlQRToge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzUGF5bWVudFR5cGVTZXQoc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDaGVja291dFN0ZXBUeXBlLlNISVBQSU5HX0FERFJFU1M6IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc1NoaXBwaW5nQWRkcmVzc0FuZENvc3RDZW50ZXJTZXQoc3RlcCwgaXNBY2NvdW50UGF5bWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDaGVja291dFN0ZXBUeXBlLkRFTElWRVJZX01PREU6IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0RlbGl2ZXJ5TW9kZVNldChzdGVwKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENoZWNrb3V0U3RlcFR5cGUuUEFZTUVOVF9ERVRBSUxTOiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNQYXltZW50RGV0YWlsc1NldChzdGVwKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENoZWNrb3V0U3RlcFR5cGUuUkVWSUVXX09SREVSOiB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9mKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUGF5bWVudFR5cGVTZXQoXG4gICAgc3RlcDogQ2hlY2tvdXRTdGVwXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHtcbiAgICByZXR1cm4gdGhpcy5wYXltZW50VHlwZVNlcnZpY2UuZ2V0U2VsZWN0ZWRQYXltZW50VHlwZSgpLnBpcGUoXG4gICAgICBtYXAoKHBheW1lbnRUeXBlKSA9PiB7XG4gICAgICAgIGlmIChCb29sZWFuKHBheW1lbnRUeXBlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFVybChzdGVwLnJvdXRlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1NoaXBwaW5nQWRkcmVzc0FuZENvc3RDZW50ZXJTZXQoXG4gICAgc3RlcDogQ2hlY2tvdXRTdGVwLFxuICAgIGlzQWNjb3VudFBheW1lbnQ6IGJvb2xlYW5cbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY2hlY2tvdXREZXRhaWxzU2VydmljZS5nZXREZWxpdmVyeUFkZHJlc3MoKSxcbiAgICAgIHRoaXMuY2hlY2tvdXRDb3N0Q2VudGVyU2VydmljZS5nZXRDb3N0Q2VudGVyKCksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2RlbGl2ZXJ5QWRkcmVzcywgY29zdENlbnRlcl0pID0+IHtcbiAgICAgICAgaWYgKGlzQWNjb3VudFBheW1lbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWxpdmVyeUFkZHJlc3MgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlbGl2ZXJ5QWRkcmVzcykubGVuZ3RoICYmXG4gICAgICAgICAgICBCb29sZWFuKGNvc3RDZW50ZXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXJsKHN0ZXAucm91dGVOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGVsaXZlcnlBZGRyZXNzICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWxpdmVyeUFkZHJlc3MpLmxlbmd0aCAmJlxuICAgICAgICAgICAgY29zdENlbnRlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXJsKHN0ZXAucm91dGVOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0RlbGl2ZXJ5TW9kZVNldChcbiAgICBzdGVwOiBDaGVja291dFN0ZXBcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0RGV0YWlsc1NlcnZpY2VcbiAgICAgIC5nZXRTZWxlY3RlZERlbGl2ZXJ5TW9kZUNvZGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZTogc3RyaW5nKSA9PlxuICAgICAgICAgIG1vZGUgJiYgbW9kZS5sZW5ndGggPyB0cnVlIDogdGhpcy5nZXRVcmwoc3RlcC5yb3V0ZU5hbWUpXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYXltZW50RGV0YWlsc1NldChcbiAgICBzdGVwOiBDaGVja291dFN0ZXBcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0RGV0YWlsc1NlcnZpY2VcbiAgICAgIC5nZXRQYXltZW50RGV0YWlscygpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChwYXltZW50RGV0YWlscykgPT5cbiAgICAgICAgICBwYXltZW50RGV0YWlscyAmJiBPYmplY3Qua2V5cyhwYXltZW50RGV0YWlscykubGVuZ3RoICE9PSAwXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogdGhpcy5nZXRVcmwoc3RlcC5yb3V0ZU5hbWUpXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFVybChyb3V0ZU5hbWU6IHN0cmluZyk6IFVybFRyZWUge1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5wYXJzZVVybChcbiAgICAgIHRoaXMucm91dGluZ0NvbmZpZ1NlcnZpY2UuZ2V0Um91dGVDb25maWcocm91dGVOYW1lKS5wYXRocz8uWzBdIGFzIHN0cmluZ1xuICAgICk7XG4gIH1cbn1cbiJdfQ==