UNPKG

moh-common-lib

Version:

A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).

400 lines 25 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { AbstractHttpService } from './abstract-api-service'; import { throwError } from 'rxjs'; import * as moment_ from 'moment'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; /** @type {?} */ var moment = moment_; /** @enum {string} */ var SeverityLevels = { INFO: 'info', ERROR: 'error', }; /** @enum {string} */ var CommonLogEvents = { navigation: 'navigation', error: 'error', submission: 'submission', }; export { CommonLogEvents }; /** * @record */ export function CommonLogMessage() { } if (false) { /** * The type of event being logged. * @type {?} */ CommonLogMessage.prototype.event; /* Skipping unhandled member: [key: string]: any;*/ } var CommonLogger = /** @class */ (function (_super) { tslib_1.__extends(CommonLogger, _super); function CommonLogger(http) { var _this = _super.call(this, http) || this; _this.http = http; /** * The HTTP Headers which go with each request. These MUST be set if you are * using the logger. Fields include: * * - program (REQUIRED, the application wide code) * - applicationId (REQUIRED, like sessionId) * - request_method (REQUIRED, 'POST') * - logsource: (REQUIRED, window.location.hostname) * - http_x_forwarded_host (REQUIRED, window.location.hostname) * */ _this._headers = new HttpHeaders({ request_method: 'POST', logsource: window.location.hostname, http_x_forwarded_host: window.location.hostname }); _this.url = null; return _this; } Object.defineProperty(CommonLogger.prototype, "applicationId", { get: /** * @return {?} */ function () { return this._headers.get('applicationId'); }, set: /** * @param {?} id * @return {?} */ function (id) { this._headers = this._headers.set('applicationId', id); }, enumerable: true, configurable: true }); Object.defineProperty(CommonLogger.prototype, "programName", { get: /** * @return {?} */ function () { return this._headers.get('name'); }, set: /** * @param {?} name * @return {?} */ function (name) { this._headers = this._headers.set('program', name); }, enumerable: true, configurable: true }); /** * @param {?} newURL * @return {?} */ CommonLogger.prototype.setURL = /** * @param {?} newURL * @return {?} */ function (newURL) { this.url = newURL; }; /** * @param {?} message * @return {?} */ CommonLogger.prototype.log = /** * @param {?} message * @return {?} */ function (message) { this._log((/** @type {?} */ (message))); }; /** * @param {?} errorMessage * @return {?} */ CommonLogger.prototype.logError = /** * @param {?} errorMessage * @return {?} */ function (errorMessage) { this._logError((/** @type {?} */ (errorMessage))); }; /** * Log a message to Splunk. This is the main way to send logs and * automatically includes meta-data. You do **not** need to subscribe to the * response, as the service already does that. The input object must have an * 'event' property set, everything else is optional. * * Example: * ``` this.logService.log({ event: 'submission', dateObj: new Date() }); ``` * @param message A JavaScript object, nesting is fine, with `event` property * set. */ /** * Log a message to Splunk. This is the main way to send logs and * automatically includes meta-data. You do **not** need to subscribe to the * response, as the service already does that. The input object must have an * 'event' property set, everything else is optional. * * Example: * ``` * this.logService.log({ * event: 'submission', * dateObj: new Date() * }); * ``` * @protected * @param {?} message A JavaScript object, nesting is fine, with `event` property * set. * @return {?} */ CommonLogger.prototype._log = /** * Log a message to Splunk. This is the main way to send logs and * automatically includes meta-data. You do **not** need to subscribe to the * response, as the service already does that. The input object must have an * 'event' property set, everything else is optional. * * Example: * ``` * this.logService.log({ * event: 'submission', * dateObj: new Date() * }); * ``` * @protected * @param {?} message A JavaScript object, nesting is fine, with `event` property * set. * @return {?} */ function (message) { this.setSeverity(SeverityLevels.INFO); return this._sendLog(message); }; /** * @protected * @param {?} errorMessage * @return {?} */ CommonLogger.prototype._logError = /** * @protected * @param {?} errorMessage * @return {?} */ function (errorMessage) { this.setSeverity(SeverityLevels.ERROR); return this._sendLog(errorMessage); }; /** * Log HTTP errors, e.g. when losing network connectivity or receiving an * error response code. */ /** * Log HTTP errors, e.g. when losing network connectivity or receiving an * error response code. * @param {?} error * @return {?} */ CommonLogger.prototype.logHttpError = /** * Log HTTP errors, e.g. when losing network connectivity or receiving an * error response code. * @param {?} error * @return {?} */ function (error) { return this._logError({ event: CommonLogEvents.error, message: error.message, errorName: error.name, statusText: error.statusText }); }; /** * Internal method to send logs to Splunk, includes meta-data except that's * consistent across all requests, but not specific values like severity * level. * * @param message A JavaScript object or anything that can be toString()'d, * like Date */ /** * Internal method to send logs to Splunk, includes meta-data except that's * consistent across all requests, but not specific values like severity * level. * * @private * @param {?} message A JavaScript object or anything that can be toString()'d, * like Date * @return {?} */ CommonLogger.prototype._sendLog = /** * Internal method to send logs to Splunk, includes meta-data except that's * consistent across all requests, but not specific values like severity * level. * * @private * @param {?} message A JavaScript object or anything that can be toString()'d, * like Date * @return {?} */ function (message) { // Update headers this.setTimestamp(); this.setTags(message.event); if (this.url === null) { /** @type {?} */ var msg = 'Unable to send logs as URL as not been set via setURL()'; console.error(msg); return throwError(msg); } // Configure request /** @type {?} */ var body = { message: message }; // We call .subscribe() here because we don't care about the response and // we want to ensure that we never forget to call subscribe. return this.post(this.url, body).subscribe(); }; /** * @protected * @param {?} error * @return {?} */ CommonLogger.prototype.handleError = /** * @protected * @param {?} error * @return {?} */ function (error) { if (error.error instanceof ErrorEvent) { // Client-side / network error occured console.error('An error occured: ', error.error.message); } else { // The backend returned an unsuccessful response code console.error("Backend returned error code: " + error.status + ". Error body: " + error.error); } return throwError(error); }; Object.defineProperty(CommonLogger.prototype, "httpOptions", { /** * Overwrite the inherited httpOptions so we can set responseType to text. * This updates Angular's parsing, and it won't error out due to the server * not responding with JSON. */ get: /** * Overwrite the inherited httpOptions so we can set responseType to text. * This updates Angular's parsing, and it won't error out due to the server * not responding with JSON. * @protected * @return {?} */ function () { return { headers: this._headers, responseType: 'text' }; }, enumerable: true, configurable: true }); // TODO: Remove moment dependency // TODO: Remove moment dependency /** * @private * @return {?} */ CommonLogger.prototype.setTimestamp = // TODO: Remove moment dependency /** * @private * @return {?} */ function () { this._headers = this._headers.set('timestamp', moment().toISOString()); }; /** * @private * @param {?} severity * @return {?} */ CommonLogger.prototype.setSeverity = /** * @private * @param {?} severity * @return {?} */ function (severity) { this._headers = this._headers.set('severity', severity); }; /** * The headers are easier to search in splunk, and we aren't using tags, so * repurpose it to event type. */ /** * The headers are easier to search in splunk, and we aren't using tags, so * repurpose it to event type. * @private * @param {?} message * @return {?} */ CommonLogger.prototype.setTags = /** * The headers are easier to search in splunk, and we aren't using tags, so * repurpose it to event type. * @private * @param {?} message * @return {?} */ function (message) { this._headers = this._headers.set('tags', message); }; CommonLogger.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ CommonLogger.ctorParameters = function () { return [ { type: HttpClient } ]; }; /** @nocollapse */ CommonLogger.ngInjectableDef = i0.defineInjectable({ factory: function CommonLogger_Factory() { return new CommonLogger(i0.inject(i1.HttpClient)); }, token: CommonLogger, providedIn: "root" }); return CommonLogger; }(AbstractHttpService)); export { CommonLogger }; if (false) { /** * The HTTP Headers which go with each request. These MUST be set if you are * using the logger. Fields include: * * - program (REQUIRED, the application wide code) * - applicationId (REQUIRED, like sessionId) * - request_method (REQUIRED, 'POST') * - logsource: (REQUIRED, window.location.hostname) * - http_x_forwarded_host (REQUIRED, window.location.hostname) * * @type {?} * @protected */ CommonLogger.prototype._headers; /** * @type {?} * @private */ CommonLogger.prototype.url; /** * @type {?} * @protected */ CommonLogger.prototype.http; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tb2gtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBcUIsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7OztJQUM1QixNQUFNLEdBQUcsT0FBTzs7O0lBR3BCLE1BQU8sTUFBTTtJQUNiLE9BQVEsT0FBTzs7OztJQUlmLFlBQWEsWUFBWTtJQUN6QixPQUFRLE9BQU87SUFDZixZQUFhLFlBQVk7Ozs7OztBQUczQixzQ0FLQzs7Ozs7O0lBSEMsaUNBQWM7OztBQUtoQjtJQUdrQyx3Q0FBbUI7SUFvQm5ELHNCQUFzQixJQUFnQjtRQUF0QyxZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUNaO1FBRnFCLFVBQUksR0FBSixJQUFJLENBQVk7Ozs7Ozs7Ozs7OztRQVI1QixjQUFRLEdBQWdCLElBQUksV0FBVyxDQUFDO1lBQ2hELGNBQWMsRUFBRSxNQUFNO1lBQ3RCLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFDbkMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRO1NBQ2hELENBQUMsQ0FBQztRQUVLLFNBQUcsR0FBVyxJQUFJLENBQUM7O0lBSTNCLENBQUM7SUFFRCxzQkFBSSx1Q0FBYTs7OztRQUlqQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUUsZUFBZSxDQUFFLENBQUM7UUFDOUMsQ0FBQzs7Ozs7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Q29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwU2VydmljZSB9IGZyb20gJy4vYWJzdHJhY3QtYXBpLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbmVudW0gU2V2ZXJpdHlMZXZlbHMge1xyXG4gIElORk8gPSAnaW5mbycsXHJcbiAgRVJST1IgPSAnZXJyb3InLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBDb21tb25Mb2dFdmVudHMge1xyXG4gIG5hdmlnYXRpb24gPSAnbmF2aWdhdGlvbicsXHJcbiAgZXJyb3IgPSAnZXJyb3InLFxyXG4gIHN1Ym1pc3Npb24gPSAnc3VibWlzc2lvbidcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb21tb25Mb2dNZXNzYWdlIHtcclxuICAvKiogVGhlIHR5cGUgb2YgZXZlbnQgYmVpbmcgbG9nZ2VkLiAqL1xyXG4gIGV2ZW50OiBzdHJpbmc7IC8vIFNob3VsZCBiZSBzdWJjbGFzc2VzIGludG8gbXVsdGlwbGUgc3RyaW5nIGxpdGVyYWxzXHJcbiAgLy8gV2UgYWxsb3cgYW55IG90aGVyIHByb3BlcnRpZXMvdmFsdWVzIGluIHRoZSBpbnRlcmZhY2VcclxuICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbW1vbkxvZ2dlciBleHRlbmRzIEFic3RyYWN0SHR0cFNlcnZpY2Uge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBIVFRQIEhlYWRlcnMgd2hpY2ggZ28gd2l0aCBlYWNoIHJlcXVlc3QuICBUaGVzZSBNVVNUIGJlIHNldCBpZiB5b3UgYXJlXHJcbiAgICogdXNpbmcgdGhlIGxvZ2dlci4gIEZpZWxkcyBpbmNsdWRlOlxyXG4gICAqXHJcbiAgICogLSBwcm9ncmFtIChSRVFVSVJFRCwgdGhlIGFwcGxpY2F0aW9uIHdpZGUgY29kZSlcclxuICAgKiAtIGFwcGxpY2F0aW9uSWQgKFJFUVVJUkVELCBsaWtlIHNlc3Npb25JZClcclxuICAgKiAtIHJlcXVlc3RfbWV0aG9kIChSRVFVSVJFRCwgJ1BPU1QnKVxyXG4gICAqIC0gbG9nc291cmNlOiAoUkVRVUlSRUQsIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSlcclxuICAgKiAtIGh0dHBfeF9mb3J3YXJkZWRfaG9zdCAoUkVRVUlSRUQsIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSlcclxuICAgKlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBfaGVhZGVyczogSHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgcmVxdWVzdF9tZXRob2Q6ICdQT1NUJyxcclxuICAgIGxvZ3NvdXJjZTogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxyXG4gICAgaHR0cF94X2ZvcndhcmRlZF9ob3N0OiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWVcclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSB1cmw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50KSB7XHJcbiAgICBzdXBlcihodHRwKTtcclxuICB9XHJcblxyXG4gIHNldCBhcHBsaWNhdGlvbklkKCBpZDogc3RyaW5nICkge1xyXG4gICAgdGhpcy5faGVhZGVycyA9IHRoaXMuX2hlYWRlcnMuc2V0KCAnYXBwbGljYXRpb25JZCcsIGlkICk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXBwbGljYXRpb25JZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzLmdldCggJ2FwcGxpY2F0aW9uSWQnICk7XHJcbiAgfVxyXG5cclxuICBzZXQgcHJvZ3JhbU5hbWUoIG5hbWU6IHN0cmluZyApIHtcclxuICAgIHRoaXMuX2hlYWRlcnMgPSB0aGlzLl9oZWFkZXJzLnNldCggJ3Byb2dyYW0nLCBuYW1lICk7XHJcbiAgfVxyXG5cclxuICBnZXQgcHJvZ3JhbU5hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faGVhZGVycy5nZXQoICduYW1lJyApO1xyXG4gIH1cclxuXHJcbiAgc2V0VVJMKG5ld1VSTDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnVybCA9IG5ld1VSTDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2coIG1lc3NhZ2U6IGFueSApIHtcclxuICAgIHRoaXMuX2xvZyggbWVzc2FnZSBhcyBDb21tb25Mb2dNZXNzYWdlICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nRXJyb3IoIGVycm9yTWVzc2FnZTogYW55ICkge1xyXG4gICAgdGhpcy5fbG9nRXJyb3IoIGVycm9yTWVzc2FnZSBhcyBDb21tb25Mb2dNZXNzYWdlICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2cgYSBtZXNzYWdlIHRvIFNwbHVuay4gVGhpcyBpcyB0aGUgbWFpbiB3YXkgdG8gc2VuZCBsb2dzIGFuZFxyXG4gICAqIGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgbWV0YS1kYXRhLiBZb3UgZG8gKipub3QqKiBuZWVkIHRvIHN1YnNjcmliZSB0byB0aGVcclxuICAgKiByZXNwb25zZSwgYXMgdGhlIHNlcnZpY2UgYWxyZWFkeSBkb2VzIHRoYXQuIFRoZSBpbnB1dCBvYmplY3QgbXVzdCBoYXZlIGFuXHJcbiAgICogJ2V2ZW50JyBwcm9wZXJ0eSBzZXQsIGV2ZXJ5dGhpbmcgZWxzZSBpcyBvcHRpb25hbC5cclxuICAgKlxyXG4gICAqIEV4YW1wbGU6XHJcbiAgICogYGBgXHJcbiAgICB0aGlzLmxvZ1NlcnZpY2UubG9nKHtcclxuICAgICAgIGV2ZW50OiAnc3VibWlzc2lvbicsXHJcbiAgICAgICBkYXRlT2JqOiBuZXcgRGF0ZSgpXHJcbiAgICB9KTtcclxuICAgIGBgYFxyXG4gICAqIEBwYXJhbSBtZXNzYWdlIEEgSmF2YVNjcmlwdCBvYmplY3QsIG5lc3RpbmcgaXMgZmluZSwgd2l0aCBgZXZlbnRgIHByb3BlcnR5XHJcbiAgICogc2V0LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBfbG9nKG1lc3NhZ2U6IENvbW1vbkxvZ01lc3NhZ2UpIHtcclxuICAgIHRoaXMuc2V0U2V2ZXJpdHkoU2V2ZXJpdHlMZXZlbHMuSU5GTyk7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VuZExvZyhtZXNzYWdlKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfbG9nRXJyb3IoZXJyb3JNZXNzYWdlOiBDb21tb25Mb2dNZXNzYWdlKSB7XHJcbiAgICB0aGlzLnNldFNldmVyaXR5KFNldmVyaXR5TGV2ZWxzLkVSUk9SKTtcclxuICAgIHJldHVybiB0aGlzLl9zZW5kTG9nKGVycm9yTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2cgSFRUUCBlcnJvcnMsIGUuZy4gd2hlbiBsb3NpbmcgbmV0d29yayBjb25uZWN0aXZpdHkgb3IgcmVjZWl2aW5nIGFuXHJcbiAgICogZXJyb3IgcmVzcG9uc2UgY29kZS5cclxuICAgKi9cclxuICBwdWJsaWMgbG9nSHR0cEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvZ0Vycm9yKHtcclxuICAgICAgZXZlbnQ6IENvbW1vbkxvZ0V2ZW50cy5lcnJvcixcclxuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcclxuICAgICAgZXJyb3JOYW1lOiBlcnJvci5uYW1lLFxyXG4gICAgICBzdGF0dXNUZXh0OiBlcnJvci5zdGF0dXNUZXh0XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBzZW5kIGxvZ3MgdG8gU3BsdW5rLCBpbmNsdWRlcyBtZXRhLWRhdGEgZXhjZXB0IHRoYXQnc1xyXG4gICAqIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCByZXF1ZXN0cywgYnV0IG5vdCBzcGVjaWZpYyB2YWx1ZXMgbGlrZSBzZXZlcml0eVxyXG4gICAqIGxldmVsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIG1lc3NhZ2UgQSBKYXZhU2NyaXB0IG9iamVjdCBvciBhbnl0aGluZyB0aGF0IGNhbiBiZSB0b1N0cmluZygpJ2QsXHJcbiAgICogbGlrZSBEYXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2VuZExvZyhtZXNzYWdlOiBDb21tb25Mb2dNZXNzYWdlKSB7XHJcbiAgICAvLyBVcGRhdGUgaGVhZGVyc1xyXG4gICAgdGhpcy5zZXRUaW1lc3RhbXAoKTtcclxuICAgIHRoaXMuc2V0VGFncyhtZXNzYWdlLmV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy51cmwgPT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBtc2cgPSAnVW5hYmxlIHRvIHNlbmQgbG9ncyBhcyBVUkwgYXMgbm90IGJlZW4gc2V0IHZpYSBzZXRVUkwoKSc7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG1zZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29uZmlndXJlIHJlcXVlc3RcclxuICAgIGNvbnN0IGJvZHkgPSB7IG1lc3NhZ2U6IG1lc3NhZ2UgfTtcclxuXHJcbiAgICAvLyBXZSBjYWxsIC5zdWJzY3JpYmUoKSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzcG9uc2UgYW5kXHJcbiAgICAvLyB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHdlIG5ldmVyIGZvcmdldCB0byBjYWxsIHN1YnNjcmliZS5cclxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwsIGJvZHkpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhbmRsZUVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgaWYgKGVycm9yLmVycm9yIGluc3RhbmNlb2YgRXJyb3JFdmVudCkge1xyXG4gICAgICAvLyBDbGllbnQtc2lkZSAvIG5ldHdvcmsgZXJyb3Igb2NjdXJlZFxyXG4gICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cmVkOiAnLCBlcnJvci5lcnJvci5tZXNzYWdlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRoZSBiYWNrZW5kIHJldHVybmVkIGFuIHVuc3VjY2Vzc2Z1bCByZXNwb25zZSBjb2RlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tlbmQgcmV0dXJuZWQgZXJyb3IgY29kZTogJHtlcnJvci5zdGF0dXN9LiAgRXJyb3IgYm9keTogJHtlcnJvci5lcnJvcn1gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPdmVyd3JpdGUgdGhlIGluaGVyaXRlZCBodHRwT3B0aW9ucyBzbyB3ZSBjYW4gc2V0IHJlc3BvbnNlVHlwZSB0byB0ZXh0LlxyXG4gICAqIFRoaXMgdXBkYXRlcyBBbmd1bGFyJ3MgcGFyc2luZywgYW5kIGl0IHdvbid0IGVycm9yIG91dCBkdWUgdG8gdGhlIHNlcnZlclxyXG4gICAqIG5vdCByZXNwb25kaW5nIHdpdGggSlNPTi5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZ2V0IGh0dHBPcHRpb25zKCk6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBoZWFkZXJzOiB0aGlzLl9oZWFkZXJzLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0J1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IFJlbW92ZSBtb21lbnQgZGVwZW5kZW5jeVxyXG4gIHByaXZhdGUgc2V0VGltZXN0YW1wKCkge1xyXG4gICAgdGhpcy5faGVhZGVycyA9IHRoaXMuX2hlYWRlcnMuc2V0KCd0aW1lc3RhbXAnLCBtb21lbnQoKS50b0lTT1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2V2ZXJpdHkoc2V2ZXJpdHk6IFNldmVyaXR5TGV2ZWxzKSB7XHJcbiAgICB0aGlzLl9oZWFkZXJzID0gdGhpcy5faGVhZGVycy5zZXQoJ3NldmVyaXR5Jywgc2V2ZXJpdHkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGhlYWRlcnMgYXJlIGVhc2llciB0byBzZWFyY2ggaW4gc3BsdW5rLCBhbmQgd2UgYXJlbid0IHVzaW5nIHRhZ3MsIHNvXHJcbiAgICogcmVwdXJwb3NlIGl0IHRvIGV2ZW50IHR5cGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRUYWdzKG1lc3NhZ2U6IHN0cmluZyApIHtcclxuICAgIHRoaXMuX2hlYWRlcnMgPSB0aGlzLl9oZWFkZXJzLnNldCgndGFncycsIG1lc3NhZ2UpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19