UNPKG

@universis/common

Version:

Universis - common directives and services

185 lines (184 loc) 18.2 kB
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==