@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
507 lines • 31.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// tslint:disable: variable-name
import { ContentChildren, Component, EventEmitter, forwardRef, Input, Output, QueryList, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Radio } from './radio.component';
var RadioGroup = /** @class */ (function () {
function RadioGroup() {
this.orientation = 'horizontal';
this.radioLabelPlacement = 'right';
/**
* Emits event notifying other classes of a change using a `RadioChange` class.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Set to true to disable the whole radio group
*/
this.disabled = false;
/**
* Binds 'form-item' value to the class for `RadioGroup`.
*/
this.radioButtonGroupClass = true;
/**
* To track whether the `RadioGroup` has been initialized.
*/
this.isInitialized = false;
/**
* Reflects whether or not the input is disabled and cannot be selected.
*/
this._disabled = false;
/**
* Reflects whether or not the dropdown is loading.
*/
this._skeleton = false;
/**
* The value of the selected option within the `RadioGroup`.
*/
this._value = null;
/**
* The `Radio` within the `RadioGroup` that is selected.
*/
this._selected = null;
/**
* The name attribute associated with the `RadioGroup`.
*/
this._name = "radio-group-" + RadioGroup.radioGroupCount++;
/**
* Needed to properly implement ControlValueAccessor.
*/
this.onTouched = (/**
* @return {?}
*/
function () { });
/**
* Method set in registerOnChange to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { });
}
Object.defineProperty(RadioGroup.prototype, "selected", {
/**
* Returns the `Radio` that is selected within the `RadioGroup`.
*/
get: /**
* Returns the `Radio` that is selected within the `RadioGroup`.
* @return {?}
*/
function () {
return this._selected;
},
/**
* Sets the passed in `Radio` item as the selected input within the `RadioGroup`.
*/
set: /**
* Sets the passed in `Radio` item as the selected input within the `RadioGroup`.
* @param {?} selected
* @return {?}
*/
function (selected) {
this._selected = selected;
this.value = selected ? selected.value : null;
this.checkSelectedRadio();
},
enumerable: true,
configurable: true
});
Object.defineProperty(RadioGroup.prototype, "value", {
/**
* Returns the value/state of the selected `Radio` within the `RadioGroup`.
*/
get: /**
* Returns the value/state of the selected `Radio` within the `RadioGroup`.
* @return {?}
*/
function () {
return this._value;
},
/**
* Sets the value/state of the selected `Radio` within the `RadioGroup` to the passed in value.
*/
set: /**
* Sets the value/state of the selected `Radio` within the `RadioGroup` to the passed in value.
* @param {?} newValue
* @return {?}
*/
function (newValue) {
if (this._value !== newValue) {
this._value = newValue;
this.updateSelectedRadioFromValue();
this.checkSelectedRadio();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(RadioGroup.prototype, "name", {
/**
* Returns the associated name of the `RadioGroup`.
*/
get: /**
* Returns the associated name of the `RadioGroup`.
* @return {?}
*/
function () {
return this._name;
},
/**
* Replaces the name associated with the `RadioGroup` with the provided parameter.
*/
set: /**
* Replaces the name associated with the `RadioGroup` with the provided parameter.
* @param {?} name
* @return {?}
*/
function (name) {
this._name = name;
this.updateRadios();
},
enumerable: true,
configurable: true
});
Object.defineProperty(RadioGroup.prototype, "skeleton", {
/**
* Returns the skeleton value in the `RadioGroup` if there is one.
*/
get: /**
* Returns the skeleton value in the `RadioGroup` if there is one.
* @return {?}
*/
function () {
return this._skeleton;
},
/**
* Sets the skeleton value for all `Radio` to the skeleton value of `RadioGroup`.
*/
set: /**
* Sets the skeleton value for all `Radio` to the skeleton value of `RadioGroup`.
* @param {?} value
* @return {?}
*/
function (value) {
this._skeleton = value;
this.updateChildren();
},
enumerable: true,
configurable: true
});
/**
* Updates the selected `Radio` to be checked (selected).
*/
/**
* Updates the selected `Radio` to be checked (selected).
* @return {?}
*/
RadioGroup.prototype.checkSelectedRadio = /**
* Updates the selected `Radio` to be checked (selected).
* @return {?}
*/
function () {
if (this.selected && !this._selected.checked) {
this.selected.checked = true;
}
};
/**
* Use the value of the `RadioGroup` to update the selected radio to the right state (selected state).
*/
/**
* Use the value of the `RadioGroup` to update the selected radio to the right state (selected state).
* @return {?}
*/
RadioGroup.prototype.updateSelectedRadioFromValue = /**
* Use the value of the `RadioGroup` to update the selected radio to the right state (selected state).
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var alreadySelected = this._selected != null && this._selected.value === this._value;
if (this.radios && !alreadySelected) {
this._selected = null;
this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
function (radio) {
if (radio.checked) {
_this._selected = radio;
}
}));
}
};
/**
* Creates a class of `RadioChange` to emit the change in the `RadioGroup`.
*/
/**
* Creates a class of `RadioChange` to emit the change in the `RadioGroup`.
* @param {?} event
* @return {?}
*/
RadioGroup.prototype.emitChangeEvent = /**
* Creates a class of `RadioChange` to emit the change in the `RadioGroup`.
* @param {?} event
* @return {?}
*/
function (event) {
this.change.emit(event);
this.propagateChange(event.value);
this.onTouched();
};
/**
* @return {?}
*/
RadioGroup.prototype.updateRadioNames = /**
* @return {?}
*/
function () {
console.warn('updateRadioNames had been deprecated. Use updateRadios instead');
this.updateRadios();
};
/**
* Synchronizes radio properties.
*/
/**
* Synchronizes radio properties.
* @return {?}
*/
RadioGroup.prototype.updateRadios = /**
* Synchronizes radio properties.
* @return {?}
*/
function () {
var _this = this;
if (this.radios) {
setTimeout((/**
* @return {?}
*/
function () {
_this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
function (radio) { return radio.name = _this.name; }));
if (_this.radioLabelPlacement === 'left') {
_this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
function (radio) { return radio.labelPlacement = 'left'; }));
}
}));
}
};
/**
* Updates the value of the `RadioGroup` using the provided parameter.
*/
/**
* Updates the value of the `RadioGroup` using the provided parameter.
* @param {?} value
* @return {?}
*/
RadioGroup.prototype.writeValue = /**
* Updates the value of the `RadioGroup` using the provided parameter.
* @param {?} value
* @return {?}
*/
function (value) {
this.value = value;
};
/**
* @return {?}
*/
RadioGroup.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
this.radios.changes.subscribe((/**
* @return {?}
*/
function () {
_this.updateRadios();
_this.updateRadioChangeHandler();
}));
this.updateChildren();
this.updateRadioChangeHandler();
};
/**
* @return {?}
*/
RadioGroup.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.updateRadios();
};
/**
* Used to set method to propagate changes back to the form.
*/
/**
* Used to set method to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
RadioGroup.prototype.registerOnChange = /**
* Used to set method to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* Registers a callback to be triggered when the control has been touched.
* @param fn Callback to be triggered when the checkbox is touched.
*/
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the checkbox is touched.
* @return {?}
*/
RadioGroup.prototype.registerOnTouched = /**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the checkbox is touched.
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @protected
* @return {?}
*/
RadioGroup.prototype.updateChildren = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
if (this.radios) {
this.radios.forEach((/**
* @param {?} child
* @return {?}
*/
function (child) { return child.skeleton = _this.skeleton; }));
}
};
/**
* @protected
* @return {?}
*/
RadioGroup.prototype.updateRadioChangeHandler = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
function (radio) {
radio.registerRadioChangeHandler((/**
* @param {?} event
* @return {?}
*/
function (event) {
// update selected and value from the event
_this._selected = event.source;
_this._value = event.value;
// bubble the event
_this.emitChangeEvent(event);
}));
}));
};
RadioGroup.radioGroupCount = 0;
RadioGroup.decorators = [
{ type: Component, args: [{
selector: 'suka-radio-group',
template: "\n <div\n class=\"radio-button-group\"\n [ngClass]=\"{\n 'radio-button-group--vertical': orientation === 'vertical',\n 'radio-button-group--label-left': orientation === 'vertical' && radioLabelPlacement === 'left'\n }\"\n role=\"radiogroup\">\n <ng-content></ng-content>\n </div>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: RadioGroup,
multi: true
}
]
}] }
];
RadioGroup.propDecorators = {
orientation: [{ type: Input }],
radioLabelPlacement: [{ type: Input }],
change: [{ type: Output }],
radios: [{ type: ContentChildren, args: [forwardRef((/**
* @return {?}
*/
function () { return Radio; })),] }],
selected: [{ type: Input }],
value: [{ type: Input }],
name: [{ type: Input }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
radioButtonGroupClass: [{ type: HostBinding, args: ['class.form-item',] }]
};
return RadioGroup;
}());
export { RadioGroup };
if (false) {
/** @type {?} */
RadioGroup.radioGroupCount;
/** @type {?} */
RadioGroup.prototype.orientation;
/** @type {?} */
RadioGroup.prototype.radioLabelPlacement;
/**
* Emits event notifying other classes of a change using a `RadioChange` class.
* @type {?}
*/
RadioGroup.prototype.change;
/**
* The `Radio` input items in the `RadioGroup`.
* @type {?}
*/
RadioGroup.prototype.radios;
/**
* Set to true to disable the whole radio group
* @type {?}
*/
RadioGroup.prototype.disabled;
/**
* Binds 'form-item' value to the class for `RadioGroup`.
* @type {?}
*/
RadioGroup.prototype.radioButtonGroupClass;
/**
* To track whether the `RadioGroup` has been initialized.
* @type {?}
* @protected
*/
RadioGroup.prototype.isInitialized;
/**
* Reflects whether or not the input is disabled and cannot be selected.
* @type {?}
* @protected
*/
RadioGroup.prototype._disabled;
/**
* Reflects whether or not the dropdown is loading.
* @type {?}
* @protected
*/
RadioGroup.prototype._skeleton;
/**
* The value of the selected option within the `RadioGroup`.
* @type {?}
* @protected
*/
RadioGroup.prototype._value;
/**
* The `Radio` within the `RadioGroup` that is selected.
* @type {?}
* @protected
*/
RadioGroup.prototype._selected;
/**
* The name attribute associated with the `RadioGroup`.
* @type {?}
* @protected
*/
RadioGroup.prototype._name;
/**
* Needed to properly implement ControlValueAccessor.
* @type {?}
*/
RadioGroup.prototype.onTouched;
/**
* Method set in registerOnChange to propagate changes back to the form.
* @type {?}
*/
RadioGroup.prototype.propagateChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL3JhZGlvL3JhZGlvLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFFTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHMUM7SUFBQTtRQXlCVyxnQkFBVyxHQUE4QixZQUFZLENBQUM7UUFFdEQsd0JBQW1CLEdBQXFCLE9BQU8sQ0FBQzs7Ozs7UUFNL0MsV0FBTSxHQUE4QixJQUFJLFlBQVksRUFBZSxDQUFDOzs7O1FBOERyRSxhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBcUJNLDBCQUFxQixHQUFHLElBQUksQ0FBQzs7OztRQUtuRCxrQkFBYSxHQUFHLEtBQUssQ0FBQzs7OztRQUl0QixjQUFTLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWxCLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFJbEIsV0FBTSxHQUFRLElBQUksQ0FBQzs7OztRQUluQixjQUFTLEdBQVUsSUFBSSxDQUFDOzs7O1FBSXhCLFVBQUssR0FBRyxpQkFBZSxVQUFVLENBQUMsZUFBZSxFQUFJLENBQUM7Ozs7UUE4RmhFLGNBQVM7OztRQUFjLGNBQVEsQ0FBQyxFQUFDOzs7O1FBS2pDLG9CQUFlOzs7O1FBQUcsVUFBQyxDQUFNLElBQU8sQ0FBQyxFQUFDO0lBbUJwQyxDQUFDO0lBeE5DLHNCQUNJLGdDQUFRO1FBTVo7O1dBRUc7Ozs7O1FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FB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Z0JMLFdBQVcsU0FBQyxpQkFBaUI7O0lBK0loQyxpQkFBQztDQUFBLEFBblFELElBbVFDO1NBN09ZLFVBQVU7OztJQUNyQiwyQkFBMkI7O0lBRTNCLGlDQUErRDs7SUFFL0QseUNBQXlEOzs7OztJQU16RCw0QkFBOEU7Ozs7O0lBSzlFLDRCQUFtRTs7Ozs7SUF5RG5FLDhCQUEwQjs7Ozs7SUFxQjFCLDJDQUE2RDs7Ozs7O0lBSzdELG1DQUFnQzs7Ozs7O0lBSWhDLCtCQUE0Qjs7Ozs7O0lBSTVCLCtCQUE0Qjs7Ozs7O0lBSTVCLDRCQUE2Qjs7Ozs7O0lBSTdCLCtCQUFrQzs7Ozs7O0lBSWxDLDJCQUFnRTs7Ozs7SUE4RmhFLCtCQUFpQzs7Ozs7SUFLakMscUNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6IHZhcmlhYmxlLW5hbWVcblxuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBIb3N0QmluZGluZyxcbiAgQWZ0ZXJWaWV3SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJhZGlvIH0gZnJvbSAnLi9yYWRpby5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmFkaW9DaGFuZ2UgfSBmcm9tICcuL3JhZGlvLWNoYW5nZS5jbGFzcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtcmFkaW8tZ3JvdXAnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicmFkaW8tYnV0dG9uLWdyb3VwXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3JhZGlvLWJ1dHRvbi1ncm91cC0tdmVydGljYWwnOiBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyxcbiAgICAgICAgJ3JhZGlvLWJ1dHRvbi1ncm91cC0tbGFiZWwtbGVmdCc6IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnICYmIHJhZGlvTGFiZWxQbGFjZW1lbnQgPT09ICdsZWZ0J1xuICAgICAgfVwiXG4gICAgICByb2xlPVwicmFkaW9ncm91cFwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICBgLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBSYWRpb0dyb3VwLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBzdGF0aWMgcmFkaW9Hcm91cENvdW50ID0gMDtcblxuICBASW5wdXQoKSBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyA9ICdob3Jpem9udGFsJztcblxuICBASW5wdXQoKSByYWRpb0xhYmVsUGxhY2VtZW50OiAncmlnaHQnIHwgJ2xlZnQnID0gJ3JpZ2h0JztcblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgbm90aWZ5aW5nIG90aGVyIGNsYXNzZXMgb2YgYSBjaGFuZ2UgdXNpbmcgYSBgUmFkaW9DaGFuZ2VgIGNsYXNzLlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJhZGlvQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgYFJhZGlvYCBpbnB1dCBpdGVtcyBpbiB0aGUgYFJhZGlvR3JvdXBgLlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IFJhZGlvKSkgcmFkaW9zOiBRdWVyeUxpc3Q8UmFkaW8+O1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwYXNzZWQgaW4gYFJhZGlvYCBpdGVtIGFzIHRoZSBzZWxlY3RlZCBpbnB1dCB3aXRoaW4gdGhlIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RlZChzZWxlY3RlZDogUmFkaW8gfCBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWQgPyBzZWxlY3RlZC52YWx1ZSA6IG51bGw7XG4gICAgdGhpcy5jaGVja1NlbGVjdGVkUmFkaW8oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgUmFkaW9gIHRoYXQgaXMgc2VsZWN0ZWQgd2l0aGluIHRoZSBgUmFkaW9Hcm91cGAuXG4gICAqL1xuICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlL3N0YXRlIG9mIHRoZSBzZWxlY3RlZCBgUmFkaW9gIHdpdGhpbiB0aGUgYFJhZGlvR3JvdXBgIHRvIHRoZSBwYXNzZWQgaW4gdmFsdWUuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG5cbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRSYWRpb0Zyb21WYWx1ZSgpO1xuICAgICAgdGhpcy5jaGVja1NlbGVjdGVkUmFkaW8oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUvc3RhdGUgb2YgdGhlIHNlbGVjdGVkIGBSYWRpb2Agd2l0aGluIHRoZSBgUmFkaW9Hcm91cGAuXG4gICAqL1xuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgYFJhZGlvR3JvdXBgIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtZXRlci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgIHRoaXMudXBkYXRlUmFkaW9zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQgbmFtZSBvZiB0aGUgYFJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gZGlzYWJsZSB0aGUgd2hvbGUgcmFkaW8gZ3JvdXBcbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNrZWxldG9uIHZhbHVlIGluIHRoZSBgUmFkaW9Hcm91cGAgaWYgdGhlcmUgaXMgb25lLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHNrZWxldG9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3NrZWxldG9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNrZWxldG9uIHZhbHVlIGZvciBhbGwgYFJhZGlvYCB0byB0aGUgc2tlbGV0b24gdmFsdWUgb2YgYFJhZGlvR3JvdXBgLlxuICAgKi9cbiAgc2V0IHNrZWxldG9uKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl9za2VsZXRvbiA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyAnZm9ybS1pdGVtJyB2YWx1ZSB0byB0aGUgY2xhc3MgZm9yIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgcmFkaW9CdXR0b25Hcm91cENsYXNzID0gdHJ1ZTtcblxuICAvKipcbiAgICogVG8gdHJhY2sgd2hldGhlciB0aGUgYFJhZGlvR3JvdXBgIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFJlZmxlY3RzIHdoZXRoZXIgb3Igbm90IHRoZSBpbnB1dCBpcyBkaXNhYmxlZCBhbmQgY2Fubm90IGJlIHNlbGVjdGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogUmVmbGVjdHMgd2hldGhlciBvciBub3QgdGhlIGRyb3Bkb3duIGlzIGxvYWRpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3NrZWxldG9uID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiB3aXRoaW4gdGhlIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIHByb3RlY3RlZCBfdmFsdWU6IGFueSA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgYFJhZGlvYCB3aXRoaW4gdGhlIGBSYWRpb0dyb3VwYCB0aGF0IGlzIHNlbGVjdGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9zZWxlY3RlZDogUmFkaW8gPSBudWxsO1xuICAvKipcbiAgICogVGhlIG5hbWUgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYFJhZGlvR3JvdXBgLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9uYW1lID0gYHJhZGlvLWdyb3VwLSR7UmFkaW9Hcm91cC5yYWRpb0dyb3VwQ291bnQrK31gO1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzZWxlY3RlZCBgUmFkaW9gIHRvIGJlIGNoZWNrZWQgKHNlbGVjdGVkKS5cbiAgICovXG4gIGNoZWNrU2VsZWN0ZWRSYWRpbygpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZCAmJiAhdGhpcy5fc2VsZWN0ZWQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlIHRoZSB2YWx1ZSBvZiB0aGUgYFJhZGlvR3JvdXBgIHRvIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgcmFkaW8gdG8gdGhlIHJpZ2h0IHN0YXRlIChzZWxlY3RlZCBzdGF0ZSkuXG4gICAqL1xuICB1cGRhdGVTZWxlY3RlZFJhZGlvRnJvbVZhbHVlKCkge1xuICAgIGNvbnN0IGFscmVhZHlTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGVkICE9IG51bGwgJiYgdGhpcy5fc2VsZWN0ZWQudmFsdWUgPT09IHRoaXMuX3ZhbHVlO1xuXG4gICAgaWYgKHRoaXMucmFkaW9zICYmICFhbHJlYWR5U2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gbnVsbDtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2gocmFkaW8gPT4ge1xuICAgICAgICBpZiAocmFkaW8uY2hlY2tlZCkge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gcmFkaW87XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xhc3Mgb2YgYFJhZGlvQ2hhbmdlYCB0byBlbWl0IHRoZSBjaGFuZ2UgaW4gdGhlIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIGVtaXRDaGFuZ2VFdmVudChldmVudDogUmFkaW9DaGFuZ2UpIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZShldmVudC52YWx1ZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIHVwZGF0ZVJhZGlvTmFtZXMoKSB7XG4gICAgY29uc29sZS53YXJuKCd1cGRhdGVSYWRpb05hbWVzIGhhZCBiZWVuIGRlcHJlY2F0ZWQuIFVzZSB1cGRhdGVSYWRpb3MgaW5zdGVhZCcpO1xuICAgIHRoaXMudXBkYXRlUmFkaW9zKCk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemVzIHJhZGlvIHByb3BlcnRpZXMuXG4gICAqL1xuICB1cGRhdGVSYWRpb3MoKSB7XG4gICAgaWYgKHRoaXMucmFkaW9zKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaChyYWRpbyA9PiByYWRpby5uYW1lID0gdGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKHRoaXMucmFkaW9MYWJlbFBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaChyYWRpbyA9PiByYWRpby5sYWJlbFBsYWNlbWVudCA9ICdsZWZ0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBvZiB0aGUgYFJhZGlvR3JvdXBgIHVzaW5nIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIuXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5yYWRpb3MuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVSYWRpb3MoKTtcbiAgICAgIHRoaXMudXBkYXRlUmFkaW9DaGFuZ2VIYW5kbGVyKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XG4gICAgdGhpcy51cGRhdGVSYWRpb0NoYW5nZUhhbmRsZXIoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVJhZGlvcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IG1ldGhvZCB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjaGVja2JveCBpcyB0b3VjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIE5lZWRlZCB0byBwcm9wZXJseSBpbXBsZW1lbnQgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKipcbiAgICogTWV0aG9kIHNldCBpbiByZWdpc3Rlck9uQ2hhbmdlIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUNoaWxkcmVuKCkge1xuICAgIGlmICh0aGlzLnJhZGlvcykge1xuICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5za2VsZXRvbiA9IHRoaXMuc2tlbGV0b24pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVSYWRpb0NoYW5nZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5yYWRpb3MuZm9yRWFjaChyYWRpbyA9PiB7XG4gICAgICByYWRpby5yZWdpc3RlclJhZGlvQ2hhbmdlSGFuZGxlcigoZXZlbnQ6IFJhZGlvQ2hhbmdlKSA9PiB7XG4gICAgICAgIC8vIHVwZGF0ZSBzZWxlY3RlZCBhbmQgdmFsdWUgZnJvbSB0aGUgZXZlbnRcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBldmVudC5zb3VyY2U7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gZXZlbnQudmFsdWU7XG4gICAgICAgIC8vIGJ1YmJsZSB0aGUgZXZlbnRcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==