ngx-amap
Version:
[][npm-badge-url] [][npm-badge-url] [][ci-url]
499 lines • 37.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: components/amap-text/amap-text.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ContentChildren, QueryList, ElementRef, NgZone, } from '@angular/core';
import { zip } from 'rxjs';
import { AmapTextService } from './amap-text.service';
import { LoggerService } from '../../shared/logger/logger.service';
import { AMapOverlay, OverlayOptions } from '../../base/amap-overlay';
import { EventBinderService } from '../../shared/event-binder.service';
import { getOptions, ChangeFilter } from '../../utils';
import { PixelService } from '../../shared/pixel.service';
import { IconService } from '../../shared/icon.service';
import { AmapInfoWindowComponent } from '../amap-info-window/amap-info-window.component';
import { AMapService } from '../../shared/amap.service';
/** @type {?} */
const TAG = 'amap-text';
/** @type {?} */
const ALL_OPTIONS = [
...OverlayOptions,
'text',
'position',
'anchor',
'offset',
'topWhenClick',
'raiseOnDrag',
'visible',
'zIndex',
'angle',
'autoRotation',
'animation',
'shadow',
'title',
'style',
];
export class AmapTextComponent extends AMapOverlay {
/**
* @param {?} os
* @param {?} binder
* @param {?} amaps
* @param {?} el
* @param {?} pixels
* @param {?} icons
* @param {?} logger
* @param {?} ngZone
*/
constructor(os, binder, amaps, el, pixels, icons, logger, ngZone) {
super(os, binder);
this.os = os;
this.binder = binder;
this.amaps = amaps;
this.el = el;
this.pixels = pixels;
this.icons = icons;
this.logger = logger;
this.ngZone = ngZone;
/**
* 额外: 是否隐藏
*/
this.hidden = false;
/**
* 额外: 是否包含在点聚合中
*/
this.inCluster = false;
/**
* 额外: 点击时是否显示信息窗体
*/
this.openInfoWindow = true;
// ---- Events ----
this.naReady = new EventEmitter();
// amap info window:
this.infoWindowComponent = new QueryList();
this.inited = false;
/** @type {?} */
const target = this.os.get();
this.naMouseOut = this.binder.bindEvent(target, 'mouseout');
this.naDragStart = this.binder.bindEvent(target, 'dragstart');
this.naDragging = this.binder.bindEvent(target, 'dragging');
this.naDragEnd = this.binder.bindEvent(target, 'dragend');
this.naMoving = this.binder.bindEvent(target, 'moving');
this.naMoveEnd = this.binder.bindEvent(target, 'moveend');
this.naMoveAlong = this.binder.bindEvent(target, 'movealong');
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
this.os.destroy();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
const filter = ChangeFilter.of(changes);
/** @type {?} */
const marker = this.get();
if (!this.inited) {
// do not draw text marker when no poistion defined.
if (!this.position) {
return;
}
this.amaps.get().subscribe((/**
* @return {?}
*/
() => {
this.logger.d(TAG, 'initializing ...');
// bind info window events:
this.subscription = this.binder.bindEvent(marker, 'click').subscribe((/**
* @return {?}
*/
() => {
if (this.openInfoWindow) {
this.infoWindowComponent.forEach((/**
* @param {?} w
* @return {?}
*/
w => w.open()));
}
}));
/** @type {?} */
const el = this.el.nativeElement.querySelector('.amap-text-content');
this.text = this.text ? this.text : el.innerText;
/** @type {?} */
const options = getOptions(this, ALL_OPTIONS);
if (this.shadow) {
options.shadow = this.icons.create(this.shadow);
}
if (this.offset) {
options.offset = this.pixels.create(this.offset);
}
this.logger.d(TAG, 'options:', options);
this.os.create(options).subscribe((/**
* @param {?} m
* @return {?}
*/
m => {
this.ngZone.run((/**
* @return {?}
*/
() => this.naReady.emit(m)));
this.logger.d(TAG, 'marker is ready.');
}));
this.inited = true;
this.updateInfoWindow();
this.updateInfoWindowPosition();
}));
}
else {
zip(filter.has('shadow'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setShadow(this.icons.create(v))));
zip(filter.has('offset'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setOffset(this.pixels.create(v))));
zip(filter.has('title'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setTitle(v)));
zip(filter.has('content'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setContent(v)));
zip(filter.has('extData'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setExtData(v)));
zip(filter.has('clickable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setClickable(!!v)));
zip(filter.has('draggable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setDraggable(!!v)));
zip(filter.has('visible'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => (v ? m.show() : m.hide())));
zip(filter.has('cursor'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setCursor(v)));
zip(filter.has('animation'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setAnimation(v)));
zip(filter.has('angle'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setAngle(v)));
zip(filter.has('zIndex'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setzIndex(v)));
zip(filter.notEmpty('position'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setPosition(v)));
zip(filter.notEmpty('style'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setStyle(v)));
}
zip(filter.has('isTop'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setTop(!!v)));
zip(filter.has('hidden'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => (v ? m.hide() : m.show())));
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.updateInfoWindow();
this.infoWindowComponent.changes.subscribe((/**
* @return {?}
*/
() => this.updateInfoWindow()));
}
/**
* @private
* @return {?}
*/
updateInfoWindow() {
if (this.infoWindowComponent && this.inited) {
if (this.infoWindowComponent.length > 1) {
this.logger.e(TAG, 'Expected no more than 1 info window.');
return;
}
/** @type {?} */
const marker = this.os.get();
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
component => {
component.hostMarker = marker;
}));
}
}
/**
* @private
* @return {?}
*/
updateInfoWindowPosition() {
if (this.infoWindowComponent && this.inited) {
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
component => {
component.toggleOpen();
}));
}
}
/**
* 获取已创建的 AMap.Text 对象
* @return {?}
*/
get() {
return this.os.get();
}
}
AmapTextComponent.decorators = [
{ type: Component, args: [{
selector: 'amap-text',
exportAs: 'text',
template: "<div class='amap-text-inner'></div>\n<div class='amap-text-content'>\n <ng-content></ng-content>\n</div>",
providers: [AmapTextService]
}] }
];
/** @nocollapse */
AmapTextComponent.ctorParameters = () => [
{ type: AmapTextService },
{ type: EventBinderService },
{ type: AMapService },
{ type: ElementRef },
{ type: PixelService },
{ type: IconService },
{ type: LoggerService },
{ type: NgZone }
];
AmapTextComponent.propDecorators = {
text: [{ type: Input }],
position: [{ type: Input }],
anchor: [{ type: Input }],
offset: [{ type: Input }],
topWhenClick: [{ type: Input }],
raiseOnDrag: [{ type: Input }],
visible: [{ type: Input }],
zIndex: [{ type: Input }],
angle: [{ type: Input }],
autoRotation: [{ type: Input }],
animation: [{ type: Input }],
shadow: [{ type: Input }],
title: [{ type: Input }],
style: [{ type: Input }],
isTop: [{ type: Input }],
hidden: [{ type: Input }],
inCluster: [{ type: Input }],
openInfoWindow: [{ type: Input }],
naReady: [{ type: Output }],
naMouseOut: [{ type: Output }],
naDragStart: [{ type: Output }],
naDragging: [{ type: Output }],
naDragEnd: [{ type: Output }],
naMoving: [{ type: Output }],
naMoveEnd: [{ type: Output }],
naMoveAlong: [{ type: Output }],
infoWindowComponent: [{ type: ContentChildren, args: [AmapInfoWindowComponent,] }]
};
if (false) {
/**
* 点标记显示内容
* @type {?}
*/
AmapTextComponent.prototype.text;
/**
* 点标记在地图上显示的位置
* @type {?}
*/
AmapTextComponent.prototype.position;
/**
* 标记锚点
* @type {?}
*/
AmapTextComponent.prototype.anchor;
/**
* 点标记显示位置偏移量
* @type {?}
*/
AmapTextComponent.prototype.offset;
/**
* 鼠标点击时marker是否置顶
* @type {?}
*/
AmapTextComponent.prototype.topWhenClick;
/**
* 拖拽点标记时是否开启点标记离开地图的效果
* @type {?}
*/
AmapTextComponent.prototype.raiseOnDrag;
/**
* 点标记是否可见
* @type {?}
*/
AmapTextComponent.prototype.visible;
/**
* 点标记的叠加顺序
* @type {?}
*/
AmapTextComponent.prototype.zIndex;
/**
* 点标记的旋转角度
* @type {?}
*/
AmapTextComponent.prototype.angle;
/**
* 是否自动旋转
* @type {?}
*/
AmapTextComponent.prototype.autoRotation;
/**
* 点标记的动画效果
* @type {?}
*/
AmapTextComponent.prototype.animation;
/**
* 点标记阴影
* @type {?}
*/
AmapTextComponent.prototype.shadow;
/**
* 鼠标滑过点标记时的文字提示
* @type {?}
*/
AmapTextComponent.prototype.title;
/**
* 样式
* @type {?}
*/
AmapTextComponent.prototype.style;
/**
* 额外: 是否置顶
* @type {?}
*/
AmapTextComponent.prototype.isTop;
/**
* 额外: 是否隐藏
* @type {?}
*/
AmapTextComponent.prototype.hidden;
/**
* 额外: 是否包含在点聚合中
* @type {?}
*/
AmapTextComponent.prototype.inCluster;
/**
* 额外: 点击时是否显示信息窗体
* @type {?}
*/
AmapTextComponent.prototype.openInfoWindow;
/** @type {?} */
AmapTextComponent.prototype.naReady;
/** @type {?} */
AmapTextComponent.prototype.naMouseOut;
/** @type {?} */
AmapTextComponent.prototype.naDragStart;
/** @type {?} */
AmapTextComponent.prototype.naDragging;
/** @type {?} */
AmapTextComponent.prototype.naDragEnd;
/** @type {?} */
AmapTextComponent.prototype.naMoving;
/** @type {?} */
AmapTextComponent.prototype.naMoveEnd;
/** @type {?} */
AmapTextComponent.prototype.naMoveAlong;
/** @type {?} */
AmapTextComponent.prototype.infoWindowComponent;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.inited;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.subscription;
/**
* @type {?}
* @protected
*/
AmapTextComponent.prototype.os;
/**
* @type {?}
* @protected
*/
AmapTextComponent.prototype.binder;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.amaps;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.el;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.pixels;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.icons;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.logger;
/**
* @type {?}
* @private
*/
AmapTextComponent.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1hcC10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1hbWFwLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9hbWFwLXRleHQvYW1hcC10ZXh0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLE1BQU0sRUFDTixZQUFZLEVBR1osZUFBZSxFQUNmLFNBQVMsRUFFVCxVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7TUFFbEQsR0FBRyxHQUFHLFdBQVc7O01BQ2pCLFdBQVcsR0FBRztJQUNsQixHQUFHLGNBQWM7SUFDakIsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsY0FBYztJQUNkLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87Q0FDUjtBQVFELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxXQUFzQjs7Ozs7Ozs7Ozs7SUE2RjNELFlBQ1ksRUFBbUIsRUFDbkIsTUFBMEIsRUFDNUIsS0FBa0IsRUFDbEIsRUFBYyxFQUNkLE1BQW9CLEVBQ3BCLEtBQWtCLEVBQ2xCLE1BQXFCLEVBQ3JCLE1BQWM7UUFFdEIsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQVRSLE9BQUUsR0FBRixFQUFFLENBQWlCO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQzVCLFVBQUssR0FBTCxLQUFLLENBQWE7UUFDbEIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7Ozs7UUFuQ2YsV0FBTSxHQUFHLEtBQUssQ0FBQzs7OztRQUlmLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFJbEIsbUJBQWMsR0FBRyxJQUFJLENBQUM7O1FBR3JCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOztRQVd2Qyx3QkFBbUIsR0FBRyxJQUFJLFNBQVMsRUFBMkIsQ0FBQztRQUV2RCxXQUFNLEdBQUcsS0FBSyxDQUFDOztjQWNmLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRTtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjs7Y0FDMUIsTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDOztjQUNqQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xCLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUzs7O1lBQUMsR0FBRyxFQUFFO2dCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFDdkMsMkJBQTJCO2dCQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTOzs7Z0JBQUMsR0FBRyxFQUFFO29CQUN4RSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPOzs7O3dCQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFDLENBQUM7cUJBQ2pEO2dCQUNILENBQUMsRUFBQyxDQUFDOztzQkFDRyxFQUFFLEdBQWdCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDakYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDOztzQkFDM0MsT0FBTyxHQUFHLFVBQVUsQ0FBb0IsSUFBSSxFQUFFLFdBQVcsQ0FBQztnQkFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNmLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNqRDtnQkFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ2YsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ2xEO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Ozs7Z0JBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRzs7O29CQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7b0JBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDLEVBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xDLENBQUMsRUFBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFxQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3pFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbEMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFzQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzFFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFTLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDOUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQU0sU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUMvRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBTSxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQy9FLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFVLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ3pGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFVLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ3pGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFVLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDO1lBQzdGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFTLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUs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QUk5QixvQ0FBMEI7Ozs7O0lBSTFCLG1DQUF3Qjs7Ozs7SUFJeEIsa0NBQXVCOzs7OztJQUl2Qix5Q0FBK0I7Ozs7O0lBSS9CLHNDQUF1Qzs7Ozs7SUFJdkMsbUNBQTRDOzs7OztJQUk1QyxrQ0FBdUI7Ozs7O0lBSXZCLGtDQUEwQzs7Ozs7SUFJMUMsa0NBQXdCOzs7OztJQUl4QixtQ0FBd0I7Ozs7O0lBSXhCLHNDQUEyQjs7Ozs7SUFJM0IsMkNBQStCOztJQUcvQixvQ0FBdUM7O0lBQ3ZDLHVDQUF3Qzs7SUFDeEMsd0NBQXlDOztJQUN6Qyx1Q0FBd0M7O0lBQ3hDLHNDQUF1Qzs7SUFDdkMscUNBQXNDOztJQUN0QyxzQ0FBdUM7O0lBQ3ZDLHdDQUF5Qzs7SUFHekMsZ0RBQytEOzs7OztJQUUvRCxtQ0FBdUI7Ozs7O0lBQ3ZCLHlDQUFtQzs7Ozs7SUFHakMsK0JBQTZCOzs7OztJQUM3QixtQ0FBb0M7Ozs7O0lBQ3BDLGtDQUEwQjs7Ozs7SUFDMUIsK0JBQXNCOzs7OztJQUN0QixtQ0FBNEI7Ozs7O0lBQzVCLGtDQUEwQjs7Ozs7SUFDMUIsbUNBQTZCOzs7OztJQUM3QixtQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkNoYW5nZXMsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBFbGVtZW50UmVmLFxuICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgemlwLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFtYXBUZXh0U2VydmljZSB9IGZyb20gJy4vYW1hcC10ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnZXIvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQU1hcE92ZXJsYXksIE92ZXJsYXlPcHRpb25zIH0gZnJvbSAnLi4vLi4vYmFzZS9hbWFwLW92ZXJsYXknO1xuaW1wb3J0IHsgRXZlbnRCaW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V2ZW50LWJpbmRlci5zZXJ2aWNlJztcbmltcG9ydCB7IGdldE9wdGlvbnMsIENoYW5nZUZpbHRlciB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IElQaXhlbCwgSUljb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBpeGVsU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9waXhlbC5zZXJ2aWNlJztcbmltcG9ydCB7IEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ljb24uc2VydmljZSc7XG5pbXBvcnQgeyBBbWFwSW5mb1dpbmRvd0NvbXBvbmVudCB9IGZyb20gJy4uL2FtYXAtaW5mby13aW5kb3cvYW1hcC1pbmZvLXdpbmRvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQU1hcFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvYW1hcC5zZXJ2aWNlJztcblxuY29uc3QgVEFHID0gJ2FtYXAtdGV4dCc7XG5jb25zdCBBTExfT1BUSU9OUyA9IFtcbiAgLi4uT3ZlcmxheU9wdGlvbnMsXG4gICd0ZXh0JyxcbiAgJ3Bvc2l0aW9uJyxcbiAgJ2FuY2hvcicsXG4gICdvZmZzZXQnLFxuICAndG9wV2hlbkNsaWNrJyxcbiAgJ3JhaXNlT25EcmFnJyxcbiAgJ3Zpc2libGUnLFxuICAnekluZGV4JyxcbiAgJ2FuZ2xlJyxcbiAgJ2F1dG9Sb3RhdGlvbicsXG4gICdhbmltYXRpb24nLFxuICAnc2hhZG93JyxcbiAgJ3RpdGxlJyxcbiAgJ3N0eWxlJyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FtYXAtdGV4dCcsXG4gIGV4cG9ydEFzOiAndGV4dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbWFwLXRleHQuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtBbWFwVGV4dFNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBBbWFwVGV4dENvbXBvbmVudCBleHRlbmRzIEFNYXBPdmVybGF5PEFNYXAuVGV4dD5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIC8vIC0tLS0gT3B0aW9ucyAtLS0tXG4gIC8qKlxuICAgKiDngrnmoIforrDmmL7npLrlhoXlrrlcbiAgICovXG4gIEBJbnB1dCgpIHRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIOeCueagh+iusOWcqOWcsOWbvuS4iuaYvuekuueahOS9jee9rlxuICAgKi9cbiAgQElucHV0KCkgcG9zaXRpb246IEFNYXAuTG9jYXRpb25WYWx1ZTtcbiAgLyoqXG4gICAqIOagh+iusOmUmueCuVxuICAgKi9cbiAgQElucHV0KCkgYW5jaG9yOiBBTWFwLk1hcmtlci5BbmNob3I7XG4gIC8qKlxuICAgKiDngrnmoIforrDmmL7npLrkvY3nva7lgY/np7vph49cbiAgICovXG4gIEBJbnB1dCgpIG9mZnNldDogQU1hcC5QaXhlbCB8IElQaXhlbDtcbiAgLyoqXG4gICAqIOm8oOagh+eCueWHu+aXtm1hcmtlcuaYr+WQpue9rumhtlxuICAgKi9cbiAgQElucHV0KCkgdG9wV2hlbkNsaWNrOiBib29sZWFuO1xuICAvKipcbiAgICog5ouW5ou954K55qCH6K6w5pe25piv5ZCm5byA5ZCv54K55qCH6K6w56a75byA5Zyw5Zu+55qE5pWI5p6cXG4gICAqL1xuICBASW5wdXQoKSByYWlzZU9uRHJhZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOaYr+WQpuWPr+ingVxuICAgKi9cbiAgQElucHV0KCkgdmlzaWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWPoOWKoOmhuuW6j1xuICAgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXI7XG4gIC8qKlxuICAgKiDngrnmoIforrDnmoTml4vovazop5LluqZcbiAgICovXG4gIEBJbnB1dCgpIGFuZ2xlOiBudW1iZXI7XG4gIC8qKlxuICAgKiDmmK/lkKboh6rliqjml4vovaxcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Sb3RhdGlvbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWKqOeUu+aViOaenFxuICAgKi9cbiAgQElucHV0KCkgYW5pbWF0aW9uOiBBTWFwLkFuaW1hdGlvbk5hbWU7XG4gIC8qKlxuICAgKiDngrnmoIforrDpmLTlvbFcbiAgICovXG4gIEBJbnB1dCgpIHNoYWRvdzogQU1hcC5JY29uIHwgc3RyaW5nIHwgSUljb247XG4gIC8qKlxuICAgKiDpvKDmoIfmu5Hov4fngrnmoIforrDml7bnmoTmloflrZfmj5DnpLpcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDmoLflvI9cbiAgICovXG4gIEBJbnB1dCgpIHN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAvKipcbiAgICog6aKd5aSWOiDmmK/lkKbnva7pobZcbiAgICovXG4gIEBJbnB1dCgpIGlzVG9wOiBib29sZWFuO1xuICAvKipcbiAgICog6aKd5aSWOiDmmK/lkKbpmpDol49cbiAgICovXG4gIEBJbnB1dCgpIGhpZGRlbiA9IGZhbHNlO1xuICAvKipcbiAgICog6aKd5aSWOiDmmK/lkKbljIXlkKvlnKjngrnogZrlkIjkuK1cbiAgICovXG4gIEBJbnB1dCgpIGluQ2x1c3RlciA9IGZhbHNlO1xuICAvKipcbiAgICog6aKd5aSWOiDngrnlh7vml7bmmK/lkKbmmL7npLrkv6Hmga/nqpfkvZNcbiAgICovXG4gIEBJbnB1dCgpIG9wZW5JbmZvV2luZG93ID0gdHJ1ZTtcblxuICAvLyAtLS0tIEV2ZW50cyAtLS0tXG4gIEBPdXRwdXQoKSBuYVJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgbmFNb3VzZU91dDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYURyYWdTdGFydDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYURyYWdnaW5nOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hRHJhZ0VuZDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYU1vdmluZzogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYU1vdmVFbmQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFNb3ZlQWxvbmc6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIC8vIGFtYXAgaW5mbyB3aW5kb3c6XG4gIEBDb250ZW50Q2hpbGRyZW4oQW1hcEluZm9XaW5kb3dDb21wb25lbnQpXG4gIGluZm9XaW5kb3dDb21wb25lbnQgPSBuZXcgUXVlcnlMaXN0PEFtYXBJbmZvV2luZG93Q29tcG9uZW50PigpO1xuXG4gIHByaXZhdGUgaW5pdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG9zOiBBbWFwVGV4dFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGJpbmRlcjogRXZlbnRCaW5kZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYW1hcHM6IEFNYXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBwaXhlbHM6IFBpeGVsU2VydmljZSxcbiAgICBwcml2YXRlIGljb25zOiBJY29uU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICApIHtcbiAgICBzdXBlcihvcywgYmluZGVyKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm9zLmdldCgpO1xuICAgIHRoaXMubmFNb3VzZU91dCA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdtb3VzZW91dCcpO1xuICAgIHRoaXMubmFEcmFnU3RhcnQgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnZHJhZ3N0YXJ0Jyk7XG4gICAgdGhpcy5uYURyYWdnaW5nID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ2RyYWdnaW5nJyk7XG4gICAgdGhpcy5uYURyYWdFbmQgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnZHJhZ2VuZCcpO1xuICAgIHRoaXMubmFNb3ZpbmcgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnbW92aW5nJyk7XG4gICAgdGhpcy5uYU1vdmVFbmQgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnbW92ZWVuZCcpO1xuICAgIHRoaXMubmFNb3ZlQWxvbmcgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnbW92ZWFsb25nJyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMub3MuZGVzdHJveSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IGZpbHRlciA9IENoYW5nZUZpbHRlci5vZihjaGFuZ2VzKTtcbiAgICBjb25zdCBtYXJrZXIgPSB0aGlzLmdldCgpO1xuICAgIGlmICghdGhpcy5pbml0ZWQpIHtcbiAgICAgIC8vIGRvIG5vdCBkcmF3IHRleHQgbWFya2VyIHdoZW4gbm8gcG9pc3Rpb24gZGVmaW5lZC5cbiAgICAgIGlmICghdGhpcy5wb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFtYXBzLmdldCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmQoVEFHLCAnaW5pdGlhbGl6aW5nIC4uLicpO1xuICAgICAgICAvLyBiaW5kIGluZm8gd2luZG93IGV2ZW50czpcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQobWFya2VyLCAnY2xpY2snKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9wZW5JbmZvV2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuZm9yRWFjaCh3ID0+IHcub3BlbigpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFtYXAtdGV4dC1jb250ZW50Jyk7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dCA/IHRoaXMudGV4dCA6IGVsLmlubmVyVGV4dDtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnM8QU1hcC5UZXh0Lk9wdGlvbnM+KHRoaXMsIEFMTF9PUFRJT05TKTtcbiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7XG4gICAgICAgICAgb3B0aW9ucy5zaGFkb3cgPSB0aGlzLmljb25zLmNyZWF0ZSh0aGlzLnNoYWRvdyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgb3B0aW9ucy5vZmZzZXQgPSB0aGlzLnBpeGVscy5jcmVhdGUodGhpcy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyLmQoVEFHLCAnb3B0aW9uczonLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcy5jcmVhdGUob3B0aW9ucykuc3Vic2NyaWJlKG0gPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm5hUmVhZHkuZW1pdChtKSk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZChUQUcsICdtYXJrZXIgaXMgcmVhZHkuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluaXRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudXBkYXRlSW5mb1dpbmRvdygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUluZm9XaW5kb3dQb3NpdGlvbigpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHppcChmaWx0ZXIuaGFzPHN0cmluZyB8IEFNYXAuSWNvbj4oJ3NoYWRvdycpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldFNoYWRvdyh0aGlzLmljb25zLmNyZWF0ZSh2KSksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8QU1hcC5QaXhlbCB8IElQaXhlbD4oJ29mZnNldCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldE9mZnNldCh0aGlzLnBpeGVscy5jcmVhdGUodikpLFxuICAgICAgKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPHN0cmluZz4oJ3RpdGxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0VGl0bGUodikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8YW55PignY29udGVudCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldENvbnRlbnQodikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8YW55PignZXh0RGF0YScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldEV4dERhdGEodikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ2NsaWNrYWJsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldENsaWNrYWJsZSghIXYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPGJvb2xlYW4+KCdkcmFnZ2FibGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXREcmFnZ2FibGUoISF2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPigndmlzaWJsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiAodiA/IG0uc2hvdygpIDogbS5oaWRlKCkpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPHN0cmluZz4oJ2N1cnNvcicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldEN1cnNvcih2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxBTWFwLkFuaW1hdGlvbk5hbWU+KCdhbmltYXRpb24nKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRBbmltYXRpb24odiksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8bnVtYmVyPignYW5nbGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRBbmdsZSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxudW1iZXI+KCd6SW5kZXgnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXR6SW5kZXgodikpO1xuICAgICAgemlwKGZpbHRlci5ub3RFbXB0eTxBTWFwLkxvY2F0aW9uVmFsdWU+KCdwb3NpdGlvbicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldFBvc2l0aW9uKHYpLFxuICAgICAgKTtcbiAgICAgIHppcChmaWx0ZXIubm90RW1wdHk8YW55Pignc3R5bGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRTdHlsZSh2KSk7XG4gICAgfVxuICAgIHppcChmaWx0ZXIuaGFzPGJvb2xlYW4+KCdpc1RvcCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldFRvcCghIXYpKTtcbiAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignaGlkZGVuJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+ICh2ID8gbS5oaWRlKCkgOiBtLnNob3coKSkpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudXBkYXRlSW5mb1dpbmRvdygpO1xuICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUluZm9XaW5kb3coKSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUluZm9XaW5kb3coKSB7XG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudCAmJiB0aGlzLmluaXRlZCkge1xuICAgICAgaWYgKHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmUoVEFHLCAnRXhwZWN0ZWQgbm8gbW9yZSB0aGFuIDEgaW5mbyB3aW5kb3cuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5vcy5nZXQoKTtcbiAgICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5ob3N0TWFya2VyID0gbWFya2VyO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmZvV2luZG93UG9zaXRpb24oKSB7XG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudCAmJiB0aGlzLmluaXRlZCkge1xuICAgICAgdGhpcy5pbmZvV2luZG93Q29tcG9uZW50LmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgY29tcG9uZW50LnRvZ2dsZU9wZW4oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blt7LliJvlu7rnmoQgQU1hcC5UZXh0IOWvueixoVxuICAgKi9cbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9zLmdldCgpO1xuICB9XG59XG4iXX0=