UNPKG

@spartacus/storefront

Version:

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

167 lines 26.5 kB
import { ChangeDetectionStrategy, Component, Input, } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { PromotionLocation, } from '@spartacus/core'; import { Subscription } from 'rxjs'; import { map, startWith, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@spartacus/core"; import * as i2 from "../cart-item/cart-item.component"; import * as i3 from "@angular/common"; export class CartItemListComponent { constructor(activeCartService, selectiveCartService, userIdService, multiCartService) { this.activeCartService = activeCartService; this.selectiveCartService = selectiveCartService; this.userIdService = userIdService; this.multiCartService = multiCartService; this.subscription = new Subscription(); this.readonly = false; this.hasHeader = true; this.options = { isSaveForLater: false, optionalBtn: null, }; this._items = []; this.form = new FormGroup({}); this.promotionLocation = PromotionLocation.ActiveCart; } set items(items) { this.resolveItems(items); this.createForm(); } get items() { return this._items; } set setLoading(value) { if (!this.readonly) { // Whenever the cart is loading, we disable the complete form // to avoid any user interaction with the cart. value ? this.form.disable({ emitEvent: false }) : this.form.enable({ emitEvent: false }); } } ngOnInit() { var _a; this.subscription.add((_a = this.userIdService) === null || _a === void 0 ? void 0 : _a.getUserId().subscribe((userId) => (this.userId = userId))); } /** * Resolves items passed to component input and updates 'items' field */ resolveItems(items) { var _a; if (!items) { this._items = []; return; } // The items we're getting from the input do not have a consistent model. // In case of a `consignmentEntry`, we need to normalize the data from the orderEntry. if (items.every((item) => item.hasOwnProperty('orderEntry'))) { this._items = items.map((consignmentEntry) => { const entry = Object.assign({}, consignmentEntry.orderEntry); entry.quantity = consignmentEntry.quantity; return entry; }); } else { // We'd like to avoid the unnecessary re-renders of unchanged cart items after the data reload. // OCC cart entries don't have any unique identifier that we could use in Angular `trackBy`. // So we update each array element to the new object only when it's any different to the previous one. for (let i = 0; i < Math.max(items.length, this._items.length); i++) { if (JSON.stringify((_a = this._items) === null || _a === void 0 ? void 0 : _a[i]) !== JSON.stringify(items[i])) { if (this._items[i] && this.form) { this.form.removeControl(this.getControlName(this._items[i])); } if (!items[i]) { this._items.splice(i, 1); } else { this._items[i] = items[i]; } } } } } /** * Creates form models for list items */ createForm() { this._items.forEach((item) => { const controlName = this.getControlName(item); const group = new FormGroup({ entryNumber: new FormControl(item.entryNumber), quantity: new FormControl(item.quantity, { updateOn: 'blur' }), }); this.form.addControl(controlName, group); // If we disable form group before adding, disabled status will reset // Which forces us to disable control after including to form object if (!item.updateable || this.readonly) { this.form.controls[controlName].disable(); } }); } getControlName(item) { return item.entryNumber.toString(); } removeEntry(item) { var _a; if (this.selectiveCartService && this.options.isSaveForLater) { this.selectiveCartService.removeEntry(item); } else if (this.cartId && this.userId) { (_a = this.multiCartService) === null || _a === void 0 ? void 0 : _a.removeEntry(this.userId, this.cartId, item.entryNumber); } else { this.activeCartService.removeEntry(item); } delete this.form.controls[this.getControlName(item)]; } getControl(item) { return this.form.get(this.getControlName(item)).valueChanges.pipe( // eslint-disable-next-line import/no-deprecated startWith(null), tap((value) => { var _a; if (item.updateable && value && !this.readonly) { if (this.selectiveCartService && this.options.isSaveForLater) { this.selectiveCartService.updateEntry(value.entryNumber, value.quantity); } else if (this.cartId && this.userId) { (_a = this.multiCartService) === null || _a === void 0 ? void 0 : _a.updateEntry(this.userId, this.cartId, value.entryNumber, value.quantity); } else { this.activeCartService.updateEntry(value.entryNumber, value.quantity); } } }), map(() => this.form.get(this.getControlName(item)))); } ngOnDestroy() { var _a; (_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); } } CartItemListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartItemListComponent, deps: [{ token: i1.ActiveCartService }, { token: i1.SelectiveCartService }, { token: i1.UserIdService }, { token: i1.MultiCartService }], target: i0.ɵɵFactoryTarget.Component }); CartItemListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: CartItemListComponent, selector: "cx-cart-item-list", inputs: { readonly: "readonly", hasHeader: "hasHeader", options: "options", cartId: "cartId", items: "items", promotionLocation: "promotionLocation", setLoading: ["cartIsLoading", "setLoading"] }, ngImport: i0, template: "<div *ngIf=\"hasHeader\" class=\"d-none d-md-block d-lg-block d-xl-block\">\n <div class=\"cx-item-list-header row\">\n <div class=\"cx-item-list-desc col-md-5 col-lg-5 col-xl-6\">\n {{ 'cartItems.description' | cxTranslate }}\n </div>\n <div class=\"cx-item-list-price col-md-3 col-lg-2 col-xl-2\">\n {{ 'cartItems.itemPrice' | cxTranslate }}\n </div>\n <div class=\"cx-item-list-qty col-md-2 col-lg-3 col-xl-2\">\n {{ 'cartItems.quantity' | cxTranslate }}\n </div>\n\n <ng-container *ngIf=\"options.isSaveForLater; else totalHeader\">\n <div class=\"cx-item-list-total col-md-2 col-lg-2 col-xl-2\">\n {{ 'saveForLaterItems.stock' | cxTranslate }}\n </div>\n </ng-container>\n </div>\n</div>\n\n<div class=\"cx-item-list-row\" *ngFor=\"let item of items; let i = index\">\n <div\n *ngIf=\"getControl(item) | async as control\"\n class=\"cx-item-list-items\"\n [class.is-changed]=\"control.get('quantity').disabled\"\n >\n <cx-cart-item\n [item]=\"item\"\n [quantityControl]=\"control.get('quantity')\"\n [readonly]=\"readonly\"\n [promotionLocation]=\"promotionLocation\"\n [options]=\"options\"\n >\n </cx-cart-item>\n </div>\n</div>\n\n<ng-template #totalHeader>\n <div class=\"cx-item-list-total col-md-2 col-lg-2 col-xl-2\">\n {{ 'cartItems.total' | cxTranslate }}\n </div>\n</ng-template>\n", components: [{ type: i2.CartItemComponent, selector: "cx-cart-item", inputs: ["compact", "item", "readonly", "quantityControl", "promotionLocation", "options"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "cxTranslate": i1.TranslatePipe, "async": i3.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartItemListComponent, decorators: [{ type: Component, args: [{ selector: 'cx-cart-item-list', templateUrl: './cart-item-list.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.ActiveCartService }, { type: i1.SelectiveCartService }, { type: i1.UserIdService }, { type: i1.MultiCartService }]; }, propDecorators: { readonly: [{ type: Input }], hasHeader: [{ type: Input }], options: [{ type: Input }], cartId: [{ type: Input }], items: [{ type: Input, args: ['items'] }], promotionLocation: [{ type: Input }], setLoading: [{ type: Input, args: ['cartIsLoading'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1pdGVtLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9jbXMtY29tcG9uZW50cy9jYXJ0L2NhcnQtc2hhcmVkL2NhcnQtaXRlbS1saXN0L2NhcnQtaXRlbS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLWNvbXBvbmVudHMvY2FydC9jYXJ0LXNoYXJlZC9jYXJ0LWl0ZW0tbGlzdC9jYXJ0LWl0ZW0tbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBS0wsaUJBQWlCLEdBR2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFRckQsTUFBTSxPQUFPLHFCQUFxQjtJQXVDaEMsWUFDWSxpQkFBb0MsRUFDcEMsb0JBQTBDLEVBQzFDLGFBQTRCLEVBQzVCLGdCQUFrQztRQUhsQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQTFDcEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR25DLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsY0FBUyxHQUFZLElB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QVcsQ0FDaEMsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsTUFBTSxFQUNYLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLEtBQUssQ0FBQyxRQUFRLENBQ2YsQ0FBQztpQkFDSDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUNoQyxLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsUUFBUSxDQUNmLENBQUM7aUJBQ0g7YUFDRjtRQUNILENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDL0QsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXOztRQUNULE1BQUEsSUFBSSxDQUFDLFlBQVksMENBQUUsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQzs7a0hBcktVLHFCQUFxQjtzR0FBckIscUJBQXFCLDhQQzFCbEMsKzNDQTBDQTsyRkRoQmEscUJBQXFCO2tCQUxqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFdBQVcsRUFBRSxpQ0FBaUM7b0JBQzlDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDtzTUFLVSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFNRixLQUFLO3NCQURSLEtBQUs7dUJBQUMsT0FBTztnQkFTTCxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRXNCLFVBQVU7c0JBQXJDLEtBQUs7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWN0aXZlQ2FydFNlcnZpY2UsXG4gIENvbnNpZ25tZW50RW50cnksXG4gIE11bHRpQ2FydFNlcnZpY2UsXG4gIE9yZGVyRW50cnksXG4gIFByb21vdGlvbkxvY2F0aW9uLFxuICBTZWxlY3RpdmVDYXJ0U2VydmljZSxcbiAgVXNlcklkU2VydmljZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENhcnRJdGVtQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gJy4uL2NhcnQtaXRlbS9jYXJ0LWl0ZW0uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3gtY2FydC1pdGVtLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FydC1pdGVtLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2FydEl0ZW1MaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgdXNlcklkOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBoYXNIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIG9wdGlvbnM6IENhcnRJdGVtQ29tcG9uZW50T3B0aW9ucyA9IHtcbiAgICBpc1NhdmVGb3JMYXRlcjogZmFsc2UsXG4gICAgb3B0aW9uYWxCdG46IG51bGwsXG4gIH07XG5cbiAgQElucHV0KCkgY2FydElkOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIF9pdGVtczogT3JkZXJFbnRyeVtdID0gW107XG4gIGZvcm06IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gIEBJbnB1dCgnaXRlbXMnKVxuICBzZXQgaXRlbXMoaXRlbXM6IE9yZGVyRW50cnlbXSkge1xuICAgIHRoaXMucmVzb2x2ZUl0ZW1zKGl0ZW1zKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuICBnZXQgaXRlbXMoKTogT3JkZXJFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cblxuICBASW5wdXQoKSBwcm9tb3Rpb25Mb2NhdGlvbjogUHJvbW90aW9uTG9jYXRpb24gPSBQcm9tb3Rpb25Mb2NhdGlvbi5BY3RpdmVDYXJ0O1xuXG4gIEBJbnB1dCgnY2FydElzTG9hZGluZycpIHNldCBzZXRMb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAvLyBXaGVuZXZlciB0aGUgY2FydCBpcyBsb2FkaW5nLCB3ZSBkaXNhYmxlIHRoZSBjb21wbGV0ZSBmb3JtXG4gICAgICAvLyB0byBhdm9pZCBhbnkgdXNlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBjYXJ0LlxuICAgICAgdmFsdWVcbiAgICAgICAgPyB0aGlzLmZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSlcbiAgICAgICAgOiB0aGlzLmZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgYWN0aXZlQ2FydFNlcnZpY2U6IEFjdGl2ZUNhcnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzZWxlY3RpdmVDYXJ0U2VydmljZTogU2VsZWN0aXZlQ2FydFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHVzZXJJZFNlcnZpY2U6IFVzZXJJZFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG11bHRpQ2FydFNlcnZpY2U6IE11bHRpQ2FydFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMudXNlcklkU2VydmljZVxuICAgICAgICA/LmdldFVzZXJJZCgpXG4gICAgICAgIC5zdWJzY3JpYmUoKHVzZXJJZCkgPT4gKHRoaXMudXNlcklkID0gdXNlcklkKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGl0ZW1zIHBhc3NlZCB0byBjb21wb25lbnQgaW5wdXQgYW5kIHVwZGF0ZXMgJ2l0ZW1zJyBmaWVsZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVJdGVtcyhpdGVtczogT3JkZXJFbnRyeVtdKTogdm9pZCB7XG4gICAgaWYgKCFpdGVtcykge1xuICAgICAgdGhpcy5faXRlbXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgaXRlbXMgd2UncmUgZ2V0dGluZyBmcm9tIHRoZSBpbnB1dCBkbyBub3QgaGF2ZSBhIGNvbnNpc3RlbnQgbW9kZWwuXG4gICAgLy8gSW4gY2FzZSBvZiBhIGBjb25zaWdubWVudEVudHJ5YCwgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIGRhdGEgZnJvbSB0aGUgb3JkZXJFbnRyeS5cbiAgICBpZiAoaXRlbXMuZXZlcnkoKGl0ZW0pID0+IGl0ZW0uaGFzT3duUHJvcGVydHkoJ29yZGVyRW50cnknKSkpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMubWFwKChjb25zaWdubWVudEVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB7fSxcbiAgICAgICAgICAoY29uc2lnbm1lbnRFbnRyeSBhcyBDb25zaWdubWVudEVudHJ5KS5vcmRlckVudHJ5XG4gICAgICAgICk7XG4gICAgICAgIGVudHJ5LnF1YW50aXR5ID0gY29uc2lnbm1lbnRFbnRyeS5xdWFudGl0eTtcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlJ2QgbGlrZSB0byBhdm9pZCB0aGUgdW5uZWNlc3NhcnkgcmUtcmVuZGVycyBvZiB1bmNoYW5nZWQgY2FydCBpdGVtcyBhZnRlciB0aGUgZGF0YSByZWxvYWQuXG4gICAgICAvLyBPQ0MgY2FydCBlbnRyaWVzIGRvbid0IGhhdmUgYW55IHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgd2UgY291bGQgdXNlIGluIEFuZ3VsYXIgYHRyYWNrQnlgLlxuICAgICAgLy8gU28gd2UgdXBkYXRlIGVhY2ggYXJyYXkgZWxlbWVudCB0byB0aGUgbmV3IG9iamVjdCBvbmx5IHdoZW4gaXQncyBhbnkgZGlmZmVyZW50IHRvIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KGl0ZW1zLmxlbmd0aCwgdGhpcy5faXRlbXMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLl9pdGVtcz8uW2ldKSAhPT0gSlNPTi5zdHJpbmdpZnkoaXRlbXNbaV0pKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldICYmIHRoaXMuZm9ybSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5nZXRDb250cm9sTmFtZSh0aGlzLl9pdGVtc1tpXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWl0ZW1zW2ldKSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zW2ldID0gaXRlbXNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZm9ybSBtb2RlbHMgZm9yIGxpc3QgaXRlbXNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuX2l0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xOYW1lID0gdGhpcy5nZXRDb250cm9sTmFtZShpdGVtKTtcbiAgICAgIGNvbnN0IGdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGVudHJ5TnVtYmVyOiBuZXcgRm9ybUNvbnRyb2woaXRlbS5lbnRyeU51bWJlciksXG4gICAgICAgIHF1YW50aXR5OiBuZXcgRm9ybUNvbnRyb2woaXRlbS5xdWFudGl0eSwgeyB1cGRhdGVPbjogJ2JsdXInIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBncm91cCk7XG5cbiAgICAgIC8vIElmIHdlIGRpc2FibGUgZm9ybSBncm91cCBiZWZvcmUgYWRkaW5nLCBkaXNhYmxlZCBzdGF0dXMgd2lsbCByZXNldFxuICAgICAgLy8gV2hpY2ggZm9yY2VzIHVzIHRvIGRpc2FibGUgY29udHJvbCBhZnRlciBpbmNsdWRpbmcgdG8gZm9ybSBvYmplY3RcbiAgICAgIGlmICghaXRlbS51cGRhdGVhYmxlIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29udHJvbE5hbWUoaXRlbTogT3JkZXJFbnRyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uZW50cnlOdW1iZXIudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJlbW92ZUVudHJ5KGl0ZW06IE9yZGVyRW50cnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RpdmVDYXJ0U2VydmljZSAmJiB0aGlzLm9wdGlvbnMuaXNTYXZlRm9yTGF0ZXIpIHtcbiAgICAgIHRoaXMuc2VsZWN0aXZlQ2FydFNlcnZpY2UucmVtb3ZlRW50cnkoaXRlbSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNhcnRJZCAmJiB0aGlzLnVzZXJJZCkge1xuICAgICAgdGhpcy5tdWx0aUNhcnRTZXJ2aWNlPy5yZW1vdmVFbnRyeShcbiAgICAgICAgdGhpcy51c2VySWQsXG4gICAgICAgIHRoaXMuY2FydElkLFxuICAgICAgICBpdGVtLmVudHJ5TnVtYmVyXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZUNhcnRTZXJ2aWNlLnJlbW92ZUVudHJ5KGl0ZW0pO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZ2V0Q29udHJvbE5hbWUoaXRlbSldO1xuICB9XG5cbiAgZ2V0Q29udHJvbChpdGVtOiBPcmRlckVudHJ5KTogT2JzZXJ2YWJsZTxGb3JtR3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCh0aGlzLmdldENvbnRyb2xOYW1lKGl0ZW0pKS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZGVwcmVjYXRlZFxuICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS51cGRhdGVhYmxlICYmIHZhbHVlICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aXZlQ2FydFNlcnZpY2UgJiYgdGhpcy5vcHRpb25zLmlzU2F2ZUZvckxhdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGl2ZUNhcnRTZXJ2aWNlLnVwZGF0ZUVudHJ5KFxuICAgICAgICAgICAgICB2YWx1ZS5lbnRyeU51bWJlcixcbiAgICAgICAgICAgICAgdmFsdWUucXVhbnRpdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcnRJZCAmJiB0aGlzLnVzZXJJZCkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aUNhcnRTZXJ2aWNlPy51cGRhdGVFbnRyeShcbiAgICAgICAgICAgICAgdGhpcy51c2VySWQsXG4gICAgICAgICAgICAgIHRoaXMuY2FydElkLFxuICAgICAgICAgICAgICB2YWx1ZS5lbnRyeU51bWJlcixcbiAgICAgICAgICAgICAgdmFsdWUucXVhbnRpdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FydFNlcnZpY2UudXBkYXRlRW50cnkoXG4gICAgICAgICAgICAgIHZhbHVlLmVudHJ5TnVtYmVyLFxuICAgICAgICAgICAgICB2YWx1ZS5xdWFudGl0eVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKCgpID0+IDxGb3JtR3JvdXA+dGhpcy5mb3JtLmdldCh0aGlzLmdldENvbnRyb2xOYW1lKGl0ZW0pKSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJoYXNIZWFkZXJcIiBjbGFzcz1cImQtbm9uZSBkLW1kLWJsb2NrIGQtbGctYmxvY2sgZC14bC1ibG9ja1wiPlxuICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LWhlYWRlciByb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LWRlc2MgY29sLW1kLTUgY29sLWxnLTUgY29sLXhsLTZcIj5cbiAgICAgIHt7ICdjYXJ0SXRlbXMuZGVzY3JpcHRpb24nIHwgY3hUcmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LXByaWNlIGNvbC1tZC0zIGNvbC1sZy0yIGNvbC14bC0yXCI+XG4gICAgICB7eyAnY2FydEl0ZW1zLml0ZW1QcmljZScgfCBjeFRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjeC1pdGVtLWxpc3QtcXR5IGNvbC1tZC0yIGNvbC1sZy0zIGNvbC14bC0yXCI+XG4gICAgICB7eyAnY2FydEl0ZW1zLnF1YW50aXR5JyB8IGN4VHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9ucy5pc1NhdmVGb3JMYXRlcjsgZWxzZSB0b3RhbEhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImN4LWl0ZW0tbGlzdC10b3RhbCBjb2wtbWQtMiBjb2wtbGctMiBjb2wteGwtMlwiPlxuICAgICAgICB7eyAnc2F2ZUZvckxhdGVySXRlbXMuc3RvY2snIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LXJvd1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cImdldENvbnRyb2woaXRlbSkgfCBhc3luYyBhcyBjb250cm9sXCJcbiAgICBjbGFzcz1cImN4LWl0ZW0tbGlzdC1pdGVtc1wiXG4gICAgW2NsYXNzLmlzLWNoYW5nZWRdPVwiY29udHJvbC5nZXQoJ3F1YW50aXR5JykuZGlzYWJsZWRcIlxuICA+XG4gICAgPGN4LWNhcnQtaXRlbVxuICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICBbcXVhbnRpdHlDb250cm9sXT1cImNvbnRyb2wuZ2V0KCdxdWFudGl0eScpXCJcbiAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICBbcHJvbW90aW9uTG9jYXRpb25dPVwicHJvbW90aW9uTG9jYXRpb25cIlxuICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgPlxuICAgIDwvY3gtY2FydC1pdGVtPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RvdGFsSGVhZGVyPlxuICA8ZGl2IGNsYXNzPVwiY3gtaXRlbS1saXN0LXRvdGFsIGNvbC1tZC0yIGNvbC1sZy0yIGNvbC14bC0yXCI+XG4gICAge3sgJ2NhcnRJdGVtcy50b3RhbCcgfCBjeFRyYW5zbGF0ZSB9fVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=