@miracledevs/paradigm-web-angular
Version:
An angular wrapper with base functionality and helper services.
486 lines • 33.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*!
* Paradigm Framework - Angular Wrapper
* Copyright (c) 2017 Miracle Devs, Inc
* Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Shared/blob/master/LICENSE)
*/
import { ServiceBase } from './base.service';
import { DateExtensions, StringExtensions, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared';
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
/**
* Represents a log provider.
* The interface was specifically made to
* match the one from \@see console that is
* the default provider used by \@see LoggingService.
* @record
*/
export function ILogProvider() { }
if (false) {
/**
* Adds a trace log.
* @param {?} message the message to be logged.
* @return {?}
*/
ILogProvider.prototype.trace = function (message) { };
/**
* Adds a debug log.
* @param {?} message the message to be logged.
* @return {?}
*/
ILogProvider.prototype.debug = function (message) { };
/**
* Adds an info log.
* @param {?} message the message to be logged.
* @return {?}
*/
ILogProvider.prototype.info = function (message) { };
/**
* Adds a warn log.
* @param {?} message the message to be logged.
* @return {?}
*/
ILogProvider.prototype.warn = function (message) { };
/**
* Adds an error log.
* @param {?} message the message to be logged.
* @return {?}
*/
ILogProvider.prototype.error = function (message) { };
/**
* Adds a critical error log.
* @param {?} message the message to be logged.
* @return {?}
*/
ILogProvider.prototype.critical = function (message) { };
}
/** @enum {number} */
var LogType = {
/**
* Represents a trace log.
*/
Trace: 0,
/**
* Represents a debug log.
*/
Debug: 1,
/**
* Represents an information log.
*/
Information: 2,
/**
* Represents a warning log.
*/
Warning: 3,
/**
* Represents an error log.
*/
Error: 4,
/**
* Represents a critical error log.
*/
Critical: 5,
};
export { LogType };
LogType[LogType.Trace] = 'Trace';
LogType[LogType.Debug] = 'Debug';
LogType[LogType.Information] = 'Information';
LogType[LogType.Warning] = 'Warning';
LogType[LogType.Error] = 'Error';
LogType[LogType.Critical] = 'Critical';
var LoggingService = /** @class */ (function (_super) {
tslib_1.__extends(LoggingService, _super);
/**
* Creates a new instance of @see LoggingService.
*/
function LoggingService() {
var _this = _super.call(this) || this;
_this.logProvider = console;
_this.setMessageTemplateForAll('[{0}][{1}] - {3}{2}');
_this.minimumLevel = LogType.Information;
return _this;
}
/**
* Sets a log provider.
* By default @see console is used as provider.
*/
/**
* Sets a log provider.
* By default \@see console is used as provider.
* @param {?} logProvider
* @return {?}
*/
LoggingService.prototype.setLogProvider = /**
* Sets a log provider.
* By default \@see console is used as provider.
* @param {?} logProvider
* @return {?}
*/
function (logProvider) {
this.logProvider = logProvider;
};
/**
* Sets the message template for a given log type.
* There are some predefined content placeholders the user can utilize
* to configure the custom messages:
*
* {0}: The time when the log was added.
*
* {1}: The type of the log (Trace, Debug , Information, etc)
*
* {2}: A custom tag value provided by the user.
*
* {3}: The log message.
*/
/**
* Sets the message template for a given log type.
* There are some predefined content placeholders the user can utilize
* to configure the custom messages:
*
* {0}: The time when the log was added.
*
* {1}: The type of the log (Trace, Debug , Information, etc)
*
* {2}: A custom tag value provided by the user.
*
* {3}: The log message.
* @param {?} type
* @param {?} message
* @return {?}
*/
LoggingService.prototype.setMessageTemplate = /**
* Sets the message template for a given log type.
* There are some predefined content placeholders the user can utilize
* to configure the custom messages:
*
* {0}: The time when the log was added.
*
* {1}: The type of the log (Trace, Debug , Information, etc)
*
* {2}: A custom tag value provided by the user.
*
* {3}: The log message.
* @param {?} type
* @param {?} message
* @return {?}
*/
function (type, message) {
if (type < 0 || type >= this.messageTemplates.length) {
throw new Error(LoggingService.typeNotRecognized);
}
if (ObjectExtensions.isNull(message)) {
throw new Error('The message template can not be null or undefined.');
}
this.messageTemplates[type] = message;
};
/**
* Sets the message template for all the types.
* There are some predefined content placeholders the user can utilize
* to configure the custom messages:
*
* {0}: The time when the log was added.
*
* {1}: The type of the log (Trace, Debug , Information, etc)
*
* {2}: A custom tag value provided by the user.
*
* {3}: The log message.
*/
/**
* Sets the message template for all the types.
* There are some predefined content placeholders the user can utilize
* to configure the custom messages:
*
* {0}: The time when the log was added.
*
* {1}: The type of the log (Trace, Debug , Information, etc)
*
* {2}: A custom tag value provided by the user.
*
* {3}: The log message.
* @param {?} message
* @return {?}
*/
LoggingService.prototype.setMessageTemplateForAll = /**
* Sets the message template for all the types.
* There are some predefined content placeholders the user can utilize
* to configure the custom messages:
*
* {0}: The time when the log was added.
*
* {1}: The type of the log (Trace, Debug , Information, etc)
*
* {2}: A custom tag value provided by the user.
*
* {3}: The log message.
* @param {?} message
* @return {?}
*/
function (message) {
if (ObjectExtensions.isNull(message)) {
throw new Error('The message template can not be null or undefined.');
}
this.messageTemplates = [];
this.messageTemplates.push(message);
this.messageTemplates.push(message);
this.messageTemplates.push(message);
this.messageTemplates.push(message);
this.messageTemplates.push(message);
this.messageTemplates.push(message);
};
/**
* Sets the minimum log level.
* Log types smaller than this value will be ignored.
*/
/**
* Sets the minimum log level.
* Log types smaller than this value will be ignored.
* @param {?} type
* @return {?}
*/
LoggingService.prototype.setMinimumLevel = /**
* Sets the minimum log level.
* Log types smaller than this value will be ignored.
* @param {?} type
* @return {?}
*/
function (type) {
if (type < 0 || type >= this.messageTemplates.length) {
throw new Error(LoggingService.typeNotRecognized);
}
this.minimumLevel = type;
};
/**
* Logs the specified message.
* @param message the message to be logged.
* @param type the type of log entry.
* @param tag a tag value used for further analysis.
*/
/**
* Logs the specified message.
* @param {?} message the message to be logged.
* @param {?=} type the type of log entry.
* @param {?=} tag a tag value used for further analysis.
* @return {?}
*/
LoggingService.prototype.log = /**
* Logs the specified message.
* @param {?} message the message to be logged.
* @param {?=} type the type of log entry.
* @param {?=} tag a tag value used for further analysis.
* @return {?}
*/
function (message, type, tag) {
if (type === void 0) { type = LogType.Trace; }
if (tag === void 0) { tag = null; }
if (type < 0 || type >= this.messageTemplates.length) {
throw new Error(LoggingService.typeNotRecognized);
}
if (ObjectExtensions.isNull(message)) {
throw new Error('The message can not be null or undefined.');
}
if (type < this.minimumLevel) {
return;
}
/** @type {?} */
var formattedMessage = StringExtensions.format(this.messageTemplates[type], DateExtensions.format(new Date(), 'hh:mm:ss'), LogType[type], tag, message);
switch (type) {
case LogType.Trace:
this.logProvider.trace(formattedMessage);
break;
case LogType.Debug:
this.logProvider.debug(formattedMessage);
break;
case LogType.Information:
this.logProvider.info(formattedMessage);
break;
case LogType.Warning:
this.logProvider.warn(formattedMessage);
break;
case LogType.Error:
this.logProvider.error(formattedMessage);
break;
case LogType.Critical:
if (this.logProvider.critical) {
this.logProvider.critical(formattedMessage);
}
else {
this.logProvider.error(formattedMessage);
}
break;
}
};
/**
* Adds a trace log entry.
* @param message the message to be logged.
* @param tag a tag value for the entry.
*/
/**
* Adds a trace log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
LoggingService.prototype.trace = /**
* Adds a trace log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
function (message, tag) {
if (tag === void 0) { tag = null; }
this.log(message, LogType.Trace, tag);
};
/**
* Adds a debug log entry.
* @param message the message to be logged.
* @param tag a tag value for the entry.
*/
/**
* Adds a debug log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
LoggingService.prototype.debug = /**
* Adds a debug log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
function (message, tag) {
if (tag === void 0) { tag = null; }
this.log(message, LogType.Debug, tag);
};
/**
* Adds an information log entry.
* @param message the message to be logged.
* @param tag a tag value for the entry.
*/
/**
* Adds an information log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
LoggingService.prototype.information = /**
* Adds an information log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
function (message, tag) {
if (tag === void 0) { tag = null; }
this.log(message, LogType.Information, tag);
};
/**
* Adds a warning log entry.
* @param message the message to be logged.
* @param tag a tag value for the entry.
*/
/**
* Adds a warning log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
LoggingService.prototype.warning = /**
* Adds a warning log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
function (message, tag) {
if (tag === void 0) { tag = null; }
this.log(message, LogType.Warning, tag);
};
/**
* Adds an error log entry.
* @param message the message to be logged.
* @param tag a tag value for the entry.
*/
/**
* Adds an error log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
LoggingService.prototype.error = /**
* Adds an error log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
function (message, tag) {
if (tag === void 0) { tag = null; }
this.log(message, LogType.Error, tag);
};
/**
* Adds a critical error log entry.
* @param message the message to be logged.
* @param tag a tag value for the entry.
*/
/**
* Adds a critical error log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
LoggingService.prototype.critical = /**
* Adds a critical error log entry.
* @param {?} message the message to be logged.
* @param {?=} tag a tag value for the entry.
* @return {?}
*/
function (message, tag) {
if (tag === void 0) { tag = null; }
this.log(message, LogType.Critical, tag);
};
/**
* Error message.
*/
LoggingService.typeNotRecognized = 'The provided type is not recognized as a valid log type.';
LoggingService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
LoggingService.ctorParameters = function () { return []; };
/** @nocollapse */ LoggingService.ngInjectableDef = i0.defineInjectable({ factory: function LoggingService_Factory() { return new LoggingService(); }, token: LoggingService, providedIn: "root" });
return LoggingService;
}(ServiceBase));
export { LoggingService };
if (false) {
/**
* Error message.
* @type {?}
* @private
*/
LoggingService.typeNotRecognized;
/**
* An array of message templates.
* @type {?}
* @private
*/
LoggingService.prototype.messageTemplates;
/**
* The minimum log type that will logged.
* Log types smaller than this value will be ignored.
* @type {?}
* @private
*/
LoggingService.prototype.minimumLevel;
/**
* A log provider.
* By default \@see console will be used.
* @type {?}
* @private
*/
LoggingService.prototype.logProvider;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG1pcmFjbGVkZXZzL3BhcmFkaWdtLXdlYi1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2xvZ2dpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBTUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQWMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNySCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFRM0Msa0NBcUNDOzs7Ozs7O0lBL0JHLHNEQUE2Qjs7Ozs7O0lBTTdCLHNEQUE2Qjs7Ozs7O0lBTTdCLHFEQUE0Qjs7Ozs7O0lBTTVCLHFEQUE0Qjs7Ozs7O0lBTTVCLHNEQUE2Qjs7Ozs7O0lBTTdCLHlEQUFpQzs7OztJQVFqQzs7T0FFRztJQUNILFFBQVM7SUFFVDs7T0FFRztJQUNILFFBQVM7SUFFVDs7T0FFRztJQUNILGNBQWU7SUFFZjs7T0FFRztJQUNILFVBQVc7SUFFWDs7T0FFRztJQUNILFFBQVM7SUFFVDs7T0FFRztJQUNILFdBQVk7Ozs7Ozs7OztBQUdoQjtJQUdvQywwQ0FBVztJQXdCM0M7O09BRUc7SUFDSDtRQUFBLFlBRUksaUJBQU8sU0FJVjtRQUhHLEtBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzNCLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELEtBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQzs7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7OztJQUNILHVDQUFjOzs7Ozs7SUFBZCxVQUFlLFdBQXlCO1FBRXBDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7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bkMsc0NBQThCOzs7Ozs7O0lBTTlCLHFDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogUGFyYWRpZ20gRnJhbWV3b3JrIC0gQW5ndWxhciBXcmFwcGVyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgTWlyYWNsZSBEZXZzLCBJbmNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL01pcmFjbGVEZXZzL1BhcmFkaWdtLldlYi5TaGFyZWQvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuXG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVFeHRlbnNpb25zLCBEaWN0aW9uYXJ5LCBTdHJpbmdFeHRlbnNpb25zLCBPYmplY3RFeHRlbnNpb25zIH0gZnJvbSAnQG1pcmFjbGVkZXZzL3BhcmFkaWdtLXVpLXdlYi1zaGFyZWQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsb2cgcHJvdmlkZXIuXG4gKiBUaGUgaW50ZXJmYWNlIHdhcyBzcGVjaWZpY2FsbHkgbWFkZSB0b1xuICogbWF0Y2ggdGhlIG9uZSBmcm9tIEBzZWUgY29uc29sZSB0aGF0IGlzXG4gKiB0aGUgZGVmYXVsdCBwcm92aWRlciB1c2VkIGJ5IEBzZWUgTG9nZ2luZ1NlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ1Byb3ZpZGVyXG57XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHRyYWNlIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgdHJhY2UobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBkZWJ1ZyBsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIGRlYnVnKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGluZm8gbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgd2FybiBsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gZXJyb3IgbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNyaXRpY2FsIGVycm9yIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgY3JpdGljYWw/KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgdHlwZXMgb2YgbG9nZ2luZyBlbnRyaWVzLlxuICovXG5leHBvcnQgZW51bSBMb2dUeXBlXG57XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHRyYWNlIGxvZy5cbiAgICAgKi9cbiAgICBUcmFjZSA9IDAsXG5cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZGVidWcgbG9nLlxuICAgICAqL1xuICAgIERlYnVnID0gMSxcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gaW5mb3JtYXRpb24gbG9nLlxuICAgICAqL1xuICAgIEluZm9ybWF0aW9uID0gMixcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSB3YXJuaW5nIGxvZy5cbiAgICAgKi9cbiAgICBXYXJuaW5nID0gMyxcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXJyb3IgbG9nLlxuICAgICAqL1xuICAgIEVycm9yID0gNCxcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjcml0aWNhbCBlcnJvciBsb2cuXG4gICAgICovXG4gICAgQ3JpdGljYWwgPSA1XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTG9nZ2luZ1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlQmFzZVxue1xuICAgIC8qKlxuICAgICAqIEVycm9yIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdHlwZU5vdFJlY29nbml6ZWQ6IHN0cmluZyA9ICdUaGUgcHJvdmlkZWQgdHlwZSBpcyBub3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIGxvZyB0eXBlLic7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBtZXNzYWdlIHRlbXBsYXRlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1lc3NhZ2VUZW1wbGF0ZXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gbG9nIHR5cGUgdGhhdCB3aWxsIGxvZ2dlZC5cbiAgICAgKiBMb2cgdHlwZXMgc21hbGxlciB0aGFuIHRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgbWluaW11bUxldmVsOiBMb2dUeXBlO1xuXG4gICAgLyoqXG4gICAgICogQSBsb2cgcHJvdmlkZXIuXG4gICAgICogQnkgZGVmYXVsdCBAc2VlIGNvbnNvbGUgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9nUHJvdmlkZXI6IElMb2dQcm92aWRlcjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBMb2dnaW5nU2VydmljZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyID0gY29uc29sZTtcbiAgICAgICAgdGhpcy5zZXRNZXNzYWdlVGVtcGxhdGVGb3JBbGwoJ1t7MH1dW3sxfV0gLSB7M317Mn0nKTtcbiAgICAgICAgdGhpcy5taW5pbXVtTGV2ZWwgPSBMb2dUeXBlLkluZm9ybWF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBsb2cgcHJvdmlkZXIuXG4gICAgICogQnkgZGVmYXVsdCBAc2VlIGNvbnNvbGUgaXMgdXNlZCBhcyBwcm92aWRlci5cbiAgICAgKi9cbiAgICBzZXRMb2dQcm92aWRlcihsb2dQcm92aWRlcjogSUxvZ1Byb3ZpZGVyKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2dQcm92aWRlciA9IGxvZ1Byb3ZpZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgZm9yIGEgZ2l2ZW4gbG9nIHR5cGUuXG4gICAgICogVGhlcmUgYXJlIHNvbWUgcHJlZGVmaW5lZCBjb250ZW50IHBsYWNlaG9sZGVycyB0aGUgdXNlciBjYW4gdXRpbGl6ZVxuICAgICAqIHRvIGNvbmZpZ3VyZSB0aGUgY3VzdG9tIG1lc3NhZ2VzOlxuICAgICAqXG4gICAgICogezB9OiBUaGUgdGltZSB3aGVuIHRoZSBsb2cgd2FzIGFkZGVkLlxuICAgICAqXG4gICAgICogezF9OiBUaGUgdHlwZSBvZiB0aGUgbG9nIChUcmFjZSwgRGVidWcgLCBJbmZvcm1hdGlvbiwgZXRjKVxuICAgICAqXG4gICAgICogezJ9OiBBIGN1c3RvbSB0YWcgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiB7M306IFRoZSBsb2cgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzZXRNZXNzYWdlVGVtcGxhdGUodHlwZTogTG9nVHlwZSwgbWVzc2FnZTogc3RyaW5nKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gdGhpcy5tZXNzYWdlVGVtcGxhdGVzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKExvZ2dpbmdTZXJ2aWNlLnR5cGVOb3RSZWNvZ25pemVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWVzc2FnZSB0ZW1wbGF0ZSBjYW4gbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzW3R5cGVdID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtZXNzYWdlIHRlbXBsYXRlIGZvciBhbGwgdGhlIHR5cGVzLlxuICAgICAqIFRoZXJlIGFyZSBzb21lIHByZWRlZmluZWQgY29udGVudCBwbGFjZWhvbGRlcnMgdGhlIHVzZXIgY2FuIHV0aWxpemVcbiAgICAgKiB0byBjb25maWd1cmUgdGhlIGN1c3RvbSBtZXNzYWdlczpcbiAgICAgKlxuICAgICAqIHswfTogVGhlIHRpbWUgd2hlbiB0aGUgbG9nIHdhcyBhZGRlZC5cbiAgICAgKlxuICAgICAqIHsxfTogVGhlIHR5cGUgb2YgdGhlIGxvZyAoVHJhY2UsIERlYnVnICwgSW5mb3JtYXRpb24sIGV0YylcbiAgICAgKlxuICAgICAqIHsyfTogQSBjdXN0b20gdGFnIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogezN9OiBUaGUgbG9nIG1lc3NhZ2UuXG4gICAgICovXG4gICAgc2V0TWVzc2FnZVRlbXBsYXRlRm9yQWxsKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWVzc2FnZSB0ZW1wbGF0ZSBjYW4gbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzID0gW107XG4gICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzLnB1c2gobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWluaW11bSBsb2cgbGV2ZWwuXG4gICAgICogTG9nIHR5cGVzIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlIHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKi9cbiAgICBzZXRNaW5pbXVtTGV2ZWwodHlwZTogTG9nVHlwZSk6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmICh0eXBlIDwgMCB8fCB0eXBlID49IHRoaXMubWVzc2FnZVRlbXBsYXRlcy5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihMb2dnaW5nU2VydmljZS50eXBlTm90UmVjb2duaXplZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1pbmltdW1MZXZlbCA9IHR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9ncyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGxvZyBlbnRyeS5cbiAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIHZhbHVlIHVzZWQgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuXG4gICAgICovXG4gICAgbG9nKG1lc3NhZ2U6IHN0cmluZywgdHlwZTogTG9nVHlwZSA9IExvZ1R5cGUuVHJhY2UsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmICh0eXBlIDwgMCB8fCB0eXBlID49IHRoaXMubWVzc2FnZVRlbXBsYXRlcy5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihMb2dnaW5nU2VydmljZS50eXBlTm90UmVjb2duaXplZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobWVzc2FnZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG1lc3NhZ2UgY2FuIG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlIDwgdGhpcy5taW5pbXVtTGV2ZWwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2UgPSBTdHJpbmdFeHRlbnNpb25zLmZvcm1hdCh0aGlzLm1lc3NhZ2VUZW1wbGF0ZXNbdHlwZV0sIERhdGVFeHRlbnNpb25zLmZvcm1hdChuZXcgRGF0ZSgpLCAnaGg6bW06c3MnKSwgTG9nVHlwZVt0eXBlXSwgdGFnLCBtZXNzYWdlKTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgTG9nVHlwZS5UcmFjZTpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLnRyYWNlKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuRGVidWc6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dQcm92aWRlci5kZWJ1Zyhmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMb2dUeXBlLkluZm9ybWF0aW9uOlxuICAgICAgICAgICAgICAgIHRoaXMubG9nUHJvdmlkZXIuaW5mbyhmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMb2dUeXBlLldhcm5pbmc6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dQcm92aWRlci53YXJuKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuRXJyb3I6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dQcm92aWRlci5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMb2dUeXBlLkNyaXRpY2FsOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ1Byb3ZpZGVyLmNyaXRpY2FsKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dQcm92aWRlci5jcml0aWNhbChmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dQcm92aWRlci5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdHJhY2UgbG9nIGVudHJ5LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIHZhbHVlIGZvciB0aGUgZW50cnkuXG4gICAgICovXG4gICAgdHJhY2UobWVzc2FnZTogc3RyaW5nLCB0YWc6IHN0cmluZyA9IG51bGwpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvZyhtZXNzYWdlLCBMb2dUeXBlLlRyYWNlLCB0YWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBkZWJ1ZyBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ1R5cGUuRGVidWcsIHRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBpbmZvcm1hdGlvbiBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICBpbmZvcm1hdGlvbihtZXNzYWdlOiBzdHJpbmcsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ1R5cGUuSW5mb3JtYXRpb24sIHRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHdhcm5pbmcgbG9nIGVudHJ5LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIHZhbHVlIGZvciB0aGUgZW50cnkuXG4gICAgICovXG4gICAgd2FybmluZyhtZXNzYWdlOiBzdHJpbmcsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ1R5cGUuV2FybmluZywgdGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGVycm9yIGxvZyBlbnRyeS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIHRhZyBhIHRhZyB2YWx1ZSBmb3IgdGhlIGVudHJ5LlxuICAgICAqL1xuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nVHlwZS5FcnJvciwgdGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY3JpdGljYWwgZXJyb3IgbG9nIGVudHJ5LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIHZhbHVlIGZvciB0aGUgZW50cnkuXG4gICAgICovXG4gICAgY3JpdGljYWwobWVzc2FnZTogc3RyaW5nLCB0YWc6IHN0cmluZyA9IG51bGwpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvZyhtZXNzYWdlLCBMb2dUeXBlLkNyaXRpY2FsLCB0YWcpO1xuICAgIH1cbn1cbiJdfQ==