ngx-dynamic-hooks
Version:
Automatically insert live Angular components into a dynamic string of content (based on their selector or any pattern of your choice) and render the result in the DOM.
146 lines • 19.3 kB
JavaScript
import { Component, Input, Output, EventEmitter, reflectComponentType } from '@angular/core';
import { getParseOptionDefaults } from '../../public-api';
import { anchorElementTag } from '../constants/core';
import * as i0 from "@angular/core";
import * as i1 from "../services/platform/autoPlatformService";
import * as i2 from "../services/dynamicHooksService";
import * as i3 from "../services/core/componentUpdater";
/**
* A component that can be used to dynamically load a single component and pass bindings to it
*/
export class DynamicSingleComponent {
constructor(hostElement, platformService, dynamicHooksService, componentUpdater) {
this.hostElement = hostElement;
this.platformService = platformService;
this.dynamicHooksService = dynamicHooksService;
this.componentUpdater = componentUpdater;
this.component = null;
this.inputs = {};
this.outputs = {};
this.options = {};
this.componentLoaded = new EventEmitter();
this.parseResult = null;
this.parseOptions = {};
}
ngDoCheck() {
// Update on every change detection run?
if (!this.parseOptions.updateOnPushOnly) {
this.refresh();
}
}
ngOnChanges(changes) {
// If component changed, reset and load from scratch
if (changes.hasOwnProperty('component')) {
this.reset();
this.parseOptions = { ...getParseOptionDefaults(), ...this.options };
this.loadComponent();
// If anything else changed, just refresh inputs/outputs
}
else if (changes.hasOwnProperty('inputs') ||
changes.hasOwnProperty('outputs') ||
changes.hasOwnProperty('options')) {
this.parseOptions = { ...getParseOptionDefaults(), ...this.options };
this.refresh();
}
}
ngAfterViewInit() {
}
ngAfterViewChecked() {
}
ngOnDestroy() {
this.reset();
}
// ----------------------------------------------------------------------
/**
* Destroys the dynamic component and resets the state
*/
reset() {
if (this.parseResult) {
this.dynamicHooksService.destroy(this.parseResult.hookIndex);
}
this.platformService.setInnerContent(this.hostElement.nativeElement, '');
this.parseResult = null;
this.parseOptions = {};
}
/**
* Loads the dynamic component
*/
loadComponent() {
if (this.component) {
const compMeta = reflectComponentType(this.component);
if (!compMeta) {
throw new Error('Provided component class input is not a valid Angular component.');
}
// Try to use component selector as hostElement. Otherwise default to standard anchor.
let selector;
let componentHostElement;
try {
selector = compMeta.selector;
componentHostElement = this.platformService.createElement(selector);
}
catch (e) {
selector = anchorElementTag;
componentHostElement = this.platformService.createElement(anchorElementTag);
}
this.platformService.clearChildNodes(this.hostElement.nativeElement);
this.platformService.appendChild(this.hostElement.nativeElement, componentHostElement);
// Create parser that finds created hostElement as hook and loads requested component into it
const parser = this.createAdHocParser(selector);
this.dynamicHooksService.parse(this.hostElement.nativeElement, [parser], {}, this.parseOptions)
.subscribe(parseResult => {
this.parseResult = parseResult;
this.componentLoaded.next(parseResult.hookIndex[1].componentRef);
});
}
}
/**
* Creates a parser specifically for the dynamic component
*
* @param selector - The selector to use for the component
*/
createAdHocParser(selector) {
const that = this;
class AdHocSingleComponentParser {
findHookElements(contentElement, context) {
return that.platformService.querySelectorAll(contentElement, selector);
}
loadComponent(hookId, hookValue, context, childNodes) {
return {
component: that.component
};
}
getBindings(hookId, hookValue, context) {
return {
inputs: that.inputs,
outputs: that.outputs
};
}
}
return AdHocSingleComponentParser;
}
/**
* Updates the bindings for the loaded component
*/
refresh() {
if (this.parseResult) {
this.componentUpdater.refresh(this.parseResult.hookIndex, {}, this.parseOptions, false);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicSingleComponent, deps: [{ token: i0.ElementRef }, { token: i1.AutoPlatformService }, { token: i2.DynamicHooksService }, { token: i3.ComponentUpdater }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DynamicSingleComponent, isStandalone: true, selector: "ngx-dynamic-single", inputs: { component: "component", inputs: "inputs", outputs: "outputs", options: "options" }, outputs: { componentLoaded: "componentLoaded" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicSingleComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-dynamic-single', template: '', standalone: true }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.AutoPlatformService }, { type: i2.DynamicHooksService }, { type: i3.ComponentUpdater }], propDecorators: { component: [{
type: Input
}], inputs: [{
type: Input
}], outputs: [{
type: Input
}], options: [{
type: Input
}], componentLoaded: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY1NpbmdsZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1keW5hbWljLWhvb2tzL3NyYy9saWIvY29tcG9uZW50cy9keW5hbWljU2luZ2xlQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9DLEtBQUssRUFBb0QsTUFBTSxFQUFFLFlBQVksRUFBa0Usb0JBQW9CLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBTS9QLE9BQU8sRUFBZ0Isc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFjckQ7O0dBRUc7QUFPSCxNQUFNLE9BQU8sc0JBQXNCO0lBU2pDLFlBQ1UsV0FBdUIsRUFDdkIsZUFBb0MsRUFDcEMsbUJBQXdDLEVBQ3hDLGdCQUFrQztRQUhsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixvQkFBZSxHQUFmLGVBQWUsQ0FBcUI7UUFDcEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBWm5DLGNBQVMsR0FBc0MsSUFBSSxDQUFDO1FBQ3BELFdBQU0sR0FBd0IsRUFBRSxDQUFDO1FBQ2pDLFlBQU8sR0FBd0IsRUFBRSxDQUFDO1FBQ2xDLFlBQU8sR0FBOEIsRUFBRSxDQUFDO1FBQ3ZDLG9CQUFlLEdBQW9DLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEYsZ0JBQVcsR0FBcUIsSUFBSSxDQUFDO1FBQ3JDLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztJQVFoQyxDQUFDO0lBRUQsU0FBUztRQUNQLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNq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dkIsRUFBRTs7NEZBSUQsc0JBQXNCO2tCQU5sQyxTQUFTOytCQUNFLG9CQUFvQixZQUNwQixFQUFFLGNBQ0EsSUFBSTtrTEFJUCxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJbnB1dCwgT25DaGFuZ2VzLCBFbGVtZW50UmVmLCBEb0NoZWNrLCBBZnRlclZpZXdDaGVja2VkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE9wdGlvbmFsLCBJbmplY3QsIFNpbXBsZUNoYW5nZXMsIEVudmlyb25tZW50SW5qZWN0b3IsIHJlZmxlY3RDb21wb25lbnRUeXBlLCBDb21wb25lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhvb2tJbmRleCwgSG9vaywgUGFyc2VSZXN1bHQsIEhvb2tDb21wb25lbnREYXRhLCBIb29rVmFsdWUsIEhvb2tCaW5kaW5ncyB9IGZyb20gJy4uL2ludGVyZmFjZXNQdWJsaWMnO1xuaW1wb3J0IHsgSG9va1BhcnNlciB9IGZyb20gJy4uL2ludGVyZmFjZXNQdWJsaWMnO1xuaW1wb3J0IHsgRHluYW1pY0hvb2tzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2R5bmFtaWNIb29rc1NlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50VXBkYXRlciB9IGZyb20gJy4uL3NlcnZpY2VzL2NvcmUvY29tcG9uZW50VXBkYXRlcic7XG5pbXBvcnQgeyBBdXRvUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGxhdGZvcm0vYXV0b1BsYXRmb3JtU2VydmljZSc7XG5pbXBvcnQgeyBQYXJzZU9wdGlvbnMsIGdldFBhcnNlT3B0aW9uRGVmYXVsdHMgfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcbmltcG9ydCB7IGFuY2hvckVsZW1lbnRUYWcgfSBmcm9tICcuLi9jb25zdGFudHMvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY0hvb2tzU2luZ2xlT3B0aW9ucyB7XG4gIHVwZGF0ZU9uUHVzaE9ubHk/OiBib29sZWFuO1xuICBjb21wYXJlSW5wdXRzQnlWYWx1ZT86IGJvb2xlYW47XG4gIGNvbXBhcmVPdXRwdXRzQnlWYWx1ZT86IGJvb2xlYW47XG4gIGNvbXBhcmVCeVZhbHVlRGVwdGg/OiBudW1iZXI7XG4gIGlnbm9yZUlucHV0QWxpYXNlcz86IGJvb2xlYW47XG4gIGlnbm9yZU91dHB1dEFsaWFzZXM/OiBib29sZWFuO1xuICBhY2NlcHRJbnB1dHNGb3JBbnlQcm9wZXJ0eT86IGJvb2xlYW47XG4gIGFjY2VwdE91dHB1dHNGb3JBbnlPYnNlcnZhYmxlPzogYm9vbGVhbjtcbn1cblxuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgbG9hZCBhIHNpbmdsZSBjb21wb25lbnQgYW5kIHBhc3MgYmluZGluZ3MgdG8gaXRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWR5bmFtaWMtc2luZ2xlJyxcbiAgdGVtcGxhdGU6ICcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzdHlsZXM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNTaW5nbGVDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbXBvbmVudDogKG5ldyguLi5hcmdzOiBhbnlbXSkgPT4gYW55KXxudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaW5wdXRzOiB7W2tleTpzdHJpbmddOiBhbnl9ID0ge307XG4gIEBJbnB1dCgpIG91dHB1dHM6IHtba2V5OnN0cmluZ106IGFueX0gPSB7fTtcbiAgQElucHV0KCkgb3B0aW9uczogRHluYW1pY0hvb2tzU2luZ2xlT3B0aW9ucyA9IHt9O1xuICBAT3V0cHV0KCkgY29tcG9uZW50TG9hZGVkOiBFdmVudEVtaXR0ZXI8Q29tcG9uZW50UmVmPGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwYXJzZVJlc3VsdDogUGFyc2VSZXN1bHR8bnVsbCA9IG51bGw7XG4gIHBhcnNlT3B0aW9uczogUGFyc2VPcHRpb25zID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0RWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHBsYXRmb3JtU2VydmljZTogQXV0b1BsYXRmb3JtU2VydmljZSxcbiAgICBwcml2YXRlIGR5bmFtaWNIb29rc1NlcnZpY2U6IER5bmFtaWNIb29rc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRVcGRhdGVyOiBDb21wb25lbnRVcGRhdGVyXG4gICkge1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bj9cbiAgICBpZiAoIXRoaXMucGFyc2VPcHRpb25zLnVwZGF0ZU9uUHVzaE9ubHkpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBJZiBjb21wb25lbnQgY2hhbmdlZCwgcmVzZXQgYW5kIGxvYWQgZnJvbSBzY3JhdGNoXG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnY29tcG9uZW50JylcbiAgICApIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMucGFyc2VPcHRpb25zID0gey4uLmdldFBhcnNlT3B0aW9uRGVmYXVsdHMoKSwgLi4udGhpcy5vcHRpb25zfTtcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuXG4gICAgLy8gSWYgYW55dGhpbmcgZWxzZSBjaGFuZ2VkLCBqdXN0IHJlZnJlc2ggaW5wdXRzL291dHB1dHNcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnaW5wdXRzJykgfHxcbiAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ291dHB1dHMnKSB8fCBcbiAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKVxuICAgICkgeyAgICAgIFxuICAgICAgdGhpcy5wYXJzZU9wdGlvbnMgPSB7Li4uZ2V0UGFyc2VPcHRpb25EZWZhdWx0cygpLCAuLi50aGlzLm9wdGlvbnN9O1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgZHluYW1pYyBjb21wb25lbnQgYW5kIHJlc2V0cyB0aGUgc3RhdGVcbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLnBhcnNlUmVzdWx0KSB7XG4gICAgICB0aGlzLmR5bmFtaWNIb29rc1NlcnZpY2UuZGVzdHJveSh0aGlzLnBhcnNlUmVzdWx0Lmhvb2tJbmRleCk7XG4gICAgfVxuXG4gICAgdGhpcy5wbGF0Zm9ybVNlcnZpY2Uuc2V0SW5uZXJDb250ZW50KHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJycpO1xuICAgIHRoaXMucGFyc2VSZXN1bHQgPSBudWxsO1xuICAgIHRoaXMucGFyc2VPcHRpb25zID0ge307XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGR5bmFtaWMgY29tcG9uZW50XG4gICAqL1xuICBsb2FkQ29tcG9uZW50KCkge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgY29uc3QgY29tcE1ldGEgPSByZWZsZWN0Q29tcG9uZW50VHlwZSh0aGlzLmNvbXBvbmVudCk7XG5cbiAgICAgIGlmICghY29tcE1ldGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm92aWRlZCBjb21wb25lbnQgY2xhc3MgaW5wdXQgaXMgbm90IGEgdmFsaWQgQW5ndWxhciBjb21wb25lbnQuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyeSB0byB1c2UgY29tcG9uZW50IHNlbGVjdG9yIGFzIGhvc3RFbGVtZW50LiBPdGhlcndpc2UgZGVmYXVsdCB0byBzdGFuZGFyZCBhbmNob3IuXG4gICAgICBsZXQgc2VsZWN0b3I7XG4gICAgICBsZXQgY29tcG9uZW50SG9zdEVsZW1lbnQ7XG4gICAgICB0cnkge1xuICAgICAgICBzZWxlY3RvciA9IGNvbXBNZXRhLnNlbGVjdG9yO1xuICAgICAgICBjb21wb25lbnRIb3N0RWxlbWVudCA9IHRoaXMucGxhdGZvcm1TZXJ2aWNlLmNyZWF0ZUVsZW1lbnQoc2VsZWN0b3IpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzZWxlY3RvciA9IGFuY2hvckVsZW1lbnRUYWc7XG4gICAgICAgIGNvbXBvbmVudEhvc3RFbGVtZW50ID0gdGhpcy5wbGF0Zm9ybVNlcnZpY2UuY3JlYXRlRWxlbWVudChhbmNob3JFbGVtZW50VGFnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGxhdGZvcm1TZXJ2aWNlLmNsZWFyQ2hpbGROb2Rlcyh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgdGhpcy5wbGF0Zm9ybVNlcnZpY2UuYXBwZW5kQ2hpbGQodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LCBjb21wb25lbnRIb3N0RWxlbWVudCk7XG5cbiAgICAgIC8vIENyZWF0ZSBwYXJzZXIgdGhhdCBmaW5kcyBjcmVhdGVkIGhvc3RFbGVtZW50IGFzIGhvb2sgYW5kIGxvYWRzIHJlcXVlc3RlZCBjb21wb25lbnQgaW50byBpdFxuICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5jcmVhdGVBZEhvY1BhcnNlcihzZWxlY3Rvcik7XG5cbiAgICAgIHRoaXMuZHluYW1pY0hvb2tzU2VydmljZS5wYXJzZSh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIFtwYXJzZXJdLCB7fSwgdGhpcy5wYXJzZU9wdGlvbnMpXG4gICAgICAuc3Vic2NyaWJlKHBhcnNlUmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy5wYXJzZVJlc3VsdCA9IHBhcnNlUmVzdWx0O1xuICAgICAgICB0aGlzLmNvbXBvbmVudExvYWRlZC5uZXh0KHBhcnNlUmVzdWx0Lmhvb2tJbmRleFsxXS5jb21wb25lbnRSZWYhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFyc2VyIHNwZWNpZmljYWxseSBmb3IgdGhlIGR5bmFtaWMgY29tcG9uZW50XG4gICAqIFxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gdXNlIGZvciB0aGUgY29tcG9uZW50XG4gICAqL1xuICBjcmVhdGVBZEhvY1BhcnNlcihzZWxlY3Rvcjogc3RyaW5nKTogKG5ldyguLi5hcmdzOiBhbnlbXSkgPT4gSG9va1BhcnNlcikge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgY2xhc3MgQWRIb2NTaW5nbGVDb21wb25lbnRQYXJzZXIgaW1wbGVtZW50cyBIb29rUGFyc2VyIHtcblxuICAgICAgZmluZEhvb2tFbGVtZW50cyhjb250ZW50RWxlbWVudDogYW55LCBjb250ZXh0OiBhbnkpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGF0LnBsYXRmb3JtU2VydmljZS5xdWVyeVNlbGVjdG9yQWxsKGNvbnRlbnRFbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIGxvYWRDb21wb25lbnQoaG9va0lkOiBudW1iZXIsIGhvb2tWYWx1ZTogSG9va1ZhbHVlLCBjb250ZXh0OiBhbnksIGNoaWxkTm9kZXM6IGFueVtdKTogSG9va0NvbXBvbmVudERhdGEge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBvbmVudDogdGhhdC5jb21wb25lbnQhXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2V0QmluZGluZ3MoaG9va0lkOiBudW1iZXIsIGhvb2tWYWx1ZTogSG9va1ZhbHVlLCBjb250ZXh0OiBhbnkpOiBIb29rQmluZGluZ3Mge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlucHV0czogdGhhdC5pbnB1dHMsXG4gICAgICAgICAgb3V0cHV0czogdGhhdC5vdXRwdXRzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQWRIb2NTaW5nbGVDb21wb25lbnRQYXJzZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgYmluZGluZ3MgZm9yIHRoZSBsb2FkZWQgY29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoKCkge1xuICAgIGlmICh0aGlzLnBhcnNlUmVzdWx0KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFVwZGF0ZXIucmVmcmVzaCh0aGlzLnBhcnNlUmVzdWx0Lmhvb2tJbmRleCwge30sIHRoaXMucGFyc2VPcHRpb25zLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==