UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

87 lines 24.2 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Component, Input } from "@angular/core"; import hljs from "highlight.js"; import javascript from "highlight.js/lib/languages/javascript"; import json from "highlight.js/lib/languages/json"; import less from "highlight.js/lib/languages/less"; import typescript from "highlight.js/lib/languages/typescript"; import xml from "highlight.js/lib/languages/xml"; import { CodeSandboxService } from "./code-sandbox.service"; import { SourcesService } from "../services/sources.service"; import * as i0 from "@angular/core"; import * as i1 from "../services/sources.service"; import * as i2 from "./code-sandbox.service"; import * as i3 from "@angular/common"; import * as i4 from "../../tabgroup/tab/tab.component"; import * as i5 from "../../tabgroup/tab-group/tab-group.component"; import * as i6 from "../../tooltip/tooltip.directive"; import * as i7 from "../../button/button.component"; import * as i8 from "../../image/image.component"; import * as i9 from "../copy-text/copy-text.component"; import * as i10 from "../example-code/example-code.component"; /** * @dynamic * @ignore */ export class ExampleWrapperComponent { constructor(sourcesService, codeSandboxService) { this.sourcesService = sourcesService; this.codeSandboxService = codeSandboxService; // Prefix of the example component's filenames this.filenamePrefix = ""; // Title to be displayed at the top of the example this.exampleTitle = ""; // Indicates whether the source code is being displayed this.showSource = false; hljs.registerLanguage("typescript", typescript); hljs.registerLanguage("javascript", javascript); hljs.registerLanguage("xml", xml); hljs.registerLanguage("json", json); hljs.registerLanguage("less", less); } getTooltip() { return this.showSource ? "Hide source code" : "Show source code"; } async openCodeSandboxExample() { await this.codeSandboxService.open(this.filenamePrefix, this.componentSources); } async ngOnInit() { this.componentSources = await this.sourcesService.getSourcesByFilenamePrefix(this.filenamePrefix) ?? []; } getExampleComponents(fileType) { return (this.componentSources?.find((component) => component.fileName.includes(this.filenamePrefix) && component.fileType === fileType)?.fileContent ?? ""); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExampleWrapperComponent, deps: [{ token: i1.SourcesService }, { token: i2.CodeSandboxService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ExampleWrapperComponent, selector: "nui-example-wrapper", inputs: { filenamePrefix: "filenamePrefix", exampleTitle: "exampleTitle", showSource: "showSource" }, ngImport: i0, template: "<div class=\"nui-example-wrapper__container\">\n <div class=\"nui-example-wrapper__header\">\n <h4 class=\"nui-example-wrapper__title\">{{ exampleTitle }}</h4>\n <div>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"{{\n showSource ? 'double-caret-up' : 'double-caret-down'\n }}\"\n title=\"Show source\"\n [nuiTooltip]=\"getTooltip()\"\n tooltipPlacement=\"bottom\"\n (click)=\"showSource = !showSource\"\n ></button>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"external-link\"\n title=\"Open in CodeSandbox\"\n nuiTooltip=\"Open in Code Sandbox (only self-contained examples are opened properly)\"\n tooltipPlacement=\"bottom\"\n (click)=\"openCodeSandboxExample()\"\n ></button>\n </div>\n </div>\n <div *ngIf=\"showSource\" class=\"nui-example-wrapper__source\">\n <nui-tab-group>\n <nui-tab *ngIf=\"!!getExampleComponents('html')\" heading=\"HTML\">\n <div class=\"media-body\">\n <nui-copy-text\n fileContent=\"{{ getExampleComponents('html') }}\"\n ></nui-copy-text>\n <nui-example-code language=\"html\" [code]=\"getExampleComponents('html')\" />\n </div>\n </nui-tab>\n <nui-tab *ngIf=\"!!getExampleComponents('ts')\" heading=\"Typescript\">\n <nui-copy-text\n fileContent=\"{{ getExampleComponents('ts') }}\"\n ></nui-copy-text>\n <div class=\"media-body\">\n <nui-example-code language=\"typescript\" [code]=\"getExampleComponents('ts')\" />\n </div>\n </nui-tab>\n <nui-tab *ngIf=\"!!getExampleComponents('less')\" heading=\"Less\">\n <nui-copy-text\n fileContent=\"{{ getExampleComponents('less') }}\"\n ></nui-copy-text>\n <div class=\"media-body\">\n <nui-example-code\n *ngIf=\"!!getExampleComponents('less'); else noLess\"\n [code]=\"getExampleComponents('less')\"/>\n <ng-template #noLess>\n <nui-image image=\"no-data-to-show\"></nui-image>\n </ng-template>\n </div>\n </nui-tab>\n </nui-tab-group>\n </div>\n <div class=\"nui-example-wrapper__content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".nui-example-wrapper__theme{display:inline-block}.nui-example-wrapper__content{background-color:var(--nui-color-bg-light,#fff)}.nui-example-wrapper__container{display:flex;flex-direction:column;border:1px solid;border-color:var(--nui-color-line-default,#d9d9d9);box-shadow:0 2px 2px #1111114d;margin-bottom:20px}.nui-example-wrapper__header{display:flex;flex-direction:row;background-color:var(--page-header-border-color,#d9d9d9);color:var(--nui-color-line-default,#d9d9d9);padding:5px 10px}.nui-example-wrapper__header button{outline:none}.nui-example-wrapper__title{flex-grow:1}.nui-example-wrapper__content{padding:20px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TabComponent, selector: "nui-tab", inputs: ["heading", "disabled", "templateRef", "active"], outputs: ["selected", "deselected"] }, { kind: "component", type: i5.TabGroupComponent, selector: "nui-tab-group", inputs: ["vertical"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[nuiTooltip]", inputs: ["tooltipPlacement", "nuiTooltipDisabled", "nuiTooltipEllipsis", "nuiTooltip"], exportAs: ["nuiTooltip"] }, { kind: "component", type: i7.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }, { kind: "component", type: i8.ImageComponent, selector: "nui-image", inputs: ["image", "description", "float", "margin", "isWatermark", "width", "height", "autoFill"] }, { kind: "component", type: i9.CopyTextComponent, selector: "nui-copy-text", inputs: ["fileContent"] }, { kind: "component", type: i10.ExampleCodeComponent, selector: "nui-example-code", inputs: ["language", "code"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExampleWrapperComponent, decorators: [{ type: Component, args: [{ selector: "nui-example-wrapper", template: "<div class=\"nui-example-wrapper__container\">\n <div class=\"nui-example-wrapper__header\">\n <h4 class=\"nui-example-wrapper__title\">{{ exampleTitle }}</h4>\n <div>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"{{\n showSource ? 'double-caret-up' : 'double-caret-down'\n }}\"\n title=\"Show source\"\n [nuiTooltip]=\"getTooltip()\"\n tooltipPlacement=\"bottom\"\n (click)=\"showSource = !showSource\"\n ></button>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"external-link\"\n title=\"Open in CodeSandbox\"\n nuiTooltip=\"Open in Code Sandbox (only self-contained examples are opened properly)\"\n tooltipPlacement=\"bottom\"\n (click)=\"openCodeSandboxExample()\"\n ></button>\n </div>\n </div>\n <div *ngIf=\"showSource\" class=\"nui-example-wrapper__source\">\n <nui-tab-group>\n <nui-tab *ngIf=\"!!getExampleComponents('html')\" heading=\"HTML\">\n <div class=\"media-body\">\n <nui-copy-text\n fileContent=\"{{ getExampleComponents('html') }}\"\n ></nui-copy-text>\n <nui-example-code language=\"html\" [code]=\"getExampleComponents('html')\" />\n </div>\n </nui-tab>\n <nui-tab *ngIf=\"!!getExampleComponents('ts')\" heading=\"Typescript\">\n <nui-copy-text\n fileContent=\"{{ getExampleComponents('ts') }}\"\n ></nui-copy-text>\n <div class=\"media-body\">\n <nui-example-code language=\"typescript\" [code]=\"getExampleComponents('ts')\" />\n </div>\n </nui-tab>\n <nui-tab *ngIf=\"!!getExampleComponents('less')\" heading=\"Less\">\n <nui-copy-text\n fileContent=\"{{ getExampleComponents('less') }}\"\n ></nui-copy-text>\n <div class=\"media-body\">\n <nui-example-code\n *ngIf=\"!!getExampleComponents('less'); else noLess\"\n [code]=\"getExampleComponents('less')\"/>\n <ng-template #noLess>\n <nui-image image=\"no-data-to-show\"></nui-image>\n </ng-template>\n </div>\n </nui-tab>\n </nui-tab-group>\n </div>\n <div class=\"nui-example-wrapper__content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".nui-example-wrapper__theme{display:inline-block}.nui-example-wrapper__content{background-color:var(--nui-color-bg-light,#fff)}.nui-example-wrapper__container{display:flex;flex-direction:column;border:1px solid;border-color:var(--nui-color-line-default,#d9d9d9);box-shadow:0 2px 2px #1111114d;margin-bottom:20px}.nui-example-wrapper__header{display:flex;flex-direction:row;background-color:var(--page-header-border-color,#d9d9d9);color:var(--nui-color-line-default,#d9d9d9);padding:5px 10px}.nui-example-wrapper__header button{outline:none}.nui-example-wrapper__title{flex-grow:1}.nui-example-wrapper__content{padding:20px}\n"] }] }], ctorParameters: () => [{ type: i1.SourcesService }, { type: i2.CodeSandboxService }], propDecorators: { filenamePrefix: [{ type: Input }], exampleTitle: [{ type: Input }], showSource: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZG9jcy9leGFtcGxlLXdyYXBwZXIvZXhhbXBsZS13cmFwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZG9jcy9leGFtcGxlLXdyYXBwZXIvZXhhbXBsZS13cmFwcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLElBQUksTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxVQUFVLE1BQU0sdUNBQXVDLENBQUM7QUFDL0QsT0FBTyxJQUFJLE1BQU0saUNBQWlDLENBQUM7QUFDbkQsT0FBTyxJQUFJLE1BQU0saUNBQWlDLENBQUM7QUFDbkQsT0FBTyxVQUFVLE1BQU0sdUNBQXVDLENBQUM7QUFDL0QsT0FBTyxHQUFHLE1BQU0sZ0NBQWdDLENBQUM7QUFFakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFnQixjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRTNFOzs7R0FHRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFZaEMsWUFDWSxjQUE4QixFQUM5QixrQkFBc0M7UUFEdEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFibEQsOENBQThDO1FBQ3JDLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBRXJDLGtEQUFrRDtRQUN6QyxpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUVuQyx1REFBdUQ7UUFDOUMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQVF4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVNLFVBQVU7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQjtRQUMvQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzlCLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FDeEIsQ0FBQztJQUNOLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUTtRQUNqQixJQUFJLENBQUMsZ0JBQWdCO1lBQ2pCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FDaEQsSUFBSSxDQUFDLGNBQWMsQ0FDdEIsSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVNLG9CQUFvQixDQUFDLFFBQWdCO1FBQ3hDLE9BQU8sQ0FDSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUN2QixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ1YsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNoRCxTQUFTLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FDdEMsRUFBRSxXQUFXLElBQUksRUFBRSxDQUN2QixDQUFDO0lBQ04sQ0FBQzsrR0FqRFEsdUJBQXVCO21HQUF2Qix1QkFBdUIsaUtDeENwQyx1eEZBaUVBOzs0RkR6QmEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUVJLHFCQUFxQjtvSEFLdEIsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBobGpzIGZyb20gXCJoaWdobGlnaHQuanNcIjtcbmltcG9ydCBqYXZhc2NyaXB0IGZyb20gXCJoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9qYXZhc2NyaXB0XCI7XG5pbXBvcnQganNvbiBmcm9tIFwiaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvanNvblwiO1xuaW1wb3J0IGxlc3MgZnJvbSBcImhpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2xlc3NcIjtcbmltcG9ydCB0eXBlc2NyaXB0IGZyb20gXCJoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeG1sIGZyb20gXCJoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy94bWxcIjtcblxuaW1wb3J0IHsgQ29kZVNhbmRib3hTZXJ2aWNlIH0gZnJvbSBcIi4vY29kZS1zYW5kYm94LnNlcnZpY2VcIjtcbmltcG9ydCB7IEZpbGVNZXRhZGF0YSwgU291cmNlc1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvc291cmNlcy5zZXJ2aWNlXCI7XG5cbi8qKlxuICogQGR5bmFtaWNcbiAqIEBpZ25vcmVcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6IFwiLi9leGFtcGxlLXdyYXBwZXIuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzZWxlY3RvcjogXCJudWktZXhhbXBsZS13cmFwcGVyXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL2V4YW1wbGUtd3JhcHBlci5jb21wb25lbnQubGVzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgRXhhbXBsZVdyYXBwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8vIFByZWZpeCBvZiB0aGUgZXhhbXBsZSBjb21wb25lbnQncyBmaWxlbmFtZXNcbiAgICBASW5wdXQoKSBmaWxlbmFtZVByZWZpeDogc3RyaW5nID0gXCJcIjtcblxuICAgIC8vIFRpdGxlIHRvIGJlIGRpc3BsYXllZCBhdCB0aGUgdG9wIG9mIHRoZSBleGFtcGxlXG4gICAgQElucHV0KCkgZXhhbXBsZVRpdGxlOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNvdXJjZSBjb2RlIGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEBJbnB1dCgpIHNob3dTb3VyY2UgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb21wb25lbnRTb3VyY2VzOiBGaWxlTWV0YWRhdGFbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNvdXJjZXNTZXJ2aWNlOiBTb3VyY2VzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb2RlU2FuZGJveFNlcnZpY2U6IENvZGVTYW5kYm94U2VydmljZVxuICAgICkge1xuICAgICAgICBobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoXCJ0eXBlc2NyaXB0XCIsIHR5cGVzY3JpcHQpO1xuICAgICAgICBobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoXCJqYXZhc2NyaXB0XCIsIGphdmFzY3JpcHQpO1xuICAgICAgICBobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoXCJ4bWxcIiwgeG1sKTtcbiAgICAgICAgaGxqcy5yZWdpc3Rlckxhbmd1YWdlKFwianNvblwiLCBqc29uKTtcbiAgICAgICAgaGxqcy5yZWdpc3Rlckxhbmd1YWdlKFwibGVzc1wiLCBsZXNzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VG9vbHRpcCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93U291cmNlID8gXCJIaWRlIHNvdXJjZSBjb2RlXCIgOiBcIlNob3cgc291cmNlIGNvZGVcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb3BlbkNvZGVTYW5kYm94RXhhbXBsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2RlU2FuZGJveFNlcnZpY2Uub3BlbihcbiAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVQcmVmaXgsXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNvdXJjZXNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50U291cmNlcyA9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNTZXJ2aWNlLmdldFNvdXJjZXNCeUZpbGVuYW1lUHJlZml4KFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVQcmVmaXhcbiAgICAgICAgICAgICkgPz8gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldEV4YW1wbGVDb21wb25lbnRzKGZpbGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTb3VyY2VzPy5maW5kKFxuICAgICAgICAgICAgICAgIChjb21wb25lbnQpID0+XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5maWxlTmFtZS5pbmNsdWRlcyh0aGlzLmZpbGVuYW1lUHJlZml4KSAmJlxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZmlsZVR5cGUgPT09IGZpbGVUeXBlXG4gICAgICAgICAgICApPy5maWxlQ29udGVudCA/PyBcIlwiXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm51aS1leGFtcGxlLXdyYXBwZXJfX2NvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJudWktZXhhbXBsZS13cmFwcGVyX19oZWFkZXJcIj5cbiAgICAgICAgPGg0IGNsYXNzPVwibnVpLWV4YW1wbGUtd3JhcHBlcl9fdGl0bGVcIj57eyBleGFtcGxlVGl0bGUgfX08L2g0PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG51aS1idXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgIGljb249XCJ7e1xuICAgICAgICAgICAgICAgICAgICBzaG93U291cmNlID8gJ2RvdWJsZS1jYXJldC11cCcgOiAnZG91YmxlLWNhcmV0LWRvd24nXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiU2hvdyBzb3VyY2VcIlxuICAgICAgICAgICAgICAgIFtudWlUb29sdGlwXT1cImdldFRvb2x0aXAoKVwiXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dTb3VyY2UgPSAhc2hvd1NvdXJjZVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGRpc3BsYXlTdHlsZT1cImFjdGlvblwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImV4dGVybmFsLWxpbmtcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiT3BlbiBpbiBDb2RlU2FuZGJveFwiXG4gICAgICAgICAgICAgICAgbnVpVG9vbHRpcD1cIk9wZW4gaW4gQ29kZSBTYW5kYm94IChvbmx5IHNlbGYtY29udGFpbmVkIGV4YW1wbGVzIGFyZSBvcGVuZWQgcHJvcGVybHkpXCJcbiAgICAgICAgICAgICAgICB0b29sdGlwUGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvZGVTYW5kYm94RXhhbXBsZSgpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInNob3dTb3VyY2VcIiBjbGFzcz1cIm51aS1leGFtcGxlLXdyYXBwZXJfX3NvdXJjZVwiPlxuICAgICAgICA8bnVpLXRhYi1ncm91cD5cbiAgICAgICAgICAgIDxudWktdGFiICpuZ0lmPVwiISFnZXRFeGFtcGxlQ29tcG9uZW50cygnaHRtbCcpXCIgaGVhZGluZz1cIkhUTUxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8bnVpLWNvcHktdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNvbnRlbnQ9XCJ7eyBnZXRFeGFtcGxlQ29tcG9uZW50cygnaHRtbCcpIH19XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbnVpLWNvcHktdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPG51aS1leGFtcGxlLWNvZGUgbGFuZ3VhZ2U9XCJodG1sXCIgW2NvZGVdPVwiZ2V0RXhhbXBsZUNvbXBvbmVudHMoJ2h0bWwnKVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L251aS10YWI+XG4gICAgICAgICAgICA8bnVpLXRhYiAqbmdJZj1cIiEhZ2V0RXhhbXBsZUNvbXBvbmVudHMoJ3RzJylcIiBoZWFkaW5nPVwiVHlwZXNjcmlwdFwiPlxuICAgICAgICAgICAgICAgIDxudWktY29weS10ZXh0XG4gICAgICAgICAgICAgICAgICAgIGZpbGVDb250ZW50PVwie3sgZ2V0RXhhbXBsZUNvbXBvbmVudHMoJ3RzJykgfX1cIlxuICAgICAgICAgICAgICAgID48L251aS1jb3B5LXRleHQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG51aS1leGFtcGxlLWNvZGUgbGFuZ3VhZ2U9XCJ0eXBlc2NyaXB0XCIgW2NvZGVdPVwiZ2V0RXhhbXBsZUNvbXBvbmVudHMoJ3RzJylcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9udWktdGFiPlxuICAgICAgICAgICAgPG51aS10YWIgKm5nSWY9XCIhIWdldEV4YW1wbGVDb21wb25lbnRzKCdsZXNzJylcIiBoZWFkaW5nPVwiTGVzc1wiPlxuICAgICAgICAgICAgICAgIDxudWktY29weS10ZXh0XG4gICAgICAgICAgICAgICAgICAgIGZpbGVDb250ZW50PVwie3sgZ2V0RXhhbXBsZUNvbXBvbmVudHMoJ2xlc3MnKSB9fVwiXG4gICAgICAgICAgICAgICAgPjwvbnVpLWNvcHktdGV4dD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8bnVpLWV4YW1wbGUtY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhIWdldEV4YW1wbGVDb21wb25lbnRzKCdsZXNzJyk7IGVsc2Ugbm9MZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2RlXT1cImdldEV4YW1wbGVDb21wb25lbnRzKCdsZXNzJylcIi8+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9MZXNzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG51aS1pbWFnZSBpbWFnZT1cIm5vLWRhdGEtdG8tc2hvd1wiPjwvbnVpLWltYWdlPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9udWktdGFiPlxuICAgICAgICA8L251aS10YWItZ3JvdXA+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm51aS1leGFtcGxlLXdyYXBwZXJfX2NvbnRlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=