UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

486 lines 33.3 kB
/** * @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==