@hestia-earth/ui-components 0.9.5 → 0.9.7
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/common/apply-pure.pipe.d.ts +12 -0
- package/common/common.light.module.d.ts +16 -15
- package/common/d3-utils.d.ts +11 -0
- package/common/index.d.ts +2 -0
- package/common/maps-utils.d.ts +2 -2
- package/esm2020/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.mjs +3 -3
- package/esm2020/common/apply-pure.pipe.mjs +23 -0
- package/esm2020/common/common.light.module.mjs +5 -1
- package/esm2020/common/compound.mjs +15 -6
- package/esm2020/common/d3-utils.mjs +46 -0
- package/esm2020/common/data-table/data-table.component.mjs +2 -2
- package/esm2020/common/index.mjs +3 -1
- package/esm2020/common/maps-drawing-confirm/maps-drawing-confirm.component.mjs +3 -3
- package/esm2020/common/maps-utils.mjs +3 -3
- package/esm2020/cycles/cycles-activity/cycles-activity.component.mjs +3 -3
- package/esm2020/cycles/cycles-completeness/cycles-completeness.component.mjs +3 -3
- package/esm2020/cycles/cycles-emissions/cycles-emissions.component.mjs +3 -3
- package/esm2020/cycles/cycles-emissions-chart/cycles-emissions-chart.component.mjs +3 -3
- package/esm2020/cycles/cycles-practices/cycles-practices.component.mjs +3 -3
- package/esm2020/engine/aggregation-engine.service.mjs +1 -1
- package/esm2020/engine/engine-orchestrator-edit/engine-orchestrator-edit.component.mjs +3 -3
- package/esm2020/files/files-form/files-form.component.mjs +9 -8
- package/esm2020/fontawesome/fontawesome.module.mjs +3 -3
- package/esm2020/impact-assessments/impact-assessments-graph/impact-assessments-graph.component.mjs +845 -0
- package/esm2020/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.mjs +3 -3
- package/esm2020/impact-assessments/impact-assessments-indicators-chart/impact-assessments-indicators-chart.component.mjs +3 -3
- package/esm2020/impact-assessments/impact-assessments-products/impact-assessments-products.component.mjs +3 -3
- package/esm2020/impact-assessments/impact-assessments.module.mjs +7 -3
- package/esm2020/impact-assessments/index.mjs +2 -1
- package/esm2020/node/node-csv-export-confirm/node-csv-export-confirm.component.mjs +6 -4
- package/esm2020/node/node-csv-select-headers/node-csv-select-headers.component.mjs +3 -3
- package/esm2020/node/node-logs-file/node-logs-file.component.mjs +3 -3
- package/esm2020/node/node-logs-models/node-logs-models.component.mjs +3 -3
- package/esm2020/node/node-missing-lookup-factors/node-missing-lookup-factors.component.mjs +3 -3
- package/esm2020/node/node.service.mjs +1 -10
- package/esm2020/sites/sites-measurements/sites-measurements.component.mjs +3 -3
- package/fesm2015/hestia-earth-ui-components.mjs +965 -102
- package/fesm2015/hestia-earth-ui-components.mjs.map +1 -1
- package/fesm2020/hestia-earth-ui-components.mjs +999 -101
- package/fesm2020/hestia-earth-ui-components.mjs.map +1 -1
- package/files/files-form/files-form.component.d.ts +3 -3
- package/impact-assessments/impact-assessments-graph/impact-assessments-graph.component.d.ts +73 -0
- package/impact-assessments/impact-assessments.module.d.ts +11 -10
- package/impact-assessments/index.d.ts +1 -0
- package/node/node.service.d.ts +0 -12
- package/package.json +1 -1
- package/styles.scss +106 -17
|
@@ -29,7 +29,8 @@ import * as i13 from "../../node/node-icon/node-icon.component";
|
|
|
29
29
|
import * as i14 from "../../node/node-recommendations/node-recommendations.component";
|
|
30
30
|
import * as i15 from "../../bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component";
|
|
31
31
|
import * as i16 from "../../sites/sites-maps/sites-maps.component";
|
|
32
|
-
import * as i17 from "../../common/
|
|
32
|
+
import * as i17 from "../../common/apply-pure.pipe";
|
|
33
|
+
import * as i18 from "../../common/pluralize.pipe";
|
|
33
34
|
const MIN_TYPEAHEAD_LENGTH = 2;
|
|
34
35
|
const populateTermFields = [
|
|
35
36
|
'termType', 'units'
|
|
@@ -98,7 +99,7 @@ export class FilesFormComponent {
|
|
|
98
99
|
this.formatPropertyError = formatPropertyError;
|
|
99
100
|
this.properties = [];
|
|
100
101
|
this.formatter = (value) => typeof value === 'object' ? ('bibliography' in value ? value.bibliography?.title : value.name) : value;
|
|
101
|
-
this.suggestNewProperty = (fullKey) => (text$) => text$.pipe(distinctUntilChanged(), switchMap(term => of(this.newProperties(findProperty(this.properties, fullKey) || this.nodeProperty, term))));
|
|
102
|
+
this.suggestNewProperty = ({ fullKey }) => (text$) => text$.pipe(distinctUntilChanged(), switchMap(term => of(this.newProperties(findProperty(this.properties, fullKey) || this.nodeProperty, term))));
|
|
102
103
|
this.suggestExistingNode = (type, term, uniqueKey = '@id') => term.length < MIN_TYPEAHEAD_LENGTH ?
|
|
103
104
|
of([]) :
|
|
104
105
|
this.searchService.suggest(term, type, [], {
|
|
@@ -131,10 +132,10 @@ export class FilesFormComponent {
|
|
|
131
132
|
of([]) :
|
|
132
133
|
this.searchService.suggest(term, NodeType.Term, suggestions?.queries || [], null, 5, this.suggestTermFields))
|
|
133
134
|
};
|
|
134
|
-
this.propertySuggest = (fullKey,
|
|
135
|
+
this.propertySuggest = ({ fullKey, suggestions }) => (text$) => text$.pipe(debounceTime(suggestions?.type === defaultSuggestionType ? 0 : 300), distinctUntilChanged(), mergeMap(term => {
|
|
135
136
|
const property = findProperty(this.properties, fullKey);
|
|
136
|
-
return property?.editable &&
|
|
137
|
-
of(term).pipe(tap(() => property.loading = true), switchMap(() => this.suggester[
|
|
137
|
+
return property?.editable && suggestions?.type in this.suggester ?
|
|
138
|
+
of(term).pipe(tap(() => property.loading = true), switchMap(() => this.suggester[suggestions?.type](term, property)), tap(() => property.loading = false)) :
|
|
138
139
|
of([]);
|
|
139
140
|
}));
|
|
140
141
|
}
|
|
@@ -472,10 +473,10 @@ export class FilesFormComponent {
|
|
|
472
473
|
}
|
|
473
474
|
}
|
|
474
475
|
FilesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: FilesFormComponent, deps: [{ token: i0.ElementRef }, { token: i1.HeSearchService }, { token: i2.HeUsersService }], target: i0.ɵɵFactoryTarget.Component });
|
|
475
|
-
FilesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: FilesFormComponent, selector: "he-files-form", inputs: { schemas: "schemas", errors: "errors", node: "node", nodeMap: "nodeMap", editable: "editable", errorMode: "errorMode", deepEditable: "deepEditable", errorsEditable: "errorsEditable", showSuggestedDefaultProperties: "showSuggestedDefaultProperties" }, outputs: { nodeChange: "nodeChange", nodeErorrResolved: "nodeErorrResolved", nodeErrorAdded: "nodeErrorAdded" }, ngImport: i0, template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"property.schema?.description\" [autoClose]=\"'outside'\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\"\n *bindOnce=\"property\"\n [for]=\"property.id\"\n >\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"'Duplicate ' + pluralize(property.key, 1)\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"'Remove ' + pluralize(property.key, 1)\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable\">\n <button class=\"button is-dark is-outlined is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"propertySuggest(property.fullKey, property.suggestions?.type)\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *bindOnce=\"property\">\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{'is-dark is-outlined': property.key === 'type'}\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\"\n >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"suggestNewProperty(property.fullKey)\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\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 class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\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\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.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: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: i5.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term", "accentSensitive"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i6.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i7.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i8.MapsDrawingConfirmComponent, selector: "he-maps-drawing-confirm", inputs: ["value", "modes", "center", "zoom"], outputs: ["closed"] }, { kind: "component", type: i9.PopoverConfirmComponent, selector: "he-popover-confirm", inputs: ["message", "content", "position", "popoverClass"], outputs: ["confirmed"] }, { kind: "component", type: i10.SchemaVersionLinkComponent, selector: "he-schema-version-link", inputs: ["node", "showExternalLink", "linkClass", "text"] }, { kind: "component", type: i11.UnitConverterComponent, selector: "he-unit-converter", inputs: ["term", "value", "fromUnits", "toUnits"] }, { kind: "directive", type: i12.TagsInputDirective, selector: "[appTagsInput]", inputs: ["appTagsInput"] }, { kind: "component", type: i13.NodeIconComponent, selector: "he-node-icon", inputs: ["type", "size"] }, { kind: "component", type: i14.NodeRecommendationsComponent, selector: "he-node-recommendations", inputs: ["node", "nodeField", "buttonClass"], outputs: ["selectRecommendation"] }, { kind: "component", type: i15.BibliographiesSearchConfirmComponent, selector: "he-bibliographies-search-confirm", inputs: ["search", "searchSources", "searchBibliographies", "searchBy"], outputs: ["closed"] }, { kind: "component", type: i16.SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "nodes", "center", "zoom", "showNotice"] }, { kind: "pipe", type: i17.PluralizePipe, name: "pluralize" }] });
|
|
476
|
+
FilesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: FilesFormComponent, selector: "he-files-form", inputs: { schemas: "schemas", errors: "errors", node: "node", nodeMap: "nodeMap", editable: "editable", errorMode: "errorMode", deepEditable: "deepEditable", errorsEditable: "errorsEditable", showSuggestedDefaultProperties: "showSuggestedDefaultProperties" }, outputs: { nodeChange: "nodeChange", nodeErorrResolved: "nodeErorrResolved", nodeErrorAdded: "nodeErrorAdded" }, ngImport: i0, template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"property.schema?.description\" [autoClose]=\"'outside'\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\"\n *bindOnce=\"property\"\n [for]=\"property.id\"\n >\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"'Duplicate ' + pluralize(property.key, 1)\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"'Remove ' + pluralize(property.key, 1)\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable\">\n <button class=\"button is-info is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"property | applyPure: propertySuggest\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *bindOnce=\"property\">\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\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 >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"property | applyPure: suggestNewProperty\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\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 class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\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\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.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: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: i5.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term", "accentSensitive"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i6.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i7.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i8.MapsDrawingConfirmComponent, selector: "he-maps-drawing-confirm", inputs: ["value", "modes", "center", "zoom"], outputs: ["closed"] }, { kind: "component", type: i9.PopoverConfirmComponent, selector: "he-popover-confirm", inputs: ["message", "content", "position", "popoverClass"], outputs: ["confirmed"] }, { kind: "component", type: i10.SchemaVersionLinkComponent, selector: "he-schema-version-link", inputs: ["node", "showExternalLink", "linkClass", "text"] }, { kind: "component", type: i11.UnitConverterComponent, selector: "he-unit-converter", inputs: ["term", "value", "fromUnits", "toUnits"] }, { kind: "directive", type: i12.TagsInputDirective, selector: "[appTagsInput]", inputs: ["appTagsInput"] }, { kind: "component", type: i13.NodeIconComponent, selector: "he-node-icon", inputs: ["type", "size"] }, { kind: "component", type: i14.NodeRecommendationsComponent, selector: "he-node-recommendations", inputs: ["node", "nodeField", "buttonClass"], outputs: ["selectRecommendation"] }, { kind: "component", type: i15.BibliographiesSearchConfirmComponent, selector: "he-bibliographies-search-confirm", inputs: ["search", "searchSources", "searchBibliographies", "searchBy"], outputs: ["closed"] }, { kind: "component", type: i16.SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "nodes", "center", "zoom", "showNotice"] }, { kind: "pipe", type: i17.ApplyPurePipe, name: "applyPure" }, { kind: "pipe", type: i18.PluralizePipe, name: "pluralize" }] });
|
|
476
477
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: FilesFormComponent, decorators: [{
|
|
477
478
|
type: Component,
|
|
478
|
-
args: [{ selector: 'he-files-form', template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"property.schema?.description\" [autoClose]=\"'outside'\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\"\n *bindOnce=\"property\"\n [for]=\"property.id\"\n >\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"'Duplicate ' + pluralize(property.key, 1)\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"'Remove ' + pluralize(property.key, 1)\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable\">\n <button class=\"button is-dark is-outlined is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"propertySuggest(property.fullKey, property.suggestions?.type)\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *bindOnce=\"property\">\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{'is-dark is-outlined': property.key === 'type'}\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\"\n >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"suggestNewProperty(property.fullKey)\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\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 class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\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\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"] }]
|
|
479
|
+
args: [{ selector: 'he-files-form', template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"property.schema?.description\" [autoClose]=\"'outside'\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\"\n *bindOnce=\"property\"\n [for]=\"property.id\"\n >\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"'Duplicate ' + pluralize(property.key, 1)\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"'Remove ' + pluralize(property.key, 1)\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable\">\n <button class=\"button is-info is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"property | applyPure: propertySuggest\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *bindOnce=\"property\">\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\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 >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"property | applyPure: suggestNewProperty\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\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 class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\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\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"] }]
|
|
479
480
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.HeSearchService }, { type: i2.HeUsersService }]; }, propDecorators: { schemas: [{
|
|
480
481
|
type: Input
|
|
481
482
|
}], errors: [{
|
|
@@ -501,4 +502,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
501
502
|
}], nodeErrorAdded: [{
|
|
502
503
|
type: Output
|
|
503
504
|
}] } });
|
|
504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBQzdCLE9BQU8sRUFBc0IsVUFBVSxFQUFFLFFBQVEsRUFBa0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVoSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsT0FBTyxFQUVMLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUN4QyxxQkFBcUIsRUFDckMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUNsRCxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQzdELFlBQVksRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQ2pILDZCQUE2QixFQUFFLHNCQUFzQixFQUNyRCw4QkFBOEIsRUFBRSx1QkFBdUIs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QyxRQUFRO3NCQURkLEtBQUs7Z0JBR0MsU0FBUztzQkFEZixLQUFLO2dCQUdDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBTUMsY0FBYztzQkFEcEIsS0FBSztnQkFPQyw4QkFBOEI7c0JBRHBDLEtBQUs7Z0JBSUUsVUFBVTtzQkFEakIsTUFBTTtnQkFHQyxpQkFBaUI7c0JBRHhCLE1BQU07Z0JBR0MsY0FBYztzQkFEckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIG1lcmdlTWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2guZ2V0JztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoLnNldCc7XG5pbXBvcnQgeyBKU09OIGFzIEhlc3RpYUpzb24sIFNjaGVtYVR5cGUsIE5vZGVUeXBlLCBCaWJsaW9ncmFwaHksIFNvdXJjZSwgUHJvcGVydHkgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBkZWZpbml0aW9ucywgZGVmaW5pdGlvbiB9IGZyb20gJ0BoZXN0aWEtZWFydGgvanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBJRXJyb3JQcm9wZXJ0eSwgSU5vZGVQcm9wZXJ0eSxcbiAgZm9ybWF0UHJvcGVydHlFcnJvciwgcHJvcGVydHlFcnJvciwgaGFzRXJyb3IsIGhhc1dhcm5pbmcsXG4gIHN1Z2dlc3Rpb25UeXBlLCBkZWZhdWx0U3VnZ2VzdGlvblR5cGUsXG4gIHJlY3Vyc2l2ZVByb3BlcnRpZXMsIHR5cGVUb05ld1Byb3BlcnR5LCBwcm9wZXJ0eUlkLFxuICBpc0FkZFByb3BlcnR5RW5hYmxlZCwgbm9kZUF2YWlsYWJsZVByb3BlcnRpZXMsIHNvcnRQcm9wZXJ0aWVzLFxuICBncm91cENoYW5nZWQsIHBhcmVudFByb3BlcnR5LCBzaWJsaW5nUHJvcGVydHksIHVwZGF0ZVByb3BlcnRpZXMsIHJlZnJlc2hQcm9wZXJ0eUtleXMsIGtleVRvRGF0YVBhdGgsIGZpbmRQcm9wZXJ0eSxcbiAgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQsIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb24sXG4gIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZCwgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUsIHBhcnNlTmV3VmFsdWVcbn0gZnJvbSAnLi4vZmlsZXMtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBJVmFsaWRhdGlvbkVycm9yLCBlcnJvckhhc0Vycm9yLCBlcnJvckhhc1dhcm5pbmcsIGZpbHRlckVycm9yLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2ZpbGVzLWVycm9yLm1vZGVsJztcbmltcG9ydCB7IEhlVXNlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlcnMvdXNlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWF0Y2hUeXBlLCBtYXRjaFBocmFzZVF1ZXJ5LCBtYXRjaFBocmFzZVByZWZpeFF1ZXJ5LCBtYXRjaEJvb2xQcmVmaXhRdWVyeSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgc2FmZUpTT05QYXJzZSwgY29weU9iamVjdCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICcuLi8uLi9jb21tb24vcGx1cmFsaXplJztcblxuY29uc3QgTUlOX1RZUEVBSEVBRF9MRU5HVEggPSAyO1xuY29uc3QgcG9wdWxhdGVUZXJtRmllbGRzID0gW1xuICAndGVybVR5cGUnLCAndW5pdHMnXG5dO1xuY29uc3QgcG9wdWxhdGVUZXJtRGVmYXVsdFByb3BlcnRpZXMgPSBbXG4gICdkZWZhdWx0UHJvcGVydGllcy50ZXJtLm5hbWUnLCAnZGVmYXVsdFByb3BlcnRpZXMudGVybS51bml0cycsICdkZWZhdWx0UHJvcGVydGllcy52YWx1ZSdcbl07XG5cbmNvbnN0IGZvcm1hdFByb3BlcnR5ID0gKHByb3A6IFByb3BlcnR5KSA9PiAoe1xuICAnQHR5cGUnOiBTY2hlbWFUeXBlLlByb3BlcnR5LFxuICAuLi5wcm9wLFxuICB0ZXJtOiB7XG4gICAgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSxcbiAgICAuLi5wcm9wLnRlcm1cbiAgfVxufSk7XG5cbmNvbnN0IGZvcm1hdFN1Z2dlc3Rpb24gPSAoeyBkZWZhdWx0UHJvcGVydGllcywgLi4ubm9kZSB9OiBhbnkpID0+ICh7XG4gIC4uLm5vZGUsXG4gIC4uLihkZWZhdWx0UHJvcGVydGllcz8ubGVuZ3RoID8geyBkZWZhdWx0UHJvcGVydGllczogZGVmYXVsdFByb3BlcnRpZXMubWFwKGZvcm1hdFByb3BlcnR5KSB9IDoge30pXG59KTtcblxuY29uc3QgZm9ybWF0TGlua05vZGVzUHJlZml4ID0gJ0xpbmsgd2l0aCc7XG5cbi8vIHBhdGNoIGVycm9yIHdoZW4gbGluayBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHlcbmNvbnN0IGNsZWFuTmV3VmFsdWUgPSB2YWx1ZSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmlkXG4gICAgPyB7IC4uLnZhbHVlLCBpZDogY2xlYW5OZXdWYWx1ZSh2YWx1ZS5pZCkgfVxuICAgIDogdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgID8gdmFsdWUuc3RhcnRzV2l0aChmb3JtYXRMaW5rTm9kZXNQcmVmaXgpXG4gICAgPyB2YWx1ZS5zcGxpdCgnOicpWzFdLnRyaW0oKVxuICAgIDogdmFsdWVcbiAgICA6IHZhbHVlO1xuXG5jb25zdCBmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucyA9IChub2RlTWFwOiB7IFt0eXBlIGluIE5vZGVUeXBlXT86IHN0cmluZ1tdIH0sIHR5cGU6IE5vZGVUeXBlKSA9PlxuICAobm9kZU1hcFt0eXBlXSB8fCBbXSkubWFwKGlkID0+ICh7IHR5cGUsIGlkLCBuYW1lOiBgJHtmb3JtYXRMaW5rTm9kZXNQcmVmaXh9ICR7dHlwZX06ICR7aWR9YCB9KSk7XG5cbnR5cGUgc3VnZ2VzdEZ1bmMgPSAodGVybTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4gT2JzZXJ2YWJsZTxhbnlbXT47XG5cbmNvbnN0IGluc2VydFByb3BlcnR5ID0gKHByb3BlcnRpZXM6IElOb2RlUHJvcGVydHlbXSwga2V5OiBzdHJpbmcsIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSA9PiB7XG4gIGNvbnN0IGV4aXN0aW5nUHJvcGVydHlJbmRleCA9IHByb3BlcnRpZXMuZmluZEluZGV4KHYgPT4gdi5mdWxsS2V5ID09PSBrZXkpO1xuICBleGlzdGluZ1Byb3BlcnR5SW5kZXggPj0gMCA/IChwcm9wZXJ0aWVzW2V4aXN0aW5nUHJvcGVydHlJbmRleF0gPSBwcm9wZXJ0eSkgOiBwcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICBwcm9wZXJ0aWVzLnNvcnQoc29ydFByb3BlcnRpZXMpO1xuICByZXR1cm4gcHJvcGVydGllcztcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWZpbGVzLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGVzLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlc0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwcml2YXRlIHNjaGVtYXM/OiBkZWZpbml0aW9ucztcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBlcnJvcnM6IElWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZT86IEhlc3RpYUpzb248U2NoZW1hVHlwZT47XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBub2RlTWFwOiB7IFt0eXBlIGluIE5vZGVUeXBlXT86IHN0cmluZ1tdIH0gPSB7fTtcbiAgLyoqXG4gICAqIEFsbG93IGVkaXRpbmcgbm9kZXMgKGBmYWxzZWAgZm9yIHJlYWRvbmx5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlZGl0YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZXJyb3JNb2RlID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkZWVwRWRpdGFibGUgPSB0cnVlO1xuICAvKipcbiAgICogQ2FuIGVkaXQgZXJyb3JzLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yc0VkaXRhYmxlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBXaGVuIHNlbGVjdGluZyB0ZXJtcywgd2lsbCBzaG93IGRlZmF1bHQgcHJvcGVydGllcyBvciBub3QuXG4gICAqIFNob3VsZCBiZSBgZmFsc2VgIHdoZW4gdXNpbmcgc2NoZW1hIHZhbGlkYXRpb24sIGFzIG9ubHkgdGhlIGBuYW1lYCB3b3VsZCBiZSBhZGRlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U3VnZ2VzdGVkRGVmYXVsdFByb3BlcnRpZXMgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpXG4gIHByaXZhdGUgbm9kZUVyb3JyUmVzb2x2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpXG4gIHByaXZhdGUgbm9kZUVycm9yQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElWYWxpZGF0aW9uRXJyb3I+KCk7XG5cbiAgcHVibGljIE5vZGVUeXBlID0gTm9kZVR5cGU7XG4gIHB1YmxpYyBTY2hlbWFUeXBlID0gU2NoZW1hVHlwZTtcbiAgcHVibGljIGlzT3BlbiA9IHRydWU7XG4gIHB1YmxpYyBtYXBWaXNpYmxlID0gZmFsc2U7XG4gIHB1YmxpYyBwbHVyYWxpemUgPSBwbHVyYWxpemU7XG4gIHB1YmxpYyBmb3JtYXRQcm9wZXJ0eUVycm9yID0gZm9ybWF0UHJvcGVydHlFcnJvcjtcbiAgcHVibGljIG1hcERyYXdpbmdQcm9wZXJ0eT86IElOb2RlUHJvcGVydHk7XG4gIHB1YmxpYyBiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5PzogSU5vZGVQcm9wZXJ0eTtcbiAgcHVibGljIG5vZGVQcm9wZXJ0eT86IElOb2RlUHJvcGVydHk7XG4gIHB1YmxpYyBwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W10gPSBbXTtcblxuICBwdWJsaWMgZm9ybWF0dGVyID0gKHZhbHVlOiBhbnkpID0+XG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/ICgnYmlibGlvZ3JhcGh5JyBpbiB2YWx1ZSA/IHZhbHVlLmJpYmxpb2dyYXBoeT8udGl0bGUgOiB2YWx1ZS5uYW1lKSA6IHZhbHVlO1xuXG4gIHB1YmxpYyBzdWdnZXN0TmV3UHJvcGVydHkgPSAoZnVsbEtleTogc3RyaW5nKSA9PiAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgdGVybSA9PiBvZih0aGlzLm5ld1Byb3BlcnRpZXMoZmluZFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgZnVsbEtleSkgfHwgdGhpcy5ub2RlUHJvcGVydHksIHRlcm0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0RXhpc3RpbmdOb2RlID0gKHR5cGU6IE5vZGVUeXBlLCB0ZXJtOiBzdHJpbmcsIHVuaXF1ZUtleSA9ICdAaWQnKSA9PlxuICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgb2YoW10pIDpcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0KHRlcm0sIHR5cGUsIFtdLCB7XG4gICAgICAgIGJvb2w6IHtcbiAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKHR5cGUpXSxcbiAgICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICAgIG1hdGNoUGhyYXNlUXVlcnkodGVybSwgMTAwLCB1bmlxdWVLZXkpLFxuICAgICAgICAgICAgbWF0Y2hQaHJhc2VQcmVmaXhRdWVyeSh0ZXJtLCAyMCwgdW5pcXVlS2V5KSxcbiAgICAgICAgICAgIG1hdGNoQm9vbFByZWZpeFF1ZXJ5KHRlcm0sIDEwLCB1bmlxdWVLZXkpXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICB9XG4gICAgICB9LCAxMCwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcyk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0Tm9kZSA9ICh0eXBlOiBOb2RlVHlwZSwgc3VnZ2VzdERlZmF1bHQ/OiBzdWdnZXN0RnVuYykgPT4gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+XG4gICAgKHByb3BlcnR5LnN1Z2dlc3Rpb25zPy5pc1VuaXF1ZUtleSA/IChcbiAgICAgIHRoaXMuc3VnZ2VzdEV4aXN0aW5nTm9kZSh0eXBlLCB0ZXJtLCBwcm9wZXJ0eS5zdWdnZXN0aW9ucy5pc1VuaXF1ZUtleSlcbiAgICApIDogKFxuICAgICAgcHJvcGVydHkuc3VnZ2VzdGlvbnM/LmlzTGlua05vZGUgP1xuICAgICAgICBvZihmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucyh0aGlzLm5vZGVNYXAsIHR5cGUpKSA6IChcbiAgICAgICAgICBzdWdnZXN0RGVmYXVsdCA/IHN1Z2dlc3REZWZhdWx0KHRlcm0sIHByb3BlcnR5KSA6IG9mKFtdKVxuICAgICAgICApXG4gICAgKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZm9ybWF0U3VnZ2VzdGlvbikpXG4gICAgKTtcblxuICBwcml2YXRlIHN1Z2dlc3Rlcjoge1xuICAgIFt0eXBlIGluIHN1Z2dlc3Rpb25UeXBlXT86IHN1Z2dlc3RGdW5jO1xuICB9ID0ge1xuICAgIGRlZmF1bHQ6ICh0ZXJtLCBwcm9wZXJ0eSkgPT4gb2YoXG4gICAgICAocHJvcGVydHk/LnN1Z2dlc3Rpb25zPy52YWx1ZXMgfHwgW10pXG4gICAgICAgIC5tYXAodiA9PiBgJHt2fWApXG4gICAgICAgIC5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLm1hcChuYW1lID0+ICh7IG5hbWUgfSkpXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuQWN0b3JdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkFjdG9yKSxcbiAgICBbTm9kZVR5cGUuQ3ljbGVdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkN5Y2xlKSxcbiAgICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCksXG4gICAgW05vZGVUeXBlLk9yZ2FuaXNhdGlvbl06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuT3JnYW5pc2F0aW9uKSxcbiAgICBbTm9kZVR5cGUuU2l0ZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU2l0ZSksXG4gICAgW05vZGVUeXBlLlNvdXJjZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU291cmNlLCAodGVybSwgeyBrZXkgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdFNvdXJjZSh0ZXJtLCA1LCBbYGJpYmxpb2dyYXBoeS4ke2tleX1gXSwgW2BiaWJsaW9ncmFwaHkuJHtrZXl9YF0pXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuVGVybV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuVGVybSwgKHRlcm0sIHsgc3VnZ2VzdGlvbnMgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdCh0ZXJtLCBOb2RlVHlwZS5UZXJtLCBzdWdnZXN0aW9ucz8ucXVlcmllcyB8fCBbXSwgbnVsbCwgNSwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcylcbiAgICApXG4gIH07XG4gIHB1YmxpYyBwcm9wZXJ0eVN1Z2dlc3QgPSAoZnVsbEtleTogc3RyaW5nLCBzdWdnZXN0VHlwZTogc3VnZ2VzdGlvblR5cGUpID0+ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoc3VnZ2VzdFR5cGUgPT09IGRlZmF1bHRTdWdnZXN0aW9uVHlwZSA/IDAgOiAzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1lcmdlTWFwKHRlcm0gPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGZpbmRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIGZ1bGxLZXkpO1xuICAgICAgICByZXR1cm4gcHJvcGVydHk/LmVkaXRhYmxlICYmIHN1Z2dlc3RUeXBlIGluIHRoaXMuc3VnZ2VzdGVyID9cbiAgICAgICAgICBvZih0ZXJtKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHByb3BlcnR5LmxvYWRpbmcgPSB0cnVlKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnN1Z2dlc3RlcltzdWdnZXN0VHlwZV0hKHRlcm0sIHByb3BlcnR5KSksXG4gICAgICAgICAgICB0YXAoKCkgPT4gcHJvcGVydHkubG9hZGluZyA9IGZhbHNlKVxuICAgICAgICAgICkgOlxuICAgICAgICAgIG9mKFtdKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEhlU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJzU2VydmljZTogSGVVc2Vyc1NlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzY2hlbWFUeXBlID0gdGhpcy5ub2RlIS50eXBlIHx8IHRoaXMubm9kZSFbJ0B0eXBlJ107XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWFzID8gdGhpcy5zY2hlbWFzW3NjaGVtYVR5cGVdIDoge30gYXMgZGVmaW5pdGlvbjtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmVycm9ycy5maWx0ZXIoZmlsdGVyRXJyb3IpO1xuICAgIGNvbnN0IGVycm9yID0gcHJvcGVydHlFcnJvcihlcnJvcnMpKCcnKTtcbiAgICB0aGlzLm5vZGVQcm9wZXJ0eSA9IHRoaXMuc2NoZW1hcyA/IHtcbiAgICAgIGlkOiBwcm9wZXJ0eUlkKCksXG4gICAgICBzY2hlbWEsXG4gICAgICBzY2hlbWFUeXBlLFxuICAgICAgZWRpdGFibGU6ICEhdGhpcy5ub2RlIS50eXBlLFxuICAgICAgZnVsbEtleTogJycsXG4gICAgICBrZXk6ICcnLFxuICAgICAgdmFsdWU6IHt9LFxuICAgICAgZXJyb3I6IGZvcm1hdEVycm9yKGVycm9yKSxcbiAgICAgIGhhc0Vycm9yOiBlcnJvckhhc0Vycm9yKGVycm9yKSxcbiAgICAgIGhhc1dhcm5pbmc6IGVycm9ySGFzV2FybmluZyhlcnJvciksXG4gICAgICBzdWdnZXN0aW9uczoge30sXG4gICAgICBuZXdQcm9wZXJ0eToge30sXG4gICAgICBuZXdFcnJvcjogeyBsZXZlbDogJ3dhcm5pbmcnIH0sXG4gICAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICAgIGFkZFByb3BlcnR5RW5hYmxlZDogaXNBZGRQcm9wZXJ0eUVuYWJsZWQodGhpcy5ub2RlISwgc2NoZW1hVHlwZSwgc2NoZW1hKVxuICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjdXJzZXIgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKHRoaXMuc2NoZW1hcyEsIGVycm9ycywgc2NoZW1hLCB0aGlzLmRlZXBFZGl0YWJsZSk7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gcmVjdXJzZXIodGhpcy5ub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlciwgX3ZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeVByb3BlcnR5KF9pbmRleDogbnVtYmVyLCB7IGlkLCBmdWxsS2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gW2Z1bGxLZXksIGlkXS5qb2luKCdfJyk7XG4gIH1cblxuICBwdWJsaWMgaGFzQWRkb25zKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5ICYmIChcbiAgICAgIHRoaXMuZW5hYmxlQWRkRXJyb3IocHJvcGVydHkpIHx8XG4gICAgICAodGhpcy5lZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSkgfHxcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlFbmFibGVkKHByb3BlcnR5KSB8fFxuICAgICAgdGhpcy5pc1JlcXVpcmVkKHByb3BlcnR5KSB8fFxuICAgICAgcHJvcGVydHkuZXh0ZXJuYWxVcmw/LnVybCB8fFxuICAgICAgdGhpcy5tYXBEcmF3aW5nTW9kZXMocHJvcGVydHkpLmxlbmd0aCB8fFxuICAgICAgdGhpcy51bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGlzUmVxdWlyZWQoeyB2YWx1ZSwgaXNSZXF1aXJlZCB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGlzUmVxdWlyZWQgJiYgaXNFbXB0eSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBzdWdnZXN0VGVybUZpZWxkcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ucG9wdWxhdGVUZXJtRmllbGRzLFxuICAgICAgLi4uKHRoaXMuc2hvd1N1Z2dlc3RlZERlZmF1bHRQcm9wZXJ0aWVzID8gcG9wdWxhdGVUZXJtRGVmYXVsdFByb3BlcnRpZXMgOiBbXSlcbiAgICBdO1xuICB9XG5cbiAgLy8gLS0tIEVycm9yc1xuXG4gIHB1YmxpYyBlbmFibGVBZGRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmVycm9yc0VkaXRhYmxlICYmICFwcm9wZXJ0eS5oYXNFcnJvciAmJiAhcHJvcGVydHkuaGFzV2FybmluZztcbiAgfVxuXG4gIHB1YmxpYyBhZGRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgeyBtZXNzYWdlLCBsZXZlbCB9OiBJRXJyb3JQcm9wZXJ0eSkge1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gcHJvcGVydHkuZnVsbEtleS5zcGxpdCgnLicpO1xuICAgIGtleXMucG9wKCk7XG4gICAgY29uc3QgZXJyb3I6IElWYWxpZGF0aW9uRXJyb3IgPSBwcm9wZXJ0eS5pc0FkZGVkID8ge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGxldmVsOiBsZXZlbCB8fCAnZXJyb3InLFxuICAgICAgZGF0YVBhdGg6IGtleVRvRGF0YVBhdGgoa2V5cy5qb2luKCcuJykpLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG1pc3NpbmdQcm9wZXJ0eTogcHJvcGVydHkua2V5XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBsZXZlbDogbGV2ZWwgfHwgJ2Vycm9yJyxcbiAgICAgIGRhdGFQYXRoOiBrZXlUb0RhdGFQYXRoKHByb3BlcnR5LmZ1bGxLZXkpXG4gICAgfTtcbiAgICBwcm9wZXJ0eS5uZXdFcnJvciA9IHsgbGV2ZWw6ICd3YXJuaW5nJyB9O1xuICAgIHByb3BlcnR5LmVycm9yID0gZXJyb3I7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBlcnJvckhhc0Vycm9yKGVycm9yKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gZXJyb3JIYXNXYXJuaW5nKGVycm9yKTtcbiAgICB0aGlzLm5vZGVFcnJvckFkZGVkLmVtaXQoZXJyb3IpO1xuICB9XG5cbiAgcHVibGljIGVkaXRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHByb3BlcnR5Lm5ld0Vycm9yID0gcHJvcGVydHkuZXJyb3I7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0eS5lcnJvcj8uaW5kZXg7XG4gICAgcHJvcGVydHkuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBoYXNFcnJvcihwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gaGFzV2FybmluZyhwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICB0aGlzLm5vZGVFcm9yclJlc29sdmVkLmVtaXQoaW5kZXgpO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eS5mdWxsS2V5KTtcbiAgfVxuXG4gIC8vIC0tLVxuXG4gIHB1YmxpYyB0eXBlYWhlYWRGb2N1cyhlOiBFdmVudCkge1xuICAgIGlmIChlLmJ1YmJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBuZXcgRXZlbnQoJ2lucHV0Jyk7XG4gICAgICBlLnRhcmdldD8uZGlzcGF0Y2hFdmVudChpbnB1dEV2ZW50KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSAmJiAhdGhpcy5lcnJvcnNFZGl0YWJsZSAmJiBwcm9wZXJ0eS5hZGRQcm9wZXJ0eUVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIG5ld1Byb3BlcnRpZXMocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGZpZWxkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gbm9kZUF2YWlsYWJsZVByb3BlcnRpZXModGhpcy5ub2RlISwgcHJvcGVydHkpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcihwcm9wID0+IHByb3AudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWVsZC50b0xvd2VyQ2FzZSgpKSlcbiAgICAgIC5tYXAobmFtZSA9PiAoeyBuYW1lLCBwcm9wOiBwcm9wZXJ0aWVzW25hbWVdIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgZGF0YTogYW55LCBlZGl0YWJsZT86IGJvb2xlYW4sIHJlcGxhY2VQYXJlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcmVwbGFjZVBhcmVudCA/IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpIDogcHJvcGVydHk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHJlY3Vyc2l2ZVByb3BlcnRpZXMoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBbXSwgdGhpcy5zY2hlbWFzIVt0aGlzLm5vZGUhLnR5cGVdLCB0aGlzLmRlZXBFZGl0YWJsZSwgcGFyZW50LmZ1bGxLZXlcbiAgICApKGRhdGEpO1xuICAgIHVwZGF0ZVByb3BlcnRpZXMoeyBwcm9wZXJ0aWVzIH0sIHByb3AgPT4ge1xuICAgICAgcHJvcC5lZGl0YWJsZSA9IHR5cGVvZiBlZGl0YWJsZSA9PT0gJ3VuZGVmaW5lZCcgPyBwcm9wLmVkaXRhYmxlIDogZWRpdGFibGU7XG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9KTtcbiAgICBwYXJlbnQuZWRpdGFibGUgPSB0eXBlb2YgZWRpdGFibGUgPT09ICd1bmRlZmluZWQnID8gcGFyZW50LmVkaXRhYmxlIDogZWRpdGFibGU7XG4gICAgcGFyZW50LnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIHBhcmVudC52YWx1ZSA9IGRhdGE7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKGRhdGEsIHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgc3VnZ2VzdGlvblNlbGVjdGVkKHsgJ0BpZCc6IF9pZCwgbmFtZSwgdHlwZSwgaWQsIC4uLmRhdGEgfSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gX2lkID9cbiAgICAgIC8vIHN1Z2dlc3Rpb25zIGZyb20gZXhpc3Rpbmcgbm9kZXNcbiAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyAnQGlkJzogX2lkLCAnQHR5cGUnOiBwcm9wZXJ0eS5zdWdnZXN0aW9ucz8udHlwZSwgbmFtZSwgLi4uZGF0YSB9LCBmYWxzZSkgOlxuICAgICAgKFxuICAgICAgICAvLyBzdWdnZXN0aW9uIGZyb20gbGlua2VkIG5vZGVzXG4gICAgICAgIHR5cGUgJiYgaWQgP1xuICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyB0eXBlLCBpZCwgLi4uZGF0YSB9LCB0cnVlKSA6XG4gICAgICAgICAgLy8gc3VnZ2VzdGlvbiBieSBuYW1lID0+IGVudW0gdmFsdWVzXG4gICAgICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmFtZSwgcHJvcGVydHkpXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZEFycmF5R3JvdXAoYXJyYXk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5zY2hlbWFzIVthcnJheS5zY2hlbWFUeXBlXTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpO1xuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLCBwcm9wLCB2YWx1ZSwgYCR7YXJyYXkuZnVsbEtleX1bJHthcnJheS5wcm9wZXJ0aWVzLmxlbmd0aH1dYFxuICAgICk7XG4gICAgYXJyYXkucHJvcGVydGllcy5wdXNoKG5ld1Byb3BlcnR5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIGFycmF5LmZ1bGxLZXkpO1xuICB9XG5cbiAgcHVibGljIGR1cGxpY2F0ZUFycmF5R3JvdXAoYXJyYXk6IElOb2RlUHJvcGVydHksIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSArcHJvcGVydHkua2V5O1xuICAgIGNvbnN0IG5ld1Byb3BlcnR5OiBJTm9kZVByb3BlcnR5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSkpO1xuICAgIG5ld1Byb3BlcnR5LmlkID0gcHJvcGVydHlJZCgpO1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDAsIHNhZmVKU09OUGFyc2UobmV3UHJvcGVydHkudmFsdWUpKTtcbiAgICBhcnJheS5wcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMCwgbmV3UHJvcGVydHkpO1xuICAgIC8vIG5lZWQgdG8gY2hhbmdlIGtleSBvbiBldmVyeSBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gICAgcmVmcmVzaFByb3BlcnR5S2V5cyhhcnJheSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBhcnJheS5mdWxsS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5LCB7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSAra2V5O1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAvLyBuZWVkIHRvIGNoYW5nZSBrZXkgb24gZXZlcnkgcHJvcGVydGllcyByZWN1cnNpdmVseVxuICAgIHJlZnJlc2hQcm9wZXJ0eUtleXMoYXJyYXkpO1xuICAgIHRoaXMubm9kZUNoYW5nZS5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICAvLyBpZiBubyBtb3JlIHZhbHVlcywgcmVtb3ZlIHBhcmVudCBncm91cCBlbnRpcmVseVxuICAgIHJldHVybiBhcnJheS5wcm9wZXJ0aWVzLmxlbmd0aCA/IG51bGwgOiB0aGlzLnByb3BlcnR5Q2hhbmdlZChudWxsLCBhcnJheSk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVBcnJheUdyb3VwVG9Qb3NpdGlvbihhcnJheTogSU5vZGVQcm9wZXJ0eSwgY3VycmVudEluZGV4OiBudW1iZXIsIG5ld0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IFsuLi5nZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KV07XG4gICAgbW92ZUl0ZW1JbkFycmF5KHZhbHVlLCBjdXJyZW50SW5kZXgsIG5ld0luZGV4KTtcbiAgICBtb3ZlSXRlbUluQXJyYXkoYXJyYXkucHJvcGVydGllcywgY3VycmVudEluZGV4LCBuZXdJbmRleCk7XG4gICAgLy8gbmVlZCB0byBjaGFuZ2Uga2V5IG9uIGV2ZXJ5IHByb3BlcnRpZXMgcmVjdXJzaXZlbHlcbiAgICByZWZyZXNoUHJvcGVydHlLZXlzKGFycmF5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIGFycmF5LmZ1bGxLZXkpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBcnJheUdyb3VwVXAoYXJyYXk6IElOb2RlUHJvcGVydHksIHsga2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtrZXk7XG4gICAgcmV0dXJuIHRoaXMubW92ZUFycmF5R3JvdXBUb1Bvc2l0aW9uKGFycmF5LCBpbmRleCwgaW5kZXggLSAxKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQXJyYXlHcm91cERvd24oYXJyYXk6IElOb2RlUHJvcGVydHksIHsga2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtrZXk7XG4gICAgcmV0dXJuIHRoaXMubW92ZUFycmF5R3JvdXBUb1Bvc2l0aW9uKGFycmF5LCBpbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9wZXJ0eUNoYW5nZWQodmFsdWU6IGFueSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eS5mdWxsS2V5LCB2YWx1ZSk7XG4gICAgcHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkID0gaXNBZGRQcm9wZXJ0eUVuYWJsZWQoXG4gICAgICB0aGlzLm5vZGUhLCBwcm9wZXJ0eS5zY2hlbWFUeXBlLCBwcm9wZXJ0eS5zY2hlbWEhLCBwcm9wZXJ0eS5mdWxsS2V5XG4gICAgKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcHJvcGVydHkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHByb3BlcnR5LmNoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gY2xlYW5OZXdWYWx1ZShwYXJzZU5ld1ZhbHVlKHByb3BlcnR5LnNjaGVtYSEsIHZhbHVlKSk7XG4gICAgLy8gdHJpZ2dlciByZWZyZXNoIG9mIG5vZGVcbiAgICBjb25zdCBub2RlID0gY29weU9iamVjdCh0aGlzLm5vZGUpO1xuICAgIHNldChub2RlLCBwcm9wZXJ0eS5mdWxsS2V5LCBuZXdWYWx1ZSk7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAvLyB0cmlnZ2VyIGZvciBsaXN0ZW5lcnNcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogcHJvcGVydHkuZnVsbEtleSwgdmFsdWU6IG5ld1ZhbHVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0UHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGtleTogc3RyaW5nLCBkZWY6IGRlZmluaXRpb24pIHtcbiAgICBjb25zdCBub2RlID0gcHJvcGVydHkua2V5ID8gZ2V0KHRoaXMubm9kZSwgcHJvcGVydHkuZnVsbEtleSkgOiB0aGlzLm5vZGU7XG4gICAgY29uc3QgZnVsbEtleSA9IHByb3BlcnR5LmtleSA/IGAke3Byb3BlcnR5LmZ1bGxLZXl9LiR7a2V5fWAgOiBrZXk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHByb3BlcnR5LmtleSA/IHByb3BlcnR5LnByb3BlcnRpZXMgOiB0aGlzLnByb3BlcnRpZXM7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSB0eXBlVG9OZXdQcm9wZXJ0eSh0aGlzLnNjaGVtYXMhLCBkZWYsIHRoaXMuc2NoZW1hcyFbcHJvcGVydHkuc2NoZW1hVHlwZV0sIG5vZGUsIGZ1bGxLZXkpO1xuICAgIGluc2VydFByb3BlcnR5KHByb3BlcnRpZXMsIGZ1bGxLZXksIG5ld1Byb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmV3UHJvcGVydHkudmFsdWUsIG5ld1Byb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHBhcmVudCA9PT0gcHJvcGVydHkgPyB0aGlzLm5vZGVQcm9wZXJ0eSEgOiBwYXJlbnQ7XG4gICAgY29uc3QgbmV3UHJvcGVydGllcyA9IHRoaXMubmV3UHJvcGVydGllcyhuZXdQcm9wZXJ0eSwgcHJvcGVydHkua2V5KTtcbiAgICBuZXdQcm9wZXJ0eS5uZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnRpZXNbMF07XG4gICAgcmV0dXJuIG5ld1Byb3BlcnR5Lm5ld1Byb3BlcnR5ID8gdGhpcy5hZGRQcm9wZXJ0eShuZXdQcm9wZXJ0eSkgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFkZFByb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgeyBuYW1lLCBwcm9wIH0gPSBwcm9wZXJ0eS5uZXdQcm9wZXJ0eSE7XG4gICAgcHJvcGVydHkubmV3UHJvcGVydHkgPSB7fTtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ0BpZCcgP1xuICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiAnJywgdHlwZTogcHJvcGVydHkuc2NoZW1hVHlwZSB9LCB1bmRlZmluZWQsIGZhbHNlKSA6XG4gICAgICB0aGlzLmFkZERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSwgbmFtZSEsIHByb3AhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgdmFsdWU6IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWwpIHtcbiAgICBjb25zdCBsYXRpdHVkZSA9IHNpYmxpbmdQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LCAnbGF0aXR1ZGUnKTtcbiAgICBjb25zdCBsb25naXR1ZGUgPSBzaWJsaW5nUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2xvbmdpdHVkZScpO1xuICAgIHJldHVybiBbXG4gICAgICBsYXRpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxhdCwgbGF0aXR1ZGUpIDogbnVsbCxcbiAgICAgIGxvbmdpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxuZywgbG9uZ2l0dWRlKSA6IG51bGxcbiAgICBdO1xuICB9XG5cbiAgLy8gTWFwXG5cbiAgcHVibGljIGdldCBzaG93TWFwKCkge1xuICAgIHJldHVybiAoIXRoaXMuZWRpdGFibGUgfHwgdGhpcy5lcnJvck1vZGUpICYmIFtTY2hlbWFUeXBlLlNpdGUsIFNjaGVtYVR5cGUuT3JnYW5pc2F0aW9uXS5pbmNsdWRlcyh0aGlzLm5vZGUhLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIG1hcERyYXdpbmdNb2Rlcyh7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFsnYm91bmRhcnknXS5pbmNsdWRlcyhrZXkpID8gW1xuICAgICAgZ29vZ2xlLm1hcHMuZHJhd2luZy5PdmVybGF5VHlwZS5QT0xZR09OXG4gICAgXSA6IChbXG4gICAgICAnbGF0aXR1ZGUnLCAnbG9uZ2l0dWRlJ1xuICAgIF0uaW5jbHVkZXMoa2V5KSA/IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuTUFSS0VSXG4gICAgXSA6IFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1hcERyYXdpbmdDbG9zZWQobmV3VmFsdWUpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5O1xuICAgIHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZSddLmluY2x1ZGVzKHByb3BlcnR5IS5rZXkpID9cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eSEsIG5ld1ZhbHVlKSA6XG4gICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChuZXdWYWx1ZSwgcHJvcGVydHkhKTtcbiAgfVxuXG4gIC8vIEJpYmxpb2dyYXBoeSBTZWFyY2hcblxuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoeyBrZXksIHNjaGVtYVR5cGUgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbGlkU2NoZW1hID0gW1NjaGVtYVR5cGUuQmlibGlvZ3JhcGh5XS5pbmNsdWRlcyhzY2hlbWFUeXBlKTtcbiAgICBjb25zdCB2YWxpZUtleSA9IFsndGl0bGUnLCAnZG9jdW1lbnRET0knLCAnc2NvcHVzJ10uaW5jbHVkZXMoa2V5KTtcbiAgICByZXR1cm4gdmFsaWRTY2hlbWEgJiYgdmFsaWVLZXkgPyBrZXkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaWJsaW9ncmFwaHkodmFsdWU6IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgdGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ISk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlcyA/IHtcbiAgICAgIC4uLnBhcmVudC52YWx1ZSxcbiAgICAgIGJpYmxpb2dyYXBoeTogdmFsdWVcbiAgICB9IDogdmFsdWU7XG4gICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEsIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2UodmFsdWU6IFBhcnRpYWw8U291cmNlPikge1xuICAgIC8vIGNhbm5vdCByZXBsYWNlIGEgdG9wLWxldmVsIHNvdXJjZVxuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzICYmIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YSh0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLCB7XG4gICAgICAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsXG4gICAgICAuLi52YWx1ZVxuICAgIH0sICEoJ0BpZCcgaW4gdmFsdWUpKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEuZnVsbEtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBwdWJsaWMgb25CaWJsaW9ncmFwaGllc1NlYXJjaENsb3NlZCh2YWx1ZT86IFBhcnRpYWw8U291cmNlPiB8IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSA9IHZhbHVlID8gKFxuICAgICAgdmFsdWUudHlwZSA9PT0gU2NoZW1hVHlwZS5CaWJsaW9ncmFwaHkgP1xuICAgICAgICB0aGlzLnVwZGF0ZUJpYmxpb2dyYXBoeSh2YWx1ZSkgOlxuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZSh2YWx1ZSBhcyBQYXJ0aWFsPFNvdXJjZT4pXG4gICAgKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEFjdG9yLkBpZFxuXG4gIHB1YmxpYyBhc3luYyBzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgYWN0b3JJZCwgbmFtZSB9ID0gYXdhaXQgdGhpcy51c2Vyc1NlcnZpY2UubG9nZ2VkSW5Vc2VyO1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IGFjdG9ySWQsICdAdHlwZSc6IE5vZGVUeXBlLkFjdG9yLCBuYW1lIH0sIGZhbHNlKTtcbiAgfVxuXG4gIC8vIEN5Y2xlLmN5Y2xlRHVyYXRpb25cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbih0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQoZHVyYXRpb24sIHByb3BlcnR5KTtcbiAgfVxuXG4gIC8vIEN5Y2xlLnN0YXJ0RGF0ZVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKHN0YXJ0RGF0ZSwgcHJvcGVydHkpO1xuICB9XG5cbiAgLy8gVW5pdHMgY29udmVydGVyXG5cbiAgcHVibGljIHVuaXRDb252ZXJ0ZXJFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgWyd2YWx1ZScsICdtaW4nLCAnbWF4JywgJ3NkJ10uaW5jbHVkZXMocHJvcGVydHkua2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuVW5pdENvbnZlcnRlcihwb3BvdmVyLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkudmFsdWU7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gc2libGluZ1Byb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHksICd0ZXJtJyk7XG4gICAgY29uc3QgdGVybSA9IHNhZmVKU09OUGFyc2UodGVybVByb3BlcnR5Py52YWx1ZSk7XG4gICAgY29uc3QgdW5pdHMgPSB0ZXJtPy51bml0cztcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbih7IHZhbHVlLCB0ZXJtLCB1bml0cyB9KTtcbiAgfVxuXG4gIC8vIFJlY29tbWVuZGF0aW9uc1xuXG4gIHB1YmxpYyBvblNlbGVjdFJlY29tbWVuZGF0aW9uKGFycmF5OiBJTm9kZVByb3BlcnR5LCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc2NoZW1hcyFbYXJyYXkuc2NoZW1hVHlwZV07XG4gICAgY29uc3QgdmFsdWUgPSBnZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KTtcblxuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLCBwcm9wLCB2YWx1ZSwgYCR7YXJyYXkuZnVsbEtleX1bJHthcnJheS5wcm9wZXJ0aWVzLmxlbmd0aH1dYFxuICAgICk7XG4gICAgbmV3UHJvcGVydHkudmFsdWUudGVybSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdmFsdWVbYXJyYXkucHJvcGVydGllcy5sZW5ndGhdLnRlcm0gPSB7IHR5cGU6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiBpZCB9O1xuXG4gICAgLy8gaW5zZXJ0IFRlcm0gd2l0aCBAaWRcbiAgICBjb25zdCB0ZXJtS2V5ID0gYCR7bmV3UHJvcGVydHkuZnVsbEtleX0udGVybWA7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gbmV3UHJvcGVydHkucHJvcGVydGllcy5maW5kKHAgPT4gcC5rZXkgPT09ICd0ZXJtJykgfHwgdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLnByb3BlcnRpZXMudGVybSwgcHJvcCwgbmV3UHJvcGVydHkudmFsdWUsIHRlcm1LZXlcbiAgICApO1xuICAgIHRlcm1Qcm9wZXJ0eS52YWx1ZSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdGVybVByb3BlcnR5LnByb3BlcnRpZXMgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5zY2hlbWFzISwgW10sIHRoaXMuc2NoZW1hcyFbdGhpcy5ub2RlIS50eXBlXSwgdGhpcy5kZWVwRWRpdGFibGUsIHRlcm1LZXlcbiAgICApKHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH0pO1xuICAgIGluc2VydFByb3BlcnR5KG5ld1Byb3BlcnR5LnByb3BlcnRpZXMsIHRlcm1LZXksIHRlcm1Qcm9wZXJ0eSk7XG5cbiAgICAvLyB0ZXJtIGNhbm5vdCBiZSBlZGl0ZWQsIG5lZWQgdG8gcmVtb3ZlIGZpcnN0XG4gICAgdXBkYXRlUHJvcGVydGllcyh0ZXJtUHJvcGVydHksIHAgPT4ge1xuICAgICAgcC5lZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSk7XG4gICAgdGVybVByb3BlcnR5LmVkaXRhYmxlID0gZmFsc2U7XG5cbiAgICBhcnJheS5wcm9wZXJ0aWVzLnB1c2gobmV3UHJvcGVydHkpO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZSwgYXJyYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC10b2dnbGUgcC00XCIgKGNsaWNrKT1cImlzT3BlbiA9ICFpc09wZW5cIiBwb2ludGVyPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxzcGFuICpuZ0lmPVwibm9kZVByb3BlcnR5XCIgY2xhc3M9XCJpcy1weC0yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC1kYW5nZXJdPVwibm9kZVByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC13YXJuaW5nXT1cIm5vZGVQcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICA+XG4gICAgICA8aGUtbm9kZS1pY29uIFt0eXBlXT1cIm5vZGVQcm9wZXJ0eS5zY2hlbWFUeXBlXCI+PC9oZS1ub2RlLWljb24+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgaXNPcGVuICYmIG5vZGVQcm9wZXJ0eVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG5vZGVQcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc09wZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIG1iLTJcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cIm5vZGVQcm9wZXJ0eT8uZXJyb3JcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogbm9kZVByb3BlcnR5LCBlZGl0OiB0cnVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3BlcnR5IG9mIHByb3BlcnRpZXM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5TWFwOyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48aGUtbWFwcy1kcmF3aW5nLWNvbmZpcm0gKm5nSWY9XCIhIW1hcERyYXdpbmdQcm9wZXJ0eVwiXG4gIFt2YWx1ZV09XCJtYXBEcmF3aW5nUHJvcGVydHkudmFsdWVcIiBbbW9kZXNdPVwibWFwRHJhd2luZ01vZGVzKG1hcERyYXdpbmdQcm9wZXJ0eSlcIlxuICAoY2xvc2VkKT1cIm9uTWFwRHJhd2luZ0Nsb3NlZCgkZXZlbnQpXCJcbj48L2hlLW1hcHMtZHJhd2luZy1jb25maXJtPlxuXG48aGUtYmlibGlvZ3JhcGhpZXMtc2VhcmNoLWNvbmZpcm0gKm5nSWY9XCIhIWJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHlcIlxuICBbc2VhcmNoXT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkudmFsdWVcIlxuICBbc2VhcmNoQnldPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSlcIlxuICBbc2VhcmNoU291cmNlc109XCJiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXNcIlxuICAoY2xvc2VkKT1cIm9uQmlibGlvZ3JhcGhpZXNTZWFyY2hDbG9zZWQoJGV2ZW50KVwiXG4+PC9oZS1iaWJsaW9ncmFwaGllcy1zZWFyY2gtY29uZmlybT5cblxuPG5nLXRlbXBsYXRlICNsYWJlbERlc2NyaXB0aW9uIGxldC1wcm9wZXJ0eT5cbiAgPHNwYW5cbiAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgW25nYlBvcG92ZXJdPVwicHJvcGVydHkuc2NoZW1hPy5kZXNjcmlwdGlvblwiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICB0cmlnZ2Vycz1cImhvdmVyXCIgcGxhY2VtZW50PVwicmlnaHRcIiBjb250YWluZXI9XCJib2R5XCJcbiAgPlxuICAgIDxzcGFuPnt7cHJvcGVydHkua2V5fX08L3NwYW4+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGFiZWxEZWZhdWx0IGxldC1wcm9wZXJ0eT5cbiAgPHNwYW4+e3twcm9wZXJ0eS5rZXl9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2hvd1Byb3BlcnR5IGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihpc09wZW4gfHwgcHJvcGVydHkuY2xvc2VkVmlzaWJsZSkgJiYgIXByb3BlcnR5LmlzSGlkZGVuXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy02XCJcbiAgICAgIFtpZF09XCJwcm9wZXJ0eS5mdWxsS2V5ICsgJ18nICsgcHJvcGVydHkuaWRcIlxuICAgICAgW2NsYXNzLmlzLTEyXT1cInByb3BlcnR5LnByb3BlcnRpZXMubGVuZ3RoIHx8ICFwcm9wZXJ0eS5rZXlcIlxuICAgICAgW25nU3dpdGNoXT1cIiEhcHJvcGVydHkucHJvcGVydGllcy5sZW5ndGhcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZSBpcy12YXJpYWJsZSBpcy0xXCIgKm5nU3dpdGNoQ2FzZT1cImZhbHNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtMyBweS0xXCIgKm5nSWY9XCJwcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBoYXMtdGV4dC1yaWdodC10YWJsZXQgaGFzLXRleHQtZWxsaXBzaXNcIlxuICAgICAgICAgICAgKmJpbmRPbmNlPVwicHJvcGVydHlcIlxuICAgICAgICAgICAgW2Zvcl09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5LnNjaGVtYT8uZGVzY3JpcHRpb24gJiYgZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgPyBsYWJlbERlc2NyaXB0aW9uIDogbGFiZWxEZWZhdWx0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtOSBweS0xXCIgW2NsYXNzLmlzLTEyXT1cIiFwcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGVkaXRhYmxlIHx8IGVycm9yc0VkaXRhYmxlKSAmJiAocHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZylcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcGVydHksIGVkaXQ6IGZhbHNlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbFwiICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCJcbiAgICAgICAgW2NsYXNzLmlzLWxpbmtdPVwiZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWRcIlxuICAgICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAgIFtjbGFzcy5pcy1kZWZhdWx0XT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmICFwcm9wZXJ0eS5oYXNFcnJvciAmJiAhcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvcGVuLWdyb3VwIHBhbmVsLWhlYWRpbmcgcHktMFwiXG4gICAgICAgICAgKGNsaWNrKT1cInByb3BlcnR5LmlzT3BlbiA9ICFwcm9wZXJ0eS5pc09wZW5cIiBwb2ludGVyXG4gICAgICAgICAgW2NsYXNzLmlzLW9wZW5dPVwicHJvcGVydHkuaXNPcGVuXCJcbiAgICAgICAgICBbY2xhc3MuaGFzLXRleHQtd2hpdGVdPVwiKGVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkKSB8fCBwcm9wZXJ0eS5oYXNFcnJvciB8fCBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW1vYmlsZSBpcy12Y2VudGVyZWRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFwcm9wZXJ0eS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwicHJvcGVydHkuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gcHktMSBteS0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtc2l6ZS02XCI+e3twcm9wZXJ0eS5rZXl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvcGVydHkuc2NoZW1hVHlwZVwiIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWdzIG1iLTAgaGFzLWFkZG9uc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIG1iLTAgaXMtbGlnaHRcIj5UeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIG1iLTAgaXMtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxoZS1zY2hlbWEtdmVyc2lvbi1saW5rIGxpbmtDbGFzcz1cImlzLXNtYWxsXCIgW25vZGVdPVwieydAdHlwZSc6IHByb3BlcnR5LnNjaGVtYVR5cGV9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cHJvcGVydHkuc2NoZW1hVHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9oZS1zY2hlbWEtdmVyc2lvbi1saW5rPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGhlLXBvcG92ZXItY29uZmlybSBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wIHB4LTBcIlxuICAgICAgICAgICAgICAqbmdJZj1cImVkaXRhYmxlICYmICFlcnJvcnNFZGl0YWJsZVwiXG4gICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgZ3JvdXBcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICBbbWVzc2FnZV09XCInPHA+VGhpcyB3aWxsIHJlbW92ZSB0aGUgZ3JvdXAgY29tcGxldGVseS48L3A+JyArIChwcm9wZXJ0eS5pc1JlcXVpcmVkID8gJzxwPjx1Pldhcm5pbmc6IHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuPC91PjwvcD4nIDogJycpICsgJzxwPkRvIHlvdSBjb25maXJtPzwvcD4nXCJcbiAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzPVwicHgtM1wiXG4gICAgICAgICAgICAgIChjb25maXJtZWQpPVwicHJvcGVydHlDaGFuZ2VkKG51bGwsIHByb3BlcnR5KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvaGUtcG9wb3Zlci1jb25maXJtPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJsb2NrIGlzLWJsb2NrIHAtMFwiICpuZ0lmPVwicHJvcGVydHkuaXNPcGVuXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuaXNBcnJheVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTMgcHQtNFwiICpuZ0lmPVwicHJvcGVydHkuZXJyb3JcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcGVydHksIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIiAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWxwIHB5LTEgcHgtMlwiICpuZ0lmPVwiZWRpdGFibGUgJiYgIXByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgVG8gY2hhbmdlIHRoZSB7e3Byb3BlcnR5LmtleX19LCBwbGVhc2UgZGVsZXRlIGl0IGZpcnN0LCB0aGVuIGFkZCB0aGUgZmllbGQgYWdhaW5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwcm9wZXJ0eS5zY2hlbWE/LnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhlbHAgcHktMSBweC0yXCIgKm5nU3dpdGNoQ2FzZT1cIidCaWJsaW9ncmFwaHknXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlYXJjaCBieSBUaXRsZSBvciBEb2N1bWVudCBET0kgdG8gYXV0by1wb3B1bGF0ZSB0aGUgZmllbGRzIHVzaW5nIHRoZSBNZW5kZWxleSBjYXRhbG9ndWVcbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dOZXdQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTMgbXQtMVwiICpuZ0lmPVwiZXJyb3JzRWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cCBweS0yIHB4LTMgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZSBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMiBvZiBwcm9wZXJ0eS5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTIgcHgtMyBtdC0yXCIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTFcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMiBvZiBwcm9wZXJ0eS5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTAgbXktNFwiICpuZ0lmPVwicHJvcDIua2V5XCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCJwcm9wMi5mdWxsS2V5ICsgJ18nICsgcHJvcDIuaWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1hcnJheS1udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhZ3MgaGFzLWFkZG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWRhcmtcIj57e3Byb3AyLmtleX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiAhZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWluZm9cIiBwb2ludGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVBcnJheUdyb3VwKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCInRHVwbGljYXRlICcgKyBwbHVyYWxpemUocHJvcGVydHkua2V5LCAxKVwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJjbG9uZVwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWxpZ2h0XCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb3AyLmtleSAhPT0gJzAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnJheUdyb3VwVXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJNb3ZlIFVwXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LXVwXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgaXMtbGlnaHRcIiBwb2ludGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvcDIua2V5ICE9PSBwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFycmF5R3JvdXBEb3duKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiTW92ZSBEb3duXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LWRvd25cIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwidGFnIGlzLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIidSZW1vdmUgJyArIHBsdXJhbGl6ZShwcm9wZXJ0eS5rZXksIDEpXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1cIlRoaXMgd2lsbCByZW1vdmUgdGhlIGdyb3VwIGNvbXBsZXRlbHkuIERvIHlvdSBjb25maXJtP1wiIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlybWVkKT1cInJlbW92ZUFycmF5R3JvdXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9oZS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AyfVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBtdC0yXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgbXQtMlwiICpuZ0lmPVwicHJvcDIuZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcDIsIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwIGNhcmQtY29udGVudCBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lIG15LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMyBvZiBwcm9wMi5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1kYXJrIGlzLW91dGxpbmVkIGlzLXNtYWxsXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQXJyYXlHcm91cChwcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+e3twcm9wZXJ0eS5rZXkgfCBwbHVyYWxpemU6MX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGhlLW5vZGUtcmVjb21tZW5kYXRpb25zIGJ1dHRvbkNsYXNzPVwiaXMtc21hbGxcIlxuICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIiBbbm9kZUZpZWxkXT1cInByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdFJlY29tbWVuZGF0aW9uKT1cIm9uU2VsZWN0UmVjb21tZW5kYXRpb24ocHJvcGVydHksICRldmVudClcIlxuICAgICAgICAgICAgICAgID48L2hlLW5vZGUtcmVjb21tZW5kYXRpb25zPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRGb3JtIGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5LmtleVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LnN1Z2dlc3Rpb25zPy50eXBlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRTZWxlY3Q7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dElucHV0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRJbnB1dCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBtYi0wXCIgW2NsYXNzLmhhcy1hZGRvbnNdPVwiaGFzQWRkb25zKHByb3BlcnR5KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCJcbiAgICAgIFtjbGFzcy5oYXMtaWNvbnMtcmlnaHRdPVwicHJvcGVydHkubG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQgaXMtc21hbGwgc2VhcmNoLWlucHV0XCJcbiAgICAgICAgW2NsYXNzLmlzLWRhcmtdPVwicHJvcGVydHkua2V5ID09PSAndHlwZSdcIlxuICAgICAgICBbY2xhc3MuaXMtbGlua109XCJlcnJvck1vZGUgJiYgcHJvcGVydHkuY2hhbmdlZFwiXG4gICAgICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwiKCFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc0Vycm9yKSB8fCBpc1JlcXVpcmVkKHByb3BlcnR5KVwiXG4gICAgICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuXG4gICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkudmFsdWVcIiAjcHJvcGVydHlNb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICBbdHlwZV09XCJwcm9wZXJ0eS5zY2hlbWE/LnR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAnc3RyaW5nJ1wiXG4gICAgICAgIFtpZF09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSB8fCAhcHJvcGVydHkuZWRpdGFibGUgfHwgcHJvcGVydHkuc2NoZW1hPy5pbnRlcm5hbFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wZXJ0eS5wbGFjZWhvbGRlclwiXG4gICAgICAgIFthcHBUYWdzSW5wdXRdPVwie2VuYWJsZWQ6IGVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlICYmIHByb3BlcnR5LnNjaGVtYT8udHlwZSA9PT0gJ2FycmF5JywgaXRlbXM6IHByb3BlcnR5LnNjaGVtYT8uaXRlbXMsIGRlbGltaXRlcjogJzsnLCBhbGxvd0R1cGxpY2F0ZXM6IHRydWUsIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eS5wbGFjZWhvbGRlcn1cIlxuICAgICAgICAoY2hhbmdlKT1cInByb3BlcnR5Q2hhbmdlZCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSlcIlxuXG4gICAgICAgIFtwYXR0ZXJuXT1cInByb3BlcnR5LnNjaGVtYT8ucGF0dGVyblwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJwcm9wZXJ0eS5mdWxsS2V5LmVuZHNXaXRoKCdpZCcpICYmIHByb3BlcnR5LmZ1bGxLZXkgIT09ICdpZCdcIlxuICAgICAgICBbbWluXT1cInByb3BlcnR5LnNjaGVtYT8ubWluaW11bVwiXG4gICAgICAgIFttYXhdPVwicHJvcGVydHkuc2NoZW1hPy5tYXhpbXVtXCJcblxuICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInByb3BlcnR5U3VnZ2VzdChwcm9wZXJ0eS5mdWxsS2V5LCBwcm9wZXJ0eS5zdWdnZXN0aW9ucz8udHlwZSlcIlxuICAgICAgICBbcmVzdWx0VGVtcGxhdGVdPVwic3VnZ2VzdGlvblwiXG4gICAgICAgIFtpbnB1dEZvcm1hdHRlcl09XCJmb3JtYXR0ZXJcIlxuICAgICAgICBbZm9jdXNGaXJzdF09XCJ0cnVlXCJcbiAgICAgICAgKGZvY3VzKT1cImVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlICYmIHR5cGVhaGVhZEZvY3VzKCRldmVudClcIlxuICAgICAgICAoc2VsZWN0SXRlbSk9XCJzdWdnZXN0aW9uU2VsZWN0ZWQoJGV2ZW50Lml0ZW0sIHByb3BlcnR5KVwiXG4gICAgICA+XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodCBoYXMtdGV4dC1ncmV5LWRhcmtcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFwcm9wZXJ0eS5sb2FkaW5nXCI+XG4gICAgICAgIDxmYS1pY29uIGljb249XCJzcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0QWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxwIGNsYXNzPVwiaGVscCBpcy1kYW5nZXItbGlnaHRcIlxuICAgICpuZ0lmPVwiIXByb3BlcnR5Lmhhc0Vycm9yICYmIHByb3BlcnR5TW9kZWwuaW52YWxpZFwiXG4gID5cbiAgICA8c3BhbiAqYmluZE9uY2U9XCJwcm9wZXJ0eU1vZGVsLmVycm9yc1wiIFtpbm5lckhUTUxdPVwiZm9ybWF0UHJvcGVydHlFcnJvcihwcm9wZXJ0eU1vZGVsLmVycm9ycywgcHJvcGVydHkpXCI+PC9zcGFuPlxuICA8L3A+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0U2VsZWN0IGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIG1iLTBcIiBbY2xhc3MuaGFzLWFkZG9uc109XCJoYXNBZGRvbnMocHJvcGVydHkpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGwgaXMtZnVsbHdpZHRoXCJcbiAgICAgICAgW2NsYXNzLmlzLWxpbmtdPVwiZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWRcIlxuICAgICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cIighcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvcikgfHwgaXNSZXF1aXJlZChwcm9wZXJ0eSlcIlxuICAgICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgID5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkudmFsdWVcIiAjcHJvcGVydHlNb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgIFtpZF09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgICAgbmFtZT1cInJhbmRvbW5hbWVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGUgfHwgIXByb3BlcnR5LmVkaXRhYmxlIHx8IHByb3BlcnR5LnNjaGVtYT8uaW50ZXJuYWxcIlxuICAgICAgICAgIChjaGFuZ2UpPVwicHJvcGVydHlDaGFuZ2VkKCRldmVudC50YXJnZXQudmFsdWUsIHByb3BlcnR5KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0PC9vcHRpb24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJwcm9wZXJ0eS5zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgcHJvcGVydHkuc3VnZ2VzdGlvbnMudmFsdWVzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIiBbdmFsdWVdPVwidmFsdWVcIj57e3ZhbHVlfX08L29wdGlvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVtb3ZlRmllbGRBZGRvbiBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCIhZXJyb3JzRWRpdGFibGUgJiYgIXByb3BlcnR5LmlzUmVxdWlyZWRcIj5cbiAgICA8YSBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiUmVtb3ZlIGZpZWxkXCJcbiAgICAgIFtjbGFzcy5pcy1vdXRsaW5lZF09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiAocHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZylcIlxuICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHByb3BlcnR5Q2hhbmdlZChudWxsLCBwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbnB1dEFkZG9ucyBsZXQtcHJvcGVydHk+XG4gIDxoZS1wb3BvdmVyLWNvbmZpcm0gY2xhc3M9XCJjb250cm9sXCJcbiAgICAqbmdJZj1cImVuYWJsZUFkZEVycm9yKHByb3BlcnR5KVwiXG4gICAgcG9zaXRpb249XCJsZWZ0XCJcbiAgICBbY29udGVudF09XCJwb3B1cEVycm9yRm9ybVwiXG4gICAgKGNvbmZpcm1lZCk9XCJhZGRFcnJvcihwcm9wZXJ0eSwgJGV2ZW50KVwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiPlxuICAgICAgPGZhLWljb24gaWNvbj1cImNvbW1lbnRzXCI+PC9mYS1pY29uPlxuICAgIDwvc3Bhbj5cbiAgPC9oZS1wb3BvdmVyLWNvbmZpcm0+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuc2NoZW1hVHlwZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiU2NoZW1hVHlwZS5BY3RvclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0b3JBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJTY2hlbWFUeXBlLkN5Y2xlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjeWNsZUFkZG9uczsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpiaW5kT25jZT1cInByb3BlcnR5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwibWFwRHJhd2luZ01vZGVzKHByb3BlcnR5KS5sZW5ndGhcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiUGljayBvbiBNYXBcIlxuICAgICAgICAgIChjbGljayk9XCJtYXBEcmF3aW5nUHJvcGVydHkgPSBwcm9wZXJ0eVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwibWFwLW1hcmtlZC1hbHRcIj48L2ZhLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkocHJvcGVydHkpXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkFkdmFuY2VkIFNlYXJjaFwiXG4gICAgICAgICAgKGNsaWNrKT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkgPSBwcm9wZXJ0eVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwic2VhcmNoXCI+PC9mYS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbW92ZUZpZWxkQWRkb247IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImFkZFByb3BlcnR5RW5hYmxlZChwcm9wZXJ0eSlcIj5cbiAgICA8YSBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1kYW5nZXJcIiB0aXRsZT1cIkFkZCBmaWVsZFwiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgPC9hPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImlzUmVxdWlyZWQocHJvcGVydHkpXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLWRhbmdlclwiIFtmb3JdPVwicHJvcGVydHkuaWRcIlxuICAgICAgbmdiVG9vbHRpcD1cIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvZmEtaWNvbj5cbiAgICA8L2xhYmVsPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5LmV4dGVybmFsVXJsPy51cmxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICBbaHJlZl09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC51cmwgKyAocHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSA/IHByb3BlcnR5LnZhbHVlIDogJycpXCJcbiAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgW3RpdGxlXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnRpdGxlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydpcy1kYXJrIGlzLW91dGxpbmVkJzogcHJvcGVydHkua2V5ID09PSAndHlwZSd9XCJcbiAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSAmJiAhcHJvcGVydHkudmFsdWUgPyB0cnVlIDogbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLmljb24gfHwgJ2V4dGVybmFsLWxpbmstYWx0J1wiPjwvZmEtaWNvbj5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiT3BlbiBjYWxjdWxhdG9yXCJcbiAgICAgICAgW25nYlBvcG92ZXJdPVwiY29udmVydFVuaXRzXCIgYXV0b0Nsb3NlPVwib3V0c2lkZVwiXG4gICAgICAgIHRyaWdnZXJzPVwibWFudWFsXCIgI3A9XCJuZ2JQb3BvdmVyXCIgcGxhY2VtZW50PVwiYm90dG9tXCIgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgIChjbGljayk9XCJvcGVuVW5pdENvbnZlcnRlcihwLCBwcm9wZXJ0eSlcIlxuICAgICAgPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2FsY3VsYXRvclwiPjwvZmEtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYWN0b3JBZGRvbnMgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnQGlkJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkFkZCBteXNlbGYgYXMgQWN0b3JcIlxuICAgICAgKGNsaWNrKT1cInNldFVzZXJBY3RvcklkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiWydmYXInLCAnaWQtYmFkZ2UnXVwiPjwvZmEtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N5Y2xlQWRkb25zIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ2N5Y2xlRHVyYXRpb24nXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiQ2FsY3VsYXRlIHZhbHVlIGZyb20gc3RhcnREYXRlIGFuZCBlbmREYXRlXCJcbiAgICAgIChjbGljayk9XCJjYWxjdWxhdGVDeWNsZUR1cmF0aW9uKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIj48L2ZhLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnc3RhcnREYXRlJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkNhbGN1bGF0ZSB2YWx1ZSBmcm9tIGVuZERhdGUgYW5kIGN5Y2xlRHVyYXRpb25cIlxuICAgICAgKGNsaWNrKT1cImNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2hvd05ld1Byb3BlcnR5IGxldC1wcm9wZXJ0eT5cbiAgPGhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSAmJiAocHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkIHx8IGRlZXBFZGl0YWJsZSk7IGVsc2UgcGFkZGVyXCI+XG4gICAgPGZvcm0gY2xhc3M9XCJweS0zIHB4LTQgaXMtZmxleC1ncm93LTFcIiAoc3VibWl0KT1cImFkZFByb3BlcnR5KHByb3BlcnR5KVwiIG5vdmFsaWRhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaXMtaG9yaXpvbnRhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwgaXMtc21hbGxcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiIFtmb3JdPVwicHJvcGVydHkuaWQgKyAnX25ldydcIj5cbiAgICAgICAgICAgIDxzcGFuPkFkZCBuZXcgZmllbGQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5Lm5ld1Byb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBbaWRdPVwicHJvcGVydHkuaWQgKyAnX25ldydcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhbmQgc2VsZWN0IGZpZWxkIGZyb20gcmVzdWx0c1wiXG5cbiAgICAgICAgICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInN1Z2dlc3ROZXdQcm9wZXJ0eShwcm9wZXJ0eS5mdWxsS2V5KVwiXG4gICAgICAgICAgICAgICAgW3Jlc3VsdFRlbXBsYXRlXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEZvcm1hdHRlcl09XCJmb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgIFtmb2N1c0ZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbZWRpdGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJ0eXBlYWhlYWRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFwcm9wZXJ0eS5uZXdQcm9wZXJ0eSB8fCAhcHJvcGVydHkubmV3UHJvcGVydHkubmFtZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1c1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICA8L2hlYWRlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcHJvcGVydHlFcnJvciBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC1lZGl0PVwiZWRpdFwiPlxuICA8cCBjbGFzcz1cImhlbHBcIlxuICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwicHJvcGVydHkuaGFzRXJyb3JcIlxuICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cInByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgICpuZ0lmPVwicHJvcGVydHkuZXJyb3JcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1wcmUtd3JhcFwiICpiaW5kT25jZT1cInByb3BlcnR5LmVycm9yXCIgW2lubmVySFRNTF09XCJwcm9wZXJ0eS5lcnJvci5tZXNzYWdlXCI+PC9zcGFuPlxuICAgIDxhIGNsYXNzPVwicGwtMlwiXG4gICAgICAqbmdJZj1cImVkaXQgJiYgZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuZXJyb3IuaW5kZXggPj0gMFwiXG4gICAgICAoY2xpY2spPVwiZWRpdEVycm9yKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gY2xhc3M9XCJwci0yXCIgaWNvbj1cImVkaXRcIj48L2ZhLWljb24+XG4gICAgICA8c3Bhbj5FZGl0PC9zcGFuPlxuICAgIDwvYT5cbiAgICA8YSBjbGFzcz1cInBsLTJcIlxuICAgICAgKm5nSWY9XCIocHJvcGVydHkuaGFzV2FybmluZyB8fCBlcnJvcnNFZGl0YWJsZSkgJiYgcHJvcGVydHkuZXJyb3IuaW5kZXggPj0gMFwiXG4gICAgICAoY2xpY2spPVwicmVzb2x2ZUVycm9yKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gY2xhc3M9XCJwci0yXCIgaWNvbj1cImNoZWNrXCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4+UmVzb2x2ZWQ8L3NwYW4+XG4gICAgPC9hPlxuICA8L3A+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5TWFwIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cInBhbmVsIGlzLWRlZmF1bHRcIiAqbmdJZj1cInNob3dNYXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwib3Blbi1ncm91cCBwYW5lbC1oZWFkaW5nIHB5LTBcIlxuICAgICAgKGNsaWNrKT1cIm1hcFZpc2libGUgPSAhbWFwVmlzaWJsZVwiIHBvaW50ZXJcbiAgICAgIFtjbGFzcy5pcy1vcGVuXT1cIm1hcFZpc2libGVcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW1vYmlsZSBpcy12Y2VudGVyZWQgbWItMFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wXCI+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFtYXBWaXNpYmxlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwibWFwVmlzaWJsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbiBweS0xIG15LTBcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXNpemUtNlwiPlZpZXcgb24gTWFwPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYmxvY2sgaXMtYmxvY2sgcC0wXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhbWFwVmlzaWJsZVwiPlxuICAgICAgPGhlLXNpdGVzLW1hcHMgW3NpdGVzXT1cIltub2RlXVwiIFtzaG93Tm90aWNlXT1cImZhbHNlXCI+PC9oZS1zaXRlcy1tYXBzPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm9kZUVycm9yRm9ybSBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5uZXdFcnJvciAmJiBwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNtYWxsXCI+XG4gICAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInByb3BlcnR5Lm5ld0Vycm9yLmxldmVsXCI+XG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ1bmRlZmluZWRcIj5TZWxlY3QgTGV2ZWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJlcnJvclwiPkVycm9yPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2FybmluZ1wiPldhcm5pbmc8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInRleHRhcmVhIGlzLXNtYWxsXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5Lm5ld0Vycm9yLm1lc3NhZ2VcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBtZXNzYWdlIGhlcmVcIlxuICAgICAgICAgIHJvd3M9XCIxXCJcbiAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhcHJvcGVydHkubmV3RXJyb3IubGV2ZWwgfHwgIXByb3BlcnR5Lm5ld0Vycm9yLm1lc3NhZ2VcIlxuICAgICAgICAgIChjbGljayk9XCJhZGRFcnJvcihwcm9wZXJ0eSwgcHJvcGVydHkubmV3RXJyb3IpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzLWNpcmNsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwb3B1cEVycm9yRm9ybSBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdFwiPlxuICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwiZGF0YS5sZXZlbFwiPlxuICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPlNlbGVjdCBMZXZlbDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJlcnJvclwiPkVycm9yPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndhcm5pbmdcIj5XYXJuaW5nPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRhLm1lc3NhZ2VcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbWVzc2FnZSBoZXJlXCJcbiAgICAgID5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N1Z2dlc3Rpb24gbGV0LXI9XCJyZXN1bHRcIiBsZXQtdD1cInRlcm1cIj5cbiAgPG5nYi1oaWdobGlnaHRcbiAgICBbdGl0bGVdPVwici5iaWJsaW9ncmFwaHk/LnRpdGxlIHx8IHIuYmlibGlvZ3JhcGh5Py5kb2N1bWVudERPSSB8fCByLmJpYmxpb2dyYXBoeT8uc2NvcHVzIHx8IHIubmFtZVwiXG4gICAgW3Jlc3VsdF09XCJyLmJpYmxpb2dyYXBoeT8udGl0bGUgfHwgci5iaWJsaW9ncmFwaHk/LmRvY3VtZW50RE9JIHx8IHIuYmlibGlvZ3JhcGh5Py5zY29wdXMgfHwgci5uYW1lXCJcbiAgICBbdGVybV09XCJ0XCJcbiAgPjwvbmdiLWhpZ2hsaWdodD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcGFkZGVyPlxuICA8ZGl2IGNsYXNzPVwicHQtMVwiPjwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjb252ZXJ0VW5pdHMgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtdGVybT1cInRlcm1cIiBsZXQtdW5pdHM9XCJ1bml0c1wiPlxuICA8aGUtdW5pdC1jb252ZXJ0ZXIgW3ZhbHVlXT1cInZhbHVlXCIgW3Rlcm1dPVwidGVybVwiIFt0b1VuaXRzXT1cInVuaXRzXCI+PC9oZS11bml0LWNvbnZlcnRlcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
505
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBQzdCLE9BQU8sRUFBc0IsVUFBVSxFQUFFLFFBQVEsRUFBa0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVoSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsT0FBTyxFQUVMLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUN4QyxxQkFBcUIsRUFDckMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUNsRCxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQzdELFlBQVksRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQ2pILDZCQUE2QixFQUFFLHNCQUFzQixFQUNyRCw4QkFBOEIsRUFBRSx1QkFBdUIs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QUFLO2dCQUdDLElBQUk7c0JBRFYsS0FBSztnQkFHQyxPQUFPO3NCQURiLEtBQUs7Z0JBTUMsUUFBUTtzQkFEZCxLQUFLO2dCQUdDLFNBQVM7c0JBRGYsS0FBSztnQkFHQyxZQUFZO3NCQURsQixLQUFLO2dCQU1DLGNBQWM7c0JBRHBCLEtBQUs7Z0JBT0MsOEJBQThCO3NCQURwQyxLQUFLO2dCQUlFLFVBQVU7c0JBRGpCLE1BQU07Z0JBR0MsaUJBQWlCO3NCQUR4QixNQUFNO2dCQUdDLGNBQWM7c0JBRHJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBtZXJnZU1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5pbXBvcnQgc2V0IGZyb20gJ2xvZGFzaC5zZXQnO1xuaW1wb3J0IHsgSlNPTiBhcyBIZXN0aWFKc29uLCBTY2hlbWFUeXBlLCBOb2RlVHlwZSwgQmlibGlvZ3JhcGh5LCBTb3VyY2UsIFByb3BlcnR5IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgZGVmaW5pdGlvbnMsIGRlZmluaXRpb24gfSBmcm9tICdAaGVzdGlhLWVhcnRoL2pzb24tc2NoZW1hJztcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgSUVycm9yUHJvcGVydHksIElOb2RlUHJvcGVydHksXG4gIGZvcm1hdFByb3BlcnR5RXJyb3IsIHByb3BlcnR5RXJyb3IsIGhhc0Vycm9yLCBoYXNXYXJuaW5nLFxuICBzdWdnZXN0aW9uVHlwZSwgZGVmYXVsdFN1Z2dlc3Rpb25UeXBlLFxuICByZWN1cnNpdmVQcm9wZXJ0aWVzLCB0eXBlVG9OZXdQcm9wZXJ0eSwgcHJvcGVydHlJZCxcbiAgaXNBZGRQcm9wZXJ0eUVuYWJsZWQsIG5vZGVBdmFpbGFibGVQcm9wZXJ0aWVzLCBzb3J0UHJvcGVydGllcyxcbiAgZ3JvdXBDaGFuZ2VkLCBwYXJlbnRQcm9wZXJ0eSwgc2libGluZ1Byb3BlcnR5LCB1cGRhdGVQcm9wZXJ0aWVzLCByZWZyZXNoUHJvcGVydHlLZXlzLCBrZXlUb0RhdGFQYXRoLCBmaW5kUHJvcGVydHksXG4gIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkLCBjYWxjdWxhdGVDeWNsZUR1cmF0aW9uLFxuICBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQsIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlLCBwYXJzZU5ld1ZhbHVlXG59IGZyb20gJy4uL2ZpbGVzLWZvcm0ubW9kZWwnO1xuaW1wb3J0IHsgSVZhbGlkYXRpb25FcnJvciwgZXJyb3JIYXNFcnJvciwgZXJyb3JIYXNXYXJuaW5nLCBmaWx0ZXJFcnJvciwgZm9ybWF0RXJyb3IgfSBmcm9tICcuLi9maWxlcy1lcnJvci5tb2RlbCc7XG5pbXBvcnQgeyBIZVVzZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3VzZXJzL3VzZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGVTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IG1hdGNoVHlwZSwgbWF0Y2hQaHJhc2VRdWVyeSwgbWF0Y2hQaHJhc2VQcmVmaXhRdWVyeSwgbWF0Y2hCb29sUHJlZml4UXVlcnkgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IHNhZmVKU09OUGFyc2UsIGNvcHlPYmplY3QgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgcGx1cmFsaXplIH0gZnJvbSAnLi4vLi4vY29tbW9uL3BsdXJhbGl6ZSc7XG5cbmNvbnN0IE1JTl9UWVBFQUhFQURfTEVOR1RIID0gMjtcbmNvbnN0IHBvcHVsYXRlVGVybUZpZWxkcyA9IFtcbiAgJ3Rlcm1UeXBlJywgJ3VuaXRzJ1xuXTtcbmNvbnN0IHBvcHVsYXRlVGVybURlZmF1bHRQcm9wZXJ0aWVzID0gW1xuICAnZGVmYXVsdFByb3BlcnRpZXMudGVybS5uYW1lJywgJ2RlZmF1bHRQcm9wZXJ0aWVzLnRlcm0udW5pdHMnLCAnZGVmYXVsdFByb3BlcnRpZXMudmFsdWUnXG5dO1xuXG5jb25zdCBmb3JtYXRQcm9wZXJ0eSA9IChwcm9wOiBQcm9wZXJ0eSkgPT4gKHtcbiAgJ0B0eXBlJzogU2NoZW1hVHlwZS5Qcm9wZXJ0eSxcbiAgLi4ucHJvcCxcbiAgdGVybToge1xuICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgLi4ucHJvcC50ZXJtXG4gIH1cbn0pO1xuXG5jb25zdCBmb3JtYXRTdWdnZXN0aW9uID0gKHsgZGVmYXVsdFByb3BlcnRpZXMsIC4uLm5vZGUgfTogYW55KSA9PiAoe1xuICAuLi5ub2RlLFxuICAuLi4oZGVmYXVsdFByb3BlcnRpZXM/Lmxlbmd0aCA/IHsgZGVmYXVsdFByb3BlcnRpZXM6IGRlZmF1bHRQcm9wZXJ0aWVzLm1hcChmb3JtYXRQcm9wZXJ0eSkgfSA6IHt9KVxufSk7XG5cbmNvbnN0IGZvcm1hdExpbmtOb2Rlc1ByZWZpeCA9ICdMaW5rIHdpdGgnO1xuXG4vLyBwYXRjaCBlcnJvciB3aGVuIGxpbmsgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5XG5jb25zdCBjbGVhbk5ld1ZhbHVlID0gdmFsdWUgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5pZFxuICAgID8geyAuLi52YWx1ZSwgaWQ6IGNsZWFuTmV3VmFsdWUodmFsdWUuaWQpIH1cbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICA/IHZhbHVlLnN0YXJ0c1dpdGgoZm9ybWF0TGlua05vZGVzUHJlZml4KVxuICAgID8gdmFsdWUuc3BsaXQoJzonKVsxXS50cmltKClcbiAgICA6IHZhbHVlXG4gICAgOiB2YWx1ZTtcblxuY29uc3QgZm9ybWF0TGlua05vZGVzU3VnZ2VzdGlvbnMgPSAobm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9LCB0eXBlOiBOb2RlVHlwZSkgPT5cbiAgKG5vZGVNYXBbdHlwZV0gfHwgW10pLm1hcChpZCA9PiAoeyB0eXBlLCBpZCwgbmFtZTogYCR7Zm9ybWF0TGlua05vZGVzUHJlZml4fSAke3R5cGV9OiAke2lkfWAgfSkpO1xuXG50eXBlIHN1Z2dlc3RGdW5jID0gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+IE9ic2VydmFibGU8YW55W10+O1xuXG5jb25zdCBpbnNlcnRQcm9wZXJ0eSA9IChwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W10sIGtleTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBleGlzdGluZ1Byb3BlcnR5SW5kZXggPSBwcm9wZXJ0aWVzLmZpbmRJbmRleCh2ID0+IHYuZnVsbEtleSA9PT0ga2V5KTtcbiAgZXhpc3RpbmdQcm9wZXJ0eUluZGV4ID49IDAgPyAocHJvcGVydGllc1tleGlzdGluZ1Byb3BlcnR5SW5kZXhdID0gcHJvcGVydHkpIDogcHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgcHJvcGVydGllcy5zb3J0KHNvcnRQcm9wZXJ0aWVzKTtcbiAgcmV0dXJuIHByb3BlcnRpZXM7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1maWxlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlcy1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRmlsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzY2hlbWFzPzogZGVmaW5pdGlvbnM7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHVibGljIG5vZGU/OiBIZXN0aWFKc29uPFNjaGVtYVR5cGU+O1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9ID0ge307XG4gIC8qKlxuICAgKiBBbGxvdyBlZGl0aW5nIG5vZGVzIChgZmFsc2VgIGZvciByZWFkb25seSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZWRpdGFibGUgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGVlcEVkaXRhYmxlID0gdHJ1ZTtcbiAgLyoqXG4gICAqIENhbiBlZGl0IGVycm9ycy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlcnJvcnNFZGl0YWJsZSA9IGZhbHNlO1xuICAvKipcbiAgICogV2hlbiBzZWxlY3RpbmcgdGVybXMsIHdpbGwgc2hvdyBkZWZhdWx0IHByb3BlcnRpZXMgb3Igbm90LlxuICAgKiBTaG91bGQgYmUgYGZhbHNlYCB3aGVuIHVzaW5nIHNjaGVtYSB2YWxpZGF0aW9uLCBhcyBvbmx5IHRoZSBgbmFtZWAgd291bGQgYmUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1N1Z2dlc3RlZERlZmF1bHRQcm9wZXJ0aWVzID0gdHJ1ZTtcblxuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KCk7XG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVFcm9yclJlc29sdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVFcnJvckFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJVmFsaWRhdGlvbkVycm9yPigpO1xuXG4gIHB1YmxpYyBOb2RlVHlwZSA9IE5vZGVUeXBlO1xuICBwdWJsaWMgU2NoZW1hVHlwZSA9IFNjaGVtYVR5cGU7XG4gIHB1YmxpYyBpc09wZW4gPSB0cnVlO1xuICBwdWJsaWMgbWFwVmlzaWJsZSA9IGZhbHNlO1xuICBwdWJsaWMgcGx1cmFsaXplID0gcGx1cmFsaXplO1xuICBwdWJsaWMgZm9ybWF0UHJvcGVydHlFcnJvciA9IGZvcm1hdFByb3BlcnR5RXJyb3I7XG4gIHB1YmxpYyBtYXBEcmF3aW5nUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eT86IElOb2RlUHJvcGVydHk7XG4gIHB1YmxpYyBub2RlUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgcHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdID0gW107XG5cbiAgcHVibGljIGZvcm1hdHRlciA9ICh2YWx1ZTogYW55KSA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyAoJ2JpYmxpb2dyYXBoeScgaW4gdmFsdWUgPyB2YWx1ZS5iaWJsaW9ncmFwaHk/LnRpdGxlIDogdmFsdWUubmFtZSkgOiB2YWx1ZTtcblxuICBwdWJsaWMgc3VnZ2VzdE5ld1Byb3BlcnR5ID0gKHsgZnVsbEtleSB9OiBJTm9kZVByb3BlcnR5KSA9PiAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgdGVybSA9PiBvZih0aGlzLm5ld1Byb3BlcnRpZXMoZmluZFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgZnVsbEtleSkgfHwgdGhpcy5ub2RlUHJvcGVydHksIHRlcm0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0RXhpc3RpbmdOb2RlID0gKHR5cGU6IE5vZGVUeXBlLCB0ZXJtOiBzdHJpbmcsIHVuaXF1ZUtleSA9ICdAaWQnKSA9PlxuICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgb2YoW10pIDpcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0KHRlcm0sIHR5cGUsIFtdLCB7XG4gICAgICAgIGJvb2w6IHtcbiAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKHR5cGUpXSxcbiAgICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICAgIG1hdGNoUGhyYXNlUXVlcnkodGVybSwgMTAwLCB1bmlxdWVLZXkpLFxuICAgICAgICAgICAgbWF0Y2hQaHJhc2VQcmVmaXhRdWVyeSh0ZXJtLCAyMCwgdW5pcXVlS2V5KSxcbiAgICAgICAgICAgIG1hdGNoQm9vbFByZWZpeFF1ZXJ5KHRlcm0sIDEwLCB1bmlxdWVLZXkpXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICB9XG4gICAgICB9LCAxMCwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcyk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0Tm9kZSA9ICh0eXBlOiBOb2RlVHlwZSwgc3VnZ2VzdERlZmF1bHQ/OiBzdWdnZXN0RnVuYykgPT4gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+XG4gICAgKHByb3BlcnR5LnN1Z2dlc3Rpb25zPy5pc1VuaXF1ZUtleSA/IChcbiAgICAgIHRoaXMuc3VnZ2VzdEV4aXN0aW5nTm9kZSh0eXBlLCB0ZXJtLCBwcm9wZXJ0eS5zdWdnZXN0aW9ucy5pc1VuaXF1ZUtleSlcbiAgICApIDogKFxuICAgICAgcHJvcGVydHkuc3VnZ2VzdGlvbnM/LmlzTGlua05vZGUgP1xuICAgICAgICBvZihmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucyh0aGlzLm5vZGVNYXAsIHR5cGUpKSA6IChcbiAgICAgICAgICBzdWdnZXN0RGVmYXVsdCA/IHN1Z2dlc3REZWZhdWx0KHRlcm0sIHByb3BlcnR5KSA6IG9mKFtdKVxuICAgICAgICApXG4gICAgKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZm9ybWF0U3VnZ2VzdGlvbikpXG4gICAgKTtcblxuICBwcml2YXRlIHN1Z2dlc3Rlcjoge1xuICAgIFt0eXBlIGluIHN1Z2dlc3Rpb25UeXBlXT86IHN1Z2dlc3RGdW5jO1xuICB9ID0ge1xuICAgIGRlZmF1bHQ6ICh0ZXJtLCBwcm9wZXJ0eSkgPT4gb2YoXG4gICAgICAocHJvcGVydHk/LnN1Z2dlc3Rpb25zPy52YWx1ZXMgfHwgW10pXG4gICAgICAgIC5tYXAodiA9PiBgJHt2fWApXG4gICAgICAgIC5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLm1hcChuYW1lID0+ICh7IG5hbWUgfSkpXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuQWN0b3JdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkFjdG9yKSxcbiAgICBbTm9kZVR5cGUuQ3ljbGVdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkN5Y2xlKSxcbiAgICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCksXG4gICAgW05vZGVUeXBlLk9yZ2FuaXNhdGlvbl06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuT3JnYW5pc2F0aW9uKSxcbiAgICBbTm9kZVR5cGUuU2l0ZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU2l0ZSksXG4gICAgW05vZGVUeXBlLlNvdXJjZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU291cmNlLCAodGVybSwgeyBrZXkgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdFNvdXJjZSh0ZXJtLCA1LCBbYGJpYmxpb2dyYXBoeS4ke2tleX1gXSwgW2BiaWJsaW9ncmFwaHkuJHtrZXl9YF0pXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuVGVybV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuVGVybSwgKHRlcm0sIHsgc3VnZ2VzdGlvbnMgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdCh0ZXJtLCBOb2RlVHlwZS5UZXJtLCBzdWdnZXN0aW9ucz8ucXVlcmllcyB8fCBbXSwgbnVsbCwgNSwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcylcbiAgICApXG4gIH07XG4gIHB1YmxpYyBwcm9wZXJ0eVN1Z2dlc3QgPSAoeyBmdWxsS2V5LCBzdWdnZXN0aW9ucyB9OiBJTm9kZVByb3BlcnR5KSA9PiAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHN1Z2dlc3Rpb25zPy50eXBlID09PSBkZWZhdWx0U3VnZ2VzdGlvblR5cGUgPyAwIDogMzAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBtZXJnZU1hcCh0ZXJtID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBmaW5kUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBmdWxsS2V5KTtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Py5lZGl0YWJsZSAmJiBzdWdnZXN0aW9ucz8udHlwZSBpbiB0aGlzLnN1Z2dlc3RlciA/XG4gICAgICAgICAgb2YodGVybSkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiBwcm9wZXJ0eS5sb2FkaW5nID0gdHJ1ZSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zdWdnZXN0ZXJbc3VnZ2VzdGlvbnM/LnR5cGVdISh0ZXJtLCBwcm9wZXJ0eSkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHByb3BlcnR5LmxvYWRpbmcgPSBmYWxzZSlcbiAgICAgICAgICApIDpcbiAgICAgICAgICBvZihbXSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2Vyc1NlcnZpY2U6IEhlVXNlcnNTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc2NoZW1hVHlwZSA9IHRoaXMubm9kZSEudHlwZSB8fCB0aGlzLm5vZGUhWydAdHlwZSddO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hcyA/IHRoaXMuc2NoZW1hc1tzY2hlbWFUeXBlXSA6IHt9IGFzIGRlZmluaXRpb247XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5lcnJvcnMuZmlsdGVyKGZpbHRlckVycm9yKTtcbiAgICBjb25zdCBlcnJvciA9IHByb3BlcnR5RXJyb3IoZXJyb3JzKSgnJyk7XG4gICAgdGhpcy5ub2RlUHJvcGVydHkgPSB0aGlzLnNjaGVtYXMgPyB7XG4gICAgICBpZDogcHJvcGVydHlJZCgpLFxuICAgICAgc2NoZW1hLFxuICAgICAgc2NoZW1hVHlwZSxcbiAgICAgIGVkaXRhYmxlOiAhIXRoaXMubm9kZSEudHlwZSxcbiAgICAgIGZ1bGxLZXk6ICcnLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnJvciksXG4gICAgICBoYXNFcnJvcjogZXJyb3JIYXNFcnJvcihlcnJvciksXG4gICAgICBoYXNXYXJuaW5nOiBlcnJvckhhc1dhcm5pbmcoZXJyb3IpLFxuICAgICAgc3VnZ2VzdGlvbnM6IHt9LFxuICAgICAgbmV3UHJvcGVydHk6IHt9LFxuICAgICAgbmV3RXJyb3I6IHsgbGV2ZWw6ICd3YXJuaW5nJyB9LFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGlzQWRkUHJvcGVydHlFbmFibGVkKHRoaXMubm9kZSEsIHNjaGVtYVR5cGUsIHNjaGVtYSlcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY3Vyc2VyID0gcmVjdXJzaXZlUHJvcGVydGllcyh0aGlzLnNjaGVtYXMhLCBlcnJvcnMsIHNjaGVtYSwgdGhpcy5kZWVwRWRpdGFibGUpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IHJlY3Vyc2VyKHRoaXMubm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIsIF92YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlQcm9wZXJ0eShfaW5kZXg6IG51bWJlciwgeyBpZCwgZnVsbEtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFtmdWxsS2V5LCBpZF0uam9pbignXycpO1xuICB9XG5cbiAgcHVibGljIGhhc0FkZG9ucyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBwcm9wZXJ0eSAmJiAoXG4gICAgICB0aGlzLmVuYWJsZUFkZEVycm9yKHByb3BlcnR5KSB8fFxuICAgICAgKHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUpIHx8XG4gICAgICB0aGlzLmFkZFByb3BlcnR5RW5hYmxlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHRoaXMuaXNSZXF1aXJlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHByb3BlcnR5LmV4dGVybmFsVXJsPy51cmwgfHxcbiAgICAgIHRoaXMubWFwRHJhd2luZ01vZGVzKHByb3BlcnR5KS5sZW5ndGggfHxcbiAgICAgIHRoaXMudW5pdENvbnZlcnRlckVuYWJsZWQocHJvcGVydHkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1JlcXVpcmVkKHsgdmFsdWUsIGlzUmVxdWlyZWQgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBpc1JlcXVpcmVkICYmIGlzRW1wdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc3VnZ2VzdFRlcm1GaWVsZHMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnBvcHVsYXRlVGVybUZpZWxkcyxcbiAgICAgIC4uLih0aGlzLnNob3dTdWdnZXN0ZWREZWZhdWx0UHJvcGVydGllcyA/IHBvcHVsYXRlVGVybURlZmF1bHRQcm9wZXJ0aWVzIDogW10pXG4gICAgXTtcbiAgfVxuXG4gIC8vIC0tLSBFcnJvcnNcblxuICBwdWJsaWMgZW5hYmxlQWRkRXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnNFZGl0YWJsZSAmJiAhcHJvcGVydHkuaGFzRXJyb3IgJiYgIXByb3BlcnR5Lmhhc1dhcm5pbmc7XG4gIH1cblxuICBwdWJsaWMgYWRkRXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHksIHsgbWVzc2FnZSwgbGV2ZWwgfTogSUVycm9yUHJvcGVydHkpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IHByb3BlcnR5LmZ1bGxLZXkuc3BsaXQoJy4nKTtcbiAgICBrZXlzLnBvcCgpO1xuICAgIGNvbnN0IGVycm9yOiBJVmFsaWRhdGlvbkVycm9yID0gcHJvcGVydHkuaXNBZGRlZCA/IHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBsZXZlbDogbGV2ZWwgfHwgJ2Vycm9yJyxcbiAgICAgIGRhdGFQYXRoOiBrZXlUb0RhdGFQYXRoKGtleXMuam9pbignLicpKSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBtaXNzaW5nUHJvcGVydHk6IHByb3BlcnR5LmtleVxuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgbGV2ZWw6IGxldmVsIHx8ICdlcnJvcicsXG4gICAgICBkYXRhUGF0aDoga2V5VG9EYXRhUGF0aChwcm9wZXJ0eS5mdWxsS2V5KVxuICAgIH07XG4gICAgcHJvcGVydHkubmV3RXJyb3IgPSB7IGxldmVsOiAnd2FybmluZycgfTtcbiAgICBwcm9wZXJ0eS5lcnJvciA9IGVycm9yO1xuICAgIHByb3BlcnR5Lmhhc0Vycm9yID0gZXJyb3JIYXNFcnJvcihlcnJvcik7XG4gICAgcHJvcGVydHkuaGFzV2FybmluZyA9IGVycm9ySGFzV2FybmluZyhlcnJvcik7XG4gICAgdGhpcy5ub2RlRXJyb3JBZGRlZC5lbWl0KGVycm9yKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0RXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBwcm9wZXJ0eS5uZXdFcnJvciA9IHByb3BlcnR5LmVycm9yO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gcHJvcGVydHkuZXJyb3I/LmluZGV4O1xuICAgIHByb3BlcnR5LmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHByb3BlcnR5Lmhhc0Vycm9yID0gaGFzRXJyb3IocHJvcGVydHkucHJvcGVydGllcyk7XG4gICAgcHJvcGVydHkuaGFzV2FybmluZyA9IGhhc1dhcm5pbmcocHJvcGVydHkucHJvcGVydGllcyk7XG4gICAgdGhpcy5ub2RlRXJvcnJSZXNvbHZlZC5lbWl0KGluZGV4KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkuZnVsbEtleSk7XG4gIH1cblxuICAvLyAtLS1cblxuICBwdWJsaWMgdHlwZWFoZWFkRm9jdXMoZTogRXZlbnQpIHtcbiAgICBpZiAoZS5idWJibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dEV2ZW50ID0gbmV3IEV2ZW50KCdpbnB1dCcpO1xuICAgICAgZS50YXJnZXQ/LmRpc3BhdGNoRXZlbnQoaW5wdXRFdmVudCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvcGVydHlFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgIXRoaXMuZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdQcm9wZXJ0aWVzKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5LCBmaWVsZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IG5vZGVBdmFpbGFibGVQcm9wZXJ0aWVzKHRoaXMubm9kZSEsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIocHJvcCA9PiBwcm9wLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmllbGQudG9Mb3dlckNhc2UoKSkpXG4gICAgICAubWFwKG5hbWUgPT4gKHsgbmFtZSwgcHJvcDogcHJvcGVydGllc1tuYW1lXSB9KSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGRhdGE6IGFueSwgZWRpdGFibGU/OiBib29sZWFuLCByZXBsYWNlUGFyZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHBhcmVudCA9IHJlcGxhY2VQYXJlbnQgPyBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KSA6IHByb3BlcnR5O1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5zY2hlbWFzISwgW10sIHRoaXMuc2NoZW1hcyFbdGhpcy5ub2RlIS50eXBlXSwgdGhpcy5kZWVwRWRpdGFibGUsIHBhcmVudC5mdWxsS2V5XG4gICAgKShkYXRhKTtcbiAgICB1cGRhdGVQcm9wZXJ0aWVzKHsgcHJvcGVydGllcyB9LCBwcm9wID0+IHtcbiAgICAgIHByb3AuZWRpdGFibGUgPSB0eXBlb2YgZWRpdGFibGUgPT09ICd1bmRlZmluZWQnID8gcHJvcC5lZGl0YWJsZSA6IGVkaXRhYmxlO1xuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gICAgcGFyZW50LmVkaXRhYmxlID0gdHlwZW9mIGVkaXRhYmxlID09PSAndW5kZWZpbmVkJyA/IHBhcmVudC5lZGl0YWJsZSA6IGVkaXRhYmxlO1xuICAgIHBhcmVudC5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICBwYXJlbnQudmFsdWUgPSBkYXRhO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZChkYXRhLCBwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN1Z2dlc3Rpb25TZWxlY3RlZCh7ICdAaWQnOiBfaWQsIG5hbWUsIHR5cGUsIGlkLCAuLi5kYXRhIH0sIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIF9pZCA/XG4gICAgICAvLyBzdWdnZXN0aW9ucyBmcm9tIGV4aXN0aW5nIG5vZGVzXG4gICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IF9pZCwgJ0B0eXBlJzogcHJvcGVydHkuc3VnZ2VzdGlvbnM/LnR5cGUsIG5hbWUsIC4uLmRhdGEgfSwgZmFsc2UpIDpcbiAgICAgIChcbiAgICAgICAgLy8gc3VnZ2VzdGlvbiBmcm9tIGxpbmtlZCBub2Rlc1xuICAgICAgICB0eXBlICYmIGlkID9cbiAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgdHlwZSwgaWQsIC4uLmRhdGEgfSwgdHJ1ZSkgOlxuICAgICAgICAgIC8vIHN1Z2dlc3Rpb24gYnkgbmFtZSA9PiBlbnVtIHZhbHVlc1xuICAgICAgICAgIHRoaXMucHJvcGVydHlDaGFuZ2VkKG5hbWUsIHByb3BlcnR5KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc2NoZW1hcyFbYXJyYXkuc2NoZW1hVHlwZV07XG4gICAgY29uc3QgdmFsdWUgPSBnZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHR5cGVUb05ld1Byb3BlcnR5KFxuICAgICAgdGhpcy5zY2hlbWFzISwgcHJvcCwgcHJvcCwgdmFsdWUsIGAke2FycmF5LmZ1bGxLZXl9WyR7YXJyYXkucHJvcGVydGllcy5sZW5ndGh9XWBcbiAgICApO1xuICAgIGFycmF5LnByb3BlcnRpZXMucHVzaChuZXdQcm9wZXJ0eSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBhcnJheS5mdWxsS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBkdXBsaWNhdGVBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5LCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK3Byb3BlcnR5LmtleTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocHJvcGVydHkpKTtcbiAgICBuZXdQcm9wZXJ0eS5pZCA9IHByb3BlcnR5SWQoKTtcbiAgICBjb25zdCB2YWx1ZSA9IFsuLi5nZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KV07XG4gICAgdmFsdWUuc3BsaWNlKGluZGV4LCAwLCBzYWZlSlNPTlBhcnNlKG5ld1Byb3BlcnR5LnZhbHVlKSk7XG4gICAgYXJyYXkucHJvcGVydGllcy5zcGxpY2UoaW5kZXgsIDAsIG5ld1Byb3BlcnR5KTtcbiAgICAvLyBuZWVkIHRvIGNoYW5nZSBrZXkgb24gZXZlcnkgcHJvcGVydGllcyByZWN1cnNpdmVseVxuICAgIHJlZnJlc2hQcm9wZXJ0eUtleXMoYXJyYXkpO1xuICAgIHRoaXMubm9kZUNoYW5nZS5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgYXJyYXkuZnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQXJyYXlHcm91cChhcnJheTogSU5vZGVQcm9wZXJ0eSwgeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK2tleTtcbiAgICBjb25zdCB2YWx1ZSA9IFsuLi5nZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KV07XG4gICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBhcnJheS5wcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgLy8gbmVlZCB0byBjaGFuZ2Uga2V5IG9uIGV2ZXJ5IHByb3BlcnRpZXMgcmVjdXJzaXZlbHlcbiAgICByZWZyZXNoUHJvcGVydHlLZXlzKGFycmF5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgLy8gaWYgbm8gbW9yZSB2YWx1ZXMsIHJlbW92ZSBwYXJlbnQgZ3JvdXAgZW50aXJlbHlcbiAgICByZXR1cm4gYXJyYXkucHJvcGVydGllcy5sZW5ndGggPyBudWxsIDogdGhpcy5wcm9wZXJ0eUNoYW5nZWQobnVsbCwgYXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXk6IElOb2RlUHJvcGVydHksIGN1cnJlbnRJbmRleDogbnVtYmVyLCBuZXdJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBbLi4uZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSldO1xuICAgIG1vdmVJdGVtSW5BcnJheSh2YWx1ZSwgY3VycmVudEluZGV4LCBuZXdJbmRleCk7XG4gICAgbW92ZUl0ZW1JbkFycmF5KGFycmF5LnByb3BlcnRpZXMsIGN1cnJlbnRJbmRleCwgbmV3SW5kZXgpO1xuICAgIC8vIG5lZWQgdG8gY2hhbmdlIGtleSBvbiBldmVyeSBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gICAgcmVmcmVzaFByb3BlcnR5S2V5cyhhcnJheSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBhcnJheS5mdWxsS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQXJyYXlHcm91cFVwKGFycmF5OiBJTm9kZVByb3BlcnR5LCB7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSAra2V5O1xuICAgIHJldHVybiB0aGlzLm1vdmVBcnJheUdyb3VwVG9Qb3NpdGlvbihhcnJheSwgaW5kZXgsIGluZGV4IC0gMSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFycmF5R3JvdXBEb3duKGFycmF5OiBJTm9kZVByb3BlcnR5LCB7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSAra2V5O1xuICAgIHJldHVybiB0aGlzLm1vdmVBcnJheUdyb3VwVG9Qb3NpdGlvbihhcnJheSwgaW5kZXgsIGluZGV4ICsgMSk7XG4gIH1cblxuICBwdWJsaWMgcHJvcGVydHlDaGFuZ2VkKHZhbHVlOiBhbnksIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkuZnVsbEtleSwgdmFsdWUpO1xuICAgIHByb3BlcnR5LmFkZFByb3BlcnR5RW5hYmxlZCA9IGlzQWRkUHJvcGVydHlFbmFibGVkKFxuICAgICAgdGhpcy5ub2RlISwgcHJvcGVydHkuc2NoZW1hVHlwZSwgcHJvcGVydHkuc2NoZW1hISwgcHJvcGVydHkuZnVsbEtleVxuICAgICk7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHByb3BlcnR5LnZhbHVlID0gdmFsdWU7XG4gICAgICBwcm9wZXJ0eS5jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGNsZWFuTmV3VmFsdWUocGFyc2VOZXdWYWx1ZShwcm9wZXJ0eS5zY2hlbWEhLCB2YWx1ZSkpO1xuICAgIC8vIHRyaWdnZXIgcmVmcmVzaCBvZiBub2RlXG4gICAgY29uc3Qgbm9kZSA9IGNvcHlPYmplY3QodGhpcy5ub2RlKTtcbiAgICBzZXQobm9kZSwgcHJvcGVydHkuZnVsbEtleSwgbmV3VmFsdWUpO1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgLy8gdHJpZ2dlciBmb3IgbGlzdGVuZXJzXG4gICAgdGhpcy5ub2RlQ2hhbmdlLmVtaXQoeyBrZXk6IHByb3BlcnR5LmZ1bGxLZXksIHZhbHVlOiBuZXdWYWx1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVmYXVsdFByb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5LCBrZXk6IHN0cmluZywgZGVmOiBkZWZpbml0aW9uKSB7XG4gICAgY29uc3Qgbm9kZSA9IHByb3BlcnR5LmtleSA/IGdldCh0aGlzLm5vZGUsIHByb3BlcnR5LmZ1bGxLZXkpIDogdGhpcy5ub2RlO1xuICAgIGNvbnN0IGZ1bGxLZXkgPSBwcm9wZXJ0eS5rZXkgPyBgJHtwcm9wZXJ0eS5mdWxsS2V5fS4ke2tleX1gIDoga2V5O1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBwcm9wZXJ0eS5rZXkgPyBwcm9wZXJ0eS5wcm9wZXJ0aWVzIDogdGhpcy5wcm9wZXJ0aWVzO1xuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkodGhpcy5zY2hlbWFzISwgZGVmLCB0aGlzLnNjaGVtYXMhW3Byb3BlcnR5LnNjaGVtYVR5cGVdLCBub2RlLCBmdWxsS2V5KTtcbiAgICBpbnNlcnRQcm9wZXJ0eShwcm9wZXJ0aWVzLCBmdWxsS2V5LCBuZXdQcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKG5ld1Byb3BlcnR5LnZhbHVlLCBuZXdQcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWlzc2luZ1Byb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGFyZW50UHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSBwYXJlbnQgPT09IHByb3BlcnR5ID8gdGhpcy5ub2RlUHJvcGVydHkhIDogcGFyZW50O1xuICAgIGNvbnN0IG5ld1Byb3BlcnRpZXMgPSB0aGlzLm5ld1Byb3BlcnRpZXMobmV3UHJvcGVydHksIHByb3BlcnR5LmtleSk7XG4gICAgbmV3UHJvcGVydHkubmV3UHJvcGVydHkgPSBuZXdQcm9wZXJ0aWVzWzBdO1xuICAgIHJldHVybiBuZXdQcm9wZXJ0eS5uZXdQcm9wZXJ0eSA/IHRoaXMuYWRkUHJvcGVydHkobmV3UHJvcGVydHkpIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQcm9wZXJ0eShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgbmFtZSwgcHJvcCB9ID0gcHJvcGVydHkubmV3UHJvcGVydHkhO1xuICAgIHByb3BlcnR5Lm5ld1Byb3BlcnR5ID0ge307XG4gICAgcmV0dXJuIG5hbWUgPT09ICdAaWQnID9cbiAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyAnQGlkJzogJycsIHR5cGU6IHByb3BlcnR5LnNjaGVtYVR5cGUgfSwgdW5kZWZpbmVkLCBmYWxzZSkgOlxuICAgICAgdGhpcy5hZGREZWZhdWx0UHJvcGVydHkocHJvcGVydHksIG5hbWUhLCBwcm9wISk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVByb3BlcnR5Q29vcmRpbmF0ZXMocHJvcGVydHk6IElOb2RlUHJvcGVydHksIHZhbHVlOiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsKSB7XG4gICAgY29uc3QgbGF0aXR1ZGUgPSBzaWJsaW5nUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2xhdGl0dWRlJyk7XG4gICAgY29uc3QgbG9uZ2l0dWRlID0gc2libGluZ1Byb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHksICdsb25naXR1ZGUnKTtcbiAgICByZXR1cm4gW1xuICAgICAgbGF0aXR1ZGUgPyB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZS5sYXQsIGxhdGl0dWRlKSA6IG51bGwsXG4gICAgICBsb25naXR1ZGUgPyB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZS5sbmcsIGxvbmdpdHVkZSkgOiBudWxsXG4gICAgXTtcbiAgfVxuXG4gIC8vIE1hcFxuXG4gIHB1YmxpYyBnZXQgc2hvd01hcCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmVkaXRhYmxlIHx8IHRoaXMuZXJyb3JNb2RlKSAmJiBbU2NoZW1hVHlwZS5TaXRlLCBTY2hlbWFUeXBlLk9yZ2FuaXNhdGlvbl0uaW5jbHVkZXModGhpcy5ub2RlIS50eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBtYXBEcmF3aW5nTW9kZXMoeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBbJ2JvdW5kYXJ5J10uaW5jbHVkZXMoa2V5KSA/IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuUE9MWUdPTlxuICAgIF0gOiAoW1xuICAgICAgJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZSdcbiAgICBdLmluY2x1ZGVzKGtleSkgPyBbXG4gICAgICBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlUeXBlLk1BUktFUlxuICAgIF0gOiBbXSk7XG4gIH1cblxuICBwdWJsaWMgb25NYXBEcmF3aW5nQ2xvc2VkKG5ld1ZhbHVlKSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLm1hcERyYXdpbmdQcm9wZXJ0eTtcbiAgICB0aGlzLm1hcERyYXdpbmdQcm9wZXJ0eSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gWydsYXRpdHVkZScsICdsb25naXR1ZGUnXS5pbmNsdWRlcyhwcm9wZXJ0eSEua2V5KSA/XG4gICAgICB0aGlzLnVwZGF0ZVByb3BlcnR5Q29vcmRpbmF0ZXMocHJvcGVydHkhLCBuZXdWYWx1ZSkgOlxuICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmV3VmFsdWUsIHByb3BlcnR5ISk7XG4gIH1cblxuICAvLyBCaWJsaW9ncmFwaHkgU2VhcmNoXG5cbiAgcHVibGljIGJpYmxpb2dyYXBoaWVzU2VhcmNoS2V5KHsga2V5LCBzY2hlbWFUeXBlIH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWxpZFNjaGVtYSA9IFtTY2hlbWFUeXBlLkJpYmxpb2dyYXBoeV0uaW5jbHVkZXMoc2NoZW1hVHlwZSk7XG4gICAgY29uc3QgdmFsaWVLZXkgPSBbJ3RpdGxlJywgJ2RvY3VtZW50RE9JJywgJ3Njb3B1cyddLmluY2x1ZGVzKGtleSk7XG4gICAgcmV0dXJuIHZhbGlkU2NoZW1hICYmIHZhbGllS2V5ID8ga2V5IDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQmlibGlvZ3JhcGh5KHZhbHVlOiBQYXJ0aWFsPEJpYmxpb2dyYXBoeT4pIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXMgPyB7XG4gICAgICAuLi5wYXJlbnQudmFsdWUsXG4gICAgICBiaWJsaW9ncmFwaHk6IHZhbHVlXG4gICAgfSA6IHZhbHVlO1xuICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YSh0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLCBuZXdWYWx1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU291cmNlKHZhbHVlOiBQYXJ0aWFsPFNvdXJjZT4pIHtcbiAgICAvLyBjYW5ub3QgcmVwbGFjZSBhIHRvcC1sZXZlbCBzb3VyY2VcbiAgICB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlcyAmJiB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEodGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ISwge1xuICAgICAgJ0B0eXBlJzogTm9kZVR5cGUuU291cmNlLFxuICAgICAgLi4udmFsdWVcbiAgICB9LCAhKCdAaWQnIGluIHZhbHVlKSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLmZ1bGxLZXkuc3BsaXQoJy4nKS5sZW5ndGggPiAyO1xuICB9XG5cbiAgcHVibGljIG9uQmlibGlvZ3JhcGhpZXNTZWFyY2hDbG9zZWQodmFsdWU/OiBQYXJ0aWFsPFNvdXJjZT4gfCBQYXJ0aWFsPEJpYmxpb2dyYXBoeT4pIHtcbiAgICB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkgPSB2YWx1ZSA/IChcbiAgICAgIHZhbHVlLnR5cGUgPT09IFNjaGVtYVR5cGUuQmlibGlvZ3JhcGh5ID9cbiAgICAgICAgdGhpcy51cGRhdGVCaWJsaW9ncmFwaHkodmFsdWUpIDpcbiAgICAgICAgdGhpcy51cGRhdGVTb3VyY2UodmFsdWUgYXMgUGFydGlhbDxTb3VyY2U+KVxuICAgICkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBBY3Rvci5AaWRcblxuICBwdWJsaWMgYXN5bmMgc2V0VXNlckFjdG9ySWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCB7IGFjdG9ySWQsIG5hbWUgfSA9IGF3YWl0IHRoaXMudXNlcnNTZXJ2aWNlLmxvZ2dlZEluVXNlcjtcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiBhY3RvcklkLCAnQHR5cGUnOiBOb2RlVHlwZS5BY3RvciwgbmFtZSB9LCBmYWxzZSk7XG4gIH1cblxuICAvLyBDeWNsZS5jeWNsZUR1cmF0aW9uXG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb24ocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb24odGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKGR1cmF0aW9uLCBwcm9wZXJ0eSk7XG4gIH1cblxuICAvLyBDeWNsZS5zdGFydERhdGVcblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZCh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZChzdGFydERhdGUsIHByb3BlcnR5KTtcbiAgfVxuXG4gIC8vIFVuaXRzIGNvbnZlcnRlclxuXG4gIHB1YmxpYyB1bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlICYmIFsndmFsdWUnLCAnbWluJywgJ21heCcsICdzZCddLmluY2x1ZGVzKHByb3BlcnR5LmtleSk7XG4gIH1cblxuICBwdWJsaWMgb3BlblVuaXRDb252ZXJ0ZXIocG9wb3ZlciwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByb3BlcnR5LnZhbHVlO1xuICAgIGNvbnN0IHRlcm1Qcm9wZXJ0eSA9IHNpYmxpbmdQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LCAndGVybScpO1xuICAgIGNvbnN0IHRlcm0gPSBzYWZlSlNPTlBhcnNlKHRlcm1Qcm9wZXJ0eT8udmFsdWUpO1xuICAgIGNvbnN0IHVuaXRzID0gdGVybT8udW5pdHM7XG4gICAgcmV0dXJuIHBvcG92ZXIuaXNPcGVuKCkgPyBwb3BvdmVyLmNsb3NlKCkgOiBwb3BvdmVyLm9wZW4oeyB2YWx1ZSwgdGVybSwgdW5pdHMgfSk7XG4gIH1cblxuICAvLyBSZWNvbW1lbmRhdGlvbnNcblxuICBwdWJsaWMgb25TZWxlY3RSZWNvbW1lbmRhdGlvbihhcnJheTogSU5vZGVQcm9wZXJ0eSwgaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnNjaGVtYXMhW2FycmF5LnNjaGVtYVR5cGVdO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSk7XG5cbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHR5cGVUb05ld1Byb3BlcnR5KFxuICAgICAgdGhpcy5zY2hlbWFzISwgcHJvcCwgcHJvcCwgdmFsdWUsIGAke2FycmF5LmZ1bGxLZXl9WyR7YXJyYXkucHJvcGVydGllcy5sZW5ndGh9XWBcbiAgICApO1xuICAgIG5ld1Byb3BlcnR5LnZhbHVlLnRlcm0gPSB7IHR5cGU6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiBpZCB9O1xuICAgIHZhbHVlW2FycmF5LnByb3BlcnRpZXMubGVuZ3RoXS50ZXJtID0geyB0eXBlOiBOb2RlVHlwZS5UZXJtLCAnQGlkJzogaWQgfTtcblxuICAgIC8vIGluc2VydCBUZXJtIHdpdGggQGlkXG4gICAgY29uc3QgdGVybUtleSA9IGAke25ld1Byb3BlcnR5LmZ1bGxLZXl9LnRlcm1gO1xuICAgIGNvbnN0IHRlcm1Qcm9wZXJ0eSA9IG5ld1Byb3BlcnR5LnByb3BlcnRpZXMuZmluZChwID0+IHAua2V5ID09PSAndGVybScpIHx8IHR5cGVUb05ld1Byb3BlcnR5KFxuICAgICAgdGhpcy5zY2hlbWFzISwgcHJvcC5wcm9wZXJ0aWVzLnRlcm0sIHByb3AsIG5ld1Byb3BlcnR5LnZhbHVlLCB0ZXJtS2V5XG4gICAgKTtcbiAgICB0ZXJtUHJvcGVydHkudmFsdWUgPSB7IHR5cGU6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiBpZCB9O1xuICAgIHRlcm1Qcm9wZXJ0eS5wcm9wZXJ0aWVzID0gcmVjdXJzaXZlUHJvcGVydGllcyhcbiAgICAgIHRoaXMuc2NoZW1hcyEsIFtdLCB0aGlzLnNjaGVtYXMhW3RoaXMubm9kZSEudHlwZV0sIHRoaXMuZGVlcEVkaXRhYmxlLCB0ZXJtS2V5XG4gICAgKSh7IHR5cGU6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiBpZCB9KTtcbiAgICBpbnNlcnRQcm9wZXJ0eShuZXdQcm9wZXJ0eS5wcm9wZXJ0aWVzLCB0ZXJtS2V5LCB0ZXJtUHJvcGVydHkpO1xuXG4gICAgLy8gdGVybSBjYW5ub3QgYmUgZWRpdGVkLCBuZWVkIHRvIHJlbW92ZSBmaXJzdFxuICAgIHVwZGF0ZVByb3BlcnRpZXModGVybVByb3BlcnR5LCBwID0+IHtcbiAgICAgIHAuZWRpdGFibGUgPSBmYWxzZTtcbiAgICAgIHJldHVybiBwO1xuICAgIH0pO1xuICAgIHRlcm1Qcm9wZXJ0eS5lZGl0YWJsZSA9IGZhbHNlO1xuXG4gICAgYXJyYXkucHJvcGVydGllcy5wdXNoKG5ld1Byb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQodmFsdWUsIGFycmF5KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtdG9nZ2xlIHAtNFwiIChjbGljayk9XCJpc09wZW4gPSAhaXNPcGVuXCIgcG9pbnRlcj5cbiAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICA8c3BhbiAqbmdJZj1cIm5vZGVQcm9wZXJ0eVwiIGNsYXNzPVwiaXMtcHgtMlwiXG4gICAgICBbY2xhc3MuaGFzLXRleHQtZGFuZ2VyXT1cIm5vZGVQcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgICBbY2xhc3MuaGFzLXRleHQtd2FybmluZ109XCJub2RlUHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgPlxuICAgICAgPGhlLW5vZGUtaWNvbiBbdHlwZV09XCJub2RlUHJvcGVydHkuc2NoZW1hVHlwZVwiPjwvaGUtbm9kZS1pY29uPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIGlzT3BlbiAmJiBub2RlUHJvcGVydHlcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd05ld1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNPcGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGItMyBtYi0yXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogbm9kZVByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgKm5nSWY9XCJub2RlUHJvcGVydHk/LmVycm9yXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7cHJvcGVydHk6IG5vZGVQcm9wZXJ0eSwgZWRpdDogdHJ1ZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc09wZW5cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eU1hcDsgY29udGV4dDogeyRpbXBsaWNpdDogbm9kZVByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cblxuPGhlLW1hcHMtZHJhd2luZy1jb25maXJtICpuZ0lmPVwiISFtYXBEcmF3aW5nUHJvcGVydHlcIlxuICBbdmFsdWVdPVwibWFwRHJhd2luZ1Byb3BlcnR5LnZhbHVlXCIgW21vZGVzXT1cIm1hcERyYXdpbmdNb2RlcyhtYXBEcmF3aW5nUHJvcGVydHkpXCJcbiAgKGNsb3NlZCk9XCJvbk1hcERyYXdpbmdDbG9zZWQoJGV2ZW50KVwiXG4+PC9oZS1tYXBzLWRyYXdpbmctY29uZmlybT5cblxuPGhlLWJpYmxpb2dyYXBoaWVzLXNlYXJjaC1jb25maXJtICpuZ0lmPVwiISFiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5XCJcbiAgW3NlYXJjaF09XCJiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5LnZhbHVlXCJcbiAgW3NlYXJjaEJ5XT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoS2V5KGJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkpXCJcbiAgW3NlYXJjaFNvdXJjZXNdPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzXCJcbiAgKGNsb3NlZCk9XCJvbkJpYmxpb2dyYXBoaWVzU2VhcmNoQ2xvc2VkKCRldmVudClcIlxuPjwvaGUtYmlibGlvZ3JhcGhpZXMtc2VhcmNoLWNvbmZpcm0+XG5cbjxuZy10ZW1wbGF0ZSAjbGFiZWxEZXNjcmlwdGlvbiBsZXQtcHJvcGVydHk+XG4gIDxzcGFuXG4gICAgY2xhc3M9XCJ0cmlnZ2VyLXBvcG92ZXJcIlxuICAgIFtuZ2JQb3BvdmVyXT1cInByb3BlcnR5LnNjaGVtYT8uZGVzY3JpcHRpb25cIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXG4gICAgdHJpZ2dlcnM9XCJob3ZlclwiIHBsYWNlbWVudD1cInJpZ2h0XCIgY29udGFpbmVyPVwiYm9keVwiXG4gID5cbiAgICA8c3Bhbj57e3Byb3BlcnR5LmtleX19PC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xhYmVsRGVmYXVsdCBsZXQtcHJvcGVydHk+XG4gIDxzcGFuPnt7cHJvcGVydHkua2V5fX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Nob3dQcm9wZXJ0eSBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNPcGVuIHx8IHByb3BlcnR5LmNsb3NlZFZpc2libGUpICYmICFwcm9wZXJ0eS5pc0hpZGRlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtNlwiXG4gICAgICBbaWRdPVwicHJvcGVydHkuZnVsbEtleSArICdfJyArIHByb3BlcnR5LmlkXCJcbiAgICAgIFtjbGFzcy5pcy0xMl09XCJwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aCB8fCAhcHJvcGVydHkua2V5XCJcbiAgICAgIFtuZ1N3aXRjaF09XCIhIXByb3BlcnR5LnByb3BlcnRpZXMubGVuZ3RoXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmUgaXMtdmFyaWFibGUgaXMtMVwiICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLTMgcHktMVwiICpuZ0lmPVwicHJvcGVydHkua2V5XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgaGFzLXRleHQtcmlnaHQtdGFibGV0IGhhcy10ZXh0LWVsbGlwc2lzXCJcbiAgICAgICAgICAgICpiaW5kT25jZT1cInByb3BlcnR5XCJcbiAgICAgICAgICAgIFtmb3JdPVwicHJvcGVydHkuaWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eS5zY2hlbWE/LmRlc2NyaXB0aW9uICYmIGVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlID8gbGFiZWxEZXNjcmlwdGlvbiA6IGxhYmVsRGVmYXVsdDsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLTkgcHktMVwiIFtjbGFzcy5pcy0xMl09XCIhcHJvcGVydHkua2V5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihlZGl0YWJsZSB8fCBlcnJvcnNFZGl0YWJsZSkgJiYgKHByb3BlcnR5Lmhhc0Vycm9yIHx8IHByb3BlcnR5Lmhhc1dhcm5pbmcpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7cHJvcGVydHk6IHByb3BlcnR5LCBlZGl0OiBmYWxzZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWxcIiAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiXG4gICAgICAgIFtjbGFzcy5pcy1zZWNvbmRhcnldPVwiZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWRcIlxuICAgICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAgIFtjbGFzcy5pcy1kZWZhdWx0XT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmICFwcm9wZXJ0eS5oYXNFcnJvciAmJiAhcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvcGVuLWdyb3VwIHBhbmVsLWhlYWRpbmcgcHktMFwiXG4gICAgICAgICAgKGNsaWNrKT1cInByb3BlcnR5LmlzT3BlbiA9ICFwcm9wZXJ0eS5pc09wZW5cIiBwb2ludGVyXG4gICAgICAgICAgW2NsYXNzLmlzLW9wZW5dPVwicHJvcGVydHkuaXNPcGVuXCJcbiAgICAgICAgICBbY2xhc3MuaGFzLXRleHQtd2hpdGVdPVwiKGVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkKSB8fCBwcm9wZXJ0eS5oYXNFcnJvciB8fCBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW1vYmlsZSBpcy12Y2VudGVyZWRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFwcm9wZXJ0eS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwicHJvcGVydHkuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gcHktMSBteS0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtc2l6ZS02XCI+e3twcm9wZXJ0eS5rZXl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvcGVydHkuc2NoZW1hVHlwZVwiIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWdzIG1iLTAgaGFzLWFkZG9uc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIG1iLTAgaXMtbGlnaHRcIj5UeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIG1iLTAgaXMtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxoZS1zY2hlbWEtdmVyc2lvbi1saW5rIGxpbmtDbGFzcz1cImlzLXNtYWxsXCIgW25vZGVdPVwieydAdHlwZSc6IHByb3BlcnR5LnNjaGVtYVR5cGV9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cHJvcGVydHkuc2NoZW1hVHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9oZS1zY2hlbWEtdmVyc2lvbi1saW5rPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGhlLXBvcG92ZXItY29uZmlybSBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wIHB4LTBcIlxuICAgICAgICAgICAgICAqbmdJZj1cImVkaXRhYmxlICYmICFlcnJvcnNFZGl0YWJsZVwiXG4gICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgZ3JvdXBcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICBbbWVzc2FnZV09XCInPHA+VGhpcyB3aWxsIHJlbW92ZSB0aGUgZ3JvdXAgY29tcGxldGVseS48L3A+JyArIChwcm9wZXJ0eS5pc1JlcXVpcmVkID8gJzxwPjx1Pldhcm5pbmc6IHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuPC91PjwvcD4nIDogJycpICsgJzxwPkRvIHlvdSBjb25maXJtPzwvcD4nXCJcbiAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzPVwicHgtM1wiXG4gICAgICAgICAgICAgIChjb25maXJtZWQpPVwicHJvcGVydHlDaGFuZ2VkKG51bGwsIHByb3BlcnR5KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvaGUtcG9wb3Zlci1jb25maXJtPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJsb2NrIGlzLWJsb2NrIHAtMFwiICpuZ0lmPVwicHJvcGVydHkuaXNPcGVuXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuaXNBcnJheVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTMgcHQtNFwiICpuZ0lmPVwicHJvcGVydHkuZXJyb3JcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcGVydHksIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIiAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWxwIHB5LTEgcHgtMlwiICpuZ0lmPVwiZWRpdGFibGUgJiYgIXByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgVG8gY2hhbmdlIHRoZSB7e3Byb3BlcnR5LmtleX19LCBwbGVhc2UgZGVsZXRlIGl0IGZpcnN0LCB0aGVuIGFkZCB0aGUgZmllbGQgYWdhaW5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwcm9wZXJ0eS5zY2hlbWE/LnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhlbHAgcHktMSBweC0yXCIgKm5nU3dpdGNoQ2FzZT1cIidCaWJsaW9ncmFwaHknXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlYXJjaCBieSBUaXRsZSBvciBEb2N1bWVudCBET0kgdG8gYXV0by1wb3B1bGF0ZSB0aGUgZmllbGRzIHVzaW5nIHRoZSBNZW5kZWxleSBjYXRhbG9ndWVcbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dOZXdQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTMgbXQtMVwiICpuZ0lmPVwiZXJyb3JzRWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cCBweS0yIHB4LTMgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZSBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMiBvZiBwcm9wZXJ0eS5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTIgcHgtMyBtdC0yXCIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTFcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMiBvZiBwcm9wZXJ0eS5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTAgbXktNFwiICpuZ0lmPVwicHJvcDIua2V5XCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCJwcm9wMi5mdWxsS2V5ICsgJ18nICsgcHJvcDIuaWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1hcnJheS1udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhZ3MgaGFzLWFkZG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWRhcmtcIj57e3Byb3AyLmtleX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiAhZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWluZm9cIiBwb2ludGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVBcnJheUdyb3VwKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCInRHVwbGljYXRlICcgKyBwbHVyYWxpemUocHJvcGVydHkua2V5LCAxKVwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJjbG9uZVwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWxpZ2h0XCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb3AyLmtleSAhPT0gJzAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnJheUdyb3VwVXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJNb3ZlIFVwXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LXVwXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgaXMtbGlnaHRcIiBwb2ludGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvcDIua2V5ICE9PSBwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFycmF5R3JvdXBEb3duKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiTW92ZSBEb3duXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LWRvd25cIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwidGFnIGlzLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIidSZW1vdmUgJyArIHBsdXJhbGl6ZShwcm9wZXJ0eS5rZXksIDEpXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1cIlRoaXMgd2lsbCByZW1vdmUgdGhlIGdyb3VwIGNvbXBsZXRlbHkuIERvIHlvdSBjb25maXJtP1wiIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlybWVkKT1cInJlbW92ZUFycmF5R3JvdXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9oZS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AyfVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBtdC0yXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgbXQtMlwiICpuZ0lmPVwicHJvcDIuZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcDIsIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwIGNhcmQtY29udGVudCBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lIG15LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMyBvZiBwcm9wMi5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1pbmZvIGlzLXNtYWxsXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQXJyYXlHcm91cChwcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+e3twcm9wZXJ0eS5rZXkgfCBwbHVyYWxpemU6MX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGhlLW5vZGUtcmVjb21tZW5kYXRpb25zIGJ1dHRvbkNsYXNzPVwiaXMtc21hbGxcIlxuICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIiBbbm9kZUZpZWxkXT1cInByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdFJlY29tbWVuZGF0aW9uKT1cIm9uU2VsZWN0UmVjb21tZW5kYXRpb24ocHJvcGVydHksICRldmVudClcIlxuICAgICAgICAgICAgICAgID48L2hlLW5vZGUtcmVjb21tZW5kYXRpb25zPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRGb3JtIGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5LmtleVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LnN1Z2dlc3Rpb25zPy50eXBlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRTZWxlY3Q7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dElucHV0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRJbnB1dCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBtYi0wXCIgW2NsYXNzLmhhcy1hZGRvbnNdPVwiaGFzQWRkb25zKHByb3BlcnR5KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCJcbiAgICAgIFtjbGFzcy5oYXMtaWNvbnMtcmlnaHRdPVwicHJvcGVydHkubG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQgaXMtc21hbGwgc2VhcmNoLWlucHV0XCJcbiAgICAgICAgW2NsYXNzLmlzLWRhcmtdPVwicHJvcGVydHkua2V5ID09PSAndHlwZSdcIlxuICAgICAgICBbY2xhc3MuaXMtc2Vjb25kYXJ5XT1cImVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkXCJcbiAgICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIoIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3IpIHx8IGlzUmVxdWlyZWQocHJvcGVydHkpXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG5cbiAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS52YWx1ZVwiICNwcm9wZXJ0eU1vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgIFt0eXBlXT1cInByb3BlcnR5LnNjaGVtYT8udHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICdzdHJpbmcnXCJcbiAgICAgICAgW2lkXT1cInByb3BlcnR5LmlkXCJcbiAgICAgICAgbmFtZT1cInJhbmRvbW5hbWVcIlxuICAgICAgICBbcmVhZG9ubHldPVwiIWVkaXRhYmxlIHx8ICFwcm9wZXJ0eS5lZGl0YWJsZSB8fCBwcm9wZXJ0eS5zY2hlbWE/LmludGVybmFsXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInByb3BlcnR5LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2FwcFRhZ3NJbnB1dF09XCJ7ZW5hYmxlZDogZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgcHJvcGVydHkuc2NoZW1hPy50eXBlID09PSAnYXJyYXknLCBpdGVtczogcHJvcGVydHkuc2NoZW1hPy5pdGVtcywgZGVsaW1pdGVyOiAnOycsIGFsbG93RHVwbGljYXRlczogdHJ1ZSwgcGxhY2Vob2xkZXI6IHByb3BlcnR5LnBsYWNlaG9sZGVyfVwiXG4gICAgICAgIChjaGFuZ2UpPVwicHJvcGVydHlDaGFuZ2VkKCRldmVudC50YXJnZXQudmFsdWUsIHByb3BlcnR5KVwiXG5cbiAgICAgICAgW3BhdHRlcm5dPVwicHJvcGVydHkuc2NoZW1hPy5wYXR0ZXJuXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInByb3BlcnR5LmZ1bGxLZXkuZW5kc1dpdGgoJ2lkJykgJiYgcHJvcGVydHkuZnVsbEtleSAhPT0gJ2lkJ1wiXG4gICAgICAgIFttaW5dPVwicHJvcGVydHkuc2NoZW1hPy5taW5pbXVtXCJcbiAgICAgICAgW21heF09XCJwcm9wZXJ0eS5zY2hlbWE/Lm1heGltdW1cIlxuXG4gICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwicHJvcGVydHkgfCBhcHBseVB1cmU6IHByb3BlcnR5U3VnZ2VzdFwiXG4gICAgICAgIFtyZXN1bHRUZW1wbGF0ZV09XCJzdWdnZXN0aW9uXCJcbiAgICAgICAgW2lucHV0Rm9ybWF0dGVyXT1cImZvcm1hdHRlclwiXG4gICAgICAgIFtmb2N1c0ZpcnN0XT1cInRydWVcIlxuICAgICAgICAoZm9jdXMpPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgdHlwZWFoZWFkRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3RJdGVtKT1cInN1Z2dlc3Rpb25TZWxlY3RlZCgkZXZlbnQuaXRlbSwgcHJvcGVydHkpXCJcbiAgICAgID5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsIGlzLXJpZ2h0IGhhcy10ZXh0LWdyZXktZGFya1wiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXByb3BlcnR5LmxvYWRpbmdcIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cInNwaW5uZXJcIiBbcHVsc2VdPVwidHJ1ZVwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPHAgY2xhc3M9XCJoZWxwIGlzLWRhbmdlci1saWdodFwiXG4gICAgKm5nSWY9XCIhcHJvcGVydHkuaGFzRXJyb3IgJiYgcHJvcGVydHlNb2RlbC5pbnZhbGlkXCJcbiAgPlxuICAgIDxzcGFuICpiaW5kT25jZT1cInByb3BlcnR5TW9kZWwuZXJyb3JzXCIgW2lubmVySFRNTF09XCJmb3JtYXRQcm9wZXJ0eUVycm9yKHByb3BlcnR5TW9kZWwuZXJyb3JzLCBwcm9wZXJ0eSlcIj48L3NwYW4+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRTZWxlY3QgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiZmllbGQgbWItMFwiIFtjbGFzcy5oYXMtYWRkb25zXT1cImhhc0FkZG9ucyhwcm9wZXJ0eSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbCBpcy1mdWxsd2lkdGhcIlxuICAgICAgICBbY2xhc3MuaXMtc2Vjb25kYXJ5XT1cImVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkXCJcbiAgICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIoIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3IpIHx8IGlzUmVxdWlyZWQocHJvcGVydHkpXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5LnZhbHVlXCIgI3Byb3BlcnR5TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICBbaWRdPVwicHJvcGVydHkuaWRcIlxuICAgICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlIHx8ICFwcm9wZXJ0eS5lZGl0YWJsZSB8fCBwcm9wZXJ0eS5zY2hlbWE/LmludGVybmFsXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInByb3BlcnR5Q2hhbmdlZCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdDwvb3B0aW9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwicHJvcGVydHkuc3VnZ2VzdGlvbnNcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIHByb3BlcnR5LnN1Z2dlc3Rpb25zLnZhbHVlczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCIgW3ZhbHVlXT1cInZhbHVlXCI+e3t2YWx1ZX19PC9vcHRpb24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0QWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JlbW92ZUZpZWxkQWRkb24gbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiIWVycm9yc0VkaXRhYmxlICYmICFwcm9wZXJ0eS5pc1JlcXVpcmVkXCI+XG4gICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIlJlbW92ZSBmaWVsZFwiXG4gICAgICBbY2xhc3MuaXMtb3V0bGluZWRdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgKHByb3BlcnR5Lmhhc0Vycm9yIHx8IHByb3BlcnR5Lmhhc1dhcm5pbmcpXCJcbiAgICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwcm9wZXJ0eUNoYW5nZWQobnVsbCwgcHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwidGltZXNcIj48L2ZhLWljb24+XG4gICAgPC9hPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRBZGRvbnMgbGV0LXByb3BlcnR5PlxuICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwiY29udHJvbFwiXG4gICAgKm5nSWY9XCJlbmFibGVBZGRFcnJvcihwcm9wZXJ0eSlcIlxuICAgIHBvc2l0aW9uPVwibGVmdFwiXG4gICAgW2NvbnRlbnRdPVwicG9wdXBFcnJvckZvcm1cIlxuICAgIChjb25maXJtZWQpPVwiYWRkRXJyb3IocHJvcGVydHksICRldmVudClcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIj5cbiAgICAgIDxmYS1pY29uIGljb249XCJjb21tZW50c1wiPjwvZmEtaWNvbj5cbiAgICA8L3NwYW4+XG4gIDwvaGUtcG9wb3Zlci1jb25maXJtPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LnNjaGVtYVR5cGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlNjaGVtYVR5cGUuQWN0b3JcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdG9yQWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiU2NoZW1hVHlwZS5DeWNsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3ljbGVBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJwcm9wZXJ0eVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cIm1hcERyYXdpbmdNb2Rlcyhwcm9wZXJ0eSkubGVuZ3RoXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIlBpY2sgb24gTWFwXCJcbiAgICAgICAgICAoY2xpY2spPVwibWFwRHJhd2luZ1Byb3BlcnR5ID0gcHJvcGVydHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cIm1hcC1tYXJrZWQtYWx0XCI+PC9mYS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImJpYmxpb2dyYXBoaWVzU2VhcmNoS2V5KHByb3BlcnR5KVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJBZHZhbmNlZCBTZWFyY2hcIlxuICAgICAgICAgIChjbGljayk9XCJiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ID0gcHJvcGVydHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cInNlYXJjaFwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW1vdmVGaWVsZEFkZG9uOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJhZGRQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHkpXCI+XG4gICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtZGFuZ2VyXCIgdGl0bGU9XCJBZGQgZmllbGRcIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgYWRkTWlzc2luZ1Byb3BlcnR5KHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJpc1JlcXVpcmVkKHByb3BlcnR5KVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1kYW5nZXJcIiBbZm9yXT1cInByb3BlcnR5LmlkXCJcbiAgICAgIG5nYlRvb2x0aXA9XCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiZXhjbGFtYXRpb24tdHJpYW5nbGVcIj48L2ZhLWljb24+XG4gICAgPC9sYWJlbD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5leHRlcm5hbFVybD8udXJsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxhIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgW2hyZWZdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsICsgKHByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgPyBwcm9wZXJ0eS52YWx1ZSA6ICcnKVwiXG4gICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgIFt0aXRsZV09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC50aXRsZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW5mbyc6IHByb3BlcnR5LmtleSA9PT0gJ3R5cGUnfVwiXG4gICAgICAgIFthdHRyLmRpc2FibGVkXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgJiYgIXByb3BlcnR5LnZhbHVlID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgPlxuICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC5pY29uIHx8ICdleHRlcm5hbC1saW5rLWFsdCdcIj48L2ZhLWljb24+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidW5pdENvbnZlcnRlckVuYWJsZWQocHJvcGVydHkpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIk9wZW4gY2FsY3VsYXRvclwiXG4gICAgICAgIFtuZ2JQb3BvdmVyXT1cImNvbnZlcnRVbml0c1wiIGF1dG9DbG9zZT1cIm91dHNpZGVcIlxuICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwPVwibmdiUG9wb3ZlclwiIHBsYWNlbWVudD1cImJvdHRvbVwiIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAoY2xpY2spPVwib3BlblVuaXRDb252ZXJ0ZXIocCwgcHJvcGVydHkpXCJcbiAgICAgID5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIj48L2ZhLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FjdG9yQWRkb25zIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ0BpZCdcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJBZGQgbXlzZWxmIGFzIEFjdG9yXCJcbiAgICAgIChjbGljayk9XCJzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cIlsnZmFyJywgJ2lkLWJhZGdlJ11cIj48L2ZhLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjeWNsZUFkZG9ucyBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJwcm9wZXJ0eS5rZXkgPT09ICdjeWNsZUR1cmF0aW9uJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkNhbGN1bGF0ZSB2YWx1ZSBmcm9tIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZVwiXG4gICAgICAoY2xpY2spPVwiY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eSlcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYWxjdWxhdGVDeWNsZUR1cmF0aW9uRW5hYmxlZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ3N0YXJ0RGF0ZSdcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJDYWxjdWxhdGUgdmFsdWUgZnJvbSBlbmREYXRlIGFuZCBjeWNsZUR1cmF0aW9uXCJcbiAgICAgIChjbGljayk9XCJjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZShwcm9wZXJ0eSlcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiY2FsY3VsYXRvclwiPjwvZmEtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Nob3dOZXdQcm9wZXJ0eSBsZXQtcHJvcGVydHk+XG4gIDxoZWFkZXIgY2xhc3M9XCJjYXJkLWhlYWRlclwiICpuZ0lmPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgKHByb3BlcnR5LmFkZFByb3BlcnR5RW5hYmxlZCB8fCBkZWVwRWRpdGFibGUpOyBlbHNlIHBhZGRlclwiPlxuICAgIDxmb3JtIGNsYXNzPVwicHktMyBweC00IGlzLWZsZXgtZ3Jvdy0xXCIgKHN1Ym1pdCk9XCJhZGRQcm9wZXJ0eShwcm9wZXJ0eSlcIiBub3ZhbGlkYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGlzLWhvcml6b250YWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsIGlzLXNtYWxsXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIiBbZm9yXT1cInByb3BlcnR5LmlkICsgJ19uZXcnXCI+XG4gICAgICAgICAgICA8c3Bhbj5BZGQgbmV3IGZpZWxkPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dCBpcy1zbWFsbFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cInByb3BlcnR5LmlkICsgJ19uZXcnXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwicmFuZG9tbmFtZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYW5kIHNlbGVjdCBmaWVsZCBmcm9tIHJlc3VsdHNcIlxuXG4gICAgICAgICAgICAgICAgW25nYlR5cGVhaGVhZF09XCJwcm9wZXJ0eSB8IGFwcGx5UHVyZTogc3VnZ2VzdE5ld1Byb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBbcmVzdWx0VGVtcGxhdGVdPVwic3VnZ2VzdGlvblwiXG4gICAgICAgICAgICAgICAgW2lucHV0Rm9ybWF0dGVyXT1cImZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzRmlyc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cInR5cGVhaGVhZEZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXByb3BlcnR5Lm5ld1Byb3BlcnR5IHx8ICFwcm9wZXJ0eS5uZXdQcm9wZXJ0eS5uYW1lXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkFkZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG4gIDwvaGVhZGVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eUVycm9yIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LWVkaXQ9XCJlZGl0XCI+XG4gIDxwIGNsYXNzPVwiaGVscFwiXG4gICAgW2NsYXNzLmlzLWRhbmdlcl09XCJwcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgW2NsYXNzLmlzLXdhcm5pbmddPVwicHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgKm5nSWY9XCJwcm9wZXJ0eS5lcnJvclwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImlzLXByZS13cmFwXCIgKmJpbmRPbmNlPVwicHJvcGVydHkuZXJyb3JcIiBbaW5uZXJIVE1MXT1cInByb3BlcnR5LmVycm9yLm1lc3NhZ2VcIj48L3NwYW4+XG4gICAgPGEgY2xhc3M9XCJwbC0yXCJcbiAgICAgICpuZ0lmPVwiZWRpdCAmJiBlcnJvcnNFZGl0YWJsZSAmJiBwcm9wZXJ0eS5lcnJvci5pbmRleCA+PSAwXCJcbiAgICAgIChjbGljayk9XCJlZGl0RXJyb3IocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBpY29uPVwiZWRpdFwiPjwvZmEtaWNvbj5cbiAgICAgIDxzcGFuPkVkaXQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDxhIGNsYXNzPVwicGwtMlwiXG4gICAgICAqbmdJZj1cIihwcm9wZXJ0eS5oYXNXYXJuaW5nIHx8IGVycm9yc0VkaXRhYmxlKSAmJiBwcm9wZXJ0eS5lcnJvci5pbmRleCA+PSAwXCJcbiAgICAgIChjbGljayk9XCJyZXNvbHZlRXJyb3IocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBpY29uPVwiY2hlY2tcIj48L2ZhLWljb24+XG4gICAgICA8c3Bhbj5SZXNvbHZlZDwvc3Bhbj5cbiAgICA8L2E+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcHJvcGVydHlNYXAgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwicGFuZWwgaXMtZGVmYXVsdFwiICpuZ0lmPVwic2hvd01hcFwiPlxuICAgIDxkaXYgY2xhc3M9XCJvcGVuLWdyb3VwIHBhbmVsLWhlYWRpbmcgcHktMFwiXG4gICAgICAoY2xpY2spPVwibWFwVmlzaWJsZSA9ICFtYXBWaXNpYmxlXCIgcG9pbnRlclxuICAgICAgW2NsYXNzLmlzLW9wZW5dPVwibWFwVmlzaWJsZVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbW9iaWxlIGlzLXZjZW50ZXJlZCBtYi0wXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIW1hcFZpc2libGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJtYXBWaXNpYmxlXCI+PC9mYS1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIHB5LTEgbXktMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtc2l6ZS02XCI+VmlldyBvbiBNYXA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ibG9jayBpcy1ibG9jayBwLTBcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFtYXBWaXNpYmxlXCI+XG4gICAgICA8aGUtc2l0ZXMtbWFwcyBbc2l0ZXNdPVwiW25vZGVdXCIgW3Nob3dOb3RpY2VdPVwiZmFsc2VcIj48L2hlLXNpdGVzLW1hcHM+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub2RlRXJyb3JGb3JtIGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5Lm5ld0Vycm9yICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGxcIj5cbiAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwicHJvcGVydHkubmV3RXJyb3IubGV2ZWxcIj5cbiAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPlNlbGVjdCBMZXZlbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+RXJyb3I8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuaW5nXCI+V2FybmluZzwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWRcIj5cbiAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidGV4dGFyZWEgaXMtc21hbGxcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkubmV3RXJyb3IubWVzc2FnZVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIG1lc3NhZ2UgaGVyZVwiXG4gICAgICAgICAgcm93cz1cIjFcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFwcm9wZXJ0eS5uZXdFcnJvci5sZXZlbCB8fCAhcHJvcGVydHkubmV3RXJyb3IubWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZEVycm9yKHByb3BlcnR5LCBwcm9wZXJ0eS5uZXdFcnJvcilcIlxuICAgICAgICA+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkFkZDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3BvcHVwRXJyb3JGb3JtIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0XCI+XG4gICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJkYXRhLmxldmVsXCI+XG4gICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidW5kZWZpbmVkXCI+U2VsZWN0IExldmVsPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+RXJyb3I8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2FybmluZ1wiPldhcm5pbmc8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGEubWVzc2FnZVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBtZXNzYWdlIGhlcmVcIlxuICAgICAgPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3VnZ2VzdGlvbiBsZXQtcj1cInJlc3VsdFwiIGxldC10PVwidGVybVwiPlxuICA8bmdiLWhpZ2hsaWdodFxuICAgIFt0aXRsZV09XCJyLmJpYmxpb2dyYXBoeT8udGl0bGUgfHwgci5iaWJsaW9ncmFwaHk/LmRvY3VtZW50RE9JIHx8IHIuYmlibGlvZ3JhcGh5Py5zY29wdXMgfHwgci5uYW1lXCJcbiAgICBbcmVzdWx0XT1cInIuYmlibGlvZ3JhcGh5Py50aXRsZSB8fCByLmJpYmxpb2dyYXBoeT8uZG9jdW1lbnRET0kgfHwgci5iaWJsaW9ncmFwaHk/LnNjb3B1cyB8fCByLm5hbWVcIlxuICAgIFt0ZXJtXT1cInRcIlxuICA+PC9uZ2ItaGlnaGxpZ2h0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwYWRkZXI+XG4gIDxkaXYgY2xhc3M9XCJwdC0xXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnZlcnRVbml0cyBsZXQtdmFsdWU9XCJ2YWx1ZVwiIGxldC10ZXJtPVwidGVybVwiIGxldC11bml0cz1cInVuaXRzXCI+XG4gIDxoZS11bml0LWNvbnZlcnRlciBbdmFsdWVdPVwidmFsdWVcIiBbdGVybV09XCJ0ZXJtXCIgW3RvVW5pdHNdPVwidW5pdHNcIj48L2hlLXVuaXQtY29udmVydGVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|