@miracledevs/paradigm-web-angular
Version:
An angular wrapper with base functionality and helper services.
317 lines • 26.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*!
* 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} */
const 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';
export class LoggingService extends ServiceBase {
/**
* Creates a new instance of \@see LoggingService.
*/
constructor() {
super();
this.logProvider = console;
this.setMessageTemplateForAll('[{0}][{1}] - {3}{2}');
this.minimumLevel = LogType.Information;
}
/**
* Sets a log provider.
* By default \@see console is used as provider.
* @param {?} logProvider
* @return {?}
*/
setLogProvider(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.
* @param {?} type
* @param {?} message
* @return {?}
*/
setMessageTemplate(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.
* @param {?} message
* @return {?}
*/
setMessageTemplateForAll(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.
* @param {?} type
* @return {?}
*/
setMinimumLevel(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.
* @return {?}
*/
log(message, type = LogType.Trace, 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 {?} */
const 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.
* @return {?}
*/
trace(message, 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.
* @return {?}
*/
debug(message, 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.
* @return {?}
*/
information(message, 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.
* @return {?}
*/
warning(message, 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.
* @return {?}
*/
error(message, 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.
* @return {?}
*/
critical(message, 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 = () => [];
/** @nocollapse */ LoggingService.ngInjectableDef = i0.defineInjectable({ factory: function LoggingService_Factory() { return new LoggingService(); }, token: LoggingService, providedIn: "root" });
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG1pcmFjbGVkZXZzL3BhcmFkaWdtLXdlYi1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2xvZ2dpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBYyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVEzQyxrQ0FxQ0M7Ozs7Ozs7SUEvQkcsc0RBQTZCOzs7Ozs7SUFNN0Isc0RBQTZCOzs7Ozs7SUFNN0IscURBQTRCOzs7Ozs7SUFNNUIscURBQTRCOzs7Ozs7SUFNNUIsc0RBQTZCOzs7Ozs7SUFNN0IseURBQWlDOzs7O0lBUWpDOztPQUVHO0lBQ0gsUUFBUztJQUVUOztPQUVHO0lBQ0gsUUFBUztJQUVUOztPQUVHO0lBQ0gsY0FBZTtJQUVmOztPQUVHO0lBQ0gsVUFBVztJQUVYOztPQUVHO0lBQ0gsUUFBUztJQUVUOztPQUVHO0lBQ0gsV0FBWTs7Ozs7Ozs7O0FBTWhCLE1BQU0sT0FBTyxjQUFlLFNBQVEsV0FBVzs7OztJQTJCM0M7UUFFSSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUM1QyxDQUFDOzs7Ozs7O0lBTUQsY0FBYyxDQUFDLFdBQXlCO1FBRXBDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBZUQsa0JBQWtCLENBQUMsSUFB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Q0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7Ozs7SUFPRCxLQUFLLENBQUMsT0FBZSxFQUFFLE1BQWMsSUFBSTtRQUVyQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Ozs7Ozs7SUFPRCxRQUFRLENBQUMsT0FBZSxFQUFFLE1BQWMsSUFBSTtRQUV4QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Ozs7O0FBcE91QixnQ0FBaUIsR0FBVywwREFBMEQsQ0FBQzs7WUFSbEgsVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7Ozs7Ozs7OztJQU1HLGlDQUErRzs7Ozs7O0lBSy9HLDBDQUFtQzs7Ozs7OztJQU1uQyxzQ0FBOEI7Ozs7Ozs7SUFNOUIscUNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLlNoYXJlZC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG5cbmltcG9ydCB7IFNlcnZpY2VCYXNlIH0gZnJvbSAnLi9iYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUV4dGVuc2lvbnMsIERpY3Rpb25hcnksIFN0cmluZ0V4dGVuc2lvbnMsIE9iamVjdEV4dGVuc2lvbnMgfSBmcm9tICdAbWlyYWNsZWRldnMvcGFyYWRpZ20tdWktd2ViLXNoYXJlZCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvZyBwcm92aWRlci5cbiAqIFRoZSBpbnRlcmZhY2Ugd2FzIHNwZWNpZmljYWxseSBtYWRlIHRvXG4gKiBtYXRjaCB0aGUgb25lIGZyb20gQHNlZSBjb25zb2xlIHRoYXQgaXNcbiAqIHRoZSBkZWZhdWx0IHByb3ZpZGVyIHVzZWQgYnkgQHNlZSBMb2dnaW5nU2VydmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTG9nUHJvdmlkZXJcbntcbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdHJhY2UgbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICB0cmFjZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRlYnVnIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgZGVidWcobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gaW5mbyBsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIGluZm8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB3YXJuIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBlcnJvciBsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY3JpdGljYWwgZXJyb3IgbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBjcml0aWNhbD8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBFbnVtZXJhdGVzIHRoZSB0eXBlcyBvZiBsb2dnaW5nIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBlbnVtIExvZ1R5cGVcbntcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgdHJhY2UgbG9nLlxuICAgICAqL1xuICAgIFRyYWNlID0gMCxcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBkZWJ1ZyBsb2cuXG4gICAgICovXG4gICAgRGVidWcgPSAxLFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBpbmZvcm1hdGlvbiBsb2cuXG4gICAgICovXG4gICAgSW5mb3JtYXRpb24gPSAyLFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHdhcm5pbmcgbG9nLlxuICAgICAqL1xuICAgIFdhcm5pbmcgPSAzLFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBlcnJvciBsb2cuXG4gICAgICovXG4gICAgRXJyb3IgPSA0LFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNyaXRpY2FsIGVycm9yIGxvZy5cbiAgICAgKi9cbiAgICBDcml0aWNhbCA9IDVcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBMb2dnaW5nU2VydmljZSBleHRlbmRzIFNlcnZpY2VCYXNlXG57XG4gICAgLyoqXG4gICAgICogRXJyb3IgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB0eXBlTm90UmVjb2duaXplZDogc3RyaW5nID0gJ1RoZSBwcm92aWRlZCB0eXBlIGlzIG5vdCByZWNvZ25pemVkIGFzIGEgdmFsaWQgbG9nIHR5cGUuJztcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG1lc3NhZ2UgdGVtcGxhdGVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgbWVzc2FnZVRlbXBsYXRlczogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBsb2cgdHlwZSB0aGF0IHdpbGwgbG9nZ2VkLlxuICAgICAqIExvZyB0eXBlcyBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBtaW5pbXVtTGV2ZWw6IExvZ1R5cGU7XG5cbiAgICAvKipcbiAgICAgKiBBIGxvZyBwcm92aWRlci5cbiAgICAgKiBCeSBkZWZhdWx0IEBzZWUgY29uc29sZSB3aWxsIGJlIHVzZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2dQcm92aWRlcjogSUxvZ1Byb3ZpZGVyO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIExvZ2dpbmdTZXJ2aWNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9nUHJvdmlkZXIgPSBjb25zb2xlO1xuICAgICAgICB0aGlzLnNldE1lc3NhZ2VUZW1wbGF0ZUZvckFsbCgnW3swfV1bezF9XSAtIHszfXsyfScpO1xuICAgICAgICB0aGlzLm1pbmltdW1MZXZlbCA9IExvZ1R5cGUuSW5mb3JtYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGxvZyBwcm92aWRlci5cbiAgICAgKiBCeSBkZWZhdWx0IEBzZWUgY29uc29sZSBpcyB1c2VkIGFzIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHNldExvZ1Byb3ZpZGVyKGxvZ1Byb3ZpZGVyOiBJTG9nUHJvdmlkZXIpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyID0gbG9nUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSBmb3IgYSBnaXZlbiBsb2cgdHlwZS5cbiAgICAgKiBUaGVyZSBhcmUgc29tZSBwcmVkZWZpbmVkIGNvbnRlbnQgcGxhY2Vob2xkZXJzIHRoZSB1c2VyIGNhbiB1dGlsaXplXG4gICAgICogdG8gY29uZmlndXJlIHRoZSBjdXN0b20gbWVzc2FnZXM6XG4gICAgICpcbiAgICAgKiB7MH06IFRoZSB0aW1lIHdoZW4gdGhlIGxvZyB3YXMgYWRkZWQuXG4gICAgICpcbiAgICAgKiB7MX06IFRoZSB0eXBlIG9mIHRoZSBsb2cgKFRyYWNlLCBEZWJ1ZyAsIEluZm9ybWF0aW9uLCBldGMpXG4gICAgICpcbiAgICAgKiB7Mn06IEEgY3VzdG9tIHRhZyB2YWx1ZSBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIHszfTogVGhlIGxvZyBtZXNzYWdlLlxuICAgICAqL1xuICAgIHNldE1lc3NhZ2VUZW1wbGF0ZSh0eXBlOiBMb2dUeXBlLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkXG4gICAge1xuICAgICAgICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMubGVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoTG9nZ2luZ1NlcnZpY2UudHlwZU5vdFJlY29nbml6ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG1lc3NhZ2UpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXNzYWdlIHRlbXBsYXRlIGNhbiBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXNbdHlwZV0gPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgZm9yIGFsbCB0aGUgdHlwZXMuXG4gICAgICogVGhlcmUgYXJlIHNvbWUgcHJlZGVmaW5lZCBjb250ZW50IHBsYWNlaG9sZGVycyB0aGUgdXNlciBjYW4gdXRpbGl6ZVxuICAgICAqIHRvIGNvbmZpZ3VyZSB0aGUgY3VzdG9tIG1lc3NhZ2VzOlxuICAgICAqXG4gICAgICogezB9OiBUaGUgdGltZSB3aGVuIHRoZSBsb2cgd2FzIGFkZGVkLlxuICAgICAqXG4gICAgICogezF9OiBUaGUgdHlwZSBvZiB0aGUgbG9nIChUcmFjZSwgRGVidWcgLCBJbmZvcm1hdGlvbiwgZXRjKVxuICAgICAqXG4gICAgICogezJ9OiBBIGN1c3RvbSB0YWcgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiB7M306IFRoZSBsb2cgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzZXRNZXNzYWdlVGVtcGxhdGVGb3JBbGwobWVzc2FnZTogc3RyaW5nKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKE9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG1lc3NhZ2UpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXNzYWdlIHRlbXBsYXRlIGNhbiBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMucHVzaChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIGxvZyBsZXZlbC5cbiAgICAgKiBMb2cgdHlwZXMgc21hbGxlciB0aGFuIHRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHNldE1pbmltdW1MZXZlbCh0eXBlOiBMb2dUeXBlKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gdGhpcy5tZXNzYWdlVGVtcGxhdGVzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKExvZ2dpbmdTZXJ2aWNlLnR5cGVOb3RSZWNvZ25pemVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWluaW11bUxldmVsID0gdHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2dzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgbG9nIGVudHJ5LlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgdXNlZCBmb3IgZnVydGhlciBhbmFseXNpcy5cbiAgICAgKi9cbiAgICBsb2cobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBMb2dUeXBlID0gTG9nVHlwZS5UcmFjZSwgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gdGhpcy5tZXNzYWdlVGVtcGxhdGVzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKExvZ2dpbmdTZXJ2aWNlLnR5cGVOb3RSZWNvZ25pemVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWVzc2FnZSBjYW4gbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPCB0aGlzLm1pbmltdW1MZXZlbClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IFN0cmluZ0V4dGVuc2lvbnMuZm9ybWF0KHRoaXMubWVzc2FnZVRlbXBsYXRlc1t0eXBlXSwgRGF0ZUV4dGVuc2lvbnMuZm9ybWF0KG5ldyBEYXRlKCksICdoaDptbTpzcycpLCBMb2dUeXBlW3R5cGVdLCB0YWcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSlcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBMb2dUeXBlLlRyYWNlOlxuICAgICAgICAgICAgICAgIHRoaXMubG9nUHJvdmlkZXIudHJhY2UoZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTG9nVHlwZS5EZWJ1ZzpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmRlYnVnKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuSW5mb3JtYXRpb246XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dQcm92aWRlci5pbmZvKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuV2FybmluZzpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLndhcm4oZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTG9nVHlwZS5FcnJvcjpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuQ3JpdGljYWw6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubG9nUHJvdmlkZXIuY3JpdGljYWwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmNyaXRpY2FsKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB0cmFjZSBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ1R5cGUuVHJhY2UsIHRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRlYnVnIGxvZyBlbnRyeS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIHRhZyBhIHRhZyB2YWx1ZSBmb3IgdGhlIGVudHJ5LlxuICAgICAqL1xuICAgIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nVHlwZS5EZWJ1ZywgdGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGluZm9ybWF0aW9uIGxvZyBlbnRyeS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIHRhZyBhIHRhZyB2YWx1ZSBmb3IgdGhlIGVudHJ5LlxuICAgICAqL1xuICAgIGluZm9ybWF0aW9uKG1lc3NhZ2U6IHN0cmluZywgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nVHlwZS5JbmZvcm1hdGlvbiwgdGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgd2FybmluZyBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICB3YXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nVHlwZS5XYXJuaW5nLCB0YWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gZXJyb3IgbG9nIGVudHJ5LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIHZhbHVlIGZvciB0aGUgZW50cnkuXG4gICAgICovXG4gICAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCB0YWc6IHN0cmluZyA9IG51bGwpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvZyhtZXNzYWdlLCBMb2dUeXBlLkVycm9yLCB0YWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjcml0aWNhbCBlcnJvciBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICBjcml0aWNhbChtZXNzYWdlOiBzdHJpbmcsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ1R5cGUuQ3JpdGljYWwsIHRhZyk7XG4gICAgfVxufVxuIl19