UNPKG

@vendasta/store

Version:

Components and data for Store

125 lines 22.5 kB
import { Component, EventEmitter, Input, Output, ChangeDetectorRef } from '@angular/core'; import { isNullOrUndefined } from 'util'; import { BillingService, buildBilledProductFromProductPricingAndAddon } from '@vendasta/billing'; import * as i0 from "@angular/core"; import * as i1 from "@vendasta/billing"; import * as i2 from "@angular/material/list"; import * as i3 from "@angular/material/divider"; import * as i4 from "@angular/material/icon"; import * as i5 from "../pricing/pricing.component"; import * as i6 from "@angular/common"; import * as i7 from "@angular/material/core"; export class VaAddonListComponent { constructor(billingService, cdr) { this.billingService = billingService; this.cdr = cdr; this.showPricing = true; this._hasVerifiedContract = null; this._canAccessContractPricing = null; this.addonSelected = new EventEmitter(); this.billedProductsMap = new Map(); this.billedProductLoaded = new Map(); this.subscriptions = []; } set addons(addons) { this._addons = addons; this.populateBilledProduct(); } set hasVerifiedContract(value) { this._hasVerifiedContract = value; this.populateBilledProduct(); } set canAccessContractPricing(value) { this._canAccessContractPricing = value; this.populateBilledProduct(); } ngOnInit() { this.populateBilledProduct(); } populateBilledProduct() { if (this.displayContractPricing() && this.partnerID) { const billingIDs = this._addons.map((a) => { this.billedProductsMap.set(a.addonId, null); this.billedProductLoaded.set(a.addonId, false); return a.billingId; }); this.subscriptions.push(this.billingService.getMultiProductPricing(this.partnerID, billingIDs).subscribe((pricing) => { this._addons.forEach((addon) => { const addonPricing = pricing[addon.billingId]; if (!addonPricing) { return; } const billedProduct = buildBilledProductFromProductPricingAndAddon(addon, addonPricing); this.billedProductsMap.set(addon.addonId, billedProduct); this.billedProductLoaded.set(addon.addonId, true); }); this.cdr.detectChanges(); })); } } onClick(addonId) { this.addonSelected.emit(addonId); } instanceOfPricing(object) { if (typeof object === 'number') { return false; } return object.currency !== undefined && object.prices !== undefined; } getDisplayPricing(addon) { const price = addon.price; if (price && this.instanceOfPricing(price)) { return price; } return { currency: addon.currency, prices: [ { price: addon.price, frequency: addon.billingFrequency ? addon.billingFrequency : 'Monthly', }, ], }; } noData() { return isNullOrUndefined(this._hasVerifiedContract) || isNullOrUndefined(this._canAccessContractPricing); } displayContractPricing() { return this._canAccessContractPricing && this._hasVerifiedContract; } isBilledProductLoaded(addon) { if (this.noData()) { return false; } if (this.displayContractPricing()) { const value = this.billedProductLoaded.get(addon.addonId); return value ? value : false; } return true; } ngOnDestroy() { this.subscriptions.forEach((subscription) => subscription.unsubscribe()); } } VaAddonListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaAddonListComponent, deps: [{ token: i1.BillingService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); VaAddonListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: VaAddonListComponent, selector: "app-store-addon-list", inputs: { addons: "addons", showPricing: "showPricing", partnerID: "partnerID", hasVerifiedContract: "hasVerifiedContract", canAccessContractPricing: "canAccessContractPricing" }, outputs: { addonSelected: "addonSelected" }, ngImport: i0, template: "<mat-list *ngIf=\"_addons\" class=\"addon-list\">\n <mat-divider></mat-divider>\n <ng-container *ngFor=\"let addon of _addons\">\n <mat-list-item (click)=\"onClick(addon.addonId)\">\n <div class=\"addon-icon-title\">\n <img\n *ngIf=\"addon.icon; else noIcon\"\n class=\"addon-icon\"\n [src]=\"addon.icon\"\n mat-list-avatar\n />\n <ng-template #noIcon>\n <mat-icon class=\"addon-default-icon\" mat-list-icon>\n add_circle\n </mat-icon>\n </ng-template>\n <div class=\"addon-title-tagline\">\n <p class=\"addon-title\" matLine>{{ addon.title }}</p>\n <p class=\"addon-tagline\" matLine>{{ addon.tagline }}</p>\n </div>\n </div>\n <div *ngIf=\"showPricing\" class=\"price-section\">\n <app-pricing\n [pricing]=\"getDisplayPricing(addon)\"\n [highlightPrice]=\"false\"\n [hasVerifiedContract]=\"_hasVerifiedContract\"\n [billedProduct]=\"billedProductsMap.get(addon.addonId)\"\n [loaded]=\"isBilledProductLoaded(addon)\"\n ></app-pricing>\n </div>\n </mat-list-item>\n <mat-divider></mat-divider>\n </ng-container>\n</mat-list>\n", styles: [":host{display:block}h2+:host{margin:-8px 0}:host ::ng-deep .mat-list-item.mat-2-line{height:auto!important}:host ::ng-deep .mat-list .mat-list-item .mat-list-item-content{padding:8px;align-items:flex-start;flex-direction:column}@media screen and (min-width: 800px){:host ::ng-deep .mat-list .mat-list-item .mat-list-item-content{flex-direction:row}}.addon-list{position:relative}.addon-default-icon{margin:0 5px;color:#4caf50}.addon-icon{width:32px;height:32px}.addon-icon-title{flex-grow:1;display:flex;width:100%}@media screen and (min-width: 800px){.addon-icon-title{width:auto}}.addon-title-tagline{padding:0 16px 10px 8px;flex-grow:1}.addon-title-tagline .addon-title{color:#212121;font-size:16px;line-height:1.2;margin:6px 0;white-space:normal}.addon-title-tagline .addon-tagline{color:#616161;font-size:14px;margin:0;white-space:normal}.price-section{min-width:10em;margin-top:6px;flex-shrink:0}mat-list-item:hover{background-color:#fafafa!important;cursor:pointer!important}\n"], components: [{ type: i2.MatList, selector: "mat-list, mat-action-list", inputs: ["disableRipple", "disabled"], exportAs: ["matList"] }, { type: i3.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i2.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.VaPricingComponent, selector: "app-pricing" }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.MatListAvatarCssMatStyler, selector: "[mat-list-avatar], [matListAvatar]" }, { type: i2.MatListIconCssMatStyler, selector: "[mat-list-icon], [matListIcon]" }, { type: i7.MatLine, selector: "[mat-line], [matLine]" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaAddonListComponent, decorators: [{ type: Component, args: [{ selector: 'app-store-addon-list', template: "<mat-list *ngIf=\"_addons\" class=\"addon-list\">\n <mat-divider></mat-divider>\n <ng-container *ngFor=\"let addon of _addons\">\n <mat-list-item (click)=\"onClick(addon.addonId)\">\n <div class=\"addon-icon-title\">\n <img\n *ngIf=\"addon.icon; else noIcon\"\n class=\"addon-icon\"\n [src]=\"addon.icon\"\n mat-list-avatar\n />\n <ng-template #noIcon>\n <mat-icon class=\"addon-default-icon\" mat-list-icon>\n add_circle\n </mat-icon>\n </ng-template>\n <div class=\"addon-title-tagline\">\n <p class=\"addon-title\" matLine>{{ addon.title }}</p>\n <p class=\"addon-tagline\" matLine>{{ addon.tagline }}</p>\n </div>\n </div>\n <div *ngIf=\"showPricing\" class=\"price-section\">\n <app-pricing\n [pricing]=\"getDisplayPricing(addon)\"\n [highlightPrice]=\"false\"\n [hasVerifiedContract]=\"_hasVerifiedContract\"\n [billedProduct]=\"billedProductsMap.get(addon.addonId)\"\n [loaded]=\"isBilledProductLoaded(addon)\"\n ></app-pricing>\n </div>\n </mat-list-item>\n <mat-divider></mat-divider>\n </ng-container>\n</mat-list>\n", styles: [":host{display:block}h2+:host{margin:-8px 0}:host ::ng-deep .mat-list-item.mat-2-line{height:auto!important}:host ::ng-deep .mat-list .mat-list-item .mat-list-item-content{padding:8px;align-items:flex-start;flex-direction:column}@media screen and (min-width: 800px){:host ::ng-deep .mat-list .mat-list-item .mat-list-item-content{flex-direction:row}}.addon-list{position:relative}.addon-default-icon{margin:0 5px;color:#4caf50}.addon-icon{width:32px;height:32px}.addon-icon-title{flex-grow:1;display:flex;width:100%}@media screen and (min-width: 800px){.addon-icon-title{width:auto}}.addon-title-tagline{padding:0 16px 10px 8px;flex-grow:1}.addon-title-tagline .addon-title{color:#212121;font-size:16px;line-height:1.2;margin:6px 0;white-space:normal}.addon-title-tagline .addon-tagline{color:#616161;font-size:14px;margin:0;white-space:normal}.price-section{min-width:10em;margin-top:6px;flex-shrink:0}mat-list-item:hover{background-color:#fafafa!important;cursor:pointer!important}\n"] }] }], ctorParameters: function () { return [{ type: i1.BillingService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { addons: [{ type: Input, args: ['addons'] }], showPricing: [{ type: Input }], partnerID: [{ type: Input }], hasVerifiedContract: [{ type: Input, args: ['hasVerifiedContract'] }], canAccessContractPricing: [{ type: Input, args: ['canAccessContractPricing'] }], addonSelected: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkb24tbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvYWRkb24tbGlzdC9hZGRvbi1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9hZGRvbi1saXN0L2FkZG9uLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJN0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQWlCLDRDQUE0QyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7OztBQU9oSCxNQUFNLE9BQU8sb0JBQW9CO0lBNkIvQixZQUFvQixjQUE4QixFQUFVLEdBQXNCO1FBQTlELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdEJ6RSxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUc1Qix5QkFBb0IsR0FBWSxJQUFJLENBQUM7UUFNckMsOEJBQXlCLEdBQVksSUFBSSxDQUFDO1FBT2hDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVyRCxzQkFBaUIsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNsRCx3QkFBbUIsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN0RCxrQkFBYSxHQUFtQixFQUFFLENBQUM7SUFFMEMsQ0FBQztJQTNCdEYsSUFDSSxNQUFNLENBQUMsTUFBZTtRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBS0QsSUFDSSxt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b25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBZGRvbiB9IGZyb20gJ0B2ZW5kYXN0YS9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByaWNpbmcgfSBmcm9tICcuLi9wcmljaW5nL3ByaWNpbmcnO1xuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlLCBCaWxsZWRQcm9kdWN0LCBidWlsZEJpbGxlZFByb2R1Y3RGcm9tUHJvZHVjdFByaWNpbmdBbmRBZGRvbiB9IGZyb20gJ0B2ZW5kYXN0YS9iaWxsaW5nJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXN0b3JlLWFkZG9uLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkb24tbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FkZG9uLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmFBZGRvbkxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIF9hZGRvbnM6IEFkZG9uW107XG4gIEBJbnB1dCgnYWRkb25zJylcbiAgc2V0IGFkZG9ucyhhZGRvbnM6IEFkZG9uW10pIHtcbiAgICB0aGlzLl9hZGRvbnMgPSBhZGRvbnM7XG4gICAgdGhpcy5wb3B1bGF0ZUJpbGxlZFByb2R1Y3QoKTtcbiAgfVxuICBASW5wdXQoKSBzaG93UHJpY2luZyA9IHRydWU7XG4gIEBJbnB1dCgpIHBhcnRuZXJJRDogc3RyaW5nO1xuXG4gIF9oYXNWZXJpZmllZENvbnRyYWN0OiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCdoYXNWZXJpZmllZENvbnRyYWN0JylcbiAgc2V0IGhhc1ZlcmlmaWVkQ29udHJhY3QodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9oYXNWZXJpZmllZENvbnRyYWN0ID0gdmFsdWU7XG4gICAgdGhpcy5wb3B1bGF0ZUJpbGxlZFByb2R1Y3QoKTtcbiAgfVxuICBfY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCdjYW5BY2Nlc3NDb250cmFjdFByaWNpbmcnKVxuICBzZXQgY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nID0gdmFsdWU7XG4gICAgdGhpcy5wb3B1bGF0ZUJpbGxlZFByb2R1Y3QoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBhZGRvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTdHJpbmc+KCk7XG5cbiAgYmlsbGVkUHJvZHVjdHNNYXA6IE1hcDxzdHJpbmcsIEJpbGxlZFByb2R1Y3Q+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGJpbGxlZFByb2R1Y3RMb2FkZWQ6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBvcHVsYXRlQmlsbGVkUHJvZHVjdCgpO1xuICB9XG5cbiAgcG9wdWxhdGVCaWxsZWRQcm9kdWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc3BsYXlDb250cmFjdFByaWNpbmcoKSAmJiB0aGlzLnBhcnRuZXJJRCkge1xuICAgICAgY29uc3QgYmlsbGluZ0lEcyA9IHRoaXMuX2FkZG9ucy5tYXAoKGEpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsZWRQcm9kdWN0c01hcC5zZXQoYS5hZGRvbklkLCBudWxsKTtcbiAgICAgICAgdGhpcy5iaWxsZWRQcm9kdWN0TG9hZGVkLnNldChhLmFkZG9uSWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGEuYmlsbGluZ0lkO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRNdWx0aVByb2R1Y3RQcmljaW5nKHRoaXMucGFydG5lcklELCBiaWxsaW5nSURzKS5zdWJzY3JpYmUoKHByaWNpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLl9hZGRvbnMuZm9yRWFjaCgoYWRkb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uUHJpY2luZyA9IHByaWNpbmdbYWRkb24uYmlsbGluZ0lkXTtcbiAgICAgICAgICAgIGlmICghYWRkb25QcmljaW5nKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJpbGxlZFByb2R1Y3QgPSBidWlsZEJpbGxlZFByb2R1Y3RGcm9tUHJvZHVjdFByaWNpbmdBbmRBZGRvbihhZGRvbiwgYWRkb25QcmljaW5nKTtcbiAgICAgICAgICAgIHRoaXMuYmlsbGVkUHJvZHVjdHNNYXAuc2V0KGFkZG9uLmFkZG9uSWQsIGJpbGxlZFByb2R1Y3QpO1xuICAgICAgICAgICAgdGhpcy5iaWxsZWRQcm9kdWN0TG9hZGVkLnNldChhZGRvbi5hZGRvbklkLCB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbkNsaWNrKGFkZG9uSWQ6IFN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWRkb25TZWxlY3RlZC5lbWl0KGFkZG9uSWQpO1xuICB9XG5cbiAgcHVibGljIGluc3RhbmNlT2ZQcmljaW5nKG9iamVjdDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3QuY3VycmVuY3kgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucHJpY2VzICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXREaXNwbGF5UHJpY2luZyhhZGRvbjogQWRkb24pOiBQcmljaW5nIHtcbiAgICBjb25zdCBwcmljZTogYW55ID0gYWRkb24ucHJpY2U7XG4gICAgaWYgKHByaWNlICYmIHRoaXMuaW5zdGFuY2VPZlByaWNpbmcocHJpY2UpKSB7XG4gICAgICByZXR1cm4gcHJpY2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW5jeTogYWRkb24uY3VycmVuY3ksXG4gICAgICBwcmljZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByaWNlOiBhZGRvbi5wcmljZSxcbiAgICAgICAgICBmcmVxdWVuY3k6IGFkZG9uLmJpbGxpbmdGcmVxdWVuY3kgPyBhZGRvbi5iaWxsaW5nRnJlcXVlbmN5IDogJ01vbnRobHknLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgbm9EYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc051bGxPclVuZGVmaW5lZCh0aGlzLl9oYXNWZXJpZmllZENvbnRyYWN0KSB8fCBpc051bGxPclVuZGVmaW5lZCh0aGlzLl9jYW5BY2Nlc3NDb250cmFjdFByaWNpbmcpO1xuICB9XG5cbiAgZGlzcGxheUNvbnRyYWN0UHJpY2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nICYmIHRoaXMuX2hhc1ZlcmlmaWVkQ29udHJhY3Q7XG4gIH1cblxuICBpc0JpbGxlZFByb2R1Y3RMb2FkZWQoYWRkb246IEFkZG9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubm9EYXRhKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzcGxheUNvbnRyYWN0UHJpY2luZygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuYmlsbGVkUHJvZHVjdExvYWRlZC5nZXQoYWRkb24uYWRkb25JZCk7XG4gICAgICByZXR1cm4gdmFsdWUgPyB2YWx1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgfVxufVxuIiwiPG1hdC1saXN0ICpuZ0lmPVwiX2FkZG9uc1wiIGNsYXNzPVwiYWRkb24tbGlzdFwiPlxuICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWRkb24gb2YgX2FkZG9uc1wiPlxuICAgIDxtYXQtbGlzdC1pdGVtIChjbGljayk9XCJvbkNsaWNrKGFkZG9uLmFkZG9uSWQpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWRkb24taWNvbi10aXRsZVwiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgKm5nSWY9XCJhZGRvbi5pY29uOyBlbHNlIG5vSWNvblwiXG4gICAgICAgICAgY2xhc3M9XCJhZGRvbi1pY29uXCJcbiAgICAgICAgICBbc3JjXT1cImFkZG9uLmljb25cIlxuICAgICAgICAgIG1hdC1saXN0LWF2YXRhclxuICAgICAgICAvPlxuICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGRvbi1kZWZhdWx0LWljb25cIiBtYXQtbGlzdC1pY29uPlxuICAgICAgICAgICAgYWRkX2NpcmNsZVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGRvbi10aXRsZS10YWdsaW5lXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhZGRvbi10aXRsZVwiIG1hdExpbmU+e3sgYWRkb24udGl0bGUgfX08L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhZGRvbi10YWdsaW5lXCIgbWF0TGluZT57eyBhZGRvbi50YWdsaW5lIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNob3dQcmljaW5nXCIgY2xhc3M9XCJwcmljZS1zZWN0aW9uXCI+XG4gICAgICAgIDxhcHAtcHJpY2luZ1xuICAgICAgICAgIFtwcmljaW5nXT1cImdldERpc3BsYXlQcmljaW5nKGFkZG9uKVwiXG4gICAgICAgICAgW2hpZ2hsaWdodFByaWNlXT1cImZhbHNlXCJcbiAgICAgICAgICBbaGFzVmVyaWZpZWRDb250cmFjdF09XCJfaGFzVmVyaWZpZWRDb250cmFjdFwiXG4gICAgICAgICAgW2JpbGxlZFByb2R1Y3RdPVwiYmlsbGVkUHJvZHVjdHNNYXAuZ2V0KGFkZG9uLmFkZG9uSWQpXCJcbiAgICAgICAgICBbbG9hZGVkXT1cImlzQmlsbGVkUHJvZHVjdExvYWRlZChhZGRvbilcIlxuICAgICAgICA+PC9hcHAtcHJpY2luZz5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWxpc3QtaXRlbT5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9uZy1jb250YWluZXI+XG48L21hdC1saXN0PlxuIl19