UNPKG

mzinga

Version:

Node, React and MongoDB Headless CMS and Application Framework

274 lines (273 loc) 38.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { BasePayload: function() { return BasePayload; }, getPayload: function() { return getPayload; } }); const _crypto = /*#__PURE__*/ _interop_require_default(require("crypto")); const _path = /*#__PURE__*/ _interop_require_default(require("path")); const _crypto1 = require("./auth/crypto"); const _local = /*#__PURE__*/ _interop_require_default(require("./collections/operations/local")); const _find = /*#__PURE__*/ _interop_require_default(require("./config/find")); const _build = /*#__PURE__*/ _interop_require_default(require("./email/build")); const _defaults = require("./email/defaults"); const _sendEmail = /*#__PURE__*/ _interop_require_default(require("./email/sendEmail")); const _local1 = /*#__PURE__*/ _interop_require_default(require("./globals/operations/local")); const _registerSchema = /*#__PURE__*/ _interop_require_default(require("./graphql/registerSchema")); const _logger = /*#__PURE__*/ _interop_require_default(require("./utilities/logger")); const _serverInit = require("./utilities/telemetry/events/serverInit"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class BasePayload { Mutation = { name: 'Mutation', fields: {} }; Query = { name: 'Query', fields: {} }; authenticate; collections = {}; config; /** * @description Performs count operation * @param options * @returns count of documents satisfying query */ count = async (options)=>{ const { count } = _local.default; return count(this, options); }; /** * @description Performs create operation * @param options * @returns created document */ create = async (options)=>{ const { create } = _local.default; return create(this, options); }; db; decrypt = _crypto1.decrypt; email; emailOptions; encrypt = _crypto1.encrypt; errorHandler; express; extensions; /** * @description Find documents with criteria * @param options * @returns documents satisfying query */ find = async (options)=>{ const { find } = _local.default; return find(this, options); }; findByID = async (options)=>{ const { findByID } = _local.default; return findByID(this, options); }; findGlobal = async (options)=>{ const { findOne } = _local1.default; return findOne(this, options); }; /** * @description Find global version by ID * @param options * @returns global version with specified ID */ findGlobalVersionByID = async (options)=>{ const { findVersionByID } = _local1.default; return findVersionByID(this, options); }; /** * @description Find global versions with criteria * @param options * @returns versions satisfying query */ findGlobalVersions = async (options)=>{ const { findVersions } = _local1.default; return findVersions(this, options); }; /** * @description Find version by ID * @param options * @returns version with specified ID */ findVersionByID = async (options)=>{ const { findVersionByID } = _local.default; return findVersionByID(this, options); }; /** * @description Find versions with criteria * @param options * @returns versions satisfying query */ findVersions = async (options)=>{ const { findVersions } = _local.default; return findVersions(this, options); }; forgotPassword = async (options)=>{ const { forgotPassword } = _local.default.auth; return forgotPassword(this, options); }; getAPIURL = ()=>`${this.config.serverURL}${this.config.routes.api}`; getAdminURL = ()=>`${this.config.serverURL}${this.config.routes.admin}`; globals; local; logger; login = async (options)=>{ const { login } = _local.default.auth; return login(this, options); }; /** * @description Find document by ID * @param options * @returns document with specified ID */ resetPassword = async (options)=>{ const { resetPassword } = _local.default.auth; return resetPassword(this, options); }; /** * @description Restore global version by ID * @param options * @returns version with specified ID */ restoreGlobalVersion = async (options)=>{ const { restoreVersion } = _local1.default; return restoreVersion(this, options); }; /** * @description Restore version by ID * @param options * @returns version with specified ID */ restoreVersion = async (options)=>{ const { restoreVersion } = _local.default; return restoreVersion(this, options); }; router; schema; secret; sendEmail; types; unlock = async (options)=>{ const { unlock } = _local.default.auth; return unlock(this, options); }; updateGlobal = async (options)=>{ const { update } = _local1.default; return update(this, options); }; validationRules; verifyEmail = async (options)=>{ const { verifyEmail } = _local.default.auth; return verifyEmail(this, options); }; versions = {}; delete(options) { const { deleteLocal } = _local.default; return deleteLocal(this, options); } /** * @description Initializes Payload * @param options */ async init(options) { this.logger = options.logger ?? (0, _logger.default)('payload', options.loggerOptions, options.loggerDestination); if (!options.secret) { throw new Error('Error: missing secret key. A secret key is needed to secure Payload.'); } this.secret = _crypto.default.createHash('sha256').update(options.secret).digest('hex').slice(0, 32); this.local = options.local; if (options.config) { this.config = await options.config; const configPath = (0, _find.default)(); this.config = { ...this.config, paths: { config: configPath, configDir: _path.default.dirname(configPath), rawConfig: configPath } }; } else { // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require const loadConfig = require('./config/load').default; this.config = await loadConfig(this.logger); } this.globals = { config: this.config.globals }; this.config.collections.forEach((collection)=>{ this.collections[collection.slug] = { config: collection }; }); this.db = this.config.db({ payload: this }); this.db.payload = this; if (this.db?.init) { await this.db.init(this); } if (!options.disableDBConnect && this.db.connect) { await this.db.connect(this); } this.logger.info('Starting Payload...'); // Configure email service const emailOptions = options.email ? { ...options.email } : this.config.email; if (options.email && this.config.email) { this.logger.warn('Email options provided in both init options and config. Using init options.'); } this.emailOptions = emailOptions ?? _defaults.defaults; this.email = (0, _build.default)(this.emailOptions, this.logger); this.sendEmail = _sendEmail.default.bind(this); if (!this.config.graphQL.disable) { (0, _registerSchema.default)(this); } (0, _serverInit.serverInit)(this); if (!options.disableOnInit) { if (typeof options.onInit === 'function') await options.onInit(this); if (typeof this.config.onInit === 'function') await this.config.onInit(this); } return this; } update(options) { const { update } = _local.default; return update(this, options); } } let cached = global._payload; if (!cached) { // eslint-disable-next-line no-multi-assign cached = global._payload = { payload: null, promise: null }; } const getPayload = async (options)=>{ if (cached.payload) { return cached.payload; } if (!cached.promise) { cached.promise = new BasePayload().init(options); } try { cached.payload = await cached.promise; } catch (e) { cached.promise = null; throw e; } return cached.payload; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9temluZ2EudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFeHByZXNzLCBSb3V0ZXIgfSBmcm9tICdleHByZXNzJ1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25SZXN1bHQsIEdyYXBoUUxTY2hlbWEsIFZhbGlkYXRpb25SdWxlIH0gZnJvbSAnZ3JhcGhxbCdcbi8vIEB0cy1leHBlY3QtZXJyb3IgLy8gVE9ETyBGaXggdGhpcyAtIG1vZHVsZVJlc29sdXRpb24gMTYgYnJlYWtzIHRoaXMgaW1wb3J0XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvbkFyZ3MsIFJlcXVlc3QgYXMgZ3JhcGhRTFJlcXVlc3QgfSBmcm9tICdncmFwaHFsLWh0dHAvbGliL2hhbmRsZXInXG5pbXBvcnQgdHlwZSB7IFNlbmRNYWlsT3B0aW9ucyB9IGZyb20gJ25vZGVtYWlsZXInXG5pbXBvcnQgdHlwZSBwaW5vIGZyb20gJ3Bpbm8nXG5cbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUFkYXB0ZXIsIEdlbmVyYXRlZFR5cGVzIH0gZnJvbSAnLicgLy8gTXVzdCBpbXBvcnQgZnJvbSBQYXlsb2FkIHRvIHN1cHBvcnQgZGVjbGFyZSBtb2R1bGVcbmltcG9ydCB0eXBlIHsgUmVzdWx0IGFzIEZvcmdvdFBhc3N3b3JkUmVzdWx0IH0gZnJvbSAnLi9hdXRoL29wZXJhdGlvbnMvZm9yZ290UGFzc3dvcmQnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgRm9yZ290UGFzc3dvcmRPcHRpb25zIH0gZnJvbSAnLi9hdXRoL29wZXJhdGlvbnMvbG9jYWwvZm9yZ290UGFzc3dvcmQnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgTG9naW5PcHRpb25zIH0gZnJvbSAnLi9hdXRoL29wZXJhdGlvbnMvbG9jYWwvbG9naW4nXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUmVzZXRQYXNzd29yZE9wdGlvbnMgfSBmcm9tICcuL2F1dGgvb3BlcmF0aW9ucy9sb2NhbC9yZXNldFBhc3N3b3JkJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIFVubG9ja09wdGlvbnMgfSBmcm9tICcuL2F1dGgvb3BlcmF0aW9ucy9sb2NhbC91bmxvY2snXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgVmVyaWZ5RW1haWxPcHRpb25zIH0gZnJvbSAnLi9hdXRoL29wZXJhdGlvbnMvbG9jYWwvdmVyaWZ5RW1haWwnXG5pbXBvcnQgdHlwZSB7IFJlc3VsdCBhcyBMb2dpblJlc3VsdCB9IGZyb20gJy4vYXV0aC9vcGVyYXRpb25zL2xvZ2luJ1xuaW1wb3J0IHR5cGUgeyBSZXN1bHQgYXMgUmVzZXRQYXNzd29yZFJlc3VsdCB9IGZyb20gJy4vYXV0aC9vcGVyYXRpb25zL3Jlc2V0UGFzc3dvcmQnXG5pbXBvcnQgdHlwZSB7IEJ1bGtPcGVyYXRpb25SZXN1bHQsIENvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb25zL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBDb3VudE9wdGlvbnMgfSBmcm9tICcuL2NvbGxlY3Rpb25zL29wZXJhdGlvbnMvbG9jYWwvY291bnQnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgQ3JlYXRlT3B0aW9ucyB9IGZyb20gJy4vY29sbGVjdGlvbnMvb3BlcmF0aW9ucy9sb2NhbC9jcmVhdGUnXG5pbXBvcnQgdHlwZSB7XG4gIEJ5SURPcHRpb25zIGFzIERlbGV0ZUJ5SURPcHRpb25zLFxuICBNYW55T3B0aW9ucyBhcyBEZWxldGVNYW55T3B0aW9ucyxcbiAgT3B0aW9ucyBhcyBEZWxldGVPcHRpb25zLFxufSBmcm9tICcuL2NvbGxlY3Rpb25zL29wZXJhdGlvbnMvbG9jYWwvZGVsZXRlJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIEZpbmRPcHRpb25zIH0gZnJvbSAnLi9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL2xvY2FsL2ZpbmQnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgRmluZEJ5SURPcHRpb25zIH0gZnJvbSAnLi9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL2xvY2FsL2ZpbmRCeUlEJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIEZpbmRWZXJzaW9uQnlJRE9wdGlvbnMgfSBmcm9tICcuL2NvbGxlY3Rpb25zL29wZXJhdGlvbnMvbG9jYWwvZmluZFZlcnNpb25CeUlEJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIEZpbmRWZXJzaW9uc09wdGlvbnMgfSBmcm9tICcuL2NvbGxlY3Rpb25zL29wZXJhdGlvbnMvbG9jYWwvZmluZFZlcnNpb25zJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIFJlc3RvcmVWZXJzaW9uT3B0aW9ucyB9IGZyb20gJy4vY29sbGVjdGlvbnMvb3BlcmF0aW9ucy9sb2NhbC9yZXN0b3JlVmVyc2lvbidcbmltcG9ydCB0eXBlIHtcbiAgQnlJRE9wdGlvbnMgYXMgVXBkYXRlQnlJRE9wdGlvbnMsXG4gIE1hbnlPcHRpb25zIGFzIFVwZGF0ZU1hbnlPcHRpb25zLFxuICBPcHRpb25zIGFzIFVwZGF0ZU9wdGlvbnMsXG59IGZyb20gJy4vY29sbGVjdGlvbnMvb3BlcmF0aW9ucy9sb2NhbC91cGRhdGUnXG5pbXBvcnQgdHlwZSB7IEVtYWlsT3B0aW9ucywgSW5pdE9wdGlvbnMsIFNhbml0aXplZENvbmZpZyB9IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0ZWREb2NzIH0gZnJvbSAnLi9kYXRhYmFzZS90eXBlcydcbmltcG9ydCB0eXBlIHsgQnVpbGRFbWFpbFJlc3VsdCB9IGZyb20gJy4vZW1haWwvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBheWxvYWRBdXRoZW50aWNhdGUgfSBmcm9tICcuL2V4cHJlc3MvbWlkZGxld2FyZS9hdXRoZW50aWNhdGUnXG5pbXBvcnQgdHlwZSB7IEVycm9ySGFuZGxlciB9IGZyb20gJy4vZXhwcmVzcy9taWRkbGV3YXJlL2Vycm9ySGFuZGxlcidcbmltcG9ydCB0eXBlIHsgR2xvYmFscyB9IGZyb20gJy4vZ2xvYmFscy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgRmluZEdsb2JhbE9wdGlvbnMgfSBmcm9tICcuL2dsb2JhbHMvb3BlcmF0aW9ucy9sb2NhbC9maW5kT25lJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIEZpbmRHbG9iYWxWZXJzaW9uQnlJRE9wdGlvbnMgfSBmcm9tICcuL2dsb2JhbHMvb3BlcmF0aW9ucy9sb2NhbC9maW5kVmVyc2lvbkJ5SUQnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgRmluZEdsb2JhbFZlcnNpb25zT3B0aW9ucyB9IGZyb20gJy4vZ2xvYmFscy9vcGVyYXRpb25zL2xvY2FsL2ZpbmRWZXJzaW9ucydcbmltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBSZXN0b3JlR2xvYmFsVmVyc2lvbk9wdGlvbnMgfSBmcm9tICcuL2dsb2JhbHMvb3BlcmF0aW9ucy9sb2NhbC9yZXN0b3JlVmVyc2lvbidcbmltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBVcGRhdGVHbG9iYWxPcHRpb25zIH0gZnJvbSAnLi9nbG9iYWxzL29wZXJhdGlvbnMvbG9jYWwvdXBkYXRlJ1xuaW1wb3J0IHR5cGUgeyBUeXBlV2l0aFZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb25zL3R5cGVzJ1xuXG5pbXBvcnQgeyBkZWNyeXB0LCBlbmNyeXB0IH0gZnJvbSAnLi9hdXRoL2NyeXB0bydcbmltcG9ydCBsb2NhbE9wZXJhdGlvbnMgZnJvbSAnLi9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL2xvY2FsJ1xuaW1wb3J0IGZpbmRDb25maWcgZnJvbSAnLi9jb25maWcvZmluZCdcbmltcG9ydCBidWlsZEVtYWlsIGZyb20gJy4vZW1haWwvYnVpbGQnXG5pbXBvcnQgeyBkZWZhdWx0cyBhcyBlbWFpbERlZmF1bHRzIH0gZnJvbSAnLi9lbWFpbC9kZWZhdWx0cydcbmltcG9ydCBzZW5kRW1haWwgZnJvbSAnLi9lbWFpbC9zZW5kRW1haWwnXG5pbXBvcnQgbG9jYWxHbG9iYWxPcGVyYXRpb25zIGZyb20gJy4vZ2xvYmFscy9vcGVyYXRpb25zL2xvY2FsJ1xuaW1wb3J0IHJlZ2lzdGVyR3JhcGhRTFNjaGVtYSBmcm9tICcuL2dyYXBocWwvcmVnaXN0ZXJTY2hlbWEnXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4vdXRpbGl0aWVzL2xvZ2dlcidcbmltcG9ydCB7IHNlcnZlckluaXQgYXMgc2VydmVySW5pdFRlbGVtZXRyeSB9IGZyb20gJy4vdXRpbGl0aWVzL3RlbGVtZXRyeS9ldmVudHMvc2VydmVySW5pdCdcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgQmFzZVBheWxvYWQ8VEdlbmVyYXRlZFR5cGVzIGV4dGVuZHMgR2VuZXJhdGVkVHlwZXM+IHtcbiAgTXV0YXRpb246IHsgZmllbGRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9OyBuYW1lOiBzdHJpbmcgfSA9IHsgbmFtZTogJ011dGF0aW9uJywgZmllbGRzOiB7fSB9XG5cbiAgUXVlcnk6IHsgZmllbGRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9OyBuYW1lOiBzdHJpbmcgfSA9IHsgbmFtZTogJ1F1ZXJ5JywgZmllbGRzOiB7fSB9XG5cbiAgYXV0aGVudGljYXRlOiBQYXlsb2FkQXV0aGVudGljYXRlXG5cbiAgY29sbGVjdGlvbnM6IHtcbiAgICBbc2x1ZzogbnVtYmVyIHwgc3RyaW5nIHwgc3ltYm9sXTogQ29sbGVjdGlvblxuICB9ID0ge31cblxuICBjb25maWc6IFNhbml0aXplZENvbmZpZ1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGVyZm9ybXMgY291bnQgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIGNvdW50IG9mIGRvY3VtZW50cyBzYXRpc2Z5aW5nIHF1ZXJ5XG4gICAqL1xuICBjb3VudCA9IGFzeW5jIDxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgICBvcHRpb25zOiBDb3VudE9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8eyB0b3RhbERvY3M6IG51bWJlciB9PiA9PiB7XG4gICAgY29uc3QgeyBjb3VudCB9ID0gbG9jYWxPcGVyYXRpb25zXG4gICAgcmV0dXJuIGNvdW50KHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBlcmZvcm1zIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgY3JlYXRlZCBkb2N1bWVudFxuICAgKi9cbiAgY3JlYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBrZXlvZiBUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ10+KFxuICAgIG9wdGlvbnM6IENyZWF0ZU9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8VEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddW1RdPiA9PiB7XG4gICAgY29uc3QgeyBjcmVhdGUgfSA9IGxvY2FsT3BlcmF0aW9uc1xuICAgIHJldHVybiBjcmVhdGU8VD4odGhpcywgb3B0aW9ucylcbiAgfVxuXG4gIGRiOiBEYXRhYmFzZUFkYXB0ZXJcblxuICBkZWNyeXB0ID0gZGVjcnlwdFxuXG4gIGVtYWlsOiBCdWlsZEVtYWlsUmVzdWx0XG5cbiAgZW1haWxPcHRpb25zOiBFbWFpbE9wdGlvbnNcblxuICBlbmNyeXB0ID0gZW5jcnlwdFxuXG4gIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyXG5cbiAgZXhwcmVzcz86IEV4cHJlc3NcblxuICBleHRlbnNpb25zOiAoYXJnczoge1xuICAgIGFyZ3M6IE9wZXJhdGlvbkFyZ3M8YW55PlxuICAgIHJlcTogZ3JhcGhRTFJlcXVlc3Q8dW5rbm93biwgdW5rbm93bj5cbiAgICByZXN1bHQ6IEV4ZWN1dGlvblJlc3VsdFxuICB9KSA9PiBQcm9taXNlPGFueT5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpbmQgZG9jdW1lbnRzIHdpdGggY3JpdGVyaWFcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgZG9jdW1lbnRzIHNhdGlzZnlpbmcgcXVlcnlcbiAgICovXG4gIGZpbmQgPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXT4oXG4gICAgb3B0aW9uczogRmluZE9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8UGFnaW5hdGVkRG9jczxUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVF0+PiA9PiB7XG4gICAgY29uc3QgeyBmaW5kIH0gPSBsb2NhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gZmluZDxUPih0aGlzLCBvcHRpb25zKVxuICB9XG5cbiAgZmluZEJ5SUQgPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXT4oXG4gICAgb3B0aW9uczogRmluZEJ5SURPcHRpb25zPFQ+LFxuICApOiBQcm9taXNlPFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXVtUXT4gPT4ge1xuICAgIGNvbnN0IHsgZmluZEJ5SUQgfSA9IGxvY2FsT3BlcmF0aW9uc1xuICAgIHJldHVybiBmaW5kQnlJRDxUPih0aGlzLCBvcHRpb25zKVxuICB9XG5cbiAgZmluZEdsb2JhbCA9IGFzeW5jIDxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydnbG9iYWxzJ10+KFxuICAgIG9wdGlvbnM6IEZpbmRHbG9iYWxPcHRpb25zPFQ+LFxuICApOiBQcm9taXNlPFRHZW5lcmF0ZWRUeXBlc1snZ2xvYmFscyddW1RdPiA9PiB7XG4gICAgY29uc3QgeyBmaW5kT25lIH0gPSBsb2NhbEdsb2JhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gZmluZE9uZTxUPih0aGlzLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kIGdsb2JhbCB2ZXJzaW9uIGJ5IElEXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIGdsb2JhbCB2ZXJzaW9uIHdpdGggc3BlY2lmaWVkIElEXG4gICAqL1xuICBmaW5kR2xvYmFsVmVyc2lvbkJ5SUQgPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snZ2xvYmFscyddPihcbiAgICBvcHRpb25zOiBGaW5kR2xvYmFsVmVyc2lvbkJ5SURPcHRpb25zPFQ+LFxuICApOiBQcm9taXNlPFR5cGVXaXRoVmVyc2lvbjxUR2VuZXJhdGVkVHlwZXNbJ2dsb2JhbHMnXVtUXT4+ID0+IHtcbiAgICBjb25zdCB7IGZpbmRWZXJzaW9uQnlJRCB9ID0gbG9jYWxHbG9iYWxPcGVyYXRpb25zXG4gICAgcmV0dXJuIGZpbmRWZXJzaW9uQnlJRDxUPih0aGlzLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kIGdsb2JhbCB2ZXJzaW9ucyB3aXRoIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZlcnNpb25zIHNhdGlzZnlpbmcgcXVlcnlcbiAgICovXG4gIGZpbmRHbG9iYWxWZXJzaW9ucyA9IGFzeW5jIDxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydnbG9iYWxzJ10+KFxuICAgIG9wdGlvbnM6IEZpbmRHbG9iYWxWZXJzaW9uc09wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8UGFnaW5hdGVkRG9jczxUeXBlV2l0aFZlcnNpb248VEdlbmVyYXRlZFR5cGVzWydnbG9iYWxzJ11bVF0+Pj4gPT4ge1xuICAgIGNvbnN0IHsgZmluZFZlcnNpb25zIH0gPSBsb2NhbEdsb2JhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gZmluZFZlcnNpb25zPFQ+KHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpbmQgdmVyc2lvbiBieSBJRFxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB2ZXJzaW9uIHdpdGggc3BlY2lmaWVkIElEXG4gICAqL1xuICBmaW5kVmVyc2lvbkJ5SUQgPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXT4oXG4gICAgb3B0aW9uczogRmluZFZlcnNpb25CeUlET3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxUeXBlV2l0aFZlcnNpb248VEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddW1RdPj4gPT4ge1xuICAgIGNvbnN0IHsgZmluZFZlcnNpb25CeUlEIH0gPSBsb2NhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gZmluZFZlcnNpb25CeUlEPFQ+KHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpbmQgdmVyc2lvbnMgd2l0aCBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB2ZXJzaW9ucyBzYXRpc2Z5aW5nIHF1ZXJ5XG4gICAqL1xuICBmaW5kVmVyc2lvbnMgPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXT4oXG4gICAgb3B0aW9uczogRmluZFZlcnNpb25zT3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWREb2NzPFR5cGVXaXRoVmVyc2lvbjxUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVF0+Pj4gPT4ge1xuICAgIGNvbnN0IHsgZmluZFZlcnNpb25zIH0gPSBsb2NhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gZmluZFZlcnNpb25zPFQ+KHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICBmb3Jnb3RQYXNzd29yZCA9IGFzeW5jIDxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgICBvcHRpb25zOiBGb3Jnb3RQYXNzd29yZE9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8Rm9yZ290UGFzc3dvcmRSZXN1bHQ+ID0+IHtcbiAgICBjb25zdCB7IGZvcmdvdFBhc3N3b3JkIH0gPSBsb2NhbE9wZXJhdGlvbnMuYXV0aFxuICAgIHJldHVybiBmb3Jnb3RQYXNzd29yZDxUPih0aGlzLCBvcHRpb25zKVxuICB9XG5cbiAgZ2V0QVBJVVJMID0gKCk6IHN0cmluZyA9PiBgJHt0aGlzLmNvbmZpZy5zZXJ2ZXJVUkx9JHt0aGlzLmNvbmZpZy5yb3V0ZXMuYXBpfWBcblxuICBnZXRBZG1pblVSTCA9ICgpOiBzdHJpbmcgPT4gYCR7dGhpcy5jb25maWcuc2VydmVyVVJMfSR7dGhpcy5jb25maWcucm91dGVzLmFkbWlufWBcblxuICBnbG9iYWxzOiBHbG9iYWxzXG5cbiAgbG9jYWw6IGJvb2xlYW5cblxuICBsb2dnZXI6IHBpbm8uTG9nZ2VyXG5cbiAgbG9naW4gPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXT4oXG4gICAgb3B0aW9uczogTG9naW5PcHRpb25zPFQ+LFxuICApOiBQcm9taXNlPHsgdXNlcjogVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddW1RdIH0gJiBMb2dpblJlc3VsdD4gPT4ge1xuICAgIGNvbnN0IHsgbG9naW4gfSA9IGxvY2FsT3BlcmF0aW9ucy5hdXRoXG4gICAgcmV0dXJuIGxvZ2luPFQ+KHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpbmQgZG9jdW1lbnQgYnkgSURcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgZG9jdW1lbnQgd2l0aCBzcGVjaWZpZWQgSURcbiAgICovXG5cbiAgcmVzZXRQYXNzd29yZCA9IGFzeW5jIDxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgICBvcHRpb25zOiBSZXNldFBhc3N3b3JkT3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkUmVzdWx0PiA9PiB7XG4gICAgY29uc3QgeyByZXNldFBhc3N3b3JkIH0gPSBsb2NhbE9wZXJhdGlvbnMuYXV0aFxuICAgIHJldHVybiByZXNldFBhc3N3b3JkPFQ+KHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc3RvcmUgZ2xvYmFsIHZlcnNpb24gYnkgSURcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgdmVyc2lvbiB3aXRoIHNwZWNpZmllZCBJRFxuICAgKi9cbiAgcmVzdG9yZUdsb2JhbFZlcnNpb24gPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snZ2xvYmFscyddPihcbiAgICBvcHRpb25zOiBSZXN0b3JlR2xvYmFsVmVyc2lvbk9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8VEdlbmVyYXRlZFR5cGVzWydnbG9iYWxzJ11bVF0+ID0+IHtcbiAgICBjb25zdCB7IHJlc3RvcmVWZXJzaW9uIH0gPSBsb2NhbEdsb2JhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gcmVzdG9yZVZlcnNpb248VD4odGhpcywgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzdG9yZSB2ZXJzaW9uIGJ5IElEXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZlcnNpb24gd2l0aCBzcGVjaWZpZWQgSURcbiAgICovXG4gIHJlc3RvcmVWZXJzaW9uID0gYXN5bmMgPFQgZXh0ZW5kcyBrZXlvZiBUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ10+KFxuICAgIG9wdGlvbnM6IFJlc3RvcmVWZXJzaW9uT3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVF0+ID0+IHtcbiAgICBjb25zdCB7IHJlc3RvcmVWZXJzaW9uIH0gPSBsb2NhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gcmVzdG9yZVZlcnNpb248VD4odGhpcywgb3B0aW9ucylcbiAgfVxuXG4gIHJvdXRlcj86IFJvdXRlclxuXG4gIHNjaGVtYTogR3JhcGhRTFNjaGVtYVxuXG4gIHNlY3JldDogc3RyaW5nXG5cbiAgc2VuZEVtYWlsOiAobWVzc2FnZTogU2VuZE1haWxPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+XG5cbiAgdHlwZXM6IHtcbiAgICBhcnJheVR5cGVzOiBhbnlcbiAgICBibG9ja0lucHV0VHlwZXM6IGFueVxuICAgIGJsb2NrVHlwZXM6IGFueVxuICAgIGZhbGxiYWNrTG9jYWxlSW5wdXRUeXBlPzogYW55XG4gICAgZ3JvdXBUeXBlczogYW55XG4gICAgbG9jYWxlSW5wdXRUeXBlPzogYW55XG4gIH1cblxuICB1bmxvY2sgPSBhc3luYyA8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXT4oXG4gICAgb3B0aW9uczogVW5sb2NrT3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgeyB1bmxvY2sgfSA9IGxvY2FsT3BlcmF0aW9ucy5hdXRoXG4gICAgcmV0dXJuIHVubG9jayh0aGlzLCBvcHRpb25zKVxuICB9XG5cbiAgdXBkYXRlR2xvYmFsID0gYXN5bmMgPFQgZXh0ZW5kcyBrZXlvZiBUR2VuZXJhdGVkVHlwZXNbJ2dsb2JhbHMnXT4oXG4gICAgb3B0aW9uczogVXBkYXRlR2xvYmFsT3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxUR2VuZXJhdGVkVHlwZXNbJ2dsb2JhbHMnXVtUXT4gPT4ge1xuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBsb2NhbEdsb2JhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gdXBkYXRlPFQ+KHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICB2YWxpZGF0aW9uUnVsZXM6IChhcmdzOiBPcGVyYXRpb25BcmdzPGFueT4pID0+IFZhbGlkYXRpb25SdWxlW11cblxuICB2ZXJpZnlFbWFpbCA9IGFzeW5jIDxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgICBvcHRpb25zOiBWZXJpZnlFbWFpbE9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IHsgdmVyaWZ5RW1haWwgfSA9IGxvY2FsT3BlcmF0aW9ucy5hdXRoXG4gICAgcmV0dXJuIHZlcmlmeUVtYWlsKHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICB2ZXJzaW9uczoge1xuICAgIFtzbHVnOiBzdHJpbmddOiBhbnkgLy8gVE9ETzogVHlwZSB0aGlzXG4gIH0gPSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gZGVsZXRlIG9uZSBvciBtb3JlIGRvY3VtZW50c1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVcGRhdGVkIGRvY3VtZW50KHMpXG4gICAqL1xuICBkZWxldGU8VCBleHRlbmRzIGtleW9mIFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXT4oXG4gICAgb3B0aW9uczogRGVsZXRlQnlJRE9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8VEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddW1RdPlxuXG4gIGRlbGV0ZTxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgICBvcHRpb25zOiBEZWxldGVNYW55T3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+PlxuXG4gIGRlbGV0ZTxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgICBvcHRpb25zOiBEZWxldGVPcHRpb25zPFQ+LFxuICApOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25SZXN1bHQ8VD4gfCBUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVF0+IHtcbiAgICBjb25zdCB7IGRlbGV0ZUxvY2FsIH0gPSBsb2NhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gZGVsZXRlTG9jYWw8VD4odGhpcywgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgUGF5bG9hZFxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgaW5pdChvcHRpb25zOiBJbml0T3B0aW9ucyk6IFByb21pc2U8UGF5bG9hZD4ge1xuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIG9wdGlvbnMubG9nZ2VyID8/IExvZ2dlcigncGF5bG9hZCcsIG9wdGlvbnMubG9nZ2VyT3B0aW9ucywgb3B0aW9ucy5sb2dnZXJEZXN0aW5hdGlvbilcblxuICAgIGlmICghb3B0aW9ucy5zZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3I6IG1pc3Npbmcgc2VjcmV0IGtleS4gQSBzZWNyZXQga2V5IGlzIG5lZWRlZCB0byBzZWN1cmUgUGF5bG9hZC4nKVxuICAgIH1cblxuICAgIHRoaXMuc2VjcmV0ID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShvcHRpb25zLnNlY3JldCkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAzMilcblxuICAgIHRoaXMubG9jYWwgPSBvcHRpb25zLmxvY2FsXG5cbiAgICBpZiAob3B0aW9ucy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gYXdhaXQgb3B0aW9ucy5jb25maWdcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kQ29uZmlnKClcblxuICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICBwYXRoczoge1xuICAgICAgICAgIGNvbmZpZzogY29uZmlnUGF0aCxcbiAgICAgICAgICBjb25maWdEaXI6IHBhdGguZGlybmFtZShjb25maWdQYXRoKSxcbiAgICAgICAgICByYXdDb25maWc6IGNvbmZpZ1BhdGgsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLCBnbG9iYWwtcmVxdWlyZVxuICAgICAgY29uc3QgbG9hZENvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnL2xvYWQnKS5kZWZhdWx0XG4gICAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5sb2dnZXIpXG4gICAgfVxuXG4gICAgdGhpcy5nbG9iYWxzID0ge1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZy5nbG9iYWxzLFxuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5jb2xsZWN0aW9ucy5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb25zW2NvbGxlY3Rpb24uc2x1Z10gPSB7XG4gICAgICAgIGNvbmZpZzogY29sbGVjdGlvbixcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5kYiA9IHRoaXMuY29uZmlnLmRiKHsgcGF5bG9hZDogdGhpcyB9KVxuICAgIHRoaXMuZGIucGF5bG9hZCA9IHRoaXNcblxuICAgIGlmICh0aGlzLmRiPy5pbml0KSB7XG4gICAgICBhd2FpdCB0aGlzLmRiLmluaXQodGhpcylcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuZGlzYWJsZURCQ29ubmVjdCAmJiB0aGlzLmRiLmNvbm5lY3QpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGIuY29ubmVjdCh0aGlzKVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ1N0YXJ0aW5nIFBheWxvYWQuLi4nKVxuXG4gICAgLy8gQ29uZmlndXJlIGVtYWlsIHNlcnZpY2VcbiAgICBjb25zdCBlbWFpbE9wdGlvbnMgPSBvcHRpb25zLmVtYWlsID8geyAuLi5vcHRpb25zLmVtYWlsIH0gOiB0aGlzLmNvbmZpZy5lbWFpbFxuICAgIGlmIChvcHRpb25zLmVtYWlsICYmIHRoaXMuY29uZmlnLmVtYWlsKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAnRW1haWwgb3B0aW9ucyBwcm92aWRlZCBpbiBib3RoIGluaXQgb3B0aW9ucyBhbmQgY29uZmlnLiBVc2luZyBpbml0IG9wdGlvbnMuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmVtYWlsT3B0aW9ucyA9IGVtYWlsT3B0aW9ucyA/PyBlbWFpbERlZmF1bHRzXG4gICAgdGhpcy5lbWFpbCA9IGJ1aWxkRW1haWwodGhpcy5lbWFpbE9wdGlvbnMsIHRoaXMubG9nZ2VyKVxuICAgIHRoaXMuc2VuZEVtYWlsID0gc2VuZEVtYWlsLmJpbmQodGhpcylcblxuICAgIGlmICghdGhpcy5jb25maWcuZ3JhcGhRTC5kaXNhYmxlKSB7XG4gICAgICByZWdpc3RlckdyYXBoUUxTY2hlbWEodGhpcylcbiAgICB9XG5cbiAgICBzZXJ2ZXJJbml0VGVsZW1ldHJ5KHRoaXMpXG5cbiAgICBpZiAoIW9wdGlvbnMuZGlzYWJsZU9uSW5pdCkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uSW5pdCA9PT0gJ2Z1bmN0aW9uJykgYXdhaXQgb3B0aW9ucy5vbkluaXQodGhpcylcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcub25Jbml0ID09PSAnZnVuY3Rpb24nKSBhd2FpdCB0aGlzLmNvbmZpZy5vbkluaXQodGhpcylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdXBkYXRlPFQgZXh0ZW5kcyBrZXlvZiBUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ10+KFxuICAgIG9wdGlvbnM6IFVwZGF0ZU1hbnlPcHRpb25zPFQ+LFxuICApOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25SZXN1bHQ8VD4+XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgb25lIG9yIG1vcmUgZG9jdW1lbnRzXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIFVwZGF0ZWQgZG9jdW1lbnQocylcbiAgICovXG4gIHVwZGF0ZTxUIGV4dGVuZHMga2V5b2YgVEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgICBvcHRpb25zOiBVcGRhdGVCeUlET3B0aW9uczxUPixcbiAgKTogUHJvbWlzZTxUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVF0+XG5cbiAgdXBkYXRlPFQgZXh0ZW5kcyBrZXlvZiBUR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ10+KFxuICAgIG9wdGlvbnM6IFVwZGF0ZU9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8QnVsa09wZXJhdGlvblJlc3VsdDxUPiB8IFRHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXVtUXT4ge1xuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBsb2NhbE9wZXJhdGlvbnNcbiAgICByZXR1cm4gdXBkYXRlPFQ+KHRoaXMsIG9wdGlvbnMpXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUGF5bG9hZCA9IEJhc2VQYXlsb2FkPEdlbmVyYXRlZFR5cGVzPlxuXG5sZXQgY2FjaGVkID0gZ2xvYmFsLl9wYXlsb2FkXG5cbmlmICghY2FjaGVkKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tdWx0aS1hc3NpZ25cbiAgY2FjaGVkID0gZ2xvYmFsLl9wYXlsb2FkID0geyBwYXlsb2FkOiBudWxsLCBwcm9taXNlOiBudWxsIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFBheWxvYWQgPSBhc3luYyAob3B0aW9uczogSW5pdE9wdGlvbnMpOiBQcm9taXNlPFBheWxvYWQ+ID0+IHtcbiAgaWYgKGNhY2hlZC5wYXlsb2FkKSB7XG4gICAgcmV0dXJuIGNhY2hlZC5wYXlsb2FkXG4gIH1cblxuICBpZiAoIWNhY2hlZC5wcm9taXNlKSB7XG4gICAgY2FjaGVkLnByb21pc2UgPSBuZXcgQmFzZVBheWxvYWQ8R2VuZXJhdGVkVHlwZXM+KCkuaW5pdChvcHRpb25zKVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjYWNoZWQucGF5bG9hZCA9IGF3YWl0IGNhY2hlZC5wcm9taXNlXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYWNoZWQucHJvbWlzZSA9IG51bGxcbiAgICB0aHJvdyBlXG4gIH1cblxuICByZXR1cm4gY2FjaGVkLnBheWxvYWRcbn1cbiJdLCJuYW1lcyI6WyJCYXNlUGF5bG9hZCIsImdldFBheWxvYWQiLCJNdXRhdGlvbiIsIm5hbWUiLCJmaWVsZHMiLCJRdWVyeSIsImF1dGhlbnRpY2F0ZSIsImNvbGxlY3Rpb25zIiwiY29uZmlnIiwiY291bnQiLCJvcHRpb25zIiwibG9jYWxPcGVyYXRpb25zIiwiY3JlYXRlIiwiZGIiLCJkZWNyeXB0IiwiZW1haWwiLCJlbWFpbE9wdGlvbnMiLCJlbmNyeXB0IiwiZXJyb3JIYW5kbGVyIiwiZXhwcmVzcyIsImV4dGVuc2lvbnMiLCJmaW5kIiwiZmluZEJ5SUQiLCJmaW5kR2xvYmFsIiwiZmluZE9uZSIsImxvY2FsR2xvYmFsT3BlcmF0aW9ucyIsImZpbmRHbG9iYWxWZXJzaW9uQnlJRCIsImZpbmRWZXJzaW9uQnlJRCIsImZpbmRHbG9iYWxWZXJzaW9ucyIsImZpbmRWZXJzaW9ucyIsImZvcmdvdFBhc3N3b3JkIiwiYXV0aCIsImdldEFQSVVSTCIsInNlcnZlclVSTCIsInJvdXRlcyIsImFwaSIsImdldEFkbWluVVJMIiwiYWRtaW4iLCJnbG9iYWxzIiwibG9jYWwiLCJsb2dnZXIiLCJsb2dpbiIsInJlc2V0UGFzc3dvcmQiLCJyZXN0b3JlR2xvYmFsVmVyc2lvbiIsInJlc3RvcmVWZXJzaW9uIiwicm91dGVyIiwic2NoZW1hIiwic2VjcmV0Iiwic2VuZEVtYWlsIiwidHlwZXMiLCJ1bmxvY2siLCJ1cGRhdGVHbG9iYWwiLCJ1cGRhdGUiLCJ2YWxpZGF0aW9uUnVsZXMiLCJ2ZXJpZnlFbWFpbCIsInZlcnNpb25zIiwiZGVsZXRlIiwiZGVsZXRlTG9jYWwiLCJpbml0IiwiTG9nZ2VyIiwibG9nZ2VyT3B0aW9ucyIsImxvZ2dlckRlc3RpbmF0aW9uIiwiRXJyb3IiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiZGlnZXN0Iiwic2xpY2UiLCJjb25maWdQYXRoIiwiZmluZENvbmZpZyIsInBhdGhzIiwiY29uZmlnRGlyIiwicGF0aCIsImRpcm5hbWUiLCJyYXdDb25maWciLCJsb2FkQ29uZmlnIiwicmVxdWlyZSIsImRlZmF1bHQiLCJmb3JFYWNoIiwiY29sbGVjdGlvbiIsInNsdWciLCJwYXlsb2FkIiwiZGlzYWJsZURCQ29ubmVjdCIsImNvbm5lY3QiLCJpbmZvIiwid2FybiIsImVtYWlsRGVmYXVsdHMiLCJidWlsZEVtYWlsIiwiYmluZCIsImdyYXBoUUwiLCJkaXNhYmxlIiwicmVnaXN0ZXJHcmFwaFFMU2NoZW1hIiwic2VydmVySW5pdFRlbGVtZXRyeSIsImRpc2FibGVPbkluaXQiLCJvbkluaXQiLCJjYWNoZWQiLCJnbG9iYWwiLCJfcGF5bG9hZCIsInByb21pc2UiLCJlIl0sInJhbmdlTWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBZ0VhQSxXQUFXO2VBQVhBOztJQWdYQUMsVUFBVTtlQUFWQTs7OytEQXphTTs2REFDRjt5QkEwQ2dCOzhEQUNMOzZEQUNMOzhEQUNBOzBCQUNtQjtrRUFDcEI7K0RBQ1k7dUVBQ0E7K0RBQ2Y7NEJBQytCOzs7Ozs7QUFLM0MsTUFBTUQ7SUFDWEUsV0FBNkQ7UUFBRUMsTUFBTTtRQUFZQyxRQUFRLENBQUM7SUFBRSxFQUFDO0lBRTdGQyxRQUEwRDtRQUFFRixNQUFNO1FBQVNDLFFBQVEsQ0FBQztJQUFFLEVBQUM7SUFFdkZFLGFBQWlDO0lBRWpDQyxjQUVJLENBQUMsRUFBQztJQUVOQyxPQUF1QjtJQUV2Qjs7OztHQUlDLEdBQ0RDLFFBQVEsT0FDTkM7UUFFQSxNQUFNLEVBQUVELEtBQUssRUFBRSxHQUFHRSxjQUFlO1FBQ2pDLE9BQU9GLE1BQU0sSUFBSSxFQUFFQztJQUNyQixFQUFDO0lBRUQ7Ozs7R0FJQyxHQUNE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