UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

447 lines 37.6 kB
/** * @fileoverview added by tsickle * Generated from: form-control.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, Host, Input, Optional, Renderer2, ViewEncapsulation } from '@angular/core'; import { FormControl, FormControlDirective, FormControlName, NgControl, NgModel } from '@angular/forms'; import { helpMotion } from 'ng-zorro-antd/core/animation'; import { toBoolean } from 'ng-zorro-antd/core/util'; import { NzI18nService } from 'ng-zorro-antd/i18n'; import { Subject, Subscription } from 'rxjs'; import { filter, startWith, takeUntil, tap } from 'rxjs/operators'; import { NzFormDirective } from './form.directive'; import { NzFormItemComponent } from './form-item.component'; /** @type {?} */ var iconTypeMap = (/** @type {?} */ ({ error: 'close-circle-fill', validating: 'loading', success: 'check-circle-fill', warning: 'exclamation-circle-fill' })); var NzFormControlComponent = /** @class */ (function () { function NzFormControlComponent(elementRef, nzFormItemComponent, cdr, renderer, i18n, nzFormDirective) { var _this = this; var _a, _b; this.nzFormItemComponent = nzFormItemComponent; this.cdr = cdr; this.nzFormDirective = nzFormDirective; this._hasFeedback = false; this.validateChanges = Subscription.EMPTY; this.validateString = null; this.status = null; this.destroyed$ = new Subject(); this.validateControl = null; this.iconType = null; this.innerTip = null; this.nzAutoTips = {}; this.nzDisableAutoTips = 'default'; renderer.addClass(elementRef.nativeElement, 'ant-form-item-control'); this.subscribeAutoTips(i18n.localeChange.pipe(tap((/** * @param {?} locale * @return {?} */ function (locale) { return (_this.localeId = locale.locale); })))); this.subscribeAutoTips((_a = this.nzFormDirective) === null || _a === void 0 ? void 0 : _a.getInputObservable('nzAutoTips')); this.subscribeAutoTips((_b = this.nzFormDirective) === null || _b === void 0 ? void 0 : _b.getInputObservable('nzDisableAutoTips').pipe(filter((/** * @return {?} */ function () { return _this.nzDisableAutoTips === 'default'; })))); } Object.defineProperty(NzFormControlComponent.prototype, "disableAutoTips", { get: /** * @private * @return {?} */ function () { var _a; return this.nzDisableAutoTips !== 'default' ? toBoolean(this.nzDisableAutoTips) : (_a = this.nzFormDirective) === null || _a === void 0 ? void 0 : _a.nzDisableAutoTips; }, enumerable: true, configurable: true }); Object.defineProperty(NzFormControlComponent.prototype, "nzHasFeedback", { get: /** * @return {?} */ function () { return this._hasFeedback; }, set: /** * @param {?} value * @return {?} */ function (value) { this._hasFeedback = toBoolean(value); if (this.nzFormItemComponent) { this.nzFormItemComponent.setHasFeedback(this._hasFeedback); } }, enumerable: true, configurable: true }); Object.defineProperty(NzFormControlComponent.prototype, "nzValidateStatus", { set: /** * @param {?} value * @return {?} */ function (value) { if (value instanceof FormControl || value instanceof NgModel) { this.validateControl = value; this.validateString = null; this.watchControl(); } else if (value instanceof FormControlName) { this.validateControl = value.control; this.validateString = null; this.watchControl(); } else { this.validateString = value; this.validateControl = null; this.setStatus(); } }, enumerable: true, configurable: true }); /** * @private * @return {?} */ NzFormControlComponent.prototype.watchControl = /** * @private * @return {?} */ function () { var _this = this; this.validateChanges.unsubscribe(); /** miss detect https://github.com/angular/angular/issues/10887 **/ if (this.validateControl && this.validateControl.statusChanges) { this.validateChanges = this.validateControl.statusChanges.pipe(startWith(null), takeUntil(this.destroyed$)).subscribe((/** * @param {?} _ * @return {?} */ function (_) { if (_this.disableAutoTips) { _this.setStatus(); _this.cdr.markForCheck(); } else { _this.updateAutoTip(); } })); } }; /** * @private * @return {?} */ NzFormControlComponent.prototype.setStatus = /** * @private * @return {?} */ function () { this.status = this.getControlStatus(this.validateString); this.iconType = this.status ? iconTypeMap[this.status] : null; this.innerTip = this.getInnerTip(this.status); if (this.nzFormItemComponent) { this.nzFormItemComponent.setWithHelpViaTips(!!this.innerTip); this.nzFormItemComponent.setStatus(this.status); } }; /** * @private * @param {?} validateString * @return {?} */ NzFormControlComponent.prototype.getControlStatus = /** * @private * @param {?} validateString * @return {?} */ function (validateString) { /** @type {?} */ var status; if (validateString === 'warning' || this.validateControlStatus('INVALID', 'warning')) { status = 'warning'; } else if (validateString === 'error' || this.validateControlStatus('INVALID')) { status = 'error'; } else if (validateString === 'validating' || validateString === 'pending' || this.validateControlStatus('PENDING')) { status = 'validating'; } else if (validateString === 'success' || this.validateControlStatus('VALID')) { status = 'success'; } else { status = null; } return status; }; /** * @private * @param {?} validStatus * @param {?=} statusType * @return {?} */ NzFormControlComponent.prototype.validateControlStatus = /** * @private * @param {?} validStatus * @param {?=} statusType * @return {?} */ function (validStatus, statusType) { if (!this.validateControl) { return false; } else { var _a = this.validateControl, dirty = _a.dirty, touched = _a.touched, status_1 = _a.status; return (!!dirty || !!touched) && (statusType ? this.validateControl.hasError(statusType) : status_1 === validStatus); } }; /** * @private * @param {?} status * @return {?} */ NzFormControlComponent.prototype.getInnerTip = /** * @private * @param {?} status * @return {?} */ function (status) { switch (status) { case 'error': return (!this.disableAutoTips && this.autoErrorTip) || this.nzErrorTip; case 'validating': return this.nzValidatingTip; case 'success': return this.nzSuccessTip; case 'warning': return this.nzWarningTip; default: return null; } }; /** * @private * @return {?} */ NzFormControlComponent.prototype.updateAutoTip = /** * @private * @return {?} */ function () { this.updateAutoErrorTip(); this.setStatus(); this.cdr.markForCheck(); }; /** * @private * @return {?} */ NzFormControlComponent.prototype.updateAutoErrorTip = /** * @private * @return {?} */ function () { var _a, _b, _c, _d, _e, _f, _g; if (this.validateControl) { /** @type {?} */ var errors = this.validateControl.errors || {}; /** @type {?} */ var autoErrorTip = ''; for (var key in errors) { if (errors.hasOwnProperty(key)) { autoErrorTip = (_d = (_a = errors[key][this.localeId]) !== null && _a !== void 0 ? _a : (_c = (_b = this.nzAutoTips) === null || _b === void 0 ? void 0 : _b[this.localeId]) === null || _c === void 0 ? void 0 : _c[key]) !== null && _d !== void 0 ? _d : (_g = (_f = (_e = this.nzFormDirective) === null || _e === void 0 ? void 0 : _e.nzAutoTips) === null || _f === void 0 ? void 0 : _f[this.localeId]) === null || _g === void 0 ? void 0 : _g[key]; } if (!!autoErrorTip) { break; } } this.autoErrorTip = autoErrorTip; } }; /** * @private * @param {?} observable * @return {?} */ NzFormControlComponent.prototype.subscribeAutoTips = /** * @private * @param {?} observable * @return {?} */ function (observable) { var _this = this; observable === null || observable === void 0 ? void 0 : observable.pipe(takeUntil(this.destroyed$)).subscribe((/** * @return {?} */ function () { if (!_this.disableAutoTips) { _this.updateAutoTip(); } })); }; /** * @return {?} */ NzFormControlComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.setStatus(); }; /** * @return {?} */ NzFormControlComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroyed$.next(); this.destroyed$.complete(); }; /** * @return {?} */ NzFormControlComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { if (!this.validateControl && !this.validateString) { if (this.defaultValidateControl instanceof FormControlDirective) { this.nzValidateStatus = this.defaultValidateControl.control; } else { this.nzValidateStatus = this.defaultValidateControl; } } }; NzFormControlComponent.decorators = [ { type: Component, args: [{ selector: 'nz-form-control', exportAs: 'nzFormControl', preserveWhitespaces: false, animations: [helpMotion], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n <div class=\"ant-form-item-control-input\">\n <div class=\"ant-form-item-control-input-content\">\n <ng-content></ng-content>\n </div>\n <span class=\"ant-form-item-children-icon\">\n <i *ngIf=\"nzHasFeedback && iconType\" nz-icon [nzType]=\"iconType\"></i>\n </span>\n </div>\n <div class=\"ant-form-item-explain\" *ngIf=\"innerTip\">\n <div @helpMotion>\n <ng-container *nzStringTemplateOutlet=\"innerTip; context: { $implicit: validateControl }\">{{ innerTip }}</ng-container>\n </div>\n </div>\n <div class=\"ant-form-item-extra\" *ngIf=\"nzExtra\">\n <ng-container *nzStringTemplateOutlet=\"nzExtra\">{{ nzExtra }}</ng-container>\n </div>\n " }] } ]; /** @nocollapse */ NzFormControlComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: NzFormItemComponent, decorators: [{ type: Optional }, { type: Host }] }, { type: ChangeDetectorRef }, { type: Renderer2 }, { type: NzI18nService }, { type: NzFormDirective, decorators: [{ type: Optional }, { type: Host }] } ]; }; NzFormControlComponent.propDecorators = { defaultValidateControl: [{ type: ContentChild, args: [NgControl, { static: false },] }], nzSuccessTip: [{ type: Input }], nzWarningTip: [{ type: Input }], nzErrorTip: [{ type: Input }], nzValidatingTip: [{ type: Input }], nzExtra: [{ type: Input }], nzAutoTips: [{ type: Input }], nzDisableAutoTips: [{ type: Input }], nzHasFeedback: [{ type: Input }], nzValidateStatus: [{ type: Input }] }; return NzFormControlComponent; }()); export { NzFormControlComponent }; if (false) { /** @type {?} */ NzFormControlComponent.ngAcceptInputType_nzHasFeedback; /** @type {?} */ NzFormControlComponent.ngAcceptInputType_nzRequired; /** @type {?} */ NzFormControlComponent.ngAcceptInputType_nzNoColon; /** @type {?} */ NzFormControlComponent.ngAcceptInputType_nzDisableAutoTips; /** * @type {?} * @private */ NzFormControlComponent.prototype._hasFeedback; /** * @type {?} * @private */ NzFormControlComponent.prototype.validateChanges; /** * @type {?} * @private */ NzFormControlComponent.prototype.validateString; /** * @type {?} * @private */ NzFormControlComponent.prototype.status; /** * @type {?} * @private */ NzFormControlComponent.prototype.destroyed$; /** * @type {?} * @private */ NzFormControlComponent.prototype.localeId; /** * @type {?} * @private */ NzFormControlComponent.prototype.autoErrorTip; /** @type {?} */ NzFormControlComponent.prototype.validateControl; /** @type {?} */ NzFormControlComponent.prototype.iconType; /** @type {?} */ NzFormControlComponent.prototype.innerTip; /** @type {?} */ NzFormControlComponent.prototype.defaultValidateControl; /** @type {?} */ NzFormControlComponent.prototype.nzSuccessTip; /** @type {?} */ NzFormControlComponent.prototype.nzWarningTip; /** @type {?} */ NzFormControlComponent.prototype.nzErrorTip; /** @type {?} */ NzFormControlComponent.prototype.nzValidatingTip; /** @type {?} */ NzFormControlComponent.prototype.nzExtra; /** @type {?} */ NzFormControlComponent.prototype.nzAutoTips; /** @type {?} */ NzFormControlComponent.prototype.nzDisableAutoTips; /** * @type {?} * @private */ NzFormControlComponent.prototype.nzFormItemComponent; /** * @type {?} * @private */ NzFormControlComponent.prototype.cdr; /** * @type {?} * @private */ NzFormControlComponent.prototype.nzFormDirective; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvZm9ybS8iLCJzb3VyY2VzIjpbImZvcm0tY29udHJvbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLEtBQUssRUFHTCxRQUFRLEVBQ1IsU0FBUyxFQUVULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRCxPQUFPLEVBQTJCLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0lBRS9FLFdBQVcsR0FBRyxtQkFBQTtJQUNsQixLQUFLLEVBQUUsbUJBQW1CO0lBQzFCLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLE9BQU8sRUFBRSxtQkFBbUI7SUFDNUIsT0FBTyxFQUFFLHlCQUF5QjtDQUNuQyxFQUFTO0FBRVY7SUEwTEUsZ0NBQ0UsVUFBc0IsRUFDTSxtQkFBd0MsRUFDNUQsR0FBc0Is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aURBQTREIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Db250cm9sRGlyZWN0aXZlLCBGb3JtQ29udHJvbE5hbWUsIE5nQ29udHJvbCwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGhlbHBNb3Rpb24gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvYW5pbWF0aW9uJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcblxuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpJMThuU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3RhcnRXaXRoLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE56Rm9ybURpcmVjdGl2ZSB9IGZyb20gJy4vZm9ybS5kaXJlY3RpdmUnO1xuXG5pbXBvcnQgeyBOekZvcm1Db250cm9sU3RhdHVzVHlwZSwgTnpGb3JtSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLmNvbXBvbmVudCc7XG5cbmNvbnN0IGljb25UeXBlTWFwID0ge1xuICBlcnJvcjogJ2Nsb3NlLWNpcmNsZS1maWxsJyxcbiAgdmFsaWRhdGluZzogJ2xvYWRpbmcnLFxuICBzdWNjZXNzOiAnY2hlY2stY2lyY2xlLWZpbGwnLFxuICB3YXJuaW5nOiAnZXhjbGFtYXRpb24tY2lyY2xlLWZpbGwnXG59IGFzIGNvbnN0O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei1mb3JtLWNvbnRyb2wnLFxuICBleHBvcnRBczogJ256Rm9ybUNvbnRyb2wnLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgYW5pbWF0aW9uczogW2hlbHBNb3Rpb25dLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYW50LWZvcm0taXRlbS1jb250cm9sLWlucHV0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWZvcm0taXRlbS1jb250cm9sLWlucHV0LWNvbnRlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImFudC1mb3JtLWl0ZW0tY2hpbGRyZW4taWNvblwiPlxuICAgICAgICA8aSAqbmdJZj1cIm56SGFzRmVlZGJhY2sgJiYgaWNvblR5cGVcIiBuei1pY29uIFtuelR5cGVdPVwiaWNvblR5cGVcIj48L2k+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFudC1mb3JtLWl0ZW0tZXhwbGFpblwiICpuZ0lmPVwiaW5uZXJUaXBcIj5cbiAgICAgIDxkaXYgQGhlbHBNb3Rpb24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm56U3RyaW5nVGVtcGxhdGVPdXRsZXQ9XCJpbm5lclRpcDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHZhbGlkYXRlQ29udHJvbCB9XCI+e3sgaW5uZXJUaXAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhbnQtZm9ybS1pdGVtLWV4dHJhXCIgKm5nSWY9XCJuekV4dHJhXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuelN0cmluZ1RlbXBsYXRlT3V0bGV0PVwibnpFeHRyYVwiPnt7IG56RXh0cmEgfX08L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBOekZvcm1Db250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekhhc0ZlZWRiYWNrOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uelJlcXVpcmVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uek5vQ29sb246IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256RGlzYWJsZUF1dG9UaXBzOiBCb29sZWFuSW5wdXQ7XG5cbiAgcHJpdmF0ZSBfaGFzRmVlZGJhY2sgPSBmYWxzZTtcbiAgcHJpdmF0ZSB2YWxpZGF0ZUNoYW5nZXM6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSB2YWxpZGF0ZVN0cmluZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzOiBOekZvcm1Db250cm9sU3RhdHVzVHlwZSA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgbG9jYWxlSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBhdXRvRXJyb3JUaXA6IHN0cmluZztcblxuICBwcml2YXRlIGdldCBkaXNhYmxlQXV0b1RpcHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubnpEaXNhYmxlQXV0b1RpcHMgIT09ICdkZWZhdWx0JyA/IHRvQm9vbGVhbih0aGlzLm56RGlzYWJsZUF1dG9UaXBzKSA6IHRoaXMubnpGb3JtRGlyZWN0aXZlPy5uekRpc2FibGVBdXRvVGlwcztcbiAgfVxuXG4gIHZhbGlkYXRlQ29udHJvbDogRm9ybUNvbnRyb2wgfCBOZ01vZGVsIHwgbnVsbCA9IG51bGw7XG4gIGljb25UeXBlOiB0eXBlb2YgaWNvblR5cGVNYXBba2V5b2YgdHlwZW9mIGljb25UeXBlTWFwXSB8IG51bGwgPSBudWxsO1xuICBpbm5lclRpcDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IEZvcm1Db250cm9sIHwgTmdNb2RlbCB9PiB8IG51bGwgPSBudWxsO1xuXG4gIEBDb250ZW50Q2hpbGQoTmdDb250cm9sLCB7IHN0YXRpYzogZmFsc2UgfSkgZGVmYXVsdFZhbGlkYXRlQ29udHJvbDogRm9ybUNvbnRyb2xOYW1lIHwgRm9ybUNvbnRyb2xEaXJlY3RpdmU7XG4gIEBJbnB1dCgpIG56U3VjY2Vzc1RpcDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IEZvcm1Db250cm9sIHwgTmdNb2RlbCB9PjtcbiAgQElucHV0KCkgbnpXYXJuaW5nVGlwOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogRm9ybUNvbnRyb2wgfCBOZ01vZGVsIH0+O1xuICBASW5wdXQoKSBuekVycm9yVGlwOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogRm9ybUNvbnRyb2wgfCBOZ01vZGVsIH0+O1xuICBASW5wdXQoKSBuelZhbGlkYXRpbmdUaXA6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBGb3JtQ29udHJvbCB8IE5nTW9kZWwgfT47XG4gIEBJbnB1dCgpIG56RXh0cmE6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBuekF1dG9UaXBzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9O1xuICBASW5wdXQoKSBuekRpc2FibGVBdXRvVGlwczogYm9vbGVhbiB8ICdkZWZhdWx0JyA9ICdkZWZhdWx0JztcblxuICBASW5wdXQoKVxuICBzZXQgbnpIYXNGZWVkYmFjayh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hhc0ZlZWRiYWNrID0gdG9Cb29sZWFuKHZhbHVlKTtcbiAgICBpZiAodGhpcy5uekZvcm1JdGVtQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLm56Rm9ybUl0ZW1Db21wb25lbnQuc2V0SGFzRmVlZGJhY2sodGhpcy5faGFzRmVlZGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIGdldCBuekhhc0ZlZWRiYWNrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNGZWVkYmFjaztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBuelZhbGlkYXRlU3RhdHVzKHZhbHVlOiBzdHJpbmcgfCBGb3JtQ29udHJvbCB8IEZvcm1Db250cm9sTmFtZSB8IE5nTW9kZWwpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE5nTW9kZWwpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb250cm9sID0gdmFsdWU7XG4gICAgICB0aGlzLnZhbGlkYXRlU3RyaW5nID0gbnVsbDtcbiAgICAgIHRoaXMud2F0Y2hDb250cm9sKCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZvcm1Db250cm9sTmFtZSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbnRyb2wgPSB2YWx1ZS5jb250cm9sO1xuICAgICAgdGhpcy52YWxpZGF0ZVN0cmluZyA9IG51bGw7XG4gICAgICB0aGlzLndhdGNoQ29udHJvbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbGlkYXRlU3RyaW5nID0gdmFsdWU7XG4gICAgICB0aGlzLnZhbGlkYXRlQ29udHJvbCA9IG51bGw7XG4gICAgICB0aGlzLnNldFN0YXR1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hDb250cm9sKCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVDaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gICAgLyoqIG1pc3MgZGV0ZWN0IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEwODg3ICoqL1xuICAgIGlmICh0aGlzLnZhbGlkYXRlQ29udHJvbCAmJiB0aGlzLnZhbGlkYXRlQ29udHJvbC5zdGF0dXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ2hhbmdlcyA9IHRoaXMudmFsaWRhdGVDb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVBdXRvVGlwcykge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKCk7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVBdXRvVGlwKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhdHVzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdHVzID0gdGhpcy5nZXRDb250cm9sU3RhdHVzKHRoaXMudmFsaWRhdGVTdHJpbmcpO1xuICAgIHRoaXMuaWNvblR5cGUgPSB0aGlzLnN0YXR1cyA/IGljb25UeXBlTWFwW3RoaXMuc3RhdHVzXSA6IG51bGw7XG4gICAgdGhpcy5pbm5lclRpcCA9IHRoaXMuZ2V0SW5uZXJUaXAodGhpcy5zdGF0dXMpO1xuICAgIGlmICh0aGlzLm56Rm9ybUl0ZW1Db21wb25lbnQpIHtcbiAgICAgIHRoaXMubnpGb3JtSXRlbUNvbXBvbmVudC5zZXRXaXRoSGVscFZpYVRpcHMoISF0aGlzLmlubmVyVGlwKTtcbiAgICAgIHRoaXMubnpGb3JtSXRlbUNvbXBvbmVudC5zZXRTdGF0dXModGhpcy5zdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJvbFN0YXR1cyh2YWxpZGF0ZVN0cmluZzogc3RyaW5nIHwgbnVsbCk6IE56Rm9ybUNvbnRyb2xTdGF0dXNUeXBlIHtcbiAgICBsZXQgc3RhdHVzOiBOekZvcm1Db250cm9sU3RhdHVzVHlwZTtcblxuICAgIGlmICh2YWxpZGF0ZVN0cmluZyA9PT0gJ3dhcm5pbmcnIHx8IHRoaXMudmFsaWRhdGVDb250cm9sU3RhdHVzKCdJTlZBTElEJywgJ3dhcm5pbmcnKSkge1xuICAgICAgc3RhdHVzID0gJ3dhcm5pbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsaWRhdGVTdHJpbmcgPT09ICdlcnJvcicgfHwgdGhpcy52YWxpZGF0ZUNvbnRyb2xTdGF0dXMoJ0lOVkFMSUQnKSkge1xuICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICB9IGVsc2UgaWYgKHZhbGlkYXRlU3RyaW5nID09PSAndmFsaWRhdGluZycgfHwgdmFsaWRhdGVTdHJpbmcgPT09ICdwZW5kaW5nJyB8fCB0aGlzLnZhbGlkYXRlQ29udHJvbFN0YXR1cygnUEVORElORycpKSB7XG4gICAgICBzdGF0dXMgPSAndmFsaWRhdGluZyc7XG4gICAgfSBlbHNlIGlmICh2YWxpZGF0ZVN0cmluZyA9PT0gJ3N1Y2Nlc3MnIHx8IHRoaXMudmFsaWRhdGVDb250cm9sU3RhdHVzKCdWQUxJRCcpKSB7XG4gICAgICBzdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cyA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXR1cztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVDb250cm9sU3RhdHVzKHZhbGlkU3RhdHVzOiBzdHJpbmcsIHN0YXR1c1R5cGU/OiBOekZvcm1Db250cm9sU3RhdHVzVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52YWxpZGF0ZUNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBkaXJ0eSwgdG91Y2hlZCwgc3RhdHVzIH0gPSB0aGlzLnZhbGlkYXRlQ29udHJvbDtcbiAgICAgIHJldHVybiAoISFkaXJ0eSB8fCAhIXRvdWNoZWQpICYmIChzdGF0dXNUeXBlID8gdGhpcy52YWxpZGF0ZUNvbnRyb2wuaGFzRXJyb3Ioc3RhdHVzVHlwZSkgOiBzdGF0dXMgPT09IHZhbGlkU3RhdHVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldElubmVyVGlwKHN0YXR1czogTnpGb3JtQ29udHJvbFN0YXR1c1R5cGUpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogRm9ybUNvbnRyb2wgfCBOZ01vZGVsIH0+IHwgbnVsbCB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuICghdGhpcy5kaXNhYmxlQXV0b1RpcHMgJiYgdGhpcy5hdXRvRXJyb3JUaXApIHx8IHRoaXMubnpFcnJvclRpcDtcbiAgICAgIGNhc2UgJ3ZhbGlkYXRpbmcnOlxuICAgICAgICByZXR1cm4gdGhpcy5uelZhbGlkYXRpbmdUaXA7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMubnpTdWNjZXNzVGlwO1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybiB0aGlzLm56V2FybmluZ1RpcDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQXV0b1RpcCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUF1dG9FcnJvclRpcCgpO1xuICAgIHRoaXMuc2V0U3RhdHVzKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUF1dG9FcnJvclRpcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWxpZGF0ZUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMudmFsaWRhdGVDb250cm9sLmVycm9ycyB8fCB7fTtcbiAgICAgIGxldCBhdXRvRXJyb3JUaXAgPSAnJztcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGVycm9ycykge1xuICAgICAgICBpZiAoZXJyb3JzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBhdXRvRXJyb3JUaXAgPVxuICAgICAgICAgICAgZXJyb3JzW2tleV1bdGhpcy5sb2NhbGVJZF0gPz9cbiAgICAgICAgICAgIHRoaXMubnpBdXRvVGlwcz8uW3RoaXMubG9jYWxlSWRdPy5ba2V5XSA/P1xuICAgICAgICAgICAgdGhpcy5uekZvcm1EaXJlY3RpdmU/Lm56QXV0b1RpcHM/Llt0aGlzLmxvY2FsZUlkXT8uW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhYXV0b0Vycm9yVGlwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYXV0b0Vycm9yVGlwID0gYXV0b0Vycm9yVGlwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlQXV0b1RpcHMob2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxOelNhZmVBbnk+KTogdm9pZCB7XG4gICAgb2JzZXJ2YWJsZT8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlQXV0b1RpcHMpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBdXRvVGlwKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgcHJpdmF0ZSBuekZvcm1JdGVtQ29tcG9uZW50OiBOekZvcm1JdGVtQ29tcG9uZW50LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIGkxOG46IE56STE4blNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcml2YXRlIG56Rm9ybURpcmVjdGl2ZTogTnpGb3JtRGlyZWN0aXZlXG4gICkge1xuICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2FudC1mb3JtLWl0ZW0tY29udHJvbCcpO1xuXG4gICAgdGhpcy5zdWJzY3JpYmVBdXRvVGlwcyhpMThuLmxvY2FsZUNoYW5nZS5waXBlKHRhcChsb2NhbGUgPT4gKHRoaXMubG9jYWxlSWQgPSBsb2NhbGUubG9jYWxlKSkpKTtcbiAgICB0aGlzLnN1YnNjcmliZUF1dG9UaXBzKHRoaXMubnpGb3JtRGlyZWN0aXZlPy5nZXRJbnB1dE9ic2VydmFibGUoJ256QXV0b1RpcHMnKSk7XG4gICAgdGhpcy5zdWJzY3JpYmVBdXRvVGlwcyhcbiAgICAgIHRoaXMubnpGb3JtRGlyZWN0aXZlPy5nZXRJbnB1dE9ic2VydmFibGUoJ256RGlzYWJsZUF1dG9UaXBzJykucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5uekRpc2FibGVBdXRvVGlwcyA9PT0gJ2RlZmF1bHQnKSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGF0dXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlQ29udHJvbCAmJiAhdGhpcy52YWxpZGF0ZVN0cmluZykge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbGlkYXRlQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sRGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMubnpWYWxpZGF0ZVN0YXR1cyA9IHRoaXMuZGVmYXVsdFZhbGlkYXRlQ29udHJvbC5jb250cm9sO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5uelZhbGlkYXRlU3RhdHVzID0gdGhpcy5kZWZhdWx0VmFsaWRhdGVDb250cm9sO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19