UNPKG

io.parrots

Version:

Parrots.io App

353 lines (352 loc) 33.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef } from '@angular/core'; import { LanguageButtonModel, PhloxAppInfo, DialogService, AbstractComponentDataLangSelector } from 'com.phloxui'; var /** @type {?} */ TYPE_NAME = "parrots-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=\"parrots-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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUxhbmdTZWxlY3RvclBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaW8ucGFycm90cy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZWRpdG9yL2VkaXRvci5pbnRlcm5hbC9EYXRhTGFuZ1NlbGVjdG9yUGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF5QixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0UsT0FBTyxFQUFvQyxtQkFBbUIsRUFDN0QsWUFBWSxFQUFFLGFBQWEsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQU1yRixxQkFBTSxTQUFTLEdBQVcsNEJBQTRCLENBQUM7QUFFdkQscUJBQU0sY0FBYyxHQUFXLG9CQUFvQixDQUFDOztJQXNEVixnREFBaUM7SUFRekUsOEJBQVksVUFBc0IsRUFBRSxhQUE0QjtRQUFoRSxZQUNFLGtCQUFNLFVBQVUsRUFBRSxhQUFhLENBQUMsU0FDakM7b0NBTnFDLFlBQVksQ0FBQywyQkFBMkI7cUNBQ3ZDLFlBQVksQ0FBQyw0QkFBNEI7O0tBSy9FOzs7O0lBRU0sdUNBQVE7Ozs7UUFDYixpQkFBTSxRQUFRLFdBQUUsQ0FBQzs7Ozs7SUFHWCx3Q0FBUzs7OztRQUNmLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN6QjtTQUNGO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQzs7Ozs7O0lB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QXdCOzs7O2NBQUMsUUFBZ0I7UUFDOUMsTUFBTSxDQUFDLElBQUksbUJBQW1CLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7cUNBL01iLFNBQVM7O2dCQXBEckQsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtvQkFDbkIsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLFFBQVEsRUFBRSx5eUVBNkNYO2lCQUNBOzs7O2dCQWhFMEMsVUFBVTtnQkFHdEMsYUFBYTs7K0JBSDVCO0VBaUUwQyxpQ0FBaUM7U0FBOUQsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSUhhc01vZGVsLCBEYXRhTGFuZ1NlbGVjdG9yTW9kZWwsIExhbmd1YWdlQnV0dG9uTW9kZWwsXG4gUGhsb3hBcHBJbmZvLCBEaWFsb2dTZXJ2aWNlLCBBYnN0cmFjdENvbXBvbmVudERhdGFMYW5nU2VsZWN0b3IgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBBYnN0cmFjdFBhcnJvdHNEYXRhRWRpdG9yIH0gZnJvbSAnLi4vQWJzdHJhY3RQYXJyb3RzRGF0YUVkaXRvcic7XG5cblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGFycm90cy1kYXRhLWxhbmctc2VsZWN0b3JcIjtcblxuY29uc3QgTEFOR19CVE5fQ0xJQ0s6IHN0cmluZyA9ICdsYW5ndWFnZUJ0bkNsaWNrZWQnO1xuXG4vLyB1c2UgbWF0ZXJpYWwgRGF0YUxhbmdTZWxlY3RvclBhbmUgaW5zdGFkZSA/PyAoU2hvdWxkIHdlIGRlbGV0ZSB0aGlzIGNvbXBvbmVudClcbi8vIHRyeSB0byBmaW5kIGlmIG5vIGNvbXBvbmVudCB1c2VcbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwYXJyb3RzLWRhdGEtbGFuZy1zZWxlY3RvclwiPlxuXHQ8ZGl2IGNsYXNzPVwid3JhcHBlciBsZWZ0XCIgW2NsYXNzLmV4cGFuZF09XCIhaGFzTGFuZ3VhZ2UoKVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJjb21wb25lbnQtcGFuZVwiPlxuXHRcdFx0PCEtLSBkZWZhdWx0IC0tPlxuXHRcdFx0PGRpdiBjbGFzcz1cImNvbXBvbmVudC13cmFwcGVyXCIgW2NsYXNzLnNob3ddPVwiX2lzU2VsZWN0ZWRMYW5ndWFnZUJ5SW5kZXgobnVsbClcIj5cblx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciAqbmdJZj1cImhhc01vZGVsKClcIiBbdHlwZV09XCJnZXRNb2RlbCgpLnRhYkNvbXBvbmVudFR5cGVcIiBbbW9kZWxdPVwiZ2V0TW9kZWwoKS50YWJDb21wb25lbnRNb2RlbFwiXG5cdFx0XHRcdFx0W2hhbmRsZXJdPVwiZ2V0RGVmYXVsdENvbXBvbmVudEhhbmRsZXIoKVwiIFtkYXRhXT1cImdldERlZmF1bHREYXRhKClcIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDwhLS0gYnkgbGFuZyAtLT5cblx0XHRcdDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJfZ2V0RGF0YUxhbmdMaXN0KClcIiBsZXQtaT1cImluZGV4XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb21wb25lbnQtd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cIl9pc1NlbGVjdGVkTGFuZ3VhZ2VCeUluZGV4KGkpXCI+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cIml0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkXCI+XG5cdFx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyICpuZ0lmPVwiaGFzTW9kZWwoKVwiIFt0eXBlXT1cImdldE1vZGVsKCkudGFiQ29tcG9uZW50VHlwZVwiIFttb2RlbF09XCJnZXRNb2RlbCgpLnRhYkNvbXBvbmVudE1vZGVsXCJcblx0XHRcdFx0XHRcdFx0W2hhbmRsZXJdPVwiZ2V0Q29tcG9uZW50SGFuZGxlcigpXCIgW3NldHRpbmddPVwiZ2V0Q29tcG9uZW50U2V0dGluZyhpKVwiIFtkYXRhXT1cIml0ZW1cIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cIndyYXBwZXIgcmlnaHRcIiBbY2xhc3MuaGlkZV09XCIhaGFzTGFuZ3VhZ2UoKVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJsYW5nLXBhbmVcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1idG4gZGVmYXVsdCBkYXRhXCIgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWRMYW5ndWFnZShudWxsKVwiIFtjbGFzcy5kaXJ0eV09XCJfaXNEYXRhRGlydHlCeUluZGV4KG51bGwpXCJcblx0XHRcdFx0KGNsaWNrKT1cIm9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQsIG51bGwsIHVuZGVmaW5lZClcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXIgZmx1aWRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0XHRcdFx0RGVmYXVsdFxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNZXJnZWRMYW5ndWFnZUxpc3QoKTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibGFuZ3VhZ2UtYnRuXCIgW2NsYXNzLmRhdGFdPVwiX2xhbmdIYXNEYXRhQnlJbmRleChpKVwiXG5cdFx0XHRcdFtjbGFzcy5kaXJ0eV09XCJfaXNEYXRhRGlydHlCeUluZGV4KGkpXCJcblx0XHRcdFx0W2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWRMYW5ndWFnZShpdGVtKVwiIChjbGljayk9XCJvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50LCBpdGVtLCBpKVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIV9oYXNCdXR0b25JY29uKGl0ZW0pXCI+e3tpdGVtLmNvZGV9fTwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cIl9oYXNCdXR0b25JY29uKGl0ZW0pXCI+XG5cdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwie3tpdGVtLmljb25VUkx9fVwiPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibW9ja2luZy1idG5cIj48L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUxhbmdTZWxlY3RvclBhbmUgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudERhdGFMYW5nU2VsZWN0b3IgaW1wbGVtZW50cyBPbkluaXQsIElIYXNNb2RlbCB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcblxuICBwcml2YXRlIExBTkdVQUdFX0ZJRUxEX05BTUU6IHN0cmluZyA9IFBobG94QXBwSW5mby5ERUZBVUxUX0xBTkdVQUdFX0ZJRUxEX05BTUU7XG4gIHByaXZhdGUgT0JKRUNUX0lEX0ZJRUxEX05BTUU6IHN0cmluZyA9IFBobG94QXBwSW5mby5ERUZBVUxUX09CSkVDVF9JRF9GSUVMRF9OQU1FO1xuICBwcml2YXRlIG1vZGVsOiBEYXRhTGFuZ1NlbGVjdG9yTW9kZWw7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGRpYWxvZ1NlcnZpY2UpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBwcml2YXRlIGdldEVkaXRvcigpOiBBYnN0cmFjdFBhcnJvdHNEYXRhRWRpdG9yIHtcbiAgICBpZiAodGhpcy5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5kYXRhLmVkaXRvciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5kYXRhLmVkaXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5lZGl0b3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXcmFwRGF0YU9iamVjdChkYXRhT2JqZWN0OiBhbnlbXSk6IGFueSB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICBlZGl0b3I6IGVkaXRvcixcbiAgICAgIG9iamVjdHM6IGRhdGFPYmplY3RcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGRhdGEgYXMgYW55XG4gICAqIEByZXR1cm4gYW55IGFzIG9uZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdERhdGEoKTogYW55IHtcbiAgICBsZXQgb2JqZWN0cyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvYmplY3RzID0gdGhpcy5kYXRhLm9iamVjdHM7XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdHMgPT09IG51bGwgfHwgdHlwZW9mIG9iamVjdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3IoKTtcbiAgICBsZXQgbGFuZ0ZpZWxkTmFtZSA9IG51bGw7XG4gICAgaWYgKGVkaXRvciAhPT0gbnVsbCkge1xuICAgICAgbGFuZ0ZpZWxkTmFtZSA9IGVkaXRvci5nZXRMYW5ndWFnZUZpZWxkKCk7XG4gICAgfVxuICAgIGxldCBvbmVPYmogPSBudWxsO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdHMpKSB7XG4gICAgICBsZXQgbW9yZVRoYW5PbmVEZWY6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGxldCBkZWZPYmogPSBudWxsO1xuICAgICAgZm9yIChsZXQgb2JqIG9mIG9iamVjdHMpIHtcbiAgICAgICAgbGV0IGxhbmcgPSBvYmpbbGFuZ0ZpZWxkTmFtZV07XG4gICAgICAgIGlmIChsYW5nID09PSBudWxsIHx8IHR5cGVvZiBsYW5nID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChkZWZPYmogPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlZk9iaiA9IG9iajtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW9yZVRoYW5PbmVEZWYgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghbW9yZVRoYW5PbmVEZWYgJiYgZGVmT2JqICE9PSBudWxsICYmIHR5cGVvZiBkZWZPYmogIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9uZU9iaiA9IGRlZk9iajtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9iamVjdHNbbGFuZ0ZpZWxkTmFtZV0gPT09IG51bGwgfHwgdHlwZW9mIG9iamVjdHNbbGFuZ0ZpZWxkTmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9uZU9iaiA9IG9iamVjdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9uZU9iajtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhT2JqZWN0cygpOiBhbnlbXSB7XG4gICAgbGV0IG9iamVjdHMgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgb2JqZWN0cyA9IHRoaXMuZGF0YS5vYmplY3RzO1xuICAgIH1cblxuICAgIGlmIChvYmplY3RzID09PSBudWxsIHx8IHR5cGVvZiBvYmplY3RzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cblxuICBwdWJsaWMgaGFzTW9kZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYW5ndWFnZUZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGxldCBsYW5nRmllbGROYW1lID0gKGVkaXRvciA9PT0gbnVsbCkgPyBudWxsIDogZWRpdG9yLmdldExhbmd1YWdlRmllbGQoKTtcblxuICAgIGlmIChsYW5nRmllbGROYW1lICE9PSBudWxsICYmIHR5cGVvZiBsYW5nRmllbGROYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGxhbmdGaWVsZE5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuTEFOR1VBR0VfRklFTERfTkFNRTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPYmplY3RJZEZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGxldCBvYmpJZEZpZWxkTmFtZSA9IChlZGl0b3IgPT09IG51bGwpID8gbnVsbCA6IGVkaXRvci5nZXRPYmplY3RJZEZpZWxkKCk7XG4gICAgaWYgKG9iaklkRmllbGROYW1lICE9PSBudWxsICYmIHR5cGVvZiBvYmpJZEZpZWxkTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBvYmpJZEZpZWxkTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5PQkpFQ1RfSURfRklFTERfTkFNRTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbnN0YW5jZURlZmF1bHREYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JhcERhdGFPYmplY3QoW2RhdGFdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbnN0YW5jZURhdGFMYW5ndWFnZShkYXRhOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFdyYXBEYXRhT2JqZWN0KFtkYXRhXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGRhdGEgYXMgYW55XG4gICAqIEByZXR1cm4gYW55IGFzIG9iamVjdCBpbiBwYXR0ZXJuIHtpY29uVVJMOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgbGFiZWw6IHN0cmluZ31cbiAgICovXG4gIHB1YmxpYyBnZXRMYW5ndWFnZUxpc3QoKTogc3RyaW5nW10ge1xuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuXG4gICAgbGV0IGxhbmd1YWdlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoZWRpdG9yICE9PSBudWxsKSB7XG4gICAgICBsZXQgc2V0dGluZyA9IGVkaXRvci5nZXRBcHBTZXR0aW5nKCk7XG5cbiAgICAgIGlmIChzZXR0aW5nICE9PSBudWxsICYmIHR5cGVvZiBzZXR0aW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgZGVmYXVsdExhbmdzID0gc2V0dGluZy5ERUZBVUxUX0RBVEFfTEFOR1VBR0VTO1xuICAgICAgICBpZiAoZGVmYXVsdExhbmdzICE9PSBudWxsICYmIHR5cGVvZiBkZWZhdWx0TGFuZ3MgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdExhbmdzKSkge1xuICAgICAgICAgIGZvciAobGV0IGxhbmcgb2YgZGVmYXVsdExhbmdzKSB7XG4gICAgICAgICAgICBsYW5ndWFnZUxpc3QucHVzaChsYW5nLmNvZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYW5ndWFnZUxpc3Q7XG4gIH1cblxuICBwdWJsaWMgbG9hZERhdGFMYW5ndWFnZUxpc3QoZGVmYXVsdERhdGE6IGFueSk6IFByb21pc2U8YW55W10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgICBpZiAoZWRpdG9yICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBsYW5nUHJvbSA9IGVkaXRvci5nZXRMYW5ndWFnZUxpc3QoZGVmYXVsdERhdGEpO1xuICAgICAgICBpZiAobGFuZ1Byb20gIT09IG51bGwgJiYgdHlwZW9mIGxhbmdQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxhbmdQcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRlbXBBcnJheSA9IFtdO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5ID0gcmVzdWx0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheS5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUodGVtcEFycmF5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogd2hlbiBuZXcgbGFuZ3VhZ2Ugd2FzIGNyZWF0ZWQgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWRcbiAgICogQHBhcmFtIG5ld0xhbmdEYXRhIGFzIGFueVxuICAgKi9cbiAgcHVibGljIG9uTGFuZ3VhZ2VBZGRlZChuZXdMYW5nRGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKG5ld0xhbmdEYXRhICE9PSBudWxsICYmIHR5cGVvZiBuZXdMYW5nRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGRvIHN0aCBoZXJlXG4gICAgfVxuICAgIC8vICAgICAgICB0aGlzLmRhdGEub2JqZWN0cy5wdXNoKG5ld0xhbmdEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAqIHdoZW4gbGFuZ3VhZ2Ugd2FzIHJlbW92ZWQgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWRcbiAgKiBAcGFyYW0gZGVsZXRlZERhdGEgYXMgYW55XG4gICovXG4gIHB1YmxpYyBvbkxhbmd1YWdlUmVtb3ZlZChkZWxldGVkRGF0YTogYW55KTogdm9pZCB7XG4gICAgLy8gZG8gc3RoXG4gIH1cblxuICBwdWJsaWMgcGFyc2VMYW5ndWFnZUJ1dHRvbk1vZGVsKGxhbmdDb2RlOiBzdHJpbmcpOiBMYW5ndWFnZUJ1dHRvbk1vZGVsIHtcbiAgICByZXR1cm4gbmV3IExhbmd1YWdlQnV0dG9uTW9kZWwoJycsIGxhbmdDb2RlLCAnbGFiZWwnKTtcbiAgfVxufVxuIl19