@universis/common
Version:
Universis - common directives and services
185 lines (184 loc) • 18.2 kB
JavaScript
import * as tslib_1 from "tslib";
import { Component, Input, ElementRef } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import * as jQuery from 'jquery';
const $ = jQuery;
import 'bootstrap/js/dist/modal';
export var DIALOG_BUTTONS;
(function (DIALOG_BUTTONS) {
DIALOG_BUTTONS[DIALOG_BUTTONS["Ok"] = 1] = "Ok";
DIALOG_BUTTONS[DIALOG_BUTTONS["Yes"] = 2] = "Yes";
DIALOG_BUTTONS[DIALOG_BUTTONS["No"] = 4] = "No";
DIALOG_BUTTONS[DIALOG_BUTTONS["Abort"] = 8] = "Abort";
DIALOG_BUTTONS[DIALOG_BUTTONS["Retry"] = 16] = "Retry";
DIALOG_BUTTONS[DIALOG_BUTTONS["Ignore"] = 32] = "Ignore";
DIALOG_BUTTONS[DIALOG_BUTTONS["Cancel"] = 64] = "Cancel";
DIALOG_BUTTONS[DIALOG_BUTTONS["YesNo"] = 6] = "YesNo";
DIALOG_BUTTONS[DIALOG_BUTTONS["AbortRetryIgnore"] = 54] = "AbortRetryIgnore";
DIALOG_BUTTONS[DIALOG_BUTTONS["OkCancel"] = 65] = "OkCancel";
DIALOG_BUTTONS[DIALOG_BUTTONS["YesNoCancel"] = 70] = "YesNoCancel";
})(DIALOG_BUTTONS || (DIALOG_BUTTONS = {}));
/**
*
* A modal dialog component with ok and cancel buttons
* @export
* @class DialogComponent
*/
export class DialogComponent {
constructor(_element, _translateService) {
this._element = _element;
this._translateService = _translateService;
this.buttons = DIALOG_BUTTONS.Ok;
this.language = 'en';
this.language = this._translateService.currentLang;
}
bitwiseAnd(a, b) {
return a & b;
}
/**
* Shows modal dialog
* @returns Promise<any>
*/
show() {
return new Promise((resolve, reject) => {
if (this.modalRef) {
this.modalRef.one('hide.bs.modal', (event) => {
// get related target if any
const result = this.modalRef.data('result');
// return result
return resolve(result);
});
this.modalRef.modal('show');
}
else {
reject('Modal element may not be empty at this context');
}
});
}
/**
* Hides modal dialog
* @param value
*/
hide(value) {
this.modalRef.data('result', value);
this.modalRef.modal('hide');
}
/**
* Converts modal buttons classes modal-ok, modal-yes-no etc to dialog buttons
* @param {Array<string>} classList
*/
classListToButtons(classList) {
return classList.map(classListElement => {
// maps each item to an array of matches (if match)
return /^modal(-ok)?(-yes)?(-no)?(-abort)?(-retry)?(-ignore)?(-cancel)?/ig.exec(classListElement);
}).filter(match => {
// filter not matched elements
return match != null;
}).map(match => {
// maps each match as an array of 2 ^ k results
return match.map((item, k) => {
if (item && k > 0) {
return Math.pow(2, k - 1);
}
return 0;
}).reduce((a, b) => {
// return a sum of results
return a + b;
});
}).reduce((a, b) => {
// return a final sum of results
return a | b;
});
}
ngOnInit() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
// get element classes
const classList = Array.from(this._element.nativeElement.classList);
// get buttons from element class list
const classListButtons = this.classListToButtons(classList);
// if element has button classes (modal-ok, modal-yes-no etc)
if (classListButtons) {
// set dialog buttons
this.buttons = classListButtons;
}
this.modalRef = $(this._element.nativeElement);
// initialize modal
this.modalRef.modal({
backdrop: 'static',
focus: true,
keyboard: false,
show: false
});
});
}
}
DialogComponent.decorators = [
{ type: Component, args: [{
selector: 'universis-dialog.modal',
template: `
<div class="modal-dialog" [ngClass]="theme" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{title | translate}}</h4>
</div>
<div class="modal-body" [innerHTML]="message"></div>
<div class="modal-footer">
<button [lang]="language" type="button" *ngIf="bitwiseAnd(buttons, 1)"
(click)="hide('ok')" class="btn btn-theme btn-ok" [translate]="'OK'"></button>
<button [lang]="language" type="button" *ngIf="bitwiseAnd(buttons, 2)"
(click)="hide('yes')" class="btn btn-theme btn-yes" [translate]="'Yes'"></button>
<button [lang]="language" type="button" *ngIf="bitwiseAnd(buttons, 4)"
(click)="hide('no')" class="btn btn-gray-100 btn-no" [translate]="'No'"></button>
<button [lang]="language" type="button" *ngIf="bitwiseAnd(buttons, 8)"
(click)="hide('abort')" class="btn btn-danger btn-abort" [translate]="'Abort'"></button>
<button [lang]="language" type="button" *ngIf="bitwiseAnd(buttons, 16)"
(click)="hide('retry')" class="btn btn-gray-100 btn-retry" [translate]="'Retry'"></button>
<button [lang]="language" type="button" *ngIf="bitwiseAnd(buttons, 32)"
(click)="hide('ignore')" class="btn btn-gray-100 btn-ignore" [translate]="'Ignore'"></button>
<button [lang]="language" type="button" *ngIf="bitwiseAnd(buttons, 64)"
(click)="hide('cancel')" class="btn btn-gray-100 btn-cancel" [translate]="'Cancel'"></button>
</div>
</div>
</div>
`,
styles: [`
.modal-dialog .modal-body {
margin-top: 0;
margin-bottom: 0;
}
.modal-footer {
border-top: 0;
}
.modal-ok {
//
}
.modal-ok-cancel {
//
}
.modal-yes-no {
//
}
.modal-yes-no-cancel {
//
}
.modal-abort-ignore-retry {
//
}
.btn {
text-transform: uppercase;
font-size: 16px;
}
`]
}] }
];
/** @nocollapse */
DialogComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: TranslateService }
];
DialogComponent.propDecorators = {
title: [{ type: Input }],
message: [{ type: Input }],
theme: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvY29tbW9uLyIsInNvdXJjZXMiOlsic2hhcmVkL2NvbXBvbmVudHMvbW9kYWwvZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBVSxLQUFLLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNqQixPQUFPLHlCQUF5QixDQUFDO0FBQ2pDLE1BQU0sQ0FBTixJQUFZLGNBWVg7QUFaRCxXQUFZLGNBQWM7SUFDeEIsK0NBQU0sQ0FBQTtJQUNOLGlEQUFPLENBQUE7SUFDUCwrQ0FBTSxDQUFBO0lBQ04scURBQVMsQ0FBQTtJQUNULHNEQUFVLENBQUE7SUFDVix3REFBVyxDQUFBO0lBQ1gsd0RBQVcsQ0FBQTtJQUNYLHFEQUFTLENBQUE7SUFDVCw0RUFBcUIsQ0FBQTtJQUNyQiw0REFBYSxDQUFBO0lBQ2Isa0VBQWdCLENBQUE7QUFDbEIsQ0FBQyxFQVpXLGNBQWMsS0FBZCxjQUFjLFFBWXpCO0FBNEREOzs7OztHQUtHO0FBQ0gsTUFBTTtJQVVKLFlBQW9CLFFBQW9CLEVBQVUsaUJBQW1DO1FBQWpFLGFBQVEsR0FBUixRQUFRLENBQVk7UUFBVSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBSjlFLFlBQU8sR0FBbUIsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUU1QyxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBR3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztJQUNyRCxDQUFDO0lBRU0sVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8s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LFFBQVEsRUFBRSxRQUFRO2dCQUNsQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxRQUFRLEVBQUUsS0FBSztnQkFDZixJQUFJLEVBQUUsS0FBSzthQUNaLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTs7O1lBN0pGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQThCbEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJUO3lCQXREUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJSO2FBNEJGOzs7O1lBNUVpQyxVQUFVO1lBQ3BDLGdCQUFnQjs7O29CQXFGckIsS0FBSztzQkFDTCxLQUFLO29CQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRWxlbWVudFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0ICogYXMgalF1ZXJ5IGZyb20gJ2pxdWVyeSc7XG5jb25zdCAkID0galF1ZXJ5O1xuaW1wb3J0ICdib290c3RyYXAvanMvZGlzdC9tb2RhbCc7XG5leHBvcnQgZW51bSBESUFMT0dfQlVUVE9OUyB7XG4gIE9rID0gMSxcbiAgWWVzID0gMixcbiAgTm8gPSA0LFxuICBBYm9ydCA9IDgsXG4gIFJldHJ5ID0gMTYsXG4gIElnbm9yZSA9IDMyLFxuICBDYW5jZWwgPSA2NCxcbiAgWWVzTm8gPSA2LFxuICBBYm9ydFJldHJ5SWdub3JlID0gNTQsXG4gIE9rQ2FuY2VsID0gNjUsXG4gIFllc05vQ2FuY2VsID0gNzBcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndW5pdmVyc2lzLWRpYWxvZy5tb2RhbCcsXG4gIHN0eWxlczogW2BcbiAgICAubW9kYWwtZGlhbG9nIC5tb2RhbC1ib2R5IHtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICAgIC5tb2RhbC1mb290ZXIge1xuICAgICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgfVxuICAgICAgLm1vZGFsLW9rIHtcbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIC5tb2RhbC1vay1jYW5jZWwge1xuICAgICAgICAvL1xuICAgICAgfVxuICAgICAgLm1vZGFsLXllcy1ubyB7XG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICAubW9kYWwteWVzLW5vLWNhbmNlbCB7XG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICAubW9kYWwtYWJvcnQtaWdub3JlLXJldHJ5IHtcbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIC5idG4ge1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICB9XG4gIGBcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCIgW25nQ2xhc3NdPVwidGhlbWVcIiByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPnt7dGl0bGUgfCB0cmFuc2xhdGV9fTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIFtpbm5lckhUTUxdPVwibWVzc2FnZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBbbGFuZ109XCJsYW5ndWFnZVwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImJpdHdpc2VBbmQoYnV0dG9ucywgMSlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhpZGUoJ29rJylcIiBjbGFzcz1cImJ0biBidG4tdGhlbWUgYnRuLW9rXCIgW3RyYW5zbGF0ZV09XCInT0snXCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBbbGFuZ109XCJsYW5ndWFnZVwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImJpdHdpc2VBbmQoYnV0dG9ucywgMilcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhpZGUoJ3llcycpXCIgY2xhc3M9XCJidG4gYnRuLXRoZW1lIGJ0bi15ZXNcIiBbdHJhbnNsYXRlXT1cIidZZXMnXCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBbbGFuZ109XCJsYW5ndWFnZVwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImJpdHdpc2VBbmQoYnV0dG9ucywgNClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhpZGUoJ25vJylcIiBjbGFzcz1cImJ0biBidG4tZ3JheS0xMDAgYnRuLW5vXCIgW3RyYW5zbGF0ZV09XCInTm8nXCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBbbGFuZ109XCJsYW5ndWFnZVwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImJpdHdpc2VBbmQoYnV0dG9ucywgOClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhpZGUoJ2Fib3J0JylcIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyIGJ0bi1hYm9ydFwiIFt0cmFuc2xhdGVdPVwiJ0Fib3J0J1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gW2xhbmddPVwibGFuZ3VhZ2VcIiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJiaXR3aXNlQW5kKGJ1dHRvbnMsIDE2KVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGlkZSgncmV0cnknKVwiIGNsYXNzPVwiYnRuIGJ0bi1ncmF5LTEwMCBidG4tcmV0cnlcIiBbdHJhbnNsYXRlXT1cIidSZXRyeSdcIj48L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIFtsYW5nXT1cImxhbmd1YWdlXCIgdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiYml0d2lzZUFuZChidXR0b25zLCAzMilcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhpZGUoJ2lnbm9yZScpXCIgY2xhc3M9XCJidG4gYnRuLWdyYXktMTAwIGJ0bi1pZ25vcmVcIiBbdHJhbnNsYXRlXT1cIidJZ25vcmUnXCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBbbGFuZ109XCJsYW5ndWFnZVwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImJpdHdpc2VBbmQoYnV0dG9ucywgNjQpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoaWRlKCdjYW5jZWwnKVwiICBjbGFzcz1cImJ0biBidG4tZ3JheS0xMDAgYnRuLWNhbmNlbFwiIFt0cmFuc2xhdGVdPVwiJ0NhbmNlbCdcIj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbi8qKlxuICpcbiAqIEEgbW9kYWwgZGlhbG9nIGNvbXBvbmVudCB3aXRoIG9rIGFuZCBjYW5jZWwgYnV0dG9uc1xuICogQGV4cG9ydFxuICogQGNsYXNzIERpYWxvZ0NvbXBvbmVudFxuICovXG5leHBvcnQgY2xhc3MgRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1lc3NhZ2U6IHN0cmluZztcbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZztcbiAgcHVibGljIGJ1dHRvbnM6IERJQUxPR19CVVRUT05TID0gRElBTE9HX0JVVFRPTlMuT2s7XG4gIHByaXZhdGUgbW9kYWxSZWY6IGFueTtcbiAgcHVibGljIGxhbmd1YWdlID0gJ2VuJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XG4gICAgdGhpcy5sYW5ndWFnZSA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmc7XG4gIH1cblxuICBwdWJsaWMgYml0d2lzZUFuZChhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiBiO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIG1vZGFsIGRpYWxvZ1xuICAgKiBAcmV0dXJucyBQcm9taXNlPGFueT5cbiAgICovXG4gIHNob3coKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgICAgICB0aGlzLm1vZGFsUmVmLm9uZSgnaGlkZS5icy5tb2RhbCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gZ2V0IHJlbGF0ZWQgdGFyZ2V0IGlmIGFueVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tb2RhbFJlZi5kYXRhKCdyZXN1bHQnKTtcbiAgICAgICAgICAgIC8vIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5tb2RhbFJlZi5tb2RhbCgnc2hvdycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCgnTW9kYWwgZWxlbWVudCBtYXkgbm90IGJlIGVtcHR5IGF0IHRoaXMgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgbW9kYWwgZGlhbG9nXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgaGlkZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5tb2RhbFJlZi5kYXRhKCdyZXN1bHQnLCB2YWx1ZSk7XG4gICAgdGhpcy5tb2RhbFJlZi5tb2RhbCgnaGlkZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIG1vZGFsIGJ1dHRvbnMgY2xhc3NlcyBtb2RhbC1vaywgbW9kYWwteWVzLW5vIGV0YyB0byBkaWFsb2cgYnV0dG9uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNsYXNzTGlzdFxuICAgKi9cbiAgcHJpdmF0ZSBjbGFzc0xpc3RUb0J1dHRvbnMoY2xhc3NMaXN0OiBBcnJheTxzdHJpbmc+KSB7XG4gICAgcmV0dXJuIGNsYXNzTGlzdC5tYXAoIGNsYXNzTGlzdEVsZW1lbnQgPT4ge1xuICAgICAgLy8gbWFwcyBlYWNoIGl0ZW0gdG8gYW4gYXJyYXkgb2YgbWF0Y2hlcyAoaWYgbWF0Y2gpXG4gICAgICByZXR1cm4gL15tb2RhbCgtb2spPygteWVzKT8oLW5vKT8oLWFib3J0KT8oLXJldHJ5KT8oLWlnbm9yZSk/KC1jYW5jZWwpPy9pZy5leGVjKGNsYXNzTGlzdEVsZW1lbnQpO1xuICAgIH0pLmZpbHRlcihtYXRjaCA9PiB7XG4gICAgICAvLyBmaWx0ZXIgbm90IG1hdGNoZWQgZWxlbWVudHNcbiAgICAgIHJldHVybiBtYXRjaCAhPSBudWxsO1xuICAgIH0pLm1hcCggbWF0Y2ggPT4ge1xuICAgICAgLy8gbWFwcyBlYWNoIG1hdGNoIGFzIGFuIGFycmF5IG9mIDIgXiBrIHJlc3VsdHNcbiAgICAgIHJldHVybiBtYXRjaC5tYXAoKGl0ZW0sIGspID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gJiYgayA+IDApIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5wb3coMiwgayAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSkucmVkdWNlKCAoYSwgYikgPT4ge1xuICAgICAgICAvLyByZXR1cm4gYSBzdW0gb2YgcmVzdWx0c1xuICAgICAgICByZXR1cm4gYSArIGI7XG4gICAgICB9KTtcbiAgICB9KS5yZWR1Y2UoIChhLCBiKSA9PiB7XG4gICAgICAvLyByZXR1cm4gYSBmaW5hbCBzdW0gb2YgcmVzdWx0c1xuICAgICAgcmV0dXJuIGEgfCBiO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgLy8gZ2V0IGVsZW1lbnQgY2xhc3Nlc1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oKDxIVE1MRGl2RWxlbWVudD50aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLmNsYXNzTGlzdCk7XG4gICAgLy8gZ2V0IGJ1dHRvbnMgZnJvbSBlbGVtZW50IGNsYXNzIGxpc3RcbiAgICBjb25zdCBjbGFzc0xpc3RCdXR0b25zID0gdGhpcy5jbGFzc0xpc3RUb0J1dHRvbnMoY2xhc3NMaXN0KTtcbiAgICAvLyBpZiBlbGVtZW50IGhhcyBidXR0b24gY2xhc3NlcyAobW9kYWwtb2ssIG1vZGFsLXllcy1ubyBldGMpXG4gICAgaWYgKGNsYXNzTGlzdEJ1dHRvbnMpIHtcbiAgICAgIC8vIHNldCBkaWFsb2cgYnV0dG9uc1xuICAgICAgdGhpcy5idXR0b25zID0gY2xhc3NMaXN0QnV0dG9ucztcbiAgICB9XG4gICAgdGhpcy5tb2RhbFJlZiA9ICQodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAvLyBpbml0aWFsaXplIG1vZGFsXG4gICAgdGhpcy5tb2RhbFJlZi5tb2RhbCh7XG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBmb2N1czogdHJ1ZSxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIHNob3c6IGZhbHNlXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==