@vendasta/store
Version:
Components and data for Store
231 lines • 30.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { trigger, transition, animate, style, state } from '@angular/animations';
import { BehaviorSubject, ReplaySubject, combineLatest, zip } from 'rxjs';
import { filter, map, startWith } from 'rxjs/operators';
import { buildSalesPackages, buildSalesProductFromProduct, addStatusesToSalesPackages, addStatusesToSalesProduct, } from './sales-package';
import { ListIndent } from './package-dropdown-item/package-dropdown-item.component';
export class VaPackageDropdownComponent {
constructor() {
this.singularDropdown = false;
this.packageProductIndent = ListIndent.INDENT_ONE;
this.packageAddonWithoutProductIndent = ListIndent.INDENT_ONE;
this.packageAddonWithProductIndent = ListIndent.INDENT_TWO;
this.productAddonIndent = ListIndent.INDENT_ONE;
this.packages$$ = new ReplaySubject(1);
this.products$$ = new ReplaySubject(1);
this.standAloneProducts$$ = new ReplaySubject(1);
this.statuses$$ = new BehaviorSubject([]);
this.addons$$ = new ReplaySubject(1);
this.packageToggles = [];
this.productToggles = [];
}
// packages in dropdown
/**
* @param {?} packages
* @return {?}
*/
set packages(packages) {
this.packages$$.next(packages);
}
// products within given packages
/**
* @param {?} products
* @return {?}
*/
set products(products) {
this.products$$.next(products);
}
// products not associated with a package
/**
* @param {?} standAloneProducts
* @return {?}
*/
set standAloneProducts(standAloneProducts) {
this.standAloneProducts$$.next(standAloneProducts);
}
// statuses for all products and addons
/**
* @param {?} statuses
* @return {?}
*/
set statuses(statuses) {
this.statuses$$.next(statuses);
}
// addons within given packages
/**
* @param {?} addons
* @return {?}
*/
set addons(addons) {
this.addons$$.next(addons);
}
/**
* @return {?}
*/
ngOnInit() {
/** @type {?} */
const packages$ = this.packages$$.pipe(filter(packages => packages !== null));
/** @type {?} */
const products$ = this.products$$.pipe(filter(products => products !== null));
/** @type {?} */
const addons$ = this.addons$$.pipe(filter(addons => addons !== null));
/** @type {?} */
const salesPackage$ = zip(packages$, products$, addons$).pipe(map(([packages, products, addons]) => buildSalesPackages(packages, products, addons)));
this.salesPackages$ = combineLatest(salesPackage$, this.statuses$$).pipe(map(([salesPackages, statuses]) => addStatusesToSalesPackages(salesPackages, statuses)), startWith([]));
this.salesProducts$ = combineLatest(this.standAloneProducts$$, this.statuses$$).pipe(filter(([products, _]) => products !== null), map(([products, statuses]) => {
return products.map(p => {
/** @type {?} */
const addons = p.addons || null;
/** @type {?} */
const salesProducts = buildSalesProductFromProduct(p, addons);
return addStatusesToSalesProduct(salesProducts, statuses);
});
}), startWith([]));
this.templateData$ = combineLatest(this.salesPackages$, this.salesProducts$).pipe(map(([packages, products]) => ({ packages: packages, products: products })));
}
/**
* @param {?} indexToToggle
* @return {?}
*/
togglePackage(indexToToggle) {
if (this.singularDropdown) {
/** @type {?} */
const openedIndex = this.packageToggles.findIndex(value => value === true);
if (openedIndex !== indexToToggle) {
this.packageToggles[openedIndex] = false;
}
/** @type {?} */
const productOpenedIndex = this.productToggles.findIndex(value => value === true);
if (productOpenedIndex > -1) {
this.productToggles[productOpenedIndex] = false;
}
}
this.packageToggles[indexToToggle] = !this.packageToggles[indexToToggle];
}
/**
* @param {?} indexToToggle
* @return {?}
*/
toggleProduct(indexToToggle) {
if (this.singularDropdown) {
/** @type {?} */
const openedIndex = this.productToggles.findIndex(value => value === true);
if (openedIndex !== indexToToggle) {
this.productToggles[openedIndex] = false;
}
/** @type {?} */
const packageOpenedIndex = this.packageToggles.findIndex(value => value === true);
if (packageOpenedIndex > -1) {
this.packageToggles[packageOpenedIndex] = false;
}
}
this.productToggles[indexToToggle] = !this.productToggles[indexToToggle];
}
/**
* @param {?} product
* @return {?}
*/
formatProductEditionName(product) {
return product.editionName ? `${product.name} ${product.editionName}` : product.name;
}
/**
* @param {?} product
* @return {?}
*/
standAloneProductDescription(product) {
if (product.addons && product.addons.length > 0) {
/** @type {?} */
let description = `Contains ${product.addons.length}`;
description = product.addons.length === 1 ? `${description} Addon` : `${description} Addons`;
return description;
}
return '';
}
/**
* @param {?} pkg
* @return {?}
*/
packageDescription(pkg) {
/** @type {?} */
const hasProducts = pkg.products && pkg.products.length > 0;
if (!hasProducts && pkg.totalAddons === 0) {
return 'No Items in Package';
}
/** @type {?} */
let description = '';
/** @type {?} */
const hasOneProduct = pkg.products && pkg.products.length === 1;
if (hasProducts || pkg.totalAddons > 0) {
description = 'Contains ';
}
if (hasProducts) {
description = `${description} ${pkg.products.length}`;
description = hasOneProduct ? `${description} Product` : `${description} Products`;
}
if (hasProducts && pkg.totalAddons > 0) {
description = `${description} & ${pkg.totalAddons}`;
description = pkg.totalAddons === 1 ? `${description} Addon` : `${description} Addons`;
}
return description;
}
}
VaPackageDropdownComponent.decorators = [
{ type: Component, args: [{
selector: 'va-package-dropdown',
animations: [
trigger('listAnimationStart', [
state('void', style({ height: '0px' })),
state('*', style({ height: '*' })),
transition('void => *', [animate('0.25s ease')]),
transition('* => void', [animate('0.25s ease')])
])
],
template: "<ng-container *ngIf=\"templateData$ | async as data\">\n <mat-card class=\"package-list-container\" *ngIf=\"data.products?.length > 0 || data.packages?.length > 0 else loading\">\n <mat-list>\n <div class=\"package-list\" *ngFor=\"let package of data.packages; let packageIndex = index\">\n\n <va-package-dropdown-item\n [title]=\"package.name\"\n [iconUrl]=\"package.icon\"\n [subtitle]=\"package.formattedPrices\"\n [statusItem]=\"package.activationStatus\"\n [description]=\"packageDescription(package)\"\n [enableDropdown]=\"package.products?.length > 0 || package.addonsWithNoParent?.length > 0\"\n [toggleValue]=\"packageToggles[packageIndex]\"\n (itemToggled)=\"togglePackage(packageIndex)\"\n ></va-package-dropdown-item>\n\n <mat-list class=\"product-or-addon-list package-dropdown-font\" *ngIf=\"packageToggles[packageIndex]\"\n [@listAnimationStart]>\n <div *ngFor=\"let product of package.products\">\n <va-package-dropdown-item\n [title]=\"product.name\"\n [subtitle]=\"product.tagline\"\n [iconUrl]=\"product.icon\"\n [statusItem]=\"product.activationStatus\"\n [indent]=\"packageProductIndent\"\n ></va-package-dropdown-item>\n\n <va-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithProductIndent\"\n ></va-package-dropdown-item>\n </div>\n\n <va-package-dropdown-item\n *ngFor=\"let addon of package.addonsWithNoParent\"\n [title]=\"addon.name\"\n titleDescriptor=\"(Requires {{ addon.parentName || ''}})\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [secondaryIconUrl]=\"addon.parentIcon\"\n [secondaryIconName]=\"addon.parentName\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithoutProductIndent\"\n ></va-package-dropdown-item>\n </mat-list>\n </div>\n\n <div class=\"product-list\" *ngFor=\"let product of data.products; let productIndex = index\">\n <va-package-dropdown-item\n [title]=\"formatProductEditionName(product)\"\n [iconUrl]=\"product.icon\"\n [subtitle]=\"product.formattedPrices\"\n [statusItem]=\"product.activationStatus\"\n [description]=\"standAloneProductDescription(product)\"\n [enableDropdown]=\"product.addons?.length > 0\"\n [toggleValue]=\"productToggles[productIndex]\"\n (itemToggled)=\"toggleProduct(productIndex)\"\n ></va-package-dropdown-item>\n\n <mat-list class=\"product-or-addon-list product-dropdown-font\" *ngIf=\"productToggles[productIndex]\"\n [@listAnimationStart]>\n <va-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"productAddonIndent\"\n ></va-package-dropdown-item>\n </mat-list>\n </div>\n\n </mat-list>\n </mat-card>\n</ng-container>\n\n<ng-template #loading>\n <mat-card>\n <div class=\"package-dropdown-stencil-display\">\n <va-icon [iconUrl]=\"\"></va-icon>\n <div class=\"stencil-text\">\n <h1 class=\"stencil-title stencil-shimmer\"></h1>\n <span class=\"stencil-tagline stencil-shimmer\"></span>\n </div>\n </div>\n </mat-card>\n</ng-template>\n",
styles: [".package-dropdown-font,.product-dropdown-font{color:rgba(0,0,0,.54);font-size:14px;font-weight:400}.package-list-container{border-top:1px solid rgba(0,0,0,.12);padding:0}.package-list-container mat-list{padding:0}.package-dropdown-stencil-display{display:flex;width:100%;flex-grow:1}.package-dropdown-stencil-display va-icon{margin-right:20px}.package-dropdown-stencil-display .stencil-text{width:inherit;display:flex;flex-direction:column;justify-content:center}.package-dropdown-stencil-display .stencil-text .stencil-title{height:32px;width:40%;margin-bottom:5px!important;margin-top:0!important}.package-dropdown-stencil-display .stencil-text .stencil-tagline{height:32px;width:inherit}.product-or-addon-list{background-color:rgba(0,0,0,.04);overflow:hidden}"]
}] }
];
VaPackageDropdownComponent.propDecorators = {
packages: [{ type: Input }],
products: [{ type: Input }],
standAloneProducts: [{ type: Input }],
statuses: [{ type: Input }],
addons: [{ type: Input }],
singularDropdown: [{ type: Input }]
};
if (false) {
/** @type {?} */
VaPackageDropdownComponent.prototype.singularDropdown;
/** @type {?} */
VaPackageDropdownComponent.prototype.packageProductIndent;
/** @type {?} */
VaPackageDropdownComponent.prototype.packageAddonWithoutProductIndent;
/** @type {?} */
VaPackageDropdownComponent.prototype.packageAddonWithProductIndent;
/** @type {?} */
VaPackageDropdownComponent.prototype.productAddonIndent;
/** @type {?} */
VaPackageDropdownComponent.prototype.packages$$;
/** @type {?} */
VaPackageDropdownComponent.prototype.products$$;
/** @type {?} */
VaPackageDropdownComponent.prototype.standAloneProducts$$;
/** @type {?} */
VaPackageDropdownComponent.prototype.statuses$$;
/** @type {?} */
VaPackageDropdownComponent.prototype.addons$$;
/** @type {?} */
VaPackageDropdownComponent.prototype.templateData$;
/** @type {?} */
VaPackageDropdownComponent.prototype.salesPackages$;
/** @type {?} */
VaPackageDropdownComponent.prototype.salesProducts$;
/** @type {?} */
VaPackageDropdownComponent.prototype.packageToggles;
/** @type {?} */
VaPackageDropdownComponent.prototype.productToggles;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1kcm9wZG93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdmVuZGFzdGEvc3RvcmUvIiwic291cmNlcyI6WyJsaWIvcGFja2FnZS1kcm9wZG93bi9wYWNrYWdlLWRyb3Bkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRixPQUFPLEVBQWMsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3hELE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsNEJBQTRCLEVBQzVCLDBCQUEwQixFQUMxQix5QkFBeUIsR0FFMUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seURBQXlELENBQUM7QUFlckYsTUFBTSxPQUFPLDBCQUEwQjtJQWJ2QztRQXVDVyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFFbEMseUJBQW9CLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUM3QyxxQ0FBZ0MsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3pELGtDQUE2QixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUUzQyxlQUFVLEdBQTZCLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELGVBQVUsR0FBNkIsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQseUJBQW9CLEdBQTZCLElB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LE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzt3QkFDdkMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzt3QkFDbEMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7cUJBQ2pELENBQUM7aUJBQ0g7Z0JBQ0QsMHpIQUE4Qzs7YUFFL0M7Ozt1QkFHRSxLQUFLO3VCQUtMLEtBQUs7aUNBS0wsS0FBSzt1QkFLTCxLQUFLO3FCQUtMLEtBQUs7K0JBSUwsS0FBSzs7OztJQUFOLHNEQUFrQzs7SUFFbEMsMERBQTZDOztJQUM3QyxzRUFBeUQ7O0lBQ3pELG1FQUFzRDs7SUFDdEQsd0RBQTJDOztJQUUzQyxnREFBNEQ7O0lBQzVELGdEQUE0RDs7SUFDNUQsMERBQXNFOztJQUN0RSxnREFBcUY7O0lBQ3JGLDhDQUF3RDs7SUFFeEQsbURBQWdGOztJQUNoRixvREFBMkM7O0lBQzNDLG9EQUEyQzs7SUFDM0Msb0RBQStCOztJQUMvQixvREFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIGFuaW1hdGUsIHN0eWxlLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCB6aXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFkZG9uIH0gZnJvbSAnQHZlbmRhc3RhL2NvcmUvbWFya2V0cGxhY2UtcGFja2FnZXMnO1xuaW1wb3J0IHtcbiAgU2FsZXNQYWNrYWdlLFxuICBTYWxlc1Byb2R1Y3QsXG4gIGJ1aWxkU2FsZXNQYWNrYWdlcyxcbiAgYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdCxcbiAgYWRkU3RhdHVzZXNUb1NhbGVzUGFja2FnZXMsXG4gIGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QsXG4gIFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1cyxcbn0gZnJvbSAnLi9zYWxlcy1wYWNrYWdlJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi9zaGFyZWQvcHJvZHVjdCc7XG5pbXBvcnQgeyBQYWNrYWdlIH0gZnJvbSAnLi4vcGFja2FnZS1kZXRhaWxzL3BhY2thZ2UnO1xuaW1wb3J0IHsgTGlzdEluZGVudCB9IGZyb20gJy4vcGFja2FnZS1kcm9wZG93bi1pdGVtL3BhY2thZ2UtZHJvcGRvd24taXRlbS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YS1wYWNrYWdlLWRyb3Bkb3duJyxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2xpc3RBbmltYXRpb25TdGFydCcsIFtcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnIH0pKSxcbiAgICAgIHN0YXRlKCcqJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSksXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSlcbiAgICBdKVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJ3BhY2thZ2UtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWNrYWdlLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVmFQYWNrYWdlRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyBwYWNrYWdlcyBpbiBkcm9wZG93blxuICBASW5wdXQoKVxuICBzZXQgcGFja2FnZXMocGFja2FnZXM6IFBhY2thZ2VbXSkge1xuICAgIHRoaXMucGFja2FnZXMkJC5uZXh0KHBhY2thZ2VzKTtcbiAgfVxuICAvLyBwcm9kdWN0cyB3aXRoaW4gZ2l2ZW4gcGFja2FnZXNcbiAgQElucHV0KClcbiAgc2V0IHByb2R1Y3RzKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICB0aGlzLnByb2R1Y3RzJCQubmV4dChwcm9kdWN0cyk7XG4gIH1cbiAgLy8gcHJvZHVjdHMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHBhY2thZ2VcbiAgQElucHV0KClcbiAgc2V0IHN0YW5kQWxvbmVQcm9kdWN0cyhzdGFuZEFsb25lUHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIHRoaXMuc3RhbmRBbG9uZVByb2R1Y3RzJCQubmV4dChzdGFuZEFsb25lUHJvZHVjdHMpO1xuICB9XG4gIC8vIHN0YXR1c2VzIGZvciBhbGwgcHJvZHVjdHMgYW5kIGFkZG9uc1xuICBASW5wdXQoKVxuICBzZXQgc3RhdHVzZXMoc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKSB7XG4gICAgdGhpcy5zdGF0dXNlcyQkLm5leHQoc3RhdHVzZXMpO1xuICB9XG4gIC8vIGFkZG9ucyB3aXRoaW4gZ2l2ZW4gcGFja2FnZXNcbiAgQElucHV0KClcbiAgc2V0IGFkZG9ucyhhZGRvbnM6IEFkZG9uW10pIHtcbiAgICB0aGlzLmFkZG9ucyQkLm5leHQoYWRkb25zKTtcbiAgfVxuICBASW5wdXQoKSBzaW5ndWxhckRyb3Bkb3duID0gZmFsc2U7XG5cbiAgcGFja2FnZVByb2R1Y3RJbmRlbnQgPSBMaXN0SW5kZW50LklOREVOVF9PTkU7XG4gIHBhY2thZ2VBZGRvbldpdGhvdXRQcm9kdWN0SW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuICBwYWNrYWdlQWRkb25XaXRoUHJvZHVjdEluZGVudCA9IExpc3RJbmRlbnQuSU5ERU5UX1RXTztcbiAgcHJvZHVjdEFkZG9uSW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuXG4gIHBhY2thZ2VzJCQ6IFJlcGxheVN1YmplY3Q8UGFja2FnZVtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBwcm9kdWN0cyQkOiBSZXBsYXlTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgc3RhbmRBbG9uZVByb2R1Y3RzJCQ6IFJlcGxheVN1YmplY3Q8UHJvZHVjdFtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBzdGF0dXNlcyQkOiBCZWhhdmlvclN1YmplY3Q8UGFja2FnZUl0ZW1BY3RpdmF0aW9uU3RhdHVzW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIGFkZG9ucyQkOiBSZXBsYXlTdWJqZWN0PEFkZG9uW10+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgdGVtcGxhdGVEYXRhJDogT2JzZXJ2YWJsZTx7cGFja2FnZXM6IFNhbGVzUGFja2FnZVtdOyBwcm9kdWN0czogU2FsZXNQcm9kdWN0W119PjtcbiAgc2FsZXNQYWNrYWdlcyQ6IE9ic2VydmFibGU8U2FsZXNQYWNrYWdlW10+O1xuICBzYWxlc1Byb2R1Y3RzJDogT2JzZXJ2YWJsZTxTYWxlc1Byb2R1Y3RbXT47XG4gIHBhY2thZ2VUb2dnbGVzOiBib29sZWFuW10gPSBbXTtcbiAgcHJvZHVjdFRvZ2dsZXM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhY2thZ2VzJDogT2JzZXJ2YWJsZTxQYWNrYWdlW10+ID0gdGhpcy5wYWNrYWdlcyQkLnBpcGUoZmlsdGVyKHBhY2thZ2VzID0+IHBhY2thZ2VzICE9PSBudWxsKSk7XG4gICAgY29uc3QgcHJvZHVjdHMkOiBPYnNlcnZhYmxlPFByb2R1Y3RbXT4gPSB0aGlzLnByb2R1Y3RzJCQucGlwZShmaWx0ZXIocHJvZHVjdHMgPT4gcHJvZHVjdHMgIT09IG51bGwpKTtcbiAgICBjb25zdCBhZGRvbnMkOiBPYnNlcnZhYmxlPEFkZG9uW10+ID0gdGhpcy5hZGRvbnMkJC5waXBlKGZpbHRlcihhZGRvbnMgPT4gYWRkb25zICE9PSBudWxsKSk7XG5cbiAgICBjb25zdCBzYWxlc1BhY2thZ2UkID0gemlwKHBhY2thZ2VzJCwgcHJvZHVjdHMkLCBhZGRvbnMkKS5waXBlKFxuICAgICAgbWFwKChbcGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnNdKSA9PiBidWlsZFNhbGVzUGFja2FnZXMocGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnMpKSxcbiAgICApO1xuXG4gICAgdGhpcy5zYWxlc1BhY2thZ2VzJCA9IGNvbWJpbmVMYXRlc3Qoc2FsZXNQYWNrYWdlJCwgdGhpcy5zdGF0dXNlcyQkKS5waXBlKFxuICAgICAgbWFwKChbc2FsZXNQYWNrYWdlcywgc3RhdHVzZXNdKSA9PiBhZGRTdGF0dXNlc1RvU2FsZXNQYWNrYWdlcyhzYWxlc1BhY2thZ2VzLCBzdGF0dXNlcykpLFxuICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICApO1xuXG4gICAgdGhpcy5zYWxlc1Byb2R1Y3RzJCA9IGNvbWJpbmVMYXRlc3QodGhpcy5zdGFuZEFsb25lUHJvZHVjdHMkJCwgdGhpcy5zdGF0dXNlcyQkKS5waXBlKFxuICAgICAgZmlsdGVyKChbcHJvZHVjdHMsIF9dKSA9PiBwcm9kdWN0cyAhPT0gbnVsbCksXG4gICAgICBtYXAoKFtwcm9kdWN0cywgc3RhdHVzZXNdOiBbUHJvZHVjdFtdLCBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXNbXV0pOiBTYWxlc1Byb2R1Y3RbXSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9kdWN0cy5tYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgYWRkb25zID0gcC5hZGRvbnMgfHwgbnVsbDtcbiAgICAgICAgICBjb25zdCBzYWxlc1Byb2R1Y3RzID0gYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdChwLCBhZGRvbnMpO1xuICAgICAgICAgIHJldHVybiBhZGRTdGF0dXNlc1RvU2FsZXNQcm9kdWN0KHNhbGVzUHJvZHVjdHMsIHN0YXR1c2VzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgKTtcbiAgICB0aGlzLnRlbXBsYXRlRGF0YSQgPSBjb21iaW5lTGF0ZXN0KHRoaXMuc2FsZXNQYWNrYWdlcyQsIHRoaXMuc2FsZXNQcm9kdWN0cyQpLnBpcGUoXG4gICAgICBtYXAoKFtwYWNrYWdlcywgcHJvZHVjdHNdKSA9PiAoe3BhY2thZ2VzOiBwYWNrYWdlcywgcHJvZHVjdHM6IHByb2R1Y3RzfSkpXG4gICAgKVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZVBhY2thZ2UoaW5kZXhUb1RvZ2dsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2luZ3VsYXJEcm9wZG93bikge1xuICAgICAgY29uc3Qgb3BlbmVkSW5kZXggPSB0aGlzLnBhY2thZ2VUb2dnbGVzLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICBpZiAob3BlbmVkSW5kZXggIT09IGluZGV4VG9Ub2dnbGUpIHtcbiAgICAgICAgdGhpcy5wYWNrYWdlVG9nZ2xlc1tvcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb2R1Y3RPcGVuZWRJbmRleCA9IHRoaXMucHJvZHVjdFRvZ2dsZXMuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSB0cnVlKTtcbiAgICAgIGlmIChwcm9kdWN0T3BlbmVkSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnByb2R1Y3RUb2dnbGVzW3Byb2R1Y3RPcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wYWNrYWdlVG9nZ2xlc1tpbmRleFRvVG9nZ2xlXSA9ICF0aGlzLnBhY2thZ2VUb2dnbGVzW2luZGV4VG9Ub2dnbGVdO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVByb2R1Y3QoaW5kZXhUb1RvZ2dsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2luZ3VsYXJEcm9wZG93bikge1xuICAgICAgY29uc3Qgb3BlbmVkSW5kZXggPSB0aGlzLnByb2R1Y3RUb2dnbGVzLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICBpZiAob3BlbmVkSW5kZXggIT09IGluZGV4VG9Ub2dnbGUpIHtcbiAgICAgICAgdGhpcy5wcm9kdWN0VG9nZ2xlc1tvcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VPcGVuZWRJbmRleCA9IHRoaXMucGFja2FnZVRvZ2dsZXMuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSB0cnVlKTtcbiAgICAgIGlmIChwYWNrYWdlT3BlbmVkSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnBhY2thZ2VUb2dnbGVzW3BhY2thZ2VPcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wcm9kdWN0VG9nZ2xlc1tpbmRleFRvVG9nZ2xlXSA9ICF0aGlzLnByb2R1Y3RUb2dnbGVzW2luZGV4VG9Ub2dnbGVdO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdFByb2R1Y3RFZGl0aW9uTmFtZShwcm9kdWN0OiBTYWxlc1Byb2R1Y3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9kdWN0LmVkaXRpb25OYW1lID8gYCR7cHJvZHVjdC5uYW1lfSAke3Byb2R1Y3QuZWRpdGlvbk5hbWV9YCA6IHByb2R1Y3QubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFuZEFsb25lUHJvZHVjdERlc2NyaXB0aW9uKHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCk6IHN0cmluZyB7XG4gICAgaWYgKHByb2R1Y3QuYWRkb25zICYmIHByb2R1Y3QuYWRkb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBkZXNjcmlwdGlvbiA9IGBDb250YWlucyAke3Byb2R1Y3QuYWRkb25zLmxlbmd0aH1gO1xuICAgICAgZGVzY3JpcHRpb24gPSBwcm9kdWN0LmFkZG9ucy5sZW5ndGggPT09IDEgPyBgJHtkZXNjcmlwdGlvbn0gQWRkb25gIDogYCR7ZGVzY3JpcHRpb259IEFkZG9uc2A7XG4gICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBwYWNrYWdlRGVzY3JpcHRpb24ocGtnOiBTYWxlc1BhY2thZ2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc1Byb2R1Y3RzID0gcGtnLnByb2R1Y3RzICYmIHBrZy5wcm9kdWN0cy5sZW5ndGggPiAwO1xuICAgIGlmICghaGFzUHJvZHVjdHMgJiYgcGtnLnRvdGFsQWRkb25zID09PSAwKSB7XG4gICAgICByZXR1cm4gJ05vIEl0ZW1zIGluIFBhY2thZ2UnO1xuICAgIH1cblxuICAgIGxldCBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGNvbnN0IGhhc09uZVByb2R1Y3QgPSBwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLmxlbmd0aCA9PT0gMTtcbiAgICBpZiAoaGFzUHJvZHVjdHMgfHwgcGtnLnRvdGFsQWRkb25zID4gMCkge1xuICAgICAgZGVzY3JpcHRpb24gPSAnQ29udGFpbnMgJztcbiAgICB9XG4gICAgaWYgKGhhc1Byb2R1Y3RzKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IGAke2Rlc2NyaXB0aW9ufSAke3BrZy5wcm9kdWN0cy5sZW5ndGh9YDtcbiAgICAgIGRlc2NyaXB0aW9uID0gaGFzT25lUHJvZHVjdCA/IGAke2Rlc2NyaXB0aW9ufSBQcm9kdWN0YCA6IGAke2Rlc2NyaXB0aW9ufSBQcm9kdWN0c2A7XG4gICAgfVxuICAgIGlmIChoYXNQcm9kdWN0cyAmJiBwa2cudG90YWxBZGRvbnMgPiAwKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IGAke2Rlc2NyaXB0aW9ufSAmICR7cGtnLnRvdGFsQWRkb25zfWA7XG4gICAgICBkZXNjcmlwdGlvbiA9IHBrZy50b3RhbEFkZG9ucyA9PT0gMSA/IGAke2Rlc2NyaXB0aW9ufSBBZGRvbmAgOiBgJHtkZXNjcmlwdGlvbn0gQWRkb25zYDtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICB9XG59XG4iXX0=