@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
434 lines (429 loc) • 47.5 kB
JavaScript
import * as tslib_1 from "tslib";
var SelectComponent_1;
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, ViewChild, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { DropdownBaseComponent } from './dropdown-base.component';
import { GridSettings, GridState } from '@true-directive/base';
import { GridComponent } from '../grid.component';
import { Keys, Utils } from '@true-directive/base';
let SelectComponent = SelectComponent_1 = class SelectComponent extends DropdownBaseComponent {
constructor(_elementRef, _renderer) {
super(_elementRef, _renderer);
this._elementRef = _elementRef;
this._renderer = _renderer;
/**
* Current text value
*/
this.displayValue = '';
// Запрос данных
this.dataQuery = new EventEmitter();
this._focusedValue = null;
this._valueField = null;
this._displayField = null;
this.columns = [];
this.parentState = null;
this._settings = null;
this.itemSelect = new EventEmitter();
// Выбираем ли мы из грида
this._onGrid = false;
this._empty = false;
this._updating = false;
this.useAltDown = false;
}
/**
* Current value
*/
set value(v) {
if (v !== this._value) {
this._value = v;
this.writeValue(this._value);
this.onChange(v);
}
}
get value() {
return this._value;
}
set valueField(fieldName) {
this._valueField = fieldName;
if (this._settings) {
// Настройки могут быть еще не созданы
this._settings.keyField = this._valueField;
}
}
get valueField() {
if (this._valueField === null && this.columns.length > 0) {
return this.columns[0].fieldName;
}
return this._valueField === null ? 'id' : this._valueField;
}
set displayField(fieldName) {
this._displayField = fieldName;
}
get displayField() {
if (this._displayField === null && this.columns.length > 0) {
return this.columns[0].fieldName;
}
return this._displayField === null ? 'name' : this._displayField;
}
set settings(v) {
this._settings = v;
this._settings.enableTouchScroll = false;
}
get settings() {
if (!this._settings) {
this._settings = GridSettings.minimal();
this._settings.keyField = this.valueField;
this._settings.widthUnit = 'em';
this._settings.showHeader = false;
this._settings.columnAutoWidth = false;
this._settings.enableTouchScroll = false;
this._settings.appearance.enableHoverAppearance = true;
}
return this._settings;
}
gridStartProcess(e) {
if (this._empty && this.settings.requestData) {
this._empty = false;
this._updating = true;
}
}
gridEndProcess(e) {
setTimeout(() => {
if (!this.popup.visible) {
this.showByTarget();
}
else {
// Let's update position of popup window. When list reduce, it may move
// up or down regarding input.
this.popup.updatePosition();
}
});
this._updating = false;
if (this.grid.resultRows.length === 0) {
this._empty = true;
}
else {
this._empty = false;
}
}
gridDataQuery(e) {
this.dataQuery.emit(e);
}
// Отображаем значение в компоненте. Formatter: Ctrl --> View
writeValue(v) {
this._value = v;
let found = this.items.find(item => item[this.valueField] === v);
if (!found) {
this.displayValue = '';
}
else {
this.displayValue = found[this.displayField];
}
}
// За один раз устанавливаем и значение и отображение
setValue(value, displayValue) {
if (value !== this._value || displayValue !== this.displayValue) {
this._focusedValue = value;
this.displayValue = displayValue;
this.value = value;
}
}
// По введенному тексту ничего не найдено?
empty() {
return this._empty;
}
// Происходит обновление данных?
updating() {
return this._updating;
}
// Ответ
fetchData(dataQuery, data) {
let sel = this.getSelectedRow();
if (sel) {
this._focusedValue = sel[this.valueField];
}
if (this.grid && this.popupVisible) {
this.grid.fetchData(dataQuery, data);
if (this._focusedValue) {
this.grid.locateByKey(this._focusedValue);
}
else {
if (this._value !== null) {
this.grid.locateByKey(this._value);
}
}
}
}
/**
* Общая ширина грида в выпадающем списке
* @return Ширина в заданных единицах измерения
*/
gridWidth() {
let ww = 0;
this.columns.forEach(c => ww += c.width);
return ww + this.settings.widthUnit;
}
/**
* Перекрываем показывание выпадающего окна, чтобы обновить вью грида
* и выделить строку, содержащую текущее значение
* @param e Параметры события
*/
popupShow(e) {
this._onGrid = false;
if (this._value !== null) {
this.grid.locateByKey(this._value, this.valueField);
}
else {
if (this.shownByKey) {
this.grid.processKey(Keys.generateEvent(null, Keys.DOWN)); // Будет выбрана первая запись
}
}
this.grid.checkSize();
}
/**
* Обработчик клавиш вызывается из родительского класса
* Возвращает false, если клавиша не обработана
*/
processKey(e) {
if (e.keyCode === Keys.ENTER) {
this.setValueFromGrid();
this.popup.closePopup();
return true;
}
if (!this.popupVisible) {
return false;
}
if (e.keyCode === Keys.ESCAPE) {
this.popup.closePopup();
e.preventDefault();
e.stopPropagation();
return true;
}
if (e.keyCode === Keys.DOWN || e.keyCode === Keys.UP) {
this._onGrid = true;
this.grid.processKey(e);
e.preventDefault();
return true;
}
return false;
}
// Клик по записи в гриде
gridRowClick(e) {
this._onGrid = true;
this._skipFocusOnPopupClose = false;
this.value = e.row[this.valueField];
this.popup.closePopup();
this.itemSelect.emit(e.row);
}
// Поворот иконки
iconClass() {
let s = 'true-icon-angle-down true-turnable';
if (this.popupVisible) {
s += ' true-turned';
}
return s;
}
// Ввод текста пользователем
inputInput(e = null) {
// Окошко еще на выпало? показываем
if (!this.popupVisible && this.displayValue !== '') {
this.grid.searchString = this.displayValue;
return;
}
if (this.popupVisible) {
setTimeout(() => {
// Устанавливаем фильтр по тексту
this.grid.searchString = this.displayValue;
});
}
if (this.displayValue === '') {
this.setValue(null, '');
return;
}
this._value = null;
}
// Возврат выбранной строки в гриде
getSelectedRow() {
if (this.grid && this.grid.state.selection.ranges.length > 0) {
let item = this.grid.state.selection.ranges[0].fromCell.row;
return item;
}
return null;
}
containsDisplayed(s) {
return !this.displayValue || (s !== undefined && s.toLowerCase().indexOf(this.displayValue.toLowerCase()) >= 0);
}
// Установка значения по выделенной в гриде записи
setValueFromGrid() {
if (!this.popupVisible && this.grid.state.model) {
const found = this.grid.state.model.find(item => item[this.displayField].toLowerCase() === this.displayValue.toLowerCase());
if (found) {
this.setValue(found[this.valueField], found[this.displayField]);
}
else {
this.setValue(null, '');
}
return;
}
const sel = this.getSelectedRow();
if (sel && (this._onGrid || this.containsDisplayed(sel[this.displayField]))) {
this.setValue(sel[this.valueField], sel[this.displayField]);
}
else {
this.setValueFromDisplayed();
}
}
/**
* Установка значения по введенному тексту
*/
setValueFromDisplayed() {
// По запросу. Смотрим в гриде. Хотя, если подумать, можно всегда в гриде смотреть..
let f = null;
if (this.grid && this.grid.resultRows) {
f = this.grid.resultRows.find(item => item[this.displayField].toLowerCase() === this.displayValue.toLowerCase());
}
if (f) {
this.setValue(f[this.valueField], f[this.displayField]);
}
else {
this.setValue(null, '');
}
return;
}
/**
* Потеря фокуса инпутом
* @param e Параметры события
*/
inputBlur(e) {
this._skipFocusOnPopupClose = true;
if ((this.value === null || this.value === undefined) && this.displayValue !== '') {
if (e.relatedTarget && Utils.isAncestor(this.popup.elementRef.nativeElement, e.relatedTarget)) {
// Если фокус перешел на...
return;
}
this.closePopup();
this.setValueFromDisplayed();
}
super.inputBlur(e);
}
};
tslib_1.__decorate([
Output('dataQuery'),
tslib_1.__metadata("design:type", EventEmitter)
], SelectComponent.prototype, "dataQuery", void 0);
tslib_1.__decorate([
Input('valueField'),
tslib_1.__metadata("design:type", String),
tslib_1.__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "valueField", null);
tslib_1.__decorate([
Input('displayField'),
tslib_1.__metadata("design:type", String),
tslib_1.__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "displayField", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Array)
], SelectComponent.prototype, "columns", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Array)
], SelectComponent.prototype, "items", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", GridState)
], SelectComponent.prototype, "parentState", void 0);
tslib_1.__decorate([
Input('settings'),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], SelectComponent.prototype, "settings", null);
tslib_1.__decorate([
Output('itemSelect'),
tslib_1.__metadata("design:type", EventEmitter)
], SelectComponent.prototype, "itemSelect", void 0);
tslib_1.__decorate([
ViewChild('grid', { static: true }),
tslib_1.__metadata("design:type", GridComponent)
], SelectComponent.prototype, "grid", void 0);
SelectComponent = SelectComponent_1 = tslib_1.__decorate([
Component({
selector: 'true-select',
template: `
<true-input-wrapper
(btnClick)="btnClick($event)"
[disabled]="disabled"
class="true-select__input"
[class.true-input_popup-visible]="popupVisible"
[icon]="iconClass()">
<input #input
[(ngModel)]="displayValue"
[readonly]="disableTextEditor"
[attr.disabled]="disabled"
[class.true-disable-te]="disableTextEditor"
(input)="inputInput($event)"
(click)="inputClick($event)"
(touchstart)="inputTouchStart($event)"
(touchmove)="inputTouchMove($event)"
(touchend)="inputTouchEnd($event)"
(blur)="inputBlur($event)"
(focus)="inputFocus($event)"
(keydown)="inputKeyDown($event)"/>
</true-input-wrapper>
<true-popup #popup
(close)="popupClose($event)"
(show)="popupShow($event)" >
<true-grid #grid
[class.true-select__grid_hidden]="empty()"
class="true-select__grid"
[maxHeight]="maxDropDownHeight"
[columns]="columns"
[data]="items"
[settings]="settings"
(dataQuery)="gridDataQuery($event)"
(startProcess)="gridStartProcess($event)"
(endProcess)="gridEndProcess($event)"
(rowClick)="gridRowClick($event)">
</true-grid>
<div *ngIf="empty()" class="true-select__notfound" [style.width]="gridWidth()">Ничего не найдено</div>
<div *ngIf="updating()" class="true-select__updating">Загрузка...</div>
</true-popup>
`,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SelectComponent_1),
multi: true
}],
styles: [`
.true-select__input {
width: 100%;
}
input {
box-sizing: border-box;
width: 100%;
height: 100%;
}
.true-select__grid_hidden {
display: none;
}
.true-select__grid {
border: none !important;
cursor: pointer;
}
.true-select__notfound, .true-select__updating {
padding: 0.6em;
box-sizing: border-box;
color: #aaa;
}
`]
}),
tslib_1.__metadata("design:paramtypes", [ElementRef,
Renderer2])
], SelectComponent);
export { SelectComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL2NvbnRyb2xzL3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7OztFQUlFO0FBQ0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFlLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUUxRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBK0VuRCxJQUFhLGVBQWUsdUJBQTVCLE1BQWEsZUFBZ0IsU0FBUSxxQkFBcUI7SUFtV3hELFlBQ1ksV0FBdUIsRUFDdkIsU0FBb0I7UUFDNUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUZ0QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBbldoQzs7V0FFRztRQUNJLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBaUJqQyxnQkFBZ0I7UUFFaEIsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRS9DLGtCQUFhLEdBQVEsSUFBSSxDQUFDO1FBQzFCLGdCQUFXLEdBQVcsSUFBSSxDQUFDO1FBa0IzQixrQkFBYSxHQUFXLElBQUksQ0FBQztRQWNyQyxZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQU01QixnQkFB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IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZixcclxuICAgICAgICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vcG9wdXAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wZG93bi1iYXNlLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBHcmlkU2V0dGluZ3MsIEdyaWRTdGF0ZSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgQ29sdW1uLCBEYXRhUXVlcnkgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEtleXMsIFV0aWxzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGU6YFxyXG4gICAgICA8dHJ1ZS1pbnB1dC13cmFwcGVyXHJcbiAgICAgICAgKGJ0bkNsaWNrKT1cImJ0bkNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0cnVlLXNlbGVjdF9faW5wdXRcIlxyXG4gICAgICAgIFtjbGFzcy50cnVlLWlucHV0X3BvcHVwLXZpc2libGVdPVwicG9wdXBWaXNpYmxlXCJcclxuICAgICAgICBbaWNvbl09XCJpY29uQ2xhc3MoKVwiPlxyXG4gICAgICAgIDxpbnB1dCAjaW5wdXRcclxuICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkaXNwbGF5VmFsdWVcIlxyXG4gICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgIFtjbGFzcy50cnVlLWRpc2FibGUtdGVdPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICAoaW5wdXQpPVwiaW5wdXRJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cImlucHV0VG91Y2hTdGFydCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNobW92ZSk9XCJpbnB1dFRvdWNoTW92ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNoZW5kKT1cImlucHV0VG91Y2hFbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChibHVyKT1cImlucHV0Qmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGZvY3VzKT1cImlucHV0Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cImlucHV0S2V5RG93bigkZXZlbnQpXCIvPlxyXG4gICAgICA8L3RydWUtaW5wdXQtd3JhcHBlcj5cclxuICAgICAgPHRydWUtcG9wdXAgI3BvcHVwXHJcbiAgICAgICAgKGNsb3NlKT1cInBvcHVwQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNob3cpPVwicG9wdXBTaG93KCRldmVudClcIiA+XHJcbiAgICAgICAgPHRydWUtZ3JpZCAjZ3JpZFxyXG4gICAgICAgICAgICAgICAgIFtjbGFzcy50cnVlLXNlbGVjdF9fZ3JpZF9oaWRkZW5dPVwiZW1wdHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cnVlLXNlbGVjdF9fZ3JpZFwiXHJcbiAgICAgICAgICAgICAgICAgW21heEhlaWdodF09XCJtYXhEcm9wRG93bkhlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICAgW2RhdGFdPVwiaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgKGRhdGFRdWVyeSk9XCJncmlkRGF0YVF1ZXJ5KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgIChzdGFydFByb2Nlc3MpPVwiZ3JpZFN0YXJ0UHJvY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAoZW5kUHJvY2Vzcyk9XCJncmlkRW5kUHJvY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAocm93Q2xpY2spPVwiZ3JpZFJvd0NsaWNrKCRldmVudClcIj5cclxuICAgICAgICA8L3RydWUtZ3JpZD5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZW1wdHkoKVwiIGNsYXNzPVwidHJ1ZS1zZWxlY3RfX25vdGZvdW5kXCIgW3N0eWxlLndpZHRoXT1cImdyaWRXaWR0aCgpXCI+0J3QuNGH0LXQs9C+INC90LUg0L3QsNC50LTQtdC90L48L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBkYXRpbmcoKVwiIGNsYXNzPVwidHJ1ZS1zZWxlY3RfX3VwZGF0aW5nXCI+0JfQsNCz0YDRg9C30LrQsC4uLjwvZGl2PlxyXG4gICAgICA8L3RydWUtcG9wdXA+XHJcbiAgICBgLFxyXG4gICAgLypcclxuICAgICAgUmVtb3ZlZDogOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0gLSBpbnZhbGlkIGlvcyByZW5kZXJpbmcuXHJcbiAgICAgKi9cclxuICBzdHlsZXM6IFtgXHJcblxyXG4gICAgLnRydWUtc2VsZWN0X19pbnB1dCB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0IHtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAudHJ1ZS1zZWxlY3RfX2dyaWRfaGlkZGVuIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAudHJ1ZS1zZWxlY3RfX2dyaWQge1xyXG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC50cnVlLXNlbGVjdF9fbm90Zm91bmQsIC50cnVlLXNlbGVjdF9fdXBkYXRpbmcge1xyXG4gICAgICBwYWRkaW5nOiAwLjZlbTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgY29sb3I6ICNhYWE7XHJcbiAgICB9XHJcbiAgYF0sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWV9XVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBEcm9wZG93bkJhc2VDb21wb25lbnQge1xyXG5cclxuICAvKipcclxuICAgKiBDdXJyZW50IHRleHQgdmFsdWVcclxuICAgKi9cclxuICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQ3VycmVudCB2YWx1ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5fdmFsdWUpO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vINCX0LDQv9GA0L7RgSDQtNCw0L3QvdGL0YVcclxuICBAT3V0cHV0KCdkYXRhUXVlcnknKVxyXG4gIGRhdGFRdWVyeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfZm9jdXNlZFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3ZhbHVlRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgndmFsdWVGaWVsZCcpXHJcbiAgcHVibGljIHNldCB2YWx1ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92YWx1ZUZpZWxkID0gZmllbGROYW1lO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzKSB7XHJcbiAgICAgIC8vINCd0LDRgdGC0YDQvtC50LrQuCDQvNC+0LPRg9GCINCx0YvRgtGMINC10YnQtSDQvdC1INGB0L7Qt9C00LDQvdGLXHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmtleUZpZWxkID0gdGhpcy5fdmFsdWVGaWVsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWVGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLl92YWx1ZUZpZWxkID09PSBudWxsICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNbMF0uZmllbGROYW1lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQgPT09IG51bGwgPyAnaWQnIDogdGhpcy5fdmFsdWVGaWVsZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc3BsYXlGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoJ2Rpc3BsYXlGaWVsZCcpXHJcbiAgcHVibGljIHNldCBkaXNwbGF5RmllbGQoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2Rpc3BsYXlGaWVsZCA9IGZpZWxkTmFtZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzcGxheUZpZWxkKCkge1xyXG4gICAgaWYgKHRoaXMuX2Rpc3BsYXlGaWVsZCA9PT0gbnVsbCAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zWzBdLmZpZWxkTmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RmllbGQgPT09IG51bGwgPyAnbmFtZScgOiB0aGlzLl9kaXNwbGF5RmllbGQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbnM6IEFycmF5PENvbHVtbj4gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBpdGVtczogQXJyYXk8YW55PjtcclxuXHJcbiAgQElucHV0KClcclxuICBwYXJlbnRTdGF0ZTogR3JpZFN0YXRlID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfc2V0dGluZ3M6IEdyaWRTZXR0aW5ncyA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgnc2V0dGluZ3MnKVxyXG4gIHNldCBzZXR0aW5ncyh2KSB7XHJcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHY7XHJcbiAgICB0aGlzLl9zZXR0aW5ncy5lbmFibGVUb3VjaFNjcm9sbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNldHRpbmdzKCkge1xyXG4gICAgaWYgKCF0aGlzLl9zZXR0aW5ncykge1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IEdyaWRTZXR0aW5ncy5taW5pbWFsKCk7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmtleUZpZWxkID0gdGhpcy52YWx1ZUZpZWxkO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy53aWR0aFVuaXQgPSAnZW0nO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5zaG93SGVhZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmNvbHVtbkF1dG9XaWR0aCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5lbmFibGVUb3VjaFNjcm9sbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5hcHBlYXJhbmNlLmVuYWJsZUhvdmVyQXBwZWFyYW5jZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCdpdGVtU2VsZWN0JylcclxuICBpdGVtU2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZ3JpZCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGdyaWQ6IEdyaWRDb21wb25lbnQ7XHJcblxyXG4gIC8vINCS0YvQsdC40YDQsNC10Lwg0LvQuCDQvNGLINC40Lcg0LPRgNC40LTQsFxyXG4gIF9vbkdyaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfZW1wdHkgPSBmYWxzZTtcclxuXHJcbiAgZ3JpZFN0YXJ0UHJvY2VzcyhlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9lbXB0eSAmJiB0aGlzLnNldHRpbmdzLnJlcXVlc3REYXRhKSB7XHJcbiAgICAgIHRoaXMuX2VtcHR5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3VwZGF0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF91cGRhdGluZyA9IGZhbHNlO1xyXG4gIGdyaWRFbmRQcm9jZXNzKGU6IGFueSkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5wb3B1cC52aXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93QnlUYXJnZXQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBMZXQncyB1cGRhdGUgcG9zaXRpb24gb2YgcG9wdXAgd2luZG93LiBXaGVuIGxpc3QgcmVkdWNlLCBpdCBtYXkgbW92ZVxyXG4gICAgICAgIC8vIHVwIG9yIGRvd24gcmVnYXJkaW5nIGlucHV0LlxyXG4gICAgICAgIHRoaXMucG9wdXAudXBkYXRlUG9zaXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRpbmcgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmdyaWQucmVzdWx0Um93cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5fZW1wdHkgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZW1wdHkgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyaWREYXRhUXVlcnkoZTogYW55KSB7XHJcbiAgICB0aGlzLmRhdGFRdWVyeS5lbWl0KGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g0J7RgtC+0LHRgNCw0LbQsNC10Lwg0LfQvdCw0YfQtdC90LjQtSDQsiDQutC+0LzQv9C+0L3QtdC90YLQtS4gRm9ybWF0dGVyOiBDdHJsIC0tPiBWaWV3XHJcbiAgd3JpdGVWYWx1ZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdjtcclxuICAgIGxldCBmb3VuZCA9IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSA9PT0gdik7XHJcbiAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IGZvdW5kW3RoaXMuZGlzcGxheUZpZWxkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vINCX0LAg0L7QtNC40L0g0YDQsNC3INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INC4INC30L3QsNGH0LXQvdC40LUg0Lgg0L7RgtC+0LHRgNCw0LbQtdC90LjQtVxyXG4gIHNldFZhbHVlKHZhbHVlOiBhbnksIGRpc3BsYXlWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ZhbHVlIHx8IGRpc3BsYXlWYWx1ZSAhPT0gdGhpcy5kaXNwbGF5VmFsdWUpIHtcclxuICAgICAgdGhpcy5fZm9jdXNlZFZhbHVlID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gZGlzcGxheVZhbHVlO1xyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDQn9C+INCy0LLQtdC00LXQvdC90L7QvNGDINGC0LXQutGB0YLRgyDQvdC40YfQtdCz0L4g0L3QtSDQvdCw0LnQtNC10L3Qvj9cclxuICBlbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbXB0eTtcclxuICB9XHJcblxyXG4gIC8vINCf0YDQvtC40YHRhdC+0LTQuNGCINC+0LHQvdC+0LLQu9C10L3QuNC1INC00LDQvdC90YvRhT9cclxuICB1cGRhdGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl91cGRhdGluZztcclxuICB9XHJcblxyXG4gIC8vINCe0YLQstC10YJcclxuICBmZXRjaERhdGEoZGF0YVF1ZXJ5OiBEYXRhUXVlcnksIGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIGxldCBzZWwgPSB0aGlzLmdldFNlbGVjdGVkUm93KCk7XHJcbiAgICBpZiAoc2VsKSB7XHJcbiAgICAgIHRoaXMuX2ZvY3VzZWRWYWx1ZSA9IHNlbFt0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWQgJiYgdGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgdGhpcy5ncmlkLmZldGNoRGF0YShkYXRhUXVlcnksIGRhdGEpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2NhdGVCeUtleSh0aGlzLl9mb2N1c2VkVmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmxvY2F0ZUJ5S2V5KHRoaXMuX3ZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0LHRidCw0Y8g0YjQuNGA0LjQvdCwINCz0YDQuNC00LAg0LIg0LLRi9C/0LDQtNCw0Y7RidC10Lwg0YHQv9C40YHQutC1XHJcbiAgICogQHJldHVybiDQqNC40YDQuNC90LAg0LIg0LfQsNC00LDQvdC90YvRhSDQtdC00LjQvdC40YbQsNGFINC40LfQvNC10YDQtdC90LjRj1xyXG4gICAqL1xyXG4gIGdyaWRXaWR0aCgpIHtcclxuICAgIGxldCB3dyA9IDA7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IHd3ICs9IGMud2lkdGgpO1xyXG4gICAgcmV0dXJuIHd3ICsgdGhpcy5zZXR0aW5ncy53aWR0aFVuaXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9C10YDQtdC60YDRi9Cy0LDQtdC8INC/0L7QutCw0LfRi9Cy0LDQvdC40LUg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDQvtC60L3QsCwg0YfRgtC+0LHRiyDQvtCx0L3QvtCy0LjRgtGMINCy0YzRjiDQs9GA0LjQtNCwXHJcbiAgICog0Lgg0LLRi9C00LXQu9C40YLRjCDRgdGC0YDQvtC60YMsINGB0L7QtNC10YDQttCw0YnRg9GOINGC0LXQutGD0YnQtdC1INC30L3QsNGH0LXQvdC40LVcclxuICAgKiBAcGFyYW0gIGUg0J/QsNGA0LDQvNC10YLRgNGLINGB0L7QsdGL0YLQuNGPXHJcbiAgICovXHJcbiAgcG9wdXBTaG93KGU6IGFueSkge1xyXG4gICAgdGhpcy5fb25HcmlkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvY2F0ZUJ5S2V5KHRoaXMuX3ZhbHVlLCB0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc2hvd25CeUtleSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5wcm9jZXNzS2V5KEtleXMuZ2VuZXJhdGVFdmVudChudWxsLCBLZXlzLkRPV04pKTsgLy8g0JHRg9C00LXRgiDQstGL0LHRgNCw0L3QsCDQv9C10YDQstCw0Y8g0LfQsNC/0LjRgdGMXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZC5jaGVja1NpemUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INC60LvQsNCy0LjRiCDQstGL0LfRi9Cy0LDQtdGC0YHRjyDQuNC3INGA0L7QtNC40YLQtdC70YzRgdC60L7Qs9C+INC60LvQsNGB0YHQsFxyXG4gICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIGZhbHNlLCDQtdGB0LvQuCDQutC70LDQstC40YjQsCDQvdC1INC+0LHRgNCw0LHQvtGC0LDQvdCwXHJcbiAgICovXHJcbiAgcHJvY2Vzc0tleShlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVOVEVSKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWVGcm9tR3JpZCgpO1xyXG4gICAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpIHtcclxuICAgICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ET1dOIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5VUCkge1xyXG4gICAgICB0aGlzLl9vbkdyaWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmdyaWQucHJvY2Vzc0tleShlKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyDQmtC70LjQuiDQv9C+INC30LDQv9C40YHQuCDQsiDQs9GA0LjQtNC1XHJcbiAgcHVibGljIGdyaWRSb3dDbGljayhlOiBhbnkpIHtcclxuICAgIHRoaXMuX29uR3JpZCA9IHRydWU7XHJcbiAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSBmYWxzZTtcclxuICAgIHRoaXMudmFsdWUgPSBlLnJvd1t0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICB0aGlzLml0ZW1TZWxlY3QuZW1pdChlLnJvdyk7XHJcbiAgfVxyXG5cclxuICAvLyDQn9C+0LLQvtGA0L7RgiDQuNC60L7QvdC60LhcclxuICBwdWJsaWMgaWNvbkNsYXNzKCkge1xyXG4gICAgbGV0IHMgPSAndHJ1ZS1pY29uLWFuZ2xlLWRvd24gdHJ1ZS10dXJuYWJsZSc7XHJcbiAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgcyArPSAnIHRydWUtdHVybmVkJztcclxuICAgIH1cclxuICAgIHJldHVybiBzO1xyXG4gIH1cclxuXHJcbiAgLy8g0JLQstC+0LQg0YLQtdC60YHRgtCwINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC8XHJcbiAgcHVibGljIGlucHV0SW5wdXQoZTogYW55ID0gbnVsbCkge1xyXG4gICAgLy8g0J7QutC+0YjQutC+INC10YnQtSDQvdCwINCy0YvQv9Cw0LvQvj8g0L/QvtC60LDQt9GL0LLQsNC10LxcclxuICAgIGlmICghdGhpcy5wb3B1cFZpc2libGUgJiYgdGhpcy5kaXNwbGF5VmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuZ3JpZC5zZWFyY2hTdHJpbmcgPSB0aGlzLmRpc3BsYXlWYWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDRhNC40LvRjNGC0YAg0L/QviDRgtC10LrRgdGC0YNcclxuICAgICAgICB0aGlzLmdyaWQuc2VhcmNoU3RyaW5nID0gdGhpcy5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShudWxsLCAnJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDQktC+0LfQstGA0LDRgiDQstGL0LHRgNCw0L3QvdC+0Lkg0YHRgtGA0L7QutC4INCyINCz0YDQuNC00LVcclxuICBwcml2YXRlIGdldFNlbGVjdGVkUm93KCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdyaWQuc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1swXS5mcm9tQ2VsbC5yb3c7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnRhaW5zRGlzcGxheWVkKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmRpc3BsYXlWYWx1ZSB8fCAocyAhPT0gdW5kZWZpbmVkICYmIHMudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuZGlzcGxheVZhbHVlLnRvTG93ZXJDYXNlKCkpID49IDApO1xyXG4gIH1cclxuXHJcbiAgLy8g0KPRgdGC0LDQvdC+0LLQutCwINC30L3QsNGH0LXQvdC40Y8g0L/QviDQstGL0LTQtdC70LXQvdC90L7QuSDQsiDQs9GA0LjQtNC1INC30LDQv9C40YHQuFxyXG4gIHByaXZhdGUgc2V0VmFsdWVGcm9tR3JpZCgpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMucG9wdXBWaXNpYmxlICYmIHRoaXMuZ3JpZC5zdGF0ZS5tb2RlbCkge1xyXG5cclxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmdyaWQuc3RhdGUubW9kZWwuZmluZChcclxuICAgICAgICAgIGl0ZW0gPT4gaXRlbVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kaXNwbGF5VmFsdWUudG9Mb3dlckNhc2UoKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShmb3VuZFt0aGlzLnZhbHVlRmllbGRdLCBmb3VuZFt0aGlzLmRpc3BsYXlGaWVsZF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCwgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWwgPSB0aGlzLmdldFNlbGVjdGVkUm93KCk7XHJcbiAgICBpZiAoc2VsICYmICh0aGlzLl9vbkdyaWQgfHwgdGhpcy5jb250YWluc0Rpc3BsYXllZChzZWxbdGhpcy5kaXNwbGF5RmllbGRdKSkpIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShzZWxbdGhpcy52YWx1ZUZpZWxkXSwgc2VsW3RoaXMuZGlzcGxheUZpZWxkXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldFZhbHVlRnJvbURpc3BsYXllZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0KPRgdGC0LDQvdC+0LLQutCwINC30L3QsNGH0LXQvdC40Y8g0L/QviDQstCy0LXQtNC10L3QvdC+0LzRgyDRgtC10LrRgdGC0YNcclxuICAgKi9cclxuICBwdWJsaWMgc2V0VmFsdWVGcm9tRGlzcGxheWVkKCkge1xyXG4gICAgLy8g0J/QviDQt9Cw0L/RgNC+0YHRgy4g0KHQvNC+0YLRgNC40Lwg0LIg0LPRgNC40LTQtS4g0KXQvtGC0Y8sINC10YHQu9C4INC/0L7QtNGD0LzQsNGC0YwsINC80L7QttC90L4g0LLRgdC10LPQtNCwINCyINCz0YDQuNC00LUg0YHQvNC+0YLRgNC10YLRjC4uXHJcbiAgICBsZXQgZiA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5yZXN1bHRSb3dzKSB7XHJcbiAgICAgIGYgPSB0aGlzLmdyaWQucmVzdWx0Um93cy5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kaXNwbGF5VmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZikge1xyXG4gICAgICB0aGlzLnNldFZhbHVlKGZbdGhpcy52YWx1ZUZpZWxkXSwgZlt0aGlzLmRpc3BsYXlGaWVsZF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShudWxsLCAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9C+0YLQtdGA0Y8g0YTQvtC60YPRgdCwINC40L3Qv9GD0YLQvtC8XHJcbiAgICogQHBhcmFtICBlINCf0LDRgNCw0LzQtdGC0YDRiyDRgdC+0LHRi9GC0LjRj1xyXG4gICAqL1xyXG4gIGlucHV0Qmx1cihlOiBGb2N1c0V2ZW50KSB7XHJcbiAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSB0cnVlO1xyXG4gICAgaWYgKCh0aGlzLnZhbHVlID09PSBudWxsIHx8IHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCkgJiYgdGhpcy5kaXNwbGF5VmFsdWUgIT09ICcnKSB7XHJcblxyXG4gICAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICYmIFV0aWxzLmlzQW5jZXN0b3IodGhpcy5wb3B1cC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGUucmVsYXRlZFRhcmdldCkpIHtcclxuICAgICAgICAvLyDQldGB0LvQuCDRhNC+0LrRg9GBINC/0LXRgNC10YjQtdC7INC90LAuLi5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICB0aGlzLnNldFZhbHVlRnJvbURpc3BsYXllZCgpO1xyXG4gICAgfVxyXG4gICAgc3VwZXIuaW5wdXRCbHVyKGUpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgICAgc3VwZXIoX2VsZW1lbnRSZWYsIF9yZW5kZXJlcik7XHJcbiAgICAgIHRoaXMudXNlQWx0RG93biA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=