@hestia-earth/ui-components 0.30.3 → 0.30.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/files/files-form/files-form.component.mjs +14 -41
- package/esm2022/files/files-form.model.mjs +12 -16
- package/fesm2022/hestia-earth-ui-components.mjs +19 -49
- package/fesm2022/hestia-earth-ui-components.mjs.map +1 -1
- package/files/files-form/files-form.component.d.ts +4 -7
- package/package.json +1 -1
|
@@ -10,17 +10,16 @@ import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
|
|
|
10
10
|
import { isUndefined } from '@hestia-earth/utils';
|
|
11
11
|
import { SvgIconComponent } from 'angular-svg-icon';
|
|
12
12
|
import { MarkdownComponent } from 'ngx-markdown';
|
|
13
|
-
import { formatPropertyError, propertyError, hasError, hasWarning, recursiveProperties, propertyId, groupChanged,
|
|
13
|
+
import { formatPropertyError, propertyError, hasError, hasWarning, recursiveProperties, propertyId, groupChanged, formatter } from '../files-form.model';
|
|
14
14
|
import { errorHasError, errorHasWarning, filterError, formatError } from '../files-error.model';
|
|
15
15
|
import { PopoverConfirmComponent } from '../../common/popover-confirm/popover-confirm.component';
|
|
16
16
|
import { SchemaVersionLinkComponent } from '../../common/schema-version-link/schema-version-link.component';
|
|
17
17
|
import { SchemaInfoComponent } from '../../schema/schema-info/schema-info.component';
|
|
18
|
-
import { HeSchemaService } from '../../schema/schema.service';
|
|
18
|
+
import { HeSchemaService, linkTypeEnabled } from '../../schema/schema.service';
|
|
19
19
|
import { NodeIconComponent } from '../../node/node-icon/node-icon.component';
|
|
20
20
|
import { SitesMapsComponent } from '../../sites/sites-maps/sites-maps.component';
|
|
21
|
-
import { ClipboardComponent } from '../../common';
|
|
21
|
+
import { ClipboardComponent, isExternal } from '../../common';
|
|
22
22
|
import * as i0 from "@angular/core";
|
|
23
|
-
import * as i1 from "@angular/forms";
|
|
24
23
|
const stringify = (value) => JSON.stringify(value);
|
|
25
24
|
export class FilesFormComponent {
|
|
26
25
|
constructor() {
|
|
@@ -41,12 +40,10 @@ export class FilesFormComponent {
|
|
|
41
40
|
this.isOpen = model(true);
|
|
42
41
|
this.node = input.required();
|
|
43
42
|
this.errors = input([]);
|
|
44
|
-
this.errorsEditable = input(false);
|
|
45
43
|
this.schemas = toSignal(this.schemaService.schemas$);
|
|
46
44
|
this.schemaType = computed(() => this.node()?.type || this.node()?.['@type']);
|
|
47
45
|
this.schema = computed(() => this.schemas()?.[this.schemaType()] ?? {});
|
|
48
46
|
this.nodeErorrResolved = output();
|
|
49
|
-
this.nodeErrorAdded = output();
|
|
50
47
|
this.NodeType = NodeType;
|
|
51
48
|
this.SchemaType = SchemaType;
|
|
52
49
|
this.formatPropertyError = formatPropertyError;
|
|
@@ -58,6 +55,14 @@ export class FilesFormComponent {
|
|
|
58
55
|
this.node().region?.name,
|
|
59
56
|
this.node().country?.name
|
|
60
57
|
].some(Boolean));
|
|
58
|
+
this.nodeId = computed(() => this.node()?.id || this.node()?.['@id']);
|
|
59
|
+
this.nodeUrl = computed(() => [
|
|
60
|
+
linkTypeEnabled(this.schemaType()),
|
|
61
|
+
// handle links on Community Edition
|
|
62
|
+
this.node()?.['@id'] || (isExternal() && this.nodeId())
|
|
63
|
+
].every(Boolean)
|
|
64
|
+
? `/${this.schemaType().toLowerCase()}/${this.nodeId()}`
|
|
65
|
+
: '');
|
|
61
66
|
this.filteredErrors = computed(() => this.errors().filter(filterError));
|
|
62
67
|
this.nodeError = computed(() => propertyError(this.filteredErrors())(''));
|
|
63
68
|
this.nodeProperty = computed(() => this.schema()
|
|
@@ -90,38 +95,6 @@ export class FilesFormComponent {
|
|
|
90
95
|
return [fullKey, id].join('_');
|
|
91
96
|
}
|
|
92
97
|
// --- Errors
|
|
93
|
-
addErrorEnabled(property) {
|
|
94
|
-
return this.errorsEditable() && !property.hasError && !property.hasWarning;
|
|
95
|
-
}
|
|
96
|
-
addError(property, { message, level }) {
|
|
97
|
-
if (!message) {
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
const keys = property.fullKey.split('.');
|
|
101
|
-
keys.pop();
|
|
102
|
-
const error = property.isAdded
|
|
103
|
-
? {
|
|
104
|
-
message,
|
|
105
|
-
level: level || 'error',
|
|
106
|
-
dataPath: keyToDataPath(keys.join('.')),
|
|
107
|
-
params: {
|
|
108
|
-
missingProperty: property.key
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
: {
|
|
112
|
-
message,
|
|
113
|
-
level: level || 'error',
|
|
114
|
-
dataPath: keyToDataPath(property.fullKey)
|
|
115
|
-
};
|
|
116
|
-
property.newError = { level: 'warning' };
|
|
117
|
-
property.error = error;
|
|
118
|
-
property.hasError = errorHasError(error);
|
|
119
|
-
property.hasWarning = errorHasWarning(error);
|
|
120
|
-
this.nodeErrorAdded.emit(error);
|
|
121
|
-
}
|
|
122
|
-
editError(property) {
|
|
123
|
-
property.newError = property.error;
|
|
124
|
-
}
|
|
125
98
|
resolveError(property) {
|
|
126
99
|
const index = property.error?.index;
|
|
127
100
|
property.error = undefined;
|
|
@@ -131,7 +104,7 @@ export class FilesFormComponent {
|
|
|
131
104
|
return groupChanged(this.properties(), property.fullKey);
|
|
132
105
|
}
|
|
133
106
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: FilesFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
134
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: FilesFormComponent, isStandalone: true, selector: "he-files-form", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, errorsEditable: { classPropertyName: "errorsEditable", publicName: "errorsEditable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", nodeErorrResolved: "nodeErorrResolved", nodeErrorAdded: "nodeErrorAdded" }, ngImport: i0, template: "<div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch | files-form-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-align-items-center is-align-self-stretch is-gap-16 px-4 py-2 has-text-secondary | files-form-header\"\n (click)=\"isOpen.set(!isOpen())\"\n pointer>\n <div class=\"is-flex is-gap-8 is-align-items-center\">\n @if (nodeProperty()) {\n <he-node-icon [type]=\"schemaType()\" />\n <span class=\"has-text-weight-bold has-text-secondary is-size-5\">{{ schemaType() }}</span>\n @if (nodeProperty().hasError || hasError()) {\n <svg-icon name=\"far-times-circle\" class=\"has-text-danger is-flex is-align-items-center\" />\n <span class=\"has-text-danger has-text-weight-bold is-italic\">Error</span>\n } @else if (nodeProperty().hasWarning || hasWarning()) {\n <svg-icon name=\"exclamation-triangle\" class=\"has-text-warning is-flex is-align-items-center\" />\n <span class=\"has-text-warning has-text-weight-bold is-italic\">Warning</span>\n }\n }\n </div>\n <fa-icon [icon]=\"isOpen() ? faMinus : faPlus\" />\n </div>\n\n <div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch\">\n @if (isOpen()) {\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: nodeProperty() }\" />\n }\n @if (nodeProperty()?.error) {\n <ng-container\n *ngTemplateOutlet=\"\n propertyError;\n context: { property: nodeProperty(), edit: true, classes: 'is-my-1 is-px-3' }\n \" />\n }\n }\n\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (property of properties(); track trackByProperty($index, property)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: property }\" />\n }\n </div>\n\n @if (isOpen()) {\n <ng-container *ngTemplateOutlet=\"propertyMap; context: { $implicit: nodeProperty() }\" />\n }\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<ng-template #propertyKeyTooltip let-property=\"property\">\n <markdown [data]=\"property.schema.description\" />\n</ng-template>\n\n<ng-template #propertyKey let-property=\"property\">\n @if (property.schema?.description) {\n <span\n class=\"property-key trigger-popover\"\n [ngbTooltip]=\"propertyKeyTooltip\"\n [tooltipContext]=\"{ property }\"\n tooltipClass=\"property-tooltip\"\n placement=\"bottom-left\"\n container=\"body\">\n <span>{{ property.key }}</span>\n </span>\n } @else {\n <span>{{ property.key }}</span>\n }\n</ng-template>\n\n<ng-template #showProperty let-property>\n @if ((isOpen() || property.closedVisible) && !property.isHidden) {\n @if (property.properties.length) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 has-text-secondary w-100 | properties-container--title\"\n (click)=\"property.isOpen = !property.isOpen\"\n pointer\n [class.is-open]=\"property.isOpen\"\n [class.is-group-error-danger]=\"property.hasError\"\n [class.is-group-error-warning]=\"property.hasWarning\">\n <div class=\"is-flex is-gap-8 has-text-weight-bold\">\n <!-- @if (property.schemaType === SchemaType.Term) {\n <he-node-icon [type]=\"property.schemaType\" />\n } -->\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n </div>\n <fa-icon [icon]=\"property.isOpen ? faMinus : faPlus\" />\n </div>\n @if (property.isOpen) {\n @if (property.error) {\n <ng-container\n *ngTemplateOutlet=\"\n propertyError;\n context: { property: property, edit: true, classes: 'is-my-1 is-px-3' }\n \" />\n }\n @if (property.isArray) {\n <div class=\"py-2 px-3 w-100\">\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: property }\" />\n }\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n @if (prop2.key) {\n <div class=\"pt-2 my-4 | property-array-container\" [id]=\"prop2.fullKey + '_' + prop2.id\">\n <div class=\"property-array-number ml-2\">\n <div class=\"is-flex is-justify-content-center is-align-items-center has-addons number-tags\">\n <span class=\"number-tag\">{{ prop2.key }}</span>\n </div>\n </div>\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: prop2 }\" />\n }\n @if (prop2.error) {\n <ng-container\n *ngTemplateOutlet=\"\n propertyError;\n context: { property: prop2, edit: true, classes: 'is-my-1 is-px-3' }\n \" />\n }\n <div class=\"p-3\">\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop3 of prop2.properties; track trackByProperty($index, prop3)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop3 }\" />\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n } @else {\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: property }\" />\n }\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop2 }\" />\n }\n </div>\n }\n }\n </div>\n } @else {\n <div\n class=\"is-flex is-flex-direction-column is-gap-4 | property-container\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n <div\n class=\"is-flex is-flex-direction-row is-align-items-center is-justify-content-space-between is-gap-4 | field-container\">\n @if (property.key) {\n <div class=\"is-flex is-align-items-center is-flex-wrap-wrap is-gap-4\">\n <div class=\"is-flex has-text-secondary\">\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n <span>:</span>\n </div>\n\n <span class=\"is-flex is-size-7 | property-value\">\n {{ property.value }}\n </span>\n\n <div class=\"copy-button\">\n <he-clipboard [value]=\"property.value\" [hideText]=\"true\" [icon]=\"farClone\"></he-clipboard>\n </div>\n </div>\n\n <div class=\"is-flex is-gap-8\">\n @if (addErrorEnabled(property)) {\n <he-popover-confirm\n class=\"is-flex\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\">\n <fa-icon [icon]=\"faComments\" />\n </he-popover-confirm>\n }\n @if (property.externalUrl?.url) {\n <a\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{ 'is-info': property.key === 'type' }\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\">\n <fa-icon [icon]=\"property.externalUrl.icon || faExternalLinkAlt\" />\n </a>\n }\n </div>\n }\n </div>\n @if (property.hasError || property.hasWarning) {\n <ng-container *ngTemplateOutlet=\"propertyError; context: { property: property, edit: false }\" />\n }\n </div>\n }\n }\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\" let-classes=\"classes\">\n @if (property.error) {\n <div\n class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-items-center is-gap-8 is-size-6 is-m-0 w-100 has-text-grey {{\n classes\n }} | property-error\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n @if (property.hasError) {\n <fa-icon class=\"has-text-danger is-py-1\" [icon]=\"farCircleXmark\" size=\"xl\" />\n } @else {\n <svg-icon class=\"has-text-warning is-pt-1\" name=\"exclamation-triangle\" />\n }\n <div [innerHTML]=\"property.error.message\"></div>\n @if (property.error.index >= 0) {\n @if (edit && errorsEditable()) {\n <a (click)=\"editError(property)\">\n <fa-icon class=\"pr-2\" [icon]=\"faEdit\" />\n <span>Edit</span>\n </a>\n }\n @if (property.hasWarning || errorsEditable()) {\n <a (click)=\"resolveError(property)\">\n <fa-icon class=\"pr-2\" [icon]=\"faCheck\" />\n <span>Resolved</span>\n </a>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #propertyMap let-property>\n @if (showMap()) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 w-100 | properties-container--title\"\n (click)=\"mapVisible.set(!mapVisible())\"\n pointer\n [class.is-open]=\"mapVisible()\">\n <span class=\"is-size-6\">View on Map</span>\n <fa-icon [icon]=\"mapVisible() ? faMinus : faPlus\" />\n </div>\n @if (mapVisible()) {\n <he-sites-maps [sites]=\"[node()]\" [showNotice]=\"false\" />\n }\n </div>\n }\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n @if (property.newError) {\n <div class=\"field has-addons w-100 is-p-2 is-m-0\">\n <div class=\"control\">\n <div class=\"select is-small\">\n <select [(ngModel)]=\"property.newError.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\">\n <textarea\n class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"></textarea>\n </div>\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\">\n <fa-icon [icon]=\"faPlusCircle\" />\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #popupErrorForm let-data=\"data\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select\">\n <select [(ngModel)]=\"data.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <input class=\"input\" [(ngModel)]=\"data.message\" placeholder=\"Enter your message here\" />\n </div>\n </div>\n</ng-template>\n", styles: [".notification{color:#0a0a0a!important}.notification.is-success{background-color:#d5f3d8}.notification.is-success *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-success>fa-icon{color:#48c78e}.notification.is-info{background-color:#d3ebed}.notification.is-info *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-info>fa-icon{color:#249da5}.notification.is-warning{background-color:#ffdec0}.notification.is-warning *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-warning>fa-icon{color:#ff881b}.notification.is-danger{background-color:#ffcdd0}.notification.is-danger *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-danger>fa-icon{color:#f14668}he-sites-maps{height:200px}.files-form-container{box-shadow:2px 2px 4px #00000029;background-color:#fff}.files-form-header{padding:10px 12px;background-color:#dbe3ea;border-top-left-radius:3px;border-top-right-radius:3px}.properties-container--title,.property-container{padding:6px 12px}.property-container{flex:none;flex-grow:1;min-width:50%;max-width:100%;border:1px solid #f5f5f5}.property-container.is-error-danger{border-color:#f14668}.property-container.is-error-warning{border-color:#ff881b}.properties-container--title{border-top:1px solid #dbe3ea;border-bottom:1px solid #dbe3ea;background:#f5f7f9}.properties-container .properties-container{border-radius:6px;border:1px solid #dbe3ea;margin:4px 0}.properties-container .properties-container--title{border-top:none}.property-key,.property-value{word-break:break-word}.property-array-container{border-radius:6px;border:1px solid #dbdbdb}.property-array-number .number-tags{border:1px solid #249da5;border-radius:50%;width:20px;height:20px}.property-array-number .number-tags .number-tag{color:#249da5}.copy-button{visibility:hidden}.field-container:hover .copy-button{visibility:visible}.is-group-error-danger{background-color:#ffcdd0}.is-group-error-warning{background-color:#ffdec0}.property-error.is-error-danger{background-color:#ffeced}.field-container+.property-error.is-error-danger{background-color:transparent;color:#e13939!important}.property-error.is-error-warning{background-color:#fff5ec}.field-container+.property-error.is-error-warning{background-color:transparent;color:#ff881b!important}.property-error.is-error-danger svg-icon,.property-error.is-error-danger fa-icon,.property-error.is-error-warning svg-icon,.property-error.is-error-warning fa-icon{width:24px}::ng-deep .property-tooltip{background-color:#fff;color:#0a0a0a;border:1px solid #dbdbdb;z-index:11;max-width:30vw}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: NodeIconComponent, selector: "he-node-icon", inputs: ["type", "size"] }, { kind: "component", type: PopoverConfirmComponent, selector: "he-popover-confirm", inputs: ["message", "content", "position", "popoverClass"], outputs: ["confirmed"] }, { kind: "component", type: SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "zoom", "showNotice"] }, { kind: "component", type: SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "component", type: ClipboardComponent, selector: "he-clipboard", inputs: ["icon", "value", "disabled", "hideText", "size", "rotate", "clipboardClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
107
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: FilesFormComponent, isStandalone: true, selector: "he-files-form", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", nodeErorrResolved: "nodeErorrResolved" }, ngImport: i0, template: "<div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch | files-form-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-align-items-center is-align-self-stretch is-gap-16 px-4 py-2 has-text-secondary | files-form-header\"\n (click)=\"isOpen.set(!isOpen())\"\n pointer>\n <div class=\"is-flex is-gap-8 is-align-items-center\">\n @if (nodeProperty()) {\n <he-node-icon [type]=\"schemaType()\" />\n <span class=\"has-text-weight-bold has-text-secondary is-size-5\">{{ schemaType() }}</span>\n @if (nodeProperty().hasError || hasError()) {\n <svg-icon name=\"far-times-circle\" class=\"has-text-danger is-flex is-align-items-center\" />\n <span class=\"has-text-danger has-text-weight-bold is-italic\">Error</span>\n } @else if (nodeProperty().hasWarning || hasWarning()) {\n <svg-icon name=\"exclamation-triangle\" class=\"has-text-warning is-flex is-align-items-center\" />\n <span class=\"has-text-warning has-text-weight-bold is-italic\">Warning</span>\n }\n }\n </div>\n <div class=\"is-flex is-flex-direction-row is-align-items-center is-gap-16\">\n @if (nodeUrl()) {\n <a class=\"external-link\" [href]=\"nodeUrl()\" target=\"_blank\">\n <span>View</span>\n <span class=\"is-pl-1\">{{ schemaType() }}</span>\n <fa-icon class=\"is-pl-2\" [icon]=\"faExternalLinkAlt\" />\n </a>\n }\n <fa-icon [icon]=\"isOpen() ? faMinus : faPlus\" />\n </div>\n </div>\n\n <div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch\">\n @if (isOpen()) {\n @if (nodeProperty()?.error) {\n <ng-container\n *ngTemplateOutlet=\"propertyError; context: { property: nodeProperty(), classes: 'is-my-1 is-px-3' }\" />\n }\n }\n\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (property of properties(); track trackByProperty($index, property)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: property }\" />\n }\n </div>\n\n @if (isOpen()) {\n <ng-container *ngTemplateOutlet=\"propertyMap; context: { $implicit: nodeProperty() }\" />\n }\n </div>\n\n <ng-content />\n</div>\n\n<ng-template #propertyKeyTooltip let-property=\"property\">\n <markdown [data]=\"property.schema.description\" />\n</ng-template>\n\n<ng-template #propertyKey let-property=\"property\">\n @if (property.schema?.description) {\n <span\n class=\"property-key trigger-popover\"\n [ngbTooltip]=\"propertyKeyTooltip\"\n [tooltipContext]=\"{ property }\"\n tooltipClass=\"property-tooltip\"\n placement=\"bottom-left\"\n container=\"body\">\n <span>{{ property.key }}</span>\n </span>\n } @else {\n <span>{{ property.key }}</span>\n }\n</ng-template>\n\n<ng-template #showProperty let-property>\n @if ((isOpen() || property.closedVisible) && !property.isHidden) {\n @if (property.properties.length) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 has-text-secondary w-100 | properties-container--title\"\n (click)=\"property.isOpen = !property.isOpen\"\n pointer\n [class.is-open]=\"property.isOpen\"\n [class.is-group-error-danger]=\"property.hasError\"\n [class.is-group-error-warning]=\"property.hasWarning\">\n <div class=\"is-flex is-gap-8 has-text-weight-bold\">\n <!-- @if (property.schemaType === SchemaType.Term) {\n <he-node-icon [type]=\"property.schemaType\" />\n } -->\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n </div>\n <fa-icon [icon]=\"property.isOpen ? faMinus : faPlus\" />\n </div>\n @if (property.isOpen) {\n @if (property.error) {\n <ng-container *ngTemplateOutlet=\"propertyError; context: { property, classes: 'is-my-1 is-px-3' }\" />\n }\n @if (property.isArray) {\n <div class=\"py-2 px-3 w-100\">\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n @if (prop2.key) {\n <div class=\"pt-2 my-4 | property-array-container\" [id]=\"prop2.fullKey + '_' + prop2.id\">\n <div class=\"property-array-number ml-2\">\n <div class=\"is-flex is-justify-content-center is-align-items-center has-addons number-tags\">\n <span class=\"number-tag\">{{ prop2.key }}</span>\n </div>\n </div>\n @if (prop2.error) {\n <ng-container\n *ngTemplateOutlet=\"propertyError; context: { property: prop2, classes: 'is-my-1 is-px-3' }\" />\n }\n <div class=\"p-3\">\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop3 of prop2.properties; track trackByProperty($index, prop3)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop3 }\" />\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop2 }\" />\n }\n </div>\n }\n }\n </div>\n } @else {\n <div\n class=\"is-flex is-flex-direction-column is-gap-4 | property-container\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n <div\n class=\"is-flex is-flex-direction-row is-align-items-center is-justify-content-space-between is-gap-4 | field-container\">\n @if (property.key) {\n <div class=\"is-flex is-align-items-center is-flex-wrap-wrap is-gap-4\">\n <div class=\"is-flex has-text-secondary\">\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n <span>:</span>\n </div>\n\n <span class=\"is-flex is-size-7 | property-value\">\n {{ property.value }}\n </span>\n\n <div class=\"copy-button\">\n <he-clipboard [value]=\"property.value\" [hideText]=\"true\" [icon]=\"farClone\"></he-clipboard>\n </div>\n </div>\n\n <div class=\"is-flex is-gap-8\">\n @if (property.externalUrl?.url) {\n <a\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{ 'is-info': property.key === 'type' }\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\">\n <fa-icon [icon]=\"property.externalUrl.icon || faExternalLinkAlt\" />\n </a>\n }\n </div>\n }\n </div>\n @if (property.hasError || property.hasWarning) {\n <ng-container *ngTemplateOutlet=\"propertyError; context: { property }\" />\n }\n </div>\n }\n }\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-classes=\"classes\">\n @if (property.error) {\n <div\n class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-items-center is-gap-8 is-size-6 is-m-0 w-100 has-text-grey {{\n classes\n }} | property-error\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n @if (property.hasError) {\n <fa-icon class=\"has-text-danger is-py-1\" [icon]=\"farCircleXmark\" size=\"xl\" />\n } @else {\n <svg-icon class=\"has-text-warning is-pt-1\" name=\"exclamation-triangle\" />\n }\n <div [innerHTML]=\"property.error.message\"></div>\n @if (property.error.index >= 0) {\n @if (property.hasWarning) {\n <a (click)=\"resolveError(property)\">\n <fa-icon class=\"pr-2\" [icon]=\"faCheck\" />\n <span>Resolved</span>\n </a>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #propertyMap let-property>\n @if (showMap()) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 w-100 | properties-container--title\"\n (click)=\"mapVisible.set(!mapVisible())\"\n pointer\n [class.is-open]=\"mapVisible()\">\n <span class=\"is-size-6\">View on Map</span>\n <fa-icon [icon]=\"mapVisible() ? faMinus : faPlus\" />\n </div>\n @if (mapVisible()) {\n <he-sites-maps [sites]=\"[node()]\" [showNotice]=\"false\" />\n }\n </div>\n }\n</ng-template>\n", styles: [".notification{color:#0a0a0a!important}.notification.is-success{background-color:#d5f3d8}.notification.is-success *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-success>fa-icon{color:#48c78e}.notification.is-info{background-color:#d3ebed}.notification.is-info *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-info>fa-icon{color:#249da5}.notification.is-warning{background-color:#ffdec0}.notification.is-warning *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-warning>fa-icon{color:#ff881b}.notification.is-danger{background-color:#ffcdd0}.notification.is-danger *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-danger>fa-icon{color:#f14668}he-sites-maps{height:200px}.external-link{color:#4c7194}.files-form-container{box-shadow:2px 2px 4px #00000029;background-color:#fff}.files-form-header{padding:10px 12px;background-color:#dbe3ea;border-top-left-radius:3px;border-top-right-radius:3px}.properties-container--title,.property-container{padding:6px 12px}.property-container{flex:none;flex-grow:1;min-width:50%;max-width:100%;border:1px solid #f5f5f5}.property-container.is-error-danger{border-color:#f14668}.property-container.is-error-warning{border-color:#ff881b}.properties-container--title{border-top:1px solid #dbe3ea;border-bottom:1px solid #dbe3ea;background:#f5f7f9}.properties-container .properties-container{border-radius:6px;border:1px solid #dbe3ea;margin:4px 0}.properties-container .properties-container--title{border-top:none}.property-key,.property-value{word-break:break-word}.property-array-container{border-radius:6px;border:1px solid #dbdbdb}.property-array-number .number-tags{border:1px solid #249da5;border-radius:50%;width:20px;height:20px}.property-array-number .number-tags .number-tag{color:#249da5}.copy-button{visibility:hidden}.field-container:hover .copy-button{visibility:visible}.is-group-error-danger{background-color:#ffcdd0}.is-group-error-warning{background-color:#ffdec0}.property-error.is-error-danger{background-color:#ffeced}.field-container+.property-error.is-error-danger{background-color:transparent;color:#e13939!important}.property-error.is-error-warning{background-color:#fff5ec}.field-container+.property-error.is-error-warning{background-color:transparent;color:#ff881b!important}.property-error.is-error-danger svg-icon,.property-error.is-error-danger fa-icon,.property-error.is-error-warning svg-icon,.property-error.is-error-warning fa-icon{width:24px}::ng-deep .property-tooltip{background-color:#fff;color:#0a0a0a;border:1px solid #dbdbdb;z-index:11;max-width:30vw}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: NodeIconComponent, selector: "he-node-icon", inputs: ["type", "size"] }, { kind: "component", type: SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "zoom", "showNotice"] }, { kind: "component", type: SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "component", type: ClipboardComponent, selector: "he-clipboard", inputs: ["icon", "value", "disabled", "hideText", "size", "rotate", "clipboardClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
135
108
|
}
|
|
136
109
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: FilesFormComponent, decorators: [{
|
|
137
110
|
type: Component,
|
|
@@ -149,6 +122,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
149
122
|
SitesMapsComponent,
|
|
150
123
|
SvgIconComponent,
|
|
151
124
|
ClipboardComponent
|
|
152
|
-
], template: "<div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch | files-form-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-align-items-center is-align-self-stretch is-gap-16 px-4 py-2 has-text-secondary | files-form-header\"\n (click)=\"isOpen.set(!isOpen())\"\n pointer>\n <div class=\"is-flex is-gap-8 is-align-items-center\">\n @if (nodeProperty()) {\n <he-node-icon [type]=\"schemaType()\" />\n <span class=\"has-text-weight-bold has-text-secondary is-size-5\">{{ schemaType() }}</span>\n @if (nodeProperty().hasError || hasError()) {\n <svg-icon name=\"far-times-circle\" class=\"has-text-danger is-flex is-align-items-center\" />\n <span class=\"has-text-danger has-text-weight-bold is-italic\">Error</span>\n } @else if (nodeProperty().hasWarning || hasWarning()) {\n <svg-icon name=\"exclamation-triangle\" class=\"has-text-warning is-flex is-align-items-center\" />\n <span class=\"has-text-warning has-text-weight-bold is-italic\">Warning</span>\n }\n }\n </div>\n <fa-icon [icon]=\"isOpen() ? faMinus : faPlus\" />\n </div>\n\n <div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch\">\n @if (isOpen()) {\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: nodeProperty() }\" />\n }\n @if (nodeProperty()?.error) {\n <ng-container\n *ngTemplateOutlet=\"\n propertyError;\n context: { property: nodeProperty(), edit: true, classes: 'is-my-1 is-px-3' }\n \" />\n }\n }\n\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (property of properties(); track trackByProperty($index, property)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: property }\" />\n }\n </div>\n\n @if (isOpen()) {\n <ng-container *ngTemplateOutlet=\"propertyMap; context: { $implicit: nodeProperty() }\" />\n }\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<ng-template #propertyKeyTooltip let-property=\"property\">\n <markdown [data]=\"property.schema.description\" />\n</ng-template>\n\n<ng-template #propertyKey let-property=\"property\">\n @if (property.schema?.description) {\n <span\n class=\"property-key trigger-popover\"\n [ngbTooltip]=\"propertyKeyTooltip\"\n [tooltipContext]=\"{ property }\"\n tooltipClass=\"property-tooltip\"\n placement=\"bottom-left\"\n container=\"body\">\n <span>{{ property.key }}</span>\n </span>\n } @else {\n <span>{{ property.key }}</span>\n }\n</ng-template>\n\n<ng-template #showProperty let-property>\n @if ((isOpen() || property.closedVisible) && !property.isHidden) {\n @if (property.properties.length) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 has-text-secondary w-100 | properties-container--title\"\n (click)=\"property.isOpen = !property.isOpen\"\n pointer\n [class.is-open]=\"property.isOpen\"\n [class.is-group-error-danger]=\"property.hasError\"\n [class.is-group-error-warning]=\"property.hasWarning\">\n <div class=\"is-flex is-gap-8 has-text-weight-bold\">\n <!-- @if (property.schemaType === SchemaType.Term) {\n <he-node-icon [type]=\"property.schemaType\" />\n } -->\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n </div>\n <fa-icon [icon]=\"property.isOpen ? faMinus : faPlus\" />\n </div>\n @if (property.isOpen) {\n @if (property.error) {\n <ng-container\n *ngTemplateOutlet=\"\n propertyError;\n context: { property: property, edit: true, classes: 'is-my-1 is-px-3' }\n \" />\n }\n @if (property.isArray) {\n <div class=\"py-2 px-3 w-100\">\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: property }\" />\n }\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n @if (prop2.key) {\n <div class=\"pt-2 my-4 | property-array-container\" [id]=\"prop2.fullKey + '_' + prop2.id\">\n <div class=\"property-array-number ml-2\">\n <div class=\"is-flex is-justify-content-center is-align-items-center has-addons number-tags\">\n <span class=\"number-tag\">{{ prop2.key }}</span>\n </div>\n </div>\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: prop2 }\" />\n }\n @if (prop2.error) {\n <ng-container\n *ngTemplateOutlet=\"\n propertyError;\n context: { property: prop2, edit: true, classes: 'is-my-1 is-px-3' }\n \" />\n }\n <div class=\"p-3\">\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop3 of prop2.properties; track trackByProperty($index, prop3)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop3 }\" />\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n } @else {\n @if (errorsEditable()) {\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: { $implicit: property }\" />\n }\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop2 }\" />\n }\n </div>\n }\n }\n </div>\n } @else {\n <div\n class=\"is-flex is-flex-direction-column is-gap-4 | property-container\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n <div\n class=\"is-flex is-flex-direction-row is-align-items-center is-justify-content-space-between is-gap-4 | field-container\">\n @if (property.key) {\n <div class=\"is-flex is-align-items-center is-flex-wrap-wrap is-gap-4\">\n <div class=\"is-flex has-text-secondary\">\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n <span>:</span>\n </div>\n\n <span class=\"is-flex is-size-7 | property-value\">\n {{ property.value }}\n </span>\n\n <div class=\"copy-button\">\n <he-clipboard [value]=\"property.value\" [hideText]=\"true\" [icon]=\"farClone\"></he-clipboard>\n </div>\n </div>\n\n <div class=\"is-flex is-gap-8\">\n @if (addErrorEnabled(property)) {\n <he-popover-confirm\n class=\"is-flex\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\">\n <fa-icon [icon]=\"faComments\" />\n </he-popover-confirm>\n }\n @if (property.externalUrl?.url) {\n <a\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{ 'is-info': property.key === 'type' }\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\">\n <fa-icon [icon]=\"property.externalUrl.icon || faExternalLinkAlt\" />\n </a>\n }\n </div>\n }\n </div>\n @if (property.hasError || property.hasWarning) {\n <ng-container *ngTemplateOutlet=\"propertyError; context: { property: property, edit: false }\" />\n }\n </div>\n }\n }\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\" let-classes=\"classes\">\n @if (property.error) {\n <div\n class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-items-center is-gap-8 is-size-6 is-m-0 w-100 has-text-grey {{\n classes\n }} | property-error\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n @if (property.hasError) {\n <fa-icon class=\"has-text-danger is-py-1\" [icon]=\"farCircleXmark\" size=\"xl\" />\n } @else {\n <svg-icon class=\"has-text-warning is-pt-1\" name=\"exclamation-triangle\" />\n }\n <div [innerHTML]=\"property.error.message\"></div>\n @if (property.error.index >= 0) {\n @if (edit && errorsEditable()) {\n <a (click)=\"editError(property)\">\n <fa-icon class=\"pr-2\" [icon]=\"faEdit\" />\n <span>Edit</span>\n </a>\n }\n @if (property.hasWarning || errorsEditable()) {\n <a (click)=\"resolveError(property)\">\n <fa-icon class=\"pr-2\" [icon]=\"faCheck\" />\n <span>Resolved</span>\n </a>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #propertyMap let-property>\n @if (showMap()) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 w-100 | properties-container--title\"\n (click)=\"mapVisible.set(!mapVisible())\"\n pointer\n [class.is-open]=\"mapVisible()\">\n <span class=\"is-size-6\">View on Map</span>\n <fa-icon [icon]=\"mapVisible() ? faMinus : faPlus\" />\n </div>\n @if (mapVisible()) {\n <he-sites-maps [sites]=\"[node()]\" [showNotice]=\"false\" />\n }\n </div>\n }\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n @if (property.newError) {\n <div class=\"field has-addons w-100 is-p-2 is-m-0\">\n <div class=\"control\">\n <div class=\"select is-small\">\n <select [(ngModel)]=\"property.newError.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\">\n <textarea\n class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"></textarea>\n </div>\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\">\n <fa-icon [icon]=\"faPlusCircle\" />\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #popupErrorForm let-data=\"data\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select\">\n <select [(ngModel)]=\"data.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <input class=\"input\" [(ngModel)]=\"data.message\" placeholder=\"Enter your message here\" />\n </div>\n </div>\n</ng-template>\n", styles: [".notification{color:#0a0a0a!important}.notification.is-success{background-color:#d5f3d8}.notification.is-success *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-success>fa-icon{color:#48c78e}.notification.is-info{background-color:#d3ebed}.notification.is-info *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-info>fa-icon{color:#249da5}.notification.is-warning{background-color:#ffdec0}.notification.is-warning *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-warning>fa-icon{color:#ff881b}.notification.is-danger{background-color:#ffcdd0}.notification.is-danger *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-danger>fa-icon{color:#f14668}he-sites-maps{height:200px}.files-form-container{box-shadow:2px 2px 4px #00000029;background-color:#fff}.files-form-header{padding:10px 12px;background-color:#dbe3ea;border-top-left-radius:3px;border-top-right-radius:3px}.properties-container--title,.property-container{padding:6px 12px}.property-container{flex:none;flex-grow:1;min-width:50%;max-width:100%;border:1px solid #f5f5f5}.property-container.is-error-danger{border-color:#f14668}.property-container.is-error-warning{border-color:#ff881b}.properties-container--title{border-top:1px solid #dbe3ea;border-bottom:1px solid #dbe3ea;background:#f5f7f9}.properties-container .properties-container{border-radius:6px;border:1px solid #dbe3ea;margin:4px 0}.properties-container .properties-container--title{border-top:none}.property-key,.property-value{word-break:break-word}.property-array-container{border-radius:6px;border:1px solid #dbdbdb}.property-array-number .number-tags{border:1px solid #249da5;border-radius:50%;width:20px;height:20px}.property-array-number .number-tags .number-tag{color:#249da5}.copy-button{visibility:hidden}.field-container:hover .copy-button{visibility:visible}.is-group-error-danger{background-color:#ffcdd0}.is-group-error-warning{background-color:#ffdec0}.property-error.is-error-danger{background-color:#ffeced}.field-container+.property-error.is-error-danger{background-color:transparent;color:#e13939!important}.property-error.is-error-warning{background-color:#fff5ec}.field-container+.property-error.is-error-warning{background-color:transparent;color:#ff881b!important}.property-error.is-error-danger svg-icon,.property-error.is-error-danger fa-icon,.property-error.is-error-warning svg-icon,.property-error.is-error-warning fa-icon{width:24px}::ng-deep .property-tooltip{background-color:#fff;color:#0a0a0a;border:1px solid #dbdbdb;z-index:11;max-width:30vw}\n"] }]
|
|
125
|
+
], template: "<div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch | files-form-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-align-items-center is-align-self-stretch is-gap-16 px-4 py-2 has-text-secondary | files-form-header\"\n (click)=\"isOpen.set(!isOpen())\"\n pointer>\n <div class=\"is-flex is-gap-8 is-align-items-center\">\n @if (nodeProperty()) {\n <he-node-icon [type]=\"schemaType()\" />\n <span class=\"has-text-weight-bold has-text-secondary is-size-5\">{{ schemaType() }}</span>\n @if (nodeProperty().hasError || hasError()) {\n <svg-icon name=\"far-times-circle\" class=\"has-text-danger is-flex is-align-items-center\" />\n <span class=\"has-text-danger has-text-weight-bold is-italic\">Error</span>\n } @else if (nodeProperty().hasWarning || hasWarning()) {\n <svg-icon name=\"exclamation-triangle\" class=\"has-text-warning is-flex is-align-items-center\" />\n <span class=\"has-text-warning has-text-weight-bold is-italic\">Warning</span>\n }\n }\n </div>\n <div class=\"is-flex is-flex-direction-row is-align-items-center is-gap-16\">\n @if (nodeUrl()) {\n <a class=\"external-link\" [href]=\"nodeUrl()\" target=\"_blank\">\n <span>View</span>\n <span class=\"is-pl-1\">{{ schemaType() }}</span>\n <fa-icon class=\"is-pl-2\" [icon]=\"faExternalLinkAlt\" />\n </a>\n }\n <fa-icon [icon]=\"isOpen() ? faMinus : faPlus\" />\n </div>\n </div>\n\n <div class=\"is-flex is-flex-direction-column is-align-items-flex-start is-align-self-stretch\">\n @if (isOpen()) {\n @if (nodeProperty()?.error) {\n <ng-container\n *ngTemplateOutlet=\"propertyError; context: { property: nodeProperty(), classes: 'is-my-1 is-px-3' }\" />\n }\n }\n\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (property of properties(); track trackByProperty($index, property)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: property }\" />\n }\n </div>\n\n @if (isOpen()) {\n <ng-container *ngTemplateOutlet=\"propertyMap; context: { $implicit: nodeProperty() }\" />\n }\n </div>\n\n <ng-content />\n</div>\n\n<ng-template #propertyKeyTooltip let-property=\"property\">\n <markdown [data]=\"property.schema.description\" />\n</ng-template>\n\n<ng-template #propertyKey let-property=\"property\">\n @if (property.schema?.description) {\n <span\n class=\"property-key trigger-popover\"\n [ngbTooltip]=\"propertyKeyTooltip\"\n [tooltipContext]=\"{ property }\"\n tooltipClass=\"property-tooltip\"\n placement=\"bottom-left\"\n container=\"body\">\n <span>{{ property.key }}</span>\n </span>\n } @else {\n <span>{{ property.key }}</span>\n }\n</ng-template>\n\n<ng-template #showProperty let-property>\n @if ((isOpen() || property.closedVisible) && !property.isHidden) {\n @if (property.properties.length) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 has-text-secondary w-100 | properties-container--title\"\n (click)=\"property.isOpen = !property.isOpen\"\n pointer\n [class.is-open]=\"property.isOpen\"\n [class.is-group-error-danger]=\"property.hasError\"\n [class.is-group-error-warning]=\"property.hasWarning\">\n <div class=\"is-flex is-gap-8 has-text-weight-bold\">\n <!-- @if (property.schemaType === SchemaType.Term) {\n <he-node-icon [type]=\"property.schemaType\" />\n } -->\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n </div>\n <fa-icon [icon]=\"property.isOpen ? faMinus : faPlus\" />\n </div>\n @if (property.isOpen) {\n @if (property.error) {\n <ng-container *ngTemplateOutlet=\"propertyError; context: { property, classes: 'is-my-1 is-px-3' }\" />\n }\n @if (property.isArray) {\n <div class=\"py-2 px-3 w-100\">\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n @if (prop2.key) {\n <div class=\"pt-2 my-4 | property-array-container\" [id]=\"prop2.fullKey + '_' + prop2.id\">\n <div class=\"property-array-number ml-2\">\n <div class=\"is-flex is-justify-content-center is-align-items-center has-addons number-tags\">\n <span class=\"number-tag\">{{ prop2.key }}</span>\n </div>\n </div>\n @if (prop2.error) {\n <ng-container\n *ngTemplateOutlet=\"propertyError; context: { property: prop2, classes: 'is-my-1 is-px-3' }\" />\n }\n <div class=\"p-3\">\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop3 of prop2.properties; track trackByProperty($index, prop3)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop3 }\" />\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-self-stretch\">\n @for (prop2 of property.properties; track trackByProperty($index, prop2)) {\n <ng-container *ngTemplateOutlet=\"showProperty; context: { $implicit: prop2 }\" />\n }\n </div>\n }\n }\n </div>\n } @else {\n <div\n class=\"is-flex is-flex-direction-column is-gap-4 | property-container\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n <div\n class=\"is-flex is-flex-direction-row is-align-items-center is-justify-content-space-between is-gap-4 | field-container\">\n @if (property.key) {\n <div class=\"is-flex is-align-items-center is-flex-wrap-wrap is-gap-4\">\n <div class=\"is-flex has-text-secondary\">\n <ng-container *ngTemplateOutlet=\"propertyKey; context: { property }\" />\n <span>:</span>\n </div>\n\n <span class=\"is-flex is-size-7 | property-value\">\n {{ property.value }}\n </span>\n\n <div class=\"copy-button\">\n <he-clipboard [value]=\"property.value\" [hideText]=\"true\" [icon]=\"farClone\"></he-clipboard>\n </div>\n </div>\n\n <div class=\"is-flex is-gap-8\">\n @if (property.externalUrl?.url) {\n <a\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{ 'is-info': property.key === 'type' }\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\">\n <fa-icon [icon]=\"property.externalUrl.icon || faExternalLinkAlt\" />\n </a>\n }\n </div>\n }\n </div>\n @if (property.hasError || property.hasWarning) {\n <ng-container *ngTemplateOutlet=\"propertyError; context: { property }\" />\n }\n </div>\n }\n }\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-classes=\"classes\">\n @if (property.error) {\n <div\n class=\"is-flex is-flex-direction-row is-flex-wrap-wrap is-align-items-center is-gap-8 is-size-6 is-m-0 w-100 has-text-grey {{\n classes\n }} | property-error\"\n [class.is-error-danger]=\"property.hasError\"\n [class.is-error-warning]=\"property.hasWarning\">\n @if (property.hasError) {\n <fa-icon class=\"has-text-danger is-py-1\" [icon]=\"farCircleXmark\" size=\"xl\" />\n } @else {\n <svg-icon class=\"has-text-warning is-pt-1\" name=\"exclamation-triangle\" />\n }\n <div [innerHTML]=\"property.error.message\"></div>\n @if (property.error.index >= 0) {\n @if (property.hasWarning) {\n <a (click)=\"resolveError(property)\">\n <fa-icon class=\"pr-2\" [icon]=\"faCheck\" />\n <span>Resolved</span>\n </a>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #propertyMap let-property>\n @if (showMap()) {\n <div class=\"is-flex is-flex-direction-column is-flex-wrap-wrap w-100 | properties-container\">\n <div\n class=\"is-flex is-flex-direction-row is-justify-content-space-between is-gap-4 w-100 | properties-container--title\"\n (click)=\"mapVisible.set(!mapVisible())\"\n pointer\n [class.is-open]=\"mapVisible()\">\n <span class=\"is-size-6\">View on Map</span>\n <fa-icon [icon]=\"mapVisible() ? faMinus : faPlus\" />\n </div>\n @if (mapVisible()) {\n <he-sites-maps [sites]=\"[node()]\" [showNotice]=\"false\" />\n }\n </div>\n }\n</ng-template>\n", styles: [".notification{color:#0a0a0a!important}.notification.is-success{background-color:#d5f3d8}.notification.is-success *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-success>fa-icon{color:#48c78e}.notification.is-info{background-color:#d3ebed}.notification.is-info *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-info>fa-icon{color:#249da5}.notification.is-warning{background-color:#ffdec0}.notification.is-warning *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-warning>fa-icon{color:#ff881b}.notification.is-danger{background-color:#ffcdd0}.notification.is-danger *:not(.button):not(.icon):not(.dropdown-item)>fa-icon,.notification.is-danger>fa-icon{color:#f14668}he-sites-maps{height:200px}.external-link{color:#4c7194}.files-form-container{box-shadow:2px 2px 4px #00000029;background-color:#fff}.files-form-header{padding:10px 12px;background-color:#dbe3ea;border-top-left-radius:3px;border-top-right-radius:3px}.properties-container--title,.property-container{padding:6px 12px}.property-container{flex:none;flex-grow:1;min-width:50%;max-width:100%;border:1px solid #f5f5f5}.property-container.is-error-danger{border-color:#f14668}.property-container.is-error-warning{border-color:#ff881b}.properties-container--title{border-top:1px solid #dbe3ea;border-bottom:1px solid #dbe3ea;background:#f5f7f9}.properties-container .properties-container{border-radius:6px;border:1px solid #dbe3ea;margin:4px 0}.properties-container .properties-container--title{border-top:none}.property-key,.property-value{word-break:break-word}.property-array-container{border-radius:6px;border:1px solid #dbdbdb}.property-array-number .number-tags{border:1px solid #249da5;border-radius:50%;width:20px;height:20px}.property-array-number .number-tags .number-tag{color:#249da5}.copy-button{visibility:hidden}.field-container:hover .copy-button{visibility:visible}.is-group-error-danger{background-color:#ffcdd0}.is-group-error-warning{background-color:#ffdec0}.property-error.is-error-danger{background-color:#ffeced}.field-container+.property-error.is-error-danger{background-color:transparent;color:#e13939!important}.property-error.is-error-warning{background-color:#fff5ec}.field-container+.property-error.is-error-warning{background-color:transparent;color:#ff881b!important}.property-error.is-error-danger svg-icon,.property-error.is-error-danger fa-icon,.property-error.is-error-warning svg-icon,.property-error.is-error-warning fa-icon{width:24px}::ng-deep .property-tooltip{background-color:#fff;color:#0a0a0a;border:1px solid #dbdbdb;z-index:11;max-width:30vw}\n"] }]
|
|
153
126
|
}] });
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTix1QkFBdUIsRUFDdkIsS0FBSyxFQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBc0IsVUFBVSxFQUFFLFFBQVEsRUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFlBQVksRUFDWixPQUFPLEVBQ1AsTUFBTSxFQUNOLE9BQU8sSUFBSSxRQUFRLEVBQ3BCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFp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QUcsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDcEMsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDM0IsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQzsrR0FqSVUsa0JBQWtCO21HQUFsQixrQkFBa0IsaXNCQ2hGL0IseXBZQXNTQSxpbEZEck9JLFdBQVcsMGdDQUNYLGdCQUFnQixvSkFDaEIsT0FBTyxvRkFDUCxlQUFlLDRNQUNmLGlCQUFpQixrYUFDakIsVUFBVSwyVEFDVixpQkFBaUIsbUZBR2pCLHVCQUF1QixtSkFDdkIsa0JBQWtCLG1IQUNsQixnQkFBZ0IsbUtBQ2hCLGtCQUFrQjs7NEZBR1Qsa0JBQWtCO2tCQXRCOUIsU0FBUzsrQkFDRSxlQUFlLG1CQUdSLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsbUJBQW1CO3dCQUNuQiwwQkFBMEI7d0JBQzFCLHVCQUF1Qjt3QkFDdkIsa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjtxQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIG91dHB1dCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgY29tcHV0ZWQsXG4gIHNpZ25hbCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIG1vZGVsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSlNPTiBhcyBIZXN0aWFKc29uLCBTY2hlbWFUeXBlLCBOb2RlVHlwZSwgU2l0ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGRlZmluaXRpb24gfSBmcm9tICdAaGVzdGlhLWVhcnRoL2pzb24tc2NoZW1hJztcbmltcG9ydCB7IEZhSWNvbkNvbXBvbmVudCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcbmltcG9ydCB7XG4gIGZhQ2hlY2ssXG4gIGZhQ29tbWVudHMsXG4gIGZhRWRpdCxcbiAgZmFFeHRlcm5hbExpbmtBbHQsXG4gIGZhUGx1c0NpcmNsZSxcbiAgZmFNaW51cyxcbiAgZmFQbHVzLFxuICBmYUNsb25lIGFzIGZhckNsb25lXG59IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBmYUNpcmNsZVhtYXJrIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtcmVndWxhci1zdmctaWNvbnMnO1xuaW1wb3J0IHsgTmdiVG9vbHRpcCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQgeyBTdmdJY29uQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhci1zdmctaWNvbic7XG5pbXBvcnQgeyBNYXJrZG93bkNvbXBvbmVudCB9IGZyb20gJ25neC1tYXJrZG93bic7XG5cbmltcG9ydCB7XG4gIElFcnJvclByb3BlcnR5LFxuICBJTm9kZVByb3BlcnR5LFxuICBmb3JtYXRQcm9wZXJ0eUVycm9yLFxuICBwcm9wZXJ0eUVycm9yLFxuICBoYXNFcnJvcixcbiAgaGFzV2FybmluZyxcbiAgcmVjdXJzaXZlUHJvcGVydGllcyxcbiAgcHJvcGVydHlJZCxcbiAgZ3JvdXBDaGFuZ2VkLFxuICBrZXlUb0RhdGFQYXRoLFxuICBmb3JtYXR0ZXJcbn0gZnJvbSAnLi4vZmlsZXMtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBlcnJvckhhc0Vycm9yLCBlcnJvckhhc1dhcm5pbmcsIGZpbHRlckVycm9yLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2ZpbGVzLWVycm9yLm1vZGVsJztcbmltcG9ydCB7IElWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi9zY2hlbWEvc2NoZW1hLXZhbGlkYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vcG9wb3Zlci1jb25maXJtL3BvcG92ZXItY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2NoZW1hVmVyc2lvbkxpbmtDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vc2NoZW1hLXZlcnNpb24tbGluay9zY2hlbWEtdmVyc2lvbi1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY2hlbWFJbmZvQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2NoZW1hL3NjaGVtYS1pbmZvL3NjaGVtYS1pbmZvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBIZVNjaGVtYVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zY2hlbWEvc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtaWNvbi9ub2RlLWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFNpdGVzTWFwc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NpdGVzL3NpdGVzLW1hcHMvc2l0ZXMtbWFwcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2xpcGJvYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuY29uc3Qgc3RyaW5naWZ5ID0gKHZhbHVlOiBhbnkpID0+IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtZmlsZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlcy1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZXMtZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTmdDbGFzcyxcbiAgICBGYUljb25Db21wb25lbnQsXG4gICAgTWFya2Rvd25Db21wb25lbnQsXG4gICAgTmdiVG9vbHRpcCxcbiAgICBOb2RlSWNvbkNvbXBvbmVudCxcbiAgICBTY2hlbWFJbmZvQ29tcG9uZW50LFxuICAgIFNjaGVtYVZlcnNpb25MaW5rQ29tcG9uZW50LFxuICAgIFBvcG92ZXJDb25maXJtQ29tcG9uZW50LFxuICAgIFNpdGVzTWFwc0NvbXBvbmVudCxcbiAgICBTdmdJY29uQ29tcG9uZW50LFxuICAgIENsaXBib2FyZENvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVzRm9ybUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBRdWVyeSB0aGUgY29udGVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hU2VydmljZSA9IGluamVjdChIZVNjaGVtYVNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmYU1pbnVzID0gZmFNaW51cztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhUGx1cyA9IGZhUGx1cztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhUGx1c0NpcmNsZSA9IGZhUGx1c0NpcmNsZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhckNpcmNsZVhtYXJrID0gZmFDaXJjbGVYbWFyaztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhQ29tbWVudHMgPSBmYUNvbW1lbnRzO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFFeHRlcm5hbExpbmtBbHQgPSBmYUV4dGVybmFsTGlua0FsdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRWRpdCA9IGZhRWRpdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhQ2hlY2sgPSBmYUNoZWNrO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFyQ2xvbmUgPSBmYXJDbG9uZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuID0gbW9kZWwodHJ1ZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlID0gaW5wdXQucmVxdWlyZWQ8SGVzdGlhSnNvbjxTY2hlbWFUeXBlPj4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVycm9ycyA9IGlucHV0PElWYWxpZGF0aW9uRXJyb3JbXT4oW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXJyb3JzRWRpdGFibGUgPSBpbnB1dChmYWxzZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWFzID0gdG9TaWduYWwodGhpcy5zY2hlbWFTZXJ2aWNlLnNjaGVtYXMkKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNjaGVtYVR5cGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vZGUoKT8udHlwZSB8fCB0aGlzLm5vZGUoKT8uWydAdHlwZSddKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWEgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNjaGVtYXMoKT8uW3RoaXMuc2NoZW1hVHlwZSgpXSA/PyAoe30gYXMgZGVmaW5pdGlvbikpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlRXJvcnJSZXNvbHZlZCA9IG91dHB1dDxudW1iZXI+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlRXJyb3JBZGRlZCA9IG91dHB1dDxJVmFsaWRhdGlvbkVycm9yPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBOb2RlVHlwZSA9IE5vZGVUeXBlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgU2NoZW1hVHlwZSA9IFNjaGVtYVR5cGU7XG4gIHByb3RlY3RlZCByZWFkb25seSBmb3JtYXRQcm9wZXJ0eUVycm9yID0gZm9ybWF0UHJvcGVydHlFcnJvcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmluZ2lmeSA9IHN0cmluZ2lmeTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWFwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dNYXAgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgW1NjaGVtYVR5cGUuU2l0ZSwgU2NoZW1hVHlwZS5PcmdhbmlzYXRpb25dLmluY2x1ZGVzKHRoaXMuc2NoZW1hVHlwZSgpKSAmJlxuICAgICAgW1xuICAgICAgICAodGhpcy5ub2RlKCkgYXMgU2l0ZSkubGF0aXR1ZGUgJiYgKHRoaXMubm9kZSgpIGFzIFNpdGUpLmxvbmdpdHVkZSxcbiAgICAgICAgKHRoaXMubm9kZSgpIGFzIFNpdGUpLnJlZ2lvbj8ubmFtZSxcbiAgICAgICAgKHRoaXMubm9kZSgpIGFzIFNpdGUpLmNvdW50cnk/Lm5hbWVcbiAgICAgIF0uc29tZShCb29sZWFuKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyZWRFcnJvcnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmVycm9ycygpLmZpbHRlcihmaWx0ZXJFcnJvcikpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVFcnJvciA9IGNvbXB1dGVkKCgpID0+IHByb3BlcnR5RXJyb3IodGhpcy5maWx0ZXJlZEVycm9ycygpKSgnJykpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlUHJvcGVydHkgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuc2NoZW1hKClcbiAgICAgID8ge1xuICAgICAgICAgIGlkOiBwcm9wZXJ0eUlkKCksXG4gICAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSgpLFxuICAgICAgICAgIHNjaGVtYVR5cGU6IHRoaXMuc2NoZW1hVHlwZSgpLFxuICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBmdWxsS2V5OiAnJyxcbiAgICAgICAgICBrZXk6ICcnLFxuICAgICAgICAgIHZhbHVlOiB7fSxcbiAgICAgICAgICBlcnJvcjogZm9ybWF0RXJyb3IodGhpcy5ub2RlRXJyb3IoKSksXG4gICAgICAgICAgaGFzRXJyb3I6IGVycm9ySGFzRXJyb3IodGhpcy5ub2RlRXJyb3IoKSksXG4gICAgICAgICAgaGFzV2FybmluZzogZXJyb3JIYXNXYXJuaW5nKHRoaXMubm9kZUVycm9yKCkpLFxuICAgICAgICAgIHN1Z2dlc3Rpb25zOiB7fSxcbiAgICAgICAgICBuZXdQcm9wZXJ0eToge30sXG4gICAgICAgICAgbmV3RXJyb3I6IHsgbGV2ZWw6ICd3YXJuaW5nJyB9LFxuICAgICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICAgIGFkZFByb3BlcnR5RW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoJycpXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb3BlcnRpZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIFshaXNVbmRlZmluZWQodGhpcy5zY2hlbWFzKCkpLCAhaXNVbmRlZmluZWQodGhpcy5ub2RlKCkpXS5ldmVyeShCb29sZWFuKVxuICAgICAgPyByZWN1cnNpdmVQcm9wZXJ0aWVzKHRoaXMuc2NoZW1hcygpLCB0aGlzLmZpbHRlcmVkRXJyb3JzKCksIHRoaXMuc2NoZW1hKCksIGZhbHNlKSh0aGlzLm5vZGUoKSlcbiAgICAgIDogW11cbiAgKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzRXJyb3IgPSBjb21wdXRlZCgoKSA9PiBoYXNFcnJvcih0aGlzLnByb3BlcnRpZXMoKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzV2FybmluZyA9IGNvbXB1dGVkKCgpID0+IGhhc1dhcm5pbmcodGhpcy5wcm9wZXJ0aWVzKCkpKTtcblxuICBwcm90ZWN0ZWQgdHJhY2tCeVByb3BlcnR5KF9pbmRleDogbnVtYmVyLCB7IGlkLCBmdWxsS2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gW2Z1bGxLZXksIGlkXS5qb2luKCdfJyk7XG4gIH1cblxuICAvLyAtLS0gRXJyb3JzXG5cbiAgcHJvdGVjdGVkIGFkZEVycm9yRW5hYmxlZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmVycm9yc0VkaXRhYmxlKCkgJiYgIXByb3BlcnR5Lmhhc0Vycm9yICYmICFwcm9wZXJ0eS5oYXNXYXJuaW5nO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5LCB7IG1lc3NhZ2UsIGxldmVsIH06IElFcnJvclByb3BlcnR5KSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBwcm9wZXJ0eS5mdWxsS2V5LnNwbGl0KCcuJyk7XG4gICAga2V5cy5wb3AoKTtcbiAgICBjb25zdCBlcnJvcjogSVZhbGlkYXRpb25FcnJvciA9IHByb3BlcnR5LmlzQWRkZWRcbiAgICAgID8ge1xuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWw6IGxldmVsIHx8ICdlcnJvcicsXG4gICAgICAgICAgZGF0YVBhdGg6IGtleVRvRGF0YVBhdGgoa2V5cy5qb2luKCcuJykpLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWlzc2luZ1Byb3BlcnR5OiBwcm9wZXJ0eS5rZXlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWw6IGxldmVsIHx8ICdlcnJvcicsXG4gICAgICAgICAgZGF0YVBhdGg6IGtleVRvRGF0YVBhdGgocHJvcGVydHkuZnVsbEtleSlcbiAgICAgICAgfTtcbiAgICBwcm9wZXJ0eS5uZXdFcnJvciA9IHsgbGV2ZWw6ICd3YXJuaW5nJyB9O1xuICAgIHByb3BlcnR5LmVycm9yID0gZXJyb3I7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBlcnJvckhhc0Vycm9yKGVycm9yKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gZXJyb3JIYXNXYXJuaW5nKGVycm9yKTtcbiAgICB0aGlzLm5vZGVFcnJvckFkZGVkLmVtaXQoZXJyb3IpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVkaXRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHByb3BlcnR5Lm5ld0Vycm9yID0gcHJvcGVydHkuZXJyb3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0eS5lcnJvcj8uaW5kZXg7XG4gICAgcHJvcGVydHkuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBoYXNFcnJvcihwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gaGFzV2FybmluZyhwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICB0aGlzLm5vZGVFcm9yclJlc29sdmVkLmVtaXQoaW5kZXgpO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzKCksIHByb3BlcnR5LmZ1bGxLZXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtYWxpZ24taXRlbXMtZmxleC1zdGFydCBpcy1hbGlnbi1zZWxmLXN0cmV0Y2ggfCBmaWxlcy1mb3JtLWNvbnRhaW5lclwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJpcy1mbGV4IGlzLWZsZXgtZGlyZWN0aW9uLXJvdyBpcy1qdXN0aWZ5LWNvbnRlbnQtc3BhY2UtYmV0d2VlbiBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtYWxpZ24tc2VsZi1zdHJldGNoIGlzLWdhcC0xNiBweC00IHB5LTIgaGFzLXRleHQtc2Vjb25kYXJ5IHwgZmlsZXMtZm9ybS1oZWFkZXJcIlxuICAgIChjbGljayk9XCJpc09wZW4uc2V0KCFpc09wZW4oKSlcIlxuICAgIHBvaW50ZXI+XG4gICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZ2FwLTggaXMtYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICBAaWYgKG5vZGVQcm9wZXJ0eSgpKSB7XG4gICAgICAgIDxoZS1ub2RlLWljb24gW3R5cGVdPVwic2NoZW1hVHlwZSgpXCIgLz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtYm9sZCBoYXMtdGV4dC1zZWNvbmRhcnkgaXMtc2l6ZS01XCI+e3sgc2NoZW1hVHlwZSgpIH19PC9zcGFuPlxuICAgICAgICBAaWYgKG5vZGVQcm9wZXJ0eSgpLmhhc0Vycm9yIHx8IGhhc0Vycm9yKCkpIHtcbiAgICAgICAgICA8c3ZnLWljb24gbmFtZT1cImZhci10aW1lcy1jaXJjbGVcIiBjbGFzcz1cImhhcy10ZXh0LWRhbmdlciBpcy1mbGV4IGlzLWFsaWduLWl0ZW1zLWNlbnRlclwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC1kYW5nZXIgaGFzLXRleHQtd2VpZ2h0LWJvbGQgaXMtaXRhbGljXCI+RXJyb3I8L3NwYW4+XG4gICAgICAgIH0gQGVsc2UgaWYgKG5vZGVQcm9wZXJ0eSgpLmhhc1dhcm5pbmcgfHwgaGFzV2FybmluZygpKSB7XG4gICAgICAgICAgPHN2Zy1pY29uIG5hbWU9XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiIGNsYXNzPVwiaGFzLXRleHQtd2FybmluZyBpcy1mbGV4IGlzLWFsaWduLWl0ZW1zLWNlbnRlclwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13YXJuaW5nIGhhcy10ZXh0LXdlaWdodC1ib2xkIGlzLWl0YWxpY1wiPldhcm5pbmc8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZmEtaWNvbiBbaWNvbl09XCJpc09wZW4oKSA/IGZhTWludXMgOiBmYVBsdXNcIiAvPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtYWxpZ24taXRlbXMtZmxleC1zdGFydCBpcy1hbGlnbi1zZWxmLXN0cmV0Y2hcIj5cbiAgICBAaWYgKGlzT3BlbigpKSB7XG4gICAgICBAaWYgKGVycm9yc0VkaXRhYmxlKCkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBub2RlUHJvcGVydHkoKSB9XCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAobm9kZVByb3BlcnR5KCk/LmVycm9yKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgcHJvcGVydHlFcnJvcjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgcHJvcGVydHk6IG5vZGVQcm9wZXJ0eSgpLCBlZGl0OiB0cnVlLCBjbGFzc2VzOiAnaXMtbXktMSBpcy1weC0zJyB9XG4gICAgICAgICAgXCIgLz5cbiAgICAgIH1cbiAgICB9XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1yb3cgaXMtZmxleC13cmFwLXdyYXAgaXMtYWxpZ24tc2VsZi1zdHJldGNoXCI+XG4gICAgICBAZm9yIChwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKCk7IHRyYWNrIHRyYWNrQnlQcm9wZXJ0eSgkaW5kZXgsIHByb3BlcnR5KSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd1Byb3BlcnR5OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcHJvcGVydHkgfVwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGlzT3BlbigpKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlNYXA7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBub2RlUHJvcGVydHkoKSB9XCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5S2V5VG9vbHRpcCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiPlxuICA8bWFya2Rvd24gW2RhdGFdPVwicHJvcGVydHkuc2NoZW1hLmRlc2NyaXB0aW9uXCIgLz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcHJvcGVydHlLZXkgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIj5cbiAgQGlmIChwcm9wZXJ0eS5zY2hlbWE/LmRlc2NyaXB0aW9uKSB7XG4gICAgPHNwYW5cbiAgICAgIGNsYXNzPVwicHJvcGVydHkta2V5IHRyaWdnZXItcG9wb3ZlclwiXG4gICAgICBbbmdiVG9vbHRpcF09XCJwcm9wZXJ0eUtleVRvb2x0aXBcIlxuICAgICAgW3Rvb2x0aXBDb250ZXh0XT1cInsgcHJvcGVydHkgfVwiXG4gICAgICB0b29sdGlwQ2xhc3M9XCJwcm9wZXJ0eS10b29sdGlwXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIGNvbnRhaW5lcj1cImJvZHlcIj5cbiAgICAgIDxzcGFuPnt7IHByb3BlcnR5LmtleSB9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gIH0gQGVsc2Uge1xuICAgIDxzcGFuPnt7IHByb3BlcnR5LmtleSB9fTwvc3Bhbj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzaG93UHJvcGVydHkgbGV0LXByb3BlcnR5PlxuICBAaWYgKChpc09wZW4oKSB8fCBwcm9wZXJ0eS5jbG9zZWRWaXNpYmxlKSAmJiAhcHJvcGVydHkuaXNIaWRkZW4pIHtcbiAgICBAaWYgKHByb3BlcnR5LnByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtZmxleC13cmFwLXdyYXAgdy0xMDAgfCBwcm9wZXJ0aWVzLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpcy1mbGV4IGlzLWZsZXgtZGlyZWN0aW9uLXJvdyBpcy1qdXN0aWZ5LWNvbnRlbnQtc3BhY2UtYmV0d2VlbiBpcy1nYXAtNCBoYXMtdGV4dC1zZWNvbmRhcnkgdy0xMDAgfCBwcm9wZXJ0aWVzLWNvbnRhaW5lci0tdGl0bGVcIlxuICAgICAgICAgIChjbGljayk9XCJwcm9wZXJ0eS5pc09wZW4gPSAhcHJvcGVydHkuaXNPcGVuXCJcbiAgICAgICAgICBwb2ludGVyXG4gICAgICAgICAgW2NsYXNzLmlzLW9wZW5dPVwicHJvcGVydHkuaXNPcGVuXCJcbiAgICAgICAgICBbY2xhc3MuaXMtZ3JvdXAtZXJyb3ItZGFuZ2VyXT1cInByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgICAgICBbY2xhc3MuaXMtZ3JvdXAtZXJyb3Itd2FybmluZ109XCJwcm9wZXJ0eS5oYXNXYXJuaW5nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZ2FwLTggaGFzLXRleHQtd2VpZ2h0LWJvbGRcIj5cbiAgICAgICAgICAgIDwhLS0gQGlmIChwcm9wZXJ0eS5zY2hlbWFUeXBlID09PSBTY2hlbWFUeXBlLlRlcm0pIHtcbiAgICAgICAgICAgICAgPGhlLW5vZGUtaWNvbiBbdHlwZV09XCJwcm9wZXJ0eS5zY2hlbWFUeXBlXCIgLz5cbiAgICAgICAgICAgIH0gLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlLZXk7IGNvbnRleHQ6IHsgcHJvcGVydHkgfVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwicHJvcGVydHkuaXNPcGVuID8gZmFNaW51cyA6IGZhUGx1c1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKHByb3BlcnR5LmlzT3Blbikge1xuICAgICAgICAgIEBpZiAocHJvcGVydHkuZXJyb3IpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCBlZGl0OiB0cnVlLCBjbGFzc2VzOiAnaXMtbXktMSBpcy1weC0zJyB9XG4gICAgICAgICAgICAgIFwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAocHJvcGVydHkuaXNBcnJheSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTIgcHgtMyB3LTEwMFwiPlxuICAgICAgICAgICAgICBAaWYgKGVycm9yc0VkaXRhYmxlKCkpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHByb3BlcnR5IH1cIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBmb3IgKHByb3AyIG9mIHByb3BlcnR5LnByb3BlcnRpZXM7IHRyYWNrIHRyYWNrQnlQcm9wZXJ0eSgkaW5kZXgsIHByb3AyKSkge1xuICAgICAgICAgICAgICAgIEBpZiAocHJvcDIua2V5KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMiBteS00IHwgcHJvcGVydHktYXJyYXktY29udGFpbmVyXCIgW2lkXT1cInByb3AyLmZ1bGxLZXkgKyAnXycgKyBwcm9wMi5pZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktYXJyYXktbnVtYmVyIG1sLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGlzLWFsaWduLWl0ZW1zLWNlbnRlciBoYXMtYWRkb25zIG51bWJlci10YWdzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm51bWJlci10YWdcIj57eyBwcm9wMi5rZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGVycm9yc0VkaXRhYmxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHByb3AyIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAocHJvcDIuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wMiwgZWRpdDogdHJ1ZSwgY2xhc3NlczogJ2lzLW15LTEgaXMtcHgtMycgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWZsZXgtd3JhcC13cmFwIGlzLWFsaWduLXNlbGYtc3RyZXRjaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAocHJvcDMgb2YgcHJvcDIucHJvcGVydGllczsgdHJhY2sgdHJhY2tCeVByb3BlcnR5KCRpbmRleCwgcHJvcDMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBwcm9wMyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGlmIChlcnJvcnNFZGl0YWJsZSgpKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcHJvcGVydHkgfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1yb3cgaXMtZmxleC13cmFwLXdyYXAgaXMtYWxpZ24tc2VsZi1zdHJldGNoXCI+XG4gICAgICAgICAgICAgIEBmb3IgKHByb3AyIG9mIHByb3BlcnR5LnByb3BlcnRpZXM7IHRyYWNrIHRyYWNrQnlQcm9wZXJ0eSgkaW5kZXgsIHByb3AyKSkge1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBwcm9wMiB9XCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpcy1mbGV4IGlzLWZsZXgtZGlyZWN0aW9uLWNvbHVtbiBpcy1nYXAtNCB8IHByb3BlcnR5LWNvbnRhaW5lclwiXG4gICAgICAgIFtjbGFzcy5pcy1lcnJvci1kYW5nZXJdPVwicHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgICBbY2xhc3MuaXMtZXJyb3Itd2FybmluZ109XCJwcm9wZXJ0eS5oYXNXYXJuaW5nXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWFsaWduLWl0ZW1zLWNlbnRlciBpcy1qdXN0aWZ5LWNvbnRlbnQtc3BhY2UtYmV0d2VlbiBpcy1nYXAtNCB8IGZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgIEBpZiAocHJvcGVydHkua2V5KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtZmxleC13cmFwLXdyYXAgaXMtZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaGFzLXRleHQtc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5S2V5OyBjb250ZXh0OiB7IHByb3BlcnR5IH1cIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjo8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtZmxleCBpcy1zaXplLTcgfCBwcm9wZXJ0eS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgIHt7IHByb3BlcnR5LnZhbHVlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29weS1idXR0b25cIj5cbiAgICAgICAgICAgICAgICA8aGUtY2xpcGJvYXJkIFt2YWx1ZV09XCJwcm9wZXJ0eS52YWx1ZVwiIFtoaWRlVGV4dF09XCJ0cnVlXCIgW2ljb25dPVwiZmFyQ2xvbmVcIj48L2hlLWNsaXBib2FyZD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZ2FwLThcIj5cbiAgICAgICAgICAgICAgQGlmIChhZGRFcnJvckVuYWJsZWQocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgPGhlLXBvcG92ZXItY29uZmlybVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1mbGV4XCJcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICBbY29udGVudF09XCJwb3B1cEVycm9yRm9ybVwiXG4gICAgICAgICAgICAgICAgICAoY29uZmlybWVkKT1cImFkZEVycm9yKHByb3BlcnR5LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYUNvbW1lbnRzXCIgLz5cbiAgICAgICAgICAgICAgICA8L2hlLXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHByb3BlcnR5LmV4dGVybmFsVXJsPy51cmwpIHtcbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgW2hyZWZdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsICsgKHByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgPyBwcm9wZXJ0eS52YWx1ZSA6ICcnKVwiXG4gICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWluZm8nOiBwcm9wZXJ0eS5rZXkgPT09ICd0eXBlJyB9XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgJiYgIXByb3BlcnR5LnZhbHVlID8gdHJ1ZSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLmljb24gfHwgZmFFeHRlcm5hbExpbmtBbHRcIiAvPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChwcm9wZXJ0eS5oYXNFcnJvciB8fCBwcm9wZXJ0eS5oYXNXYXJuaW5nKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCBlZGl0OiBmYWxzZSB9XCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5RXJyb3IgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtZWRpdD1cImVkaXRcIiBsZXQtY2xhc3Nlcz1cImNsYXNzZXNcIj5cbiAgQGlmIChwcm9wZXJ0eS5lcnJvcikge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1yb3cgaXMtZmxleC13cmFwLXdyYXAgaXMtYWxpZ24taXRlbXMtY2VudGVyIGlzLWdhcC04IGlzLXNpemUtNiBpcy1tLTAgdy0xMDAgaGFzLXRleHQtZ3JleSB7e1xuICAgICAgICBjbGFzc2VzXG4gICAgICB9fSB8IHByb3BlcnR5LWVycm9yXCJcbiAgICAgIFtjbGFzcy5pcy1lcnJvci1kYW5nZXJdPVwicHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmlzLWVycm9yLXdhcm5pbmddPVwicHJvcGVydHkuaGFzV2FybmluZ1wiPlxuICAgICAgQGlmIChwcm9wZXJ0eS5oYXNFcnJvcikge1xuICAgICAgICA8ZmEtaWNvbiBjbGFzcz1cImhhcy10ZXh0LWRhbmdlciBpcy1weS0xXCIgW2ljb25dPVwiZmFyQ2lyY2xlWG1hcmtcIiBzaXplPVwieGxcIiAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzdmctaWNvbiBjbGFzcz1cImhhcy10ZXh0LXdhcm5pbmcgaXMtcHQtMVwiIG5hbWU9XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiIC8+XG4gICAgICB9XG4gICAgICA8ZGl2IFtpbm5lckhUTUxdPVwicHJvcGVydHkuZXJyb3IubWVzc2FnZVwiPjwvZGl2PlxuICAgICAgQGlmIChwcm9wZXJ0eS5lcnJvci5pbmRleCA+PSAwKSB7XG4gICAgICAgIEBpZiAoZWRpdCAmJiBlcnJvcnNFZGl0YWJsZSgpKSB7XG4gICAgICAgICAgPGEgKGNsaWNrKT1cImVkaXRFcnJvcihwcm9wZXJ0eSlcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIGNsYXNzPVwicHItMlwiIFtpY29uXT1cImZhRWRpdFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5FZGl0PC9zcGFuPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHByb3BlcnR5Lmhhc1dhcm5pbmcgfHwgZXJyb3JzRWRpdGFibGUoKSkge1xuICAgICAgICAgIDxhIChjbGljayk9XCJyZXNvbHZlRXJyb3IocHJvcGVydHkpXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBbaWNvbl09XCJmYUNoZWNrXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlJlc29sdmVkPC9zcGFuPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5TWFwIGxldC1wcm9wZXJ0eT5cbiAgQGlmIChzaG93TWFwKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtZmxleC13cmFwLXdyYXAgdy0xMDAgfCBwcm9wZXJ0aWVzLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWp1c3RpZnktY29udGVudC1zcGFjZS1iZXR3ZWVuIGlzLWdhcC00IHctMTAwIHwgcHJvcGVydGllcy1jb250YWluZXItLXRpdGxlXCJcbiAgICAgICAgKGNsaWNrKT1cIm1hcFZpc2libGUuc2V0KCFtYXBWaXNpYmxlKCkpXCJcbiAgICAgICAgcG9pbnRlclxuICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJtYXBWaXNpYmxlKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1zaXplLTZcIj5WaWV3IG9uIE1hcDwvc3Bhbj5cbiAgICAgICAgPGZhLWljb24gW2ljb25dPVwibWFwVmlzaWJsZSgpID8gZmFNaW51cyA6IGZhUGx1c1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAobWFwVmlzaWJsZSgpKSB7XG4gICAgICAgIDxoZS1zaXRlcy1tYXBzIFtzaXRlc109XCJbbm9kZSgpXVwiIFtzaG93Tm90aWNlXT1cImZhbHNlXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub2RlRXJyb3JGb3JtIGxldC1wcm9wZXJ0eT5cbiAgQGlmIChwcm9wZXJ0eS5uZXdFcnJvcikge1xuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zIHctMTAwIGlzLXAtMiBpcy1tLTBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGxcIj5cbiAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwicHJvcGVydHkubmV3RXJyb3IubGV2ZWxcIj5cbiAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPlNlbGVjdCBMZXZlbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+RXJyb3I8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuaW5nXCI+V2FybmluZzwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWRcIj5cbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0YXJlYSBpcy1zbWFsbFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdFcnJvci5tZXNzYWdlXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbWVzc2FnZSBoZXJlXCJcbiAgICAgICAgICByb3dzPVwiMVwiPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFwcm9wZXJ0eS5uZXdFcnJvci5sZXZlbCB8fCAhcHJvcGVydHkubmV3RXJyb3IubWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZEVycm9yKHByb3BlcnR5LCBwcm9wZXJ0eS5uZXdFcnJvcilcIj5cbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYVBsdXNDaXJjbGVcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkFkZDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwb3B1cEVycm9yRm9ybSBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdFwiPlxuICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwiZGF0YS5sZXZlbFwiPlxuICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPlNlbGVjdCBMZXZlbDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJlcnJvclwiPkVycm9yPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndhcm5pbmdcIj5XYXJuaW5nPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgWyhuZ01vZGVsKV09XCJkYXRhLm1lc3NhZ2VcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbWVzc2FnZSBoZXJlXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTix1QkFBdUIsRUFDdkIsS0FBSyxFQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBc0IsVUFBVSxFQUFFLFFBQVEsRUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFlBQVksRUFDWixPQUFPLEVBQ1AsTUFBTSxFQUNOLE9BQU8sSUFBSSxRQUFRLEVBQ3BCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFp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QVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsbUJBQW1CO3dCQUNuQiwwQkFBMEI7d0JBQzFCLHVCQUF1Qjt3QkFDdkIsa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjtxQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIG91dHB1dCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgY29tcHV0ZWQsXG4gIHNpZ25hbCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIG1vZGVsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSlNPTiBhcyBIZXN0aWFKc29uLCBTY2hlbWFUeXBlLCBOb2RlVHlwZSwgU2l0ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGRlZmluaXRpb24gfSBmcm9tICdAaGVzdGlhLWVhcnRoL2pzb24tc2NoZW1hJztcbmltcG9ydCB7IEZhSWNvbkNvbXBvbmVudCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcbmltcG9ydCB7XG4gIGZhQ2hlY2ssXG4gIGZhQ29tbWVudHMsXG4gIGZhRWRpdCxcbiAgZmFFeHRlcm5hbExpbmtBbHQsXG4gIGZhUGx1c0NpcmNsZSxcbiAgZmFNaW51cyxcbiAgZmFQbHVzLFxuICBmYUNsb25lIGFzIGZhckNsb25lXG59IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBmYUNpcmNsZVhtYXJrIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtcmVndWxhci1zdmctaWNvbnMnO1xuaW1wb3J0IHsgTmdiVG9vbHRpcCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQgeyBTdmdJY29uQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhci1zdmctaWNvbic7XG5pbXBvcnQgeyBNYXJrZG93bkNvbXBvbmVudCB9IGZyb20gJ25neC1tYXJrZG93bic7XG5cbmltcG9ydCB7XG4gIElOb2RlUHJvcGVydHksXG4gIGZvcm1hdFByb3BlcnR5RXJyb3IsXG4gIHByb3BlcnR5RXJyb3IsXG4gIGhhc0Vycm9yLFxuICBoYXNXYXJuaW5nLFxuICByZWN1cnNpdmVQcm9wZXJ0aWVzLFxuICBwcm9wZXJ0eUlkLFxuICBncm91cENoYW5nZWQsXG4gIGZvcm1hdHRlclxufSBmcm9tICcuLi9maWxlcy1mb3JtLm1vZGVsJztcbmltcG9ydCB7IGVycm9ySGFzRXJyb3IsIGVycm9ySGFzV2FybmluZywgZmlsdGVyRXJyb3IsIGZvcm1hdEVycm9yIH0gZnJvbSAnLi4vZmlsZXMtZXJyb3IubW9kZWwnO1xuaW1wb3J0IHsgSVZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uLy4uL3NjaGVtYS9zY2hlbWEtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9wb3BvdmVyLWNvbmZpcm0vcG9wb3Zlci1jb25maXJtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY2hlbWFWZXJzaW9uTGlua0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9zY2hlbWEtdmVyc2lvbi1saW5rL3NjaGVtYS12ZXJzaW9uLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IFNjaGVtYUluZm9Db21wb25lbnQgfSBmcm9tICcuLi8uLi9zY2hlbWEvc2NoZW1hLWluZm8vc2NoZW1hLWluZm8uY29tcG9uZW50JztcbmltcG9ydCB7IEhlU2NoZW1hU2VydmljZSwgbGlua1R5cGVFbmFibGVkIH0gZnJvbSAnLi4vLi4vc2NoZW1hL3NjaGVtYS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWljb24vbm9kZS1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTaXRlc01hcHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaXRlcy9zaXRlcy1tYXBzL3NpdGVzLW1hcHMuY29tcG9uZW50JztcbmltcG9ydCB7IENsaXBib2FyZENvbXBvbmVudCwgaXNFeHRlcm5hbCB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbmNvbnN0IHN0cmluZ2lmeSA9ICh2YWx1ZTogYW55KSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWZpbGVzLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGVzLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nQ2xhc3MsXG4gICAgRmFJY29uQ29tcG9uZW50LFxuICAgIE1hcmtkb3duQ29tcG9uZW50LFxuICAgIE5nYlRvb2x0aXAsXG4gICAgTm9kZUljb25Db21wb25lbnQsXG4gICAgU2NoZW1hSW5mb0NvbXBvbmVudCxcbiAgICBTY2hlbWFWZXJzaW9uTGlua0NvbXBvbmVudCxcbiAgICBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCxcbiAgICBTaXRlc01hcHNDb21wb25lbnQsXG4gICAgU3ZnSWNvbkNvbXBvbmVudCxcbiAgICBDbGlwYm9hcmRDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlc0Zvcm1Db21wb25lbnQge1xuICAvKipcbiAgICogUXVlcnkgdGhlIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYVNlcnZpY2UgPSBpbmplY3QoSGVTY2hlbWFTZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFNaW51cyA9IGZhTWludXM7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYVBsdXMgPSBmYVBsdXM7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYVBsdXNDaXJjbGUgPSBmYVBsdXNDaXJjbGU7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYXJDaXJjbGVYbWFyayA9IGZhQ2lyY2xlWG1hcms7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYUNvbW1lbnRzID0gZmFDb21tZW50cztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRXh0ZXJuYWxMaW5rQWx0ID0gZmFFeHRlcm5hbExpbmtBbHQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYUVkaXQgPSBmYUVkaXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYUNoZWNrID0gZmFDaGVjaztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhckNsb25lID0gZmFyQ2xvbmU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzT3BlbiA9IG1vZGVsKHRydWUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZSA9IGlucHV0LnJlcXVpcmVkPEhlc3RpYUpzb248U2NoZW1hVHlwZT4+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlcnJvcnMgPSBpbnB1dDxJVmFsaWRhdGlvbkVycm9yW10+KFtdKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYXMgPSB0b1NpZ25hbCh0aGlzLnNjaGVtYVNlcnZpY2Uuc2NoZW1hcyQpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2NoZW1hVHlwZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubm9kZSgpPy50eXBlIHx8IHRoaXMubm9kZSgpPy5bJ0B0eXBlJ10pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2NoZW1hcygpPy5bdGhpcy5zY2hlbWFUeXBlKCldID8/ICh7fSBhcyBkZWZpbml0aW9uKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vZGVFcm9yclJlc29sdmVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgTm9kZVR5cGUgPSBOb2RlVHlwZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFNjaGVtYVR5cGUgPSBTY2hlbWFUeXBlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZm9ybWF0UHJvcGVydHlFcnJvciA9IGZvcm1hdFByb3BlcnR5RXJyb3I7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdHJpbmdpZnkgPSBzdHJpbmdpZnk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1hcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93TWFwID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIFtTY2hlbWFUeXBlLlNpdGUsIFNjaGVtYVR5cGUuT3JnYW5pc2F0aW9uXS5pbmNsdWRlcyh0aGlzLnNjaGVtYVR5cGUoKSkgJiZcbiAgICAgIFtcbiAgICAgICAgKHRoaXMubm9kZSgpIGFzIFNpdGUpLmxhdGl0dWRlICYmICh0aGlzLm5vZGUoKSBhcyBTaXRlKS5sb25naXR1ZGUsXG4gICAgICAgICh0aGlzLm5vZGUoKSBhcyBTaXRlKS5yZWdpb24/Lm5hbWUsXG4gICAgICAgICh0aGlzLm5vZGUoKSBhcyBTaXRlKS5jb3VudHJ5Py5uYW1lXG4gICAgICBdLnNvbWUoQm9vbGVhbilcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlSWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vZGUoKT8uaWQgfHwgdGhpcy5ub2RlKCk/LlsnQGlkJ10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZVVybCA9IGNvbXB1dGVkKCgpID0+XG4gICAgW1xuICAgICAgbGlua1R5cGVFbmFibGVkKHRoaXMuc2NoZW1hVHlwZSgpKSxcbiAgICAgIC8vIGhhbmRsZSBsaW5rcyBvbiBDb21tdW5pdHkgRWRpdGlvblxuICAgICAgdGhpcy5ub2RlKCk/LlsnQGlkJ10gfHwgKGlzRXh0ZXJuYWwoKSAmJiB0aGlzLm5vZGVJZCgpKVxuICAgIF0uZXZlcnkoQm9vbGVhbilcbiAgICAgID8gYC8ke3RoaXMuc2NoZW1hVHlwZSgpLnRvTG93ZXJDYXNlKCl9LyR7dGhpcy5ub2RlSWQoKX1gXG4gICAgICA6ICcnXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJlZEVycm9ycyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZXJyb3JzKCkuZmlsdGVyKGZpbHRlckVycm9yKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZUVycm9yID0gY29tcHV0ZWQoKCkgPT4gcHJvcGVydHlFcnJvcih0aGlzLmZpbHRlcmVkRXJyb3JzKCkpKCcnKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vZGVQcm9wZXJ0eSA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5zY2hlbWEoKVxuICAgICAgPyB7XG4gICAgICAgICAgaWQ6IHByb3BlcnR5SWQoKSxcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hKCksXG4gICAgICAgICAgc2NoZW1hVHlwZTogdGhpcy5zY2hlbWFUeXBlKCksXG4gICAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGZ1bGxLZXk6ICcnLFxuICAgICAgICAgIGtleTogJycsXG4gICAgICAgICAgdmFsdWU6IHt9LFxuICAgICAgICAgIGVycm9yOiBmb3JtYXRFcnJvcih0aGlzLm5vZGVFcnJvcigpKSxcbiAgICAgICAgICBoYXNFcnJvcjogZXJyb3JIYXNFcnJvcih0aGlzLm5vZGVFcnJvcigpKSxcbiAgICAgICAgICBoYXNXYXJuaW5nOiBlcnJvckhhc1dhcm5pbmcodGhpcy5ub2RlRXJyb3IoKSksXG4gICAgICAgICAgc3VnZ2VzdGlvbnM6IHt9LFxuICAgICAgICAgIG5ld1Byb3BlcnR5OiB7fSxcbiAgICAgICAgICBuZXdFcnJvcjogeyBsZXZlbDogJ3dhcm5pbmcnIH0sXG4gICAgICAgICAgcHJvcGVydGllczogW10sXG4gICAgICAgICAgYWRkUHJvcGVydHlFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICBmb3JtYXR0ZXI6IGZvcm1hdHRlcignJylcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWRcbiAgKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgWyFpc1VuZGVmaW5lZCh0aGlzLnNjaGVtYXMoKSksICFpc1VuZGVmaW5lZCh0aGlzLm5vZGUoKSldLmV2ZXJ5KEJvb2xlYW4pXG4gICAgICA/IHJlY3Vyc2l2ZVByb3BlcnRpZXModGhpcy5zY2hlbWFzKCksIHRoaXMuZmlsdGVyZWRFcnJvcnMoKSwgdGhpcy5zY2hlbWEoKSwgZmFsc2UpKHRoaXMubm9kZSgpKVxuICAgICAgOiBbXVxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNFcnJvciA9IGNvbXB1dGVkKCgpID0+IGhhc0Vycm9yKHRoaXMucHJvcGVydGllcygpKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNXYXJuaW5nID0gY29tcHV0ZWQoKCkgPT4gaGFzV2FybmluZyh0aGlzLnByb3BlcnRpZXMoKSkpO1xuXG4gIHByb3RlY3RlZCB0cmFja0J5UHJvcGVydHkoX2luZGV4OiBudW1iZXIsIHsgaWQsIGZ1bGxLZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBbZnVsbEtleSwgaWRdLmpvaW4oJ18nKTtcbiAgfVxuXG4gIC8vIC0tLSBFcnJvcnNcblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0eS5lcnJvcj8uaW5kZXg7XG4gICAgcHJvcGVydHkuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBoYXNFcnJvcihwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gaGFzV2FybmluZyhwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICB0aGlzLm5vZGVFcm9yclJlc29sdmVkLmVtaXQoaW5kZXgpO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzKCksIHByb3BlcnR5LmZ1bGxLZXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtYWxpZ24taXRlbXMtZmxleC1zdGFydCBpcy1hbGlnbi1zZWxmLXN0cmV0Y2ggfCBmaWxlcy1mb3JtLWNvbnRhaW5lclwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJpcy1mbGV4IGlzLWZsZXgtZGlyZWN0aW9uLXJvdyBpcy1qdXN0aWZ5LWNvbnRlbnQtc3BhY2UtYmV0d2VlbiBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtYWxpZ24tc2VsZi1zdHJldGNoIGlzLWdhcC0xNiBweC00IHB5LTIgaGFzLXRleHQtc2Vjb25kYXJ5IHwgZmlsZXMtZm9ybS1oZWFkZXJcIlxuICAgIChjbGljayk9XCJpc09wZW4uc2V0KCFpc09wZW4oKSlcIlxuICAgIHBvaW50ZXI+XG4gICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZ2FwLTggaXMtYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICBAaWYgKG5vZGVQcm9wZXJ0eSgpKSB7XG4gICAgICAgIDxoZS1ub2RlLWljb24gW3R5cGVdPVwic2NoZW1hVHlwZSgpXCIgLz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtYm9sZCBoYXMtdGV4dC1zZWNvbmRhcnkgaXMtc2l6ZS01XCI+e3sgc2NoZW1hVHlwZSgpIH19PC9zcGFuPlxuICAgICAgICBAaWYgKG5vZGVQcm9wZXJ0eSgpLmhhc0Vycm9yIHx8IGhhc0Vycm9yKCkpIHtcbiAgICAgICAgICA8c3ZnLWljb24gbmFtZT1cImZhci10aW1lcy1jaXJjbGVcIiBjbGFzcz1cImhhcy10ZXh0LWRhbmdlciBpcy1mbGV4IGlzLWFsaWduLWl0ZW1zLWNlbnRlclwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC1kYW5nZXIgaGFzLXRleHQtd2VpZ2h0LWJvbGQgaXMtaXRhbGljXCI+RXJyb3I8L3NwYW4+XG4gICAgICAgIH0gQGVsc2UgaWYgKG5vZGVQcm9wZXJ0eSgpLmhhc1dhcm5pbmcgfHwgaGFzV2FybmluZygpKSB7XG4gICAgICAgICAgPHN2Zy1pY29uIG5hbWU9XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiIGNsYXNzPVwiaGFzLXRleHQtd2FybmluZyBpcy1mbGV4IGlzLWFsaWduLWl0ZW1zLWNlbnRlclwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13YXJuaW5nIGhhcy10ZXh0LXdlaWdodC1ib2xkIGlzLWl0YWxpY1wiPldhcm5pbmc8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1yb3cgaXMtYWxpZ24taXRlbXMtY2VudGVyIGlzLWdhcC0xNlwiPlxuICAgICAgQGlmIChub2RlVXJsKCkpIHtcbiAgICAgICAgPGEgY2xhc3M9XCJleHRlcm5hbC1saW5rXCIgW2hyZWZdPVwibm9kZVVybCgpXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAgPHNwYW4+Vmlldzwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj57eyBzY2hlbWFUeXBlKCkgfX08L3NwYW4+XG4gICAgICAgICAgPGZhLWljb24gY2xhc3M9XCJpcy1wbC0yXCIgW2ljb25dPVwiZmFFeHRlcm5hbExpbmtBbHRcIiAvPlxuICAgICAgICA8L2E+XG4gICAgICB9XG4gICAgICA8ZmEtaWNvbiBbaWNvbl09XCJpc09wZW4oKSA/IGZhTWludXMgOiBmYVBsdXNcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtYWxpZ24taXRlbXMtZmxleC1zdGFydCBpcy1hbGlnbi1zZWxmLXN0cmV0Y2hcIj5cbiAgICBAaWYgKGlzT3BlbigpKSB7XG4gICAgICBAaWYgKG5vZGVQcm9wZXJ0eSgpPy5lcnJvcikge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7IHByb3BlcnR5OiBub2RlUHJvcGVydHkoKSwgY2xhc3NlczogJ2lzLW15LTEgaXMtcHgtMycgfVwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWZsZXgtd3JhcC13cmFwIGlzLWFsaWduLXNlbGYtc3RyZXRjaFwiPlxuICAgICAgQGZvciAocHJvcGVydHkgb2YgcHJvcGVydGllcygpOyB0cmFjayB0cmFja0J5UHJvcGVydHkoJGluZGV4LCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dQcm9wZXJ0eTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHByb3BlcnR5IH1cIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChpc09wZW4oKSkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5TWFwOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbm9kZVByb3BlcnR5KCkgfVwiIC8+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8bmctY29udGVudCAvPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjcHJvcGVydHlLZXlUb29sdGlwIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCI+XG4gIDxtYXJrZG93biBbZGF0YV09XCJwcm9wZXJ0eS5zY2hlbWEuZGVzY3JpcHRpb25cIiAvPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eUtleSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiPlxuICBAaWYgKHByb3BlcnR5LnNjaGVtYT8uZGVzY3JpcHRpb24pIHtcbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJwcm9wZXJ0eS1rZXkgdHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgIFtuZ2JUb29sdGlwXT1cInByb3BlcnR5S2V5VG9vbHRpcFwiXG4gICAgICBbdG9vbHRpcENvbnRleHRdPVwieyBwcm9wZXJ0eSB9XCJcbiAgICAgIHRvb2x0aXBDbGFzcz1cInByb3BlcnR5LXRvb2x0aXBcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIlxuICAgICAgY29udGFpbmVyPVwiYm9keVwiPlxuICAgICAgPHNwYW4+e3sgcHJvcGVydHkua2V5IH19PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgfSBAZWxzZSB7XG4gICAgPHNwYW4+e3sgcHJvcGVydHkua2V5IH19PC9zcGFuPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Nob3dQcm9wZXJ0eSBsZXQtcHJvcGVydHk+XG4gIEBpZiAoKGlzT3BlbigpIHx8IHByb3BlcnR5LmNsb3NlZFZpc2libGUpICYmICFwcm9wZXJ0eS5pc0hpZGRlbikge1xuICAgIEBpZiAocHJvcGVydHkucHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1mbGV4IGlzLWZsZXgtZGlyZWN0aW9uLWNvbHVtbiBpcy1mbGV4LXdyYXAtd3JhcCB3LTEwMCB8IHByb3BlcnRpZXMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWp1c3RpZnktY29udGVudC1zcGFjZS1iZXR3ZWVuIGlzLWdhcC00IGhhcy10ZXh0LXNlY29uZGFyeSB3LTEwMCB8IHByb3BlcnRpZXMtY29udGFpbmVyLS10aXRsZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInByb3BlcnR5LmlzT3BlbiA9ICFwcm9wZXJ0eS5pc09wZW5cIlxuICAgICAgICAgIHBvaW50ZXJcbiAgICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJwcm9wZXJ0eS5pc09wZW5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1ncm91cC1lcnJvci1kYW5nZXJdPVwicHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgICAgIFtjbGFzcy5pcy1ncm91cC1lcnJvci13YXJuaW5nXT1cInByb3BlcnR5Lmhhc1dhcm5pbmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1nYXAtOCBoYXMtdGV4dC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICAgICAgPCEtLSBAaWYgKHByb3BlcnR5LnNjaGVtYVR5cGUgPT09IFNjaGVtYVR5cGUuVGVybSkge1xuICAgICAgICAgICAgICA8aGUtbm9kZS1pY29uIFt0eXBlXT1cInByb3BlcnR5LnNjaGVtYVR5cGVcIiAvPlxuICAgICAgICAgICAgfSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUtleTsgY29udGV4dDogeyBwcm9wZXJ0eSB9XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJwcm9wZXJ0eS5pc09wZW4gPyBmYU1pbnVzIDogZmFQbHVzXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAocHJvcGVydHkuaXNPcGVuKSB7XG4gICAgICAgICAgQGlmIChwcm9wZXJ0eS5lcnJvcikge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHsgcHJvcGVydHksIGNsYXNzZXM6ICdpcy1teS0xIGlzLXB4LTMnIH1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHByb3BlcnR5LmlzQXJyYXkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0yIHB4LTMgdy0xMDBcIj5cbiAgICAgICAgICAgICAgQGZvciAocHJvcDIgb2YgcHJvcGVydHkucHJvcGVydGllczsgdHJhY2sgdHJhY2tCeVByb3BlcnR5KCRpbmRleCwgcHJvcDIpKSB7XG4gICAgICAgICAgICAgICAgQGlmIChwcm9wMi5rZXkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0yIG15LTQgfCBwcm9wZXJ0eS1hcnJheS1jb250YWluZXJcIiBbaWRdPVwicHJvcDIuZnVsbEtleSArICdfJyArIHByb3AyLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1hcnJheS1udW1iZXIgbWwtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcy1mbGV4IGlzLWp1c3RpZnktY29udGVudC1jZW50ZXIgaXMtYWxpZ24taXRlbXMtY2VudGVyIGhhcy1hZGRvbnMgbnVtYmVyLXRhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnVtYmVyLXRhZ1wiPnt7IHByb3AyLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAocHJvcDIuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3AyLCBjbGFzc2VzOiAnaXMtbXktMSBpcy1weC0zJyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWZsZXgtd3JhcC13cmFwIGlzLWFsaWduLXNlbGYtc3RyZXRjaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAocHJvcDMgb2YgcHJvcDIucHJvcGVydGllczsgdHJhY2sgdHJhY2tCeVByb3BlcnR5KCRpbmRleCwgcHJvcDMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBwcm9wMyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWZsZXgtd3JhcC13cmFwIGlzLWFsaWduLXNlbGYtc3RyZXRjaFwiPlxuICAgICAgICAgICAgICBAZm9yIChwcm9wMiBvZiBwcm9wZXJ0eS5wcm9wZXJ0aWVzOyB0cmFjayB0cmFja0J5UHJvcGVydHkoJGluZGV4LCBwcm9wMikpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd1Byb3BlcnR5OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcHJvcDIgfVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtZ2FwLTQgfCBwcm9wZXJ0eS1jb250YWluZXJcIlxuICAgICAgICBbY2xhc3MuaXMtZXJyb3ItZGFuZ2VyXT1cInByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgICAgW2NsYXNzLmlzLWVycm9yLXdhcm5pbmddPVwicHJvcGVydHkuaGFzV2FybmluZ1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpcy1mbGV4IGlzLWZsZXgtZGlyZWN0aW9uLXJvdyBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtanVzdGlmeS1jb250ZW50LXNwYWNlLWJldHdlZW4gaXMtZ2FwLTQgfCBmaWVsZC1jb250YWluZXJcIj5cbiAgICAgICAgICBAaWYgKHByb3BlcnR5LmtleSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzLWZsZXggaXMtYWxpZ24taXRlbXMtY2VudGVyIGlzLWZsZXgtd3JhcC13cmFwIGlzLWdhcC00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcy1mbGV4IGhhcy10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUtleTsgY29udGV4dDogeyBwcm9wZXJ0eSB9XCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj46PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWZsZXggaXMtc2l6ZS03IHwgcHJvcGVydHktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICB7eyBwcm9wZXJ0eS52YWx1ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvcHktYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgPGhlLWNsaXBib2FyZCBbdmFsdWVdPVwicHJvcGVydHkudmFsdWVcIiBbaGlkZVRleHRdPVwidHJ1ZVwiIFtpY29uXT1cImZhckNsb25lXCI+PC9oZS1jbGlwYm9hcmQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcy1mbGV4IGlzLWdhcC04XCI+XG4gICAgICAgICAgICAgIEBpZiAocHJvcGVydHkuZXh0ZXJuYWxVcmw/LnVybCkge1xuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBbaHJlZl09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC51cmwgKyAocHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSA/IHByb3BlcnR5LnZhbHVlIDogJycpXCJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW5mbyc6IHByb3BlcnR5LmtleSA9PT0gJ3R5cGUnIH1cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSAmJiAhcHJvcGVydHkudmFsdWUgPyB0cnVlIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwuaWNvbiB8fCBmYUV4dGVybmFsTGlua0FsdFwiIC8+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKHByb3BlcnR5Lmhhc0Vycm9yIHx8IHByb3BlcnR5Lmhhc1dhcm5pbmcpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlFcnJvcjsgY29udGV4dDogeyBwcm9wZXJ0eSB9XCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5RXJyb3IgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtY2xhc3Nlcz1cImNsYXNzZXNcIj5cbiAgQGlmIChwcm9wZXJ0eS5lcnJvcikge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1yb3cgaXMtZmxleC13cmFwLXdyYXAgaXMtYWxpZ24taXRlbXMtY2VudGVyIGlzLWdhcC04IGlzLXNpemUtNiBpcy1tLTAgdy0xMDAgaGFzLXRleHQtZ3JleSB7e1xuICAgICAgICBjbGFzc2VzXG4gICAgICB9fSB8IHByb3BlcnR5LWVycm9yXCJcbiAgICAgIFtjbGFzcy5pcy1lcnJvci1kYW5nZXJdPVwicHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmlzLWVycm9yLXdhcm5pbmddPVwicHJvcGVydHkuaGFzV2FybmluZ1wiPlxuICAgICAgQGlmIChwcm9wZXJ0eS5oYXNFcnJvcikge1xuICAgICAgICA8ZmEtaWNvbiBjbGFzcz1cImhhcy10ZXh0LWRhbmdlciBpcy1weS0xXCIgW2ljb25dPVwiZmFyQ2lyY2xlWG1hcmtcIiBzaXplPVwieGxcIiAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzdmctaWNvbiBjbGFzcz1cImhhcy10ZXh0LXdhcm5pbmcgaXMtcHQtMVwiIG5hbWU9XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiIC8+XG4gICAgICB9XG4gICAgICA8ZGl2IFtpbm5lckhUTUxdPVwicHJvcGVydHkuZXJyb3IubWVzc2FnZVwiPjwvZGl2PlxuICAgICAgQGlmIChwcm9wZXJ0eS5lcnJvci5pbmRleCA+PSAwKSB7XG4gICAgICAgIEBpZiAocHJvcGVydHkuaGFzV2FybmluZykge1xuICAgICAgICAgIDxhIChjbGljayk9XCJyZXNvbHZlRXJyb3IocHJvcGVydHkpXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBbaWNvbl09XCJmYUNoZWNrXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlJlc29sdmVkPC9zcGFuPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5TWFwIGxldC1wcm9wZXJ0eT5cbiAgQGlmIChzaG93TWFwKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleCBpcy1mbGV4LWRpcmVjdGlvbi1jb2x1bW4gaXMtZmxleC13cmFwLXdyYXAgdy0xMDAgfCBwcm9wZXJ0aWVzLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImlzLWZsZXggaXMtZmxleC1kaXJlY3Rpb24tcm93IGlzLWp1c3RpZnktY29udGVudC1zcGFjZS1iZXR3ZWVuIGlzLWdhcC00IHctMTAwIHwgcHJvcGVydGllcy1jb250YWluZXItLXRpdGxlXCJcbiAgICAgICAgKGNsaWNrKT1cIm1hcFZpc2libGUuc2V0KCFtYXBWaXNpYmxlKCkpXCJcbiAgICAgICAgcG9pbnRlclxuICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJtYXBWaXNpYmxlKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1zaXplLTZcIj5WaWV3IG9uIE1hcDwvc3Bhbj5cbiAgICAgICAgPGZhLWljb24gW2ljb25dPVwibWFwVmlzaWJsZSgpID8gZmFNaW51cyA6IGZhUGx1c1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAobWFwVmlzaWJsZSgpKSB7XG4gICAgICAgIDxoZS1zaXRlcy1tYXBzIFtzaXRlc109XCJbbm9kZSgpXVwiIFtzaG93Tm90aWNlXT1cImZhbHNlXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|