carbon-components-angular
Version:
Next generation components
201 lines • 20 kB
JavaScript
import { ChangeDetectionStrategy, Component, ContentChildren, forwardRef, HostBinding, Input, TemplateRef } from "@angular/core";
import { CHECKBOX_GROUP_HOST } from "./checkbox-group-host";
import { Checkbox } from "./checkbox.component";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "carbon-components-angular/icon";
/**
* Groups related checkboxes with a shared legend, validation, and optional decorator
* (e.g. AI label).
*
* ```html
* <cds-checkbox-group legend="Group label" [decorator]="decoratorTpl">
* <cds-checkbox>Option 1</cds-checkbox>
* </cds-checkbox-group>
* ```
*/
export class CheckboxGroup {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
this.hostFormItem = true;
this.helperTextId = `checkbox-group-helper-${CheckboxGroup.nextHelperId++}`;
this.orientation = "vertical";
this.invalid = false;
this.warn = false;
this.readOnly = false;
}
ngOnChanges(changes) {
if (changes["readOnly"] || changes["invalid"] || changes["warn"]) {
this.notifyCheckboxesHostStateChanged();
}
}
ngAfterContentInit() {
this.checkboxes.changes.subscribe(() => this.notifyCheckboxesHostStateChanged());
}
isTemplate(value) {
return value instanceof TemplateRef;
}
notifyCheckboxesHostStateChanged() {
Promise.resolve().then(() => {
this.checkboxes?.forEach((cb) => cb.markForCheckFromGroup());
this.changeDetectorRef.markForCheck();
});
}
}
CheckboxGroup.nextHelperId = 0;
CheckboxGroup.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CheckboxGroup, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
CheckboxGroup.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CheckboxGroup, selector: "cds-checkbox-group, ibm-checkbox-group", inputs: { legend: "legend", legendId: "legendId", fieldsetAriaLabelledby: "fieldsetAriaLabelledby", orientation: "orientation", helperText: "helperText", invalid: "invalid", invalidText: "invalidText", warn: "warn", warnText: "warnText", readOnly: "readOnly", decorator: "decorator" }, host: { properties: { "class.cds--form-item": "this.hostFormItem" } }, providers: [
{ provide: CHECKBOX_GROUP_HOST, useExisting: CheckboxGroup }
], queries: [{ propertyName: "checkboxes", predicate: i0.forwardRef(function () { return Checkbox; }), descendants: true }], usesOnChanges: true, ngImport: i0, template: `
<fieldset
class="cds--checkbox-group"
[ngClass]="{
'cds--checkbox-group--horizontal': orientation === 'horizontal',
'cds--checkbox-group--readonly': readOnly,
'cds--checkbox-group--invalid': !readOnly && invalid,
'cds--checkbox-group--warning': !readOnly && !invalid && warn,
'cds--checkbox-group--decorator': !!decorator
}"
[attr.data-invalid]="invalid ? true : null"
[attr.aria-labelledby]="legendId || fieldsetAriaLabelledby || null"
[attr.aria-readonly]="readOnly ? true : null"
[attr.aria-describedby]="(helperText && !invalid && !warn) ? helperTextId : null">
<legend *ngIf="legend" class="cds--label" [attr.id]="legendId || null">
<ng-template *ngIf="isTemplate(legend); else legendLabel" [ngTemplateOutlet]="legend"></ng-template>
<ng-template #legendLabel>{{legend}}</ng-template>
<ng-container *ngIf="decorator">
<div class="cds--checkbox-group-inner--decorator">
<ng-template [ngTemplateOutlet]="decorator"></ng-template>
</div>
</ng-container>
</legend>
<ng-content></ng-content>
<div class="cds--checkbox-group__validation-msg">
<ng-container *ngIf="!readOnly && invalid">
<svg
cdsIcon="warning--filled"
size="16"
class="cds--checkbox__invalid-icon">
</svg>
<div class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
</ng-container>
<ng-container *ngIf="!readOnly && !invalid && warn">
<svg
cdsIcon="warning--alt--filled"
size="16"
class="cds--checkbox__invalid-icon cds--checkbox__invalid-icon--warning">
</svg>
<div class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{warnText}}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</ng-container>
</div>
<div
*ngIf="helperText && !invalid && !warn"
class="cds--form__helper-text"
[id]="helperTextId">
<ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
</fieldset>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CheckboxGroup, decorators: [{
type: Component,
args: [{
selector: "cds-checkbox-group, ibm-checkbox-group",
template: `
<fieldset
class="cds--checkbox-group"
[ngClass]="{
'cds--checkbox-group--horizontal': orientation === 'horizontal',
'cds--checkbox-group--readonly': readOnly,
'cds--checkbox-group--invalid': !readOnly && invalid,
'cds--checkbox-group--warning': !readOnly && !invalid && warn,
'cds--checkbox-group--decorator': !!decorator
}"
[attr.data-invalid]="invalid ? true : null"
[attr.aria-labelledby]="legendId || fieldsetAriaLabelledby || null"
[attr.aria-readonly]="readOnly ? true : null"
[attr.aria-describedby]="(helperText && !invalid && !warn) ? helperTextId : null">
<legend *ngIf="legend" class="cds--label" [attr.id]="legendId || null">
<ng-template *ngIf="isTemplate(legend); else legendLabel" [ngTemplateOutlet]="legend"></ng-template>
<ng-template #legendLabel>{{legend}}</ng-template>
<ng-container *ngIf="decorator">
<div class="cds--checkbox-group-inner--decorator">
<ng-template [ngTemplateOutlet]="decorator"></ng-template>
</div>
</ng-container>
</legend>
<ng-content></ng-content>
<div class="cds--checkbox-group__validation-msg">
<ng-container *ngIf="!readOnly && invalid">
<svg
cdsIcon="warning--filled"
size="16"
class="cds--checkbox__invalid-icon">
</svg>
<div class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
</ng-container>
<ng-container *ngIf="!readOnly && !invalid && warn">
<svg
cdsIcon="warning--alt--filled"
size="16"
class="cds--checkbox__invalid-icon cds--checkbox__invalid-icon--warning">
</svg>
<div class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{warnText}}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</ng-container>
</div>
<div
*ngIf="helperText && !invalid && !warn"
class="cds--form__helper-text"
[id]="helperTextId">
<ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
</fieldset>
`,
providers: [
{ provide: CHECKBOX_GROUP_HOST, useExisting: CheckboxGroup }
],
changeDetection: ChangeDetectionStrategy.OnPush
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { hostFormItem: [{
type: HostBinding,
args: ["class.cds--form-item"]
}], checkboxes: [{
type: ContentChildren,
args: [forwardRef(() => Checkbox), { descendants: true }]
}], legend: [{
type: Input
}], legendId: [{
type: Input
}], fieldsetAriaLabelledby: [{
type: Input
}], orientation: [{
type: Input
}], helperText: [{
type: Input
}], invalid: [{
type: Input
}], invalidText: [{
type: Input
}], warn: [{
type: Input
}], warnText: [{
type: Input
}], readOnly: [{
type: Input
}], decorator: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NoZWNrYm94L2NoZWNrYm94LWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBSUwsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUVoRDs7Ozs7Ozs7O0dBU0c7QUFpRUgsTUFBTSxPQUFPLGFBQWE7SUF3Q3pCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBdENuQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUtoRCxpQkFBWSxHQUFHLHlCQUF5QixhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQWN2RSxnQkFBVyxHQUE4QixVQUFVLENBQUM7UUFJcEQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUloQixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBSWIsYUFBUSxHQUFHLEtBQUssQ0FBQztJQU9pQyxDQUFDO0lBRTVELFdBQVcsQ0FBQyxPQUFzQjtRQUNqQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1NBQ3hDO0lBQ0YsQ0FBQztJQUVELGtCQUFrQjtRQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDcEIsT0FBTyxLQUFLLFlBQVksV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxnQ0FBZ0M7UUFDdkMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7QUE1RGMsMEJBQVksR0FBRyxDQUFFLENBQUE7MEdBRHBCLGFBQWE7OEZBQWIsYUFBYSxzYUFMZDtRQUNWLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUU7S0FDNUQsd0ZBUWlDLFFBQVEseUVBbkVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF3RFQ7MkZBTVcsYUFBYTtrQkFoRXpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHdDQUF3QztvQkFDbEQsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdEVDtvQkFDRCxTQUFTLEVBQUU7d0JBQ1YsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxlQUFlLEVBQUU7cUJBQzVEO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQzt3R0FHcUMsWUFBWTtzQkFBaEQsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBR2lDLFVBQVU7c0JBQTdFLGVBQWU7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJekQsTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdEFmdGVyQ29udGVudEluaXQsXHJcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXHJcblx0Q29tcG9uZW50LFxyXG5cdENvbnRlbnRDaGlsZHJlbixcclxuXHRmb3J3YXJkUmVmLFxyXG5cdEhvc3RCaW5kaW5nLFxyXG5cdElucHV0LFxyXG5cdE9uQ2hhbmdlcyxcclxuXHRRdWVyeUxpc3QsXHJcblx0U2ltcGxlQ2hhbmdlcyxcclxuXHRUZW1wbGF0ZVJlZlxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENIRUNLQk9YX0dST1VQX0hPU1QgfSBmcm9tIFwiLi9jaGVja2JveC1ncm91cC1ob3N0XCI7XHJcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSBcIi4vY2hlY2tib3guY29tcG9uZW50XCI7XHJcblxyXG4vKipcclxuICogR3JvdXBzIHJlbGF0ZWQgY2hlY2tib3hlcyB3aXRoIGEgc2hhcmVkIGxlZ2VuZCwgdmFsaWRhdGlvbiwgYW5kIG9wdGlvbmFsIGRlY29yYXRvclxyXG4gKiAoZS5nLiBBSSBsYWJlbCkuXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGNkcy1jaGVja2JveC1ncm91cCBsZWdlbmQ9XCJHcm91cCBsYWJlbFwiIFtkZWNvcmF0b3JdPVwiZGVjb3JhdG9yVHBsXCI+XHJcbiAqICAgPGNkcy1jaGVja2JveD5PcHRpb24gMTwvY2RzLWNoZWNrYm94PlxyXG4gKiA8L2Nkcy1jaGVja2JveC1ncm91cD5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogXCJjZHMtY2hlY2tib3gtZ3JvdXAsIGlibS1jaGVja2JveC1ncm91cFwiLFxyXG5cdHRlbXBsYXRlOiBgXHJcblx0XHQ8ZmllbGRzZXRcclxuXHRcdFx0Y2xhc3M9XCJjZHMtLWNoZWNrYm94LWdyb3VwXCJcclxuXHRcdFx0W25nQ2xhc3NdPVwie1xyXG5cdFx0XHRcdCdjZHMtLWNoZWNrYm94LWdyb3VwLS1ob3Jpem9udGFsJzogb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyxcclxuXHRcdFx0XHQnY2RzLS1jaGVja2JveC1ncm91cC0tcmVhZG9ubHknOiByZWFkT25seSxcclxuXHRcdFx0XHQnY2RzLS1jaGVja2JveC1ncm91cC0taW52YWxpZCc6ICFyZWFkT25seSAmJiBpbnZhbGlkLFxyXG5cdFx0XHRcdCdjZHMtLWNoZWNrYm94LWdyb3VwLS13YXJuaW5nJzogIXJlYWRPbmx5ICYmICFpbnZhbGlkICYmIHdhcm4sXHJcblx0XHRcdFx0J2Nkcy0tY2hlY2tib3gtZ3JvdXAtLWRlY29yYXRvcic6ICEhZGVjb3JhdG9yXHJcblx0XHRcdH1cIlxyXG5cdFx0XHRbYXR0ci5kYXRhLWludmFsaWRdPVwiaW52YWxpZCA/IHRydWUgOiBudWxsXCJcclxuXHRcdFx0W2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxlZ2VuZElkIHx8IGZpZWxkc2V0QXJpYUxhYmVsbGVkYnkgfHwgbnVsbFwiXHJcblx0XHRcdFthdHRyLmFyaWEtcmVhZG9ubHldPVwicmVhZE9ubHkgPyB0cnVlIDogbnVsbFwiXHJcblx0XHRcdFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiKGhlbHBlclRleHQgJiYgIWludmFsaWQgJiYgIXdhcm4pID8gaGVscGVyVGV4dElkIDogbnVsbFwiPlxyXG5cdFx0XHQ8bGVnZW5kICpuZ0lmPVwibGVnZW5kXCIgY2xhc3M9XCJjZHMtLWxhYmVsXCIgW2F0dHIuaWRdPVwibGVnZW5kSWQgfHwgbnVsbFwiPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUobGVnZW5kKTsgZWxzZSBsZWdlbmRMYWJlbFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxlZ2VuZFwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlICNsZWdlbmRMYWJlbD57e2xlZ2VuZH19PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGVjb3JhdG9yXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1jaGVja2JveC1ncm91cC1pbm5lci0tZGVjb3JhdG9yXCI+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJkZWNvcmF0b3JcIj48L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdDwvbGVnZW5kPlxyXG5cdFx0XHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLWNoZWNrYm94LWdyb3VwX192YWxpZGF0aW9uLW1zZ1wiPlxyXG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZE9ubHkgJiYgaW52YWxpZFwiPlxyXG5cdFx0XHRcdFx0PHN2Z1xyXG5cdFx0XHRcdFx0XHRjZHNJY29uPVwid2FybmluZy0tZmlsbGVkXCJcclxuXHRcdFx0XHRcdFx0c2l6ZT1cIjE2XCJcclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLWNoZWNrYm94X19pbnZhbGlkLWljb25cIj5cclxuXHRcdFx0XHRcdDwvc3ZnPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tZm9ybS1yZXF1aXJlbWVudFwiPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCI+e3sgaW52YWxpZFRleHQgfX08L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnZhbGlkVGV4dFwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXJlYWRPbmx5ICYmICFpbnZhbGlkICYmIHdhcm5cIj5cclxuXHRcdFx0XHRcdDxzdmdcclxuXHRcdFx0XHRcdFx0Y2RzSWNvbj1cIndhcm5pbmctLWFsdC0tZmlsbGVkXCJcclxuXHRcdFx0XHRcdFx0c2l6ZT1cIjE2XCJcclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLWNoZWNrYm94X19pbnZhbGlkLWljb24gY2RzLS1jaGVja2JveF9faW52YWxpZC1pY29uLS13YXJuaW5nXCI+XHJcblx0XHRcdFx0XHQ8L3N2Zz5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLWZvcm0tcmVxdWlyZW1lbnRcIj5cclxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKHdhcm5UZXh0KVwiPnt7d2FyblRleHR9fTwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKHdhcm5UZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIndhcm5UZXh0XCI+PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PGRpdlxyXG5cdFx0XHRcdCpuZ0lmPVwiaGVscGVyVGV4dCAmJiAhaW52YWxpZCAmJiAhd2FyblwiXHJcblx0XHRcdFx0Y2xhc3M9XCJjZHMtLWZvcm1fX2hlbHBlci10ZXh0XCJcclxuXHRcdFx0XHRbaWRdPVwiaGVscGVyVGV4dElkXCI+XHJcblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3toZWxwZXJUZXh0fX08L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGhlbHBlclRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9maWVsZHNldD5cclxuXHRgLFxyXG5cdHByb3ZpZGVyczogW1xyXG5cdFx0eyBwcm92aWRlOiBDSEVDS0JPWF9HUk9VUF9IT1NULCB1c2VFeGlzdGluZzogQ2hlY2tib3hHcm91cCB9XHJcblx0XSxcclxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hHcm91cCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblx0cHJpdmF0ZSBzdGF0aWMgbmV4dEhlbHBlcklkID0gMDtcclxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWZvcm0taXRlbVwiKSBob3N0Rm9ybUl0ZW0gPSB0cnVlO1xyXG5cclxuXHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZm9yd2FyZC1yZWZcclxuXHRAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gQ2hlY2tib3gpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGNoZWNrYm94ZXM6IFF1ZXJ5TGlzdDxDaGVja2JveD47XHJcblxyXG5cdHJlYWRvbmx5IGhlbHBlclRleHRJZCA9IGBjaGVja2JveC1ncm91cC1oZWxwZXItJHtDaGVja2JveEdyb3VwLm5leHRIZWxwZXJJZCsrfWA7XHJcblxyXG5cdEBJbnB1dCgpIGxlZ2VuZDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogT3B0aW9uYWwgaWQgZm9yIHRoZSBgPGxlZ2VuZD5gOyByZWZlcmVuY2VkIGJ5IGBmaWVsZHNldEFyaWFMYWJlbGxlZGJ5YCB3aGVuIHNldC5cclxuXHQgKi9cclxuXHRASW5wdXQoKSBsZWdlbmRJZDogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBPcHRpb25hbCBgYXJpYS1sYWJlbGxlZGJ5YCBmb3IgdGhlIGA8ZmllbGRzZXQ+YCB3aGVuIG5vdCB1c2luZyBgbGVnZW5kSWRgLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIGZpZWxkc2V0QXJpYUxhYmVsbGVkYnk6IHN0cmluZztcclxuXHJcblx0QElucHV0KCkgb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiID0gXCJ2ZXJ0aWNhbFwiO1xyXG5cclxuXHRASW5wdXQoKSBoZWxwZXJUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XHJcblxyXG5cdEBJbnB1dCgpIGludmFsaWRUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRASW5wdXQoKSB3YXJuID0gZmFsc2U7XHJcblxyXG5cdEBJbnB1dCgpIHdhcm5UZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBPcHRpb25hbCBkZWNvcmF0b3IgKGUuZy4gQUkgbGFiZWwpIHJlbmRlcmVkIGluIHRoZSBsZWdlbmQuXHJcblx0ICovXHJcblx0QElucHV0KCkgZGVjb3JhdG9yOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cdFx0aWYgKGNoYW5nZXNbXCJyZWFkT25seVwiXSB8fCBjaGFuZ2VzW1wiaW52YWxpZFwiXSB8fCBjaGFuZ2VzW1wid2FyblwiXSkge1xyXG5cdFx0XHR0aGlzLm5vdGlmeUNoZWNrYm94ZXNIb3N0U3RhdGVDaGFuZ2VkKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcblx0XHR0aGlzLmNoZWNrYm94ZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlDaGVja2JveGVzSG9zdFN0YXRlQ2hhbmdlZCgpKTtcclxuXHR9XHJcblxyXG5cdGlzVGVtcGxhdGUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG5vdGlmeUNoZWNrYm94ZXNIb3N0U3RhdGVDaGFuZ2VkKCkge1xyXG5cdFx0UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcblx0XHRcdHRoaXMuY2hlY2tib3hlcz8uZm9yRWFjaCgoY2IpID0+IGNiLm1hcmtGb3JDaGVja0Zyb21Hcm91cCgpKTtcclxuXHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG4iXX0=