@universis/common
Version:
Universis - common directives and services
219 lines (217 loc) • 23.6 kB
JavaScript
import { Injectable, Component, Input } from '@angular/core';
import { Router } from '@angular/router';
import { HttpErrorResponse } from '@angular/common/http';
import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';
import { TranslateService } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "ngx-bootstrap/modal";
import * as i3 from "@angular/router";
import * as i4 from "@angular/common";
export class ErrorModalComponent {
constructor(_translateService, bsModalRef, _router) {
this._translateService = _translateService;
this.bsModalRef = bsModalRef;
this._router = _router;
this.continueLink = '/';
this.buttonText = 'Error.Continue';
this.language = this._translateService.currentLang;
}
hide() {
this.bsModalRef.hide();
if (this.continueLink == null) {
return Promise.resolve();
}
if (this.continueLink === '.') {
return Promise.resolve();
}
return this._router.navigate([this.continueLink]);
}
ngOnInit() {
// get last error
const error = this.error;
// check error.code property
if (error && typeof error.code === 'string') {
this.code = error.code;
}
else if (error && typeof (error.status || error.statusCode) === 'number') {
this.code = `E${error.status || error.statusCode}`;
}
else {
this.code = 'E500';
}
if (error && typeof error.continue === 'string') {
this.continueLink = error.continue;
}
this._translateService.get(this.code).subscribe((translation) => {
if (translation) {
this.title = translation.title;
this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message)
? this.error.error.message : translation.message;
// set custom icon class
if (this.iconClass == null) {
if (translation.iconClass || translation.icon) {
this.iconClass = translation.iconClass || translation.icon;
}
}
// set custom button text
if (this.buttonText === 'Error.Continue') {
if (translation.actionText || translation.action) {
this.buttonText = translation.actionText || translation.action;
}
}
if (translation.continue) {
// force set message
this.message = translation.message;
// force set continue link
this.continueLink = translation.continue;
}
}
else {
this._translateService.get('E500').subscribe((translation) => {
this.title = translation.title;
this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message)
? this.error.error.message : translation.message;
});
}
});
}
}
ErrorModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorModalComponent, deps: [{ token: i1.TranslateService }, { token: i2.BsModalRef }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component });
ErrorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ErrorModalComponent, selector: "universis-error-modal", inputs: { continueLink: "continueLink", message: "message", title: "title", iconClass: "iconClass", buttonText: "buttonText", error: "error" }, ngImport: i0, template: `
<div class="modal-header text-center">
<button type="button" class="close pull-right" aria-label="Close" (click)="hide()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body mt-0 mb-0 text-center">
<div class="text-center">
<ng-container *ngIf="iconClass; then iconTemplate; else iconDefault">
</ng-container>
<ng-template #iconTemplate>
<div class="mb-2">
<i [ngClass]="iconClass" class="fa-4x"></i>
</div>
</ng-template>
<ng-template #iconDefault>
<div class="icon-circle icon-circle-danger">
<i class="fa fa-times"></i>
</div>
</ng-template>
<div class="font-2xl font-weight-bold mt-2">
{{title}}
</div>
<p class="mt-2">
{{message}}
</p>
</div>
</div>
<div class="modal-footer">
<button [lang]="language" type="button" (click)="hide()"
class="btn btn-gray-100 btn-ok text-uppercase" [translate]="buttonText"></button>
</div>
`, isInline: true, styles: [".btn-ok{font-size:16px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorModalComponent, decorators: [{
type: Component,
args: [{ selector: 'universis-error-modal', template: `
<div class="modal-header text-center">
<button type="button" class="close pull-right" aria-label="Close" (click)="hide()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body mt-0 mb-0 text-center">
<div class="text-center">
<ng-container *ngIf="iconClass; then iconTemplate; else iconDefault">
</ng-container>
<ng-template #iconTemplate>
<div class="mb-2">
<i [ngClass]="iconClass" class="fa-4x"></i>
</div>
</ng-template>
<ng-template #iconDefault>
<div class="icon-circle icon-circle-danger">
<i class="fa fa-times"></i>
</div>
</ng-template>
<div class="font-2xl font-weight-bold mt-2">
{{title}}
</div>
<p class="mt-2">
{{message}}
</p>
</div>
</div>
<div class="modal-footer">
<button [lang]="language" type="button" (click)="hide()"
class="btn btn-gray-100 btn-ok text-uppercase" [translate]="buttonText"></button>
</div>
`, styles: [".btn-ok{font-size:16px}\n"] }]
}], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.BsModalRef }, { type: i3.Router }]; }, propDecorators: { continueLink: [{
type: Input
}], message: [{
type: Input
}], title: [{
type: Input
}], iconClass: [{
type: Input
}], buttonText: [{
type: Input
}], error: [{
type: Input
}] } });
export class ErrorService {
constructor(_router, _modalService) {
this._router = _router;
this._modalService = _modalService;
//
}
/**
* @param {*} error
* @returns {Promise<boolean>}
*/
navigateToError(error) {
this.setLastError(error);
// if error is an instance of HttpErrorResponse
if (error instanceof HttpErrorResponse) {
if (error && error.error && error.error.statusCode) {
return this._router.navigate(['/error', error.error.statusCode]);
}
// navigate to specific error e.g. /error/401
// this will allow application to override specific error pages and show custom errors
return this._router.navigate(['/error', error.status]);
}
if (error && error.statusCode) {
return this._router.navigate(['/error', error.statusCode]);
}
// otherwise show default error component
return this._router.navigate(['/error']);
}
showError(error, options) {
const initialState = Object.assign({
error: error
}, options);
this._modalService.show(ErrorModalComponent, { initialState });
}
/**
* Sets last application error
* @param {*=} err
* @return ErrorService
*/
setLastError(err) {
this._lastError = err;
return this;
}
/**
* Gets last application error
* @return {any}
*/
getLastError() {
return this._lastError;
}
}
ErrorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorService, deps: [{ token: i3.Router }, { token: i2.BsModalService }], target: i0.ɵɵFactoryTarget.Injectable });
ErrorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i3.Router }, { type: i2.BsModalService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lcnJvci9lcnJvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBNERyRCxNQUFNLE9BQU8sbUJBQW1CO0lBVzlCLFlBQXNCLGlCQUFtQyxFQUNwQyxVQUFzQixFQUNyQixPQUFlO1FBRmYsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNwQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFUNUIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFJbkIsZUFBVSxHQUFHLGdCQUFnQixDQUFDO1FBTXJDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztJQUNyRCxDQUFDO0lBRUgsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtZQUM3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxHQUFHLEVBQUU7WUFDN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFB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LENBQUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QseUNBQXlDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBVSxFQUFFLE9BQStCO1FBQ25ELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDakMsS0FBSyxFQUFFLEtBQUs7U0FDYixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLEdBQVM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOzswR0FyRFUsWUFBWTs4R0FBWixZQUFZOzRGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSwgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVHJhbnNsYXRlRXJyb3Ige1xuICB0aXRsZT86IHN0cmluZztcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBhY3Rpb25UZXh0Pzogc3RyaW5nO1xuICBjb250aW51ZT86IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgaWNvbkNsYXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgU2hvd0Vycm9yTW9kYWxPcHRpb25zIHtcbiAgY29udGludWVMaW5rPzogc3RyaW5nO1xuICBidXR0b25UZXh0Pzogc3RyaW5nO1xuICBpY29uQ2xhc3M/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoIHtcbiAgc2VsZWN0b3I6ICd1bml2ZXJzaXMtZXJyb3ItbW9kYWwnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJoaWRlKClcIj5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG10LTAgbWItMCB0ZXh0LWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpY29uQ2xhc3M7IHRoZW4gaWNvblRlbXBsYXRlOyBlbHNlIGljb25EZWZhdWx0XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25UZW1wbGF0ZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgPGkgW25nQ2xhc3NdPVwiaWNvbkNsYXNzXCIgY2xhc3M9XCJmYS00eFwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25EZWZhdWx0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZSBpY29uLWNpcmNsZS1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LTJ4bCBmb250LXdlaWdodC1ib2xkIG10LTJcIj5cbiAgICAgICAgICAgICAge3t0aXRsZX19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgIHt7bWVzc2FnZX19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b24gW2xhbmddPVwibGFuZ3VhZ2VcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImhpZGUoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1ncmF5LTEwMCBidG4tb2sgdGV4dC11cHBlcmNhc2VcIiBbdHJhbnNsYXRlXT1cImJ1dHRvblRleHRcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYCwgc3R5bGVzOiBbYFxuICAuYnRuLW9rIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gIH1cbiAgYF1cbiAgIH0pXG5cbiAgZXhwb3J0IGNsYXNzIEVycm9yTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgcHVibGljIGNvZGU7XG4gICAgcHVibGljIGxhbmd1YWdlO1xuICAgIEBJbnB1dCgpIGNvbnRpbnVlTGluayA9ICcvJztcbiAgICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKSBpY29uQ2xhc3M/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgYnV0dG9uVGV4dCA9ICdFcnJvci5Db250aW51ZSc7XG4gICAgQElucHV0KCkgZXJyb3I6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yICggcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgIHB1YmxpYyBic01vZGFsUmVmOiBCc01vZGFsUmVmLFxuICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIgKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZztcbiAgICB9XG5cbiAgaGlkZSgpIHtcbiAgICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gICAgICBpZiAodGhpcy5jb250aW51ZUxpbmsgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250aW51ZUxpbmsgPT09ICcuJykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbnRpbnVlTGlua10pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuXG4gICAgICAvLyBnZXQgbGFzdCBlcnJvclxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yO1xuICAgICAgLy8gY2hlY2sgZXJyb3IuY29kZSBwcm9wZXJ0eVxuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvci5jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNvZGUgPSBlcnJvci5jb2RlO1xuICAgICAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgKGVycm9yLnN0YXR1cyB8fCBlcnJvci5zdGF0dXNDb2RlKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhpcy5jb2RlID0gYEUke2Vycm9yLnN0YXR1cyB8fCBlcnJvci5zdGF0dXNDb2RlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvZGUgPSAnRTUwMCc7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvbnRpbnVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNvbnRpbnVlTGluayA9IGVycm9yLmNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQodGhpcy5jb2RlKS5zdWJzY3JpYmUoKHRyYW5zbGF0aW9uOiBUcmFuc2xhdGVFcnJvcikgPT4ge1xuICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnRpdGxlID0gdHJhbnNsYXRpb24udGl0bGU7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgID8gdGhpcy5lcnJvci5lcnJvci5tZXNzYWdlIDogdHJhbnNsYXRpb24ubWVzc2FnZTtcbiAgICAgICAgICAvLyBzZXQgY3VzdG9tIGljb24gY2xhc3NcbiAgICAgICAgICBpZiAodGhpcy5pY29uQ2xhc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uLmljb25DbGFzcyB8fCB0cmFuc2xhdGlvbi5pY29uKSB7XG4gICAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzID0gdHJhbnNsYXRpb24uaWNvbkNsYXNzIHx8IHRyYW5zbGF0aW9uLmljb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHNldCBjdXN0b20gYnV0dG9uIHRleHRcbiAgICAgICAgICBpZiAodGhpcy5idXR0b25UZXh0ID09PSAnRXJyb3IuQ29udGludWUnKSB7XG4gICAgICAgICAgICBpZiAodHJhbnNsYXRpb24uYWN0aW9uVGV4dCB8fCB0cmFuc2xhdGlvbi5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5idXR0b25UZXh0ID0gdHJhbnNsYXRpb24uYWN0aW9uVGV4dCB8fCB0cmFuc2xhdGlvbi5hY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmFuc2xhdGlvbi5jb250aW51ZSkge1xuICAgICAgICAgICAgLy8gZm9yY2Ugc2V0IG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHRyYW5zbGF0aW9uLm1lc3NhZ2U7XG4gICAgICAgICAgICAvLyBmb3JjZSBzZXQgY29udGludWUgbGlua1xuICAgICAgICAgICAgdGhpcy5jb250aW51ZUxpbmsgPSB0cmFuc2xhdGlvbi5jb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ0U1MDAnKS5zdWJzY3JpYmUoKHRyYW5zbGF0aW9uOiBUcmFuc2xhdGVFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRyYW5zbGF0aW9uLnRpdGxlO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgPyB0aGlzLmVycm9yLmVycm9yLm1lc3NhZ2UgOiB0cmFuc2xhdGlvbi5tZXNzYWdlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXJyb3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9sYXN0RXJyb3I6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSkge1xuICAgIC8vXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBlcnJvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIG5hdmlnYXRlVG9FcnJvcihlcnJvcikge1xuICAgIHRoaXMuc2V0TGFzdEVycm9yKGVycm9yKTtcbiAgICAvLyBpZiBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBIdHRwRXJyb3JSZXNwb25zZVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yJywgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZV0pO1xuICAgICAgfVxuICAgICAgLy8gbmF2aWdhdGUgdG8gc3BlY2lmaWMgZXJyb3IgZS5nLiAvZXJyb3IvNDAxXG4gICAgICAvLyB0aGlzIHdpbGwgYWxsb3cgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgc3BlY2lmaWMgZXJyb3IgcGFnZXMgYW5kIHNob3cgY3VzdG9tIGVycm9yc1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lcnJvcicsIGVycm9yLnN0YXR1c10pO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzQ29kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lcnJvcicsIGVycm9yLnN0YXR1c0NvZGVdKTtcbiAgICB9XG4gICAgLy8gb3RoZXJ3aXNlIHNob3cgZGVmYXVsdCBlcnJvciBjb21wb25lbnRcbiAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yJ10pO1xuICB9XG5cbiAgc2hvd0Vycm9yKGVycm9yOiBhbnksIG9wdGlvbnM/OiBTaG93RXJyb3JNb2RhbE9wdGlvbnMpIHtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHRoaXMuX21vZGFsU2VydmljZS5zaG93KEVycm9yTW9kYWxDb21wb25lbnQsIHtpbml0aWFsU3RhdGV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGxhc3QgYXBwbGljYXRpb24gZXJyb3JcbiAgICogQHBhcmFtIHsqPX0gZXJyXG4gICAqIEByZXR1cm4gRXJyb3JTZXJ2aWNlXG4gICAqL1xuICBzZXRMYXN0RXJyb3IoZXJyPzogYW55KSB7XG4gICAgdGhpcy5fbGFzdEVycm9yID0gZXJyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbGFzdCBhcHBsaWNhdGlvbiBlcnJvclxuICAgKiBAcmV0dXJuIHthbnl9XG4gICAqL1xuICBnZXRMYXN0RXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcjtcbiAgfVxuXG59XG4iXX0=