UNPKG

ng-ptplibraries

Version:

262 lines (261 loc) 22.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { ServiceBase } from '../base/service.base'; import { Observable } from 'rxjs'; import { ScriptModel, StyleModel } from '../models/loader'; import { map, has } from 'lodash'; var LoaderService = /** @class */ (function (_super) { tslib_1.__extends(LoaderService, _super); function LoaderService() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.scripts = []; _this.styles = []; _this.scriptIndex = 0; return _this; } /** * @param {?} scriptModel * @return {?} */ LoaderService.prototype.CreateScriptElement = /** * @param {?} scriptModel * @return {?} */ function (scriptModel) { /** @type {?} */ var scriptElement = document.createElement('script'); scriptElement.type = 'text/javascript'; scriptElement.src = scriptModel.src; scriptElement.integrity = scriptModel.integrity; scriptElement.crossOrigin = scriptModel.crossorigin; return scriptElement; }; /** * @param {?} styleModel * @return {?} */ LoaderService.prototype.CreateStyleElement = /** * @param {?} styleModel * @return {?} */ function (styleModel) { /** @type {?} */ var styleElement = document.createElement('link'); styleElement.href = styleModel.href; styleElement.rel = styleModel.rel; styleElement.integrity = styleModel.integrity; styleElement['crossorigin'] = styleModel.crossorigin; return styleElement; }; /** * Waits for script to finish before loading the next script * @param {?} observer * @return {?} */ LoaderService.prototype.SyncLoad = /** * Waits for script to finish before loading the next script * @param {?} observer * @return {?} */ function (observer) { var _this = this; /** @type {?} */ var script = null; if (this.scriptIndex < this.scripts.length) { script = this.scripts[this.scriptIndex]; } if (this.scripts.every(function (a) { return a.loaded === true; })) { /** @type {?} */ var ret = this.scripts.map(function (d) { return d.Deserialize(); }); observer.next(/** @type {?} */ (ret)); observer.complete(); } else { /** @type {?} */ var scriptElement = this.CreateScriptElement(script); scriptElement.onload = function () { script.loaded = true; if (_this.scriptIndex < _this.scripts.length) _this.scriptIndex++; _this.SyncLoad(observer); }; scriptElement.onerror = function (error) { observer.error('Couldn\'t load script ' + script.src); }; document.getElementsByTagName('body')[0].appendChild(scriptElement); } }; /** * Loads an external script from a url synchronously. * @param loader * @example * *loader.LoadScript([ { source: 'https://test.com/test.min.js', integrity: 'fdsafdsar32qxr3q2' } *]).subscribe(); * */ /** * Loads an external script from a url synchronously. * \@example * * loader.LoadScript([ * { * source: 'https://test.com/test.min.js', * integrity: 'fdsafdsar32qxr3q2' * } * ]).subscribe(); * * @param {?} loader * @param {...?} pussy * @return {?} */ LoaderService.prototype.LoadScript = /** * Loads an external script from a url synchronously. * \@example * * loader.LoadScript([ * { * source: 'https://test.com/test.min.js', * integrity: 'fdsafdsar32qxr3q2' * } * ]).subscribe(); * * @param {?} loader * @param {...?} pussy * @return {?} */ function (loader) { var _this = this; var pussy = []; for (var _i = 1; _i < arguments.length; _i++) { pussy[_i - 1] = arguments[_i]; } return new Observable(function (observer) { /** @type {?} */ var scriptSrcs = _this.scripts.map(function (a) { return a.src; }); // Push to scripts array if source does not exist for (var i = 0; i < loader.length; i++) { /** @type {?} */ var newScript = new ScriptModel(); newScript.src = loader[i].source; newScript.integrity = loader[i].integrity || ''; if (!has(scriptSrcs, newScript.src)) { _this.scripts.push(newScript); } if (!_this.scripts.length) { _this.scripts.push(newScript); } scriptSrcs = _this.scripts.map(function (a) { return a.src; }); } _this.SyncLoad(observer); }); }; /** * Loads an external stylesheet from a url * @param loader * @example * *loader.LoadScript([ { source: 'https://test.com/test.min.js', integrity: 'fdsafdsar32qxr3q2' } *]).subscribe(); * */ /** * Loads an external stylesheet from a url * \@example * * loader.LoadScript([ * { * source: 'https://test.com/test.min.js', * integrity: 'fdsafdsar32qxr3q2' * } * ]).subscribe(); * * @param {?} loader * @return {?} */ LoaderService.prototype.LoadStyle = /** * Loads an external stylesheet from a url * \@example * * loader.LoadScript([ * { * source: 'https://test.com/test.min.js', * integrity: 'fdsafdsar32qxr3q2' * } * ]).subscribe(); * * @param {?} loader * @return {?} */ function (loader) { var _this = this; return new Observable(function (observer) { /** @type {?} */ var styleHrefs = _this.styles.map(function (a) { return a.href; }); // Push to scripts array if source does not exist for (var i = 0; i < loader.length; i++) { /** @type {?} */ var newStyle = new StyleModel(); newStyle.href = loader[i].href; newStyle.integrity = loader[i].integrity || ''; if (!has(styleHrefs, newStyle.href)) { _this.styles.push(newStyle); } if (!_this.styles.length) { _this.styles.push(newStyle); } styleHrefs = _this.styles.map(function (a) { return a.href; }); } map(_this.styles, function (style) { // Complete if already loaded if (style.loaded) { /** @type {?} */ var ret = _this.styles.map(function (d) { return d.Deserialize(); }); observer.next(/** @type {?} */ (ret)); observer.complete(); } else { /** @type {?} */ var scriptElement = _this.CreateStyleElement(style); scriptElement.onload = function () { style.loaded = true; if (_this.styles.every(function (a) { return a.loaded === true; })) { /** @type {?} */ var ret = _this.styles.map(function (d) { return d.Deserialize(); }); observer.next(/** @type {?} */ (ret)); observer.complete(); } }; scriptElement.onerror = function (error) { observer.error('Couldn\'t load style ' + style.href); }; /** @type {?} */ var head = document.getElementsByTagName('head')[0]; /** @type {?} */ var styleTag = head.getElementsByTagName('style')[0]; head.insertBefore(scriptElement, styleTag); } }); }); }; return LoaderService; }(ServiceBase)); export { LoaderService }; if (false) { /** @type {?} */ LoaderService.prototype.scripts; /** @type {?} */ LoaderService.prototype.styles; /** @type {?} */ LoaderService.prototype.scriptIndex; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1wdHBsaWJyYXJpZXMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBZSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWxDLElBQUE7SUFBbUMseUNBQVc7Ozt3QkFFVCxFQUFFO3VCQUNKLEVBQUU7NEJBQ0gsQ0FBQzs7Ozs7OztJQUV2QiwyQ0FBbUI7Ozs7Y0FBQyxXQUF3Qjs7UUFDaEQsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxhQUFhLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO1FBQ3ZDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNwQyxhQUFhLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDaEQsYUFBYSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO1FBQ3BELE9BQU8sYUFBYSxDQUFDOzs7Ozs7SUFHakIsMENBQWtCOzs7O2NBQUMsVUFBc0I7O1FBQzdDLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsWUFBWSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ3BDLFlBQVksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNsQyxZQUFZLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxT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R0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3hELENBQUM7O29CQUVGLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ3BELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQzlDO2FBQ0osQ0FBQyxDQUFDO1NBQ04sQ0FBQyxDQUFDO0tBQ047d0JBbktMO0VBTW1DLFdBQVcsRUErSjdDLENBQUE7QUEvSkQseUJBK0pDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4uL2Jhc2Uvc2VydmljZS5iYXNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTY3JpcHRNb2RlbCwgU3R5bGVNb2RlbCwgTG9hZGVyTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvbG9hZGVyJztcbmltcG9ydCB7IG1hcCwgaGFzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIExvYWRlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlQmFzZSB7XG5cbiAgICBwcml2YXRlIHNjcmlwdHM6IFNjcmlwdE1vZGVsW10gPSBbXTtcbiAgICBwcml2YXRlIHN0eWxlczogU3R5bGVNb2RlbFtdID0gW107XG4gICAgcHJpdmF0ZSBzY3JpcHRJbmRleDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgQ3JlYXRlU2NyaXB0RWxlbWVudChzY3JpcHRNb2RlbDogU2NyaXB0TW9kZWwpIHtcbiAgICAgICAgbGV0IHNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0RWxlbWVudC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgIHNjcmlwdEVsZW1lbnQuc3JjID0gc2NyaXB0TW9kZWwuc3JjO1xuICAgICAgICBzY3JpcHRFbGVtZW50LmludGVncml0eSA9IHNjcmlwdE1vZGVsLmludGVncml0eTtcbiAgICAgICAgc2NyaXB0RWxlbWVudC5jcm9zc09yaWdpbiA9IHNjcmlwdE1vZGVsLmNyb3Nzb3JpZ2luO1xuICAgICAgICByZXR1cm4gc2NyaXB0RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIENyZWF0ZVN0eWxlRWxlbWVudChzdHlsZU1vZGVsOiBTdHlsZU1vZGVsKSB7XG4gICAgICAgIGxldCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlRWxlbWVudC5ocmVmID0gc3R5bGVNb2RlbC5ocmVmO1xuICAgICAgICBzdHlsZUVsZW1lbnQucmVsID0gc3R5bGVNb2RlbC5yZWw7XG4gICAgICAgIHN0eWxlRWxlbWVudC5pbnRlZ3JpdHkgPSBzdHlsZU1vZGVsLmludGVncml0eTtcbiAgICAgICAgc3R5bGVFbGVtZW50Wydjcm9zc29yaWdpbiddID0gc3R5bGVNb2RlbC5jcm9zc29yaWdpbjtcbiAgICAgICAgcmV0dXJuIHN0eWxlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYWl0cyBmb3Igc2NyaXB0IHRvIGZpbmlzaCBiZWZvcmUgbG9hZGluZyB0aGUgbmV4dCBzY3JpcHRcbiAgICAgKi9cbiAgICBwcml2YXRlIFN5bmNMb2FkKG9ic2VydmVyOiBPYnNlcnZlcjxTY3JpcHRNb2RlbFtdPikge1xuICAgICAgICBsZXQgc2NyaXB0ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zY3JpcHRJbmRleCA8IHRoaXMuc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNjcmlwdCA9IHRoaXMuc2NyaXB0c1t0aGlzLnNjcmlwdEluZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNjcmlwdHMuZXZlcnkoYSA9PiBhLmxvYWRlZCA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLnNjcmlwdHMubWFwKGQgPT4gZC5EZXNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoPGFueT5yZXQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzY3JpcHRFbGVtZW50ID0gdGhpcy5DcmVhdGVTY3JpcHRFbGVtZW50KHNjcmlwdCk7XG5cbiAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNjcmlwdC5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NyaXB0SW5kZXggPCB0aGlzLnNjcmlwdHMubGVuZ3RoKSB0aGlzLnNjcmlwdEluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICB0aGlzLlN5bmNMb2FkKG9ic2VydmVyKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ0NvdWxkblxcJ3QgbG9hZCBzY3JpcHQgJyArIHNjcmlwdC5zcmMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChzY3JpcHRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuIGV4dGVybmFsIHNjcmlwdCBmcm9tIGEgdXJsIHN5bmNocm9ub3VzbHkuXG4gICAgICogQHBhcmFtIGxvYWRlclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKmxvYWRlci5Mb2FkU2NyaXB0KFtcbiAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly90ZXN0LmNvbS90ZXN0Lm1pbi5qcycsXG4gICAgICAgICAgICBpbnRlZ3JpdHk6ICdmZHNhZmRzYXIzMnF4cjNxMidcbiAgICAgICAgfVxuICAgICAqXSkuc3Vic2NyaWJlKCk7XG4gICAgICogKi9cbiAgICBMb2FkU2NyaXB0KGxvYWRlcjogTG9hZGVyTW9kZWxbXSwgLi4ucHVzc3k6IExvYWRlck1vZGVsW10pOiBPYnNlcnZhYmxlPFNjcmlwdE1vZGVsW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFNjcmlwdE1vZGVsW10+KChvYnNlcnZlcjogT2JzZXJ2ZXI8U2NyaXB0TW9kZWxbXT4pID0+IHtcbiAgICAgICAgICAgIGxldCBzY3JpcHRTcmNzID0gdGhpcy5zY3JpcHRzLm1hcChhID0+IGEuc3JjKTtcblxuICAgICAgICAgICAgLy8gUHVzaCB0byBzY3JpcHRzIGFycmF5IGlmIHNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2FkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U2NyaXB0OiBTY3JpcHRNb2RlbCA9IG5ldyBTY3JpcHRNb2RlbCgpO1xuICAgICAgICAgICAgICAgIG5ld1NjcmlwdC5zcmMgPSBsb2FkZXJbaV0uc291cmNlO1xuICAgICAgICAgICAgICAgIG5ld1NjcmlwdC5pbnRlZ3JpdHkgPSBsb2FkZXJbaV0uaW50ZWdyaXR5IHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXMoc2NyaXB0U3JjcywgbmV3U2NyaXB0LnNyYykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHRzLnB1c2gobmV3U2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHRzLnB1c2gobmV3U2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHRTcmNzID0gdGhpcy5zY3JpcHRzLm1hcChhID0+IGEuc3JjKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5TeW5jTG9hZChvYnNlcnZlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuIGV4dGVybmFsIHN0eWxlc2hlZXQgZnJvbSBhIHVybFxuICAgICAqIEBwYXJhbSBsb2FkZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICpsb2FkZXIuTG9hZFNjcmlwdChbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vdGVzdC5jb20vdGVzdC5taW4uanMnLFxuICAgICAgICAgICAgaW50ZWdyaXR5OiAnZmRzYWZkc2FyMzJxeHIzcTInXG4gICAgICAgIH1cbiAgICAgKl0pLnN1YnNjcmliZSgpO1xuICAgICAqICovXG4gICAgTG9hZFN0eWxlKGxvYWRlcjogTG9hZGVyTW9kZWxbXSk6IE9ic2VydmFibGU8U3R5bGVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8U3R5bGVNb2RlbD4oKG9ic2VydmVyOiBPYnNlcnZlcjxTdHlsZU1vZGVsPikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlSHJlZnMgPSB0aGlzLnN0eWxlcy5tYXAoYSA9PiBhLmhyZWYpO1xuICAgICAgICAgICAgLy8gUHVzaCB0byBzY3JpcHRzIGFycmF5IGlmIHNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2FkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U3R5bGU6IFN0eWxlTW9kZWwgPSBuZXcgU3R5bGVNb2RlbCgpO1xuICAgICAgICAgICAgICAgIG5ld1N0eWxlLmhyZWYgPSBsb2FkZXJbaV0uaHJlZjtcbiAgICAgICAgICAgICAgICBuZXdTdHlsZS5pbnRlZ3JpdHkgPSBsb2FkZXJbaV0uaW50ZWdyaXR5IHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXMoc3R5bGVIcmVmcywgbmV3U3R5bGUuaHJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMucHVzaChuZXdTdHlsZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0eWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMucHVzaChuZXdTdHlsZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3R5bGVIcmVmcyA9IHRoaXMuc3R5bGVzLm1hcChhID0+IGEuaHJlZik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hcCh0aGlzLnN0eWxlcywgc3R5bGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5zdHlsZXMubWFwKGQgPT4gZC5EZXNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCg8YW55PnJldCk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzdHlsZSBhbmQgbG9hZCBpdCBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2NyaXB0RWxlbWVudCA9IHRoaXMuQ3JlYXRlU3R5bGVFbGVtZW50KHN0eWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBzY3JpcHRFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0eWxlcy5ldmVyeShhID0+IGEubG9hZGVkID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLnN0eWxlcy5tYXAoZCA9PiBkLkRlc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoPGFueT5yZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWxlbWVudC5vbmVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdDb3VsZG5cXCd0IGxvYWQgc3R5bGUgJyArIHN0eWxlLmhyZWYpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlVGFnID0gaGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3R5bGUnKVswXTtcblxuICAgICAgICAgICAgICAgICAgICBoZWFkLmluc2VydEJlZm9yZShzY3JpcHRFbGVtZW50LCBzdHlsZVRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuIl19