UNPKG

matrix-react-sdk

Version:
168 lines (161 loc) 29.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.initSentry = initSentry; exports.sendSentryReport = sendSentryReport; exports.setSentryUser = setSentryUser; var Sentry = _interopRequireWildcard(require("@sentry/browser")); var _SdkConfig = _interopRequireDefault(require("./SdkConfig")); var _MatrixClientPeg = require("./MatrixClientPeg"); var _SettingsStore = _interopRequireDefault(require("./settings/SettingsStore")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* Copyright 2024 New Vector Ltd. Copyright 2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ /* eslint-disable camelcase */ /* eslint-enable camelcase */ async function getStorageContext() { const result = {}; // add storage persistence/quota information if (navigator.storage && navigator.storage.persisted) { try { result["storageManager_persisted"] = String(await navigator.storage.persisted()); } catch (e) {} } else if (document.hasStorageAccess) { // Safari try { result["storageManager_persisted"] = String(await document.hasStorageAccess()); } catch (e) {} } if (navigator.storage && navigator.storage.estimate) { try { const estimate = await navigator.storage.estimate(); result["storageManager_quota"] = String(estimate.quota); result["storageManager_usage"] = String(estimate.usage); if (estimate.usageDetails) { const usageDetails = []; Object.keys(estimate.usageDetails).forEach(k => { usageDetails.push(`${k}: ${String(estimate.usageDetails[k])}`); }); result[`storageManager_usage`] = usageDetails.join(", "); } } catch (e) {} } return result; } function getUserContext(client) { return { username: client.credentials.userId, enabled_labs: getEnabledLabs(), low_bandwidth: _SettingsStore.default.getValue("lowBandwidth") ? "enabled" : "disabled" }; } function getEnabledLabs() { const enabledLabs = _SettingsStore.default.getFeatureSettingNames().filter(f => _SettingsStore.default.getValue(f)); if (enabledLabs.length) { return enabledLabs.join(", "); } return ""; } async function getCryptoContext(client) { const cryptoApi = client.getCrypto(); if (!cryptoApi) { return {}; } const ownDeviceKeys = await cryptoApi.getOwnDeviceKeys(); const keys = [`curve25519:${ownDeviceKeys.curve25519}`, `ed25519:${ownDeviceKeys.ed25519}`]; const crossSigningStatus = await cryptoApi.getCrossSigningStatus(); const secretStorage = client.secretStorage; const sessionBackupKeyFromCache = await cryptoApi.getSessionBackupPrivateKey(); return { crypto_version: cryptoApi.getVersion(), device_keys: keys.join(", "), cross_signing_ready: String(await cryptoApi.isCrossSigningReady()), cross_signing_key: (await cryptoApi.getCrossSigningKeyId()) ?? undefined, cross_signing_privkey_in_secret_storage: String(crossSigningStatus.privateKeysInSecretStorage), cross_signing_master_privkey_cached: String(crossSigningStatus.privateKeysCachedLocally.masterKey), cross_signing_user_signing_privkey_cached: String(crossSigningStatus.privateKeysCachedLocally.userSigningKey), secret_storage_ready: String(await cryptoApi.isSecretStorageReady()), secret_storage_key_in_account: String(await secretStorage.hasKey()), session_backup_key_in_secret_storage: String(!!(await client.isKeyBackupKeyStored())), session_backup_key_cached: String(!!sessionBackupKeyFromCache), session_backup_key_well_formed: String(sessionBackupKeyFromCache instanceof Uint8Array) }; } function getDeviceContext(client) { const result = { device_id: client?.deviceId ?? undefined, mx_local_settings: localStorage.getItem("mx_local_settings") }; if (window.Modernizr) { const missingFeatures = Object.keys(window.Modernizr).filter(key => window.Modernizr[key] === false); if (missingFeatures.length > 0) { result["modernizr_missing_features"] = missingFeatures.join(", "); } } return result; } async function getContexts() { const client = _MatrixClientPeg.MatrixClientPeg.safeGet(); return { user: getUserContext(client), crypto: await getCryptoContext(client), device: getDeviceContext(client), storage: await getStorageContext() }; } async function sendSentryReport(userText, issueUrl, error) { const sentryConfig = _SdkConfig.default.getObject("sentry"); if (!sentryConfig) return; const captureContext = { contexts: await getContexts(), extra: { user_text: userText, issue_url: issueUrl } }; // If there's no error and no issueUrl, the report will just produce non-grouped noise in Sentry, so don't // upload it if (error) { Sentry.captureException(error, captureContext); } else if (issueUrl) { Sentry.captureMessage(`Issue: ${issueUrl}`, captureContext); } } function setSentryUser(mxid) { if (!_SdkConfig.default.get().sentry || !_SettingsStore.default.getValue("automaticErrorReporting")) return; Sentry.setUser({ username: mxid }); } async function initSentry(sentryConfig) { if (!sentryConfig) return; // Only enable Integrations.GlobalHandlers, which hooks uncaught exceptions, if automaticErrorReporting is true const integrations = [Sentry.inboundFiltersIntegration(), Sentry.functionToStringIntegration(), Sentry.breadcrumbsIntegration(), Sentry.httpContextIntegration(), Sentry.dedupeIntegration()]; if (_SettingsStore.default.getValue("automaticErrorReporting")) { integrations.push(Sentry.globalHandlersIntegration({ onerror: false, onunhandledrejection: true })); integrations.push(Sentry.browserApiErrorsIntegration()); } Sentry.init({ dsn: sentryConfig.dsn, release: process.env.VERSION, environment: sentryConfig.environment, defaultIntegrations: false, autoSessionTracking: false, integrations, // Set to 1.0 which is reasonable if we're only submitting Rageshakes; will need to be set < 1.0 // if we collect more frequently. tracesSampleRate: 1.0 }); } window.mxSendSentryReport = sendSentryReport; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTZW50cnkiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfU2RrQ29uZmlnIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9NYXRyaXhDbGllbnRQZWciLCJfU2V0dGluZ3NTdG9yZSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImdldFN0b3JhZ2VDb250ZXh0IiwicmVzdWx0IiwibmF2aWdhdG9yIiwic3RvcmFnZSIsInBlcnNpc3RlZCIsIlN0cmluZyIsImRvY3VtZW50IiwiaGFzU3RvcmFnZUFjY2VzcyIsImVzdGltYXRlIiwicXVvdGEiLCJ1c2FnZSIsInVzYWdlRGV0YWlscyIsImtleXMiLCJmb3JFYWNoIiwiayIsInB1c2giLCJqb2luIiwiZ2V0VXNlckNvbnRleHQiLCJjbGllbnQiLCJ1c2VybmFtZSIsImNyZWRlbnRpYWxzIiwidXNlcklkIiwiZW5hYmxlZF9sYWJzIiwiZ2V0RW5hYmxlZExhYnMiLCJsb3dfYmFuZHdpZHRoIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiZW5hYmxlZExhYnMiLCJnZXRGZWF0dXJlU2V0dGluZ05hbWVzIiwiZmlsdGVyIiwiZiIsImxlbmd0aCIsImdldENyeXB0b0NvbnRleHQiLCJjcnlwdG9BcGkiLCJnZXRDcnlwdG8iLCJvd25EZXZpY2VLZXlzIiwiZ2V0T3duRGV2aWNlS2V5cyIsImN1cnZlMjU1MTkiLCJlZDI1NTE5IiwiY3Jvc3NTaWduaW5nU3RhdHVzIiwiZ2V0Q3Jvc3NTaWduaW5nU3RhdHVzIiwic2VjcmV0U3RvcmFnZSIsInNlc3Npb25CYWNrdXBLZXlGcm9tQ2FjaGUiLCJnZXRTZXNzaW9uQmFja3VwUHJpdmF0ZUtleSIsImNyeXB0b192ZXJzaW9uIiwiZ2V0VmVyc2lvbiIsImRldmljZV9rZXlzIiwiY3Jvc3Nfc2lnbmluZ19yZWFkeSIsImlzQ3Jvc3NTaWduaW5nUmVhZHkiLCJjcm9zc19zaWduaW5nX2tleSIsImdldENyb3NzU2lnbmluZ0tleUlkIiwidW5kZWZpbmVkIiwiY3Jvc3Nfc2lnbmluZ19wcml2a2V5X2luX3NlY3JldF9zdG9yYWdlIiwicHJpdmF0ZUtleXNJblNlY3JldFN0b3JhZ2UiLCJjcm9zc19zaWduaW5nX21hc3Rlcl9wcml2a2V5X2NhY2hlZCIsInByaXZhdGVLZXlzQ2FjaGVkTG9jYWxseSIsIm1hc3RlcktleSIsImNyb3NzX3NpZ25pbmdfdXNlcl9zaWduaW5nX3ByaXZrZXlfY2FjaGVkIiwidXNlclNpZ25pbmdLZXkiLCJzZWNyZXRfc3RvcmFnZV9yZWFkeSIsImlzU2VjcmV0U3RvcmFnZVJlYWR5Iiwic2VjcmV0X3N0b3JhZ2Vfa2V5X2luX2FjY291bnQiLCJoYXNLZXkiLCJzZXNzaW9uX2JhY2t1cF9rZXlfaW5fc2VjcmV0X3N0b3JhZ2UiLCJpc0tleUJhY2t1cEtleVN0b3JlZCIsInNlc3Npb25fYmFja3VwX2tleV9jYWNoZWQiLCJzZXNzaW9uX2JhY2t1cF9rZXlfd2VsbF9mb3JtZWQiLCJVaW50OEFycmF5IiwiZ2V0RGV2aWNlQ29udGV4dCIsImRldmljZV9pZCIsImRldmljZUlkIiwibXhfbG9jYWxfc2V0dGluZ3MiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwid2luZG93IiwiTW9kZXJuaXpyIiwibWlzc2luZ0ZlYXR1cmVzIiwia2V5IiwiZ2V0Q29udGV4dHMiLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0IiwidXNlciIsImNyeXB0byIsImRldmljZSIsInNlbmRTZW50cnlSZXBvcnQiLCJ1c2VyVGV4dCIsImlzc3VlVXJsIiwiZXJyb3IiLCJzZW50cnlDb25maWciLCJTZGtDb25maWciLCJnZXRPYmplY3QiLCJjYXB0dXJlQ29udGV4dCIsImNvbnRleHRzIiwiZXh0cmEiLCJ1c2VyX3RleHQiLCJpc3N1ZV91cmwiLCJjYXB0dXJlRXhjZXB0aW9uIiwiY2FwdHVyZU1lc3NhZ2UiLCJzZXRTZW50cnlVc2VyIiwibXhpZCIsInNlbnRyeSIsInNldFVzZXIiLCJpbml0U2VudHJ5IiwiaW50ZWdyYXRpb25zIiwiaW5ib3VuZEZpbHRlcnNJbnRlZ3JhdGlvbiIsImZ1bmN0aW9uVG9TdHJpbmdJbnRlZ3JhdGlvbiIsImJyZWFkY3J1bWJzSW50ZWdyYXRpb24iLCJodHRwQ29udGV4dEludGVncmF0aW9uIiwiZGVkdXBlSW50ZWdyYXRpb24iLCJnbG9iYWxIYW5kbGVyc0ludGVncmF0aW9uIiwib25lcnJvciIsIm9udW5oYW5kbGVkcmVqZWN0aW9uIiwiYnJvd3NlckFwaUVycm9yc0ludGVncmF0aW9uIiwiaW5pdCIsImRzbiIsInJlbGVhc2UiLCJwcm9jZXNzIiwiZW52IiwiVkVSU0lPTiIsImVudmlyb25tZW50IiwiZGVmYXVsdEludGVncmF0aW9ucyIsImF1dG9TZXNzaW9uVHJhY2tpbmciLCJ0cmFjZXNTYW1wbGVSYXRlIiwibXhTZW5kU2VudHJ5UmVwb3J0Il0sInNvdXJjZXMiOlsiLi4vc3JjL3NlbnRyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgKiBhcyBTZW50cnkgZnJvbSBcIkBzZW50cnkvYnJvd3NlclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgdHlwZSBJbnRlZ3JhdGlvbiB9IGZyb20gXCJAc2VudHJ5L3R5cGVzL2J1aWxkL3R5cGVzL2ludGVncmF0aW9uXCI7XG5cbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCB7IElDb25maWdPcHRpb25zIH0gZnJvbSBcIi4vSUNvbmZpZ09wdGlvbnNcIjtcblxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5cbnR5cGUgU3RvcmFnZUNvbnRleHQgPSB7XG4gICAgc3RvcmFnZU1hbmFnZXJfcGVyc2lzdGVkPzogc3RyaW5nO1xuICAgIHN0b3JhZ2VNYW5hZ2VyX3F1b3RhPzogc3RyaW5nO1xuICAgIHN0b3JhZ2VNYW5hZ2VyX3VzYWdlPzogc3RyaW5nO1xuICAgIHN0b3JhZ2VNYW5hZ2VyX3VzYWdlRGV0YWlscz86IHN0cmluZztcbn07XG5cbnR5cGUgVXNlckNvbnRleHQgPSB7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBlbmFibGVkX2xhYnM6IHN0cmluZztcbiAgICBsb3dfYmFuZHdpZHRoOiBzdHJpbmc7XG59O1xuXG50eXBlIENyeXB0b0NvbnRleHQgPSB7XG4gICAgY3J5cHRvX3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgZGV2aWNlX2tleXM/OiBzdHJpbmc7XG4gICAgY3Jvc3Nfc2lnbmluZ19yZWFkeT86IHN0cmluZztcbiAgICBjcm9zc19zaWduaW5nX3N1cHBvcnRlZF9ieV9ocz86IHN0cmluZztcbiAgICBjcm9zc19zaWduaW5nX2tleT86IHN0cmluZztcbiAgICBjcm9zc19zaWduaW5nX3ByaXZrZXlfaW5fc2VjcmV0X3N0b3JhZ2U/OiBzdHJpbmc7XG4gICAgY3Jvc3Nfc2lnbmluZ19tYXN0ZXJfcHJpdmtleV9jYWNoZWQ/OiBzdHJpbmc7XG4gICAgY3Jvc3Nfc2lnbmluZ191c2VyX3NpZ25pbmdfcHJpdmtleV9jYWNoZWQ/OiBzdHJpbmc7XG4gICAgc2VjcmV0X3N0b3JhZ2VfcmVhZHk/OiBzdHJpbmc7XG4gICAgc2VjcmV0X3N0b3JhZ2Vfa2V5X2luX2FjY291bnQ/OiBzdHJpbmc7XG4gICAgc2Vzc2lvbl9iYWNrdXBfa2V5X2luX3NlY3JldF9zdG9yYWdlPzogc3RyaW5nO1xuICAgIHNlc3Npb25fYmFja3VwX2tleV9jYWNoZWQ/OiBzdHJpbmc7XG4gICAgc2Vzc2lvbl9iYWNrdXBfa2V5X3dlbGxfZm9ybWVkPzogc3RyaW5nO1xufTtcblxudHlwZSBEZXZpY2VDb250ZXh0ID0ge1xuICAgIGRldmljZV9pZD86IHN0cmluZztcbiAgICBteF9sb2NhbF9zZXR0aW5nczogc3RyaW5nIHwgbnVsbDtcbiAgICBtb2Rlcm5penJfbWlzc2luZ19mZWF0dXJlcz86IHN0cmluZztcbn07XG5cbnR5cGUgQ29udGV4dHMgPSB7XG4gICAgdXNlcjogVXNlckNvbnRleHQ7XG4gICAgY3J5cHRvOiBDcnlwdG9Db250ZXh0O1xuICAgIGRldmljZTogRGV2aWNlQ29udGV4dDtcbiAgICBzdG9yYWdlOiBTdG9yYWdlQ29udGV4dDtcbn07XG5cbi8qIGVzbGludC1lbmFibGUgY2FtZWxjYXNlICovXG5cbmFzeW5jIGZ1bmN0aW9uIGdldFN0b3JhZ2VDb250ZXh0KCk6IFByb21pc2U8U3RvcmFnZUNvbnRleHQ+IHtcbiAgICBjb25zdCByZXN1bHQ6IFN0b3JhZ2VDb250ZXh0ID0ge307XG5cbiAgICAvLyBhZGQgc3RvcmFnZSBwZXJzaXN0ZW5jZS9xdW90YSBpbmZvcm1hdGlvblxuICAgIGlmIChuYXZpZ2F0b3Iuc3RvcmFnZSAmJiBuYXZpZ2F0b3Iuc3RvcmFnZS5wZXJzaXN0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdFtcInN0b3JhZ2VNYW5hZ2VyX3BlcnNpc3RlZFwiXSA9IFN0cmluZyhhd2FpdCBuYXZpZ2F0b3Iuc3RvcmFnZS5wZXJzaXN0ZWQoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5oYXNTdG9yYWdlQWNjZXNzKSB7XG4gICAgICAgIC8vIFNhZmFyaVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0W1wic3RvcmFnZU1hbmFnZXJfcGVyc2lzdGVkXCJdID0gU3RyaW5nKGF3YWl0IGRvY3VtZW50Lmhhc1N0b3JhZ2VBY2Nlc3MoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICAgIGlmIChuYXZpZ2F0b3Iuc3RvcmFnZSAmJiBuYXZpZ2F0b3Iuc3RvcmFnZS5lc3RpbWF0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXN0aW1hdGUgPSBhd2FpdCBuYXZpZ2F0b3Iuc3RvcmFnZS5lc3RpbWF0ZSgpO1xuICAgICAgICAgICAgcmVzdWx0W1wic3RvcmFnZU1hbmFnZXJfcXVvdGFcIl0gPSBTdHJpbmcoZXN0aW1hdGUucXVvdGEpO1xuICAgICAgICAgICAgcmVzdWx0W1wic3RvcmFnZU1hbmFnZXJfdXNhZ2VcIl0gPSBTdHJpbmcoZXN0aW1hdGUudXNhZ2UpO1xuICAgICAgICAgICAgaWYgKGVzdGltYXRlLnVzYWdlRGV0YWlscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzYWdlRGV0YWlsczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlc3RpbWF0ZS51c2FnZURldGFpbHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2VEZXRhaWxzLnB1c2goYCR7a306ICR7U3RyaW5nKGVzdGltYXRlLnVzYWdlRGV0YWlscyFba10pfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtgc3RvcmFnZU1hbmFnZXJfdXNhZ2VgXSA9IHVzYWdlRGV0YWlscy5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlckNvbnRleHQoY2xpZW50OiBNYXRyaXhDbGllbnQpOiBVc2VyQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcm5hbWU6IGNsaWVudC5jcmVkZW50aWFscy51c2VySWQhLFxuICAgICAgICBlbmFibGVkX2xhYnM6IGdldEVuYWJsZWRMYWJzKCksXG4gICAgICAgIGxvd19iYW5kd2lkdGg6IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJsb3dCYW5kd2lkdGhcIikgPyBcImVuYWJsZWRcIiA6IFwiZGlzYWJsZWRcIixcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFbmFibGVkTGFicygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuYWJsZWRMYWJzID0gU2V0dGluZ3NTdG9yZS5nZXRGZWF0dXJlU2V0dGluZ05hbWVzKCkuZmlsdGVyKChmKSA9PiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKGYpKTtcbiAgICBpZiAoZW5hYmxlZExhYnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbmFibGVkTGFicy5qb2luKFwiLCBcIik7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDcnlwdG9Db250ZXh0KGNsaWVudDogTWF0cml4Q2xpZW50KTogUHJvbWlzZTxDcnlwdG9Db250ZXh0PiB7XG4gICAgY29uc3QgY3J5cHRvQXBpID0gY2xpZW50LmdldENyeXB0bygpO1xuICAgIGlmICghY3J5cHRvQXBpKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBvd25EZXZpY2VLZXlzID0gYXdhaXQgY3J5cHRvQXBpLmdldE93bkRldmljZUtleXMoKTtcblxuICAgIGNvbnN0IGtleXMgPSBbYGN1cnZlMjU1MTk6JHtvd25EZXZpY2VLZXlzLmN1cnZlMjU1MTl9YCwgYGVkMjU1MTk6JHtvd25EZXZpY2VLZXlzLmVkMjU1MTl9YF07XG5cbiAgICBjb25zdCBjcm9zc1NpZ25pbmdTdGF0dXMgPSBhd2FpdCBjcnlwdG9BcGkuZ2V0Q3Jvc3NTaWduaW5nU3RhdHVzKCk7XG4gICAgY29uc3Qgc2VjcmV0U3RvcmFnZSA9IGNsaWVudC5zZWNyZXRTdG9yYWdlO1xuICAgIGNvbnN0IHNlc3Npb25CYWNrdXBLZXlGcm9tQ2FjaGUgPSBhd2FpdCBjcnlwdG9BcGkuZ2V0U2Vzc2lvbkJhY2t1cFByaXZhdGVLZXkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNyeXB0b192ZXJzaW9uOiBjcnlwdG9BcGkuZ2V0VmVyc2lvbigpLFxuICAgICAgICBkZXZpY2Vfa2V5czoga2V5cy5qb2luKFwiLCBcIiksXG4gICAgICAgIGNyb3NzX3NpZ25pbmdfcmVhZHk6IFN0cmluZyhhd2FpdCBjcnlwdG9BcGkuaXNDcm9zc1NpZ25pbmdSZWFkeSgpKSxcbiAgICAgICAgY3Jvc3Nfc2lnbmluZ19rZXk6IChhd2FpdCBjcnlwdG9BcGkuZ2V0Q3Jvc3NTaWduaW5nS2V5SWQoKSkgPz8gdW5kZWZpbmVkLFxuICAgICAgICBjcm9zc19zaWduaW5nX3ByaXZrZXlfaW5fc2VjcmV0X3N0b3JhZ2U6IFN0cmluZyhjcm9zc1NpZ25pbmdTdGF0dXMucHJpdmF0ZUtleXNJblNlY3JldFN0b3JhZ2UpLFxuICAgICAgICBjcm9zc19zaWduaW5nX21hc3Rlcl9wcml2a2V5X2NhY2hlZDogU3RyaW5nKGNyb3NzU2lnbmluZ1N0YXR1cy5wcml2YXRlS2V5c0NhY2hlZExvY2FsbHkubWFzdGVyS2V5KSxcbiAgICAgICAgY3Jvc3Nfc2lnbmluZ191c2VyX3NpZ25pbmdfcHJpdmtleV9jYWNoZWQ6IFN0cmluZyhjcm9zc1NpZ25pbmdTdGF0dXMucHJpdmF0ZUtleXNDYWNoZWRMb2NhbGx5LnVzZXJTaWduaW5nS2V5KSxcbiAgICAgICAgc2VjcmV0X3N0b3JhZ2VfcmVhZHk6IFN0cmluZyhhd2FpdCBjcnlwdG9BcGkuaXNTZWNyZXRTdG9yYWdlUmVhZHkoKSksXG4gICAgICAgIHNlY3JldF9zdG9yYWdlX2tleV9pbl9hY2NvdW50OiBTdHJpbmcoYXdhaXQgc2VjcmV0U3RvcmFnZS5oYXNLZXkoKSksXG4gICAgICAgIHNlc3Npb25fYmFja3VwX2tleV9pbl9zZWNyZXRfc3RvcmFnZTogU3RyaW5nKCEhKGF3YWl0IGNsaWVudC5pc0tleUJhY2t1cEtleVN0b3JlZCgpKSksXG4gICAgICAgIHNlc3Npb25fYmFja3VwX2tleV9jYWNoZWQ6IFN0cmluZyghIXNlc3Npb25CYWNrdXBLZXlGcm9tQ2FjaGUpLFxuICAgICAgICBzZXNzaW9uX2JhY2t1cF9rZXlfd2VsbF9mb3JtZWQ6IFN0cmluZyhzZXNzaW9uQmFja3VwS2V5RnJvbUNhY2hlIGluc3RhbmNlb2YgVWludDhBcnJheSksXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGV2aWNlQ29udGV4dChjbGllbnQ6IE1hdHJpeENsaWVudCk6IERldmljZUNvbnRleHQge1xuICAgIGNvbnN0IHJlc3VsdDogRGV2aWNlQ29udGV4dCA9IHtcbiAgICAgICAgZGV2aWNlX2lkOiBjbGllbnQ/LmRldmljZUlkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgbXhfbG9jYWxfc2V0dGluZ3M6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibXhfbG9jYWxfc2V0dGluZ3NcIiksXG4gICAgfTtcblxuICAgIGlmICh3aW5kb3cuTW9kZXJuaXpyKSB7XG4gICAgICAgIGNvbnN0IG1pc3NpbmdGZWF0dXJlcyA9IE9iamVjdC5rZXlzKHdpbmRvdy5Nb2Rlcm5penIpLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+IHdpbmRvdy5Nb2Rlcm5penJba2V5IGFzIGtleW9mIE1vZGVybml6clN0YXRpY10gPT09IGZhbHNlLFxuICAgICAgICApO1xuICAgICAgICBpZiAobWlzc2luZ0ZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdFtcIm1vZGVybml6cl9taXNzaW5nX2ZlYXR1cmVzXCJdID0gbWlzc2luZ0ZlYXR1cmVzLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzKCk6IFByb21pc2U8Q29udGV4dHM+IHtcbiAgICBjb25zdCBjbGllbnQgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHVzZXI6IGdldFVzZXJDb250ZXh0KGNsaWVudCksXG4gICAgICAgIGNyeXB0bzogYXdhaXQgZ2V0Q3J5cHRvQ29udGV4dChjbGllbnQpLFxuICAgICAgICBkZXZpY2U6IGdldERldmljZUNvbnRleHQoY2xpZW50KSxcbiAgICAgICAgc3RvcmFnZTogYXdhaXQgZ2V0U3RvcmFnZUNvbnRleHQoKSxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFNlbnRyeVJlcG9ydCh1c2VyVGV4dDogc3RyaW5nLCBpc3N1ZVVybDogc3RyaW5nLCBlcnJvcj86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZW50cnlDb25maWcgPSBTZGtDb25maWcuZ2V0T2JqZWN0KFwic2VudHJ5XCIpO1xuICAgIGlmICghc2VudHJ5Q29uZmlnKSByZXR1cm47XG5cbiAgICBjb25zdCBjYXB0dXJlQ29udGV4dCA9IHtcbiAgICAgICAgY29udGV4dHM6IGF3YWl0IGdldENvbnRleHRzKCksXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICB1c2VyX3RleHQ6IHVzZXJUZXh0LFxuICAgICAgICAgICAgaXNzdWVfdXJsOiBpc3N1ZVVybCxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBlcnJvciBhbmQgbm8gaXNzdWVVcmwsIHRoZSByZXBvcnQgd2lsbCBqdXN0IHByb2R1Y2Ugbm9uLWdyb3VwZWQgbm9pc2UgaW4gU2VudHJ5LCBzbyBkb24ndFxuICAgIC8vIHVwbG9hZCBpdFxuICAgIGlmIChlcnJvcikge1xuICAgICAgICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihlcnJvciwgY2FwdHVyZUNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAoaXNzdWVVcmwpIHtcbiAgICAgICAgU2VudHJ5LmNhcHR1cmVNZXNzYWdlKGBJc3N1ZTogJHtpc3N1ZVVybH1gLCBjYXB0dXJlQ29udGV4dCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2VudHJ5VXNlcihteGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIVNka0NvbmZpZy5nZXQoKS5zZW50cnkgfHwgIVNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJhdXRvbWF0aWNFcnJvclJlcG9ydGluZ1wiKSkgcmV0dXJuO1xuICAgIFNlbnRyeS5zZXRVc2VyKHsgdXNlcm5hbWU6IG14aWQgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0U2VudHJ5KHNlbnRyeUNvbmZpZzogSUNvbmZpZ09wdGlvbnNbXCJzZW50cnlcIl0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXNlbnRyeUNvbmZpZykgcmV0dXJuO1xuICAgIC8vIE9ubHkgZW5hYmxlIEludGVncmF0aW9ucy5HbG9iYWxIYW5kbGVycywgd2hpY2ggaG9va3MgdW5jYXVnaHQgZXhjZXB0aW9ucywgaWYgYXV0b21hdGljRXJyb3JSZXBvcnRpbmcgaXMgdHJ1ZVxuICAgIGNvbnN0IGludGVncmF0aW9uczogSW50ZWdyYXRpb25bXSA9IFtcbiAgICAgICAgU2VudHJ5LmluYm91bmRGaWx0ZXJzSW50ZWdyYXRpb24oKSxcbiAgICAgICAgU2VudHJ5LmZ1bmN0aW9uVG9TdHJpbmdJbnRlZ3JhdGlvbigpLFxuICAgICAgICBTZW50cnkuYnJlYWRjcnVtYnNJbnRlZ3JhdGlvbigpLFxuICAgICAgICBTZW50cnkuaHR0cENvbnRleHRJbnRlZ3JhdGlvbigpLFxuICAgICAgICBTZW50cnkuZGVkdXBlSW50ZWdyYXRpb24oKSxcbiAgICBdO1xuXG4gICAgaWYgKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJhdXRvbWF0aWNFcnJvclJlcG9ydGluZ1wiKSkge1xuICAgICAgICBpbnRlZ3JhdGlvbnMucHVzaChTZW50cnkuZ2xvYmFsSGFuZGxlcnNJbnRlZ3JhdGlvbih7IG9uZXJyb3I6IGZhbHNlLCBvbnVuaGFuZGxlZHJlamVjdGlvbjogdHJ1ZSB9KSk7XG4gICAgICAgIGludGVncmF0aW9ucy5wdXNoKFNlbnRyeS5icm93c2VyQXBpRXJyb3JzSW50ZWdyYXRpb24oKSk7XG4gICAgfVxuXG4gICAgU2VudHJ5LmluaXQoe1xuICAgICAgICBkc246IHNlbnRyeUNvbmZpZy5kc24sXG4gICAgICAgIHJlbGVhc2U6IHByb2Nlc3MuZW52LlZFUlNJT04sXG4gICAgICAgIGVudmlyb25tZW50OiBzZW50cnlDb25maWcuZW52aXJvbm1lbnQsXG4gICAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbnM6IGZhbHNlLFxuICAgICAgICBhdXRvU2Vzc2lvblRyYWNraW5nOiBmYWxzZSxcbiAgICAgICAgaW50ZWdyYXRpb25zLFxuICAgICAgICAvLyBTZXQgdG8gMS4wIHdoaWNoIGlzIHJlYXNvbmFibGUgaWYgd2UncmUgb25seSBzdWJtaXR0aW5nIFJhZ2VzaGFrZXM7IHdpbGwgbmVlZCB0byBiZSBzZXQgPCAxLjBcbiAgICAgICAgLy8gaWYgd2UgY29sbGVjdCBtb3JlIGZyZXF1ZW50bHkuXG4gICAgICAgIHRyYWNlc1NhbXBsZVJhdGU6IDEuMCxcbiAgICB9KTtcbn1cblxud2luZG93Lm14U2VuZFNlbnRyeVJlcG9ydCA9IHNlbmRTZW50cnlSZXBvcnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUlBLElBQUFDLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFBcUQsU0FBQUsseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVAsd0JBQUFPLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxDQUFBSCxPQUFBLEdBQUFMLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBZHJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQVdBOztBQTRDQTs7QUFFQSxlQUFlVyxpQkFBaUJBLENBQUEsRUFBNEI7RUFDeEQsTUFBTUMsTUFBc0IsR0FBRyxDQUFDLENBQUM7O0VBRWpDO0VBQ0EsSUFBSUMsU0FBUyxDQUFDQyxPQUFPLElBQUlELFNBQVMsQ0FBQ0MsT0FBTyxDQUFDQyxTQUFTLEVBQUU7SUFDbEQsSUFBSTtNQUNBSCxNQUFNLENBQUMsMEJBQTBCLENBQUMsR0FBR0ksTUFBTSxDQUFDLE1BQU1ILFNBQVMsQ0FBQ0MsT0FBTyxDQUFDQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxPQUFPdkIsQ0FBQyxFQUFFLENBQUM7RUFDakIsQ0FBQyxNQUFNLElBQUl5QixRQUFRLENBQUNDLGdCQUFnQixFQUFFO0lBQ2xDO0lBQ0EsSUFBSTtNQUNBTixNQUFNLENBQUMsMEJBQTBCLENBQUMsR0FBR0ksTUFBTSxDQUFDLE1BQU1DLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUMsQ0FBQyxPQUFPMUIsQ0FBQyxFQUFFLENBQUM7RUFDakI7RUFDQSxJQUFJcUIsU0FBUyxDQUFDQyxPQUFPLElBQUlELFNBQVMsQ0FBQ0MsT0FBTyxDQUFDSyxRQUFRLEVBQUU7SUFDakQsSUFBSTtNQUNBLE1BQU1BLFFBQVEsR0FBRyxNQUFNTixTQUFTLENBQUNDLE9BQU8sQ0FBQ0ssUUFBUSxDQUFDLENBQUM7TUFDbkRQLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHSSxNQUFNLENBQUNHLFFBQVEsQ0FBQ0MsS0FBSyxDQUFDO01BQ3ZEUixNQUFNLENBQUMsc0JBQXNCLENBQUMsR0FBR0ksTUFBTSxDQUFDRyxRQUFRLENBQUNFLEtBQUssQ0FBQztNQUN2RCxJQUFJRixRQUFRLENBQUNHLFlBQVksRUFBRTtRQUN2QixNQUFNQSxZQUFzQixHQUFHLEVBQUU7UUFDakNuQixNQUFNLENBQUNvQixJQUFJLENBQUNKLFFBQVEsQ0FBQ0csWUFBWSxDQUFDLENBQUNFLE9BQU8sQ0FBRUMsQ0FBQyxJQUFLO1VBQzlDSCxZQUFZLENBQUNJLElBQUksQ0FBQyxHQUFHRCxDQUFDLEtBQUtULE1BQU0sQ0FBQ0csUUFBUSxDQUFDRyxZQUFZLENBQUVHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxDQUFDLENBQUM7UUFDRmIsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQUdVLFlBQVksQ0FBQ0ssSUFBSSxDQUFDLElBQUksQ0FBQztNQUM1RDtJQUNKLENBQUMsQ0FBQyxPQUFPbkMsQ0FBQyxFQUFFLENBQUM7RUFDakI7RUFFQSxPQUFPb0IsTUFBTTtBQUNqQjtBQUVBLFNBQVNnQixjQUFjQSxDQUFDQyxNQUFvQixFQUFlO0VBQ3ZELE9BQU87SUFDSEMsUUFBUSxFQUFFRCxNQUFNLENBQUNFLFdBQVcsQ0FBQ0MsTUFBTztJQUNwQ0MsWUFBWSxFQUFFQyxjQUFjLENBQUMsQ0FBQztJQUM5QkMsYUFBYSxFQUFFQyxzQkFBYSxDQUFDQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsU0FBUyxHQUFHO0VBQ3hFLENBQUM7QUFDTDtBQUVBLFNBQVNILGNBQWNBLENBQUEsRUFBVztFQUM5QixNQUFNSSxXQUFXLEdBQUdGLHNCQUFhLENBQUNHLHNCQUFzQixDQUFDLENBQUMsQ0FBQ0MsTUFBTSxDQUFFQyxDQUFDLElBQUtMLHNCQUFhLENBQUNDLFFBQVEsQ0FBQ0ksQ0FBQyxDQUFDLENBQUM7RUFDbkcsSUFBSUgsV0FBVyxDQUFDSSxNQUFNLEVBQUU7SUFDcEIsT0FBT0osV0FBVyxDQUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ2pDO0VBQ0EsT0FBTyxFQUFFO0FBQ2I7QUFFQSxlQUFlZ0IsZ0JBQWdCQSxDQUFDZCxNQUFvQixFQUEwQjtFQUMxRSxNQUFNZSxTQUFTLEdBQUdmLE1BQU0sQ0FBQ2dCLFNBQVMsQ0FBQyxDQUFDO0VBQ3BDLElBQUksQ0FBQ0QsU0FBUyxFQUFFO0lBQ1osT0FBTyxDQUFDLENBQUM7RUFDYjtFQUVBLE1BQU1FLGFBQWEsR0FBRyxNQUFNRixTQUFTLENBQUNHLGdCQUFnQixDQUFDLENBQUM7RUFFeEQsTUFBTXhCLElBQUksR0FBRyxDQUFDLGNBQWN1QixhQUFhLENBQUNFLFVBQVUsRUFBRSxFQUFFLFdBQVdGLGFBQWEsQ0FBQ0csT0FBTyxFQUFFLENBQUM7RUFFM0YsTUFBTUMsa0JBQWtCLEdBQUcsTUFBTU4sU0FBUyxDQUFDTyxxQkFBcUIsQ0FBQyxDQUFDO0VBQ2xFLE1BQU1DLGFBQWEsR0FBR3ZCLE1BQU0sQ0FBQ3VCLGFBQWE7RUFDMUMsTUFBTUMseUJBQXlCLEdBQUcsTUFBTVQsU0FBUyxDQUFDVSwwQkFBMEIsQ0FBQyxDQUFDO0VBRTlFLE9BQU87SUFDSEMsY0FBYyxFQUFFWCxTQUFTLENBQUNZLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDQyxXQUFXLEVBQUVsQyxJQUFJLENBQUNJLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDNUIrQixtQkFBbUIsRUFBRTFDLE1BQU0sQ0FBQyxNQUFNNEIsU0FBUyxDQUFDZSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDbEVDLGlCQUFpQixFQUFFLENBQUMsTUFBTWhCLFNBQVMsQ0FBQ2lCLG9CQUFvQixDQUFDLENBQUMsS0FBS0MsU0FBUztJQUN4RUMsdUNBQXVDLEVBQUUvQyxNQUFNLENBQUNrQyxrQkFBa0IsQ0FBQ2MsMEJBQTBCLENBQUM7SUFDOUZDLG1DQUFtQyxFQUFFakQsTUFBTSxDQUFDa0Msa0JBQWtCLENBQUNnQix3QkFBd0IsQ0FBQ0MsU0FBUyxDQUFDO0lBQ2xHQyx5Q0FBeUMsRUFBRXBELE1BQU0sQ0FBQ2tDLGtCQUFrQixDQUFDZ0Isd0JBQXdCLENBQUNHLGNBQWMsQ0FBQztJQUM3R0Msb0JBQW9CLEVBQUV0RCxNQUFNLENBQUMsTUFBTTRCLFNBQVMsQ0FBQzJCLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUNwRUMsNkJBQTZCLEVBQUV4RCxNQUFNLENBQUMsTUFBTW9DLGFBQWEsQ0FBQ3FCLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkVDLG9DQUFvQyxFQUFFMUQsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNYSxNQUFNLENBQUM4QyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRkMseUJBQXlCLEVBQUU1RCxNQUFNLENBQUMsQ0FBQyxDQUFDcUMseUJBQXlCLENBQUM7SUFDOUR3Qiw4QkFBOEIsRUFBRTdELE1BQU0sQ0FBQ3FDLHlCQUF5QixZQUFZeUIsVUFBVTtFQUMxRixDQUFDO0FBQ0w7QUFFQSxTQUFTQyxnQkFBZ0JBLENBQUNsRCxNQUFvQixFQUFpQjtFQUMzRCxNQUFNakIsTUFBcUIsR0FBRztJQUMxQm9FLFNBQVMsRUFBRW5ELE1BQU0sRUFBRW9ELFFBQVEsSUFBSW5CLFNBQVM7SUFDeENvQixpQkFBaUIsRUFBRUMsWUFBWSxDQUFDQyxPQUFPLENBQUMsbUJBQW1CO0VBQy9ELENBQUM7RUFFRCxJQUFJQyxNQUFNLENBQUNDLFNBQVMsRUFBRTtJQUNsQixNQUFNQyxlQUFlLEdBQUdwRixNQUFNLENBQUNvQixJQUFJLENBQUM4RCxNQUFNLENBQUNDLFNBQVMsQ0FBQyxDQUFDOUMsTUFBTSxDQUN2RGdELEdBQUcsSUFBS0gsTUFBTSxDQUFDQyxTQUFTLENBQUNFLEdBQUcsQ0FBMEIsS0FBSyxLQUNoRSxDQUFDO0lBQ0QsSUFBSUQsZUFBZSxDQUFDN0MsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUM1QjlCLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHMkUsZUFBZSxDQUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyRTtFQUNKO0VBRUEsT0FBT2YsTUFBTTtBQUNqQjtBQUVBLGVBQWU2RSxXQUFXQSxDQUFBLEVBQXNCO0VBQzVDLE1BQU01RCxNQUFNLEdBQUc2RCxnQ0FBZSxDQUFDQyxPQUFPLENBQUMsQ0FBQztFQUN4QyxPQUFPO0lBQ0hDLElBQUksRUFBRWhFLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDO0lBQzVCZ0UsTUFBTSxFQUFFLE1BQU1sRCxnQkFBZ0IsQ0FBQ2QsTUFBTSxDQUFDO0lBQ3RDaUUsTUFBTSxFQUFFZixnQkFBZ0IsQ0FBQ2xELE1BQU0sQ0FBQztJQUNoQ2YsT0FBTyxFQUFFLE1BQU1ILGlCQUFpQixDQUFDO0VBQ3JDLENBQUM7QUFDTDtBQUVPLGVBQWVvRixnQkFBZ0JBLENBQUNDLFFBQWdCLEVBQUVDLFFBQWdCLEVBQUVDLEtBQWUsRUFBaUI7RUFDdkcsTUFBTUMsWUFBWSxHQUFHQyxrQkFBUyxDQUFDQyxTQUFTLENBQUMsUUFBUSxDQUFDO0VBQ2xELElBQUksQ0FBQ0YsWUFBWSxFQUFFO0VBRW5CLE1BQU1HLGNBQWMsR0FBRztJQUNuQkMsUUFBUSxFQUFFLE1BQU1kLFdBQVcsQ0FBQyxDQUFDO0lBQzdCZSxLQUFLLEVBQUU7TUFDSEMsU0FBUyxFQUFFVCxRQUFRO01BQ25CVSxTQUFTLEVBQUVUO0lBQ2Y7RUFDSixDQUFDOztFQUVEO0VBQ0E7RUFDQSxJQUFJQyxLQUFLLEVBQUU7SUFDUGxILE1BQU0sQ0FBQzJILGdCQUFnQixDQUFDVCxLQUFLLEVBQUVJLGNBQWMsQ0FBQztFQUNsRCxDQUFDLE1BQU0sSUFBSUwsUUFBUSxFQUFFO0lBQ2pCakgsTUFBTSxDQUFDNEgsY0FBYyxDQUFDLFVBQVVYLFFBQVEsRUFBRSxFQUFFSyxjQUFjLENBQUM7RUFDL0Q7QUFDSjtBQUVPLFNBQVNPLGFBQWFBLENBQUNDLElBQVksRUFBUTtFQUM5QyxJQUFJLENBQUNWLGtCQUFTLENBQUNyRyxHQUFHLENBQUMsQ0FBQyxDQUFDZ0gsTUFBTSxJQUFJLENBQUMzRSxzQkFBYSxDQUFDQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRTtFQUNuRnJELE1BQU0sQ0FBQ2dJLE9BQU8sQ0FBQztJQUFFbEYsUUFBUSxFQUFFZ0Y7RUFBSyxDQUFDLENBQUM7QUFDdEM7QUFFTyxlQUFlRyxVQUFVQSxDQUFDZCxZQUFzQyxFQUFpQjtFQUNwRixJQUFJLENBQUNBLFlBQVksRUFBRTtFQUNuQjtFQUNBLE1BQU1lLFlBQTJCLEdBQUcsQ0FDaENsSSxNQUFNLENBQUNtSSx5QkFBeUIsQ0FBQyxDQUFDLEVBQ2xDbkksTUFBTSxDQUFDb0ksMkJBQTJCLENBQUMsQ0FBQyxFQUNwQ3BJLE1BQU0sQ0FBQ3FJLHNCQUFzQixDQUFDLENBQUMsRUFDL0JySSxNQUFNLENBQUNzSSxzQkFBc0IsQ0FBQyxDQUFDLEVBQy9CdEksTUFBTSxDQUFDdUksaUJBQWlCLENBQUMsQ0FBQyxDQUM3QjtFQUVELElBQUluRixzQkFBYSxDQUFDQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRTtJQUNuRDZFLFlBQVksQ0FBQ3hGLElBQUksQ0FBQzFDLE1BQU0sQ0FBQ3dJLHlCQUF5QixDQUFDO01BQUVDLE9BQU8sRUFBRSxLQUFLO01BQUVDLG9CQUFvQixFQUFFO0lBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkdSLFlBQVksQ0FBQ3hGLElBQUksQ0FBQzFDLE1BQU0sQ0FBQzJJLDJCQUEyQixDQUFDLENBQUMsQ0FBQztFQUMzRDtFQUVBM0ksTUFBTSxDQUFDNEksSUFBSSxDQUFDO0lBQ1JDLEdBQUcsRUFBRTFCLFlBQVksQ0FBQzBCLEdBQUc7SUFDckJDLE9BQU8sRUFBRUMsT0FBTyxDQUFDQyxHQUFHLENBQUNDLE9BQU87SUFDNUJDLFdBQVcsRUFBRS9CLFlBQVksQ0FBQytCLFdBQVc7SUFDckNDLG1CQUFtQixFQUFFLEtBQUs7SUFDMUJDLG1CQUFtQixFQUFFLEtBQUs7SUFDMUJsQixZQUFZO0lBQ1o7SUFDQTtJQUNBbUIsZ0JBQWdCLEVBQUU7RUFDdEIsQ0FBQyxDQUFDO0FBQ047QUFFQWhELE1BQU0sQ0FBQ2lELGtCQUFrQixHQUFHdkMsZ0JBQWdCIiwiaWdub3JlTGlzdCI6W119