@cloudbase/app
Version:
cloudbase javascript sdk core
329 lines • 37.8 kB
JavaScript
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 __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 __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 };
}
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { adapters, constants, utils, helpers } from '@cloudbase/utilities';
import adapterForWxMp from '@cloudbase/adapter-wx_mp';
import { registerComponent, registerHook } from './libs/component';
import { Platform } from './libs/adapter';
import { initCache, getCacheByEnvId, getLocalCache } from './libs/cache';
import { initRequest, getRequestByEnvId } from './libs/request';
import { getSdkName, setSdkVersion, setRegionLevelEndpoint, setSdkName, setGatewayEndPointWithEnv, setEndPointInfo, getEndPointInfo, getSdkVersion, } from './constants/common';
import { i18nProxy } from './libs/lang';
import { generateApis } from './libs/callApis';
export { getBaseEndPoint } from './constants/common';
export { LANGS } from './libs/lang';
var useAdapters = adapters.useAdapters, useDefaultAdapter = adapters.useDefaultAdapter;
var ERRORS = constants.ERRORS, COMMUNITY_SITE_URL = constants.COMMUNITY_SITE_URL;
var printWarn = utils.printWarn;
var catchErrorsDecorator = helpers.catchErrorsDecorator;
var DEFAULT_INIT_CONFIG = {
timeout: 15000,
persistence: 'local',
};
var MAX_TIMEOUT = 1000 * 60 * 10;
var MIN_TIMEOUT = 100;
var extensionMap = {};
var Cloudbase = (function () {
function Cloudbase(config) {
this.cloudbaseConfig = config ? config : this.cloudbaseConfig;
this.authInstance = null;
this.oauthInstance = null;
this.version = getSdkVersion();
}
Object.defineProperty(Cloudbase.prototype, "config", {
get: function () {
return this.cloudbaseConfig;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "platform", {
get: function () {
return Platform;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "cache", {
get: function () {
return getCacheByEnvId(this.cloudbaseConfig.env);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "localCache", {
get: function () {
return getLocalCache(this.cloudbaseConfig.env);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "request", {
get: function () {
return getRequestByEnvId(this.cloudbaseConfig.env);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "apis", {
get: function () {
return generateApis.call(this);
},
enumerable: false,
configurable: true
});
Cloudbase.prototype.init = function (config) {
var _a;
if (!config.env) {
throw new Error(JSON.stringify({
code: ERRORS.INVALID_PARAMS,
msg: 'env must not be specified',
}));
}
if (!Platform.adapter) {
this.useDefaultAdapter();
}
var reqConfig = {
timeout: config.timeout || 5000,
timeoutMsg: "[".concat(getSdkName(), "][REQUEST TIMEOUT] request had been abort since didn't finished within").concat(config.timeout / 1000, "s"),
};
this.requestClient = new Platform.adapter.reqClass(reqConfig);
this.cloudbaseConfig = __assign(__assign(__assign({}, DEFAULT_INIT_CONFIG), config), { i18n: i18nProxy(Platform, config) });
delete this.cloudbaseConfig.lang;
this.cloudbaseConfig.timeout = this.formatTimeout(this.cloudbaseConfig.timeout);
var _b = this.cloudbaseConfig, env = _b.env, persistence = _b.persistence, debug = _b.debug, timeout = _b.timeout, oauthClient = _b.oauthClient, i18n = _b.i18n;
initCache({ env: env, persistence: persistence, debug: debug, platformInfo: this.platform });
setRegionLevelEndpoint(env, config.region || '');
setGatewayEndPointWithEnv(env);
var app = new Cloudbase(this.cloudbaseConfig);
initRequest({ env: env, region: config.region || '', timeout: timeout, oauthClient: oauthClient, _fromApp: app, i18n: i18n });
app.requestClient = this.requestClient;
(_a = this === null || this === void 0 ? void 0 : this.fire) === null || _a === void 0 ? void 0 : _a.call(this, 'cloudbase_init', app);
this.try2InitAuth(config, app);
return app;
};
Cloudbase.prototype.updateConfig = function (config) {
var persistence = config.persistence, debug = config.debug;
this.cloudbaseConfig.persistence = persistence;
this.cloudbaseConfig.debug = debug;
initCache({ env: this.cloudbaseConfig.env, persistence: persistence, debug: debug, platformInfo: this.platform });
};
Cloudbase.prototype.updateLang = function (lang) {
var _a;
if (!lang || lang === ((_a = this.cloudbaseConfig.i18n) === null || _a === void 0 ? void 0 : _a.lang))
return;
this.cloudbaseConfig.i18n.lang = lang;
};
Cloudbase.prototype.registerExtension = function (ext) {
extensionMap[ext.name] = ext;
};
Cloudbase.prototype.invokeExtension = function (name, opts) {
return __awaiter(this, void 0, void 0, function () {
var ext;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
ext = extensionMap[name];
if (!ext) {
throw new Error(JSON.stringify({
code: ERRORS.INVALID_PARAMS,
msg: "extension:".concat(name, " must be registered before invoke"),
}));
}
return [4, ext.invoke(opts, this)];
case 1: return [2, _a.sent()];
}
});
});
};
Cloudbase.prototype.useAdapters = function (adapters, options) {
var _a = useAdapters(adapters, options) || {}, adapter = _a.adapter, runtime = _a.runtime;
adapter && (Platform.adapter = adapter);
runtime && (Platform.runtime = runtime);
};
Cloudbase.prototype.registerHook = function (hook) {
registerHook(Cloudbase, hook);
};
Cloudbase.prototype.registerComponent = function (component) {
registerComponent(Cloudbase, component);
};
Cloudbase.prototype.registerVersion = function (version) {
setSdkVersion(version);
this.version = version;
};
Cloudbase.prototype.registerSdkName = function (name) {
setSdkName(name);
};
Cloudbase.prototype.registerEndPoint = function (url, protocol) {
setEndPointInfo({ baseUrl: url, protocol: protocol, env: this.config.env, endPointKey: 'CLOUD_API' });
};
Cloudbase.prototype.registerEndPointWithKey = function (props) {
setEndPointInfo({
env: this.config.env,
endPointKey: props.key,
baseUrl: props.url,
protocol: props.protocol,
});
};
Cloudbase.prototype.getEndPointWithKey = function (key) {
var info = getEndPointInfo(this.config.env, key);
return {
BASE_URL: info.baseUrl,
PROTOCOL: info.protocol,
};
};
Cloudbase.prototype.parseCaptcha = function (url) {
var queryObj = {};
var matched = url.match(/^(data:.*?)(\?[^#\s]*)?$/);
if (matched) {
url = matched[1];
var search = matched[2];
if (search) {
queryObj = utils.parseQueryString(search);
}
}
var token = queryObj.token, restQueryObj = __rest(queryObj, ["token"]);
if (/^data:/.test(url) && !token) {
return {
error: 'invalid_argument',
error_description: "invalid captcha data: ".concat(url),
};
}
if (!token) {
return {
error: 'unimplemented',
error_description: 'need to impl captcha data',
};
}
return {
state: restQueryObj.state,
token: token,
captchaData: url,
};
};
Cloudbase.prototype.useDefaultAdapter = function () {
var _a = useDefaultAdapter(), adapter = _a.adapter, runtime = _a.runtime;
Platform.adapter = adapter;
Platform.runtime = runtime;
};
Cloudbase.prototype.formatTimeout = function (timeout) {
switch (true) {
case timeout > MAX_TIMEOUT:
printWarn(ERRORS.INVALID_PARAMS, 'timeout is greater than maximum value[10min]');
return MAX_TIMEOUT;
case timeout < MIN_TIMEOUT:
printWarn(ERRORS.INVALID_PARAMS, 'timeout is less than maximum value[100ms]');
return MIN_TIMEOUT;
default:
return timeout;
}
};
Cloudbase.prototype.try2InitAuth = function (config, app) {
try {
if (config.accessKey) {
app.auth();
}
}
catch (error) {
console.log('try2InitAuth error:', error);
}
};
__decorate([
catchErrorsDecorator({
mode: 'sync',
title: 'Cloudbase 初始化失败',
messages: [
'请确认以下各项:',
' 1 - 调用 cloudbase.init() 的语法或参数是否正确',
' 2 - 如果是非浏览器环境,是否配置了安全应用来源(https://docs.cloudbase.net/api-reference/webv3/adapter#%E7%AC%AC-2-%E6%AD%A5%E9%85%8D%E7%BD%AE%E5%AE%89%E5%85%A8%E5%BA%94%E7%94%A8%E6%9D%A5%E6%BA%90)',
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
],
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Cloudbase)
], Cloudbase.prototype, "init", null);
__decorate([
catchErrorsDecorator({
title: '调用扩展能力失败',
messages: [
'请确认以下各项:',
' 1 - 调用 invokeExtension() 的语法或参数是否正确',
' 2 - 被调用的扩展能力是否已经安装并通过 registerExtension() 注册',
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
],
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, Object]),
__metadata("design:returntype", Promise)
], Cloudbase.prototype, "invokeExtension", null);
return Cloudbase;
}());
export var cloudbase = new Cloudbase();
cloudbase.useAdapters(adapterForWxMp);
export default cloudbase;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQVkxRSxPQUFPLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBR3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0QsT0FBTyxFQUNMLFVBQVUsRUFDVixhQUFhLEVBQ2Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVix5QkFBeUIsRUFFekIsZUFBZSxFQUNmLGVBQWUsRUFDZixhQUFhLEdBQ2QsTUFBTSxvQkFBb0IsQ0FBQTtBQUMzQixPQUFPLEVBQUUsU0FBUyxFQUFTLE1BQU0sYUFBYSxDQUFBO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQW9CLE1BQU0saUJBQWlCLENBQUE7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0IsSUFBQSxXQUFXLEdBQXdCLFFBQVEsWUFBaEMsRUFBRSxpQkFBaUIsR0FBSyxRQUFRLGtCQUFiLENBQWE7QUFDM0MsSUFBQSxNQUFNLEdBQXlCLFNBQVMsT0FBbEMsRUFBRSxrQkFBa0IsR0FBSyxTQUFTLG1C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LENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O29EQVdEO0lBNkdILGdCQUFDO0NBQUEsQUFoUEQsSUFnUEM7QUFFRCxNQUFNLENBQUMsSUFBTSxTQUFTLEdBQWUsSUFBSSxTQUFTLEVBQUUsQ0FBQTtBQUNwRCxTQUFTLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBRXJDLGVBQWUsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRhcHRlcnMsIGNvbnN0YW50cywgdXRpbHMsIGhlbHBlcnMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7IFNES0FkYXB0ZXJJbnRlcmZhY2UsIENsb3VkYmFzZUFkYXB0ZXIsIElSZXF1ZXN0Q29uZmlnIH0gZnJvbSAnQGNsb3VkYmFzZS9hZGFwdGVyLWludGVyZmFjZSdcbmltcG9ydCB7XG4gIElDbG91ZGJhc2VDb25maWcsXG4gIElDbG91ZGJhc2VVcGdyYWRlZENvbmZpZyxcbiAgSUNsb3VkYmFzZSxcbiAgSUNsb3VkYmFzZUV4dGVuc2lvbixcbiAgS1YsXG4gIElDbG91ZGJhc2VQbGF0Zm9ybUluZm8sXG4gIEVuZFBvaW50S2V5LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzJ1xuaW1wb3J0IHsgSUNsb3VkYmFzZUF1dGggfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2F1dGgnXG5pbXBvcnQgYWRhcHRlckZvcld4TXAgZnJvbSAnQGNsb3VkYmFzZS9hZGFwdGVyLXd4X21wJ1xuaW1wb3J0IHsgcmVnaXN0ZXJDb21wb25lbnQsIHJlZ2lzdGVySG9vayB9IGZyb20gJy4vbGlicy9jb21wb25lbnQnXG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJy4vbGlicy9hZGFwdGVyJ1xuaW1wb3J0IHsgSUNsb3VkYmFzZUNvbXBvbmVudCwgSUNsb3VkYmFzZUhvb2sgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NvbXBvbmVudCdcbmltcG9ydCB7IElDbG91ZGJhc2VDYWNoZSB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvY2FjaGUnXG5pbXBvcnQgeyBpbml0Q2FjaGUsIGdldENhY2hlQnlFbnZJZCwgZ2V0TG9jYWxDYWNoZSB9IGZyb20gJy4vbGlicy9jYWNoZSdcbmltcG9ydCB7IElDbG91ZGJhc2VSZXF1ZXN0IH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZXF1ZXN0J1xuaW1wb3J0IHsgaW5pdFJlcXVlc3QsIGdldFJlcXVlc3RCeUVudklkIH0gZnJvbSAnLi9saWJzL3JlcXVlc3QnXG5pbXBvcnQge1xuICBnZXRTZGtOYW1lLFxuICBzZXRTZGtWZXJzaW9uLFxuICBzZXRSZWdpb25MZXZlbEVuZHBvaW50LFxuICBzZXRTZGtOYW1lLFxuICBzZXRHYXRld2F5RW5kUG9pbnRXaXRoRW52LFxuICB0eXBlIElTZXRFbmRQb2ludFdpdGhLZXksXG4gIHNldEVuZFBvaW50SW5mbyxcbiAgZ2V0RW5kUG9pbnRJbmZvLFxuICBnZXRTZGtWZXJzaW9uLFxufSBmcm9tICcuL2NvbnN0YW50cy9jb21tb24nXG5pbXBvcnQgeyBpMThuUHJveHksIExBTkdTIH0gZnJvbSAnLi9saWJzL2xhbmcnXG5pbXBvcnQgeyBnZW5lcmF0ZUFwaXMsIGdlbmVyYXRlQ2FsbEFwaXMgfSBmcm9tICcuL2xpYnMvY2FsbEFwaXMnXG5leHBvcnQgeyBnZXRCYXNlRW5kUG9pbnQgfSBmcm9tICcuL2NvbnN0YW50cy9jb21tb24nXG5leHBvcnQgeyBMQU5HUyB9IGZyb20gJy4vbGlicy9sYW5nJ1xuY29uc3QgeyB1c2VBZGFwdGVycywgdXNlRGVmYXVsdEFkYXB0ZXIgfSA9IGFkYXB0ZXJzXG5jb25zdCB7IEVSUk9SUywgQ09NTVVOSVRZX1NJVEVfVVJMIH0gPSBjb25zdGFudHNcbmNvbnN0IHsgcHJpbnRXYXJuIH0gPSB1dGlsc1xuY29uc3QgeyBjYXRjaEVycm9yc0RlY29yYXRvciB9ID0gaGVscGVyc1xuXG4vKipcbiAqIEBjb25zdGFudCDpu5jorqTphY3nva5cbiAqL1xuY29uc3QgREVGQVVMVF9JTklUX0NPTkZJRzogUGFydGlhbDxJQ2xvdWRiYXNlQ29uZmlnPiA9IHtcbiAgdGltZW91dDogMTUwMDAsXG4gIHBlcnNpc3RlbmNlOiAnbG9jYWwnLFxufVxuXG4vLyB0aW1lb3V05LiK6ZmQMTDliIbpkp9cbmNvbnN0IE1BWF9USU1FT1VUID0gMTAwMCAqIDYwICogMTBcbi8vIHRpbWVvdXTkuIvpmZAxMDBtc1xuY29uc3QgTUlOX1RJTUVPVVQgPSAxMDBcblxuY29uc3QgZXh0ZW5zaW9uTWFwOiBLVjxJQ2xvdWRiYXNlRXh0ZW5zaW9uPiA9IHt9XG5cbmNsYXNzIENsb3VkYmFzZSBpbXBsZW1lbnRzIElDbG91ZGJhc2Uge1xuICBwdWJsaWMgYXV0aEluc3RhbmNlOiBJQ2xvdWRiYXNlQXV0aFxuICBwdWJsaWMgb2F1dGhJbnN0YW5jZTogYW55XG4gIHB1YmxpYyByZXF1ZXN0Q2xpZW50OiBhbnlcbiAgcHVibGljIG9hdXRoQ2xpZW50OiBhbnlcbiAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICBwcml2YXRlIGNsb3VkYmFzZUNvbmZpZzogSUNsb3VkYmFzZUNvbmZpZ1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IElDbG91ZGJhc2VDb25maWcpIHtcbiAgICB0aGlzLmNsb3VkYmFzZUNvbmZpZyA9IGNvbmZpZyA/IGNvbmZpZyA6IHRoaXMuY2xvdWRiYXNlQ29uZmlnXG4gICAgdGhpcy5hdXRoSW5zdGFuY2UgPSBudWxsXG4gICAgdGhpcy5vYXV0aEluc3RhbmNlID0gbnVsbFxuICAgIHRoaXMudmVyc2lvbiA9IGdldFNka1ZlcnNpb24oKVxuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jbG91ZGJhc2VDb25maWdcbiAgfVxuXG4gIGdldCBwbGF0Zm9ybSgpOiBJQ2xvdWRiYXNlUGxhdGZvcm1JbmZvIHtcbiAgICByZXR1cm4gUGxhdGZvcm1cbiAgfVxuXG4gIGdldCBjYWNoZSgpOiBJQ2xvdWRiYXNlQ2FjaGUge1xuICAgIHJldHVybiBnZXRDYWNoZUJ5RW52SWQodGhpcy5jbG91ZGJhc2VDb25maWcuZW52KVxuICB9XG5cbiAgZ2V0IGxvY2FsQ2FjaGUoKTogSUNsb3VkYmFzZUNhY2hlIHtcbiAgICByZXR1cm4gZ2V0TG9jYWxDYWNoZSh0aGlzLmNsb3VkYmFzZUNvbmZpZy5lbnYpXG4gIH1cblxuICBnZXQgcmVxdWVzdCgpOiBJQ2xvdWRiYXNlUmVxdWVzdCB7XG4gICAgcmV0dXJuIGdldFJlcXVlc3RCeUVudklkKHRoaXMuY2xvdWRiYXNlQ29uZmlnLmVudilcbiAgfVxuXG4gIGdldCBhcGlzKCk6IHsgW2tleTogc3RyaW5nXTogdHlwZW9mIGdlbmVyYXRlQ2FsbEFwaXMgfSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlQXBpcy5jYWxsKHRoaXMpXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIG1vZGU6ICdzeW5jJyxcbiAgICB0aXRsZTogJ0Nsb3VkYmFzZSDliJ3lp4vljJblpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggY2xvdWRiYXNlLmluaXQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOWmguaenOaYr+mdnua1j+iniOWZqOeOr+Wig++8jOaYr+WQpumFjee9ruS6huWuieWFqOW6lOeUqOadpea6kO+8iGh0dHBzOi8vZG9jcy5jbG91ZGJhc2UubmV0L2FwaS1yZWZlcmVuY2Uvd2VidjMvYWRhcHRlciMlRTclQUMlQUMtMi0lRTYlQUQlQTUlRTklODUlOEQlRTclQkQlQUUlRTUlQUUlODklRTUlODUlQTglRTUlQkElOTQlRTclOTQlQTglRTYlOUQlQTUlRTYlQkElOTDvvIknLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGluaXQoY29uZmlnOiBJQ2xvdWRiYXNlQ29uZmlnICYgeyBsYW5nPzogTEFOR1MgfSk6IENsb3VkYmFzZSB7XG4gICAgaWYgKCFjb25maWcuZW52KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogJ2VudiBtdXN0IG5vdCBiZSBzcGVjaWZpZWQnLFxuICAgICAgfSksKVxuICAgIH1cbiAgICAvLyDliJ3lp4vljJbml7boi6XmnKrlhbzlrrnlubPlj7DvvIzliJnkvb/nlKjpu5jorqRhZGFwdGVyXG4gICAgaWYgKCFQbGF0Zm9ybS5hZGFwdGVyKSB7XG4gICAgICB0aGlzLnVzZURlZmF1bHRBZGFwdGVyKClcbiAgICB9XG5cbiAgICBjb25zdCByZXFDb25maWc6IElSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgfHwgNTAwMCxcbiAgICAgIHRpbWVvdXRNc2c6IGBbJHtnZXRTZGtOYW1lKCl9XVtSRVFVRVNUIFRJTUVPVVRdIHJlcXVlc3QgaGFkIGJlZW4gYWJvcnQgc2luY2UgZGlkbid0IGZpbmlzaGVkIHdpdGhpbiR7XG4gICAgICAgIGNvbmZpZy50aW1lb3V0IC8gMTAwMFxuICAgICAgfXNgLFxuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdENsaWVudCA9IG5ldyBQbGF0Zm9ybS5hZGFwdGVyLnJlcUNsYXNzKHJlcUNvbmZpZylcblxuICAgIHRoaXMuY2xvdWRiYXNlQ29uZmlnID0ge1xuICAgICAgLi4uREVGQVVMVF9JTklUX0NPTkZJRyxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGkxOG46IGkxOG5Qcm94eShQbGF0Zm9ybSwgY29uZmlnKSxcbiAgICB9XG5cbiAgICBkZWxldGUgKHRoaXMuY2xvdWRiYXNlQ29uZmlnIGFzIGFueSkubGFuZ1xuICAgIC8vIOS/ruato3RpbWVvdXTlj5blgLxcbiAgICB0aGlzLmNsb3VkYmFzZUNvbmZpZy50aW1lb3V0ID0gdGhpcy5mb3JtYXRUaW1lb3V0KHRoaXMuY2xvdWRiYXNlQ29uZmlnLnRpbWVvdXQpXG4gICAgLy8g5Yid5aeL5YyWY2FjaGXlkoxyZXF1ZXN0XG4gICAgY29uc3QgeyBlbnYsIHBlcnNpc3RlbmNlLCBkZWJ1ZywgdGltZW91dCwgb2F1dGhDbGllbnQsIGkxOG4gfSA9IHRoaXMuY2xvdWRiYXNlQ29uZmlnXG4gICAgaW5pdENhY2hlKHsgZW52LCBwZXJzaXN0ZW5jZSwgZGVidWcsIHBsYXRmb3JtSW5mbzogdGhpcy5wbGF0Zm9ybSB9KVxuXG4gICAgc2V0UmVnaW9uTGV2ZWxFbmRwb2ludChlbnYsIGNvbmZpZy5yZWdpb24gfHwgJycpXG4gICAgc2V0R2F0ZXdheUVuZFBvaW50V2l0aEVudihlbnYpXG5cbiAgICBjb25zdCBhcHAgPSBuZXcgQ2xvdWRiYXNlKHRoaXMuY2xvdWRiYXNlQ29uZmlnKVxuICAgIGluaXRSZXF1ZXN0KHsgZW52LCByZWdpb246IGNvbmZpZy5yZWdpb24gfHwgJycsIHRpbWVvdXQsIG9hdXRoQ2xpZW50LCBfZnJvbUFwcDogYXBwLCBpMThuIH0pXG4gICAgYXBwLnJlcXVlc3RDbGllbnQgPSB0aGlzLnJlcXVlc3RDbGllbnRcbiAgICA7KHRoaXMgYXMgYW55KT8uZmlyZT8uKCdjbG91ZGJhc2VfaW5pdCcsIGFwcClcbiAgICB0aGlzLnRyeTJJbml0QXV0aChjb25maWcsIGFwcClcblxuICAgIHJldHVybiBhcHBcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDb25maWcoY29uZmlnOiBJQ2xvdWRiYXNlVXBncmFkZWRDb25maWcpIHtcbiAgICBjb25zdCB7IHBlcnNpc3RlbmNlLCBkZWJ1ZyB9ID0gY29uZmlnXG4gICAgdGhpcy5jbG91ZGJhc2VDb25maWcucGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVxuICAgIHRoaXMuY2xvdWRiYXNlQ29uZmlnLmRlYnVnID0gZGVidWdcbiAgICAvLyBwZXJzaXN0ZW5jZeaUueWKqOW9seWTjWNhY2hlXG4gICAgaW5pdENhY2hlKHsgZW52OiB0aGlzLmNsb3VkYmFzZUNvbmZpZy5lbnYsIHBlcnNpc3RlbmNlLCBkZWJ1ZywgcGxhdGZvcm1JbmZvOiB0aGlzLnBsYXRmb3JtIH0pXG4gIH1cblxuICBwdWJsaWMgdXBkYXRlTGFuZyhsYW5nOiBMQU5HUykge1xuICAgIGlmICghbGFuZyB8fCBsYW5nID09PSB0aGlzLmNsb3VkYmFzZUNvbmZpZy5pMThuPy5sYW5nKSByZXR1cm5cblxuICAgIHRoaXMuY2xvdWRiYXNlQ29uZmlnLmkxOG4ubGFuZyA9IGxhbmdcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckV4dGVuc2lvbihleHQ6IElDbG91ZGJhc2VFeHRlbnNpb24pIHtcbiAgICBleHRlbnNpb25NYXBbZXh0Lm5hbWVdID0gZXh0XG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iwg+eUqOaJqeWxleiDveWKm+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBpbnZva2VFeHRlbnNpb24oKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOiiq+iwg+eUqOeahOaJqeWxleiDveWKm+aYr+WQpuW3sue7j+WuieijheW5tumAmui/hyByZWdpc3RlckV4dGVuc2lvbigpIOazqOWGjCcsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgaW52b2tlRXh0ZW5zaW9uKG5hbWU6IHN0cmluZywgb3B0czogYW55KSB7XG4gICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uTWFwW25hbWVdXG4gICAgaWYgKCFleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgbXNnOiBgZXh0ZW5zaW9uOiR7bmFtZX0gbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBpbnZva2VgLFxuICAgICAgfSksKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBleHQuaW52b2tlKG9wdHMsIHRoaXMpXG4gIH1cblxuICBwdWJsaWMgdXNlQWRhcHRlcnMoYWRhcHRlcnM6IENsb3VkYmFzZUFkYXB0ZXIgfCBDbG91ZGJhc2VBZGFwdGVyW10sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICBjb25zdCB7IGFkYXB0ZXIsIHJ1bnRpbWUgfSA9IHVzZUFkYXB0ZXJzKGFkYXB0ZXJzLCBvcHRpb25zKSB8fCB7fVxuICAgIGFkYXB0ZXIgJiYgKFBsYXRmb3JtLmFkYXB0ZXIgPSBhZGFwdGVyIGFzIFNES0FkYXB0ZXJJbnRlcmZhY2UpXG4gICAgcnVudGltZSAmJiAoUGxhdGZvcm0ucnVudGltZSA9IHJ1bnRpbWUgYXMgc3RyaW5nKVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySG9vayhob29rOiBJQ2xvdWRiYXNlSG9vaykge1xuICAgIHJlZ2lzdGVySG9vayhDbG91ZGJhc2UsIGhvb2spXG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50OiBJQ2xvdWRiYXNlQ29tcG9uZW50KSB7XG4gICAgcmVnaXN0ZXJDb21wb25lbnQoQ2xvdWRiYXNlLCBjb21wb25lbnQpXG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJWZXJzaW9uKHZlcnNpb246IHN0cmluZykge1xuICAgIHNldFNka1ZlcnNpb24odmVyc2lvbilcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZGtOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHNldFNka05hbWUobmFtZSlcbiAgfVxuXG4gIC8qKiDorr7nva4gdGNiIGFwaSDnmoQgZW5kcG9pbnQgKi9cbiAgcHVibGljIHJlZ2lzdGVyRW5kUG9pbnQodXJsOiBzdHJpbmcsIHByb3RvY29sPzogJ2h0dHAnIHwgJ2h0dHBzJykge1xuICAgIHNldEVuZFBvaW50SW5mbyh7IGJhc2VVcmw6IHVybCwgcHJvdG9jb2wsIGVudjogdGhpcy5jb25maWcuZW52LCBlbmRQb2ludEtleTogJ0NMT1VEX0FQSScgfSlcbiAgfVxuXG4gIC8qKiDorr7nva7nvZHlhbMvdGNiIGFwaeeahCBlbmRQb2ludO+8jOmAmui/hyBrZXkg5oyH5a6aICovXG4gIHB1YmxpYyByZWdpc3RlckVuZFBvaW50V2l0aEtleShwcm9wczogSVNldEVuZFBvaW50V2l0aEtleSkge1xuICAgIHNldEVuZFBvaW50SW5mbyh7XG4gICAgICBlbnY6IHRoaXMuY29uZmlnLmVudixcbiAgICAgIGVuZFBvaW50S2V5OiBwcm9wcy5rZXksXG4gICAgICBiYXNlVXJsOiBwcm9wcy51cmwsXG4gICAgICBwcm90b2NvbDogcHJvcHMucHJvdG9jb2wsXG4gICAgfSlcbiAgfVxuXG4gIC8qKiDmi7/nvZHlhbMvdGNiIGFwaeeahCBlbmRQb2ludO+8jOmAmui/hyBrZXkg5oyH5a6aICovXG4gIHB1YmxpYyBnZXRFbmRQb2ludFdpdGhLZXkoa2V5OiBFbmRQb2ludEtleSkge1xuICAgIGNvbnN0IGluZm8gPSBnZXRFbmRQb2ludEluZm8odGhpcy5jb25maWcuZW52LCBrZXkpXG4gICAgcmV0dXJuIHtcbiAgICAgIEJBU0VfVVJMOiBpbmZvLmJhc2VVcmwsXG4gICAgICBQUk9UT0NPTDogaW5mby5wcm90b2NvbCxcbiAgICB9XG4gIH1cblxuICAvLyDop6PmnpBVUkzlj4LmlbBcbiAgcHVibGljIHBhcnNlQ2FwdGNoYSh1cmwpIHtcbiAgICBsZXQgcXVlcnlPYmo6IGFueSA9IHt9XG4gICAgY29uc3QgbWF0Y2hlZCA9IHVybC5tYXRjaCgvXihkYXRhOi4qPykoXFw/W14jXFxzXSopPyQvKVxuICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICB1cmwgPSBtYXRjaGVkWzFdXG4gICAgICBjb25zdCBzZWFyY2ggPSBtYXRjaGVkWzJdXG4gICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgIHF1ZXJ5T2JqID0gdXRpbHMucGFyc2VRdWVyeVN0cmluZyhzZWFyY2gpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgdG9rZW4sIC4uLnJlc3RRdWVyeU9iaiB9ID0gcXVlcnlPYmpcbiAgICBpZiAoL15kYXRhOi8udGVzdCh1cmwpICYmICF0b2tlbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6ICdpbnZhbGlkX2FyZ3VtZW50JyxcbiAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGBpbnZhbGlkIGNhcHRjaGEgZGF0YTogJHt1cmx9YCxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6ICd1bmltcGxlbWVudGVkJyxcbiAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246ICduZWVkIHRvIGltcGwgY2FwdGNoYSBkYXRhJyxcbiAgICAgIH1cbiAgICB9XG4gICAgLy8g6Kej5p6QdXJs5b6X5Yiw55qE5Y+C5pWwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiByZXN0UXVlcnlPYmouc3RhdGUsXG4gICAgICB0b2tlbiwgLy8g6aqM6K+B56CBdG9rZW5cbiAgICAgIGNhcHRjaGFEYXRhOiB1cmwsIC8vIOmqjOivgeeggWJhc2U2NOWbvueJh1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXNlRGVmYXVsdEFkYXB0ZXIoKSB7XG4gICAgY29uc3QgeyBhZGFwdGVyLCBydW50aW1lIH0gPSB1c2VEZWZhdWx0QWRhcHRlcigpXG4gICAgUGxhdGZvcm0uYWRhcHRlciA9IGFkYXB0ZXIgYXMgU0RLQWRhcHRlckludGVyZmFjZVxuICAgIFBsYXRmb3JtLnJ1bnRpbWUgPSBydW50aW1lIGFzIHN0cmluZ1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSB0aW1lb3V0ID4gTUFYX1RJTUVPVVQ6XG4gICAgICAgIHByaW50V2FybihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd0aW1lb3V0IGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIHZhbHVlWzEwbWluXScpXG4gICAgICAgIHJldHVybiBNQVhfVElNRU9VVFxuICAgICAgY2FzZSB0aW1lb3V0IDwgTUlOX1RJTUVPVVQ6XG4gICAgICAgIHByaW50V2FybihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd0aW1lb3V0IGlzIGxlc3MgdGhhbiBtYXhpbXVtIHZhbHVlWzEwMG1zXScpXG4gICAgICAgIHJldHVybiBNSU5fVElNRU9VVFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRpbWVvdXRcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyeTJJbml0QXV0aChjb25maWc6IElDbG91ZGJhc2VDb25maWcsIGFwcCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoY29uZmlnLmFjY2Vzc0tleSkge1xuICAgICAgICBhcHAuYXV0aCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCd0cnkySW5pdEF1dGggZXJyb3I6JywgZXJyb3IpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjbG91ZGJhc2U6IElDbG91ZGJhc2UgPSBuZXcgQ2xvdWRiYXNlKClcbmNsb3VkYmFzZS51c2VBZGFwdGVycyhhZGFwdGVyRm9yV3hNcClcblxuZXhwb3J0IGRlZmF1bHQgY2xvdWRiYXNlXG4iXX0=