ionic-logging-service
Version:
Logging functionalities for apps built with Ionic framework
133 lines • 14 kB
JavaScript
import * as log4javascript from "log4javascript";
import { LogLevelConverter } from "./log-level.converter";
import { LogLevel } from "./log-level.model";
/**
* An appender which stores the log messages in the browser's memory.
*
* The MemoryAppender is enabled by default.
* If you do not specify anything else, it is using this configuration:
*
* ```JSON
* {
* "memoryAppender": [
* {
* "maxMessages": 250,
* "threshold": "ALL"
* }
* }
* ```
*/
export class MemoryAppender extends log4javascript.Appender {
static { this.maxMessagesDefault = 250; }
static { this.thresholdDefault = "ALL"; }
/**
* Creates a new instance of the appender.
*
* @param configuration configuration for the appender.
*/
constructor(configuration) {
super();
this.logMessages = [];
// process configuration
configuration = configuration || {};
this.configure({
maxMessages: configuration.maxMessages || MemoryAppender.maxMessagesDefault,
threshold: configuration.threshold || MemoryAppender.thresholdDefault,
});
this.maxMessages = MemoryAppender.maxMessagesDefault;
}
/**
* Configures the logging depending on the given configuration.
* Only the defined properties get overwritten.
*
* @param configuration configuration data.
*/
configure(configuration) {
if (configuration) {
if (configuration.maxMessages) {
this.setMaxMessages(configuration.maxMessages);
}
if (configuration.threshold) {
const convertedThreshold = LogLevelConverter.levelToLog4Javascript(LogLevelConverter.levelFromString(configuration.threshold));
this.setThreshold(convertedThreshold);
}
}
}
/**
* Appender-specific method to append a log message.
*
* @param loggingEvent event to be appended.
*/
append(loggingEvent) {
// if logMessages is already full, remove oldest element
while (this.logMessages.length >= this.maxMessages) {
this.logMessages.shift();
}
// add event to logMessages
const message = {
level: LogLevel[LogLevelConverter.levelFromLog4Javascript(loggingEvent.level)],
logger: typeof loggingEvent.logger === "object" ? loggingEvent.logger.name : undefined,
message: loggingEvent.messages.slice(1),
methodName: loggingEvent.messages[0],
timeStamp: loggingEvent.timeStamp,
};
this.logMessages.push(message);
// inform about new message
if (typeof this.onLogMessagesChangedCallback === "function") {
this.onLogMessagesChangedCallback(message);
}
}
/**
* Gets the appender's name.
* Mainly for unit testing purposes.
*
* @return appender's name
*/
toString() {
return "Ionic.Logging.MemoryAppender";
}
/**
* Get the maximum number of messages which will be stored in memory.
*/
getMaxMessages() {
return this.maxMessages;
}
/**
* Set the maximum number of messages which will be stored in memory.
*
* If the appender stores currently more messages than the new value allows, the oldest messages get removed.
*
* @param value new maximum number
*/
setMaxMessages(value) {
this.maxMessages = value;
// if there are too much logMessages for the new value, remove oldest messages
if (this.logMessages.length > this.maxMessages) {
this.logMessages.splice(0, this.logMessages.length - this.maxMessages);
}
}
/**
* Gets all messages stored in memory.
*
* @return stored messages
*/
getLogMessages() {
return this.logMessages;
}
/**
* Remove all messages stored in memory.
*/
removeLogMessages() {
this.logMessages.splice(0);
}
/**
* Registers a callback which will be called every time a new message is appended.
* This could be useful if you want to show new messages in realtime.
*
* @param callback callback to be called
*/
setOnLogMessagesChangedCallback(callback) {
this.onLogMessagesChangedCallback = callback;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWFwcGVuZGVyLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW9uaWMtbG9nZ2luZy1zZXJ2aWNlL3NyYy9saWIvbWVtb3J5LWFwcGVuZGVyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxjQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSTdDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsY0FBYyxDQUFDLFFBQVE7YUFFM0MsdUJBQWtCLEdBQUcsR0FBRyxDQUFDO2FBQ3pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQU94Qzs7OztPQUlHO0lBQ0gsWUFBWSxhQUEyQztRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXRCLHdCQUF3QjtRQUN4QixhQUFhLEdBQUcsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2QsV0FBVyxFQUFFLGFBQWEsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLGtCQUFrQjtZQUMzRSxTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQUMsZ0JBQWdCO1NBQ3JFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLGtCQUFrQixDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFNBQVMsQ0FBQyxhQUEwQztRQUMxRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25CLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMscUJBQXFCLENBQ2pFLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsWUFBeUM7UUFDdEQsd0RBQXdEO1FBQ3hELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELDJCQUEyQjtRQUMzQixNQUFNLE9BQU8sR0FBZTtZQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5RSxNQUFNLEVBQUUsT0FBTyxZQUFZLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDdEYsT0FBTyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxVQUFVLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDcEMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTO1NBQ2pDLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQiwyQkFBMkI7UUFDM0IsSUFBSSxPQUFPLElBQUksQ0FBQyw0QkFBNEIsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVE7UUFDZCxPQUFPLDhCQUE4QixDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjLENBQUMsS0FBYTtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6Qiw4RUFBOEU7UUFDOUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksK0JBQStCLENBQUMsUUFBdUM7UUFDN0UsSUFBSSxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztJQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbG9nNGphdmFzY3JpcHQgZnJvbSBcImxvZzRqYXZhc2NyaXB0XCI7XG5cbmltcG9ydCB7IExvZ0xldmVsQ29udmVydGVyIH0gZnJvbSBcIi4vbG9nLWxldmVsLmNvbnZlcnRlclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9sb2ctbGV2ZWwubW9kZWxcIjtcbmltcG9ydCB7IExvZ01lc3NhZ2UgfSBmcm9tIFwiLi9sb2ctbWVzc2FnZS5tb2RlbFwiO1xuaW1wb3J0IHsgTWVtb3J5QXBwZW5kZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vbWVtb3J5LWFwcGVuZGVyLmNvbmZpZ3VyYXRpb25cIjtcblxuLyoqXG4gKiBBbiBhcHBlbmRlciB3aGljaCBzdG9yZXMgdGhlIGxvZyBtZXNzYWdlcyBpbiB0aGUgYnJvd3NlcidzIG1lbW9yeS5cbiAqXG4gKiBUaGUgTWVtb3J5QXBwZW5kZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0LlxuICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueXRoaW5nIGVsc2UsIGl0IGlzIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbjpcbiAqXG4gKiBgYGBKU09OXG4gKiB7XG4gKiAgIFwibWVtb3J5QXBwZW5kZXJcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwibWF4TWVzc2FnZXNcIjogMjUwLFxuICogICAgICAgXCJ0aHJlc2hvbGRcIjogXCJBTExcIlxuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5QXBwZW5kZXIgZXh0ZW5kcyBsb2c0amF2YXNjcmlwdC5BcHBlbmRlciB7XG5cblx0cHJpdmF0ZSBzdGF0aWMgbWF4TWVzc2FnZXNEZWZhdWx0ID0gMjUwO1xuXHRwcml2YXRlIHN0YXRpYyB0aHJlc2hvbGREZWZhdWx0ID0gXCJBTExcIjtcblxuXHRwcml2YXRlIG1heE1lc3NhZ2VzOiBudW1iZXI7XG5cblx0cHJpdmF0ZSBsb2dNZXNzYWdlczogTG9nTWVzc2FnZVtdO1xuXHRwcml2YXRlIG9uTG9nTWVzc2FnZXNDaGFuZ2VkQ2FsbGJhY2s6IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhcHBlbmRlci5cblx0ICpcblx0ICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGFwcGVuZGVyLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoY29uZmlndXJhdGlvbj86IE1lbW9yeUFwcGVuZGVyQ29uZmlndXJhdGlvbikge1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLmxvZ01lc3NhZ2VzID0gW107XG5cblx0XHQvLyBwcm9jZXNzIGNvbmZpZ3VyYXRpb25cblx0XHRjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbiB8fCB7fTtcblx0XHR0aGlzLmNvbmZpZ3VyZSh7XG5cdFx0XHRtYXhNZXNzYWdlczogY29uZmlndXJhdGlvbi5tYXhNZXNzYWdlcyB8fCBNZW1vcnlBcHBlbmRlci5tYXhNZXNzYWdlc0RlZmF1bHQsXG5cdFx0XHR0aHJlc2hvbGQ6IGNvbmZpZ3VyYXRpb24udGhyZXNob2xkIHx8IE1lbW9yeUFwcGVuZGVyLnRocmVzaG9sZERlZmF1bHQsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1heE1lc3NhZ2VzID0gTWVtb3J5QXBwZW5kZXIubWF4TWVzc2FnZXNEZWZhdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZXMgdGhlIGxvZ2dpbmcgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuXHQgKiBPbmx5IHRoZSBkZWZpbmVkIHByb3BlcnRpZXMgZ2V0IG92ZXJ3cml0dGVuLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uIGRhdGEuXG5cdCAqL1xuXHRwdWJsaWMgY29uZmlndXJlKGNvbmZpZ3VyYXRpb246IE1lbW9yeUFwcGVuZGVyQ29uZmlndXJhdGlvbik6IHZvaWQge1xuXHRcdGlmIChjb25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAoY29uZmlndXJhdGlvbi5tYXhNZXNzYWdlcykge1xuXHRcdFx0XHR0aGlzLnNldE1heE1lc3NhZ2VzKGNvbmZpZ3VyYXRpb24ubWF4TWVzc2FnZXMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbmZpZ3VyYXRpb24udGhyZXNob2xkKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFRocmVzaG9sZCA9IExvZ0xldmVsQ29udmVydGVyLmxldmVsVG9Mb2c0SmF2YXNjcmlwdChcblx0XHRcdFx0XHRMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21TdHJpbmcoY29uZmlndXJhdGlvbi50aHJlc2hvbGQpKTtcblx0XHRcdFx0dGhpcy5zZXRUaHJlc2hvbGQoY29udmVydGVkVGhyZXNob2xkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kZXItc3BlY2lmaWMgbWV0aG9kIHRvIGFwcGVuZCBhIGxvZyBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbG9nZ2luZ0V2ZW50IGV2ZW50IHRvIGJlIGFwcGVuZGVkLlxuXHQgKi9cblx0cHVibGljIGFwcGVuZChsb2dnaW5nRXZlbnQ6IGxvZzRqYXZhc2NyaXB0LkxvZ2dpbmdFdmVudCk6IHZvaWQge1xuXHRcdC8vIGlmIGxvZ01lc3NhZ2VzIGlzIGFscmVhZHkgZnVsbCwgcmVtb3ZlIG9sZGVzdCBlbGVtZW50XG5cdFx0d2hpbGUgKHRoaXMubG9nTWVzc2FnZXMubGVuZ3RoID49IHRoaXMubWF4TWVzc2FnZXMpIHtcblx0XHRcdHRoaXMubG9nTWVzc2FnZXMuc2hpZnQoKTtcblx0XHR9XG5cdFx0Ly8gYWRkIGV2ZW50IHRvIGxvZ01lc3NhZ2VzXG5cdFx0Y29uc3QgbWVzc2FnZTogTG9nTWVzc2FnZSA9IHtcblx0XHRcdGxldmVsOiBMb2dMZXZlbFtMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21Mb2c0SmF2YXNjcmlwdChsb2dnaW5nRXZlbnQubGV2ZWwpXSxcblx0XHRcdGxvZ2dlcjogdHlwZW9mIGxvZ2dpbmdFdmVudC5sb2dnZXIgPT09IFwib2JqZWN0XCIgPyBsb2dnaW5nRXZlbnQubG9nZ2VyLm5hbWUgOiB1bmRlZmluZWQsXG5cdFx0XHRtZXNzYWdlOiBsb2dnaW5nRXZlbnQubWVzc2FnZXMuc2xpY2UoMSksXG5cdFx0XHRtZXRob2ROYW1lOiBsb2dnaW5nRXZlbnQubWVzc2FnZXNbMF0sXG5cdFx0XHR0aW1lU3RhbXA6IGxvZ2dpbmdFdmVudC50aW1lU3RhbXAsXG5cdFx0fTtcblx0XHR0aGlzLmxvZ01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG5cblx0XHQvLyBpbmZvcm0gYWJvdXQgbmV3IG1lc3NhZ2Vcblx0XHRpZiAodHlwZW9mIHRoaXMub25Mb2dNZXNzYWdlc0NoYW5nZWRDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHR0aGlzLm9uTG9nTWVzc2FnZXNDaGFuZ2VkQ2FsbGJhY2sobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcGVuZGVyJ3MgbmFtZS5cblx0ICogTWFpbmx5IGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuXG5cdCAqXG5cdCAqIEByZXR1cm4gYXBwZW5kZXIncyBuYW1lXG5cdCAqL1xuXHRwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gXCJJb25pYy5Mb2dnaW5nLk1lbW9yeUFwcGVuZGVyXCI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB3aGljaCB3aWxsIGJlIHN0b3JlZCBpbiBtZW1vcnkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TWF4TWVzc2FnZXMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhNZXNzYWdlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGluIG1lbW9yeS5cblx0ICpcblx0ICogSWYgdGhlIGFwcGVuZGVyIHN0b3JlcyBjdXJyZW50bHkgbW9yZSBtZXNzYWdlcyB0aGFuIHRoZSBuZXcgdmFsdWUgYWxsb3dzLCB0aGUgb2xkZXN0IG1lc3NhZ2VzIGdldCByZW1vdmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWUgbmV3IG1heGltdW0gbnVtYmVyXG5cdCAqL1xuXHRwdWJsaWMgc2V0TWF4TWVzc2FnZXModmFsdWU6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMubWF4TWVzc2FnZXMgPSB2YWx1ZTtcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSB0b28gbXVjaCBsb2dNZXNzYWdlcyBmb3IgdGhlIG5ldyB2YWx1ZSwgcmVtb3ZlIG9sZGVzdCBtZXNzYWdlc1xuXHRcdGlmICh0aGlzLmxvZ01lc3NhZ2VzLmxlbmd0aCA+IHRoaXMubWF4TWVzc2FnZXMpIHtcblx0XHRcdHRoaXMubG9nTWVzc2FnZXMuc3BsaWNlKDAsIHRoaXMubG9nTWVzc2FnZXMubGVuZ3RoIC0gdGhpcy5tYXhNZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYWxsIG1lc3NhZ2VzIHN0b3JlZCBpbiBtZW1vcnkuXG5cdCAqXG5cdCAqIEByZXR1cm4gc3RvcmVkIG1lc3NhZ2VzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9nTWVzc2FnZXMoKTogTG9nTWVzc2FnZVtdIHtcblx0XHRyZXR1cm4gdGhpcy5sb2dNZXNzYWdlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzIHN0b3JlZCBpbiBtZW1vcnkuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlTG9nTWVzc2FnZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5sb2dNZXNzYWdlcy5zcGxpY2UoMCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIG5ldyBtZXNzYWdlIGlzIGFwcGVuZGVkLlxuXHQgKiBUaGlzIGNvdWxkIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzaG93IG5ldyBtZXNzYWdlcyBpbiByZWFsdGltZS5cblx0ICpcblx0ICogQHBhcmFtIGNhbGxiYWNrIGNhbGxiYWNrIHRvIGJlIGNhbGxlZFxuXHQgKi9cblx0cHVibGljIHNldE9uTG9nTWVzc2FnZXNDaGFuZ2VkQ2FsbGJhY2soY2FsbGJhY2s6IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0dGhpcy5vbkxvZ01lc3NhZ2VzQ2hhbmdlZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cdH1cbn1cbiJdfQ==