ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
813 lines • 69 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: base.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* 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 { CdkConnectedOverlay } from '@angular/cdk/overlay';
import { ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, Input, Output, Renderer2, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
import { warnDeprecation } from 'ng-zorro-antd/core/logger';
import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation';
import { DEFAULT_TOOLTIP_POSITIONS, getPlacementName, POSITION_MAP } from 'ng-zorro-antd/core/overlay';
import { isNotNil, toBoolean } from 'ng-zorro-antd/core/util';
import { Subject } from 'rxjs';
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
/**
* @abstract
*/
export class NzTooltipBaseDirective {
/**
* @param {?} elementRef
* @param {?} hostView
* @param {?} resolver
* @param {?} renderer
* @param {?=} noAnimation
*/
constructor(elementRef, hostView, resolver, renderer, noAnimation) {
this.elementRef = elementRef;
this.hostView = hostView;
this.resolver = resolver;
this.renderer = renderer;
this.noAnimation = noAnimation;
this.specificVisibleChange = new EventEmitter();
/**
* @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0.
* Please use a more specific API. Like `nzTooltipTrigger`.
*/
this.nzTrigger = 'hover';
/**
* @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0.
* Please use a more specific API. Like `nzTooltipPlacement`.
*/
this.nzPlacement = 'top';
this.visible = false;
this.needProxyProperties = ['noAnimation'];
this.nzVisibleChange = new EventEmitter();
this.destroy$ = new Subject();
this.triggerDisposables = [];
}
/**
* This true title that would be used in other parts on this component.
* @protected
* @return {?}
*/
get title() {
return this.specificTitle || this.directiveNameTitle || this.nzTitle || null;
}
/**
* @protected
* @return {?}
*/
get content() {
return this.specificContent || this.directiveNameContent || this.nzContent || null;
}
/**
* @protected
* @return {?}
*/
get placement() {
return this.specificPlacement || this.nzPlacement;
}
/**
* @protected
* @return {?}
*/
get trigger() {
// NzTooltipTrigger can be null.
return typeof this.specificTrigger !== 'undefined' ? this.specificTrigger : this.nzTrigger;
}
/**
* @protected
* @return {?}
*/
get isVisible() {
return this.specificVisible || this.nzVisible || false;
}
/**
* @protected
* @return {?}
*/
get mouseEnterDelay() {
return this.specificMouseEnterDelay || this.nzMouseEnterDelay || 0.15;
}
/**
* @protected
* @return {?}
*/
get mouseLeaveDelay() {
return this.specificMouseLeaveDelay || this.nzMouseLeaveDelay || 0.1;
}
/**
* @protected
* @return {?}
*/
get overlayClassName() {
return this.specificOverlayClassName || this.nzOverlayClassName || null;
}
/**
* @protected
* @return {?}
*/
get overlayStyle() {
return this.specificOverlayStyle || this.nzOverlayStyle || null;
}
/**
* @param {?} isNeeded
* @param {?} property
* @param {?} newProperty
* @param {?=} comp
* @param {?=} shared
* @return {?}
*/
warnDeprecationIfNeeded(isNeeded, property, newProperty, comp = 'nz-tooltip', shared = true) {
if (isNeeded) {
/** @type {?} */
let message = `'${property}' of '${comp}' is deprecated and will be removed in 10.0.0.
Please use '${newProperty}' instead.`;
if (shared) {
message = `${message} The same with 'nz-popover' and 'nz-popconfirm'.`;
}
warnDeprecation(message);
}
}
/**
* @param {?} changes
* @return {?}
*/
warnDeprecationByChanges(changes) {
// warn deprecated things when specific property is not given
this.warnDeprecationIfNeeded(changes.nzTitle && !this.specificTitle && !this.directiveNameTitle, 'nzTitle', 'nzTooltipTitle');
this.warnDeprecationIfNeeded(changes.nzContent && !this.specificContent, 'nzContent', 'nzPopoverContent', 'nz-popover', false);
this.warnDeprecationIfNeeded(changes.nzPlacement && !this.specificPlacement, 'nzPlacement', 'nzTooltipPlacement');
this.warnDeprecationIfNeeded(changes.nzTrigger && !this.specificTrigger, 'nzTrigger', 'nzTooltipTrigger');
this.warnDeprecationIfNeeded(changes.nzVisible && !this.specificVisible, 'nzVisible', 'nzTooltipVisible');
this.warnDeprecationIfNeeded(changes.nzMouseEnterDelay && !this.specificMouseEnterDelay, 'nzMouseEnterDelay', 'nzTooltipMouseEnterDelay');
this.warnDeprecationIfNeeded(changes.nzMouseLeaveDelay && !this.specificMouseLeaveDelay, 'nzMouseLeaveDelay', 'nzTooltipMouseLeaveDelay');
this.warnDeprecationIfNeeded(changes.nzOverlayClassName && !this.specificOverlayClassName, 'nzOverlayClassName', 'nzTooltipClassName');
this.warnDeprecationIfNeeded(changes.nzOverlayStyle && !this.specificOverlayStyle, 'nzOverlayStyle', 'nzTooltipOverlayStyle');
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
const { nzTrigger, specificTrigger } = changes;
/** @type {?} */
const trigger = specificTrigger || nzTrigger;
if (trigger && !trigger.isFirstChange()) {
this.registerTriggers();
}
if (this.component) {
this.updateChangedProperties(changes);
}
this.warnDeprecationByChanges(changes);
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.createComponent();
this.registerTriggers();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
// Clear toggling timer. Issue #3875 #4317 #4386
this.clearTogglingTimer();
this.removeTriggerListeners();
}
/**
* @return {?}
*/
show() {
var _a;
(_a = this.component) === null || _a === void 0 ? void 0 : _a.show();
}
/**
* @return {?}
*/
hide() {
var _a;
(_a = this.component) === null || _a === void 0 ? void 0 : _a.hide();
}
/**
* Force the component to update its position.
* @return {?}
*/
updatePosition() {
if (this.component) {
this.component.updatePosition();
}
}
/**
* Create a dynamic tooltip component. This method can be override.
* @protected
* @return {?}
*/
createComponent() {
/** @type {?} */
const componentRef = this.hostView.createComponent(this.componentFactory);
this.component = componentRef.instance;
// Remove the component's DOM because it should be in the overlay container.
this.renderer.removeChild(this.renderer.parentNode(this.elementRef.nativeElement), componentRef.location.nativeElement);
this.component.setOverlayOrigin({ elementRef: this.specificOrigin || this.elementRef });
this.updateChangedProperties(this.needProxyProperties);
this.component.nzVisibleChange.pipe(distinctUntilChanged(), takeUntil(this.destroy$)).subscribe((/**
* @param {?} visible
* @return {?}
*/
(visible) => {
this.visible = visible;
this.specificVisibleChange.emit(visible);
this.nzVisibleChange.emit(visible);
}));
}
/**
* @protected
* @return {?}
*/
registerTriggers() {
// When the method gets invoked, all properties has been synced to the dynamic component.
// After removing the old API, we can just check the directive's own `nzTrigger`.
/** @type {?} */
const el = this.elementRef.nativeElement;
/** @type {?} */
const trigger = this.trigger;
this.removeTriggerListeners();
if (trigger === 'hover') {
/** @type {?} */
let overlayElement;
this.triggerDisposables.push(this.renderer.listen(el, 'mouseenter', (/**
* @return {?}
*/
() => {
this.delayEnterLeave(true, true, this.mouseEnterDelay);
})));
this.triggerDisposables.push(this.renderer.listen(el, 'mouseleave', (/**
* @return {?}
*/
() => {
var _a;
this.delayEnterLeave(true, false, this.mouseLeaveDelay);
if (((_a = this.component) === null || _a === void 0 ? void 0 : _a.overlay.overlayRef) && !overlayElement) {
overlayElement = this.component.overlay.overlayRef.overlayElement;
this.triggerDisposables.push(this.renderer.listen(overlayElement, 'mouseenter', (/**
* @return {?}
*/
() => {
this.delayEnterLeave(false, true);
})));
this.triggerDisposables.push(this.renderer.listen(overlayElement, 'mouseleave', (/**
* @return {?}
*/
() => {
this.delayEnterLeave(false, false);
})));
}
})));
}
else if (trigger === 'focus') {
this.triggerDisposables.push(this.renderer.listen(el, 'focus', (/**
* @return {?}
*/
() => this.show())));
this.triggerDisposables.push(this.renderer.listen(el, 'blur', (/**
* @return {?}
*/
() => this.hide())));
}
else if (trigger === 'click') {
this.triggerDisposables.push(this.renderer.listen(el, 'click', (/**
* @param {?} e
* @return {?}
*/
e => {
e.preventDefault();
this.show();
})));
} // Else do nothing because user wants to control the visibility programmatically.
}
/**
* @param {?} changes
* @return {?}
*/
updatePropertiesByChanges(changes) {
/** @type {?} */
const properties = {
specificTitle: ['nzTitle', this.title],
directiveNameTitle: ['nzTitle', this.title],
nzTitle: ['nzTitle', this.title],
specificContent: ['nzContent', this.content],
directiveNameContent: ['nzContent', this.content],
nzContent: ['nzContent', this.content],
specificTrigger: ['nzTrigger', this.trigger],
nzTrigger: ['nzTrigger', this.trigger],
specificPlacement: ['nzPlacement', this.placement],
nzPlacement: ['nzPlacement', this.placement],
specificVisible: ['nzVisible', this.isVisible],
nzVisible: ['nzVisible', this.isVisible],
specificMouseEnterDelay: ['nzMouseEnterDelay', this.mouseEnterDelay],
nzMouseEnterDelay: ['nzMouseEnterDelay', this.mouseEnterDelay],
specificMouseLeaveDelay: ['nzMouseLeaveDelay', this.mouseLeaveDelay],
nzMouseLeaveDelay: ['nzMouseLeaveDelay', this.mouseLeaveDelay],
specificOverlayClassName: ['nzOverlayClassName', this.overlayClassName],
nzOverlayClassName: ['nzOverlayClassName', this.overlayClassName],
specificOverlayStyle: ['nzOverlayStyle', this.overlayStyle],
nzOverlayStyle: ['nzOverlayStyle', this.overlayStyle]
};
/** @type {?} */
const keys = Object.keys(changes);
keys.forEach((/**
* @param {?} property
* @return {?}
*/
(property) => {
// @ts-ignore
if (properties[property]) {
// @ts-ignore
const [name, value] = properties[property];
this.updateComponentValue(name, value);
}
}));
}
/**
* @return {?}
*/
updatePropertiesByArray() {
this.updateComponentValue('nzTitle', this.title);
this.updateComponentValue('nzContent', this.content);
this.updateComponentValue('nzPlacement', this.placement);
this.updateComponentValue('nzTrigger', this.trigger);
this.updateComponentValue('nzVisible', this.isVisible);
this.updateComponentValue('nzMouseEnterDelay', this.mouseEnterDelay);
this.updateComponentValue('nzMouseLeaveDelay', this.mouseLeaveDelay);
this.updateComponentValue('nzOverlayClassName', this.overlayClassName);
this.updateComponentValue('nzOverlayStyle', this.overlayStyle);
}
/**
* Sync changed properties to the component and trigger change detection in that component.
* @protected
* @param {?} propertiesOrChanges
* @return {?}
*/
updateChangedProperties(propertiesOrChanges) {
var _a;
/** @type {?} */
const isArray = Array.isArray(propertiesOrChanges);
/** @type {?} */
const keys = isArray ? ((/** @type {?} */ (propertiesOrChanges))) : Object.keys(propertiesOrChanges);
keys.forEach((/**
* @param {?} property
* @return {?}
*/
(property) => {
if (this.needProxyProperties.indexOf(property) !== -1) {
// @ts-ignore
this.updateComponentValue(property, this[property]);
}
}));
if (isArray) {
this.updatePropertiesByArray();
}
else {
this.updatePropertiesByChanges((/** @type {?} */ (propertiesOrChanges)));
}
(_a = this.component) === null || _a === void 0 ? void 0 : _a.updateByDirective();
}
/**
* @private
* @param {?} key
* @param {?} value
* @return {?}
*/
updateComponentValue(key, value) {
if (typeof value !== 'undefined') {
// @ts-ignore
this.component[key] = value;
}
}
/**
* @private
* @param {?} isOrigin
* @param {?} isEnter
* @param {?=} delay
* @return {?}
*/
delayEnterLeave(isOrigin, isEnter, delay = -1) {
if (this.delayTimer) {
this.clearTogglingTimer();
}
else if (delay > 0) {
this.delayTimer = setTimeout((/**
* @return {?}
*/
() => {
this.delayTimer = undefined;
isEnter ? this.show() : this.hide();
}), delay * 1000);
}
else {
// `isOrigin` is used due to the tooltip will not hide immediately
// (may caused by the fade-out animation).
isEnter && isOrigin ? this.show() : this.hide();
}
}
/**
* @private
* @return {?}
*/
removeTriggerListeners() {
this.triggerDisposables.forEach((/**
* @param {?} dispose
* @return {?}
*/
dispose => dispose()));
this.triggerDisposables.length = 0;
}
/**
* @private
* @return {?}
*/
clearTogglingTimer() {
if (this.delayTimer) {
clearTimeout(this.delayTimer);
this.delayTimer = undefined;
}
}
}
NzTooltipBaseDirective.decorators = [
{ type: Directive }
];
/** @nocollapse */
NzTooltipBaseDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: ComponentFactoryResolver },
{ type: Renderer2 },
{ type: NzNoAnimationDirective }
];
NzTooltipBaseDirective.propDecorators = {
nzTitle: [{ type: Input }],
nzContent: [{ type: Input }],
nzTrigger: [{ type: Input }],
nzPlacement: [{ type: Input }],
nzMouseEnterDelay: [{ type: Input }],
nzMouseLeaveDelay: [{ type: Input }],
nzOverlayClassName: [{ type: Input }],
nzOverlayStyle: [{ type: Input }],
nzVisible: [{ type: Input }],
nzVisibleChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
NzTooltipBaseDirective.prototype.directiveNameTitle;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificTitle;
/** @type {?} */
NzTooltipBaseDirective.prototype.directiveNameContent;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificContent;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificTrigger;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificPlacement;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificOrigin;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificVisible;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificMouseEnterDelay;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificMouseLeaveDelay;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificOverlayClassName;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificOverlayStyle;
/** @type {?} */
NzTooltipBaseDirective.prototype.specificVisibleChange;
/**
* @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0.
* Please use a more specific API. Like `nzTooltipTitle`.
* @type {?}
*/
NzTooltipBaseDirective.prototype.nzTitle;
/**
* @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0.
* Please use a more specific API. Like `nzPopoverContent`.
* @type {?}
*/
NzTooltipBaseDirective.prototype.nzContent;
/**
* @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0.
* Please use a more specific API. Like `nzTooltipTrigger`.
* @type {?}
*/
NzTooltipBaseDirective.prototype.nzTrigger;
/**
* @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0.
* Please use a more specific API. Like `nzTooltipPlacement`.
* @type {?}
*/
NzTooltipBaseDirective.prototype.nzPlacement;
/** @type {?} */
NzTooltipBaseDirective.prototype.nzMouseEnterDelay;
/** @type {?} */
NzTooltipBaseDirective.prototype.nzMouseLeaveDelay;
/** @type {?} */
NzTooltipBaseDirective.prototype.nzOverlayClassName;
/** @type {?} */
NzTooltipBaseDirective.prototype.nzOverlayStyle;
/** @type {?} */
NzTooltipBaseDirective.prototype.nzVisible;
/**
* For create tooltip dynamically. This should be override for each different component.
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.componentFactory;
/** @type {?} */
NzTooltipBaseDirective.prototype.visible;
/**
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.needProxyProperties;
/** @type {?} */
NzTooltipBaseDirective.prototype.nzVisibleChange;
/** @type {?} */
NzTooltipBaseDirective.prototype.component;
/**
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.destroy$;
/**
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.triggerDisposables;
/**
* @type {?}
* @private
*/
NzTooltipBaseDirective.prototype.delayTimer;
/** @type {?} */
NzTooltipBaseDirective.prototype.elementRef;
/**
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.hostView;
/**
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.resolver;
/**
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.renderer;
/**
* @type {?}
* @protected
*/
NzTooltipBaseDirective.prototype.noAnimation;
}
/**
* @abstract
*/
// tslint:disable-next-line:directive-class-suffix
export class NzTooltipBaseComponent {
/**
* @param {?} cdr
* @param {?=} noAnimation
*/
constructor(cdr, noAnimation) {
this.cdr = cdr;
this.noAnimation = noAnimation;
this.nzVisibleChange = new Subject();
this.nzTitle = null;
this.nzContent = null;
this.nzOverlayStyle = {};
this._visible = false;
this._trigger = 'hover';
this.preferredPlacement = 'top';
this._classMap = {};
this._hasBackdrop = false;
this._prefix = 'ant-tooltip-placement';
this._positions = [...DEFAULT_TOOLTIP_POSITIONS];
}
/**
* @param {?} value
* @return {?}
*/
set nzVisible(value) {
/** @type {?} */
const visible = toBoolean(value);
if (this._visible !== visible) {
this._visible = visible;
this.nzVisibleChange.next(visible);
}
}
/**
* @return {?}
*/
get nzVisible() {
return this._visible;
}
/**
* @param {?} value
* @return {?}
*/
set nzTrigger(value) {
this._trigger = value;
this._hasBackdrop = this._trigger === 'click';
}
/**
* @return {?}
*/
get nzTrigger() {
return this._trigger;
}
/**
* @param {?} value
* @return {?}
*/
set nzPlacement(value) {
if (value !== this.preferredPlacement) {
this.preferredPlacement = value;
this._positions = [POSITION_MAP[this.nzPlacement], ...this._positions];
}
}
/**
* @return {?}
*/
get nzPlacement() {
return this.preferredPlacement;
}
/**
* @return {?}
*/
ngOnDestroy() {
this.nzVisibleChange.complete();
}
/**
* @return {?}
*/
show() {
if (this.nzVisible) {
return;
}
if (!this.isEmpty()) {
this.nzVisible = true;
this.nzVisibleChange.next(true);
this.cdr.detectChanges();
}
}
/**
* @return {?}
*/
hide() {
if (!this.nzVisible) {
return;
}
this.nzVisible = false;
this.nzVisibleChange.next(false);
this.cdr.detectChanges();
}
/**
* @return {?}
*/
updateByDirective() {
this.setClassMap();
this.cdr.detectChanges();
Promise.resolve().then((/**
* @return {?}
*/
() => {
this.updatePosition();
this.updateVisibilityByTitle();
}));
}
/**
* Force the component to update its position.
* @return {?}
*/
updatePosition() {
if (this.origin && this.overlay && this.overlay.overlayRef) {
this.overlay.overlayRef.updatePosition();
}
}
/**
* @param {?} position
* @return {?}
*/
onPositionChange(position) {
this.preferredPlacement = (/** @type {?} */ (getPlacementName(position)));
this.setClassMap();
this.cdr.detectChanges();
}
/**
* @return {?}
*/
setClassMap() {
this._classMap = {
[this.nzOverlayClassName]: true,
[`${this._prefix}-${this.preferredPlacement}`]: true
};
}
/**
* @param {?} origin
* @return {?}
*/
setOverlayOrigin(origin) {
this.origin = origin;
this.cdr.markForCheck();
}
/**
* Hide the component while the content is empty.
* @private
* @return {?}
*/
updateVisibilityByTitle() {
if (this.isEmpty()) {
this.hide();
}
}
}
NzTooltipBaseComponent.decorators = [
{ type: Directive }
];
/** @nocollapse */
NzTooltipBaseComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: NzNoAnimationDirective }
];
NzTooltipBaseComponent.propDecorators = {
overlay: [{ type: ViewChild, args: ['overlay', { static: false },] }]
};
if (false) {
/** @type {?} */
NzTooltipBaseComponent.ngAcceptInputType_nzVisible;
/** @type {?} */
NzTooltipBaseComponent.prototype.overlay;
/** @type {?} */
NzTooltipBaseComponent.prototype.nzVisibleChange;
/** @type {?} */
NzTooltipBaseComponent.prototype.nzTitle;
/** @type {?} */
NzTooltipBaseComponent.prototype.nzContent;
/** @type {?} */
NzTooltipBaseComponent.prototype.nzOverlayClassName;
/** @type {?} */
NzTooltipBaseComponent.prototype.nzOverlayStyle;
/** @type {?} */
NzTooltipBaseComponent.prototype.nzMouseEnterDelay;
/** @type {?} */
NzTooltipBaseComponent.prototype.nzMouseLeaveDelay;
/** @type {?} */
NzTooltipBaseComponent.prototype._visible;
/**
* @type {?}
* @protected
*/
NzTooltipBaseComponent.prototype._trigger;
/** @type {?} */
NzTooltipBaseComponent.prototype.origin;
/** @type {?} */
NzTooltipBaseComponent.prototype.preferredPlacement;
/** @type {?} */
NzTooltipBaseComponent.prototype._classMap;
/** @type {?} */
NzTooltipBaseComponent.prototype._hasBackdrop;
/** @type {?} */
NzTooltipBaseComponent.prototype._prefix;
/** @type {?} */
NzTooltipBaseComponent.prototype._positions;
/** @type {?} */
NzTooltipBaseComponent.prototype.cdr;
/** @type {?} */
NzTooltipBaseComponent.prototype.noAnimation;
/**
* Empty component cannot be opened.
* @abstract
* @protected
* @return {?}
*/
NzTooltipBaseComponent.prototype.isEmpty = function () { };
}
/**
* @param {?} value
* @return {?}
*/
export function isTooltipEmpty(value) {
return value instanceof TemplateRef ? false : value === '' || !isNotNil(value);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvdG9vbHRpcC8iLCJzb3VyY2VzIjpbImJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBS0EsT0FBTyxFQUFFLG1CQUFtQixFQUE0RSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JJLE9BQU8sRUFFTCxpQkFBaUIsRUFFakIsd0JBQXdCLEVBQ3hCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkcsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUtqRSxNQUFNLE9BQWdCLHNCQUFzQjs7Ozs7Ozs7SUFxRzFDLFlBQ1MsVUFBc0IsRUFDbkIsUUFBMEIsRUFDMUIsUUFBa0MsRUFDbEMsUUFBbUIsRUFDbkIsV0FBb0M7UUFKdkMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNuQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUMxQixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQTdGaEQsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQzs7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QUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7OztZQW5JRixTQUFTOzs7O1lBdFlSLGlCQUFpQjtZQWlCVixzQkFBc0I7OztzQkEwWDVCLFNBQVMsU0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzs7O0lBRnZDLG1EQUFpRDs7SUFFakQseUNBQXVFOztJQUV2RSxpREFBeUM7O0lBQ3pDLHlDQUFnQzs7SUFDaEMsMkNBQWtDOztJQUNsQyxvREFBNEI7O0lBQzVCLGdEQUFzQzs7SUFDdEMsbURBQTJCOztJQUMzQixtREFBMkI7O0lBYzNCLDBDQUFpQjs7Ozs7SUFXakIsMENBQStDOztJQWEvQyx3Q0FBMEI7O0lBQzFCLG9EQUEyQjs7SUFFM0IsMkNBQWlDOztJQUNqQyw4Q0FBcUI7O0lBQ3JCLHlDQUFrQzs7SUFDbEMsNENBQXNFOztJQUUxRCxxQ0FBNkI7O0lBQUUsNkNBQTJDOzs7Ozs7O0lBNkV0RiwyREFBc0M7Ozs7OztBQUd4QyxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQXdDO0lBQ3JFLE9BQU8sS0FBSyxZQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDZGtDb25uZWN0ZWRPdmVybGF5LCBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsIENvbm5lY3Rpb25Qb3NpdGlvblBhaXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50RmFjdG9yeSxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHdhcm5EZXByZWNhdGlvbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9sb2dnZXInO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MVElQX1BPU0lUSU9OUywgZ2V0UGxhY2VtZW50TmFtZSwgUE9TSVRJT05fTUFQIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL292ZXJsYXknO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOZ0NsYXNzSW50ZXJmYWNlLCBOZ1N0eWxlSW50ZXJmYWNlLCBOelNhZmVBbnksIE56VFNUeXBlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGlzTm90TmlsLCB0b0Jvb2xlYW4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgdHlwZSBOelRvb2x0aXBUcmlnZ2VyID0gJ2NsaWNrJyB8ICdmb2N1cycgfCAnaG92ZXInIHwgbnVsbDtcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTnpUb29sdGlwQmFzZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgZGlyZWN0aXZlTmFtZVRpdGxlPzogTnpUU1R5cGUgfCBudWxsO1xuICBzcGVjaWZpY1RpdGxlPzogTnpUU1R5cGUgfCBudWxsO1xuICBkaXJlY3RpdmVOYW1lQ29udGVudD86IE56VFNUeXBlIHwgbnVsbDtcbiAgc3BlY2lmaWNDb250ZW50PzogTnpUU1R5cGUgfCBudWxsO1xuICBzcGVjaWZpY1RyaWdnZXI/OiBOelRvb2x0aXBUcmlnZ2VyO1xuICBzcGVjaWZpY1BsYWNlbWVudD86IHN0cmluZztcbiAgc3BlY2lmaWNPcmlnaW4/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgc3BlY2lmaWNWaXNpYmxlPzogYm9vbGVhbjtcbiAgc3BlY2lmaWNNb3VzZUVudGVyRGVsYXk/OiBudW1iZXI7XG4gIHNwZWNpZmljTW91c2VMZWF2ZURlbGF5PzogbnVtYmVyO1xuICBzcGVjaWZpY092ZXJsYXlDbGFzc05hbWU/OiBzdHJpbmc7XG4gIHNwZWNpZmljT3ZlcmxheVN0eWxlPzogTmdTdHlsZUludGVyZmFjZTtcbiAgc3BlY2lmaWNWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgMTAuMC4wLiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuICAgKiBQbGVhc2UgdXNlIGEgbW9yZSBzcGVjaWZpYyBBUEkuIExpa2UgYG56VG9vbHRpcFRpdGxlYC5cbiAgICovXG4gIEBJbnB1dCgpIG56VGl0bGU/OiBOelRTVHlwZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIDEwLjAuMC4gVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBnb2luZyB0byBiZSByZW1vdmVkIGluIDEwLjAuMC5cbiAgICogUGxlYXNlIHVzZSBhIG1vcmUgc3BlY2lmaWMgQVBJLiBMaWtlIGBuelBvcG92ZXJDb250ZW50YC5cbiAgICovXG4gIEBJbnB1dCgpIG56Q29udGVudD86IE56VFNUeXBlIHwgbnVsbDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgMTAuMC4wLiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuICAgKiBQbGVhc2UgdXNlIGEgbW9yZSBzcGVjaWZpYyBBUEkuIExpa2UgYG56VG9vbHRpcFRyaWdnZXJgLlxuICAgKi9cbiAgQElucHV0KCkgbnpUcmlnZ2VyOiBOelRvb2x0aXBUcmlnZ2VyID0gJ2hvdmVyJztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgMTAuMC4wLiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuICAgKiBQbGVhc2UgdXNlIGEgbW9yZSBzcGVjaWZpYyBBUEkuIExpa2UgYG56VG9vbHRpcFBsYWNlbWVudGAuXG4gICAqL1xuICBASW5wdXQoKSBuelBsYWNlbWVudDogc3RyaW5nID0gJ3RvcCc7XG5cbiAgQElucHV0KCkgbnpNb3VzZUVudGVyRGVsYXk/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG56TW91c2VMZWF2ZURlbGF5PzogbnVtYmVyO1xuICBASW5wdXQoKSBuek92ZXJsYXlDbGFzc05hbWU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56T3ZlcmxheVN0eWxlPzogTmdTdHlsZUludGVyZmFjZTtcbiAgQElucHV0KCkgbnpWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9yIGNyZWF0ZSB0b29sdGlwIGR5bmFtaWNhbGx5LiBUaGlzIHNob3VsZCBiZSBvdmVycmlkZSBmb3IgZWFjaCBkaWZmZXJlbnQgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXBvbmVudEZhY3RvcnkhOiBDb21wb25lbnRGYWN0b3J5PE56VG9vbHRpcEJhc2VDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBUaGlzIHRydWUgdGl0bGUgdGhhdCB3b3VsZCBiZSB1c2VkIGluIG90aGVyIHBhcnRzIG9uIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCB0aXRsZSgpOiBOelRTVHlwZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNwZWNpZmljVGl0bGUgfHwgdGhpcy5kaXJlY3RpdmVOYW1lVGl0bGUgfHwgdGhpcy5uelRpdGxlIHx8IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNvbnRlbnQoKTogTnpUU1R5cGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zcGVjaWZpY0NvbnRlbnQgfHwgdGhpcy5kaXJlY3RpdmVOYW1lQ29udGVudCB8fCB0aGlzLm56Q29udGVudCB8fCBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBwbGFjZW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zcGVjaWZpY1BsYWNlbWVudCB8fCB0aGlzLm56UGxhY2VtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmlnZ2VyKCk6IE56VG9vbHRpcFRyaWdnZXIge1xuICAgIC8vIE56VG9vbHRpcFRyaWdnZXIgY2FuIGJlIG51bGwuXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnNwZWNpZmljVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLnNwZWNpZmljVHJpZ2dlciA6IHRoaXMubnpUcmlnZ2VyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3BlY2lmaWNWaXNpYmxlIHx8IHRoaXMubnpWaXNpYmxlIHx8IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVj