UNPKG

25.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const inversify_binding_decorators_1 = require("inversify-binding-decorators");
4const inversify_koa_utils_1 = require("inversify-koa-utils");
5const bodyParser = require("koa-bodyparser");
6const jwt = require("koa-jwt");
7const log4js = require("koa-log4");
8const Router = require("koa-router");
9const cors = require("koa2-cors");
10const _ = require("lodash");
11const defConfig = require("./config/defconfig");
12const ioc_1 = require("./ioc/ioc");
13const iocTracer_1 = require("./ioc/iocTracer");
14const log4js_1 = require("./middlewares/logger/log4js");
15const models_1 = require("./models");
16const BaseResponse_1 = require("./models/BaseResponse");
17const log = log4js.getLogger('GServer');
18class GServer {
19 constructor(initSetting) {
20 let middlewares;
21 let domainName;
22 // let mqSetting;
23 let jwtPrivateKey;
24 let jwtActive;
25 let httpPort;
26 let corsWhitelist;
27 let log4;
28 if (!_.isUndefined(initSetting)) {
29 middlewares = _.isUndefined(initSetting.middlewares) ? undefined : initSetting.middlewares;
30 if (_.size(middlewares) === 0) {
31 middlewares = undefined;
32 }
33 this.serverInitOnceEvents = _.isUndefined(initSetting.iniData) ? undefined : initSetting.iniData;
34 corsWhitelist = _.isUndefined(initSetting.corsWhitelist) ? undefined : initSetting.corsWhitelist;
35 domainName = _.isUndefined(initSetting.domainName) ? undefined : initSetting.domainName;
36 // mqSetting = _.isUndefined(initSetting.mqSetting) ? undefined : initSetting.mqSetting;
37 jwtPrivateKey = _.isUndefined(initSetting.jwtPrivateKey) ?
38 defConfig.jwt.privateKey : initSetting.jwtPrivateKey;
39 jwtActive = _.isUndefined(initSetting.jwtActive) ? defConfig.jwt.active : initSetting.jwtActive;
40 httpPort = _.isUndefined(initSetting.httpPort) ? defConfig.httpPort : initSetting.httpPort;
41 log4 = _.isFunction(initSetting.log4) ? log4js_1.default : initSetting.log4;
42 ioc_1.container.load(inversify_binding_decorators_1.buildProviderModule());
43 if (initSetting.filtersOpen) {
44 const iocTracer = new iocTracer_1.default(initSetting.filters);
45 iocTracer.apply(ioc_1.container);
46 }
47 }
48 this.main = models_1.ORMContext.init(initSetting.pathdb, initSetting.pathBeansPath);
49 // caeate DB connection
50 // 還不會用到mq應該還不需要去讓他一直嘗試連線
51 // if (!_.isUndefined(mqSetting)) {
52 // this.main.then((result) => {
53 // tslint:disable-next-line:no-null-keyword
54 // return mq(null, mqSetting); // connect MQ Server
55 // });
56 // }
57 this.main.then(() => {
58 const rootRouter = new Router({
59 prefix: _.isUndefined(domainName) ? '' : domainName
60 });
61 // create server
62 const server = new inversify_koa_utils_1.InversifyKoaServer(ioc_1.container, rootRouter);
63 server
64 .setConfig((app) => {
65 app.use(async (ctx, next) => {
66 // TODO check user auth to operate function
67 try {
68 await next();
69 }
70 catch (err) {
71 const response = new BaseResponse_1.default(err.message);
72 const statusArray = _.map(_.toString(err.status));
73 if (_.size(statusArray) === 4 &&
74 statusArray[0] in ['8', '9', '7', '6', '5', '4', '3', '2', '1', '0']) {
75 // 這邊map是因為要抓取第一個數字開頭等於9就會跑error
76 if (statusArray[0] === '9') {
77 log.error(err.status, err.message, JSON.stringify(ctx.state.user) || '');
78 }
79 else {
80 log.warn(err.status, err.message, JSON.stringify(ctx.state.user) || '');
81 }
82 response.$status = err.status;
83 }
84 else {
85 ctx.status = err.status || 500;
86 log.error(err.stack, JSON.stringify(ctx.state.user) || '');
87 response.$status = ctx.status;
88 ctx.app.emit('error', err, ctx);
89 }
90 ctx.body = response;
91 }
92 })
93 .use(cors({
94 origin: (ctx) => {
95 if (_.isUndefined(corsWhitelist) ||
96 _.size(corsWhitelist) === 0) {
97 return '*';
98 }
99 else if (_.includes(corsWhitelist, ctx.header.origin)) {
100 return '*';
101 }
102 else {
103 ctx.status = 404;
104 ctx.throw(422, new Error('Not Allow Cors'));
105 return false;
106 }
107 }
108 }))
109 .use(log4())
110 // .use(multer({
111 // storage: multer.memoryStorage()
112 // }).any())
113 .use(bodyParser({
114 strict: false,
115 onerror: (err, ctx) => {
116 log.error(err);
117 ctx.throw(422, new Error('body parse error'));
118 }
119 }));
120 if (!_.isUndefined(middlewares) && _.size(middlewares) !== 0) {
121 _.forEach(middlewares, (middleware) => {
122 app.use(middleware);
123 });
124 }
125 app.use(jwt({ secret: jwtPrivateKey, passthrough: !jwtActive })
126 .unless({
127 path: _.isUndefined(initSetting.unlessPath) ? [] : initSetting.unlessPath
128 }));
129 })
130 .setErrorConfig((app) => {
131 app.use((ctx, next) => {
132 log.error(ctx.status, ctx.message, JSON.stringify(ctx.state.user) || '');
133 next();
134 });
135 });
136 this.koaServer = server.build().listen(httpPort);
137 log.info('Http started listening on http://localhost:%s ...', httpPort);
138 })
139 .catch((e) => {
140 log.error(e);
141 });
142 }
143 async start() {
144 await Promise.all([this.main]);
145 if (!_.isUndefined(this.serverInitOnceEvents) && _.size(this.serverInitOnceEvents) !== 0) {
146 _.forEach(this.serverInitOnceEvents, (element) => {
147 element.doOnce();
148 element.end();
149 });
150 }
151 return this.koaServer;
152 }
153}
154exports.default = GServer;
155//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR1NlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbIkdTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwrRUFBbUU7QUFDbkUsNkRBQXlEO0FBRXpELDZDQUE2QztBQUM3QywrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHFDQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMsNEJBQTRCO0FBQzVCLGdEQUFnRDtBQUNoRCxtQ0FBc0M7QUFDdEMsK0NBQXdDO0FBQ3hDLHdEQUFvRDtBQUNwRCxxQ0FBc0M7QUFDdEMsd0RBQWlEO0FBSWpELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDeEMsTUFBcUIsT0FBTztJQUl4QixZQUFZLFdBQTRCO1FBQ3BDLElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksVUFBVSxDQUFDO1FBQ2YsaUJBQWlCO1FBQ2pCLElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLGFBQWEsQ0FBQztRQUNsQixJQUFJLElBQXNCLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0IsV0FBVyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDM0YsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0IsV0FBVyxHQUFHLFNBQVMsQ0FBQzthQUMzQjtZQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FB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ZCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0RixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM3QyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7Q0FDSjtBQXRJRCwwQkFzSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IGJ1aWxkUHJvdmlkZXJNb2R1bGUgfSBmcm9tICdpbnZlcnNpZnktYmluZGluZy1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludmVyc2lmeUtvYVNlcnZlciB9IGZyb20gJ2ludmVyc2lmeS1rb2EtdXRpbHMnO1xuaW1wb3J0IHsgTWlkZGxld2FyZSB9IGZyb20gJ2tvYSc7XG5pbXBvcnQgKiBhcyBib2R5UGFyc2VyIGZyb20gJ2tvYS1ib2R5cGFyc2VyJztcbmltcG9ydCAqIGFzIGp3dCBmcm9tICdrb2Etand0JztcbmltcG9ydCAqIGFzIGxvZzRqcyBmcm9tICdrb2EtbG9nNCc7XG5pbXBvcnQgKiBhcyBSb3V0ZXIgZnJvbSAna29hLXJvdXRlcic7XG5pbXBvcnQgKiBhcyBjb3JzIGZyb20gJ2tvYTItY29ycyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBkZWZDb25maWcgZnJvbSAnLi9jb25maWcvZGVmY29uZmlnJztcbmltcG9ydCB7IGNvbnRhaW5lciB9IGZyb20gJy4vaW9jL2lvYyc7XG5pbXBvcnQgSW9jVHJhY2VyIGZyb20gJy4vaW9jL2lvY1RyYWNlcic7XG5pbXBvcnQga29hTG9nNGpzIGZyb20gJy4vbWlkZGxld2FyZXMvbG9nZ2VyL2xvZzRqcyc7XG5pbXBvcnQgeyBPUk1Db250ZXh0IH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IEJhc2VSZXNwb25zZSBmcm9tICcuL21vZGVscy9CYXNlUmVzcG9uc2UnO1xuaW1wb3J0IEh0dHBJbml0U2V0dGluZyBmcm9tICcuL21vZGVscy9IdHRwSW5pdFNldHRpbmcnO1xuaW1wb3J0IElTZXJ2ZXJJbml0T25jZUV2ZW50IGZyb20gJy4vU2VydmVyRXZlbnQvU2VydmVySW5pdE9uY2VFdmVudCc7XG5cbmNvbnN0IGxvZyA9IGxvZzRqcy5nZXRMb2dnZXIoJ0dTZXJ2ZXInKTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdTZXJ2ZXIge1xuICAgIHByaXZhdGUgbWFpbjogUHJvbWlzZTxhbnk+O1xuICAgIHByaXZhdGUgc2VydmVySW5pdE9uY2VFdmVudHM6IElTZXJ2ZXJJbml0T25jZUV2ZW50W10gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBrb2FTZXJ2ZXI6IFNlcnZlcjtcbiAgICBjb25zdHJ1Y3Rvcihpbml0U2V0dGluZzogSHR0cEluaXRTZXR0aW5nKSB7XG4gICAgICAgIGxldCBtaWRkbGV3YXJlcztcbiAgICAgICAgbGV0IGRvbWFpbk5hbWU7XG4gICAgICAgIC8vIGxldCBtcVNldHRpbmc7XG4gICAgICAgIGxldCBqd3RQcml2YXRlS2V5O1xuICAgICAgICBsZXQgand0QWN0aXZlO1xuICAgICAgICBsZXQgaHR0cFBvcnQ7XG4gICAgICAgIGxldCBjb3JzV2hpdGVsaXN0O1xuICAgICAgICBsZXQgbG9nNDogKCkgPT4gTWlkZGxld2FyZTtcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGluaXRTZXR0aW5nKSkge1xuICAgICAgICAgICAgbWlkZGxld2FyZXMgPSBfLmlzVW5kZWZpbmVkKGluaXRTZXR0aW5nLm1pZGRsZXdhcmVzKSA/IHVuZGVmaW5lZCA6IGluaXRTZXR0aW5nLm1pZGRsZXdhcmVzO1xuICAgICAgICAgICAgaWYgKF8uc2l6ZShtaWRkbGV3YXJlcykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VydmVySW5pdE9uY2VFdmVudHMgPSBfLmlzVW5kZWZpbmVkKGluaXRTZXR0aW5nLmluaURhdGEpID8gdW5kZWZpbmVkIDogaW5pdFNldHRpbmcuaW5pRGF0YTtcbiAgICAgICAgICAgIGNvcnNXaGl0ZWxpc3QgPSBfLmlzVW5kZWZpbmVkKGluaXRTZXR0aW5nLmNvcnNXaGl0ZWxpc3QpID8gdW5kZWZpbmVkIDogaW5pdFNldHRpbmcuY29yc1doaXRlbGlzdDtcbiAgICAgICAgICAgIGRvbWFpbk5hbWUgPSBfLmlzVW5kZWZpbmVkKGluaXRTZXR0aW5nLmRvbWFpbk5hbWUpID8gdW5kZWZpbmVkIDogaW5pdFNldHRpbmcuZG9tYWluTmFtZTtcbiAgICAgICAgICAgIC8vIG1xU2V0dGluZyA9IF8uaXNVbmRlZmluZWQoaW5pdFNldHRpbmcubXFTZXR0aW5nKSA/IHVuZGVmaW5lZCA6IGluaXRTZXR0aW5nLm1xU2V0dGluZztcbiAgICAgICAgICAgIGp3dFByaXZhdGVLZXkgPSBfLmlzVW5kZWZpbmVkKGluaXRTZXR0aW5nLmp3dFByaXZhdGVLZXkpID9cbiAgICAgICAgICAgICAgICBkZWZDb25maWcuand0LnByaXZhdGVLZXkgOiBpbml0U2V0dGluZy5qd3RQcml2YXRlS2V5O1xuICAgICAgICAgICAgand0QWN0aXZlID0gXy5pc1VuZGVmaW5lZChpbml0U2V0dGluZy5qd3RBY3RpdmUpID8gZGVmQ29uZmlnLmp3dC5hY3RpdmUgOiBpbml0U2V0dGluZy5qd3RBY3RpdmU7XG4gICAgICAgICAgICBodHRwUG9ydCA9IF8uaXNVbmRlZmluZWQoaW5pdFNldHRpbmcuaHR0cFBvcnQpID8gZGVmQ29uZmlnLmh0dHBQb3J0IDogaW5pdFNldHRpbmcuaHR0cFBvcnQ7XG4gICAgICAgICAgICBsb2c0ID0gXy5pc0Z1bmN0aW9uKGluaXRTZXR0aW5nLmxvZzQpID8ga29hTG9nNGpzIDogaW5pdFNldHRpbmcubG9nNCE7XG4gICAgICAgICAgICBjb250YWluZXIubG9hZChidWlsZFByb3ZpZGVyTW9kdWxlKCkpO1xuICAgICAgICAgICAgaWYgKGluaXRTZXR0aW5nLmZpbHRlcnNPcGVuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW9jVHJhY2VyID0gbmV3IElvY1RyYWNlcihpbml0U2V0dGluZy5maWx0ZXJzKTtcbiAgICAgICAgICAgICAgICBpb2NUcmFjZXIuYXBwbHkoY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1haW4gPSBPUk1Db250ZXh0LmluaXQoaW5pdFNldHRpbmcucGF0aGRiLCBpbml0U2V0dGluZy5wYXRoQmVhbnNQYXRoKTtcbiAgICAgICAgLy8gY2FlYXRlIERCIGNvbm5lY3Rpb25cbiAgICAgICAgLy8g6YKE5LiN5pyD55So5YiwbXHmh4noqbLpgoTkuI3pnIDopoHljrvorpPku5bkuIDnm7TlmJfoqabpgKPnt5pcbiAgICAgICAgLy8gaWYgKCFfLmlzVW5kZWZpbmVkKG1xU2V0dGluZykpIHtcbiAgICAgICAgLy8gdGhpcy5tYWluLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbnVsbC1rZXl3b3JkXG4gICAgICAgIC8vIHJldHVybiBtcShudWxsLCBtcVNldHRpbmcpOyAvLyBjb25uZWN0IE1RIFNlcnZlclxuICAgICAgICAvLyB9KTtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLm1haW4udGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb290Um91dGVyID0gbmV3IFJvdXRlcih7XG4gICAgICAgICAgICAgICAgcHJlZml4OiBfLmlzVW5kZWZpbmVkKGRvbWFpbk5hbWUpID8gJycgOiBkb21haW5OYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBzZXJ2ZXJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlciA9IG5ldyBJbnZlcnNpZnlLb2FTZXJ2ZXIoY29udGFpbmVyLCByb290Um91dGVyKTtcbiAgICAgICAgICAgIHNlcnZlclxuICAgICAgICAgICAgICAgIC5zZXRDb25maWcoKGFwcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcHAudXNlKGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgdXNlciBhdXRoIHRvIG9wZXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgQmFzZVJlc3BvbnNlKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXNBcnJheSA9IF8ubWFwKF8udG9TdHJpbmcoZXJyLnN0YXR1cykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLnNpemUoc3RhdHVzQXJyYXkpID09PSA0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0FycmF5WzBdIGluIFsnOCcsICc5JywgJzcnLCAnNicsICc1JywgJzQnLCAnMycsICcyJywgJzEnLCAnMCddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOmAmemCim1hcOaYr+WboOeCuuimgeaKk+WPluesrOS4gOWAi+aVuOWtl+mWi+mgreetieaWvDnlsLHmnIPot5FlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzQXJyYXlbMF0gPT09ICc5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGVyci5zdGF0dXMsIGVyci5tZXNzYWdlLCBKU09OLnN0cmluZ2lmeShjdHguc3RhdGUudXNlcikgfHwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oZXJyLnN0YXR1cywgZXJyLm1lc3NhZ2UsIEpTT04uc3RyaW5naWZ5KGN0eC5zdGF0ZS51c2VyKSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuJHN0YXR1cyA9IGVyci5zdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnN0YXR1cyA9IGVyci5zdGF0dXMgfHwgNTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyLnN0YWNrLCBKU09OLnN0cmluZ2lmeShjdHguc3RhdGUudXNlcikgfHwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS4kc3RhdHVzID0gY3R4LnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFwcC5lbWl0KCdlcnJvcicsIGVyciwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguYm9keSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVzZShjb3JzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46IChjdHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQoY29yc1doaXRlbGlzdCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uc2l6ZShjb3JzV2hpdGVsaXN0KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcqJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfLmluY2x1ZGVzKGNvcnNXaGl0ZWxpc3QsIGN0eC5oZWFkZXIub3JpZ2luKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcqJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdGF0dXMgPSA0MDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgudGhyb3coNDIyLCBuZXcgRXJyb3IoJ05vdCBBbGxvdyBDb3JzJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAudXNlKGxvZzQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC51c2UobXVsdGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdG9yYWdlOiBtdWx0ZXIubWVtb3J5U3RvcmFnZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9KS5hbnkoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC51c2UoYm9keVBhcnNlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiAoZXJyLCBjdHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC50aHJvdyg0MjIsIG5ldyBFcnJvcignYm9keSBwYXJzZSBlcnJvcicpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChtaWRkbGV3YXJlcykgJiYgXy5zaXplKG1pZGRsZXdhcmVzKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKG1pZGRsZXdhcmVzLCAobWlkZGxld2FyZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcC51c2UobWlkZGxld2FyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcHAudXNlKGp3dCh7IHNlY3JldDogand0UHJpdmF0ZUtleSwgcGFzc3Rocm91Z2g6ICFqd3RBY3RpdmUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC51bmxlc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IF8uaXNVbmRlZmluZWQoaW5pdFNldHRpbmcudW5sZXNzUGF0aCkgPyBbXSA6IGluaXRTZXR0aW5nLnVubGVzc1BhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zZXRFcnJvckNvbmZpZygoYXBwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFwcC51c2UoKGN0eCwgbmV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGN0eC5zdGF0dXMsIGN0eC5tZXNzYWdlLCBKU09OLnN0cmluZ2lmeShjdHguc3RhdGUudXNlcikgfHwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMua29hU2VydmVyID0gc2VydmVyLmJ1aWxkKCkubGlzdGVuKGh0dHBQb3J0KTtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdIdHRwIHN0YXJ0ZWQgbGlzdGVuaW5nIG9uIGh0dHA6Ly9sb2NhbGhvc3Q6JXMgLi4uJywgaHR0cFBvcnQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzdGFydCgpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMubWFpbl0pO1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5zZXJ2ZXJJbml0T25jZUV2ZW50cykgJiYgXy5zaXplKHRoaXMuc2VydmVySW5pdE9uY2VFdmVudHMpICE9PSAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5zZXJ2ZXJJbml0T25jZUV2ZW50cywgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRvT25jZSgpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZW5kKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5rb2FTZXJ2ZXI7XG4gICAgfVxufVxuIl19
\No newline at end of file