UNPKG

@spartacus/storefront

Version:

Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.

171 lines 34 kB
import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { combineLatest } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@spartacus/core"; import * as i2 from "../card/card.component"; import * as i3 from "@angular/common"; export class OrderOverviewComponent { constructor(translation) { this.translation = translation; } set setOrder(order) { this.order = order; } getReplenishmentCodeCardContent(orderCode) { return this.translation.translate('orderDetails.replenishmentId').pipe(filter(() => Boolean(orderCode)), map((textTitle) => ({ title: textTitle, text: [orderCode], }))); } getReplenishmentActiveCardContent(active) { return combineLatest([ this.translation.translate('orderDetails.status'), this.translation.translate('orderDetails.active'), this.translation.translate('orderDetails.cancelled'), ]).pipe(map(([textTitle, textActive, textCancelled]) => ({ title: textTitle, text: [active ? textActive : textCancelled], }))); } getReplenishmentStartOnCardContent(isoDate) { return this.translation.translate('orderDetails.startOn').pipe(filter(() => Boolean(isoDate)), map((textTitle) => { return { title: textTitle, text: [isoDate], }; })); } getReplenishmentFrequencyCardContent(frequency) { return this.translation.translate('orderDetails.frequency').pipe(filter(() => Boolean(frequency)), map((textTitle) => ({ title: textTitle, text: [frequency], }))); } getReplenishmentNextDateCardContent(isoDate) { return this.translation.translate('orderDetails.nextOrderDate').pipe(filter(() => Boolean(isoDate)), map((textTitle) => { return { title: textTitle, text: [isoDate], }; })); } getOrderCodeCardContent(orderCode) { return this.translation.translate('orderDetails.orderNumber').pipe(filter(() => Boolean(orderCode)), map((textTitle) => ({ title: textTitle, text: [orderCode], }))); } getOrderCurrentDateCardContent(isoDate) { return this.translation.translate('orderDetails.placedOn').pipe(filter(() => Boolean(isoDate)), map((textTitle) => { return { title: textTitle, text: [isoDate], }; })); } getOrderStatusCardContent(status) { return combineLatest([ this.translation.translate('orderDetails.status'), this.translation.translate('orderDetails.statusDisplay_' + status), ]).pipe(map(([textTitle, textStatus]) => ({ title: textTitle, text: [textStatus], }))); } getPurchaseOrderNumber(poNumber) { return combineLatest([ this.translation.translate('orderDetails.purchaseOrderNumber'), this.translation.translate('orderDetails.emptyPurchaseOrderId'), ]).pipe(map(([textTitle, noneTextTitle]) => ({ title: textTitle, text: [poNumber ? poNumber : noneTextTitle], }))); } getMethodOfPaymentCardContent(hasPaymentInfo) { return combineLatest([ this.translation.translate('orderDetails.methodOfPayment'), this.translation.translate('paymentTypes.paymentType_ACCOUNT'), this.translation.translate('paymentTypes.paymentType_CARD'), ]).pipe(map(([textTitle, textAccount, textCard]) => ({ title: textTitle, text: [Boolean(hasPaymentInfo) ? textCard : textAccount], }))); } getCostCenterCardContent(costCenter) { return this.translation.translate('orderDetails.costCenter').pipe(filter(() => Boolean(costCenter)), map((textTitle) => { var _a; return ({ title: textTitle, textBold: costCenter === null || costCenter === void 0 ? void 0 : costCenter.name, text: ['(' + ((_a = costCenter === null || costCenter === void 0 ? void 0 : costCenter.unit) === null || _a === void 0 ? void 0 : _a.name) + ')'], }); })); } getAddressCardContent(deliveryAddress) { return this.translation.translate('addressCard.shipTo').pipe(filter(() => Boolean(deliveryAddress)), map((textTitle) => { const formattedAddress = this.normalizeFormattedAddress(deliveryAddress.formattedAddress); return { title: textTitle, textBold: `${deliveryAddress.firstName} ${deliveryAddress.lastName}`, text: [formattedAddress, deliveryAddress.country.name], }; })); } getDeliveryModeCardContent(deliveryMode) { return this.translation.translate('orderDetails.shippingMethod').pipe(filter(() => Boolean(deliveryMode)), map((textTitle) => { var _a, _b; return ({ title: textTitle, textBold: deliveryMode.name, text: [ deliveryMode.description, ((_a = deliveryMode.deliveryCost) === null || _a === void 0 ? void 0 : _a.formattedValue) ? (_b = deliveryMode.deliveryCost) === null || _b === void 0 ? void 0 : _b.formattedValue : '', ], }); })); } getPaymentInfoCardContent(payment) { return combineLatest([ this.translation.translate('paymentForm.payment'), this.translation.translate('paymentCard.expires', { month: Boolean(payment) ? payment.expiryMonth : '', year: Boolean(payment) ? payment.expiryYear : '', }), ]).pipe(filter(() => Boolean(payment)), map(([textTitle, textExpires]) => ({ title: textTitle, textBold: payment.accountHolderName, text: [payment.cardNumber, textExpires], }))); } getBillingAddressCardContent(billingAddress) { return this.translation.translate('paymentForm.billingAddress').pipe(filter(() => Boolean(billingAddress)), map((textTitle) => ({ title: textTitle, textBold: `${billingAddress.firstName} ${billingAddress.lastName}`, text: [billingAddress.formattedAddress, billingAddress.country.name], }))); } normalizeFormattedAddress(formattedAddress) { const addresses = formattedAddress .split(',') .map((address) => address.trim()); const newFormattedAddress = addresses.filter(Boolean).join(', '); return newFormattedAddress; } } OrderOverviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderOverviewComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); OrderOverviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: OrderOverviewComponent, selector: "cx-order-overview", inputs: { setOrder: ["order", "setOrder"] }, ngImport: i0, template: "<div class=\"cx-order-summary\">\n <div class=\"container\">\n <ng-container *ngIf=\"order.replenishmentOrderCode; else otherOrder\">\n <div class=\"cx-summary-card\">\n <cx-card\n [content]=\"\n getReplenishmentCodeCardContent(order?.replenishmentOrderCode)\n | async\n \"\n ></cx-card>\n\n <cx-card\n [content]=\"getReplenishmentActiveCardContent(order?.active) | async\"\n ></cx-card>\n </div>\n\n <div class=\"cx-summary-card\">\n <cx-card\n [content]=\"\n getReplenishmentStartOnCardContent(order?.firstDate | cxDate)\n | async\n \"\n ></cx-card>\n\n <cx-card\n [content]=\"\n getReplenishmentFrequencyCardContent(\n order?.trigger?.displayTimeTable\n ) | async\n \"\n ></cx-card>\n\n <cx-card\n [content]=\"\n getReplenishmentNextDateCardContent(\n order?.trigger?.activationTime | cxDate\n ) | async\n \"\n ></cx-card>\n </div>\n </ng-container>\n\n <ng-template #otherOrder>\n <div class=\"cx-summary-card\">\n <cx-card\n [content]=\"getOrderCodeCardContent(order?.code) | async\"\n ></cx-card>\n\n <cx-card\n [content]=\"\n getOrderCurrentDateCardContent(order?.created | cxDate) | async\n \"\n ></cx-card>\n\n <cx-card\n [content]=\"getOrderStatusCardContent(order.statusDisplay) | async\"\n ></cx-card>\n </div>\n </ng-template>\n\n <ng-container\n *ngIf=\"order.purchaseOrderNumber || order.purchaseOrderNumber === ''\"\n >\n <div class=\"cx-summary-card\">\n <cx-card\n [content]=\"getPurchaseOrderNumber(order?.purchaseOrderNumber) | async\"\n ></cx-card>\n\n <cx-card\n [content]=\"getMethodOfPaymentCardContent(order.paymentInfo) | async\"\n ></cx-card>\n\n <ng-container *ngIf=\"order.costCenter\">\n <cx-card\n [content]=\"getCostCenterCardContent(order?.costCenter) | async\"\n ></cx-card>\n </ng-container>\n </div>\n </ng-container>\n\n <div class=\"cx-summary-card\">\n <ng-container *ngIf=\"order.deliveryAddress\">\n <cx-card\n [content]=\"getAddressCardContent(order?.deliveryAddress) | async\"\n ></cx-card>\n </ng-container>\n\n <ng-container *ngIf=\"order.deliveryMode\">\n <cx-card\n [content]=\"getDeliveryModeCardContent(order?.deliveryMode) | async\"\n ></cx-card>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"order.paymentInfo\">\n <div class=\"cx-summary-card\">\n <cx-card\n [content]=\"getPaymentInfoCardContent(order?.paymentInfo) | async\"\n ></cx-card>\n\n <cx-card\n [content]=\"\n getBillingAddressCardContent(order?.paymentInfo?.billingAddress)\n | async\n \"\n ></cx-card>\n </div>\n </ng-container>\n </div>\n</div>\n", components: [{ type: i2.CardComponent, selector: "cx-card", inputs: ["border", "editMode", "isDefault", "content", "fitToContainer", "truncateText", "charactersLimit"], outputs: ["deleteCard", "setDefaultCard", "sendCard", "editCard", "cancelCard"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i3.AsyncPipe, "cxDate": i1.CxDatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderOverviewComponent, decorators: [{ type: Component, args: [{ selector: 'cx-order-overview', templateUrl: './order-overview.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.TranslationService }]; }, propDecorators: { setOrder: [{ type: Input, args: ['order'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItb3ZlcnZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9zaGFyZWQvY29tcG9uZW50cy9vcmRlci1vdmVydmlldy9vcmRlci1vdmVydmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL3NoYXJlZC9jb21wb25lbnRzL29yZGVyLW92ZXJ2aWV3L29yZGVyLW92ZXJ2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUTFFLE9BQU8sRUFBRSxhQUFhLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFRN0MsTUFBTSxPQUFPLHNCQUFzQjtJQVFqQyxZQUFzQixXQUErQjtRQUEvQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFBRyxDQUFDO0lBTHpELElBQ0ksUUFBUSxDQUFDLEtBQVU7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUlELCtCQUErQixDQUFDLFNBQWlCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQyxJQUFJLENBQ3BFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDaEMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUNsQixDQUFDLENBQUMsQ0FDSixDQUFDO0lBQ0osQ0FBQztJ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QW1CLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakUsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDOzttSEFoTlUsc0JBQXNCO3VHQUF0QixzQkFBc0Isc0dDakJuQyxpbEdBOEdBOzJGRDdGYSxzQkFBc0I7a0JBTGxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsV0FBVyxFQUFFLGlDQUFpQztvQkFDOUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEO3lHQUtLLFFBQVE7c0JBRFgsS0FBSzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFkZHJlc3MsXG4gIENvc3RDZW50ZXIsXG4gIERlbGl2ZXJ5TW9kZSxcbiAgUGF5bWVudERldGFpbHMsXG4gIFRyYW5zbGF0aW9uU2VydmljZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJy4uL2NhcmQvY2FyZC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjeC1vcmRlci1vdmVydmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmRlci1vdmVydmlldy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBPcmRlck92ZXJ2aWV3Q29tcG9uZW50IHtcbiAgb3JkZXI6IGFueTtcblxuICBASW5wdXQoJ29yZGVyJylcbiAgc2V0IHNldE9yZGVyKG9yZGVyOiBhbnkpIHtcbiAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uU2VydmljZSkge31cblxuICBnZXRSZXBsZW5pc2htZW50Q29kZUNhcmRDb250ZW50KG9yZGVyQ29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDYXJkPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdvcmRlckRldGFpbHMucmVwbGVuaXNobWVudElkJykucGlwZShcbiAgICAgIGZpbHRlcigoKSA9PiBCb29sZWFuKG9yZGVyQ29kZSkpLFxuICAgICAgbWFwKCh0ZXh0VGl0bGUpID0+ICh7XG4gICAgICAgIHRpdGxlOiB0ZXh0VGl0bGUsXG4gICAgICAgIHRleHQ6IFtvcmRlckNvZGVdLFxuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldFJlcGxlbmlzaG1lbnRBY3RpdmVDYXJkQ29udGVudChhY3RpdmU6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPENhcmQ+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnb3JkZXJEZXRhaWxzLnN0YXR1cycpLFxuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ29yZGVyRGV0YWlscy5hY3RpdmUnKSxcbiAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdvcmRlckRldGFpbHMuY2FuY2VsbGVkJyksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3RleHRUaXRsZSwgdGV4dEFjdGl2ZSwgdGV4dENhbmNlbGxlZF0pID0+ICh7XG4gICAgICAgIHRpdGxlOiB0ZXh0VGl0bGUsXG4gICAgICAgIHRleHQ6IFthY3RpdmUgPyB0ZXh0QWN0aXZlIDogdGV4dENhbmNlbGxlZF0sXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UmVwbGVuaXNobWVudFN0YXJ0T25DYXJkQ29udGVudChpc29EYXRlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENhcmQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ29yZGVyRGV0YWlscy5zdGFydE9uJykucGlwZShcbiAgICAgIGZpbHRlcigoKSA9PiBCb29sZWFuKGlzb0RhdGUpKSxcbiAgICAgIG1hcCgodGV4dFRpdGxlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGl0bGU6IHRleHRUaXRsZSxcbiAgICAgICAgICB0ZXh0OiBbaXNvRGF0ZV0sXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRSZXBsZW5pc2htZW50RnJlcXVlbmN5Q2FyZENvbnRlbnQoZnJlcXVlbmN5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENhcmQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ29yZGVyRGV0YWlscy5mcmVxdWVuY3knKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IEJvb2xlYW4oZnJlcXVlbmN5KSksXG4gICAgICBtYXAoKHRleHRUaXRsZSkgPT4gKHtcbiAgICAgICAgdGl0bGU6IHRleHRUaXRsZSxcbiAgICAgICAgdGV4dDogW2ZyZXF1ZW5jeV0sXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UmVwbGVuaXNobWVudE5leHREYXRlQ2FyZENvbnRlbnQoaXNvRGF0ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDYXJkPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdvcmRlckRldGFpbHMubmV4dE9yZGVyRGF0ZScpLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gQm9vbGVhbihpc29EYXRlKSksXG4gICAgICBtYXAoKHRleHRUaXRsZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRpdGxlOiB0ZXh0VGl0bGUsXG4gICAgICAgICAgdGV4dDogW2lzb0RhdGVdLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0T3JkZXJDb2RlQ2FyZENvbnRlbnQob3JkZXJDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENhcmQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ29yZGVyRGV0YWlscy5vcmRlck51bWJlcicpLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gQm9vbGVhbihvcmRlckNvZGUpKSxcbiAgICAgIG1hcCgodGV4dFRpdGxlKSA9PiAoe1xuICAgICAgICB0aXRsZTogdGV4dFRpdGxlLFxuICAgICAgICB0ZXh0OiBbb3JkZXJDb2RlXSxcbiAgICAgIH0pKVxuICAgICk7XG4gIH1cblxuICBnZXRPcmRlckN1cnJlbnREYXRlQ2FyZENvbnRlbnQoaXNvRGF0ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDYXJkPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdvcmRlckRldGFpbHMucGxhY2VkT24nKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IEJvb2xlYW4oaXNvRGF0ZSkpLFxuICAgICAgbWFwKCh0ZXh0VGl0bGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aXRsZTogdGV4dFRpdGxlLFxuICAgICAgICAgIHRleHQ6IFtpc29EYXRlXSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldE9yZGVyU3RhdHVzQ2FyZENvbnRlbnQoc3RhdHVzOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENhcmQ+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnb3JkZXJEZXRhaWxzLnN0YXR1cycpLFxuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ29yZGVyRGV0YWlscy5zdGF0dXNEaXNwbGF5XycgKyBzdGF0dXMpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt0ZXh0VGl0bGUsIHRleHRTdGF0dXNdKSA9PiAoe1xuICAgICAgICB0aXRsZTogdGV4dFRpdGxlLFxuICAgICAgICB0ZXh0OiBbdGV4dFN0YXR1c10sXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UHVyY2hhc2VPcmRlck51bWJlcihwb051bWJlcjogc3RyaW5nKTogT2JzZXJ2YWJsZTxDYXJkPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ29yZGVyRGV0YWlscy5wdXJjaGFzZU9yZGVyTnVtYmVyJyksXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnb3JkZXJEZXRhaWxzLmVtcHR5UHVyY2hhc2VPcmRlcklkJyksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3RleHRUaXRsZSwgbm9uZVRleHRUaXRsZV0pID0+ICh7XG4gICAgICAgIHRpdGxlOiB0ZXh0VGl0bGUsXG4gICAgICAgIHRleHQ6IFtwb051bWJlciA/IHBvTnVtYmVyIDogbm9uZVRleHRUaXRsZV0sXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgZ2V0TWV0aG9kT2ZQYXltZW50Q2FyZENvbnRlbnQoXG4gICAgaGFzUGF5bWVudEluZm86IFBheW1lbnREZXRhaWxzXG4gICk6IE9ic2VydmFibGU8Q2FyZD4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdvcmRlckRldGFpbHMubWV0aG9kT2ZQYXltZW50JyksXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgncGF5bWVudFR5cGVzLnBheW1lbnRUeXBlX0FDQ09VTlQnKSxcbiAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdwYXltZW50VHlwZXMucGF5bWVudFR5cGVfQ0FSRCcpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt0ZXh0VGl0bGUsIHRleHRBY2NvdW50LCB0ZXh0Q2FyZF0pID0+ICh7XG4gICAgICAgIHRpdGxlOiB0ZXh0VGl0bGUsXG4gICAgICAgIHRleHQ6IFtCb29sZWFuKGhhc1BheW1lbnRJbmZvKSA/IHRleHRDYXJkIDogdGV4dEFjY291bnRdLFxuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldENvc3RDZW50ZXJDYXJkQ29udGVudChjb3N0Q2VudGVyOiBDb3N0Q2VudGVyKTogT2JzZXJ2YWJsZTxDYXJkPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdvcmRlckRldGFpbHMuY29zdENlbnRlcicpLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gQm9vbGVhbihjb3N0Q2VudGVyKSksXG4gICAgICBtYXAoKHRleHRUaXRsZSkgPT4gKHtcbiAgICAgICAgdGl0bGU6IHRleHRUaXRsZSxcbiAgICAgICAgdGV4dEJvbGQ6IGNvc3RDZW50ZXI/Lm5hbWUsXG4gICAgICAgIHRleHQ6IFsnKCcgKyBjb3N0Q2VudGVyPy51bml0Py5uYW1lICsgJyknXSxcbiAgICAgIH0pKVxuICAgICk7XG4gIH1cblxuICBnZXRBZGRyZXNzQ2FyZENvbnRlbnQoZGVsaXZlcnlBZGRyZXNzOiBBZGRyZXNzKTogT2JzZXJ2YWJsZTxDYXJkPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdhZGRyZXNzQ2FyZC5zaGlwVG8nKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IEJvb2xlYW4oZGVsaXZlcnlBZGRyZXNzKSksXG4gICAgICBtYXAoKHRleHRUaXRsZSkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRBZGRyZXNzID0gdGhpcy5ub3JtYWxpemVGb3JtYXR0ZWRBZGRyZXNzKFxuICAgICAgICAgIGRlbGl2ZXJ5QWRkcmVzcy5mb3JtYXR0ZWRBZGRyZXNzXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aXRsZTogdGV4dFRpdGxlLFxuICAgICAgICAgIHRleHRCb2xkOiBgJHtkZWxpdmVyeUFkZHJlc3MuZmlyc3ROYW1lfSAke2RlbGl2ZXJ5QWRkcmVzcy5sYXN0TmFtZX1gLFxuICAgICAgICAgIHRleHQ6IFtmb3JtYXR0ZWRBZGRyZXNzLCBkZWxpdmVyeUFkZHJlc3MuY291bnRyeS5uYW1lXSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldERlbGl2ZXJ5TW9kZUNhcmRDb250ZW50KGRlbGl2ZXJ5TW9kZTogRGVsaXZlcnlNb2RlKTogT2JzZXJ2YWJsZTxDYXJkPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdvcmRlckRldGFpbHMuc2hpcHBpbmdNZXRob2QnKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IEJvb2xlYW4oZGVsaXZlcnlNb2RlKSksXG4gICAgICBtYXAoKHRleHRUaXRsZSkgPT4gKHtcbiAgICAgICAgdGl0bGU6IHRleHRUaXRsZSxcbiAgICAgICAgdGV4dEJvbGQ6IGRlbGl2ZXJ5TW9kZS5uYW1lLFxuICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgZGVsaXZlcnlNb2RlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGRlbGl2ZXJ5TW9kZS5kZWxpdmVyeUNvc3Q/LmZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICA/IGRlbGl2ZXJ5TW9kZS5kZWxpdmVyeUNvc3Q/LmZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICA6ICcnLFxuICAgICAgICBdLFxuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldFBheW1lbnRJbmZvQ2FyZENvbnRlbnQocGF5bWVudDogUGF5bWVudERldGFpbHMpOiBPYnNlcnZhYmxlPENhcmQ+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgncGF5bWVudEZvcm0ucGF5bWVudCcpLFxuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ3BheW1lbnRDYXJkLmV4cGlyZXMnLCB7XG4gICAgICAgIG1vbnRoOiBCb29sZWFuKHBheW1lbnQpID8gcGF5bWVudC5leHBpcnlNb250aCA6ICcnLFxuICAgICAgICB5ZWFyOiBCb29sZWFuKHBheW1lbnQpID8gcGF5bWVudC5leHBpcnlZZWFyIDogJycsXG4gICAgICB9KSxcbiAgICBdKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IEJvb2xlYW4ocGF5bWVudCkpLFxuICAgICAgbWFwKChbdGV4dFRpdGxlLCB0ZXh0RXhwaXJlc10pID0+ICh7XG4gICAgICAgIHRpdGxlOiB0ZXh0VGl0bGUsXG4gICAgICAgIHRleHRCb2xkOiBwYXltZW50LmFjY291bnRIb2xkZXJOYW1lLFxuICAgICAgICB0ZXh0OiBbcGF5bWVudC5jYXJkTnVtYmVyLCB0ZXh0RXhwaXJlc10sXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QmlsbGluZ0FkZHJlc3NDYXJkQ29udGVudChiaWxsaW5nQWRkcmVzczogQWRkcmVzcyk6IE9ic2VydmFibGU8Q2FyZD4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgncGF5bWVudEZvcm0uYmlsbGluZ0FkZHJlc3MnKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IEJvb2xlYW4oYmlsbGluZ0FkZHJlc3MpKSxcbiAgICAgIG1hcCgodGV4dFRpdGxlKSA9PiAoe1xuICAgICAgICB0aXRsZTogdGV4dFRpdGxlLFxuICAgICAgICB0ZXh0Qm9sZDogYCR7YmlsbGluZ0FkZHJlc3MuZmlyc3ROYW1lfSAke2JpbGxpbmdBZGRyZXNzLmxhc3ROYW1lfWAsXG4gICAgICAgIHRleHQ6IFtiaWxsaW5nQWRkcmVzcy5mb3JtYXR0ZWRBZGRyZXNzLCBiaWxsaW5nQWRkcmVzcy5jb3VudHJ5Lm5hbWVdLFxuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplRm9ybWF0dGVkQWRkcmVzcyhmb3JtYXR0ZWRBZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFkZHJlc3NlcyA9IGZvcm1hdHRlZEFkZHJlc3NcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKChhZGRyZXNzKSA9PiBhZGRyZXNzLnRyaW0oKSk7XG5cbiAgICBjb25zdCBuZXdGb3JtYXR0ZWRBZGRyZXNzID0gYWRkcmVzc2VzLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpO1xuXG4gICAgcmV0dXJuIG5ld0Zvcm1hdHRlZEFkZHJlc3M7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjeC1vcmRlci1zdW1tYXJ5XCI+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3JkZXIucmVwbGVuaXNobWVudE9yZGVyQ29kZTsgZWxzZSBvdGhlck9yZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3gtc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiXG4gICAgICAgICAgICBnZXRSZXBsZW5pc2htZW50Q29kZUNhcmRDb250ZW50KG9yZGVyPy5yZXBsZW5pc2htZW50T3JkZXJDb2RlKVxuICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvY3gtY2FyZD5cblxuICAgICAgICA8Y3gtY2FyZFxuICAgICAgICAgIFtjb250ZW50XT1cImdldFJlcGxlbmlzaG1lbnRBY3RpdmVDYXJkQ29udGVudChvcmRlcj8uYWN0aXZlKSB8IGFzeW5jXCJcbiAgICAgICAgPjwvY3gtY2FyZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3gtc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiXG4gICAgICAgICAgICBnZXRSZXBsZW5pc2htZW50U3RhcnRPbkNhcmRDb250ZW50KG9yZGVyPy5maXJzdERhdGUgfCBjeERhdGUpXG4gICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuXG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiXG4gICAgICAgICAgICBnZXRSZXBsZW5pc2htZW50RnJlcXVlbmN5Q2FyZENvbnRlbnQoXG4gICAgICAgICAgICAgIG9yZGVyPy50cmlnZ2VyPy5kaXNwbGF5VGltZVRhYmxlXG4gICAgICAgICAgICApIHwgYXN5bmNcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuXG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiXG4gICAgICAgICAgICBnZXRSZXBsZW5pc2htZW50TmV4dERhdGVDYXJkQ29udGVudChcbiAgICAgICAgICAgICAgb3JkZXI/LnRyaWdnZXI/LmFjdGl2YXRpb25UaW1lIHwgY3hEYXRlXG4gICAgICAgICAgICApIHwgYXN5bmNcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI290aGVyT3JkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3gtc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiZ2V0T3JkZXJDb2RlQ2FyZENvbnRlbnQob3JkZXI/LmNvZGUpIHwgYXN5bmNcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuXG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiXG4gICAgICAgICAgICBnZXRPcmRlckN1cnJlbnREYXRlQ2FyZENvbnRlbnQob3JkZXI/LmNyZWF0ZWQgfCBjeERhdGUpIHwgYXN5bmNcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuXG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiZ2V0T3JkZXJTdGF0dXNDYXJkQ29udGVudChvcmRlci5zdGF0dXNEaXNwbGF5KSB8IGFzeW5jXCJcbiAgICAgICAgPjwvY3gtY2FyZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIm9yZGVyLnB1cmNoYXNlT3JkZXJOdW1iZXIgfHwgb3JkZXIucHVyY2hhc2VPcmRlck51bWJlciA9PT0gJydcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjeC1zdW1tYXJ5LWNhcmRcIj5cbiAgICAgICAgPGN4LWNhcmRcbiAgICAgICAgICBbY29udGVudF09XCJnZXRQdXJjaGFzZU9yZGVyTnVtYmVyKG9yZGVyPy5wdXJjaGFzZU9yZGVyTnVtYmVyKSB8IGFzeW5jXCJcbiAgICAgICAgPjwvY3gtY2FyZD5cblxuICAgICAgICA8Y3gtY2FyZFxuICAgICAgICAgIFtjb250ZW50XT1cImdldE1ldGhvZE9mUGF5bWVudENhcmRDb250ZW50KG9yZGVyLnBheW1lbnRJbmZvKSB8IGFzeW5jXCJcbiAgICAgICAgPjwvY3gtY2FyZD5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3JkZXIuY29zdENlbnRlclwiPlxuICAgICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgICBbY29udGVudF09XCJnZXRDb3N0Q2VudGVyQ2FyZENvbnRlbnQob3JkZXI/LmNvc3RDZW50ZXIpIHwgYXN5bmNcIlxuICAgICAgICAgID48L2N4LWNhcmQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtc3VtbWFyeS1jYXJkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3JkZXIuZGVsaXZlcnlBZGRyZXNzXCI+XG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiZ2V0QWRkcmVzc0NhcmRDb250ZW50KG9yZGVyPy5kZWxpdmVyeUFkZHJlc3MpIHwgYXN5bmNcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcmRlci5kZWxpdmVyeU1vZGVcIj5cbiAgICAgICAgPGN4LWNhcmRcbiAgICAgICAgICBbY29udGVudF09XCJnZXREZWxpdmVyeU1vZGVDYXJkQ29udGVudChvcmRlcj8uZGVsaXZlcnlNb2RlKSB8IGFzeW5jXCJcbiAgICAgICAgPjwvY3gtY2FyZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9yZGVyLnBheW1lbnRJbmZvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3gtc3VtbWFyeS1jYXJkXCI+XG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiZ2V0UGF5bWVudEluZm9DYXJkQ29udGVudChvcmRlcj8ucGF5bWVudEluZm8pIHwgYXN5bmNcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuXG4gICAgICAgIDxjeC1jYXJkXG4gICAgICAgICAgW2NvbnRlbnRdPVwiXG4gICAgICAgICAgICBnZXRCaWxsaW5nQWRkcmVzc0NhcmRDb250ZW50KG9yZGVyPy5wYXltZW50SW5mbz8uYmlsbGluZ0FkZHJlc3MpXG4gICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9jeC1jYXJkPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=