@angularfy/autonumeric
Version:
Angular implementation of autoNumeric
254 lines • 19.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import AutoNumeric from 'autonumeric';
import { AutonumericDefaults } from './autonumeric-defaults.service';
/** @type {?} */
export const AUTONUMERIC_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => AutonumericDirective)),
multi: true
};
export class AutonumericDirective {
/**
* @param {?} elm
* @param {?} defaults
* @param {?} renderer
*/
constructor(elm, defaults, renderer) {
this.elm = elm;
this.defaults = defaults;
this.renderer = renderer;
/* Defines the strategy to apply when options change.
* reset will drop any previous options
* update will change old values one by one but keep those that are not mentioned in the new options
*/
this.strategy = 'reset';
this.isDisabled = false;
this.formatted = new EventEmitter();
this.rawValueModified = new EventEmitter();
this.onChangeFn = (/**
* @return {?}
*/
() => {
});
this.onTouchedFn = (/**
* @return {?}
*/
() => {
});
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @private
* @param {?} options
* @return {?}
*/
normalize(options) {
/** @type {?} */
const normalized = {};
Object.keys(AutoNumeric.options).forEach((/**
* @param {?} key
* @return {?}
*/
key => {
if (typeof options[key] === 'undefined') {
normalized[key] = ((/** @type {?} */ (this.defaults)))[key];
}
else {
normalized[key] = options[key];
}
}));
return normalized;
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.instance = new AutoNumeric(this.elm.nativeElement, this.getOptions());
this.setDisabledState(this.isDisabled);
this.unsubscribeFormat = this.renderer.listen(this.elm.nativeElement, 'autoNumeric:formatted', (/**
* @param {?} $event
* @return {?}
*/
($event) => {
this.formatted.emit($event);
}));
this.unsubscribeRawValueModified = this.renderer.listen(this.elm.nativeElement, 'autoNumeric:rawValueModified', (/**
* @param {?} $event
* @return {?}
*/
($event) => {
this.onChangeFn($event.detail.newRawValue);
this.rawValueModified.emit($event);
}));
}
/**
* @private
* @return {?}
*/
getOptions() {
if (this.options === undefined && this.predefined === undefined) {
return this.defaults;
}
if (this.options !== undefined && this.predefined !== undefined) {
throw new Error('predefined attribute could not be combined with options. Please use either predefined or options');
}
if (this.options !== undefined) {
return this.normalize(this.options);
}
/** @type {?} */
const predefined = AutoNumeric.getPredefinedOptions()[this.predefined];
return this.normalize(predefined);
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (!this.instance) {
return;
}
if (changes.options || changes.predefined) {
if (this.strategy === 'reset') {
this.instance.options.reset();
}
this.instance.update(this.getOptions());
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.unsubscribeFormat();
this.unsubscribeRawValueModified();
try {
this.instance.remove(); // remove listeners
}
catch (e) {
}
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (this.instance) {
this.instance.set(value);
}
else {
// autonumeric hasn't been initialised yet, store the value for later use
this.initialValue = value;
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChangeFn = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouchedFn = fn;
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.isDisabled = isDisabled;
if (this.instance) {
if (this.isDisabled) {
this.renderer.setProperty(this.instance.domElement, 'disabled', 'disabled');
}
else {
this.renderer.removeAttribute(this.instance.domElement, 'disabled');
}
}
}
}
AutonumericDirective.decorators = [
{ type: Directive, args: [{
selector: '[autonumeric]',
providers: [AUTONUMERIC_CONTROL_VALUE_ACCESSOR],
// tslint:disable-next-line:use-host-property-decorator
host: {
'(blur)': 'onTouchedFn()'
},
},] }
];
/** @nocollapse */
AutonumericDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: AutonumericDefaults },
{ type: Renderer2 }
];
AutonumericDirective.propDecorators = {
strategy: [{ type: Input }],
options: [{ type: Input }],
predefined: [{ type: Input }],
formatted: [{ type: Output }],
rawValueModified: [{ type: Output }]
};
if (false) {
/** @type {?} */
AutonumericDirective.prototype.strategy;
/** @type {?} */
AutonumericDirective.prototype.options;
/** @type {?} */
AutonumericDirective.prototype.predefined;
/** @type {?} */
AutonumericDirective.prototype.instance;
/**
* @type {?}
* @private
*/
AutonumericDirective.prototype.isDisabled;
/**
* @type {?}
* @private
*/
AutonumericDirective.prototype.initialValue;
/** @type {?} */
AutonumericDirective.prototype.unsubscribeFormat;
/** @type {?} */
AutonumericDirective.prototype.unsubscribeRawValueModified;
/** @type {?} */
AutonumericDirective.prototype.formatted;
/** @type {?} */
AutonumericDirective.prototype.rawValueModified;
/** @type {?} */
AutonumericDirective.prototype.onChangeFn;
/** @type {?} */
AutonumericDirective.prototype.onTouchedFn;
/**
* @type {?}
* @private
*/
AutonumericDirective.prototype.elm;
/**
* @type {?}
* @private
*/
AutonumericDirective.prototype.defaults;
/**
* @type {?}
* @private
*/
AutonumericDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b251bWVyaWMuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFuZ3VsYXJmeS9hdXRvbnVtZXJpYy8iLCJzb3VyY2VzIjpbImxpYi9hdXRvbnVtZXJpYy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFHbkUsTUFBTSxPQUFPLGtDQUFrQyxHQUFRO0lBQ3JELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVU7OztJQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixFQUFDO0lBQ25ELEtBQUssRUFBRSxJQUFJO0NBQ1o7QUFVRCxNQUFNLE9BQU8sb0JBQW9COzs7Ozs7SUE0Qi9CLFlBQ1UsR0FBZSxFQUNmLFFBQTZCLEVBQzdCLFFBQW1CO1FBRm5CLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixhQUFRLEdBQVIsUUFBUSxDQUFxQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFXOzs7OztRQXhCN0IsYUFBUSxHQUF1QixPQUFPLENBQUM7UUFPL0IsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUszQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUvQixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RDLGVBQVU7OztRQUF5QixHQUFHLEVBQUU7UUFDeEMsQ0FBQyxFQUFDO1FBRUYsZ0JBQVc7OztRQUFHLEdBQUcsRUFBRTtRQUNuQixDQUFDLEVBQUM7SUFPRixDQUFDOzs7O0lBRUQs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LENBQUMsa0NBQWtDLENBQUM7O2dCQUUvQyxJQUFJLEVBQUU7b0JBQ0osUUFBUSxFQUFFLGVBQWU7aUJBQzFCO2FBQ0Y7Ozs7WUE3QkMsVUFBVTtZQWFKLG1CQUFtQjtZQUx6QixTQUFTOzs7dUJBNEJSLEtBQUs7c0JBR0wsS0FBSzt5QkFFTCxLQUFLO3dCQU9MLE1BQU07K0JBRU4sTUFBTTs7OztJQWRQLHdDQUN1Qzs7SUFFdkMsdUNBQzRCOztJQUM1QiwwQ0FDbUI7O0lBQ25CLHdDQUFjOzs7OztJQUNkLDBDQUEyQjs7Ozs7SUFDM0IsNENBQTBCOztJQUMxQixpREFBOEI7O0lBQzlCLDJEQUF3Qzs7SUFDeEMseUNBQytCOztJQUMvQixnREFDc0M7O0lBQ3RDLDBDQUNFOztJQUVGLDJDQUNFOzs7OztJQUdBLG1DQUF1Qjs7Ozs7SUFDdkIsd0NBQXFDOzs7OztJQUNyQyx3Q0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgQXV0b051bWVyaWMgZnJvbSAnYXV0b251bWVyaWMnO1xyXG5pbXBvcnQge0F1dG9udW1lcmljRGVmYXVsdHN9IGZyb20gJy4vYXV0b251bWVyaWMtZGVmYXVsdHMuc2VydmljZSc7XHJcbmltcG9ydCB7QXV0b251bWVyaWNPcHRpb25zfSBmcm9tICcuL2F1dG9udW1lcmljLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjb25zdCBBVVRPTlVNRVJJQ19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXV0b251bWVyaWNEaXJlY3RpdmUpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1thdXRvbnVtZXJpY10nLFxyXG4gIHByb3ZpZGVyczogW0FVVE9OVU1FUklDX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtaG9zdC1wcm9wZXJ0eS1kZWNvcmF0b3JcclxuICBob3N0OiB7XHJcbiAgICAnKGJsdXIpJzogJ29uVG91Y2hlZEZuKCknXHJcbiAgfSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dG9udW1lcmljRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKiBEZWZpbmVzIHRoZSBzdHJhdGVneSB0byBhcHBseSB3aGVuIG9wdGlvbnMgY2hhbmdlLlxyXG4gICAqIHJlc2V0IHdpbGwgZHJvcCBhbnkgcHJldmlvdXMgb3B0aW9uc1xyXG4gICAqIHVwZGF0ZSB3aWxsIGNoYW5nZSBvbGQgdmFsdWVzIG9uZSBieSBvbmUgYnV0IGtlZXAgdGhvc2UgdGhhdCBhcmUgbm90IG1lbnRpb25lZCBpbiB0aGUgbmV3IG9wdGlvbnNcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHN0cmF0ZWd5OiAncmVzZXQnIHwgJ3VwZGF0ZScgPSAncmVzZXQnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIG9wdGlvbnM6IEF1dG9udW1lcmljT3B0aW9ucztcclxuICBASW5wdXQoKVxyXG4gIHByZWRlZmluZWQ6IHN0cmluZztcclxuICBpbnN0YW5jZTogYW55O1xyXG4gIHByaXZhdGUgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaW5pdGlhbFZhbHVlOiBhbnk7XHJcbiAgdW5zdWJzY3JpYmVGb3JtYXQ6ICgpID0+IHZvaWQ7XHJcbiAgdW5zdWJzY3JpYmVSYXdWYWx1ZU1vZGlmaWVkOiAoKSA9PiB2b2lkO1xyXG4gIEBPdXRwdXQoKVxyXG4gIGZvcm1hdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KClcclxuICByYXdWYWx1ZU1vZGlmaWVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIG9uQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge1xyXG4gIH07XHJcblxyXG4gIG9uVG91Y2hlZEZuID0gKCkgPT4ge1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbG06IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGRlZmF1bHRzOiBBdXRvbnVtZXJpY0RlZmF1bHRzLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vcm1hbGl6ZShvcHRpb25zOiBhbnkpIHtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTtcclxuICAgIE9iamVjdC5rZXlzKEF1dG9OdW1lcmljLm9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgbm9ybWFsaXplZFtrZXldID0gKHRoaXMuZGVmYXVsdHMgYXMgYW55KVtrZXldO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IG9wdGlvbnNba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgQXV0b051bWVyaWMoXHJcbiAgICAgIHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgIHRoaXMuZ2V0T3B0aW9ucygpXHJcbiAgICApO1xyXG4gICAgdGhpcy5zZXREaXNhYmxlZFN0YXRlKHRoaXMuaXNEaXNhYmxlZCk7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlRm9ybWF0ID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbG0ubmF0aXZlRWxlbWVudCwgJ2F1dG9OdW1lcmljOmZvcm1hdHRlZCcsICgkZXZlbnQpID0+IHtcclxuICAgICAgdGhpcy5mb3JtYXR0ZWQuZW1pdCgkZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlUmF3VmFsdWVNb2RpZmllZCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQsICdhdXRvTnVtZXJpYzpyYXdWYWx1ZU1vZGlmaWVkJywgKCRldmVudCkgPT4ge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlRm4oJGV2ZW50LmRldGFpbC5uZXdSYXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMucmF3VmFsdWVNb2RpZmllZC5lbWl0KCRldmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3B0aW9ucygpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnByZWRlZmluZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0cztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByZWRlZmluZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByZWRlZmluZWQgYXR0cmlidXRlIGNvdWxkIG5vdCBiZSBjb21iaW5lZCB3aXRoIG9wdGlvbnMuIFBsZWFzZSB1c2UgZWl0aGVyIHByZWRlZmluZWQgb3Igb3B0aW9ucycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSh0aGlzLm9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJlZGVmaW5lZCA9IEF1dG9OdW1lcmljLmdldFByZWRlZmluZWRPcHRpb25zKClbdGhpcy5wcmVkZWZpbmVkXTtcclxuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwcmVkZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zIHx8IGNoYW5nZXMucHJlZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5zdHJhdGVneSA9PT0gJ3Jlc2V0Jykge1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXNldCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaW5zdGFuY2UudXBkYXRlKHRoaXMuZ2V0T3B0aW9ucygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy51bnN1YnNjcmliZUZvcm1hdCgpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZVJhd1ZhbHVlTW9kaWZpZWQoKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuaW5zdGFuY2UucmVtb3ZlKCk7IC8vIHJlbW92ZSBsaXN0ZW5lcnNcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5zZXQodmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gYXV0b251bWVyaWMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgeWV0LCBzdG9yZSB0aGUgdmFsdWUgZm9yIGxhdGVyIHVzZVxyXG4gICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmluc3RhbmNlLmRvbUVsZW1lbnQsICdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuaW5zdGFuY2UuZG9tRWxlbWVudCwgJ2Rpc2FibGVkJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19