UNPKG

@cloudbase/app

Version:
228 lines 26.6 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.nodeTool = void 0; var constants_1 = require("./constants"); var context_1 = require("./context"); var utils_1 = require("./utils"); var jwtSign = null; function getJwtSign() { var _a; return __awaiter(this, void 0, void 0, function () { var mod, e_1; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!!jwtSign) return [3, 4]; _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); return [4, import('jsonwebtoken')]; case 2: mod = _b.sent(); jwtSign = ((_a = mod.default) === null || _a === void 0 ? void 0 : _a.sign) || mod.sign; return [3, 4]; case 3: e_1 = _b.sent(); console.error('缺少依赖 jsonwebtoken,请执行以下命令安装:\n\n' + ' npm install jsonwebtoken\n\n' + '该依赖用于 Node 环境下的自定义登录票据生成。'); return [3, 4]; case 4: return [2, jwtSign]; } }); }); } function getDefaultUserInfo() { var _a = (0, context_1.getCloudbaseContext)(), WX_OPENID = _a.WX_OPENID, WX_APPID = _a.WX_APPID, TCB_UUID = _a.TCB_UUID, TCB_CUSTOM_USER_ID = _a.TCB_CUSTOM_USER_ID, TCB_ISANONYMOUS_USER = _a.TCB_ISANONYMOUS_USER; return { openId: WX_OPENID || '', appId: WX_APPID || '', uid: TCB_UUID || '', customUserId: TCB_CUSTOM_USER_ID || '', isAnonymous: TCB_ISANONYMOUS_USER === 'true', }; } function sendUserInfoRequest(app, params) { var _a, _b; return (_b = (_a = app === null || app === void 0 ? void 0 : app.request) === null || _a === void 0 ? void 0 : _a.send) === null || _b === void 0 ? void 0 : _b.call(_a, 'auth.getUserInfoForAdmin', params, { pathname: 'web', endPointMode: 'CLOUD_API', }); } var nodeTool = function (app, config) { if (app.auth) { var auth_1 = { getUserInfo: function () { return getDefaultUserInfo(); }, getEndUserInfo: function (uid) { return __awaiter(this, void 0, void 0, function () { var defaultUserInfo; return __generator(this, function (_a) { defaultUserInfo = getDefaultUserInfo(); if (uid === undefined) { return [2, { userInfo: defaultUserInfo }]; } (0, utils_1.validateUid)(uid); return [2, sendUserInfoRequest(app, { uuid: uid, envName: config.env, }).then(function (result) { if (result.code) { return result; } return { userInfo: __assign(__assign({}, defaultUserInfo), result.data), requestId: result.requestId, }; })]; }); }); }, createTicket: function (uid, options) { if (options === void 0) { options = {}; } return __awaiter(this, void 0, void 0, function () { var timestamp, credentials, env, _a, refresh, _b, expire, sign, token; return __generator(this, function (_c) { switch (_c.label) { case 0: (0, utils_1.validateUid)(uid); timestamp = new Date().getTime(); credentials = (config.auth || {}).credentials; env = config.env; if (!env) { throw __assign(__assign({}, constants_1.ERROR.INVALID_PARAM), { message: 'no env in config' }); } if (!(credentials === null || credentials === void 0 ? void 0 : credentials.env_id)) { throw __assign(__assign({}, constants_1.ERROR.INVALID_PARAM), { message: '当前私钥未包含env_id 信息, 请前往腾讯云云开发控制台,获取自定义登录最新私钥' }); } if (credentials.env_id !== env) { throw __assign(__assign({}, constants_1.ERROR.INVALID_PARAM), { message: '当前私钥所属环境与 init 指定环境不一致!' }); } _a = options.refresh, refresh = _a === void 0 ? 3600 * 1000 : _a, _b = options.expire, expire = _b === void 0 ? timestamp + 7 * 24 * 60 * 60 * 1000 : _b; return [4, getJwtSign()]; case 1: sign = _c.sent(); token = sign({ alg: 'RS256', env: env, iat: timestamp, exp: timestamp + 10 * 60 * 1000, uid: uid, refresh: refresh, expire: expire, }, credentials.private_key, { allowInsecureKeySizes: true, algorithm: 'RS256', }); return [2, "".concat(credentials.private_key_id, "/@@/").concat(token)]; } }); }); }, queryUserInfo: function (query) { return __awaiter(this, void 0, void 0, function () { var uid, platform, platformId; return __generator(this, function (_a) { uid = query.uid, platform = query.platform, platformId = query.platformId; return [2, sendUserInfoRequest(app, { uuid: uid, platform: platform, platformId: platformId, envName: config.env, }).then(function (result) { if (result.code) { return result; } return { userInfo: __assign({}, result.data), requestId: result.requestId, }; })]; }); }); }, getClientIP: function () { var TCB_SOURCE_IP = (0, context_1.getCloudbaseContext)().TCB_SOURCE_IP; return TCB_SOURCE_IP || ''; }, }; Object.keys(auth_1).forEach(function (key) { app.auth[key] = auth_1[key]; }); } app.sendTemplateNotification = function (params, opts) { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4, ((_a = app === null || app === void 0 ? void 0 : app.callFunction) === null || _a === void 0 ? void 0 : _a.call(app, { name: 'lowcode-datasource', data: { methodName: 'callWedaApi', params: { action: 'PushNotifyMsg', data: { NotifyId: params.notifyId, Data: JSON.stringify(params.data), NotifyUsers: undefined, Url: params.url, }, }, mode: 'c', }, }, undefined, opts))]; case 1: return [2, _b.sent()]; } }); }); }; app.parseContext = context_1.parseContext; }; exports.nodeTool = nodeTool; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWJzL2FkYXB0ZXItbm9kZS90b29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQW1DO0FBQ25DLHFDQUE2RDtBQUM3RCxpQ0FBcUM7QUFZckMsSUFBSSxPQUFPLEdBQXFDLElBQUksQ0FBQTtBQUNwRCxTQUFlLFVBQVU7Ozs7Ozs7eUJBQ25CLENBQUMsT0FBTyxFQUFSLGNBQVE7Ozs7b0JBR0ksV0FBTSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUE7O29CQUFsQyxHQUFHLEdBQUcsU0FBNEI7b0JBQ3hDLE9BQU8sR0FBRyxDQUFBLE1BQUEsR0FBRyxDQUFDLE9BQU8sMENBQUUsSUFBSSxLQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUE7Ozs7b0JBRXZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDOzBCQUM1QyxnQ0FBZ0M7MEJBQ2hDLDJCQUEyQixDQUFDLENBQUE7O3dCQUdwQyxXQUFPLE9BQVEsRUFBQTs7OztDQUNoQjtBQU1ELFNBQVMsa0JBQWtCO0lBQ25CLElBQUEsS0FBOEUsSUFBQSw2QkFBbUIsR0FBRSxFQUFqRyxTQUFTLGVBQUEsRUFBRSxRQUFRLGNBQUEsRUFBRSxRQUFRLGNBQUEsRUFBRSxrQkFBa0Isd0JBQUEsRUFBRSxvQkFBb0IsMEJBQTBCLENBQUE7SUFFekcsT0FBTztRQUNMLE1BQU0sRUFBRSxTQUFTLElBQUksRUFBRTtRQUN2QixLQUFLLEVBQUUsUUFBUSxJQUFJLEVBQUU7UUFDckIsR0FBRyxFQUFFLFFBQVEsSUFBSSxFQUFFO1FBQ25CLFlBQVksRUFBRSxrQkFBa0IsSUFBSSxFQUFFO1FBQ3RDLFdBQVcsRUFBRSxvQkFBb0IsS0FBSyxNQUFNO0tBQzdDLENBQUE7QUFDSCxDQUFDO0FBTUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFRLEVB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QUFBLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFlBQVksb0RBQ3ZIO3dCQUNFLElBQUksRUFBRSxvQkFBb0I7d0JBQzFCLElBQUksRUFBRTs0QkFDSixVQUFVLEVBQUUsYUFBYTs0QkFDekIsTUFBTSxFQUFFO2dDQUNOLE1BQU0sRUFBRSxlQUFlO2dDQUN2QixJQUFJLEVBQUU7b0NBQ0osUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO29DQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO29DQUNqQyxXQUFXLEVBQUUsU0FBUztvQ0FDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO2lDQUNoQjs2QkFDRjs0QkFDRCxJQUFJLEVBQUUsR0FBRzt5QkFDVjtxQkFDRixFQUNELFNBQVMsRUFDVCxJQUFJLENBQ0wsQ0FBQSxFQUFBO3dCQW5CaUcsV0FBQSxTQW1CakcsRUFBQTs7O1NBQUEsQ0FBQTtJQUdELEdBQUcsQ0FBQyxZQUFZLEdBQUcsc0JBQVksQ0FBQTtBQUNqQyxDQUFDLENBQUE7QUE5SlksUUFBQSxRQUFRLFlBOEpwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVSUk9SIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBnZXRDbG91ZGJhc2VDb250ZXh0LCBwYXJzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnXG5pbXBvcnQgeyB2YWxpZGF0ZVVpZCB9IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgdHlwZSB7XG4gIElDcmVhdGVUaWNrZXRPcHRzLFxuICBJR2V0VXNlckluZm9SZXN1bHQsXG4gIElHZXRFbmRVc2VySW5mb1Jlc3VsdCxcbiAgSVVzZXJJbmZvUXVlcnksXG4gIElUZW1wbGF0ZU5vdGlmeVJlcSxcbn0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IElDbG91ZGJhc2VDb25maWcgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzJ1xuXG4vLyDlu7bov5/liqDovb3vvIzpgb/lhY3pnZ4gTm9kZSDnjq/looPmiZPljIXml7blvJXlhaXmraTljIVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5sZXQgand0U2lnbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IG51bGwgPSBudWxsXG5hc3luYyBmdW5jdGlvbiBnZXRKd3RTaWduKCkge1xuICBpZiAoIWp3dFNpZ24pIHtcbiAgICB0cnkge1xuICAgICAgLy8gQHRzLWlnbm9yZSDigJQg6K+l5YyF5LuF5ZyoIE5vZGUg6L+Q6KGM5pe25a2Y5Zyo77yM5byA5Y+R546v5aKD5Y+v6IO95pyq5a6J6KOFXG4gICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoJ2pzb253ZWJ0b2tlbicpXG4gICAgICBqd3RTaWduID0gbW9kLmRlZmF1bHQ/LnNpZ24gfHwgbW9kLnNpZ25cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfnvLrlsJHkvp3otZYganNvbndlYnRva2Vu77yM6K+35omn6KGM5Lul5LiL5ZG95Luk5a6J6KOF77yaXFxuXFxuJ1xuICAgICAgICArICcgIG5wbSBpbnN0YWxsIGpzb253ZWJ0b2tlblxcblxcbidcbiAgICAgICAgKyAn6K+l5L6d6LWW55So5LqOIE5vZGUg546v5aKD5LiL55qE6Ieq5a6a5LmJ55m75b2V56Wo5o2u55Sf5oiQ44CCJylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGp3dFNpZ24hXG59XG5cbi8qKlxuICog5LuO5LqR5Ye95pWw6L+Q6KGM5pe25LiK5LiL5paH5Lit6I635Y+W5b2T5YmN6K+35rGC55qE55So5oi35L+h5oGvXG4gKiDmlbDmja7mnaXmupDkuLrnjq/looPlj5jph4/vvIjlvq7kv6Egb3Blbklk44CBVENCIHV1aWQg562J77yJXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRVc2VySW5mbygpOiBJR2V0VXNlckluZm9SZXN1bHQge1xuICBjb25zdCB7IFdYX09QRU5JRCwgV1hfQVBQSUQsIFRDQl9VVUlELCBUQ0JfQ1VTVE9NX1VTRVJfSUQsIFRDQl9JU0FOT05ZTU9VU19VU0VSIH0gPSBnZXRDbG91ZGJhc2VDb250ZXh0KClcblxuICByZXR1cm4ge1xuICAgIG9wZW5JZDogV1hfT1BFTklEIHx8ICcnLFxuICAgIGFwcElkOiBXWF9BUFBJRCB8fCAnJyxcbiAgICB1aWQ6IFRDQl9VVUlEIHx8ICcnLFxuICAgIGN1c3RvbVVzZXJJZDogVENCX0NVU1RPTV9VU0VSX0lEIHx8ICcnLFxuICAgIGlzQW5vbnltb3VzOiBUQ0JfSVNBTk9OWU1PVVNfVVNFUiA9PT0gJ3RydWUnLFxuICB9XG59XG5cbi8qKlxuICog6LCD55So5ZCO56uv566h55CG5o6l5Y+j5p+l6K+i55So5oi35L+h5oGvXG4gKiDnu5/kuIDlsIHoo4UgYXV0aC5nZXRVc2VySW5mb0ZvckFkbWluIOeahOivt+axgumAu+i+kVxuICovXG5mdW5jdGlvbiBzZW5kVXNlckluZm9SZXF1ZXN0KGFwcDogYW55LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gYXBwPy5yZXF1ZXN0Py5zZW5kPy4oJ2F1dGguZ2V0VXNlckluZm9Gb3JBZG1pbicsIHBhcmFtcywge1xuICAgIHBhdGhuYW1lOiAnd2ViJyxcbiAgICBlbmRQb2ludE1vZGU6ICdDTE9VRF9BUEknLFxuICB9KVxufVxuXG4vKipcbiAqIOWIneWni+WMliBOb2RlIOerr+W3peWFt+aWueazle+8jOaMgui9veWIsCBqcy1zZGsgYXBwIOWunuS+i+S4ilxuICog5YyF5ZCr77yaYXV0aCDnm7jlhbPmlrnms5XjgIHmqKHmnb/mtojmga/mjqjpgIHjgIFjb250ZXh0IOino+aekFxuICpcbiAqIEBwYXJhbSBhcHAgLSBqcy1zZGsgY2xvdWRiYXNlIOWunuS+i1xuICogQHBhcmFtIGNvbmZpZyAtIOmFjee9ruS/oeaBr++8jOWMheWQq+iupOivgeWHreivgeWSjOeOr+WigyBJRFxuICovXG5leHBvcnQgY29uc3Qgbm9kZVRvb2wgPSAoYXBwOiBhbnksIGNvbmZpZzogSUNsb3VkYmFzZUNvbmZpZykgPT4ge1xuICAvLyDku4XlvZMgYXBwIOW3suWIneWni+WMliBhdXRoIOaooeWdl+aXtu+8jOaJjeazqOWFpSBhdXRoIOebuOWFs+aWueazlVxuICBpZiAoYXBwLmF1dGgpIHtcbiAgICBjb25zdCBhdXRoID0ge1xuICAgICAgLyoqIOiOt+WPluW9k+WJjeivt+axgueahOeUqOaIt+S/oeaBr++8iOS7jueOr+Wig+WPmOmHj+ivu+WPlu+8jOWQjOatpe+8iSAqL1xuICAgICAgZ2V0VXNlckluZm8oKTogSUdldFVzZXJJbmZvUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGdldERlZmF1bHRVc2VySW5mbygpXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOiOt+WPlue7iOerr+eUqOaIt+S/oeaBr1xuICAgICAgICog5LiN5LygIHVpZCDml7bov5Tlm57lvZPliY3or7fmsYLnlKjmiLfkv6Hmga/vvIzkvKAgdWlkIOaXtuafpeivouaMh+WumueUqOaIt1xuICAgICAgICovXG4gICAgICBhc3luYyBnZXRFbmRVc2VySW5mbyh1aWQ/OiBzdHJpbmcpOiBQcm9taXNlPElHZXRFbmRVc2VySW5mb1Jlc3VsdD4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0VXNlckluZm8gPSBnZXREZWZhdWx0VXNlckluZm8oKVxuXG4gICAgICAgIGlmICh1aWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB7IHVzZXJJbmZvOiBkZWZhdWx0VXNlckluZm8gfVxuICAgICAgICB9XG4gICAgICAgIHZhbGlkYXRlVWlkKHVpZClcblxuICAgICAgICByZXR1cm4gc2VuZFVzZXJJbmZvUmVxdWVzdChhcHAsIHtcbiAgICAgICAgICB1dWlkOiB1aWQsXG4gICAgICAgICAgZW52TmFtZTogY29uZmlnLmVudixcbiAgICAgICAgfSkudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0LmNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVzZXJJbmZvOiB7IC4uLmRlZmF1bHRVc2VySW5mbywgLi4ucmVzdWx0LmRhdGEgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOWIm+W7uuiHquWumuS5ieeZu+W9lSBUaWNrZXRcbiAgICAgICAqIOS9v+eUqCBSU0Eg56eB6ZKl562+5Y+RIEpXVO+8jOWuouaIt+err+WHreatpCBUaWNrZXQg5o2i5Y+W55m75b2V5oCBXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHVpZCAtIOiHquWumuS5ieeUqOaItyBJRO+8iDR+MzIg5L2N77yJXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIOWIt+aWsOmXtOmalOWSjOi/h+acn+aXtumXtOmFjee9rlxuICAgICAgICogQHJldHVybnMg5qC85byP5Li6IFwie3ByaXZhdGVfa2V5X2lkfS9AQC97and0X3Rva2VufVwiIOeahCBUaWNrZXQg5a2X56ym5LiyXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGNyZWF0ZVRpY2tldCh1aWQ6IHN0cmluZywgb3B0aW9uczogSUNyZWF0ZVRpY2tldE9wdHMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHZhbGlkYXRlVWlkKHVpZClcblxuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICBjb25zdCB7IGNyZWRlbnRpYWxzIH0gPSBjb25maWcuYXV0aCB8fCB7fVxuICAgICAgICBjb25zdCB7IGVudiB9ID0gY29uZmlnXG5cbiAgICAgICAgaWYgKCFlbnYpIHtcbiAgICAgICAgICB0aHJvdyB7IC4uLkVSUk9SLklOVkFMSURfUEFSQU0sIG1lc3NhZ2U6ICdubyBlbnYgaW4gY29uZmlnJyB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNyZWRlbnRpYWxzPy5lbnZfaWQpIHtcbiAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAuLi5FUlJPUi5JTlZBTElEX1BBUkFNLFxuICAgICAgICAgICAgbWVzc2FnZTogJ+W9k+WJjeengemSpeacquWMheWQq2Vudl9pZCDkv6Hmga/vvIwg6K+35YmN5b6A6IW+6K6v5LqR5LqR5byA5Y+R5o6n5Yi25Y+w77yM6I635Y+W6Ieq5a6a5LmJ55m75b2V5pyA5paw56eB6ZKlJyxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3JlZGVudGlhbHMuZW52X2lkICE9PSBlbnYpIHtcbiAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAuLi5FUlJPUi5JTlZBTElEX1BBUkFNLFxuICAgICAgICAgICAgbWVzc2FnZTogJ+W9k+WJjeengemSpeaJgOWxnueOr+Wig+S4jiBpbml0IOaMh+WumueOr+Wig+S4jeS4gOiHtO+8gScsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJlZnJlc2ggPSAzNjAwICogMTAwMCwgLy8g6buY6K6kIDEg5bCP5pe25Yi35pawXG4gICAgICAgICAgZXhwaXJlID0gdGltZXN0YW1wICsgNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAsIC8vIOm7mOiupCA3IOWkqei/h+acn1xuICAgICAgICB9ID0gb3B0aW9uc1xuICAgICAgICBjb25zdCBzaWduID0gYXdhaXQgZ2V0Snd0U2lnbigpXG4gICAgICAgIGNvbnN0IHRva2VuID0gc2lnbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGc6ICdSUzI1NicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICBpYXQ6IHRpbWVzdGFtcCxcbiAgICAgICAgICAgIGV4cDogdGltZXN0YW1wICsgMTAgKiA2MCAqIDEwMDAsIC8vIFRpY2tldCDmnKzouqsgMTAg5YiG6ZKf5pyJ5pWIXG4gICAgICAgICAgICB1aWQsXG4gICAgICAgICAgICByZWZyZXNoLFxuICAgICAgICAgICAgZXhwaXJlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY3JlZGVudGlhbHMucHJpdmF0ZV9rZXksXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxsb3dJbnNlY3VyZUtleVNpemVzOiB0cnVlLFxuICAgICAgICAgICAgYWxnb3JpdGhtOiAnUlMyNTYnLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gYCR7Y3JlZGVudGlhbHMucHJpdmF0ZV9rZXlfaWR9L0BALyR7dG9rZW59YFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmjInmnaHku7bmn6Xor6LnlKjmiLfkv6Hmga/vvIjnrqHnkIbnq6/mjqXlj6PvvIlcbiAgICAgICAqIOaUr+aMgeaMiSB1aWTjgIFwbGF0Zm9ybeOAgXBsYXRmb3JtSWQg5p+l6K+iXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHF1ZXJ5VXNlckluZm8ocXVlcnk6IElVc2VySW5mb1F1ZXJ5KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgeyB1aWQsIHBsYXRmb3JtLCBwbGF0Zm9ybUlkIH0gPSBxdWVyeVxuICAgICAgICByZXR1cm4gc2VuZFVzZXJJbmZvUmVxdWVzdChhcHAsIHtcbiAgICAgICAgICB1dWlkOiB1aWQsXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgcGxhdGZvcm1JZCxcbiAgICAgICAgICBlbnZOYW1lOiBjb25maWcuZW52LFxuICAgICAgICB9KS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQuY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXNlckluZm86IHsgLi4ucmVzdWx0LmRhdGEgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICAvKiog6I635Y+W5a6i5oi356uvIElQIOWcsOWdgCAqL1xuICAgICAgZ2V0Q2xpZW50SVAoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyBUQ0JfU09VUkNFX0lQIH0gPSBnZXRDbG91ZGJhc2VDb250ZXh0KClcbiAgICAgICAgcmV0dXJuIFRDQl9TT1VSQ0VfSVAgfHwgJydcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgLy8g5bCGIGF1dGgg5pa55rOV6YCQ5LiA5oyC6L295YiwIGFwcC5hdXRoIOS4ilxuICAgIE9iamVjdC5rZXlzKGF1dGgpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgYXBwLmF1dGhba2V5XSA9IChhdXRoIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeaooeadv+a2iOaBr+mAmuefpVxuICAgKiDpgJrov4fosIPnlKggbG93Y29kZS1kYXRhc291cmNlIOS6keWHveaVsOmXtOaOpeiwg+eUqOW+ruaQrSBBUElcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIOmAmuefpeWPguaVsO+8iOetlueVpSBJROOAgeaooeadv+WPmOmHj+OAgei3s+i9rOmTvuaOpe+8iVxuICAgKiBAcGFyYW0gb3B0cyAtIOWPr+mAiemFjee9ru+8jOWmgui2heaXtuaXtumXtFxuICAgKi9cbiAgYXBwLnNlbmRUZW1wbGF0ZU5vdGlmaWNhdGlvbiA9IGFzeW5jIChwYXJhbXM6IElUZW1wbGF0ZU5vdGlmeVJlcSwgb3B0cz86IHsgdGltZW91dD86IG51bWJlciB9KSA9PiBhd2FpdCBhcHA/LmNhbGxGdW5jdGlvbj8uKFxuICAgIHtcbiAgICAgIG5hbWU6ICdsb3djb2RlLWRhdGFzb3VyY2UnLFxuICAgICAgZGF0YToge1xuICAgICAgICBtZXRob2ROYW1lOiAnY2FsbFdlZGFBcGknLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBhY3Rpb246ICdQdXNoTm90aWZ5TXNnJyxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBOb3RpZnlJZDogcGFyYW1zLm5vdGlmeUlkLFxuICAgICAgICAgICAgRGF0YTogSlNPTi5zdHJpbmdpZnkocGFyYW1zLmRhdGEpLFxuICAgICAgICAgICAgTm90aWZ5VXNlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFVybDogcGFyYW1zLnVybCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtb2RlOiAnYycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgdW5kZWZpbmVkLFxuICAgIG9wdHMsXG4gIClcblxuICAvKiog5oyC6L29IGNvbnRleHQg6Kej5p6Q5bel5YW377yM5pa55L6/55So5oi35Zyo5LqR5Ye95pWw5Lit5L2/55SoICovXG4gIGFwcC5wYXJzZUNvbnRleHQgPSBwYXJzZUNvbnRleHRcbn1cbiJdfQ==