ngx-numeric-range-form-field
Version:
Angular material numeric range form field
191 lines • 26.1 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output, Self, SkipSelf } from '@angular/core';
import { ErrorStateMatcher } from '@angular/material/core';
import { MatFormFieldControl } from '@angular/material/form-field';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { NumericRangeStateMatcher } from '../form/numeric-range-state-matcher';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../form/numeric-range-form.service";
import * as i3 from "@angular/material/input";
export class NumericRangeFormFieldControlComponent {
static { this.nextId = 0; }
get value() {
return this.formGroup.getRawValue();
}
set value(value) {
this.formGroup.patchValue(value);
this.stateChanges.next();
}
get placeholder() {
return this._placeholder;
}
set placeholder(value) {
this._placeholder = value;
this.stateChanges.next();
}
get shouldLabelFloat() {
return true;
}
get empty() {
return !this.value.minimum && !this.value.maximum;
}
get errorState() {
return this.numericRangeErrorMatcher.isErrorState(this.ngControl.control, this.formGroup);
}
get minimumControl() {
return this.formService.minimumControl;
}
get maximumControl() {
return this.formService.maximumControl;
}
constructor(ngControl, formService) {
this.ngControl = ngControl;
this.formService = formService;
this.readonly = false;
this.minReadonly = false;
this.maxReadonly = false;
this.blurred = new EventEmitter();
this.enterPressed = new EventEmitter();
this.numericRangeChanged = new EventEmitter();
this.userAriaDescribedBy = '';
this.id = `numeric-range-form-control-id-${NumericRangeFormFieldControlComponent.nextId++}`;
this.formGroup = this.formService.formGroup;
this.stateChanges = new Subject();
this.focused = false;
this.controlType = 'numeric-range-form-control';
this.numericRangeErrorMatcher = new NumericRangeStateMatcher();
this.unsubscribe$ = new Subject();
this.onTouched = () => { };
this.ngControl.valueAccessor = this;
}
ngOnChanges(changes) {
if (changes.dynamicSyncValidators) {
this.formService.setDynamicValidators(this.dynamicSyncValidators);
}
}
ngOnInit() {
this.formService.setSyncValidators(this.ngControl.control.validator);
this.formService.setAsyncValidators(this.ngControl.control.asyncValidator);
this.ngControl.control.setValidators([this.validate.bind(this)]);
this.ngControl.control.updateValueAndValidity({ emitEvent: false });
}
ngDoCheck() {
this.formGroup.markAllAsTouched();
}
ngOnDestroy() {
this.stateChanges.complete();
this.unsubscribe$.next();
this.unsubscribe$.complete();
}
writeValue(value) {
value === null
? this.formGroup.reset()
: this.formGroup.setValue(value, { emitEvent: false });
}
registerOnChange(fn) {
this.formGroup.valueChanges
.pipe(takeUntil(this.unsubscribe$))
.subscribe(fn);
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
isDisabled ? this.formGroup.disable() : this.formGroup.enable();
this.stateChanges.next();
}
setDescribedByIds(ids) {
this.userAriaDescribedBy = ids.join(' ');
}
onContainerClick(event) { }
validate(control) {
return control.errors;
}
onEnterPressed() {
if (!this.formGroup.errors &&
!this.minimumControl.errors &&
!this.maximumControl.errors) {
this.enterPressed.emit();
}
}
onBlur() {
this.onTouched();
this.blurred.emit();
}
onRangeValuesChanged() {
this.formGroup.errors ||
this.minimumControl.errors ||
this.maximumControl.errors
? this.numericRangeChanged.emit(null)
: this.numericRangeChanged.emit(this.formGroup.getRawValue());
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NumericRangeFormFieldControlComponent, deps: [{ token: i1.NgControl, self: true }, { token: i2.NumericRangeFormService, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: NumericRangeFormFieldControlComponent, selector: "ngx-numeric-range-form-field-control", inputs: { value: "value", placeholder: "placeholder", minPlaceholder: "minPlaceholder", maxPlaceholder: "maxPlaceholder", readonly: "readonly", minReadonly: "minReadonly", maxReadonly: "maxReadonly", required: "required", disabled: "disabled", errorStateMatcher: "errorStateMatcher", autofilled: "autofilled", dynamicSyncValidators: "dynamicSyncValidators" }, outputs: { blurred: "blurred", enterPressed: "enterPressed", numericRangeChanged: "numericRangeChanged" }, host: { properties: { "class.floated": "this.shouldLabelFloat", "attr.aria-describedby": "this.userAriaDescribedBy", "id": "this.id" } }, providers: [
{
provide: MatFormFieldControl,
useExisting: NumericRangeFormFieldControlComponent
},
{
provide: ErrorStateMatcher,
useClass: NumericRangeStateMatcher
}
], usesOnChanges: true, ngImport: i0, template: "<input\n\t(blur)=\"onBlur()\"\n\t(change)=\"onRangeValuesChanged()\"\n\t(keyup.enter)=\"onEnterPressed()\"\n\t[readonly]=\"readonly || minReadonly\"\n\t[formControl]=\"minimumControl\"\n\tmatInput\n\t[placeholder]=\"minPlaceholder\"\n\ttype=\"number\"\n/>\n<span class=\"spacer\">–</span>\n<input\n\t(blur)=\"onBlur()\"\n\t(change)=\"onRangeValuesChanged()\"\n\t(keyup.enter)=\"onEnterPressed()\"\n\t[formControl]=\"maximumControl\"\n\t[readonly]=\"readonly || maxReadonly\"\n\tmatInput\n\t[placeholder]=\"maxPlaceholder\"\n\ttype=\"number\"\n/>\n", styles: [":host{display:flex;align-items:center}:host .spacer{padding:0 10px 0 0;cursor:context-menu}:host input::-webkit-outer-spin-button,:host input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}:host input:read-only{color:#00000080;cursor:initial}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NumericRangeFormFieldControlComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-numeric-range-form-field-control', providers: [
{
provide: MatFormFieldControl,
useExisting: NumericRangeFormFieldControlComponent
},
{
provide: ErrorStateMatcher,
useClass: NumericRangeStateMatcher
}
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<input\n\t(blur)=\"onBlur()\"\n\t(change)=\"onRangeValuesChanged()\"\n\t(keyup.enter)=\"onEnterPressed()\"\n\t[readonly]=\"readonly || minReadonly\"\n\t[formControl]=\"minimumControl\"\n\tmatInput\n\t[placeholder]=\"minPlaceholder\"\n\ttype=\"number\"\n/>\n<span class=\"spacer\">–</span>\n<input\n\t(blur)=\"onBlur()\"\n\t(change)=\"onRangeValuesChanged()\"\n\t(keyup.enter)=\"onEnterPressed()\"\n\t[formControl]=\"maximumControl\"\n\t[readonly]=\"readonly || maxReadonly\"\n\tmatInput\n\t[placeholder]=\"maxPlaceholder\"\n\ttype=\"number\"\n/>\n", styles: [":host{display:flex;align-items:center}:host .spacer{padding:0 10px 0 0;cursor:context-menu}:host input::-webkit-outer-spin-button,:host input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}:host input:read-only{color:#00000080;cursor:initial}\n"] }]
}], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
type: Self
}] }, { type: i2.NumericRangeFormService, decorators: [{
type: SkipSelf
}] }], propDecorators: { value: [{
type: Input
}], placeholder: [{
type: Input
}], minPlaceholder: [{
type: Input
}], maxPlaceholder: [{
type: Input
}], readonly: [{
type: Input
}], minReadonly: [{
type: Input
}], maxReadonly: [{
type: Input
}], required: [{
type: Input
}], disabled: [{
type: Input
}], errorStateMatcher: [{
type: Input
}], autofilled: [{
type: Input
}], dynamicSyncValidators: [{
type: Input
}], blurred: [{
type: Output
}], enterPressed: [{
type: Output
}], numericRangeChanged: [{
type: Output
}], shouldLabelFloat: [{
type: HostBinding,
args: ['class.floated']
}], userAriaDescribedBy: [{
type: HostBinding,
args: ['attr.aria-describedby']
}], id: [{
type: HostBinding
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW51bWVyaWMtcmFuZ2UtZm9ybS1maWVsZC9zcmMvbGliL2NvbnRyb2wvbnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW51bWVyaWMtcmFuZ2UtZm9ybS1maWVsZC9zcmMvbGliL2NvbnRyb2wvbnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBSUwsTUFBTSxFQUNOLElBQUksRUFFSixRQUFRLEVBQ1IsTUFBTSxlQUFlLENBQUM7QUFTdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7O0FBa0IvRSxNQUFNLE9BQU8scUNBQXFDO2FBVTFDLFdBQU0sR0FBRyxDQUFDLEFBQUosQ0FBSztJQUVsQixJQUFJLEtBQUs7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELElBQ0ksS0FBSyxDQUFDLEtBQW9CO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pD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QXNDLGFBR3JDO3dCQUNWOzRCQUNDLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcsdUNBQXVDO3lCQUNsRDt3QkFDRDs0QkFDQyxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixRQUFRLEVBQUUsd0JBQXdCO3lCQUNsQztxQkFDRCxtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs7MEJBK0Y3QyxJQUFJOzswQkFDSixRQUFRO3lDQTdFTixLQUFLO3NCQURSLEtBQUs7Z0JBVU8sV0FBVztzQkFBdkIsS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFSSxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUdILGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxlQUFlO2dCQU01QixtQkFBbUI7c0JBRGxCLFdBQVc7dUJBQUMsdUJBQXVCO2dCQUlwQyxFQUFFO3NCQURELFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHREb0NoZWNrLFxuXHRFdmVudEVtaXR0ZXIsXG5cdEhvc3RCaW5kaW5nLFxuXHRJbnB1dCxcblx0T25DaGFuZ2VzLFxuXHRPbkRlc3Ryb3ksXG5cdE9uSW5pdCxcblx0T3V0cHV0LFxuXHRTZWxmLFxuXHRTaW1wbGVDaGFuZ2VzLFxuXHRTa2lwU2VsZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG5cdEFic3RyYWN0Q29udHJvbCxcblx0Q29udHJvbFZhbHVlQWNjZXNzb3IsXG5cdEZvcm1Db250cm9sLFxuXHROZ0NvbnRyb2wsXG5cdFZhbGlkYXRvcixcblx0VmFsaWRhdG9yRm5cbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG5cdElOdW1lcmljUmFuZ2UsXG5cdE51bWVyaWNSYW5nZUZvcm1Hcm91cFxufSBmcm9tICcuLi9mb3JtL21vZGVsL251bWVyaWMtcmFuZ2UtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgTnVtZXJpY1JhbmdlRm9ybVNlcnZpY2UgfSBmcm9tICcuLi9mb3JtL251bWVyaWMtcmFuZ2UtZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IE51bWVyaWNSYW5nZVN0YXRlTWF0Y2hlciB9IGZyb20gJy4uL2Zvcm0vbnVtZXJpYy1yYW5nZS1zdGF0ZS1tYXRjaGVyJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd4LW51bWVyaWMtcmFuZ2UtZm9ybS1maWVsZC1jb250cm9sJyxcblx0dGVtcGxhdGVVcmw6ICcuL251bWVyaWMtcmFuZ2UtZm9ybS1maWVsZC1jb250cm9sLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vbnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50LnNjc3MnXSxcblx0cHJvdmlkZXJzOiBbXG5cdFx0e1xuXHRcdFx0cHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCxcblx0XHRcdHVzZUV4aXN0aW5nOiBOdW1lcmljUmFuZ2VGb3JtRmllbGRDb250cm9sQ29tcG9uZW50XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm92aWRlOiBFcnJvclN0YXRlTWF0Y2hlcixcblx0XHRcdHVzZUNsYXNzOiBOdW1lcmljUmFuZ2VTdGF0ZU1hdGNoZXJcblx0XHR9XG5cdF0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE51bWVyaWNSYW5nZUZvcm1GaWVsZENvbnRyb2xDb21wb25lbnRcblx0aW1wbGVtZW50c1xuXHRcdE9uQ2hhbmdlcyxcblx0XHRPbkluaXQsXG5cdFx0RG9DaGVjayxcblx0XHRPbkRlc3Ryb3ksXG5cdFx0TWF0Rm9ybUZpZWxkQ29udHJvbDxJTnVtZXJpY1JhbmdlPixcblx0XHRDb250cm9sVmFsdWVBY2Nlc3Nvcixcblx0XHRWYWxpZGF0b3Jcbntcblx0c3RhdGljIG5leHRJZCA9IDA7XG5cblx0Z2V0IHZhbHVlKCkge1xuXHRcdHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuXHR9XG5cblx0QElucHV0KClcblx0c2V0IHZhbHVlKHZhbHVlOiBJTnVtZXJpY1JhbmdlKSB7XG5cdFx0dGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh2YWx1ZSk7XG5cdFx0dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuXHR9XG5cblx0Z2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuXHR9XG5cblx0QElucHV0KCkgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuXHRcdHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcblx0fVxuXG5cdEBJbnB1dCgpIG1pblBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cdEBJbnB1dCgpIG1heFBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cdEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG5cdEBJbnB1dCgpIG1pblJlYWRvbmx5ID0gZmFsc2U7XG5cdEBJbnB1dCgpIG1heFJlYWRvbmx5ID0gZmFsc2U7XG5cdEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuO1xuXHRASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcblx0QElucHV0KCkgZXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyO1xuXHRASW5wdXQoKSBhdXRvZmlsbGVkPzogYm9vbGVhbjtcblx0QElucHV0KCkgZHluYW1pY1N5bmNWYWxpZGF0b3JzOiBWYWxpZGF0b3JGbiB8IFZhbGlkYXRvckZuW107XG5cblx0QE91dHB1dCgpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cdEBPdXRwdXQoKSBlbnRlclByZXNzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cdEBPdXRwdXQoKSBudW1lcmljUmFuZ2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJTnVtZXJpY1JhbmdlPigpO1xuXG5cdEBIb3N0QmluZGluZygnY2xhc3MuZmxvYXRlZCcpXG5cdGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKVxuXHR1c2VyQXJpYURlc2NyaWJlZEJ5ID0gJyc7XG5cblx0QEhvc3RCaW5kaW5nKClcblx0aWQgPSBgbnVtZXJpYy1yYW5nZS1mb3JtLWNvbnRyb2wtaWQtJHtOdW1lcmljUmFuZ2VGb3JtRmllbGRDb250cm9sQ29tcG9uZW50Lm5leHRJZCsrfWA7XG5cblx0Z2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhdGhpcy52YWx1ZS5taW5pbXVtICYmICF0aGlzLnZhbHVlLm1heGltdW07XG5cdH1cblxuXHRnZXQgZXJyb3JTdGF0ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5udW1lcmljUmFuZ2VFcnJvck1hdGNoZXIuaXNFcnJvclN0YXRlKFxuXHRcdFx0dGhpcy5uZ0NvbnRyb2wuY29udHJvbCBhcyBGb3JtQ29udHJvbCxcblx0XHRcdHRoaXMuZm9ybUdyb3VwXG5cdFx0KTtcblx0fVxuXG5cdGdldCBtaW5pbXVtQ29udHJvbCgpOiBGb3JtQ29udHJvbDxudW1iZXI+IHtcblx0XHRyZXR1cm4gdGhpcy5mb3JtU2VydmljZS5taW5pbXVtQ29udHJvbDtcblx0fVxuXG5cdGdldCBtYXhpbXVtQ29udHJvbCgpOiBGb3JtQ29udHJvbDxudW1iZXI+IHtcblx0XHRyZXR1cm4gdGhpcy5mb3JtU2VydmljZS5tYXhpbXVtQ29udHJvbDtcblx0fVxuXG5cdGZvcm1Hcm91cDogTnVtZXJpY1JhbmdlRm9ybUdyb3VwID0gdGhpcy5mb3JtU2VydmljZS5mb3JtR3JvdXA7XG5cblx0c3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuXHRmb2N1c2VkID0gZmFsc2U7XG5cblx0Y29udHJvbFR5cGUgPSAnbnVtZXJpYy1yYW5nZS1mb3JtLWNvbnRyb2wnO1xuXG5cdG51bWVyaWNSYW5nZUVycm9yTWF0Y2hlciA9IG5ldyBOdW1lcmljUmFuZ2VTdGF0ZU1hdGNoZXIoKTtcblxuXHRwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cblx0cHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZztcblxuXHRvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcblx0XHRAU2tpcFNlbGYoKSBwcml2YXRlIGZvcm1TZXJ2aWNlOiBOdW1lcmljUmFuZ2VGb3JtU2VydmljZVxuXHQpIHtcblx0XHR0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcblx0fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcblx0XHRpZiAoY2hhbmdlcy5keW5hbWljU3luY1ZhbGlkYXRvcnMpIHtcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2Uuc2V0RHluYW1pY1ZhbGlkYXRvcnModGhpcy5keW5hbWljU3luY1ZhbGlkYXRvcnMpO1xuXHRcdH1cblx0fVxuXG5cdG5nT25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuZm9ybVNlcnZpY2Uuc2V0U3luY1ZhbGlkYXRvcnModGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IpO1xuXHRcdHRoaXMuZm9ybVNlcnZpY2Uuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMubmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xuXG5cdFx0dGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKFt0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyldKTtcblx0XHR0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXHR9XG5cblx0bmdEb0NoZWNrKCk6IHZvaWQge1xuXHRcdHRoaXMuZm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XG5cdFx0dGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuXHRcdHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG5cdH1cblxuXHR3cml0ZVZhbHVlKHZhbHVlOiBJTnVtZXJpY1JhbmdlKTogdm9pZCB7XG5cdFx0dmFsdWUgPT09IG51bGxcblx0XHRcdD8gdGhpcy5mb3JtR3JvdXAucmVzZXQoKVxuXHRcdFx0OiB0aGlzLmZvcm1Hcm91cC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXHR9XG5cblx0cmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzXG5cdFx0XHQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuXHRcdFx0LnN1YnNjcmliZShmbik7XG5cdH1cblxuXHRyZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5vblRvdWNoZWQgPSBmbjtcblx0fVxuXG5cdHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcblx0XHRpc0Rpc2FibGVkID8gdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpIDogdGhpcy5mb3JtR3JvdXAuZW5hYmxlKCk7XG5cblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG5cdH1cblxuXHRzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy51c2VyQXJpYURlc2NyaWJlZEJ5ID0gaWRzLmpvaW4oJyAnKTtcblx0fVxuXG5cdG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHt9XG5cblx0dmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2wuZXJyb3JzO1xuXHR9XG5cblx0b25FbnRlclByZXNzZWQoKTogdm9pZCB7XG5cdFx0aWYgKFxuXHRcdFx0IXRoaXMuZm9ybUdyb3VwLmVycm9ycyAmJlxuXHRcdFx0IXRoaXMubWluaW11bUNvbnRyb2wuZXJyb3JzICYmXG5cdFx0XHQhdGhpcy5tYXhpbXVtQ29udHJvbC5lcnJvcnNcblx0XHQpIHtcblx0XHRcdHRoaXMuZW50ZXJQcmVzc2VkLmVtaXQoKTtcblx0XHR9XG5cdH1cblxuXHRvbkJsdXIoKTogdm9pZCB7XG5cdFx0dGhpcy5vblRvdWNoZWQoKTtcblx0XHR0aGlzLmJsdXJyZWQuZW1pdCgpO1xuXHR9XG5cblx0b25SYW5nZVZhbHVlc0NoYW5nZWQoKTogdm9pZCB7XG5cdFx0dGhpcy5mb3JtR3JvdXAuZXJyb3JzIHx8XG5cdFx0dGhpcy5taW5pbXVtQ29udHJvbC5lcnJvcnMgfHxcblx0XHR0aGlzLm1heGltdW1Db250cm9sLmVycm9yc1xuXHRcdFx0PyB0aGlzLm51bWVyaWNSYW5nZUNoYW5nZWQuZW1pdChudWxsKVxuXHRcdFx0OiB0aGlzLm51bWVyaWNSYW5nZUNoYW5nZWQuZW1pdCh0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpKTtcblx0fVxufVxuIiwiPGlucHV0XG5cdChibHVyKT1cIm9uQmx1cigpXCJcblx0KGNoYW5nZSk9XCJvblJhbmdlVmFsdWVzQ2hhbmdlZCgpXCJcblx0KGtleXVwLmVudGVyKT1cIm9uRW50ZXJQcmVzc2VkKClcIlxuXHRbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgbWluUmVhZG9ubHlcIlxuXHRbZm9ybUNvbnRyb2xdPVwibWluaW11bUNvbnRyb2xcIlxuXHRtYXRJbnB1dFxuXHRbcGxhY2Vob2xkZXJdPVwibWluUGxhY2Vob2xkZXJcIlxuXHR0eXBlPVwibnVtYmVyXCJcbi8+XG48c3BhbiBjbGFzcz1cInNwYWNlclwiPiZuZGFzaDs8L3NwYW4+XG48aW5wdXRcblx0KGJsdXIpPVwib25CbHVyKClcIlxuXHQoY2hhbmdlKT1cIm9uUmFuZ2VWYWx1ZXNDaGFuZ2VkKClcIlxuXHQoa2V5dXAuZW50ZXIpPVwib25FbnRlclByZXNzZWQoKVwiXG5cdFtmb3JtQ29udHJvbF09XCJtYXhpbXVtQ29udHJvbFwiXG5cdFtyZWFkb25seV09XCJyZWFkb25seSB8fCBtYXhSZWFkb25seVwiXG5cdG1hdElucHV0XG5cdFtwbGFjZWhvbGRlcl09XCJtYXhQbGFjZWhvbGRlclwiXG5cdHR5cGU9XCJudW1iZXJcIlxuLz5cbiJdfQ==