com.phloxui
Version:
PhloxUI Ng2+ Framework
356 lines (355 loc) • 34 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef } from '@angular/core';
import { DialogService } from '../../service/DialogService.service';
import { AbstractComponentDataLangSelector } from '../AbstractComponentDataLangSelector';
import { LanguageButtonModel } from '../model/LanguageButtonModel';
import { PhloxAppInfo } from '../../component/model/PhloxAppInfo';
var /** @type {?} */ TYPE_NAME = "phx-data-lang-selector";
var /** @type {?} */ LANG_BTN_CLICK = 'languageBtnClicked';
var DataLangSelectorPane = /** @class */ (function (_super) {
tslib_1.__extends(DataLangSelectorPane, _super);
function DataLangSelectorPane(elementRef, dialogService) {
var _this = _super.call(this, elementRef, dialogService) || this;
_this.LANGUAGE_FIELD_NAME = PhloxAppInfo.DEFAULT_LANGUAGE_FIELD_NAME;
_this.OBJECT_ID_FIELD_NAME = PhloxAppInfo.DEFAULT_OBJECT_ID_FIELD_NAME;
return _this;
}
/**
* @return {?}
*/
DataLangSelectorPane.prototype.ngOnInit = /**
* @return {?}
*/
function () {
_super.prototype.ngOnInit.call(this);
};
/**
* @return {?}
*/
DataLangSelectorPane.prototype.getEditor = /**
* @return {?}
*/
function () {
if (this.data !== null && typeof this.data !== 'undefined') {
if (this.data.editor !== null && typeof this.data.editor !== 'undefined') {
return this.data.editor;
}
}
return null;
};
/**
* @param {?} dataObject
* @return {?}
*/
DataLangSelectorPane.prototype.getWrapDataObject = /**
* @param {?} dataObject
* @return {?}
*/
function (dataObject) {
var /** @type {?} */ editor = this.getEditor();
var /** @type {?} */ data = {
editor: editor,
objects: dataObject
};
return data;
};
/**
* @return {?} any as one object.
*/
DataLangSelectorPane.prototype.getDefaultData = /**
* @return {?} any as one object.
*/
function () {
var /** @type {?} */ objects = null;
if (this.data !== null && typeof this.data !== 'undefined') {
objects = this.data.objects;
}
if (objects === null || typeof objects === 'undefined') {
return null;
}
var /** @type {?} */ editor = this.getEditor();
var /** @type {?} */ langFieldName = null;
if (editor !== null) {
langFieldName = editor.getLanguageField();
}
var /** @type {?} */ oneObj = null;
if (Array.isArray(objects)) {
var /** @type {?} */ moreThanOneDef = false;
var /** @type {?} */ defObj = null;
try {
for (var objects_1 = tslib_1.__values(objects), objects_1_1 = objects_1.next(); !objects_1_1.done; objects_1_1 = objects_1.next()) {
var obj = objects_1_1.value;
var /** @type {?} */ lang = obj[langFieldName];
if (lang === null || typeof lang === 'undefined') {
if (defObj === null) {
defObj = obj;
}
else {
moreThanOneDef = true;
break;
}
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (objects_1_1 && !objects_1_1.done && (_a = objects_1.return)) _a.call(objects_1);
}
finally { if (e_1) throw e_1.error; }
}
if (!moreThanOneDef && defObj !== null && typeof defObj !== 'undefined') {
oneObj = defObj;
}
}
else {
if (objects[langFieldName] === null || typeof objects[langFieldName] === 'undefined') {
oneObj = objects;
}
}
return oneObj;
var e_1, _a;
};
/**
* @return {?}
*/
DataLangSelectorPane.prototype.getDataObjects = /**
* @return {?}
*/
function () {
var /** @type {?} */ objects = null;
if (this.data !== null && typeof this.data !== 'undefined') {
objects = this.data.objects;
}
if (objects === null || typeof objects === 'undefined') {
return null;
}
return objects;
};
/**
* @return {?}
*/
DataLangSelectorPane.prototype.hasModel = /**
* @return {?}
*/
function () {
if (this.model !== null && typeof this.model !== 'undefined') {
return true;
}
return false;
};
/**
* @return {?}
*/
DataLangSelectorPane.prototype.getModel = /**
* @return {?}
*/
function () {
return this.model;
};
/**
* @param {?} model
* @return {?}
*/
DataLangSelectorPane.prototype.setModel = /**
* @param {?} model
* @return {?}
*/
function (model) {
this.model = model;
};
/**
* @return {?}
*/
DataLangSelectorPane.prototype.getLanguageFieldName = /**
* @return {?}
*/
function () {
var /** @type {?} */ editor = this.getEditor();
var /** @type {?} */ langFieldName = (editor === null) ? null : editor.getLanguageField();
if (langFieldName !== null && typeof langFieldName !== 'undefined') {
return langFieldName;
}
return this.LANGUAGE_FIELD_NAME;
};
/**
* @return {?}
*/
DataLangSelectorPane.prototype.getObjectIdFieldName = /**
* @return {?}
*/
function () {
var /** @type {?} */ editor = this.getEditor();
var /** @type {?} */ objIdFieldName = (editor === null) ? null : editor.getObjectIdField();
if (objIdFieldName !== null && typeof objIdFieldName !== 'undefined') {
return objIdFieldName;
}
return this.OBJECT_ID_FIELD_NAME;
};
/**
* @param {?} data
* @return {?}
*/
DataLangSelectorPane.prototype.getInstanceDefaultData = /**
* @param {?} data
* @return {?}
*/
function (data) {
return this.getWrapDataObject([data]);
};
/**
* @param {?} data
* @return {?}
*/
DataLangSelectorPane.prototype.getInstanceDataLanguage = /**
* @param {?} data
* @return {?}
*/
function (data) {
return this.getWrapDataObject([data]);
};
/**
* @return {?} any as object in pattern {iconURL: string, code: string, label: string}
*/
DataLangSelectorPane.prototype.getLanguageList = /**
* @return {?} any as object in pattern {iconURL: string, code: string, label: string}
*/
function () {
var /** @type {?} */ editor = this.getEditor();
var /** @type {?} */ languageList = [];
if (editor !== null) {
var /** @type {?} */ setting = editor.getAppSetting();
if (setting !== null && typeof setting !== 'undefined') {
var /** @type {?} */ defaultLangs = setting.DEFAULT_DATA_LANGUAGES;
if (defaultLangs !== null && typeof defaultLangs !== 'undefined' && Array.isArray(defaultLangs)) {
try {
for (var defaultLangs_1 = tslib_1.__values(defaultLangs), defaultLangs_1_1 = defaultLangs_1.next(); !defaultLangs_1_1.done; defaultLangs_1_1 = defaultLangs_1.next()) {
var lang = defaultLangs_1_1.value;
languageList.push(lang.code);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (defaultLangs_1_1 && !defaultLangs_1_1.done && (_a = defaultLangs_1.return)) _a.call(defaultLangs_1);
}
finally { if (e_2) throw e_2.error; }
}
}
}
}
return languageList;
var e_2, _a;
};
/**
* @param {?} defaultData
* @return {?}
*/
DataLangSelectorPane.prototype.loadDataLanguageList = /**
* @param {?} defaultData
* @return {?}
*/
function (defaultData) {
var _this = this;
return new Promise(function (resolve, reject) {
var /** @type {?} */ editor = _this.getEditor();
if (editor !== null) {
var /** @type {?} */ langProm = editor.getLanguageList(defaultData);
if (langProm !== null && typeof langProm !== 'undefined') {
langProm.then(function (result) {
var /** @type {?} */ tempArray = [];
if (result !== null && typeof result !== 'undefined') {
if (Array.isArray(result)) {
tempArray = result;
}
else {
tempArray.push(result);
}
}
resolve(tempArray);
});
}
}
else {
resolve([]);
}
});
};
/**
* when new language was created this method will be called
* @param {?} newLangData as any
* @return {?}
*/
DataLangSelectorPane.prototype.onLanguageAdded = /**
* when new language was created this method will be called
* @param {?} newLangData as any
* @return {?}
*/
function (newLangData) {
if (newLangData !== null && typeof newLangData !== 'undefined') {
// do sth here
}
// this.data.objects.push(newLangData);
};
/**
* when language was removed this method will be called
* @param {?} deletedData as any
* @return {?}
*/
DataLangSelectorPane.prototype.onLanguageRemoved = /**
* when language was removed this method will be called
* @param {?} deletedData as any
* @return {?}
*/
function (deletedData) {
// do sth
};
/**
* @param {?} langCode
* @return {?}
*/
DataLangSelectorPane.prototype.parseLanguageButtonModel = /**
* @param {?} langCode
* @return {?}
*/
function (langCode) {
return new LanguageButtonModel('', langCode, 'label');
};
DataLangSelectorPane.TYPE_NAME = TYPE_NAME;
DataLangSelectorPane.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: "<div class=\"phx-data-lang-selector\">\n\t<div class=\"wrapper left\" [class.expand]=\"!hasLanguage()\">\n\t\t<div class=\"component-pane\">\n\t\t\t<!-- default -->\n\t\t\t<div class=\"component-wrapper\" [class.show]=\"_isSelectedLanguageByIndex(null)\">\n\t\t\t\t<phx-component-wrapper *ngIf=\"hasModel()\" [type]=\"getModel().tabComponentType\" [model]=\"getModel().tabComponentModel\"\n\t\t\t\t\t[handler]=\"getDefaultComponentHandler()\" [data]=\"getDefaultData()\" [dataParent]=\"this\"></phx-component-wrapper>\n\t\t\t</div>\n\t\t\t<!-- by lang -->\n\t\t\t<ng-template ngFor let-item [ngForOf]=\"_getDataLangList()\" let-i=\"index\">\n\t\t\t\t<div class=\"component-wrapper\" [class.show]=\"_isSelectedLanguageByIndex(i)\">\n\t\t\t\t\t<ng-template [ngIf]=\"item !== null && item !== undefined\">\n\t\t\t\t\t\t<phx-component-wrapper *ngIf=\"hasModel()\" [type]=\"getModel().tabComponentType\" [model]=\"getModel().tabComponentModel\"\n\t\t\t\t\t\t\t[handler]=\"getComponentHandler()\" [setting]=\"getComponentSetting(i)\" [data]=\"item\" [dataParent]=\"this\"></phx-component-wrapper>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</div>\n\t\t\t</ng-template>\n\t\t</div>\n\t</div>\n\t<div class=\"wrapper right\" [class.hide]=\"!hasLanguage()\">\n\t\t<div class=\"lang-pane\">\n\t\t\t<div class=\"language-btn default data\" [class.selected]=\"isSelectedLanguage(null)\" [class.dirty]=\"_isDataDirtyByIndex(null)\"\n\t\t\t\t(click)=\"onActionBtnClicked($event, null, undefined)\">\n\t\t\t\t<div class=\"table-wrapper fluid\">\n\t\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t\tDefault\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div *ngFor=\"let item of getMergedLanguageList(); let i = index\" class=\"language-btn\" [class.data]=\"_langHasDataByIndex(i)\"\n\t\t\t\t[class.dirty]=\"_isDataDirtyByIndex(i)\"\n\t\t\t\t[class.selected]=\"isSelectedLanguage(item)\" (click)=\"onActionBtnClicked($event, item, i)\">\n\t\t\t\t<div class=\"table-wrapper fluid\">\n\t\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t\t<div *ngIf=\"!_hasButtonIcon(item)\">{{item.code}}</div>\n\t\t\t\t\t\t<div *ngIf=\"_hasButtonIcon(item)\">\n\t\t\t\t\t\t\t<img src=\"{{item.iconURL}}\">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"mocking-btn\"></div>\n\t\t</div>\n\t</div>\n</div>\n"
},] },
];
/** @nocollapse */
DataLangSelectorPane.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: DialogService, },
]; };
return DataLangSelectorPane;
}(AbstractComponentDataLangSelector));
export { DataLangSelectorPane };
function DataLangSelectorPane_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
DataLangSelectorPane.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
DataLangSelectorPane.ctorParameters;
/** @type {?} */
DataLangSelectorPane.TYPE_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.LANGUAGE_FIELD_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.OBJECT_ID_FIELD_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.model;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUxhbmdTZWxlY3RvclBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2VkaXRvci9EYXRhTGFuZ1NlbGVjdG9yUGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF5QixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBSXpGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUlsRSxxQkFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUM7QUFFbkQscUJBQU0sY0FBYyxHQUFXLG9CQUFvQixDQUFDOztJQXNEVixnREFBaUM7SUFRekUsOEJBQVksVUFBc0IsRUFBRSxhQUE0QjtRQUFoRSxZQUNFLGtCQUFNLFVBQVUsRUFBRSxhQUFhLENBQUMsU0FDakM7b0NBTnFDLFlBQVksQ0FBQywyQkFBMkI7cUNBQ3ZDLFlBQVksQ0FBQyw0QkFBNEI7O0tBSy9FOzs7O0lBRU0sdUNBQVE7Ozs7UUFDYixpQkFBTSxRQUFRLFdBQUUsQ0FBQzs7Ozs7SUFHWCx3Q0FBUzs7OztRQUNmLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pF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SSxPQUFPLFdBQVcsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDOztTQUVoRTs7Ozs7Ozs7SUFRSSxnREFBaUI7Ozs7O2NBQUMsV0FBZ0I7Ozs7Ozs7SUFJbEMsdURBQXdCOzs7O2NBQUMsUUFBZ0I7UUFDOUMsTUFBTSxDQUFDLElBQUksbUJBQW1CLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7cUNBL01iLFNBQVM7O2dCQXBEckQsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtvQkFDbkIsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLFFBQVEsRUFBRSxxeUVBNkNYO2lCQUNBOzs7O2dCQW5FMEMsVUFBVTtnQkFDNUMsYUFBYTs7K0JBRHRCO0VBb0UwQyxpQ0FBaUM7U0FBOUQsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL0RpYWxvZ1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdERhdGFFZGl0b3IgfSBmcm9tICcuL0Fic3RyYWN0RGF0YUVkaXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdENvbXBvbmVudERhdGFMYW5nU2VsZWN0b3IgfSBmcm9tICcuLi9BYnN0cmFjdENvbXBvbmVudERhdGFMYW5nU2VsZWN0b3InO1xuXG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi9JSGFzTW9kZWwnO1xuaW1wb3J0IHsgRGF0YUxhbmdTZWxlY3Rvck1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvRGF0YUxhbmdTZWxlY3Rvck1vZGVsJztcbmltcG9ydCB7IExhbmd1YWdlQnV0dG9uTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9MYW5ndWFnZUJ1dHRvbk1vZGVsJztcbmltcG9ydCB7IFBobG94QXBwSW5mbyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudC9tb2RlbC9QaGxveEFwcEluZm8nO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtZGF0YS1sYW5nLXNlbGVjdG9yXCI7XG5cbmNvbnN0IExBTkdfQlROX0NMSUNLOiBzdHJpbmcgPSAnbGFuZ3VhZ2VCdG5DbGlja2VkJztcblxuLy8gdXNlIG1hdGVyaWFsIERhdGFMYW5nU2VsZWN0b3JQYW5lIGluc3RhZGUgPz8gKFNob3VsZCB3ZSBkZWxldGUgdGhpcyBjb21wb25lbnQpXG4vLyB0cnkgdG8gZmluZCBpZiBubyBjb21wb25lbnQgdXNlXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWRhdGEtbGFuZy1zZWxlY3RvclwiPlxuXHQ8ZGl2IGNsYXNzPVwid3JhcHBlciBsZWZ0XCIgW2NsYXNzLmV4cGFuZF09XCIhaGFzTGFuZ3VhZ2UoKVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJjb21wb25lbnQtcGFuZVwiPlxuXHRcdFx0PCEtLSBkZWZhdWx0IC0tPlxuXHRcdFx0PGRpdiBjbGFzcz1cImNvbXBvbmVudC13cmFwcGVyXCIgW2NsYXNzLnNob3ddPVwiX2lzU2VsZWN0ZWRMYW5ndWFnZUJ5SW5kZXgobnVsbClcIj5cblx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciAqbmdJZj1cImhhc01vZGVsKClcIiBbdHlwZV09XCJnZXRNb2RlbCgpLnRhYkNvbXBvbmVudFR5cGVcIiBbbW9kZWxdPVwiZ2V0TW9kZWwoKS50YWJDb21wb25lbnRNb2RlbFwiXG5cdFx0XHRcdFx0W2hhbmRsZXJdPVwiZ2V0RGVmYXVsdENvbXBvbmVudEhhbmRsZXIoKVwiIFtkYXRhXT1cImdldERlZmF1bHREYXRhKClcIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDwhLS0gYnkgbGFuZyAtLT5cblx0XHRcdDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJfZ2V0RGF0YUxhbmdMaXN0KClcIiBsZXQtaT1cImluZGV4XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb21wb25lbnQtd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cIl9pc1NlbGVjdGVkTGFuZ3VhZ2VCeUluZGV4KGkpXCI+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cIml0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkXCI+XG5cdFx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyICpuZ0lmPVwiaGFzTW9kZWwoKVwiIFt0eXBlXT1cImdldE1vZGVsKCkudGFiQ29tcG9uZW50VHlwZVwiIFttb2RlbF09XCJnZXRNb2RlbCgpLnRhYkNvbXBvbmVudE1vZGVsXCJcblx0XHRcdFx0XHRcdFx0W2hhbmRsZXJdPVwiZ2V0Q29tcG9uZW50SGFuZGxlcigpXCIgW3NldHRpbmddPVwiZ2V0Q29tcG9uZW50U2V0dGluZyhpKVwiIFtkYXRhXT1cIml0ZW1cIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cIndyYXBwZXIgcmlnaHRcIiBbY2xhc3MuaGlkZV09XCIhaGFzTGFuZ3VhZ2UoKVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJsYW5nLXBhbmVcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1idG4gZGVmYXVsdCBkYXRhXCIgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWRMYW5ndWFnZShudWxsKVwiIFtjbGFzcy5kaXJ0eV09XCJfaXNEYXRhRGlydHlCeUluZGV4KG51bGwpXCJcblx0XHRcdFx0KGNsaWNrKT1cIm9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQsIG51bGwsIHVuZGVmaW5lZClcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXIgZmx1aWRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0XHRcdFx0RGVmYXVsdFxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNZXJnZWRMYW5ndWFnZUxpc3QoKTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibGFuZ3VhZ2UtYnRuXCIgW2NsYXNzLmRhdGFdPVwiX2xhbmdIYXNEYXRhQnlJbmRleChpKVwiXG5cdFx0XHRcdFtjbGFzcy5kaXJ0eV09XCJfaXNEYXRhRGlydHlCeUluZGV4KGkpXCJcblx0XHRcdFx0W2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWRMYW5ndWFnZShpdGVtKVwiIChjbGljayk9XCJvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50LCBpdGVtLCBpKVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIV9oYXNCdXR0b25JY29uKGl0ZW0pXCI+e3tpdGVtLmNvZGV9fTwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cIl9oYXNCdXR0b25JY29uKGl0ZW0pXCI+XG5cdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwie3tpdGVtLmljb25VUkx9fVwiPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibW9ja2luZy1idG5cIj48L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUxhbmdTZWxlY3RvclBhbmUgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudERhdGFMYW5nU2VsZWN0b3IgaW1wbGVtZW50cyBPbkluaXQsIElIYXNNb2RlbCB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcblxuICBwcml2YXRlIExBTkdVQUdFX0ZJRUxEX05BTUU6IHN0cmluZyA9IFBobG94QXBwSW5mby5ERUZBVUxUX0xBTkdVQUdFX0ZJRUxEX05BTUU7XG4gIHByaXZhdGUgT0JKRUNUX0lEX0ZJRUxEX05BTUU6IHN0cmluZyA9IFBobG94QXBwSW5mby5ERUZBVUxUX09CSkVDVF9JRF9GSUVMRF9OQU1FO1xuICBwcml2YXRlIG1vZGVsOiBEYXRhTGFuZ1NlbGVjdG9yTW9kZWw7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGRpYWxvZ1NlcnZpY2UpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBwcml2YXRlIGdldEVkaXRvcigpOiBBYnN0cmFjdERhdGFFZGl0b3Ige1xuICAgIGlmICh0aGlzLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLmRhdGEuZWRpdG9yICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEuZWRpdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmVkaXRvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFdyYXBEYXRhT2JqZWN0KGRhdGFPYmplY3Q6IGFueVtdKTogYW55IHtcbiAgICBsZXQgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3IoKTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgIGVkaXRvcjogZWRpdG9yLFxuICAgICAgb2JqZWN0czogZGF0YU9iamVjdFxuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGF0YSBhcyBhbnlcbiAgICogQHJldHVybiBhbnkgYXMgb25lIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0RGF0YSgpOiBhbnkge1xuICAgIGxldCBvYmplY3RzID0gbnVsbDtcblxuICAgIGlmICh0aGlzLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9iamVjdHMgPSB0aGlzLmRhdGEub2JqZWN0cztcbiAgICB9XG5cbiAgICBpZiAob2JqZWN0cyA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqZWN0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGxldCBsYW5nRmllbGROYW1lID0gbnVsbDtcbiAgICBpZiAoZWRpdG9yICE9PSBudWxsKSB7XG4gICAgICBsYW5nRmllbGROYW1lID0gZWRpdG9yLmdldExhbmd1YWdlRmllbGQoKTtcbiAgICB9XG4gICAgbGV0IG9uZU9iaiA9IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0cykpIHtcbiAgICAgIGxldCBtb3JlVGhhbk9uZURlZjogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgbGV0IGRlZk9iaiA9IG51bGw7XG4gICAgICBmb3IgKGxldCBvYmogb2Ygb2JqZWN0cykge1xuICAgICAgICBsZXQgbGFuZyA9IG9ialtsYW5nRmllbGROYW1lXTtcbiAgICAgICAgaWYgKGxhbmcgPT09IG51bGwgfHwgdHlwZW9mIGxhbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKGRlZk9iaiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZGVmT2JqID0gb2JqO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb3JlVGhhbk9uZURlZiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFtb3JlVGhhbk9uZURlZiAmJiBkZWZPYmogIT09IG51bGwgJiYgdHlwZW9mIGRlZk9iaiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb25lT2JqID0gZGVmT2JqO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob2JqZWN0c1tsYW5nRmllbGROYW1lXSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqZWN0c1tsYW5nRmllbGROYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb25lT2JqID0gb2JqZWN0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb25lT2JqO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldERhdGFPYmplY3RzKCk6IGFueVtdIHtcbiAgICBsZXQgb2JqZWN0cyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvYmplY3RzID0gdGhpcy5kYXRhLm9iamVjdHM7XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdHMgPT09IG51bGwgfHwgdHlwZW9mIG9iamVjdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfVxuXG4gIHB1YmxpYyBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNb2RlbChtb2RlbDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICB9XG5cbiAgcHVibGljIGdldExhbmd1YWdlRmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgbGV0IGxhbmdGaWVsZE5hbWUgPSAoZWRpdG9yID09PSBudWxsKSA/IG51bGwgOiBlZGl0b3IuZ2V0TGFuZ3VhZ2VGaWVsZCgpO1xuXG4gICAgaWYgKGxhbmdGaWVsZE5hbWUgIT09IG51bGwgJiYgdHlwZW9mIGxhbmdGaWVsZE5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbGFuZ0ZpZWxkTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5MQU5HVUFHRV9GSUVMRF9OQU1FO1xuICB9XG5cbiAgcHVibGljIGdldE9iamVjdElkRmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgbGV0IG9iaklkRmllbGROYW1lID0gKGVkaXRvciA9PT0gbnVsbCkgPyBudWxsIDogZWRpdG9yLmdldE9iamVjdElkRmllbGQoKTtcbiAgICBpZiAob2JqSWRGaWVsZE5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG9iaklkRmllbGROYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG9iaklkRmllbGROYW1lO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLk9CSkVDVF9JRF9GSUVMRF9OQU1FO1xuICB9XG5cbiAgcHVibGljIGdldEluc3RhbmNlRGVmYXVsdERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcmFwRGF0YU9iamVjdChbZGF0YV0pO1xuICB9XG5cbiAgcHVibGljIGdldEluc3RhbmNlRGF0YUxhbmd1YWdlKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JhcERhdGFPYmplY3QoW2RhdGFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGF0YSBhcyBhbnlcbiAgICogQHJldHVybiBhbnkgYXMgb2JqZWN0IGluIHBhdHRlcm4ge2ljb25VUkw6IHN0cmluZywgY29kZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nfVxuICAgKi9cbiAgcHVibGljIGdldExhbmd1YWdlTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG5cbiAgICBsZXQgbGFuZ3VhZ2VMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChlZGl0b3IgIT09IG51bGwpIHtcbiAgICAgIGxldCBzZXR0aW5nID0gZWRpdG9yLmdldEFwcFNldHRpbmcoKTtcblxuICAgICAgaWYgKHNldHRpbmcgIT09IG51bGwgJiYgdHlwZW9mIHNldHRpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCBkZWZhdWx0TGFuZ3MgPSBzZXR0aW5nLkRFRkFVTFRfREFUQV9MQU5HVUFHRVM7XG4gICAgICAgIGlmIChkZWZhdWx0TGFuZ3MgIT09IG51bGwgJiYgdHlwZW9mIGRlZmF1bHRMYW5ncyAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShkZWZhdWx0TGFuZ3MpKSB7XG4gICAgICAgICAgZm9yIChsZXQgbGFuZyBvZiBkZWZhdWx0TGFuZ3MpIHtcbiAgICAgICAgICAgIGxhbmd1YWdlTGlzdC5wdXNoKGxhbmcuY29kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbmd1YWdlTGlzdDtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkRGF0YUxhbmd1YWdlTGlzdChkZWZhdWx0RGF0YTogYW55KTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3IoKTtcbiAgICAgIGlmIChlZGl0b3IgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IGxhbmdQcm9tID0gZWRpdG9yLmdldExhbmd1YWdlTGlzdChkZWZhdWx0RGF0YSk7XG4gICAgICAgIGlmIChsYW5nUHJvbSAhPT0gbnVsbCAmJiB0eXBlb2YgbGFuZ1Byb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbGFuZ1Byb20udGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBsZXQgdGVtcEFycmF5ID0gW107XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQXJyYXkgPSByZXN1bHQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSh0ZW1wQXJyYXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB3aGVuIG5ldyBsYW5ndWFnZSB3YXMgY3JlYXRlZCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZFxuICAgKiBAcGFyYW0gbmV3TGFuZ0RhdGEgYXMgYW55XG4gICAqL1xuICBwdWJsaWMgb25MYW5ndWFnZUFkZGVkKG5ld0xhbmdEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAobmV3TGFuZ0RhdGEgIT09IG51bGwgJiYgdHlwZW9mIG5ld0xhbmdEYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZG8gc3RoIGhlcmVcbiAgICB9XG4gICAgLy8gICAgICAgIHRoaXMuZGF0YS5vYmplY3RzLnB1c2gobmV3TGFuZ0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICogd2hlbiBsYW5ndWFnZSB3YXMgcmVtb3ZlZCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZFxuICAqIEBwYXJhbSBkZWxldGVkRGF0YSBhcyBhbnlcbiAgKi9cbiAgcHVibGljIG9uTGFuZ3VhZ2VSZW1vdmVkKGRlbGV0ZWREYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBkbyBzdGhcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUxhbmd1YWdlQnV0dG9uTW9kZWwobGFuZ0NvZGU6IHN0cmluZyk6IExhbmd1YWdlQnV0dG9uTW9kZWwge1xuICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VCdXR0b25Nb2RlbCgnJywgbGFuZ0NvZGUsICdsYWJlbCcpO1xuICB9XG59XG4iXX0=