UNPKG

@vendasta/store

Version:

Components and data for Store

115 lines 30.4 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { BehaviorSubject, ReplaySubject, combineLatest, merge as observableMerge } from 'rxjs'; import { Package } from './package'; import { Addon } from '@vendasta/core/shared'; import { skipWhile, shareReplay, map, take } from 'rxjs/operators'; import { orderProductsAndAddons } from './utils'; import * as i0 from "@angular/core"; import * as i1 from "../header-container/header-container.component"; import * as i2 from "../selling-info/selling-info.component"; import * as i3 from "../products-nav/products-nav.component"; import * as i4 from "../faqs/faqs.component"; import * as i5 from "@vendasta/uikit"; import * as i6 from "../files/files.component"; import * as i7 from "@angular/common"; export class VaPackageDetailsComponent { constructor() { this.showActionButton = true; this.showPricing = true; this.actionLabel = 'Get It Now'; this.getItNow = new EventEmitter(); this.standAloneProducts$$ = new BehaviorSubject([]); this.products$ = new BehaviorSubject([]); this.addons$ = new BehaviorSubject([]); this.pkg$ = new ReplaySubject(1); this.itemSelectedEvent$ = new ReplaySubject(1); this.combinedItemsList$ = combineLatest(this.products$, this.addons$, (products, addons) => { return [].concat(products || []).concat(addons || []); }); this.orderedItemsList$ = combineLatest(this.combinedItemsList$, this.pkg$, (combined, pkg) => { return orderProductsAndAddons(combined, pkg ? pkg.productOrder || [] : []); }); const nonEmptyCombinedItemsList = this.combinedItemsList$.pipe(skipWhile((items) => !items || items.length === 0), shareReplay(1)); // Need to map to an index because that's how product selection works. const initialSelectedItem$ = nonEmptyCombinedItemsList.pipe(map((_) => 0), take(1)); const mergedSelection = observableMerge(initialSelectedItem$, this.itemSelectedEvent$); this.selectedItem$ = combineLatest([mergedSelection, this.orderedItemsList$]).pipe(map(([index, items]) => { return items[index]; })); this.lmiCategories$ = this.products$.pipe(skipWhile((products) => !products || products.length === 0), map((products) => { return VaPackageDetailsComponent.getLmiCategories(products); })); this.productNameForSingleAddon$ = nonEmptyCombinedItemsList.pipe(map((items) => { return VaPackageDetailsComponent.getProductNameForSingleAddon(items); })); this.displayTagName$ = combineLatest([this.pkg$, this.combinedItemsList$]).pipe(map(([pkg, items]) => { return VaPackageDetailsComponent.getDisplayTagline(pkg, items); })); } set standAloneProducts(standAloneProducts) { this.standAloneProducts$$.next(standAloneProducts); } set products(products) { this.products$.next(products); } set addons(addons) { this.addons$.next(addons); } set pkg(pkg) { this.pkg$.next(pkg); } static getLmiCategories(products) { let lmiCategories = []; if (products) { products.forEach((product) => { lmiCategories = lmiCategories.concat(product.getLmiCategoryNames()); }); } return new Set(lmiCategories); } static getDisplayTagline(pkg, items) { if (pkg && pkg.tagline) { return pkg.tagline; } else if (items && items.length === 1) { // Single product / addon package. return items[0].tagline || ''; } return ''; } static getProductNameForSingleAddon(items) { if (items && items.length === 1 && items[0] instanceof Addon) { const addon = items[0]; return addon.productName; } } selectItem(i) { this.itemSelectedEvent$.next(i); } emitGetItNow() { this.getItNow.emit(); } } VaPackageDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaPackageDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); VaPackageDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: VaPackageDetailsComponent, selector: "app-store-package-details", inputs: { showActionButton: "showActionButton", showPricing: "showPricing", actionLabel: "actionLabel", standAloneProducts: "standAloneProducts", products: "products", addons: "addons", pkg: "pkg" }, outputs: { getItNow: "getItNow" }, ngImport: i0, template: "<div *ngIf=\"pkg$ | async as pkg\" class=\"page\">\n <app-header-container\n [iconUrl]=\"pkg.icon\"\n [title]=\"pkg.name\"\n [tagline]=\"displayTagName$ | async\"\n [prerequisite]=\"productNameForSingleAddon$ | async\"\n [chipLabels]=\"lmiCategories$ | async\"\n [pricing]=\"pkg.pricing\"\n [pricingLabel]=\"'Pricing'\"\n [showAction]=\"showActionButton\"\n [showPricing]=\"showPricing\"\n [actionLabel]=\"actionLabel\"\n [actionEnabled]=\"true\"\n (actionSelected)=\"emitGetItNow()\"\n ></app-header-container>\n <ng-container *ngIf=\"pkg?.content\">\n <app-selling-info [description]=\"pkg.content\"></app-selling-info>\n </ng-container>\n\n <app-products-nav\n [items]=\"orderedItemsList$ | async\"\n [hideItemsNav]=\"pkg?.hide_product_icons_and_names\"\n (itemSelected)=\"selectItem($event)\"\n ></app-products-nav>\n\n <ng-container *ngIf=\"selectedItem$ | async as selectedItem\">\n <div *ngIf=\"!pkg?.hide_product_details\" class=\"package-content\">\n <div class=\"left-column\">\n <section\n *ngIf=\"\n selectedItem.endUserMarketing?.description ||\n selectedItem.endUserMarketing?.keySellingPoints ||\n selectedItem.description ||\n selectedItem.keySellingPoints\n \"\n >\n <app-selling-info\n [description]=\"\n selectedItem.endUserMarketing?.description ||\n selectedItem.description\n \"\n [keySellingPoints]=\"\n selectedItem.endUserMarketing?.keySellingPoints ||\n selectedItem.keySellingPoints\n \"\n ></app-selling-info>\n </section>\n\n <section\n *ngIf=\"\n (selectedItem.endUserMarketing?.faqs?.length > 0 &&\n selectedItem.endUserMarketing?.faqs[0].question) ||\n selectedItem.faqs?.length > 0\n \"\n >\n <h2 class=\"va-component-title\">FAQs</h2>\n <app-faqs\n [faqs]=\"selectedItem.endUserMarketing?.faqs || selectedItem.faqs\"\n ></app-faqs>\n </section>\n </div>\n\n <div class=\"right-column\">\n <section\n *ngIf=\"\n selectedItem.screenshotUrls?.length > 0 ||\n selectedItem.screenshots?.length > 0\n \"\n >\n <h2 class=\"va-component-title\">Gallery</h2>\n <va-image-gallery\n [imageUrls]=\"\n selectedItem.screenshotUrls || selectedItem.screenshots\n \"\n ></va-image-gallery>\n </section>\n\n <section\n *ngIf=\"\n selectedItem.endUserMarketing?.files?.length > 0 ||\n selectedItem.files?.length > 0\n \"\n >\n <h2 class=\"va-component-title\">Files</h2>\n <app-store-files\n [files]=\"selectedItem.endUserMarketingFiles || selectedItem.files\"\n ></app-store-files>\n </section>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [":host{display:block;font-size:14px;line-height:1.4}:host *{box-sizing:border-box}.va-component-title{font-size:24px;font-weight:300;margin-top:0}@media screen and (min-width: 600px){.va-component-title{font-size:32px}}img{max-width:100%}va-icon{display:inline-block}.page{position:relative;margin:0 auto 20px;background:#ffffff;color:#212121;box-shadow:0 3px 10px rgba(33,33,33,.3);overflow:hidden;font-size:16px}.page .item-amount{color:#9e9e9e;font-size:14px;text-align:right;margin:0 24px 8px}section{padding:24px}.left-column{width:66%}@media screen and (max-width: 600px){.left-column{width:100%}}.right-column{width:34%}@media screen and (max-width: 600px){.right-column{width:100%}}.package-content{display:flex}@media screen and (max-width: 600px){.package-content{flex-direction:column}}\n"], components: [{ type: i1.VaHeaderContainerComponent, selector: "app-header-container", inputs: ["iconUrl", "title", "tagline", "prerequisite", "chipLabels", "pricing", "billedProduct", "loaded", "hasVerifiedContract", "pricingLabel", "primaryPricingActionLabel", "pricingActionLabel", "pricingActionEnabled", "actionEnabled", "actionLabel", "showAction", "showPricing", "showEnableAddon", "prerequisiteLabel"], outputs: ["prerequisiteSelected", "actionSelected", "primaryPricingActionSelected", "pricingActionSelected"] }, { type: i2.VaSellingInfoComponent, selector: "app-selling-info", inputs: ["description", "keySellingPoints"] }, { type: i3.VaProductsNavComponent, selector: "app-products-nav", inputs: ["items", "hideItemsNav"], outputs: ["itemSelected"] }, { type: i4.VaFaqsComponent, selector: "app-faqs", inputs: ["faqs"] }, { type: i5.VaImageGalleryComponent, selector: "va-image-gallery", inputs: ["imageUrls", "clickable"] }, { type: i6.VaFilesComponent, selector: "app-store-files", inputs: ["files"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i7.AsyncPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaPackageDetailsComponent, decorators: [{ type: Component, args: [{ selector: 'app-store-package-details', template: "<div *ngIf=\"pkg$ | async as pkg\" class=\"page\">\n <app-header-container\n [iconUrl]=\"pkg.icon\"\n [title]=\"pkg.name\"\n [tagline]=\"displayTagName$ | async\"\n [prerequisite]=\"productNameForSingleAddon$ | async\"\n [chipLabels]=\"lmiCategories$ | async\"\n [pricing]=\"pkg.pricing\"\n [pricingLabel]=\"'Pricing'\"\n [showAction]=\"showActionButton\"\n [showPricing]=\"showPricing\"\n [actionLabel]=\"actionLabel\"\n [actionEnabled]=\"true\"\n (actionSelected)=\"emitGetItNow()\"\n ></app-header-container>\n <ng-container *ngIf=\"pkg?.content\">\n <app-selling-info [description]=\"pkg.content\"></app-selling-info>\n </ng-container>\n\n <app-products-nav\n [items]=\"orderedItemsList$ | async\"\n [hideItemsNav]=\"pkg?.hide_product_icons_and_names\"\n (itemSelected)=\"selectItem($event)\"\n ></app-products-nav>\n\n <ng-container *ngIf=\"selectedItem$ | async as selectedItem\">\n <div *ngIf=\"!pkg?.hide_product_details\" class=\"package-content\">\n <div class=\"left-column\">\n <section\n *ngIf=\"\n selectedItem.endUserMarketing?.description ||\n selectedItem.endUserMarketing?.keySellingPoints ||\n selectedItem.description ||\n selectedItem.keySellingPoints\n \"\n >\n <app-selling-info\n [description]=\"\n selectedItem.endUserMarketing?.description ||\n selectedItem.description\n \"\n [keySellingPoints]=\"\n selectedItem.endUserMarketing?.keySellingPoints ||\n selectedItem.keySellingPoints\n \"\n ></app-selling-info>\n </section>\n\n <section\n *ngIf=\"\n (selectedItem.endUserMarketing?.faqs?.length > 0 &&\n selectedItem.endUserMarketing?.faqs[0].question) ||\n selectedItem.faqs?.length > 0\n \"\n >\n <h2 class=\"va-component-title\">FAQs</h2>\n <app-faqs\n [faqs]=\"selectedItem.endUserMarketing?.faqs || selectedItem.faqs\"\n ></app-faqs>\n </section>\n </div>\n\n <div class=\"right-column\">\n <section\n *ngIf=\"\n selectedItem.screenshotUrls?.length > 0 ||\n selectedItem.screenshots?.length > 0\n \"\n >\n <h2 class=\"va-component-title\">Gallery</h2>\n <va-image-gallery\n [imageUrls]=\"\n selectedItem.screenshotUrls || selectedItem.screenshots\n \"\n ></va-image-gallery>\n </section>\n\n <section\n *ngIf=\"\n selectedItem.endUserMarketing?.files?.length > 0 ||\n selectedItem.files?.length > 0\n \"\n >\n <h2 class=\"va-component-title\">Files</h2>\n <app-store-files\n [files]=\"selectedItem.endUserMarketingFiles || selectedItem.files\"\n ></app-store-files>\n </section>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [":host{display:block;font-size:14px;line-height:1.4}:host *{box-sizing:border-box}.va-component-title{font-size:24px;font-weight:300;margin-top:0}@media screen and (min-width: 600px){.va-component-title{font-size:32px}}img{max-width:100%}va-icon{display:inline-block}.page{position:relative;margin:0 auto 20px;background:#ffffff;color:#212121;box-shadow:0 3px 10px rgba(33,33,33,.3);overflow:hidden;font-size:16px}.page .item-amount{color:#9e9e9e;font-size:14px;text-align:right;margin:0 24px 8px}section{padding:24px}.left-column{width:66%}@media screen and (max-width: 600px){.left-column{width:100%}}.right-column{width:34%}@media screen and (max-width: 600px){.right-column{width:100%}}.package-content{display:flex}@media screen and (max-width: 600px){.package-content{flex-direction:column}}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { showActionButton: [{ type: Input }], showPricing: [{ type: Input }], actionLabel: [{ type: Input }], getItNow: [{ type: Output }], standAloneProducts: [{ type: Input }], products: [{ type: Input }], addons: [{ type: Input }], pkg: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wYWNrYWdlLWRldGFpbHMvcGFja2FnZS1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wYWNrYWdlLWRldGFpbHMvcGFja2FnZS1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssSUFBSSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7Ozs7Ozs7O0FBT2pELE1BQU0sT0FBTyx5QkFBeUI7SUFtRXBDO1FBbEVTLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixnQkFBVyxHQUFHLFlBQVksQ0FBQztRQUUxQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV4Qyx5QkFBb0IsR0FBK0IsSUFBSSxlQUFlLENBQVksRUFBRSxDQUFDLENBQUM7UUFDdEYsY0FBUyxHQUErQixJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQztRQUMzRSxZQUFPLEdBQTZCLElBQUksZUFB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Q0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEtBQTBCO1FBQzVELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLEVBQUU7WUFDNUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBVSxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFzREQsVUFBVSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7c0hBN0hVLHlCQUF5QjswR0FBekIseUJBQXlCLDRTQ2J0QywrL0ZBNEZBOzJGRC9FYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsMkJBQTJCOzBFQUs1QixnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBZ0JILGtCQUFrQjtzQkFEckIsS0FBSztnQkFNRixRQUFRO3NCQURYLEtBQUs7Z0JBTUYsTUFBTTtzQkFEVCxLQUFLO2dCQU1GLEdBQUc7c0JBRE4sS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1lcmdlIGFzIG9ic2VydmFibGVNZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGFja2FnZSB9IGZyb20gJy4vcGFja2FnZSc7XG5pbXBvcnQgeyBBZGRvbiB9IGZyb20gJ0B2ZW5kYXN0YS9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vc2hhcmVkL3Byb2R1Y3QnO1xuaW1wb3J0IHsgc2tpcFdoaWxlLCBzaGFyZVJlcGxheSwgbWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgb3JkZXJQcm9kdWN0c0FuZEFkZG9ucyB9IGZyb20gJy4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc3RvcmUtcGFja2FnZS1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICdwYWNrYWdlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWNrYWdlLWRldGFpbHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmFQYWNrYWdlRGV0YWlsc0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CdXR0b24gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93UHJpY2luZyA9IHRydWU7XG4gIEBJbnB1dCgpIGFjdGlvbkxhYmVsID0gJ0dldCBJdCBOb3cnO1xuXG4gIEBPdXRwdXQoKSBnZXRJdE5vdyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBzdGFuZEFsb25lUHJvZHVjdHMkJDogQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4oW10pO1xuICBwcm9kdWN0cyQ6IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+KFtdKTtcbiAgYWRkb25zJDogQmVoYXZpb3JTdWJqZWN0PEFkZG9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBZGRvbltdPihbXSk7XG4gIHBrZyQ6IFJlcGxheVN1YmplY3Q8UGFja2FnZT4gPSBuZXcgUmVwbGF5U3ViamVjdDxQYWNrYWdlPigxKTtcbiAgaXRlbVNlbGVjdGVkRXZlbnQkOiBSZXBsYXlTdWJqZWN0PG51bWJlcj4gPSBuZXcgUmVwbGF5U3ViamVjdDxudW1iZXI+KDEpO1xuXG4gIHNlbGVjdGVkSXRlbSQ6IE9ic2VydmFibGU8UHJvZHVjdCB8IEFkZG9uPjtcbiAgY29tYmluZWRJdGVtc0xpc3QkOiBPYnNlcnZhYmxlPChQcm9kdWN0IHwgQWRkb24pW10+O1xuICBvcmRlcmVkSXRlbXNMaXN0JDogT2JzZXJ2YWJsZTwoUHJvZHVjdCB8IEFkZG9uKVtdPjtcbiAgbG1pQ2F0ZWdvcmllcyQ6IE9ic2VydmFibGU8U2V0PHN0cmluZz4+O1xuICBwcm9kdWN0TmFtZUZvclNpbmdsZUFkZG9uJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBkaXNwbGF5VGFnTmFtZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoKVxuICBzZXQgc3RhbmRBbG9uZVByb2R1Y3RzKHN0YW5kQWxvbmVQcm9kdWN0czogUHJvZHVjdFtdKSB7XG4gICAgdGhpcy5zdGFuZEFsb25lUHJvZHVjdHMkJC5uZXh0KHN0YW5kQWxvbmVQcm9kdWN0cyk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcHJvZHVjdHMocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIHRoaXMucHJvZHVjdHMkLm5leHQocHJvZHVjdHMpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGFkZG9ucyhhZGRvbnM6IEFkZG9uW10pIHtcbiAgICB0aGlzLmFkZG9ucyQubmV4dChhZGRvbnMpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHBrZyhwa2c6IFBhY2thZ2UpIHtcbiAgICB0aGlzLnBrZyQubmV4dChwa2cpO1xuICB9XG5cbiAgc3RhdGljIGdldExtaUNhdGVnb3JpZXMocHJvZHVjdHM6IFByb2R1Y3RbXSk6IFNldDxzdHJpbmc+IHtcbiAgICBsZXQgbG1pQ2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAocHJvZHVjdHMpIHtcbiAgICAgIHByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3QpID0+IHtcbiAgICAgICAgbG1pQ2F0ZWdvcmllcyA9IGxtaUNhdGVnb3JpZXMuY29uY2F0KHByb2R1Y3QuZ2V0TG1pQ2F0ZWdvcnlOYW1lcygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNldChsbWlDYXRlZ29yaWVzKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXREaXNwbGF5VGFnbGluZShwa2c6IFBhY2thZ2UsIGl0ZW1zOiAoUHJvZHVjdCB8IEFkZG9uKVtdKTogc3RyaW5nIHtcbiAgICBpZiAocGtnICYmIHBrZy50YWdsaW5lKSB7XG4gICAgICByZXR1cm4gcGtnLnRhZ2xpbmU7XG4gICAgfSBlbHNlIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIFNpbmdsZSBwcm9kdWN0IC8gYWRkb24gcGFja2FnZS5cbiAgICAgIHJldHVybiBpdGVtc1swXS50YWdsaW5lIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJvZHVjdE5hbWVGb3JTaW5nbGVBZGRvbihpdGVtczogKFByb2R1Y3QgfCBBZGRvbilbXSk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA9PT0gMSAmJiBpdGVtc1swXSBpbnN0YW5jZW9mIEFkZG9uKSB7XG4gICAgICBjb25zdCBhZGRvbiA9IGl0ZW1zWzBdIGFzIEFkZG9uO1xuICAgICAgcmV0dXJuIGFkZG9uLnByb2R1Y3ROYW1lO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29tYmluZWRJdGVtc0xpc3QkID0gY29tYmluZUxhdGVzdCh0aGlzLnByb2R1Y3RzJCwgdGhpcy5hZGRvbnMkLCAocHJvZHVjdHM6IFByb2R1Y3RbXSwgYWRkb25zOiBBZGRvbltdKSA9PiB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KHByb2R1Y3RzIHx8IFtdKS5jb25jYXQoYWRkb25zIHx8IFtdKSBhcyAoUHJvZHVjdCB8IEFkZG9uKVtdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vcmRlcmVkSXRlbXNMaXN0JCA9IGNvbWJpbmVMYXRlc3QoXG4gICAgICB0aGlzLmNvbWJpbmVkSXRlbXNMaXN0JCxcbiAgICAgIHRoaXMucGtnJCxcbiAgICAgIChjb21iaW5lZDogKFByb2R1Y3QgfCBBZGRvbilbXSwgcGtnOiBQYWNrYWdlKSA9PiB7XG4gICAgICAgIHJldHVybiBvcmRlclByb2R1Y3RzQW5kQWRkb25zKGNvbWJpbmVkLCBwa2cgPyBwa2cucHJvZHVjdE9yZGVyIHx8IFtdIDogW10pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgbm9uRW1wdHlDb21iaW5lZEl0ZW1zTGlzdCA9IHRoaXMuY29tYmluZWRJdGVtc0xpc3QkLnBpcGUoXG4gICAgICBza2lwV2hpbGUoKGl0ZW1zKSA9PiAhaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgICAvLyBOZWVkIHRvIG1hcCB0byBhbiBpbmRleCBiZWNhdXNlIHRoYXQncyBob3cgcHJvZHVjdCBzZWxlY3Rpb24gd29ya3MuXG4gICAgY29uc3QgaW5pdGlhbFNlbGVjdGVkSXRlbSQgPSBub25FbXB0eUNvbWJpbmVkSXRlbXNMaXN0LnBpcGUoXG4gICAgICBtYXAoKF86IGFueSkgPT4gMCksXG4gICAgICB0YWtlKDEpLFxuICAgICk7XG5cbiAgICBjb25zdCBtZXJnZWRTZWxlY3Rpb24gPSBvYnNlcnZhYmxlTWVyZ2UoaW5pdGlhbFNlbGVjdGVkSXRlbSQsIHRoaXMuaXRlbVNlbGVjdGVkRXZlbnQkKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtJCA9IGNvbWJpbmVMYXRlc3QoW21lcmdlZFNlbGVjdGlvbiwgdGhpcy5vcmRlcmVkSXRlbXNMaXN0JF0pLnBpcGUoXG4gICAgICBtYXAoKFtpbmRleCwgaXRlbXNdKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtc1tpbmRleF07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5sbWlDYXRlZ29yaWVzJCA9IHRoaXMucHJvZHVjdHMkLnBpcGUoXG4gICAgICBza2lwV2hpbGUoKHByb2R1Y3RzKSA9PiAhcHJvZHVjdHMgfHwgcHJvZHVjdHMubGVuZ3RoID09PSAwKSxcbiAgICAgIG1hcCgocHJvZHVjdHMpID0+IHtcbiAgICAgICAgcmV0dXJuIFZhUGFja2FnZURldGFpbHNDb21wb25lbnQuZ2V0TG1pQ2F0ZWdvcmllcyhwcm9kdWN0cyk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5wcm9kdWN0TmFtZUZvclNpbmdsZUFkZG9uJCA9IG5vbkVtcHR5Q29tYmluZWRJdGVtc0xpc3QucGlwZShcbiAgICAgIG1hcCgoaXRlbXMpID0+IHtcbiAgICAgICAgcmV0dXJuIFZhUGFja2FnZURldGFpbHNDb21wb25lbnQuZ2V0UHJvZHVjdE5hbWVGb3JTaW5nbGVBZGRvbihpdGVtcyk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5kaXNwbGF5VGFnTmFtZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnBrZyQsIHRoaXMuY29tYmluZWRJdGVtc0xpc3QkXSkucGlwZShcbiAgICAgIG1hcCgoW3BrZywgaXRlbXNdKSA9PiB7XG4gICAgICAgIHJldHVybiBWYVBhY2thZ2VEZXRhaWxzQ29tcG9uZW50LmdldERpc3BsYXlUYWdsaW5lKHBrZywgaXRlbXMpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHNlbGVjdEl0ZW0oaTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtU2VsZWN0ZWRFdmVudCQubmV4dChpKTtcbiAgfVxuXG4gIGVtaXRHZXRJdE5vdygpOiB2b2lkIHtcbiAgICB0aGlzLmdldEl0Tm93LmVtaXQoKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cInBrZyQgfCBhc3luYyBhcyBwa2dcIiBjbGFzcz1cInBhZ2VcIj5cbiAgPGFwcC1oZWFkZXItY29udGFpbmVyXG4gICAgW2ljb25VcmxdPVwicGtnLmljb25cIlxuICAgIFt0aXRsZV09XCJwa2cubmFtZVwiXG4gICAgW3RhZ2xpbmVdPVwiZGlzcGxheVRhZ05hbWUkIHwgYXN5bmNcIlxuICAgIFtwcmVyZXF1aXNpdGVdPVwicHJvZHVjdE5hbWVGb3JTaW5nbGVBZGRvbiQgfCBhc3luY1wiXG4gICAgW2NoaXBMYWJlbHNdPVwibG1pQ2F0ZWdvcmllcyQgfCBhc3luY1wiXG4gICAgW3ByaWNpbmddPVwicGtnLnByaWNpbmdcIlxuICAgIFtwcmljaW5nTGFiZWxdPVwiJ1ByaWNpbmcnXCJcbiAgICBbc2hvd0FjdGlvbl09XCJzaG93QWN0aW9uQnV0dG9uXCJcbiAgICBbc2hvd1ByaWNpbmddPVwic2hvd1ByaWNpbmdcIlxuICAgIFthY3Rpb25MYWJlbF09XCJhY3Rpb25MYWJlbFwiXG4gICAgW2FjdGlvbkVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgKGFjdGlvblNlbGVjdGVkKT1cImVtaXRHZXRJdE5vdygpXCJcbiAgPjwvYXBwLWhlYWRlci1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwa2c/LmNvbnRlbnRcIj5cbiAgICA8YXBwLXNlbGxpbmctaW5mbyBbZGVzY3JpcHRpb25dPVwicGtnLmNvbnRlbnRcIj48L2FwcC1zZWxsaW5nLWluZm8+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxhcHAtcHJvZHVjdHMtbmF2XG4gICAgW2l0ZW1zXT1cIm9yZGVyZWRJdGVtc0xpc3QkIHwgYXN5bmNcIlxuICAgIFtoaWRlSXRlbXNOYXZdPVwicGtnPy5oaWRlX3Byb2R1Y3RfaWNvbnNfYW5kX25hbWVzXCJcbiAgICAoaXRlbVNlbGVjdGVkKT1cInNlbGVjdEl0ZW0oJGV2ZW50KVwiXG4gID48L2FwcC1wcm9kdWN0cy1uYXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkSXRlbSQgfCBhc3luYyBhcyBzZWxlY3RlZEl0ZW1cIj5cbiAgICA8ZGl2ICpuZ0lmPVwiIXBrZz8uaGlkZV9wcm9kdWN0X2RldGFpbHNcIiBjbGFzcz1cInBhY2thZ2UtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxlZnQtY29sdW1uXCI+XG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5lbmRVc2VyTWFya2V0aW5nPy5kZXNjcmlwdGlvbiB8fFxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtLmVuZFVzZXJNYXJrZXRpbmc/LmtleVNlbGxpbmdQb2ludHMgfHxcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5kZXNjcmlwdGlvbiB8fFxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtLmtleVNlbGxpbmdQb2ludHNcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGFwcC1zZWxsaW5nLWluZm9cbiAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtLmVuZFVzZXJNYXJrZXRpbmc/LmRlc2NyaXB0aW9uIHx8XG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5kZXNjcmlwdGlvblxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtrZXlTZWxsaW5nUG9pbnRzXT1cIlxuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0uZW5kVXNlck1hcmtldGluZz8ua2V5U2VsbGluZ1BvaW50cyB8fFxuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0ua2V5U2VsbGluZ1BvaW50c1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9hcHAtc2VsbGluZy1pbmZvPlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHNlbGVjdGVkSXRlbS5lbmRVc2VyTWFya2V0aW5nPy5mYXFzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5lbmRVc2VyTWFya2V0aW5nPy5mYXFzWzBdLnF1ZXN0aW9uKSB8fFxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtLmZhcXM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGgyIGNsYXNzPVwidmEtY29tcG9uZW50LXRpdGxlXCI+RkFRczwvaDI+XG4gICAgICAgICAgPGFwcC1mYXFzXG4gICAgICAgICAgICBbZmFxc109XCJzZWxlY3RlZEl0ZW0uZW5kVXNlck1hcmtldGluZz8uZmFxcyB8fCBzZWxlY3RlZEl0ZW0uZmFxc1wiXG4gICAgICAgICAgPjwvYXBwLWZhcXM+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29sdW1uXCI+XG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5zY3JlZW5zaG90VXJscz8ubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtLnNjcmVlbnNob3RzPy5sZW5ndGggPiAwXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC10aXRsZVwiPkdhbGxlcnk8L2gyPlxuICAgICAgICAgIDx2YS1pbWFnZS1nYWxsZXJ5XG4gICAgICAgICAgICBbaW1hZ2VVcmxzXT1cIlxuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0uc2NyZWVuc2hvdFVybHMgfHwgc2VsZWN0ZWRJdGVtLnNjcmVlbnNob3RzXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L3ZhLWltYWdlLWdhbGxlcnk+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW0uZW5kVXNlck1hcmtldGluZz8uZmlsZXM/Lmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5maWxlcz8ubGVuZ3RoID4gMFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aDIgY2xhc3M9XCJ2YS1jb21wb25lbnQtdGl0bGVcIj5GaWxlczwvaDI+XG4gICAgICAgICAgPGFwcC1zdG9yZS1maWxlc1xuICAgICAgICAgICAgW2ZpbGVzXT1cInNlbGVjdGVkSXRlbS5lbmRVc2VyTWFya2V0aW5nRmlsZXMgfHwgc2VsZWN0ZWRJdGVtLmZpbGVzXCJcbiAgICAgICAgICA+PC9hcHAtc3RvcmUtZmlsZXM+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19