UNPKG

@decorators/server

Version:

node decorators - decorators for express library

144 lines (135 loc) 14.3 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SwaggerResolver = void 0; const di_1 = require("@decorators/di"); const fs_1 = require("fs"); const path_1 = require("path"); const swagger_ui_dist_1 = require("swagger-ui-dist"); const core_1 = require("../../../../core"); const http_1 = require("../../../http"); const constants_1 = require("../constants"); const swagger_document_1 = require("./swagger-document"); let SwaggerResolver = exports.SwaggerResolver = class SwaggerResolver { constructor(adapter, config, document) { this.adapter = adapter; this.config = config; this.document = document; } resolve() { const swaggerPath = (0, core_1.addLeadingSlash)(this.config.path); const swaggerFilePath = (0, core_1.addLeadingSlash)((0, core_1.buildUrl)(this.config.path, 'swagger.json')); this.adapter.routes([ { handler: this.handler(JSON.stringify(this.document.generate()), { 'content-type': 'application/json' }), type: 'get', url: swaggerFilePath, }, { handler: this.handler(indexStyles(this.config.theme), { 'content-type': 'text/css' }), type: 'get', url: `${swaggerPath}/index.css`, }, { handler: this.handler(initializerScriptContent(swaggerFilePath), { 'content-type': 'text/javascript' }), type: 'get', url: `${swaggerPath}/swagger-initializer.js`, }, ]); this.adapter.serveStatic(swaggerPath, (0, swagger_ui_dist_1.absolutePath)()); } handler(response, headers = {}) { return async (...args) => { const res = await this.adapter.getParam(http_1.ParameterType.RESPONSE, null, ...args); Object.entries(headers).forEach(([name, value]) => this.adapter.setHeader(res(), name, value)); this.adapter.reply(res(), response); }; } }; exports.SwaggerResolver = SwaggerResolver = __decorate([ (0, di_1.Injectable)(), __param(0, (0, di_1.Inject)(http_1.HTTP_ADAPTER)), __param(1, (0, di_1.Inject)(constants_1.SWAGGER_CONFIG)), __metadata("design:paramtypes", [http_1.HttpApplicationAdapter, Object, swagger_document_1.SwaggerDocument]) ], SwaggerResolver); function initializerScriptContent(jsonPath) { return ` window.onload = function() { window.ui = SwaggerUIBundle({ url: "${jsonPath}", dom_id: '#swagger-ui', deepLinking: true, presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset.slice(1) // slice removes top-bar plugin ], plugins: [ SwaggerUIBundle.plugins.DownloadUrl ], layout: "StandaloneLayout" }); onSwaggerUIReady(disableSocketsTryItOut); }; function onSwaggerUIReady(fn) { const interval = setInterval(() => { if (document.getElementById('swagger-ui')) { clearInterval(interval); fn(); } }, 100); } function disableSocketsTryItOut() { const socketEvents = [...document.querySelectorAll('[data-tag^="sockets" i]')]; for (const el of socketEvents) { el.parentElement.classList.add('server-swagger-sockets'); } } `; } function indexStyles(theme) { const styles = (0, fs_1.readFileSync)((0, path_1.resolve)((0, swagger_ui_dist_1.absolutePath)(), 'index.css'), 'utf-8'); const darkStyles = (0, fs_1.readFileSync)((0, path_1.resolve)(__dirname, 'swagger-dark.css'), 'utf-8'); const styleOverrides = ` ${styles} .server-swagger-sockets .try-out { display: none; } .server-swagger-sockets .opblock-summary-method { overflow: hidden; position: relative; } .server-swagger-sockets .opblock-summary-method::after { align-items: center; background-color: #a748cb; bottom: 0; content: 'SOCKETS'; display: flex; justify-content: center; left: 0; position: absolute; right: 0; top: 0; } `; if (theme === 'light') { return styleOverrides; } return ` ${styleOverrides} ${theme === 'auto' ? '@media only screen and (prefers-color-scheme: dark) {' : ''} ${darkStyles} ${theme === 'auto' ? '}' : ''} `; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci1yZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybXMvc3dhZ2dlci9oZWxwZXJzL3N3YWdnZXItdWkvc3dhZ2dlci1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBb0Q7QUFDcEQsMkJBQWtDO0FBQ2xDLCtCQUErQjtBQUMvQixxREFBK0M7QUFFL0MsMkNBQTZEO0FBQzdELHdDQUFvRjtBQUVwRiw0Q0FBOEM7QUFDOUMseURBQXFEO0FBRzlDLElBQU0sZUFBZSw2QkFBckIsTUFBTSxlQUFlO0lBQzFCLFlBQ2dDLE9BQStCLEVBQzdCLE1BQXFCLEVBQzdDLFFBQXlCO1FBRkgsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUM3QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtJQUMvQixDQUFDO0lBRUwsT0FBTztRQUNMLE1BQU0sV0FBVyxHQUFHLElBQUEsc0JBQWUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sZUFBZSxHQUFHLElBQUEsc0JBQWUsRUFBQyxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRXBGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2xCO2dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDeEMsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsQ0FDdkM7Z0JBQ0QsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsR0FBRyxFQUFFLGVBQWU7YUFDckI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FDbkIsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQzlCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxDQUMvQjtnQkFDRCxJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsR0FBRyxXQUFXLFlBQVk7YUFDaEM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FDbkIsd0JBQXdCLENBQUMsZUFBZSxDQUFDLEVBQ3pDLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLENBQ3RDO2dCQUNELElBQUksRUFBRSxLQUFLO2dCQUNYLEdBQUcsRUFBRSxHQUFHLFdBQVcseUJBQXlCO2FBQzdDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUEsOEJBQVksR0FBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLE9BQU8sQ0FBQyxRQUFpQixFQUFFLFVBQWtDLEVBQUU7UUFDckUsT0FBTyxLQUFLLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBRS9FLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQzNDLENBQUM7WUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQTswQkFwRFksZUFBZTtJQUQzQixJQUFBLGVBQVUsR0FBRTtJQUdSLFdBQUEsSUFBQSxXQUFNLEVBQUMsbUJBQVksQ0FBQyxDQUFBO0lBQ3BCLFdBQUEsSUFBQSxXQUFNLEVBQUMsMEJBQWMsQ0FBQyxDQUFBO3FDQURnQiw2QkFBc0IsVUFFM0Msa0NBQWU7R0FKeEIsZUFBZSxDQW9EM0I7QUFFRCxTQUFTLHdCQUF3QixDQUFDLFFBQWdCO0lBQ2hELE9BQU87OztnQkFHTyxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBNkI7SUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxpQkFBWSxFQUFDLElBQUEsY0FBTyxFQUFDLElBQUEsOEJBQVksR0FBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLE1BQU0sVUFBVSxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFBLGNBQU8sRUFBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRixNQUFNLGNBQWMsR0FBRztNQUNuQixNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVCxDQUFDO0lBRUYsSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO1FBQ3JCLE9BQU8sY0FBYyxDQUFDO0tBQ3ZCO0lBRUQsT0FBTztNQUNILGNBQWM7O01BRWQsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDN0UsVUFBVTtNQUNaLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtHQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0BkZWNvcmF0b3JzL2RpJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGFic29sdXRlUGF0aCB9IGZyb20gJ3N3YWdnZXItdWktZGlzdCc7XG5cbmltcG9ydCB7IGFkZExlYWRpbmdTbGFzaCwgYnVpbGRVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEhUVFBfQURBUFRFUiwgSHR0cEFwcGxpY2F0aW9uQWRhcHRlciwgUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4uLy4uLy4uL2h0dHAnO1xuaW1wb3J0IHsgU3dhZ2dlckNvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFNXQUdHRVJfQ09ORklHIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFN3YWdnZXJEb2N1bWVudCB9IGZyb20gJy4vc3dhZ2dlci1kb2N1bWVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTd2FnZ2VyUmVzb2x2ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEhUVFBfQURBUFRFUikgcHJpdmF0ZSBhZGFwdGVyOiBIdHRwQXBwbGljYXRpb25BZGFwdGVyLFxuICAgIEBJbmplY3QoU1dBR0dFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBTd2FnZ2VyQ29uZmlnLFxuICAgIHByaXZhdGUgZG9jdW1lbnQ6IFN3YWdnZXJEb2N1bWVudCxcbiAgKSB7IH1cblxuICByZXNvbHZlKCkge1xuICAgIGNvbnN0IHN3YWdnZXJQYXRoID0gYWRkTGVhZGluZ1NsYXNoKHRoaXMuY29uZmlnLnBhdGgpO1xuICAgIGNvbnN0IHN3YWdnZXJGaWxlUGF0aCA9IGFkZExlYWRpbmdTbGFzaChidWlsZFVybCh0aGlzLmNvbmZpZy5wYXRoLCAnc3dhZ2dlci5qc29uJykpO1xuXG4gICAgdGhpcy5hZGFwdGVyLnJvdXRlcyhbXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlcihcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmRvY3VtZW50LmdlbmVyYXRlKCkpLFxuICAgICAgICAgIHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICApLFxuICAgICAgICB0eXBlOiAnZ2V0JyxcbiAgICAgICAgdXJsOiBzd2FnZ2VyRmlsZVBhdGgsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiB0aGlzLmhhbmRsZXIoXG4gICAgICAgICAgaW5kZXhTdHlsZXModGhpcy5jb25maWcudGhlbWUpLFxuICAgICAgICAgIHsgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2NzcycgfSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZTogJ2dldCcsXG4gICAgICAgIHVybDogYCR7c3dhZ2dlclBhdGh9L2luZGV4LmNzc2AsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiB0aGlzLmhhbmRsZXIoXG4gICAgICAgICAgaW5pdGlhbGl6ZXJTY3JpcHRDb250ZW50KHN3YWdnZXJGaWxlUGF0aCksXG4gICAgICAgICAgeyAnY29udGVudC10eXBlJzogJ3RleHQvamF2YXNjcmlwdCcgfSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZTogJ2dldCcsXG4gICAgICAgIHVybDogYCR7c3dhZ2dlclBhdGh9L3N3YWdnZXItaW5pdGlhbGl6ZXIuanNgLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHRoaXMuYWRhcHRlci5zZXJ2ZVN0YXRpYyhzd2FnZ2VyUGF0aCwgYWJzb2x1dGVQYXRoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyKHJlc3BvbnNlOiB1bmtub3duLCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30pIHtcbiAgICByZXR1cm4gYXN5bmMgKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZ2V0UGFyYW0oUGFyYW1ldGVyVHlwZS5SRVNQT05TRSwgbnVsbCwgLi4uYXJncyk7XG5cbiAgICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZXRIZWFkZXIocmVzKCksIG5hbWUsIHZhbHVlKSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXBseShyZXMoKSwgcmVzcG9uc2UpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZXJTY3JpcHRDb250ZW50KGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGBcbiAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cudWkgPSBTd2FnZ2VyVUlCdW5kbGUoe1xuICAgICAgICB1cmw6IFwiJHtqc29uUGF0aH1cIixcbiAgICAgICAgZG9tX2lkOiAnI3N3YWdnZXItdWknLFxuICAgICAgICBkZWVwTGlua2luZzogdHJ1ZSxcbiAgICAgICAgcHJlc2V0czogW1xuICAgICAgICAgIFN3YWdnZXJVSUJ1bmRsZS5wcmVzZXRzLmFwaXMsXG4gICAgICAgICAgU3dhZ2dlclVJU3RhbmRhbG9uZVByZXNldC5zbGljZSgxKSAvLyBzbGljZSByZW1vdmVzIHRvcC1iYXIgcGx1Z2luXG4gICAgICAgIF0sXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICBTd2FnZ2VyVUlCdW5kbGUucGx1Z2lucy5Eb3dubG9hZFVybFxuICAgICAgICBdLFxuICAgICAgICBsYXlvdXQ6IFwiU3RhbmRhbG9uZUxheW91dFwiXG4gICAgICB9KTtcblxuICAgICAgb25Td2FnZ2VyVUlSZWFkeShkaXNhYmxlU29ja2V0c1RyeUl0T3V0KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gb25Td2FnZ2VyVUlSZWFkeShmbikge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3dhZ2dlci11aScpKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc2FibGVTb2NrZXRzVHJ5SXRPdXQoKSB7XG4gICAgICBjb25zdCBzb2NrZXRFdmVudHMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdGFnXj1cInNvY2tldHNcIiBpXScpXTtcblxuICAgICAgZm9yIChjb25zdCBlbCBvZiBzb2NrZXRFdmVudHMpIHtcbiAgICAgICAgZWwucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXJ2ZXItc3dhZ2dlci1zb2NrZXRzJyk7XG4gICAgICB9XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBpbmRleFN0eWxlcyh0aGVtZTogU3dhZ2dlckNvbmZpZ1sndGhlbWUnXSkge1xuICBjb25zdCBzdHlsZXMgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShhYnNvbHV0ZVBhdGgoKSwgJ2luZGV4LmNzcycpLCAndXRmLTgnKTtcbiAgY29uc3QgZGFya1N0eWxlcyA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKF9fZGlybmFtZSwgJ3N3YWdnZXItZGFyay5jc3MnKSwgJ3V0Zi04Jyk7XG5cbiAgY29uc3Qgc3R5bGVPdmVycmlkZXMgPSBgXG4gICAgJHtzdHlsZXN9XG5cbiAgICAuc2VydmVyLXN3YWdnZXItc29ja2V0cyAudHJ5LW91dCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgIC5zZXJ2ZXItc3dhZ2dlci1zb2NrZXRzIC5vcGJsb2NrLXN1bW1hcnktbWV0aG9kIHtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuXG4gICAgLnNlcnZlci1zd2FnZ2VyLXNvY2tldHMgLm9wYmxvY2stc3VtbWFyeS1tZXRob2Q6OmFmdGVyIHtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTc0OGNiO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgY29udGVudDogJ1NPQ0tFVFMnO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgdG9wOiAwO1xuICAgIH1cbiAgYDtcblxuICBpZiAodGhlbWUgPT09ICdsaWdodCcpIHtcbiAgICByZXR1cm4gc3R5bGVPdmVycmlkZXM7XG4gIH1cblxuICByZXR1cm4gYFxuICAgICR7c3R5bGVPdmVycmlkZXN9XG5cbiAgICAke3RoZW1lID09PSAnYXV0bycgPyAnQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsnIDogJyd9XG4gICAgICAke2RhcmtTdHlsZXN9XG4gICAgJHt0aGVtZSA9PT0gJ2F1dG8nID8gJ30nIDogJyd9XG4gIGA7XG59XG4iXX0=