module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/"; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 42); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { module.exports = require("react"); /***/ }), /* 1 */ /***/ (function(module, exports) { module.exports = require("react-redux"); /***/ }), /* 2 */ /***/ (function(module, exports) { module.exports = require("winston"); /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(2); module.exports = { handleErrorResponse: function handleErrorResponse(originalUrl, ip, error, res) { logger.error('Error on ' + originalUrl, module.exports.useObjectPropertiesIfNoKeys(error)); var _module$exports$retur = module.exports.returnErrorMessageAndStatus(error), _module$exports$retur2 = _slicedToArray(_module$exports$retur, 2), status = _module$exports$retur2[0], message = _module$exports$retur2[1]; res.status(status).json(module.exports.createErrorResponsePayload(status, message)); }, returnErrorMessageAndStatus: function returnErrorMessageAndStatus(error) { var status = void 0, message = void 0; // check for daemon being turned off if (error.code === 'ECONNREFUSED') { status = 503; message = 'Connection refused. The daemon may not be running.'; // fallback for everything else } else { status = 400; if (error.message) { message = error.message; } else { message = error; }; }; return [status, message]; }, useObjectPropertiesIfNoKeys: function useObjectPropertiesIfNoKeys(err) { if (Object.keys(err).length === 0) { var newErrorObject = {}; Object.getOwnPropertyNames(err).forEach(function (key) { newErrorObject[key] = err[key]; }); return newErrorObject; } return err; }, createErrorResponsePayload: function createErrorResponsePayload(status, message) { return { status: status, success: false, message: message }; } }; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.selectFile = selectFile; exports.clearFile = clearFile; exports.updateMetadata = updateMetadata; exports.updateClaim = updateClaim; exports.setPublishInChannel = setPublishInChannel; exports.updatePublishStatus = updatePublishStatus; exports.updateError = updateError; exports.updateSelectedChannel = updateSelectedChannel; exports.toggleMetadataInputs = toggleMetadataInputs; exports.onNewThumbnail = onNewThumbnail; exports.startPublish = startPublish; var _publish_action_types = __webpack_require__(29); var actions = _interopRequireWildcard(_publish_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // export action creators function selectFile(file) { return { type: actions.FILE_SELECTED, data: file }; }; function clearFile() { return { type: actions.FILE_CLEAR }; }; function updateMetadata(name, value) { return { type: actions.METADATA_UPDATE, data: { name: name, value: value } }; }; function updateClaim(value) { return { type: actions.CLAIM_UPDATE, data: value }; }; function setPublishInChannel(channel) { return { type: actions.SET_PUBLISH_IN_CHANNEL, channel: channel }; }; function updatePublishStatus(status, message) { return { type: actions.PUBLISH_STATUS_UPDATE, data: { status: status, message: message } }; }; function updateError(name, value) { return { type: actions.ERROR_UPDATE, data: { name: name, value: value } }; }; function updateSelectedChannel(channelName) { return { type: actions.SELECTED_CHANNEL_UPDATE, data: channelName }; }; function toggleMetadataInputs(showMetadataInputs) { return { type: actions.TOGGLE_METADATA_INPUTS, data: showMetadataInputs }; }; function onNewThumbnail(file) { return { type: actions.THUMBNAIL_NEW, data: file }; }; function startPublish(history) { return { type: actions.PUBLISH_START, data: { history: history } }; } /***/ }), /* 5 */ /***/ (function(module, exports) { module.exports = require("react-router-dom"); /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function SiteConfig() { var _this = this; this.analytics = { googleId: 'default' }; this.assetDefaults = { description: 'An asset published on Spee.ch', thumbnail: 'https://spee.ch/assets/img/video_thumb_default.png', title: 'Spee.ch' }; this.auth = { sessionKey: 'default' }; this.customComponents = { components: {}, containers: {}, pages: {} }; this.details = { description: 'Open-source, decentralized image and video sharing.', host: 'default', port: 3000, title: 'Spee.ch', twitter: '@spee_ch' }; this.publishing = { additionalClaimAddresses: [], disabled: false, disabledMessage: 'Please check back soon.', primaryClaimAddress: 'default', thumbnailChannel: 'default', thumbnailChannelId: 'default', uploadDirectory: '/home/lbry/Uploads' }; this.configure = function (config) { if (!config) { return console.log('No site config received.'); } var analytics = config.analytics, assetDefaults = config.assetDefaults, auth = config.auth, customComponents = config.customComponents, details = config.details, publishing = config.publishing; _this.analytics = analytics; _this.assetDefaults = assetDefaults; _this.auth = auth; _this.details = details; _this.publishing = publishing; _this.customComponents = customComponents; }; }; module.exports = new SiteConfig(); /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _channel = __webpack_require__(22); var _publish = __webpack_require__(4); var _view = __webpack_require__(82); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, site = _ref.site; return { channelName: channel.loggedInChannel.name, channelShortId: channel.loggedInChannel.shortId, channelLongId: channel.loggedInChannel.longId, siteDescription: site.description }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onChannelLogin: function onChannelLogin(name, shortId, longId) { dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); dispatch((0, _publish.updateSelectedChannel)(name)); }, onChannelLogout: function onChannelLogout() { dispatch((0, _channel.updateLoggedInChannel)(null, null, null)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.onHandleShowPageUri = onHandleShowPageUri; exports.onRequestError = onRequestError; exports.onNewChannelRequest = onNewChannelRequest; exports.onNewAssetRequest = onNewAssetRequest; exports.onRequestUpdate = onRequestUpdate; exports.addRequestToRequestList = addRequestToRequestList; exports.addAssetToAssetList = addAssetToAssetList; exports.addNewChannelToChannelList = addNewChannelToChannelList; exports.onUpdateChannelClaims = onUpdateChannelClaims; exports.updateChannelClaims = updateChannelClaims; exports.fileRequested = fileRequested; exports.updateFileAvailability = updateFileAvailability; exports.updateDisplayAssetError = updateDisplayAssetError; var _show_action_types = __webpack_require__(15); var actions = _interopRequireWildcard(_show_action_types); var _show_request_types = __webpack_require__(37); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // basic request parsing function onHandleShowPageUri(params) { return { type: actions.HANDLE_SHOW_URI, data: params }; }; function onRequestError(error) { return { type: actions.REQUEST_ERROR, data: error }; }; function onNewChannelRequest(channelName, channelId) { var requestType = _show_request_types.CHANNEL; var requestId = 'cr#' + channelName + '#' + channelId; return { type: actions.CHANNEL_REQUEST_NEW, data: { requestType: requestType, requestId: requestId, channelName: channelName, channelId: channelId } }; }; function onNewAssetRequest(name, id, channelName, channelId, extension) { var requestType = extension ? _show_request_types.ASSET_LITE : _show_request_types.ASSET_DETAILS; var requestId = 'ar#' + name + '#' + id + '#' + channelName + '#' + channelId; return { type: actions.ASSET_REQUEST_NEW, data: { requestType: requestType, requestId: requestId, name: name, modifier: { id: id, channel: { name: channelName, id: channelId } } } }; }; function onRequestUpdate(requestType, requestId) { return { type: actions.REQUEST_UPDATE, data: { requestType: requestType, requestId: requestId } }; }; function addRequestToRequestList(id, error, key) { return { type: actions.REQUEST_LIST_ADD, data: { id: id, error: error, key: key } }; }; // asset actions function addAssetToAssetList(id, error, name, claimId, shortId, claimData) { return { type: actions.ASSET_ADD, data: { id: id, error: error, name: name, claimId: claimId, shortId: shortId, claimData: claimData } }; } // channel actions function addNewChannelToChannelList(id, name, shortId, longId, claimsData) { return { type: actions.CHANNEL_ADD, data: { id: id, name: name, shortId: shortId, longId: longId, claimsData: claimsData } }; }; function onUpdateChannelClaims(channelKey, name, longId, page) { return { type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC, data: { channelKey: channelKey, name: name, longId: longId, page: page } }; }; function updateChannelClaims(channelListId, claimsData) { return { type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS, data: { channelListId: channelListId, claimsData: claimsData } }; }; // display a file function fileRequested(name, claimId) { return { type: actions.FILE_REQUESTED, data: { name: name, claimId: claimId } }; }; function updateFileAvailability(status) { return { type: actions.FILE_AVAILABILITY_UPDATE, data: status }; }; function updateDisplayAssetError(error) { return { type: actions.DISPLAY_ASSET_ERROR, data: error }; }; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function mysql() { var _this = this; this.db = {}; this.configure = function (db) { if (!db) { return console.log('No MySQL config received.'); } // configure credentials console.log('configuring mysql...'); _this.db = db; }; }; module.exports = new mysql(); /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var ua = __webpack_require__(50); var _require = __webpack_require__(6), googleId = _require.analytics.googleId, title = _require.details.title; function createServeEventParams(headers, ip, originalUrl) { return { eventCategory: 'client requests', eventAction: 'serve request', eventLabel: originalUrl, ipOverride: ip, userAgentOverride: headers['user-agent'] }; }; function createPublishTimingEventParams(category, variable, label, startTime, endTime) { var duration = endTime - startTime; return { userTimingCategory: category, userTimingVariableName: variable, userTimingTime: duration, userTimingLabel: label }; }; function sendGoogleAnalyticsEvent(ip, params) { var visitorId = ip.replace(/\./g, '-'); var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); visitor.event(params, function (err) { if (err) { logger.error('Google Analytics Event Error >>', err); } }); }; function sendGoogleAnalyticsTiming(visitorId, params) { var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); visitor.timing(params, function (err) { if (err) { logger.error('Google Analytics Event Error >>', err); } logger.debug('Timing event successfully sent to google analytics'); }); }; module.exports = { sendGAServeEvent: function sendGAServeEvent(headers, ip, originalUrl) { var params = createServeEventParams(headers, ip, originalUrl); sendGoogleAnalyticsEvent(ip, params); }, sendGATimingEvent: function sendGATimingEvent(category, variable, label, startTime, endTime) { var params = createPublishTimingEventParams(category, variable, label, startTime, endTime); sendGoogleAnalyticsTiming(title, params); }, chooseGaLbrynetPublishLabel: function chooseGaLbrynetPublishLabel(_ref) { var channelName = _ref.channel_name, channelId = _ref.channel_id; return channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM'; } }; /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(78); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var site = _ref.site; var defaultDescription = site.defaultDescription, defaultThumbnail = site.defaultThumbnail, siteDescription = site.description, siteHost = site.host, siteTitle = site.title, siteTwitter = site.twitter; return { defaultDescription: defaultDescription, defaultThumbnail: defaultThumbnail, siteDescription: siteDescription, siteHost: siteHost, siteTitle: siteTitle, siteTwitter: siteTwitter }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 12 */ /***/ (function(module, exports) { module.exports = require("prop-types"); /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); exports.default = request; __webpack_require__(85); /** * Parses the JSON returned by a network request * * @param {object} response A response from a network request * * @return {object} The parsed JSON from the request */ function parseJSON(response) { if (response.status === 204 || response.status === 205) { return null; } return response.json(); } /** * Parses the status returned by a network request * * @param {object} response A response from a network request * @param {object} response The parsed JSON from the network request * * @return {object | undefined} Returns object with status and statusText, or undefined */ function checkStatus(response, jsonResponse) { if (response.status >= 200 && response.status < 300) { return jsonResponse; } var error = new Error(jsonResponse.message); error.response = response; throw error; } /** * Requests a URL, returning a promise * * @param {string} url The URL we want to request * @param {object} [options] The options we want to pass to "fetch" * * @return {object} The response data */ function request(url, options) { return fetch(url, options).then(function (response) { return Promise.all([response, parseJSON(response)]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), response = _ref2[0], jsonResponse = _ref2[1]; return checkStatus(response, jsonResponse); }); } /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var axios = __webpack_require__(48); var logger = __webpack_require__(2); var _require = __webpack_require__(49), _require$api = _require.api, apiHost = _require$api.apiHost, apiPort = _require$api.apiPort; var lbryApiUri = 'http://' + apiHost + ':' + apiPort; var _require2 = __webpack_require__(10), chooseGaLbrynetPublishLabel = _require2.chooseGaLbrynetPublishLabel, sendGATimingEvent = _require2.sendGATimingEvent; var handleLbrynetResponse = function handleLbrynetResponse(_ref, resolve, reject) { var data = _ref.data; logger.debug('lbry api data:', data); if (data.result) { // check for an error if (data.result.error) { logger.debug('Lbrynet api error:', data.result.error); reject(new Error(data.result.error)); return; }; resolve(data.result); return; } // fallback in case it just timed out reject(JSON.stringify(data)); }; module.exports = { publishClaim: function publishClaim(publishParams) { logger.debug('lbryApi >> Publishing claim to "' + publishParams.name + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'publish', params: publishParams }).then(function (response) { sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, getClaim: function getClaim(uri) { logger.debug('lbryApi >> Getting Claim for "' + uri + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'get', params: { uri: uri, timeout: 20 } }).then(function (response) { sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, getClaimList: function getClaimList(claimName) { logger.debug('lbryApi >> Getting claim_list for "' + claimName + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'claim_list', params: { name: claimName } }).then(function (response) { sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, resolveUri: function resolveUri(uri) { logger.debug('lbryApi >> Resolving URI for "' + uri + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'resolve', params: { uri: uri } }).then(function (_ref2) { var data = _ref2.data; sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now()); if (data.result[uri].error) { // check for errors reject(data.result[uri].error); } else { // if no errors, resolve resolve(data.result[uri]); } }).catch(function (error) { reject(error); }); }); }, getDownloadDirectory: function getDownloadDirectory() { logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'settings_get' }).then(function (_ref3) { var data = _ref3.data; sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now()); if (data.result) { resolve(data.result.download_directory); } else { return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.'); } }).catch(function (error) { logger.error('Lbrynet Error:', error); resolve('/home/lbry/Downloads/'); }); }); }, createChannel: function createChannel(name) { logger.debug('lbryApi >> Creating channel for ' + name + '...'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'channel_new', params: { channel_name: name, amount: 0.1 } }).then(function (response) { sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); } }; /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // request actions var HANDLE_SHOW_URI = exports.HANDLE_SHOW_URI = 'HANDLE_SHOW_URI'; var REQUEST_ERROR = exports.REQUEST_ERROR = 'REQUEST_ERROR'; var REQUEST_UPDATE = exports.REQUEST_UPDATE = 'REQUEST_UPDATE'; var ASSET_REQUEST_NEW = exports.ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW'; var CHANNEL_REQUEST_NEW = exports.CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW'; var REQUEST_LIST_ADD = exports.REQUEST_LIST_ADD = 'REQUEST_LIST_ADD'; // asset actions var ASSET_ADD = exports.ASSET_ADD = 'ASSET_ADD'; // channel actions var CHANNEL_ADD = exports.CHANNEL_ADD = 'CHANNEL_ADD'; var CHANNEL_CLAIMS_UPDATE_ASYNC = exports.CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC'; var CHANNEL_CLAIMS_UPDATE_SUCCESS = exports.CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS'; // asset/file display actions var FILE_REQUESTED = exports.FILE_REQUESTED = 'FILE_REQUESTED'; var FILE_AVAILABILITY_UPDATE = exports.FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE'; var DISPLAY_ASSET_ERROR = exports.DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR'; /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var selectAsset = exports.selectAsset = function selectAsset(show) { var request = show.requestList[show.request.id]; var assetKey = request.key; return show.assetList[assetKey]; }; var selectShowState = exports.selectShowState = function selectShowState(state) { return state.show; }; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _require = __webpack_require__(9), db = _require.db; var logger = __webpack_require__(2); var _require2 = __webpack_require__(54), returnPaginatedChannelClaims = _require2.returnPaginatedChannelClaims; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; var NO_FILE = 'NO_FILE'; module.exports = { getClaimId: function getClaimId(channelName, channelClaimId, name, claimId) { if (channelName) { return module.exports.getClaimIdByChannel(channelName, channelClaimId, name); } else { return module.exports.getClaimIdByClaim(name, claimId); } }, getClaimIdByClaim: function getClaimIdByClaim(claimName, claimId) { logger.debug('getClaimIdByClaim(' + claimName + ', ' + claimId + ')'); return new Promise(function (resolve, reject) { db.Claim.getLongClaimId(claimName, claimId).then(function (longClaimId) { if (!longClaimId) { resolve(NO_CLAIM); } resolve(longClaimId); }).catch(function (error) { reject(error); }); }); }, getClaimIdByChannel: function getClaimIdByChannel(channelName, channelClaimId, claimName) { logger.debug('getClaimIdByChannel(' + channelName + ', ' + channelClaimId + ', ' + claimName + ')'); return new Promise(function (resolve, reject) { db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id .then(function (longChannelId) { if (!longChannelId) { return [null, null]; } return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), longChannelId = _ref2[0], longClaimId = _ref2[1]; if (!longChannelId) { return resolve(NO_CHANNEL); } if (!longClaimId) { return resolve(NO_CLAIM); } resolve(longClaimId); }).catch(function (error) { reject(error); }); }); }, getChannelData: function getChannelData(channelName, channelClaimId, page) { return new Promise(function (resolve, reject) { // 1. get the long channel Id (make sure channel exists) db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { if (!longChannelClaimId) { return [null, null, null]; } // 2. get the short ID and all claims for that channel return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]); }).then(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), longChannelClaimId = _ref4[0], shortChannelClaimId = _ref4[1]; if (!longChannelClaimId) { return resolve(NO_CHANNEL); } // 3. return all the channel information resolve({ channelName: channelName, longChannelClaimId: longChannelClaimId, shortChannelClaimId: shortChannelClaimId }); }).catch(function (error) { reject(error); }); }); }, getChannelClaims: function getChannelClaims(channelName, channelClaimId, page) { return new Promise(function (resolve, reject) { // 1. get the long channel Id (make sure channel exists) db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { if (!longChannelClaimId) { return [null, null, null]; } // 2. get the short ID and all claims for that channel return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]); }).then(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), longChannelClaimId = _ref6[0], channelClaimsArray = _ref6[1]; if (!longChannelClaimId) { return resolve(NO_CHANNEL); } // 3. format the data for the view, including pagination var paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page); // 4. return all the channel information and contents resolve(paginatedChannelViewData); }).catch(function (error) { reject(error); }); }); }, getLocalFileRecord: function getLocalFileRecord(claimId, name) { return db.File.findOne({ where: { claimId: claimId, name: name } }).then(function (file) { if (!file) { return NO_FILE; } return file.dataValues; }); } }; /***/ }), /* 18 */ /***/ (function(module, exports) { module.exports = require("redux-saga/effects"); /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var logger = __webpack_require__(2); var _require = __webpack_require__(9), db = _require.db; var lbryApi = __webpack_require__(14); var publishHelpers = __webpack_require__(20); var _require2 = __webpack_require__(6), _require2$publishing = _require2.publishing, primaryClaimAddress = _require2$publishing.primaryClaimAddress, additionalClaimAddresses = _require2$publishing.additionalClaimAddresses; var Sequelize = __webpack_require__(52); var Op = Sequelize.Op; module.exports = { publish: function publish(publishParams, fileName, fileType) { return new Promise(function (resolve, reject) { var publishResults = void 0, certificateId = void 0, channelName = void 0; // publish the file return lbryApi.publishClaim(publishParams).then(function (tx) { logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx); publishResults = tx; // get the channel information if (publishParams.channel_name) { logger.debug('this claim was published in channel: ' + publishParams.channel_name); return db.Channel.findOne({ where: { channelName: publishParams.channel_name } }); } else { logger.debug('this claim was not published in a channel'); return null; } }).then(function (channel) { // set channel information certificateId = null; channelName = null; if (channel) { certificateId = channel.channelClaimId; channelName = channel.channelName; } logger.debug('certificateId: ' + certificateId); }).then(function () { // create the File record var fileRecord = { name: publishParams.name, claimId: publishResults.claim_id, title: publishParams.metadata.title, description: publishParams.metadata.description, address: publishParams.claim_address, outpoint: publishResults.txid + ':' + publishResults.nout, height: 0, fileName: fileName, filePath: publishParams.file_path, fileType: fileType, nsfw: publishParams.metadata.nsfw }; // create the Claim record var claimRecord = { name: publishParams.name, claimId: publishResults.claim_id, title: publishParams.metadata.title, description: publishParams.metadata.description, address: publishParams.claim_address, thumbnail: publishParams.metadata.thumbnail, outpoint: publishResults.txid + ':' + publishResults.nout, height: 0, contentType: fileType, nsfw: publishParams.metadata.nsfw, amount: publishParams.bid, certificateId: certificateId, channelName: channelName }; // upsert criteria var upsertCriteria = { name: publishParams.name, claimId: publishResults.claim_id }; // upsert the records return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), file = _ref2[0], claim = _ref2[1]; logger.debug('File and Claim records successfully created'); return Promise.all([file.setClaim(claim), claim.setFile(file)]); }).then(function () { logger.debug('File and Claim records successfully associated'); resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim; }).catch(function (error) { logger.error('PUBLISH ERROR', error); publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file reject(error); }); }); }, claimNameIsAvailable: function claimNameIsAvailable(name) { var claimAddresses = additionalClaimAddresses || []; claimAddresses.push(primaryClaimAddress); // find any records where the name is used return db.Claim.findAll({ attributes: ['address'], where: { name: name, address: _defineProperty({}, Op.or, claimAddresses) } }).then(function (result) { if (result.length >= 1) { throw new Error('That claim is already in use'); }; return name; }).catch(function (error) { throw error; }); }, checkChannelAvailability: function checkChannelAvailability(name) { return db.Channel.findAll({ where: { channelName: name } }).then(function (result) { if (result.length >= 1) { throw new Error('That channel has already been claimed'); } return name; }).catch(function (error) { throw error; }); } }; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var fs = __webpack_require__(51); var _require = __webpack_require__(6), details = _require.details, publishing = _require.publishing; module.exports = { parsePublishApiRequestBody: function parsePublishApiRequestBody(_ref) { var name = _ref.name, nsfw = _ref.nsfw, license = _ref.license, title = _ref.title, description = _ref.description, thumbnail = _ref.thumbnail; // validate name if (!name) { throw new Error('no name field found in request'); } var invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name); if (invalidNameCharacters) { throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and "-"'); } // optional parameters nsfw = nsfw === 'true'; license = license || null; title = title || null; description = description || null; thumbnail = thumbnail || null; // return results return { name: name, nsfw: nsfw, license: license, title: title, description: description, thumbnail: thumbnail }; }, parsePublishApiRequestFiles: function parsePublishApiRequestFiles(_ref2) { var file = _ref2.file, thumbnail = _ref2.thumbnail; // make sure a file was provided if (!file) { throw new Error('no file with key of [file] found in request'); } if (!file.path) { throw new Error('no file path found'); } if (!file.type) { throw new Error('no file type found'); } if (!file.size) { throw new Error('no file type found'); } // validate the file name if (/'/.test(file.name)) { throw new Error('apostrophes are not allowed in the file name'); } // validate the file module.exports.validateFileTypeAndSize(file); // return results return { fileName: file.name, filePath: file.path, fileType: file.type, thumbnailFileName: thumbnail ? thumbnail.name : null, thumbnailFilePath: thumbnail ? thumbnail.path : null, thumbnailFileType: thumbnail ? thumbnail.type : null }; }, validateFileTypeAndSize: function validateFileTypeAndSize(file) { // check file type and size switch (file.type) { case 'image/jpeg': case 'image/jpg': case 'image/png': if (file.size > 10000000) { logger.debug('publish > file validation > .jpeg/.jpg/.png was too big'); throw new Error('Sorry, images are limited to 10 megabytes.'); } break; case 'image/gif': if (file.size > 50000000) { logger.debug('publish > file validation > .gif was too big'); throw new Error('Sorry, .gifs are limited to 50 megabytes.'); } break; case 'video/mp4': if (file.size > 50000000) { logger.debug('publish > file validation > .mp4 was too big'); throw new Error('Sorry, videos are limited to 50 megabytes.'); } break; default: logger.debug('publish > file validation > unrecognized file type'); throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); } return file; }, createBasicPublishParams: function createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail) { logger.debug('Creating Publish Parameters'); // provide defaults for title if (title === null || title.trim() === '') { title = name; } // provide default for description if (description === null || description.trim() === '') { description = ''; } // provide default for license if (license === null || license.trim() === '') { license = ' '; // default to empty string } // create the publish params var publishParams = { name: name, file_path: filePath, bid: 0.01, metadata: { description: description, title: title, author: details.title, language: 'en', license: license, nsfw: nsfw }, claim_address: publishing.primaryClaimAddress }; // add thumbnail to channel if video if (thumbnail) { publishParams['metadata']['thumbnail'] = thumbnail; } return publishParams; }, createThumbnailPublishParams: function createThumbnailPublishParams(thumbnailFilePath, claimName, license, nsfw) { if (!thumbnailFilePath) { return; } logger.debug('Creating Thumbnail Publish Parameters'); // create the publish params return { name: claimName + '-thumb', file_path: thumbnailFilePath, bid: 0.01, metadata: { title: claimName + ' thumbnail', description: 'a thumbnail for ' + claimName, author: details.title, language: 'en', license: license, nsfw: nsfw }, claim_address: publishing.primaryClaimAddress, channel_name: publishing.thumbnailChannel, channel_id: publishing.thumbnailChannelId }; }, deleteTemporaryFile: function deleteTemporaryFile(filePath) { fs.unlink(filePath, function (err) { if (err) { logger.error('error deleting temporary file ' + filePath); throw err; } logger.debug('successfully deleted ' + filePath); }); }, addGetResultsToFileData: function addGetResultsToFileData(fileInfo, getResult) { fileInfo.fileName = getResult.file_name; fileInfo.filePath = getResult.download_path; return fileInfo; }, createFileData: function createFileData(_ref3) { var name = _ref3.name, claimId = _ref3.claimId, outpoint = _ref3.outpoint, height = _ref3.height, address = _ref3.address, nsfw = _ref3.nsfw, contentType = _ref3.contentType; return { name: name, claimId: claimId, outpoint: outpoint, height: height, address: address, fileName: '', filePath: '', fileType: contentType, nsfw: nsfw }; } }; /***/ }), /* 21 */ /***/ (function(module, exports) { module.exports = require("react-helmet"); /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateLoggedInChannel = updateLoggedInChannel; var _channel_action_types = __webpack_require__(31); var actions = _interopRequireWildcard(_channel_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // export action creators function updateLoggedInChannel(name, shortId, longId) { return { type: actions.CHANNEL_UPDATE, data: { name: name, shortId: shortId, longId: longId } }; }; /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(12); var _propTypes2 = _interopRequireDefault(_propTypes); var _ActiveStatusBar = __webpack_require__(107); var _ActiveStatusBar2 = _interopRequireDefault(_ActiveStatusBar); var _InactiveStatusBar = __webpack_require__(108); var _InactiveStatusBar2 = _interopRequireDefault(_InactiveStatusBar); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ProgressBar = function (_React$Component) { _inherits(ProgressBar, _React$Component); function ProgressBar(props) { _classCallCheck(this, ProgressBar); var _this = _possibleConstructorReturn(this, (ProgressBar.__proto__ || Object.getPrototypeOf(ProgressBar)).call(this, props)); _this.state = { bars: [], index: 0, incrementer: 1 }; _this.createBars = _this.createBars.bind(_this); _this.startProgressBar = _this.startProgressBar.bind(_this); _this.updateProgressBar = _this.updateProgressBar.bind(_this); _this.stopProgressBar = _this.stopProgressBar.bind(_this); return _this; } _createClass(ProgressBar, [{ key: 'componentDidMount', value: function componentDidMount() { this.createBars(); this.startProgressBar(); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.stopProgressBar(); } }, { key: 'createBars', value: function createBars() { var bars = []; for (var i = 0; i <= this.props.size; i++) { bars.push({ isActive: false }); } this.setState({ bars: bars }); } }, { key: 'startProgressBar', value: function startProgressBar() { this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300); } }, { key: 'updateProgressBar', value: function updateProgressBar() { var index = this.state.index; var incrementer = this.state.incrementer; var bars = this.state.bars; // flip incrementer if necessary, to stay in bounds if (index < 0 || index > this.props.size) { incrementer = incrementer * -1; index += incrementer; } // update the indexed bar if (incrementer > 0) { bars[index].isActive = true; } else { bars[index].isActive = false; }; // increment index index += incrementer; // update state this.setState({ bars: bars, incrementer: incrementer, index: index }); } }, { key: 'stopProgressBar', value: function stopProgressBar() { clearInterval(this.updateInterval); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, this.state.bars.map(function (bar, index) { return bar.isActive ? _react2.default.createElement(_ActiveStatusBar2.default, { key: index }) : _react2.default.createElement(_InactiveStatusBar2.default, { key: index }); }) ); } }]); return ProgressBar; }(_react2.default.Component); ; ProgressBar.propTypes = { size: _propTypes2.default.number.isRequired }; exports.default = ProgressBar; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(12); var _propTypes2 = _interopRequireDefault(_propTypes); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ErrorPage = function (_React$Component) { _inherits(ErrorPage, _React$Component); function ErrorPage() { _classCallCheck(this, ErrorPage); return _possibleConstructorReturn(this, (ErrorPage.__proto__ || Object.getPrototypeOf(ErrorPage)).apply(this, arguments)); } _createClass(ErrorPage, [{ key: 'render', value: function render() { var error = this.props.error; return _react2.default.createElement( 'div', null, _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'p', null, error ) ) ); } }]); return ErrorPage; }(_react2.default.Component); ; ErrorPage.propTypes = { error: _propTypes2.default.string.isRequired }; exports.default = ErrorPage; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var _require = __webpack_require__(17), getClaimId = _require.getClaimId, getLocalFileRecord = _require.getLocalFileRecord; var _require2 = __webpack_require__(3), handleErrorResponse = _require2.handleErrorResponse; var SERVE = 'SERVE'; var SHOW = 'SHOW'; var NO_FILE = 'NO_FILE'; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; function clientAcceptsHtml(_ref) { var accept = _ref.accept; return accept && accept.match(/text\/html/); }; function requestIsFromBrowser(headers) { return headers['user-agent'] && headers['user-agent'].match(/Mozilla/); }; function clientWantsAsset(_ref2) { var accept = _ref2.accept, range = _ref2.range; var imageIsWanted = accept && accept.match(/image\/.*/) && !accept.match(/text\/html/) && !accept.match(/text\/\*/); var videoIsWanted = accept && range; return imageIsWanted || videoIsWanted; }; function isValidClaimId(claimId) { return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId); }; function isValidShortId(claimId) { return claimId.length === 1; // it should really evaluate the short url itself }; function isValidShortIdOrClaimId(input) { return isValidClaimId(input) || isValidShortId(input); }; function serveAssetToClient(claimId, name, res) { return getLocalFileRecord(claimId, name).then(function (fileRecord) { // check that a local record was found if (fileRecord === NO_FILE) { return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId); } // serve the file var filePath = fileRecord.filePath, fileType = fileRecord.fileType; logger.verbose('serving file: ' + filePath); var sendFileOptions = { headers: { 'X-Content-Type-Options': 'nosniff', 'Content-Type': fileType || 'image/jpeg' } }; res.status(200).sendFile(filePath, sendFileOptions); }).catch(function (error) { throw error; }); }; module.exports = { getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) { // get the claim Id and then serve the asset getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) { if (fullClaimId === NO_CLAIM) { return res.status(404).json({ success: false, message: 'no claim id could be found' }); } else if (fullClaimId === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'no channel id could be found' }); } serveAssetToClient(fullClaimId, claimName, res); // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success'); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail'); }); }, determineResponseType: function determineResponseType(hasFileExtension, headers) { var responseType = void 0; if (hasFileExtension) { responseType = SERVE; // assume a serve request if file extension is present if (clientAcceptsHtml(headers)) { // if the request comes from a browser, change it to a show request responseType = SHOW; } } else { responseType = SHOW; if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) { // this is in case someone embeds a show url logger.debug('Show request came from browser but wants an image/video. Changing response to serve...'); responseType = SERVE; } } return responseType; }, flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) { // this is a patch for backwards compatability with '/name/claim_id' url format if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) { var tempName = name; name = identifier; identifier = tempName; } return [identifier, name]; }, logRequestData: function logRequestData(responseType, claimName, channelName, claimId) { logger.debug('responseType ===', responseType); logger.debug('claim name === ', claimName); logger.debug('channel name ===', channelName); logger.debug('claim id ===', claimId); } }; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(2); module.exports = { REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, CHANNEL_CHAR: '@', parseIdentifier: function parseIdentifier(identifier) { logger.debug('parsing identifier:', identifier); var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) { return match || null; }), _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), proto = _componentsRegex$exec2[0], value = _componentsRegex$exec2[1], modifierSeperator = _componentsRegex$exec2[2], modifier = _componentsRegex$exec2[3]; logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier); // Validate and process name if (!value) { throw new Error('Check your url. No channel name provided before "' + modifierSeperator + '"'); } var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); var channelName = isChannel ? value : null; var claimId = void 0; if (isChannel) { if (!channelName) { throw new Error('No channel name after @.'); } var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); if (nameBadChars) { throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.'); } } else { claimId = value; } // Validate and process modifier var channelClaimId = void 0; if (modifierSeperator) { if (!modifier) { throw new Error('No modifier provided after separator "' + modifierSeperator + '"'); } if (modifierSeperator === ':') { channelClaimId = modifier; } else { throw new Error('The "' + modifierSeperator + '" modifier is not currently supported'); } } return { isChannel: isChannel, channelName: channelName, channelClaimId: channelClaimId, claimId: claimId }; }, parseClaim: function parseClaim(claim) { logger.debug('parsing name:', claim); var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) { return match || null; }), _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), proto = _componentsRegex$exec4[0], claimName = _componentsRegex$exec4[1], modifierSeperator = _componentsRegex$exec4[2], modifier = _componentsRegex$exec4[3]; logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); // Validate and process name if (!claimName) { throw new Error('No claim name provided before .'); } var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); if (nameBadChars) { throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.'); } // Validate and process modifier if (modifierSeperator) { if (!modifier) { throw new Error('No file extension provided after separator ' + modifierSeperator + '.'); } if (modifierSeperator !== '.') { throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name'); } } // return results return { claimName: claimName }; }, parseModifier: function parseModifier(claim) { logger.debug('parsing modifier:', claim); var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) { return match || null; }), _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4), proto = _componentsRegex$exec6[0], claimName = _componentsRegex$exec6[1], modifierSeperator = _componentsRegex$exec6[2], modifier = _componentsRegex$exec6[3]; logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); // Validate and process modifier var hasFileExtension = false; if (modifierSeperator) { hasFileExtension = true; } return { hasFileExtension: hasFileExtension }; } }; /***/ }), /* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _server = __webpack_require__(69); var _redux = __webpack_require__(28); var _index = __webpack_require__(70); var _index2 = _interopRequireDefault(_index); var _reactRedux = __webpack_require__(1); var _reactRouterDom = __webpack_require__(5); var _index3 = __webpack_require__(75); var _index4 = _interopRequireDefault(_index3); var _app = __webpack_require__(33); var _app2 = _interopRequireDefault(_app); var _renderFullPage = __webpack_require__(136); var _renderFullPage2 = _interopRequireDefault(_renderFullPage); var _reduxSaga = __webpack_require__(137); var _reduxSaga2 = _interopRequireDefault(_reduxSaga); var _effects = __webpack_require__(18); var _show_uri = __webpack_require__(138); var _show = __webpack_require__(8); var _reactHelmet = __webpack_require__(21); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var returnSagaWithParams = function returnSagaWithParams(saga, params) { return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _effects.call)(saga, params); case 2: case 'end': return _context.stop(); } } }, _callee, this); }) ); }; module.exports = function (req, res) { var context = {}; // create and apply middleware var sagaMiddleware = (0, _reduxSaga2.default)(); var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance var store = (0, _redux.createStore)(_index2.default, middleware); // create saga var action = (0, _show.onHandleShowPageUri)(req.params); var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action); // run the saga middleware sagaMiddleware.run(saga).done.then(function () { // render component to a string var html = (0, _server.renderToString)(_react2.default.createElement( _reactRedux.Provider, { store: store }, _react2.default.createElement( _reactRouterDom.StaticRouter, { location: req.url, context: context }, _react2.default.createElement( _index4.default, null, _react2.default.createElement(_app2.default, null) ) ) )); // get head tags from helmet var helmet = _reactHelmet2.default.renderStatic(); // check for a redirect if (context.url) { return res.redirect(301, context.url); } // get the initial state from our Redux store var preloadedState = store.getState(); // send the rendered page back to the client res.send((0, _renderFullPage2.default)(helmet, html, preloadedState)); }); }; /***/ }), /* 28 */ /***/ (function(module, exports) { module.exports = require("redux"); /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var FILE_SELECTED = exports.FILE_SELECTED = 'FILE_SELECTED'; var FILE_CLEAR = exports.FILE_CLEAR = 'FILE_CLEAR'; var METADATA_UPDATE = exports.METADATA_UPDATE = 'METADATA_UPDATE'; var CLAIM_UPDATE = exports.CLAIM_UPDATE = 'CLAIM_UPDATE'; var SET_PUBLISH_IN_CHANNEL = exports.SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL'; var PUBLISH_STATUS_UPDATE = exports.PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE'; var ERROR_UPDATE = exports.ERROR_UPDATE = 'ERROR_UPDATE'; var SELECTED_CHANNEL_UPDATE = exports.SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE'; var TOGGLE_METADATA_INPUTS = exports.TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS'; var THUMBNAIL_NEW = exports.THUMBNAIL_NEW = 'THUMBNAIL_NEW'; var PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START'; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOGIN = exports.LOGIN = 'Existing'; var CREATE = exports.CREATE = 'New'; /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CHANNEL_UPDATE = exports.CHANNEL_UPDATE = 'CHANNEL_UPDATE'; /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOCAL_CHECK = exports.LOCAL_CHECK = 'LOCAL_CHECK'; var UNAVAILABLE = exports.UNAVAILABLE = 'UNAVAILABLE'; var ERROR = exports.ERROR = 'ERROR'; var AVAILABLE = exports.AVAILABLE = 'AVAILABLE'; /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(5); var _HomePage = __webpack_require__(77); var _HomePage2 = _interopRequireDefault(_HomePage); var _AboutPage = __webpack_require__(114); var _AboutPage2 = _interopRequireDefault(_AboutPage); var _LoginPage = __webpack_require__(115); var _LoginPage2 = _interopRequireDefault(_LoginPage); var _ShowPage = __webpack_require__(117); var _ShowPage2 = _interopRequireDefault(_ShowPage); var _FourOhFourPage = __webpack_require__(134); var _FourOhFourPage2 = _interopRequireDefault(_FourOhFourPage); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // import { dynamicImport } from 'utils/dynamicImport'; // const HomePage = dynamicImport('pages/HomePage'); // or use the provided local homepage var App = function App() { return _react2.default.createElement( _reactRouterDom.Switch, null, _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/', component: _HomePage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/about', component: _AboutPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/login', component: _LoginPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:identifier/:claim', component: _ShowPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:claim', component: _ShowPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { component: _FourOhFourPage2.default }) ); }; exports.default = App; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(4); var _view = __webpack_require__(88); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { file: publish.file, thumbnail: publish.thumbnail, fileError: publish.error.file }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { selectFile: function selectFile(file) { dispatch((0, _publish.selectFile)(file)); }, setFileError: function setFileError(value) { dispatch((0, _publish.clearFile)()); dispatch((0, _publish.updateError)('file', value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _channel = __webpack_require__(22); var _view = __webpack_require__(105); var _view2 = _interopRequireDefault(_view); var _publish = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onChannelLogin: function onChannelLogin(name, shortId, longId) { dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); dispatch((0, _publish.updateSelectedChannel)(name)); } }; }; exports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default); /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _channel = __webpack_require__(22); var _view = __webpack_require__(106); var _view2 = _interopRequireDefault(_view); var _publish = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onChannelLogin: function onChannelLogin(name, shortId, longId) { dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); dispatch((0, _publish.updateSelectedChannel)(name)); } }; }; exports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default); /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CHANNEL = exports.CHANNEL = 'CHANNEL'; var ASSET_LITE = exports.ASSET_LITE = 'ASSET_LITE'; var ASSET_DETAILS = exports.ASSET_DETAILS = 'ASSET_DETAILS'; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(121); var _view2 = _interopRequireDefault(_view); var _show = __webpack_require__(8); var _show2 = __webpack_require__(16); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select error and status var error = show.displayAsset.error; var status = show.displayAsset.status; // select asset var asset = (0, _show2.selectAsset)(show); // return props return { error: error, status: status, asset: asset }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onFileRequest: function onFileRequest(name, claimId) { dispatch((0, _show.fileRequested)(name, claimId)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var selectSiteState = exports.selectSiteState = function selectSiteState(state) { return state.site; }; var selectSiteHost = exports.selectSiteHost = function selectSiteHost(state) { return state.site.host; }; /***/ }), /* 40 */ /***/ (function(module, exports) { module.exports = require("passport-local"); /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = { returnShortId: function returnShortId(claimsArray, longId) { var claimIndex = void 0; var shortId = longId.substring(0, 1); // default short id is the first letter var shortIdLength = 0; // find the index of this claim id claimIndex = claimsArray.findIndex(function (element) { return element.claimId === longId; }); if (claimIndex < 0) { throw new Error('claim id not found in claims list'); } // get an array of all claims with lower height var possibleMatches = claimsArray.slice(0, claimIndex); // remove certificates with the same prefixes until none are left. while (possibleMatches.length > 0) { shortIdLength += 1; shortId = longId.substring(0, shortIdLength); possibleMatches = possibleMatches.filter(function (element) { return element.claimId && element.claimId.substring(0, shortIdLength) === shortId; }); } return shortId; } }; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(43); __webpack_require__(44); module.exports = __webpack_require__(45); /***/ }), /* 43 */ /***/ (function(module, exports) { module.exports = require("babel-polyfill"); /***/ }), /* 44 */ /***/ (function(module, exports) { module.exports = require("whatwg-fetch"); /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var api = __webpack_require__(46); var asset = __webpack_require__(67); var auth = __webpack_require__(145); var logger = __webpack_require__(150); var mysql = __webpack_require__(9); var site = __webpack_require__(6); var slack = __webpack_require__(151); var passport = __webpack_require__(153); var models = __webpack_require__(158); var App = __webpack_require__(33); var _exports = { App: App, logger: logger, models: models, mysql: mysql, passport: passport, site: site, slack: slack, routes: { api: api, asset: asset, auth: auth } }; module.exports = _exports; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var channelAvailability = __webpack_require__(47); var channelClaims = __webpack_require__(53); var channelData = __webpack_require__(55); var channelShortId = __webpack_require__(56); var claimAvailability = __webpack_require__(57); var claimData = __webpack_require__(58); var claimGet = __webpack_require__(59); var claimLongId = __webpack_require__(60); var claimPublish = __webpack_require__(61); var claimResolve = __webpack_require__(63); var claimShortId = __webpack_require__(64); var claimsList = __webpack_require__(65); var fileAvailability = __webpack_require__(66); module.exports = { channelAvailability: channelAvailability, channelClaims: channelClaims, channelData: channelData, channelShortId: channelShortId, claimAvailability: claimAvailability, claimData: claimData, claimGet: claimGet, claimLongId: claimLongId, claimPublish: claimPublish, claimResolve: claimResolve, claimShortId: claimShortId, claimsList: claimsList, fileAvailability: fileAvailability }; /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(19), checkChannelAvailability = _require.checkChannelAvailability; var _require2 = __webpack_require__(10), sendGATimingEvent = _require2.sendGATimingEvent; var _require3 = __webpack_require__(3), handleErrorResponse = _require3.handleErrorResponse; /* route to check whether site has published to a channel */ var channelAvailability = function channelAvailability() { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, name = _ref.params.name; var gaStartTime = Date.now(); checkChannelAvailability(name).then(function (availableName) { res.status(200).json(availableName); sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = channelAvailability; /***/ }), /* 48 */ /***/ (function(module, exports) { module.exports = require("axios"); /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var lbryConfig = { api: { apiHost: 'localhost', apiPort: '5279' } }; module.exports = lbryConfig; /***/ }), /* 50 */ /***/ (function(module, exports) { module.exports = require("universal-analytics"); /***/ }), /* 51 */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), /* 52 */ /***/ (function(module, exports) { module.exports = require("sequelize"); /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(17), getChannelClaims = _require.getChannelClaims; var _require2 = __webpack_require__(3), handleErrorResponse = _require2.handleErrorResponse; var NO_CHANNEL = 'NO_CHANNEL'; /* route to get all claims for channel */ var channelClaims = function channelClaims() { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, body = _ref.body, params = _ref.params; var channelName = params.channelName; var channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; var page = params.page; getChannelClaims(channelName, channelClaimId, page).then(function (data) { if (data === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel was found' }); } res.status(200).json({ success: true, data: data }); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = channelClaims; /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var CLAIMS_PER_PAGE = 12; module.exports = { returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) { var totalPages = module.exports.determineTotalPages(claims); var paginationPage = module.exports.getPageFromQuery(page); var viewData = { channelName: channelName, longChannelClaimId: longChannelClaimId, claims: module.exports.extractPageFromClaims(claims, paginationPage), previousPage: module.exports.determinePreviousPage(paginationPage), currentPage: paginationPage, nextPage: module.exports.determineNextPage(totalPages, paginationPage), totalPages: totalPages, totalResults: module.exports.determineTotalClaims(claims) }; return viewData; }, getPageFromQuery: function getPageFromQuery(page) { if (page) { return parseInt(page); } return 1; }, extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) { if (!claims) { return []; // if no claims, return this default } // logger.debug('claims is array?', Array.isArray(claims)); // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber)); var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE; var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE; var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex); return pageOfClaims; }, determineTotalPages: function determineTotalPages(claims) { if (!claims) { return 0; } else { var totalClaims = claims.length; if (totalClaims < CLAIMS_PER_PAGE) { return 1; } var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE); var remainder = totalClaims % CLAIMS_PER_PAGE; if (remainder === 0) { return fullPages; } return fullPages + 1; } }, determinePreviousPage: function determinePreviousPage(currentPage) { if (currentPage === 1) { return null; } return currentPage - 1; }, determineNextPage: function determineNextPage(totalPages, currentPage) { if (currentPage === totalPages) { return null; } return currentPage + 1; }, determineTotalClaims: function determineTotalClaims(claims) { if (!claims) { return 0; } return claims.length; } }; /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(17), getChannelData = _require.getChannelData; var _require2 = __webpack_require__(3), handleErrorResponse = _require2.handleErrorResponse; var NO_CHANNEL = 'NO_CHANNEL'; /* route to get data for a channel */ var channelData = function channelData() { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, body = _ref.body, params = _ref.params; var channelName = params.channelName; var channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; getChannelData(channelName, channelClaimId, 0).then(function (data) { if (data === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel was found' }); } res.status(200).json({ success: true, data: data }); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = channelData; /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(3), handleErrorResponse = _require.handleErrorResponse; /* route to get a short channel id from long channel Id */ var channelShortIdRoute = function channelShortIdRoute(db) { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, params = _ref.params; db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) { res.status(200).json(shortId); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = channelShortIdRoute; /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(19), claimNameIsAvailable = _require.claimNameIsAvailable; var _require2 = __webpack_require__(10), sendGATimingEvent = _require2.sendGATimingEvent; var _require3 = __webpack_require__(3), handleErrorResponse = _require3.handleErrorResponse; /* route to check whether this site published to a claim */ var claimAvailability = function claimAvailability() { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, name = _ref.params.name; var gaStartTime = Date.now(); claimNameIsAvailable(name).then(function (result) { res.status(200).json(result); sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimAvailability; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(3), handleErrorResponse = _require.handleErrorResponse; /* route to return data for a claim */ var claimData = function claimData(db) { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, body = _ref.body, params = _ref.params; var claimName = params.claimName; var claimId = params.claimId; if (claimId === 'none') claimId = null; db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) { if (!claimInfo) { return res.status(404).json({ success: false, message: 'No claim could be found' }); } res.status(200).json({ success: true, data: claimInfo }); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimData; /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _require = __webpack_require__(14), getClaim = _require.getClaim; var _require2 = __webpack_require__(20), addGetResultsToFileData = _require2.addGetResultsToFileData, createFileData = _require2.createFileData; var _require3 = __webpack_require__(3), handleErrorResponse = _require3.handleErrorResponse; /* route to get a claim */ var claimGet = function claimGet(db) { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, params = _ref.params; var name = params.name; var claimId = params.claimId; // resolve the claim db.Claim.resolveClaim(name, claimId).then(function (resolveResult) { // make sure a claim actually exists at that uri if (!resolveResult) { throw new Error('No matching uri found in Claim table'); } var fileData = createFileData(resolveResult); // get the claim return Promise.all([fileData, getClaim(name + '#' + claimId)]); }).then(function (_ref2) { var _ref3 = _slicedToArray(_ref2, 2), fileData = _ref3[0], getResult = _ref3[1]; fileData = addGetResultsToFileData(fileData, getResult); return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]); }).then(function (_ref4) { var _ref5 = _slicedToArray(_ref4, 2), fileRecord = _ref5[0], _ref5$ = _ref5[1], message = _ref5$.message, completed = _ref5$.completed; res.status(200).json({ success: true, message: message, completed: completed }); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimGet; /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(17), getClaimId = _require.getClaimId; var _require2 = __webpack_require__(3), handleErrorResponse = _require2.handleErrorResponse; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; /* route to get a long claim id */ var claimLongId = function claimLongId() { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, body = _ref.body, params = _ref.params; var channelName = body.channelName; var channelClaimId = body.channelClaimId; var claimName = body.claimName; var claimId = body.claimId; getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) { if (result === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel could be found' }); } if (result === NO_CLAIM) { return res.status(404).json({ success: false, message: 'No matching claim id could be found' }); } res.status(200).json({ success: true, data: result }); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimLongId; /***/ }), /* 61 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _require = __webpack_require__(20), createBasicPublishParams = _require.createBasicPublishParams, createThumbnailPublishParams = _require.createThumbnailPublishParams, parsePublishApiRequestBody = _require.parsePublishApiRequestBody, parsePublishApiRequestFiles = _require.parsePublishApiRequestFiles; var _require2 = __webpack_require__(19), claimNameIsAvailable = _require2.claimNameIsAvailable, publish = _require2.publish; var _require3 = __webpack_require__(62), authenticateUser = _require3.authenticateUser; var _require4 = __webpack_require__(10), sendGATimingEvent = _require4.sendGATimingEvent; var _require5 = __webpack_require__(3), handleErrorResponse = _require5.handleErrorResponse; var _require6 = __webpack_require__(6), host = _require6.details.host; /* route to publish a claim through the daemon */ var claimPublish = function claimPublish(db) { return function (_ref, res) { var body = _ref.body, files = _ref.files, headers = _ref.headers, ip = _ref.ip, originalUrl = _ref.originalUrl, user = _ref.user; // define variables var channelName = void 0, channelId = void 0, channelPassword = void 0, description = void 0, fileName = void 0, filePath = void 0, fileType = void 0, gaStartTime = void 0, license = void 0, name = void 0, nsfw = void 0, thumbnail = void 0, thumbnailFileName = void 0, thumbnailFilePath = void 0, thumbnailFileType = void 0, title = void 0; // record the start time of the request gaStartTime = Date.now(); // validate the body and files of the request try { var _parsePublishApiReque = parsePublishApiRequestBody(body); // validateApiPublishRequest(body, files); name = _parsePublishApiReque.name; nsfw = _parsePublishApiReque.nsfw; license = _parsePublishApiReque.license; title = _parsePublishApiReque.title; description = _parsePublishApiReque.description; thumbnail = _parsePublishApiReque.thumbnail; var _parsePublishApiReque2 = parsePublishApiRequestFiles(files); fileName = _parsePublishApiReque2.fileName; filePath = _parsePublishApiReque2.filePath; fileType = _parsePublishApiReque2.fileType; thumbnailFileName = _parsePublishApiReque2.thumbnailFileName; thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath; thumbnailFileType = _parsePublishApiReque2.thumbnailFileType; channelName = body.channelName; channelId = body.channelId; channelPassword = body.channelPassword; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // check channel authorization Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref2) { var _ref3 = _slicedToArray(_ref2, 4), _ref3$ = _ref3[0], channelName = _ref3$.channelName, channelClaimId = _ref3$.channelClaimId, validatedClaimName = _ref3[1], publishParams = _ref3[2], thumbnailPublishParams = _ref3[3]; // add channel details to the publish params if (channelName && channelClaimId) { publishParams['channel_name'] = channelName; publishParams['channel_id'] = channelClaimId; } // publish the thumbnail if (thumbnailPublishParams) { publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType); } // publish the asset return publish(publishParams, fileName, fileType); }).then(function (result) { res.status(200).json({ success: true, message: 'publish completed successfully', data: { name: name, claimId: result.claim_id, url: host + '/' + result.claim_id + '/' + name, lbryTx: result } }); // record the publish end time and send to google analytics sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now()); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimPublish; /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(9), db = _require.db; var logger = __webpack_require__(2); module.exports = { authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) { // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided if (!channelName && !channelId) { return { channelName: null, channelClaimId: null }; } // case: channelName or channel Id are provided with user token if (user) { if (channelName && channelName !== user.channelName) { throw new Error('the provided channel name does not match user credentials'); } if (channelId && channelId !== user.channelClaimId) { throw new Error('the provided channel id does not match user credentials'); } return { channelName: user.channelName, channelClaimId: user.channelClaimId }; } // case: channelName or channel Id are provided with password instead of user token if (!channelPassword) throw new Error('no channel password provided'); return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword); }, authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) { return new Promise(function (resolve, reject) { // hoisted variables var channelData = void 0; // build the params for finding the channel var channelFindParams = {}; if (channelName) channelFindParams['channelName'] = channelName; if (channelId) channelFindParams['channelClaimId'] = channelId; // find the channel db.Channel.findOne({ where: channelFindParams }).then(function (channel) { if (!channel) { logger.debug('no channel found'); throw new Error('Authentication failed, you do not have access to that channel'); } channelData = channel.get(); logger.debug('channel data:', channelData); return db.User.findOne({ where: { userName: channelData.channelName.substring(1) } }); }).then(function (user) { if (!user) { logger.debug('no user found'); throw new Error('Authentication failed, you do not have access to that channel'); } return user.comparePassword(userPassword); }).then(function (isMatch) { if (!isMatch) { logger.debug('incorrect password'); throw new Error('Authentication failed, you do not have access to that channel'); } logger.debug('...password was a match...'); resolve(channelData); }).catch(function (error) { reject(error); }); }); } }; /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(14), resolveUri = _require.resolveUri; var _require2 = __webpack_require__(3), handleErrorResponse = _require2.handleErrorResponse; /* route to run a resolve request on the daemon */ var claimResolve = function claimResolve() { return function (_ref, res) { var headers = _ref.headers, ip = _ref.ip, originalUrl = _ref.originalUrl, params = _ref.params; resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) { res.status(200).json(resolvedUri); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimResolve; /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(3), handleErrorResponse = _require.handleErrorResponse; /* route to get a short claim id from long claim Id */ var claimShortId = function claimShortId(db) { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, body = _ref.body, params = _ref.params; db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) { res.status(200).json({ success: true, data: shortId }); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimShortId; /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(14), getClaimList = _require.getClaimList; var _require2 = __webpack_require__(3), handleErrorResponse = _require2.handleErrorResponse; /* route to get list of claims */ var claimList = function claimList(db) { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, params = _ref.params; getClaimList(params.name).then(function (claimsList) { res.status(200).json(claimsList); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = claimList; /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(3), handleErrorResponse = _require.handleErrorResponse; /* route to see if asset is available locally */ var fileAvailability = function fileAvailability(db) { return function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, params = _ref.params; var name = params.name; var claimId = params.claimId; db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (result) { return res.status(200).json({ success: true, data: true }); } res.status(200).json({ success: true, data: false }); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); }); }; }; module.exports = fileAvailability; /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var serveAssetByClaim = __webpack_require__(68); var serveAssetByIdentifierAndClaim = __webpack_require__(144); module.exports = { serveAssetByClaim: serveAssetByClaim, serveAssetByIdentifierAndClaim: serveAssetByIdentifierAndClaim }; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(10), sendGAServeEvent = _require.sendGAServeEvent; var _require2 = __webpack_require__(25), determineResponseType = _require2.determineResponseType, logRequestData = _require2.logRequestData, getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset; var lbryUri = __webpack_require__(26); var handleShowRender = __webpack_require__(27); var SERVE = 'SERVE'; /* route to serve an asset or the react app via the claim name only */ var claim = function claim() { return function (req, res) { var headers = req.headers, ip = req.ip, originalUrl = req.originalUrl, params = req.params; // decide if this is a show request var hasFileExtension = void 0; try { var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim); hasFileExtension = _lbryUri$parseModifie.hasFileExtension; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } var responseType = determineResponseType(hasFileExtension, headers); if (responseType !== SERVE) { return handleShowRender(req, res); } // handle serve request // send google analytics sendGAServeEvent(headers, ip, originalUrl); // parse the claim var claimName = void 0; try { var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim); claimName = _lbryUri$parseClaim.claimName; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // log the request data for debugging logRequestData(responseType, claimName, null, null); // get the claim Id and then serve the asset getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res); }; }; module.exports = claim; /***/ }), /* 69 */ /***/ (function(module, exports) { module.exports = require("react-dom/server"); /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _redux = __webpack_require__(28); var _publish = __webpack_require__(71); var _publish2 = _interopRequireDefault(_publish); var _channel = __webpack_require__(72); var _channel2 = _interopRequireDefault(_channel); var _show = __webpack_require__(73); var _show2 = _interopRequireDefault(_show); var _site = __webpack_require__(74); var _site2 = _interopRequireDefault(_site); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = (0, _redux.combineReducers)({ channel: _channel2.default, publish: _publish2.default, show: _show2.default, site: _site2.default }); /***/ }), /* 71 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { case actions.FILE_SELECTED: return Object.assign({}, initialState, { // note: clears to initial state file: action.data }); case actions.FILE_CLEAR: return initialState; case actions.METADATA_UPDATE: return Object.assign({}, state, { metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value)) }); case actions.CLAIM_UPDATE: return Object.assign({}, state, { claim: action.data }); case actions.SET_PUBLISH_IN_CHANNEL: return Object.assign({}, state, { publishInChannel: action.channel }); case actions.PUBLISH_STATUS_UPDATE: return Object.assign({}, state, { status: action.data }); case actions.ERROR_UPDATE: return Object.assign({}, state, { error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value)) }); case actions.SELECTED_CHANNEL_UPDATE: return Object.assign({}, state, { selectedChannel: action.data }); case actions.TOGGLE_METADATA_INPUTS: return Object.assign({}, state, { showMetadataInputs: action.data }); case actions.THUMBNAIL_NEW: return Object.assign({}, state, { thumbnail: action.data }); default: return state; } }; var _publish_action_types = __webpack_require__(29); var actions = _interopRequireWildcard(_publish_action_types); var _publish_channel_select_states = __webpack_require__(30); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _require = __webpack_require__(6), publishing = _require.publishing; var initialState = { disabled: publishing.disabled, disabledMessage: publishing.disabledMessage, publishInChannel: false, selectedChannel: _publish_channel_select_states.LOGIN, showMetadataInputs: false, status: { status: null, message: null }, error: { file: null, url: null, channel: null, publishSubmit: null }, file: null, claim: '', metadata: { title: '', description: '', license: '', nsfw: false }, thumbnail: null }; /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { case actions.CHANNEL_UPDATE: return Object.assign({}, state, { loggedInChannel: action.data }); default: return state; } }; var _channel_action_types = __webpack_require__(31); var actions = _interopRequireWildcard(_channel_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var initialState = { loggedInChannel: { name: null, shortId: null, longId: null } }; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { // handle request case actions.REQUEST_ERROR: return Object.assign({}, state, { request: Object.assign({}, state.request, { error: action.data }) }); case actions.REQUEST_UPDATE: return Object.assign({}, state, { request: Object.assign({}, state.request, { type: action.data.requestType, id: action.data.requestId }) }); // store requests case actions.REQUEST_LIST_ADD: return Object.assign({}, state, { requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, { error: action.data.error, key: action.data.key })) }); // asset data case actions.ASSET_ADD: return Object.assign({}, state, { assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, { error: action.data.error, name: action.data.name, claimId: action.data.claimId, shortId: action.data.shortId, claimData: action.data.claimData })) }); // channel data case actions.CHANNEL_ADD: return Object.assign({}, state, { channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, { name: action.data.name, longId: action.data.longId, shortId: action.data.shortId, claimsData: action.data.claimsData })) }); case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS: return Object.assign({}, state, { channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], { claimsData: action.data.claimsData }))) }); // display an asset case actions.FILE_AVAILABILITY_UPDATE: return Object.assign({}, state, { displayAsset: Object.assign({}, state.displayAsset, { status: action.data }) }); case actions.DISPLAY_ASSET_ERROR: return Object.assign({}, state, { displayAsset: Object.assign({}, state.displayAsset, { error: action.data, status: _asset_display_states.ERROR }) }); default: return state; } }; var _show_action_types = __webpack_require__(15); var actions = _interopRequireWildcard(_show_action_types); var _asset_display_states = __webpack_require__(32); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var initialState = { request: { error: null, type: null, id: null }, requestList: {}, channelList: {}, assetList: {}, displayAsset: { error: null, status: _asset_display_states.LOCAL_CHECK } }; /***/ }), /* 74 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { default: return state; } }; var siteConfig = __webpack_require__(6); var googleAnalyticsId = siteConfig.analytics.googleId, _siteConfig$assetDefa = siteConfig.assetDefaults, defaultThumbnail = _siteConfig$assetDefa.thumbnail, defaultDescription = _siteConfig$assetDefa.description, _siteConfig$details = siteConfig.details, description = _siteConfig$details.description, host = _siteConfig$details.host, title = _siteConfig$details.title, twitter = _siteConfig$details.twitter; var initialState = { description: description, googleAnalyticsId: googleAnalyticsId, host: host, title: title, twitter: twitter, defaultDescription: defaultDescription, defaultThumbnail: defaultThumbnail }; /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactGa = __webpack_require__(76); var _reactGa2 = _interopRequireDefault(_reactGa); var _reactRouterDom = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _require = __webpack_require__(6), googleId = _require.analytics.googleId; _reactGa2.default.initialize(googleId); var GAListener = function (_React$Component) { _inherits(GAListener, _React$Component); function GAListener() { _classCallCheck(this, GAListener); return _possibleConstructorReturn(this, (GAListener.__proto__ || Object.getPrototypeOf(GAListener)).apply(this, arguments)); } _createClass(GAListener, [{ key: 'componentDidMount', value: function componentDidMount() { this.sendPageView(this.props.history.location); this.props.history.listen(this.sendPageView); } }, { key: 'sendPageView', value: function sendPageView(location) { _reactGa2.default.set({ page: location.pathname }); _reactGa2.default.pageview(location.pathname); } }, { key: 'render', value: function render() { return this.props.children; } }]); return GAListener; }(_react2.default.Component); exports.default = (0, _reactRouterDom.withRouter)(GAListener); /***/ }), /* 76 */ /***/ (function(module, exports) { module.exports = require("react-ga"); /***/ }), /* 77 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(11); var _SEO2 = _interopRequireDefault(_SEO); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _PublishTool = __webpack_require__(86); var _PublishTool2 = _interopRequireDefault(_PublishTool); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var HomePage = function (_React$Component) { _inherits(HomePage, _React$Component); function HomePage() { _classCallCheck(this, HomePage); return _possibleConstructorReturn(this, (HomePage.__proto__ || Object.getPrototypeOf(HomePage)).apply(this, arguments)); } _createClass(HomePage, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', { className: 'row row--tall flex-container--column' }, _react2.default.createElement(_SEO2.default, null), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--tall row--padded flex-container--column' }, _react2.default.createElement(_PublishTool2.default, null) ) ); } }]); return HomePage; }(_react2.default.Component); ; exports.default = HomePage; /***/ }), /* 78 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactHelmet = __webpack_require__(21); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); var _propTypes = __webpack_require__(12); var _propTypes2 = _interopRequireDefault(_propTypes); var _pageTitle = __webpack_require__(79); var _metaTags = __webpack_require__(80); var _canonicalLink = __webpack_require__(81); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var SEO = function (_React$Component) { _inherits(SEO, _React$Component); function SEO() { _classCallCheck(this, SEO); return _possibleConstructorReturn(this, (SEO.__proto__ || Object.getPrototypeOf(SEO)).apply(this, arguments)); } _createClass(SEO, [{ key: 'render', value: function render() { // props from state var _props = this.props, defaultDescription = _props.defaultDescription, defaultThumbnail = _props.defaultThumbnail, siteDescription = _props.siteDescription, siteHost = _props.siteHost, siteTitle = _props.siteTitle, siteTwitter = _props.siteTwitter; // props from parent var _props2 = this.props, asset = _props2.asset, channel = _props2.channel, pageUri = _props2.pageUri; var pageTitle = this.props.pageTitle; // create page title, tags, and canonical link pageTitle = (0, _pageTitle.createPageTitle)(siteTitle, pageTitle); var metaTags = (0, _metaTags.createMetaTags)(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail); var canonicalLink = (0, _canonicalLink.createCanonicalLink)(asset, channel, pageUri, siteHost); // render results return _react2.default.createElement(_reactHelmet2.default, { title: pageTitle, meta: metaTags, link: [{ rel: 'canonical', href: canonicalLink }] }); } }]); return SEO; }(_react2.default.Component); ; SEO.propTypes = { pageTitle: _propTypes2.default.string, pageUri: _propTypes2.default.string, channel: _propTypes2.default.object, asset: _propTypes2.default.object }; exports.default = SEO; /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var createPageTitle = exports.createPageTitle = function createPageTitle(siteTitle, pageTitle) { if (!pageTitle) { return "" + siteTitle; } return siteTitle + " - " + pageTitle; }; /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) { if (thumbnail) { var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.')); switch (fileExt) { case 'jpeg': case 'jpg': return 'image/jpeg'; case 'png': return 'image/png'; case 'gif': return 'image/gif'; case 'mp4': return 'video/mp4'; default: return 'image/jpeg'; } } return ''; }; var createBasicMetaTags = function createBasicMetaTags(siteHost, siteDescription, siteTitle, siteTwitter) { return [{ property: 'og:title', content: siteTitle }, { property: 'og:url', content: siteHost }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: siteDescription }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }]; }; var createChannelMetaTags = function createChannelMetaTags(siteTitle, siteHost, siteTwitter, channel) { var name = channel.name, longId = channel.longId; return [{ property: 'og:title', content: name + ' on ' + siteTitle }, { property: 'og:url', content: siteHost + '/' + name + ':' + longId }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: name + ', a channel on ' + siteTitle }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }]; }; var createAssetMetaTags = function createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail) { var claimData = asset.claimData; var contentType = claimData.contentType; var embedUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name; var showUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name; var source = siteHost + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt; var ogTitle = claimData.title || claimData.name; var ogDescription = claimData.description || defaultDescription; var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail); var ogThumbnail = claimData.thumbnail || defaultThumbnail; var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: siteTwitter }]; if (contentType === 'video/mp4' || contentType === 'video/webm') { metaTags.push({ property: 'og:video', content: source }); metaTags.push({ property: 'og:video:secure_url', content: source }); metaTags.push({ property: 'og:video:type', content: contentType }); metaTags.push({ property: 'og:image', content: ogThumbnail }); metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType }); metaTags.push({ property: 'og:type', content: 'video' }); metaTags.push({ property: 'twitter:card', content: 'player' }); metaTags.push({ property: 'twitter:player', content: embedUrl }); metaTags.push({ property: 'twitter:player:width', content: 600 }); metaTags.push({ property: 'twitter:text:player_width', content: 600 }); metaTags.push({ property: 'twitter:player:height', content: 337 }); metaTags.push({ property: 'twitter:player:stream', content: source }); metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType }); } else { metaTags.push({ property: 'og:image', content: source }); metaTags.push({ property: 'og:image:type', content: contentType }); metaTags.push({ property: 'og:type', content: 'article' }); metaTags.push({ property: 'twitter:card', content: 'summary_large_image' }); } return metaTags; }; var createMetaTags = exports.createMetaTags = function createMetaTags(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail) { if (asset) { return createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail); }; if (channel) { return createChannelMetaTags(siteHost, siteTitle, siteTwitter, channel); }; return createBasicMetaTags(siteDescription, siteHost, siteTitle, siteTwitter); }; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var createBasicCanonicalLink = function createBasicCanonicalLink(page, siteHost) { return siteHost + "/" + page; }; var createAssetCanonicalLink = function createAssetCanonicalLink(asset, siteHost) { var channelName = void 0, certificateId = void 0, name = void 0, claimId = void 0; if (asset.claimData) { var _asset$claimData = asset.claimData; channelName = _asset$claimData.channelName; certificateId = _asset$claimData.certificateId; name = _asset$claimData.name; claimId = _asset$claimData.claimId; }; if (channelName) { return siteHost + "/" + channelName + ":" + certificateId + "/" + name; }; return siteHost + "/" + claimId + "/" + name; }; var createChannelCanonicalLink = function createChannelCanonicalLink(channel, siteHost) { var name = channel.name, longId = channel.longId; return siteHost + "/" + name + ":" + longId; }; var createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page, siteHost) { if (asset) { return createAssetCanonicalLink(asset, siteHost); } if (channel) { return createChannelCanonicalLink(channel, siteHost); } return createBasicCanonicalLink(page, siteHost); }; /***/ }), /* 82 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(5); var _Logo = __webpack_require__(83); var _Logo2 = _interopRequireDefault(_Logo); var _NavBarChannelOptionsDropdown = __webpack_require__(84); var _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown); var _request = __webpack_require__(13); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var VIEW = 'VIEW'; var LOGOUT = 'LOGOUT'; var NavBar = function (_React$Component) { _inherits(NavBar, _React$Component); function NavBar(props) { _classCallCheck(this, NavBar); var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props)); _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this); _this.logoutUser = _this.logoutUser.bind(_this); _this.handleSelection = _this.handleSelection.bind(_this); return _this; } _createClass(NavBar, [{ key: 'componentDidMount', value: function componentDidMount() { // check to see if the user is already logged in this.checkForLoggedInUser(); } }, { key: 'checkForLoggedInUser', value: function checkForLoggedInUser() { var _this2 = this; var params = { credentials: 'include' }; (0, _request2.default)('/user', params).then(function (_ref) { var data = _ref.data; _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId); }).catch(function (error) { console.log('/user error:', error.message); }); } }, { key: 'logoutUser', value: function logoutUser() { var _this3 = this; var params = { credentials: 'include' }; (0, _request2.default)('/logout', params).then(function () { _this3.props.onChannelLogout(); }).catch(function (error) { console.log('/logout error', error.message); }); } }, { key: 'handleSelection', value: function handleSelection(event) { var value = event.target.selectedOptions[0].value; switch (value) { case LOGOUT: this.logoutUser(); break; case VIEW: // redirect to channel page this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId); break; default: break; } } }, { key: 'render', value: function render() { var siteDescription = this.props.siteDescription; return _react2.default.createElement( 'div', { className: 'row row--wide nav-bar' }, _react2.default.createElement( 'div', { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' }, _react2.default.createElement(_Logo2.default, null), _react2.default.createElement( 'div', { className: 'nav-bar--center' }, _react2.default.createElement( 'span', { className: 'nav-bar-tagline' }, siteDescription ) ), _react2.default.createElement( 'div', { className: 'nav-bar--right' }, _react2.default.createElement( _reactRouterDom.NavLink, { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true }, 'Publish' ), _react2.default.createElement( _reactRouterDom.NavLink, { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' }, 'About' ), this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, { channelName: this.props.channelName, handleSelection: this.handleSelection, defaultSelection: this.props.channelName, VIEW: VIEW, LOGOUT: LOGOUT }) : _react2.default.createElement( _reactRouterDom.NavLink, { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' }, 'Channel' ) ) ) ); } }]); return NavBar; }(_react2.default.Component); exports.default = (0, _reactRouterDom.withRouter)(NavBar); /***/ }), /* 83 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Logo() { return _react2.default.createElement( 'svg', { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' }, _react2.default.createElement( _reactRouterDom.Link, { to: '/' }, _react2.default.createElement( 'title', null, 'Logo' ), _react2.default.createElement( 'desc', null, 'Spee.ch logo' ), _react2.default.createElement( 'g', { id: 'About' }, _react2.default.createElement( 'g', { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' }, _react2.default.createElement( 'g', { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' }, _react2.default.createElement( 'text', { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' }, 'Spee 10000000) { throw new Error('Sorry, images are limited to 10 megabytes.'); } break; case 'image/gif': if (file.size > 50000000) { throw new Error('Sorry, GIFs are limited to 50 megabytes.'); } break; case 'video/mp4': if (file.size > 50000000) { throw new Error('Sorry, videos are limited to 50 megabytes.'); } break; default: throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); } } }; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(12); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishPreview = function (_React$Component) { _inherits(PublishPreview, _React$Component); function PublishPreview(props) { _classCallCheck(this, PublishPreview); var _this = _possibleConstructorReturn(this, (PublishPreview.__proto__ || Object.getPrototypeOf(PublishPreview)).call(this, props)); _this.state = { imgSource: '', defaultThumbnail: '/assets/img/video_thumb_default.png' }; return _this; } _createClass(PublishPreview, [{ key: 'componentDidMount', value: function componentDidMount() { this.setPreviewImageSource(this.props.file); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(newProps) { if (newProps.file !== this.props.file) { this.setPreviewImageSource(newProps.file); } if (newProps.thumbnail !== this.props.thumbnail) { if (newProps.thumbnail) { this.setPreviewImageSourceFromFile(newProps.thumbnail); } else { this.setState({ imgSource: this.state.defaultThumbnail }); } } } }, { key: 'setPreviewImageSourceFromFile', value: function setPreviewImageSourceFromFile(file) { var _this2 = this; var previewReader = new FileReader(); previewReader.readAsDataURL(file); previewReader.onloadend = function () { _this2.setState({ imgSource: previewReader.result }); }; } }, { key: 'setPreviewImageSource', value: function setPreviewImageSource(file) { if (file.type !== 'video/mp4') { this.setPreviewImageSourceFromFile(file); } else { if (this.props.thumbnail) { this.setPreviewImageSourceFromFile(this.props.thumbnail); } this.setState({ imgSource: this.state.defaultThumbnail }); } } }, { key: 'render', value: function render() { return _react2.default.createElement('img', { id: 'dropzone-preview', src: this.state.imgSource, className: this.props.dimPreview ? 'dim' : '', alt: 'publish preview' }); } }]); return PublishPreview; }(_react2.default.Component); ; PublishPreview.propTypes = { dimPreview: _propTypes2.default.bool.isRequired, file: _propTypes2.default.object.isRequired, thumbnail: _propTypes2.default.object }; exports.default = PublishPreview; /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(4); var _view = __webpack_require__(92); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, publish = _ref.publish; return { file: publish.file }; }; var mapDispatchToProps = { clearFile: _publish.clearFile, startPublish: _publish.startPublish }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(5); var _Dropzone = __webpack_require__(34); var _Dropzone2 = _interopRequireDefault(_Dropzone); var _PublishTitleInput = __webpack_require__(93); var _PublishTitleInput2 = _interopRequireDefault(_PublishTitleInput); var _PublishUrlInput = __webpack_require__(95); var _PublishUrlInput2 = _interopRequireDefault(_PublishUrlInput); var _PublishThumbnailInput = __webpack_require__(98); var _PublishThumbnailInput2 = _interopRequireDefault(_PublishThumbnailInput); var _PublishMetadataInputs = __webpack_require__(100); var _PublishMetadataInputs2 = _interopRequireDefault(_PublishMetadataInputs); var _ChannelSelect = __webpack_require__(103); var _ChannelSelect2 = _interopRequireDefault(_ChannelSelect); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishDetails = function (_React$Component) { _inherits(PublishDetails, _React$Component); function PublishDetails(props) { _classCallCheck(this, PublishDetails); var _this = _possibleConstructorReturn(this, (PublishDetails.__proto__ || Object.getPrototypeOf(PublishDetails)).call(this, props)); _this.onPublishSubmit = _this.onPublishSubmit.bind(_this); return _this; } _createClass(PublishDetails, [{ key: 'onPublishSubmit', value: function onPublishSubmit() { this.props.startPublish(this.props.history); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', { className: 'row row--no-bottom' }, _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement(_PublishTitleInput2.default, null) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10' }, _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement(_Dropzone2.default, null) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10 align-content-top' }, _react2.default.createElement( 'div', { id: 'publish-active-area', className: 'row row--padded' }, _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--wide' }, _react2.default.createElement(_PublishUrlInput2.default, null) ), _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--wide' }, _react2.default.createElement(_ChannelSelect2.default, null) ), this.props.file.type === 'video/mp4' && _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--wide ' }, _react2.default.createElement(_PublishThumbnailInput2.default, null) ), _react2.default.createElement( 'div', { className: 'row row--padded row--no-top row--no-bottom row--wide' }, _react2.default.createElement(_PublishMetadataInputs2.default, null) ), _react2.default.createElement( 'div', { className: 'row row--wide align-content-center' }, _react2.default.createElement( 'button', { id: 'publish-submit', className: 'button--primary button--large', onClick: this.onPublishSubmit }, 'Publish' ) ), _react2.default.createElement( 'div', { className: 'row row--padded row--no-bottom align-content-center' }, _react2.default.createElement( 'button', { className: 'button--cancel', onClick: this.props.clearFile }, 'Cancel' ) ), _react2.default.createElement( 'div', { className: 'row row--short align-content-center' }, _react2.default.createElement( 'p', { className: 'fine-print' }, 'By clicking \'Publish\', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://lbry.io/learn' }, 'Read more.' ) ) ) ) ) ); } }]); return PublishDetails; }(_react2.default.Component); ; exports.default = (0, _reactRouterDom.withRouter)(PublishDetails); /***/ }), /* 93 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(4); var _view = __webpack_require__(94); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { title: publish.metadata.title }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onMetadataChange: function onMetadataChange(name, value) { dispatch((0, _publish.updateMetadata)(name, value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishTitleInput = function (_React$Component) { _inherits(PublishTitleInput, _React$Component); function PublishTitleInput(props) { _classCallCheck(this, PublishTitleInput); var _this = _possibleConstructorReturn(this, (PublishTitleInput.__proto__ || Object.getPrototypeOf(PublishTitleInput)).call(this, props)); _this.handleInput = _this.handleInput.bind(_this); return _this; } _createClass(PublishTitleInput, [{ key: 'handleInput', value: function handleInput(e) { var name = e.target.name; var value = e.target.value; this.props.onMetadataChange(name, value); } }, { key: 'render', value: function render() { return _react2.default.createElement('input', { type: 'text', id: 'publish-title', className: 'input-text text--large input-text--full-width', name: 'title', placeholder: 'Give your post a title...', onChange: this.handleInput, value: this.props.title }); } }]); return PublishTitleInput; }(_react2.default.Component); exports.default = PublishTitleInput; /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _publish = __webpack_require__(4); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(96); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, publish = _ref.publish; return { loggedInChannelName: channel.loggedInChannel.name, loggedInChannelShortId: channel.loggedInChannel.shortId, fileName: publish.file.name, publishInChannel: publish.publishInChannel, selectedChannel: publish.selectedChannel, claim: publish.claim, urlError: publish.error.url }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onClaimChange: function onClaimChange(value) { dispatch((0, _publish.updateClaim)(value)); dispatch((0, _publish.updateError)('publishSubmit', null)); }, onUrlError: function onUrlError(value) { dispatch((0, _publish.updateError)('url', value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 96 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _request = __webpack_require__(13); var _request2 = _interopRequireDefault(_request); var _PublishUrlMiddleDisplay = __webpack_require__(97); var _PublishUrlMiddleDisplay2 = _interopRequireDefault(_PublishUrlMiddleDisplay); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishUrlInput = function (_React$Component) { _inherits(PublishUrlInput, _React$Component); function PublishUrlInput(props) { _classCallCheck(this, PublishUrlInput); var _this = _possibleConstructorReturn(this, (PublishUrlInput.__proto__ || Object.getPrototypeOf(PublishUrlInput)).call(this, props)); _this.handleInput = _this.handleInput.bind(_this); return _this; } _createClass(PublishUrlInput, [{ key: 'componentDidMount', value: function componentDidMount() { var _props = this.props, claim = _props.claim, fileName = _props.fileName; if (!claim) { this.setClaimName(fileName); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(_ref) { var claim = _ref.claim, fileName = _ref.fileName; // if a new file was chosen, update the claim name if (fileName !== this.props.fileName) { return this.setClaimName(fileName); } // if the claim has updated, check its availability if (claim !== this.props.claim) { this.validateClaim(claim); } } }, { key: 'handleInput', value: function handleInput(event) { var value = event.target.value; value = this.cleanseInput(value); // update the state this.props.onClaimChange(value); } }, { key: 'cleanseInput', value: function cleanseInput(input) { input = input.replace(/\s+/g, '-'); // replace spaces with dashes input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-' return input; } }, { key: 'setClaimName', value: function setClaimName(fileName) { var fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.')); var cleanClaimName = this.cleanseInput(fileNameWithoutEnding); this.props.onClaimChange(cleanClaimName); } }, { key: 'validateClaim', value: function validateClaim(claim) { var _this2 = this; if (!claim) { return this.props.onUrlError('Enter a url above'); } (0, _request2.default)('/api/claim/availability/' + claim).then(function () { _this2.props.onUrlError(null); }).catch(function (error) { _this2.props.onUrlError(error.message); }); } }, { key: 'render', value: function render() { var _props2 = this.props, claim = _props2.claim, loggedInChannelName = _props2.loggedInChannelName, loggedInChannelShortId = _props2.loggedInChannelShortId, publishInChannel = _props2.publishInChannel, selectedChannel = _props2.selectedChannel, urlError = _props2.urlError; return _react2.default.createElement( 'div', { className: 'column column--10 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary span--relative' }, _react2.default.createElement( 'span', { className: 'url-text--secondary' }, 'spee.ch / ' ), _react2.default.createElement(_PublishUrlMiddleDisplay2.default, { publishInChannel: publishInChannel, selectedChannel: selectedChannel, loggedInChannelName: loggedInChannelName, loggedInChannelShortId: loggedInChannelShortId }), _react2.default.createElement('input', { type: 'text', id: 'claim-name-input', className: 'input-text', name: 'claim', placeholder: 'your-url-here', onChange: this.handleInput, value: claim }), claim && !urlError && _react2.default.createElement( 'span', { id: 'input-success-claim-name', className: 'info-message--success span--absolute' }, '\u2713' ), urlError && _react2.default.createElement( 'span', { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' }, '\u2716' ) ), _react2.default.createElement( 'div', null, urlError ? _react2.default.createElement( 'p', { id: 'input-error-claim-name', className: 'info-message--failure' }, urlError ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Choose a custom url' ) ) ); } }]); return PublishUrlInput; }(_react2.default.Component); exports.default = PublishUrlInput; /***/ }), /* 97 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(12); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function UrlMiddle(_ref) { var publishInChannel = _ref.publishInChannel, selectedChannel = _ref.selectedChannel, loggedInChannelName = _ref.loggedInChannelName, loggedInChannelShortId = _ref.loggedInChannelShortId; if (publishInChannel) { if (selectedChannel === loggedInChannelName) { return _react2.default.createElement( 'span', { id: 'url-channel', className: 'url-text--secondary' }, loggedInChannelName, ':', loggedInChannelShortId, ' /' ); } return _react2.default.createElement( 'span', { id: 'url-channel-placeholder', className: 'url-text--secondary tooltip' }, '@channel', _react2.default.createElement( 'span', { className: 'tooltip-text' }, 'Select a channel below' ), ' /' ); } return _react2.default.createElement( 'span', { id: 'url-no-channel-placeholder', className: 'url-text--secondary tooltip' }, 'xyz', _react2.default.createElement( 'span', { className: 'tooltip-text' }, 'This will be a random id' ), ' /' ); } UrlMiddle.propTypes = { publishInChannel: _propTypes2.default.bool.isRequired, loggedInChannelName: _propTypes2.default.string, loggedInChannelShortId: _propTypes2.default.string }; exports.default = UrlMiddle; /***/ }), /* 98 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(4); var _view = __webpack_require__(99); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var file = _ref.publish.file; return { file: file }; }; var mapDispatchToProps = { onNewThumbnail: _publish.onNewThumbnail }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 99 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } function dataURItoBlob(dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString = atob(dataURI.split(',')[1]); // separate out the mime component var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], { type: mimeString }); } var PublishThumbnailInput = function (_React$Component) { _inherits(PublishThumbnailInput, _React$Component); function PublishThumbnailInput(props) { _classCallCheck(this, PublishThumbnailInput); var _this = _possibleConstructorReturn(this, (PublishThumbnailInput.__proto__ || Object.getPrototypeOf(PublishThumbnailInput)).call(this, props)); _this.state = { videoSource: null, error: null, sliderMinRange: 1, sliderMaxRange: null, sliderValue: null }; _this.handleVideoLoadedData = _this.handleVideoLoadedData.bind(_this); _this.handleSliderChange = _this.handleSliderChange.bind(_this); _this.createThumbnail = _this.createThumbnail.bind(_this); return _this; } _createClass(PublishThumbnailInput, [{ key: 'componentDidMount', value: function componentDidMount() { var file = this.props.file; this.setVideoSource(file); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { // if file changes if (nextProps.file && nextProps.file !== this.props.file) { var file = nextProps.file; this.setVideoSource(file); }; } }, { key: 'setVideoSource', value: function setVideoSource(file) { var _this2 = this; var previewReader = new FileReader(); previewReader.readAsDataURL(file); previewReader.onloadend = function () { var dataUri = previewReader.result; var blob = dataURItoBlob(dataUri); var videoSource = URL.createObjectURL(blob); _this2.setState({ videoSource: videoSource }); }; } }, { key: 'handleVideoLoadedData', value: function handleVideoLoadedData(event) { var duration = event.target.duration; var totalMinutes = Math.floor(duration / 60); var totalSeconds = Math.floor(duration % 60); // set the slider this.setState({ sliderMaxRange: duration * 100, sliderValue: duration * 100 / 2, totalMinutes: totalMinutes, totalSeconds: totalSeconds }); // update the current time of the video var video = document.getElementById('video-thumb-player'); video.currentTime = duration / 2; } }, { key: 'handleSliderChange', value: function handleSliderChange(event) { var value = parseInt(event.target.value); // update the slider value this.setState({ sliderValue: value }); // update the current time of the video var video = document.getElementById('video-thumb-player'); video.currentTime = value / 100; } }, { key: 'createThumbnail', value: function createThumbnail() { // take a snapshot var video = document.getElementById('video-thumb-player'); var canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height); var dataUrl = canvas.toDataURL(); var blob = dataURItoBlob(dataUrl); var snapshot = new File([blob], 'thumbnail.png', { type: 'image/png' }); // set the thumbnail in redux store if (snapshot) { this.props.onNewThumbnail(snapshot); } } }, { key: 'render', value: function render() { var _state = this.state, error = _state.error, videoSource = _state.videoSource, sliderMinRange = _state.sliderMinRange, sliderMaxRange = _state.sliderMaxRange, sliderValue = _state.sliderValue, totalMinutes = _state.totalMinutes, totalSeconds = _state.totalSeconds; return _react2.default.createElement( 'div', null, _react2.default.createElement( 'label', { className: 'label' }, 'Thumbnail:' ), _react2.default.createElement('video', { id: 'video-thumb-player', preload: 'metadata', muted: true, style: { display: 'none' }, playsInline: true, onLoadedData: this.handleVideoLoadedData, src: videoSource, onSeeked: this.createThumbnail }), sliderValue ? _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'flex-container--row flex-container--space-between-center', style: { width: '100%' } }, _react2.default.createElement( 'span', { className: 'info-message' }, '0\'00"' ), _react2.default.createElement( 'span', { className: 'info-message' }, totalMinutes, '\'', totalSeconds, '"' ) ), _react2.default.createElement( 'div', null, _react2.default.createElement('input', { type: 'range', min: sliderMinRange, max: sliderMaxRange, value: sliderValue, className: 'slider', onChange: this.handleSliderChange }) ) ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'loading... ' ), error ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, error ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Use slider to set thumbnail' ) ); } }]); return PublishThumbnailInput; }(_react2.default.Component); exports.default = PublishThumbnailInput; /***/ }), /* 100 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(4); var _view = __webpack_require__(101); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { showMetadataInputs: publish.showMetadataInputs, description: publish.metadata.description, license: publish.metadata.license, nsfw: publish.metadata.nsfw }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onMetadataChange: function onMetadataChange(name, value) { dispatch((0, _publish.updateMetadata)(name, value)); }, onToggleMetadataInputs: function onToggleMetadataInputs(value) { dispatch((0, _publish.toggleMetadataInputs)(value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 101 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ExpandingTextArea = __webpack_require__(102); var _ExpandingTextArea2 = _interopRequireDefault(_ExpandingTextArea); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishMetadataInputs = function (_React$Component) { _inherits(PublishMetadataInputs, _React$Component); function PublishMetadataInputs(props) { _classCallCheck(this, PublishMetadataInputs); var _this = _possibleConstructorReturn(this, (PublishMetadataInputs.__proto__ || Object.getPrototypeOf(PublishMetadataInputs)).call(this, props)); _this.toggleShowInputs = _this.toggleShowInputs.bind(_this); _this.handleInput = _this.handleInput.bind(_this); _this.handleSelect = _this.handleSelect.bind(_this); return _this; } _createClass(PublishMetadataInputs, [{ key: 'toggleShowInputs', value: function toggleShowInputs() { this.props.onToggleMetadataInputs(!this.props.showMetadataInputs); } }, { key: 'handleInput', value: function handleInput(event) { var target = event.target; var value = target.type === 'checkbox' ? target.checked : target.value; var name = target.name; this.props.onMetadataChange(name, value); } }, { key: 'handleSelect', value: function handleSelect(event) { var name = event.target.name; var selectedOption = event.target.selectedOptions[0].value; this.props.onMetadataChange(name, selectedOption); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', { id: 'publish-details', className: 'row row--padded row--no-top row--wide' }, this.props.showMetadataInputs && _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'row row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--3 column--med-10 align-content-top' }, _react2.default.createElement( 'label', { htmlFor: 'publish-license', className: 'label' }, 'Description:' ) ), _react2.default.createElement( 'div', { className: 'column column--7 column--sml-10' }, _react2.default.createElement(_ExpandingTextArea2.default, { id: 'publish-description', className: 'textarea textarea--primary textarea--full-width', rows: 1, maxLength: 2000, style: { maxHeight: 200 }, name: 'description', placeholder: 'Optional description', value: this.props.description, onChange: this.handleInput }) ) ), _react2.default.createElement( 'div', { className: 'row row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--3 column--med-10' }, _react2.default.createElement( 'label', { htmlFor: 'publish-license', className: 'label' }, 'License:' ) ), _react2.default.createElement( 'div', { className: 'column column--7 column--sml-10' }, _react2.default.createElement( 'select', { type: 'text', name: 'license', id: 'publish-license', className: 'select select--primary', onChange: this.handleSelect }, _react2.default.createElement( 'option', { value: ' ' }, 'Unspecified' ), _react2.default.createElement( 'option', { value: 'Public Domain' }, 'Public Domain' ), _react2.default.createElement( 'option', { value: 'Creative Commons' }, 'Creative Commons' ) ) ) ), _react2.default.createElement( 'div', { className: 'row row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--3' }, _react2.default.createElement( 'label', { htmlFor: 'publish-nsfw', className: 'label' }, 'Mature:' ) ), _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement('input', { className: 'input-checkbox', type: 'checkbox', id: 'publish-nsfw', name: 'nsfw', value: this.props.nsfw, onChange: this.handleInput }) ) ) ), _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.toggleShowInputs }, this.props.showMetadataInputs ? 'less' : 'more' ) ); } }]); return PublishMetadataInputs; }(_react2.default.Component); exports.default = PublishMetadataInputs; /***/ }), /* 102 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(12); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ExpandingTextarea = function (_Component) { _inherits(ExpandingTextarea, _Component); function ExpandingTextarea(props) { _classCallCheck(this, ExpandingTextarea); var _this = _possibleConstructorReturn(this, (ExpandingTextarea.__proto__ || Object.getPrototypeOf(ExpandingTextarea)).call(this, props)); _this._handleChange = _this._handleChange.bind(_this); return _this; } _createClass(ExpandingTextarea, [{ key: 'componentDidMount', value: function componentDidMount() { this.adjustTextarea({}); } }, { key: '_handleChange', value: function _handleChange(event) { var onChange = this.props.onChange; if (onChange) onChange(event); this.adjustTextarea(event); } }, { key: 'adjustTextarea', value: function adjustTextarea(_ref) { var _ref$target = _ref.target, target = _ref$target === undefined ? this.el : _ref$target; target.style.height = 0; target.style.height = target.scrollHeight + 'px'; } }, { key: 'render', value: function render() { var _this2 = this; var rest = _objectWithoutProperties(this.props, []); return _react2.default.createElement('textarea', _extends({}, rest, { ref: function ref(x) { return _this2.el = x; }, onChange: this._handleChange })); } }]); return ExpandingTextarea; }(_react.Component); ExpandingTextarea.propTypes = { onChange: _propTypes2.default.func }; exports.default = ExpandingTextarea; /***/ }), /* 103 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(4); var _view = __webpack_require__(104); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, publish = _ref.publish; return { loggedInChannelName: channel.loggedInChannel.name, publishInChannel: publish.publishInChannel, selectedChannel: publish.selectedChannel, channelError: publish.error.channel }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onPublishInChannelChange: function onPublishInChannelChange(value) { dispatch((0, _publish.updateError)('channel', null)); dispatch((0, _publish.setPublishInChannel)(value)); }, onChannelSelect: function onChannelSelect(value) { dispatch((0, _publish.updateError)('channel', null)); dispatch((0, _publish.updateSelectedChannel)(value)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 104 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ChannelLoginForm = __webpack_require__(35); var _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm); var _ChannelCreateForm = __webpack_require__(36); var _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm); var _publish_channel_select_states = __webpack_require__(30); var states = _interopRequireWildcard(_publish_channel_select_states); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelSelect = function (_React$Component) { _inherits(ChannelSelect, _React$Component); function ChannelSelect(props) { _classCallCheck(this, ChannelSelect); var _this = _possibleConstructorReturn(this, (ChannelSelect.__proto__ || Object.getPrototypeOf(ChannelSelect)).call(this, props)); _this.toggleAnonymousPublish = _this.toggleAnonymousPublish.bind(_this); _this.handleSelection = _this.handleSelection.bind(_this); return _this; } _createClass(ChannelSelect, [{ key: 'toggleAnonymousPublish', value: function toggleAnonymousPublish(event) { var value = event.target.value; if (value === 'anonymous') { this.props.onPublishInChannelChange(false); } else { this.props.onPublishInChannelChange(true); } } }, { key: 'handleSelection', value: function handleSelection(event) { var selectedOption = event.target.selectedOptions[0].value; this.props.onChannelSelect(selectedOption); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement( 'form', null, _react2.default.createElement( 'div', { className: 'column column--3 column--med-10' }, _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'anonymous-radio', className: 'input-radio', value: 'anonymous', checked: !this.props.publishInChannel, onChange: this.toggleAnonymousPublish }), _react2.default.createElement( 'label', { className: 'label label--pointer', htmlFor: 'anonymous-radio' }, 'Anonymous' ) ), _react2.default.createElement( 'div', { className: 'column column--7 column--med-10' }, _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'channel-radio', className: 'input-radio', value: 'in a channel', checked: this.props.publishInChannel, onChange: this.toggleAnonymousPublish }), _react2.default.createElement( 'label', { className: 'label label--pointer', htmlFor: 'channel-radio' }, 'In a channel' ) ), this.props.channelError ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, this.props.channelError ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Publish anonymously or in a channel' ) ), this.props.publishInChannel && _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'column column--3' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'channel-name-select' }, 'Channel:' ) ), _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement( 'select', { type: 'text', id: 'channel-name-select', className: 'select select--arrow', value: this.props.selectedChannel, onChange: this.handleSelection }, this.props.loggedInChannelName && _react2.default.createElement( 'option', { value: this.props.loggedInChannelName, id: 'publish-channel-select-channel-option' }, this.props.loggedInChannelName ), _react2.default.createElement( 'option', { value: states.LOGIN }, 'Existing' ), _react2.default.createElement( 'option', { value: states.CREATE }, 'New' ) ) ), this.props.selectedChannel === states.LOGIN && _react2.default.createElement(_ChannelLoginForm2.default, null), this.props.selectedChannel === states.CREATE && _react2.default.createElement(_ChannelCreateForm2.default, null) ) ); } }]); return ChannelSelect; }(_react2.default.Component); exports.default = ChannelSelect; /***/ }), /* 105 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _request = __webpack_require__(13); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelLoginForm = function (_React$Component) { _inherits(ChannelLoginForm, _React$Component); function ChannelLoginForm(props) { _classCallCheck(this, ChannelLoginForm); var _this = _possibleConstructorReturn(this, (ChannelLoginForm.__proto__ || Object.getPrototypeOf(ChannelLoginForm)).call(this, props)); _this.state = { error: null, name: '', password: '' }; _this.handleInput = _this.handleInput.bind(_this); _this.loginToChannel = _this.loginToChannel.bind(_this); return _this; } _createClass(ChannelLoginForm, [{ key: 'handleInput', value: function handleInput(event) { var name = event.target.name; var value = event.target.value; this.setState(_defineProperty({}, name, value)); } }, { key: 'loginToChannel', value: function loginToChannel(event) { var _this2 = this; event.preventDefault(); var params = { method: 'POST', body: JSON.stringify({ username: this.state.name, password: this.state.password }), headers: new Headers({ 'Content-Type': 'application/json' }), credentials: 'include' }; (0, _request2.default)('login', params).then(function (_ref) { var success = _ref.success, channelName = _ref.channelName, shortChannelId = _ref.shortChannelId, channelClaimId = _ref.channelClaimId, message = _ref.message; if (success) { _this2.props.onChannelLogin(channelName, shortChannelId, channelClaimId); } else { _this2.setState({ 'error': message }); }; }).catch(function (error) { if (error.message) { _this2.setState({ 'error': error.message }); } else { _this2.setState({ 'error': error }); } }); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'form', { id: 'channel-login-form' }, _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'channel-login-name-input' }, 'Name:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary flex-container--row flex-container--left-bottom' }, _react2.default.createElement( 'span', null, '@' ), _react2.default.createElement('input', { type: 'text', id: 'channel-login-name-input', className: 'input-text', name: 'name', placeholder: 'Your Channel Name', value: this.state.channelName, onChange: this.handleInput }) ) ) ), _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'channel-login-password-input' }, 'Password:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary' }, _react2.default.createElement('input', { type: 'password', id: 'channel-login-password-input', name: 'password', className: 'input-text', placeholder: '', value: this.state.channelPassword, onChange: this.handleInput }) ) ) ), this.state.error ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, this.state.error ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Enter the name and password for your channel' ), _react2.default.createElement( 'div', { className: 'row row--wide' }, _react2.default.createElement( 'button', { className: 'button--primary', onClick: this.loginToChannel }, 'Authenticate' ) ) ); } }]); return ChannelLoginForm; }(_react2.default.Component); exports.default = ChannelLoginForm; /***/ }), /* 106 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ProgressBar = __webpack_require__(23); var _ProgressBar2 = _interopRequireDefault(_ProgressBar); var _request = __webpack_require__(13); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelCreateForm = function (_React$Component) { _inherits(ChannelCreateForm, _React$Component); function ChannelCreateForm(props) { _classCallCheck(this, ChannelCreateForm); var _this = _possibleConstructorReturn(this, (ChannelCreateForm.__proto__ || Object.getPrototypeOf(ChannelCreateForm)).call(this, props)); _this.state = { error: null, channel: '', password: '', status: null }; _this.handleChannelInput = _this.handleChannelInput.bind(_this); _this.handleInput = _this.handleInput.bind(_this); _this.createChannel = _this.createChannel.bind(_this); return _this; } _createClass(ChannelCreateForm, [{ key: 'cleanseChannelInput', value: function cleanseChannelInput(input) { input = input.replace(/\s+/g, '-'); // replace spaces with dashes input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-' return input; } }, { key: 'handleChannelInput', value: function handleChannelInput(event) { var value = event.target.value; value = this.cleanseChannelInput(value); this.setState({ channel: value }); if (value) { this.updateIsChannelAvailable(value); } else { this.setState({ error: 'Please enter a channel name' }); } } }, { key: 'handleInput', value: function handleInput(event) { var name = event.target.name; var value = event.target.value; this.setState(_defineProperty({}, name, value)); } }, { key: 'updateIsChannelAvailable', value: function updateIsChannelAvailable(channel) { var _this2 = this; var channelWithAtSymbol = '@' + channel; (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function () { _this2.setState({ 'error': null }); }).catch(function (error) { _this2.setState({ 'error': error.message }); }); } }, { key: 'checkIsChannelAvailable', value: function checkIsChannelAvailable(channel) { var channelWithAtSymbol = '@' + channel; return (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol); } }, { key: 'checkIsPasswordProvided', value: function checkIsPasswordProvided(password) { return new Promise(function (resolve, reject) { if (!password || password.length < 1) { return reject(new Error('Please provide a password')); } resolve(); }); } }, { key: 'makePublishChannelRequest', value: function makePublishChannelRequest(username, password) { var params = { method: 'POST', body: JSON.stringify({ username: username, password: password }), headers: new Headers({ 'Content-Type': 'application/json' }), credentials: 'include' }; return new Promise(function (resolve, reject) { (0, _request2.default)('/signup', params).then(function (result) { return resolve(result); }).catch(function (error) { reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ' + error.message)); }); }); } }, { key: 'createChannel', value: function createChannel(event) { var _this3 = this; event.preventDefault(); this.checkIsPasswordProvided(this.state.password).then(function () { return _this3.checkIsChannelAvailable(_this3.state.channel); }).then(function () { _this3.setState({ status: 'We are publishing your new channel. Sit tight...' }); return _this3.makePublishChannelRequest(_this3.state.channel, _this3.state.password); }).then(function (result) { _this3.setState({ status: null }); _this3.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId); }).catch(function (error) { if (error.message) { _this3.setState({ 'error': error.message, status: null }); } else { _this3.setState({ 'error': error, status: null }); }; }); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, !this.state.status ? _react2.default.createElement( 'form', { id: 'publish-channel-form' }, _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'new-channel-name' }, 'Name:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary flex-container--row flex-container--left-bottom span--relative' }, _react2.default.createElement( 'span', null, '@' ), _react2.default.createElement('input', { type: 'text', name: 'channel', id: 'new-channel-name', className: 'input-text', placeholder: 'exampleChannelName', value: this.state.channel, onChange: this.handleChannelInput }), this.state.channel && !this.state.error && _react2.default.createElement( 'span', { id: 'input-success-channel-name', className: 'info-message--success span--absolute' }, '\u2713' ), this.state.error && _react2.default.createElement( 'span', { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' }, '\u2716' ) ) ) ), _react2.default.createElement( 'div', { className: 'row row--wide row--short' }, _react2.default.createElement( 'div', { className: 'column column--3 column--sml-10' }, _react2.default.createElement( 'label', { className: 'label', htmlFor: 'new-channel-password' }, 'Password:' ) ), _react2.default.createElement( 'div', { className: 'column column--6 column--sml-10' }, _react2.default.createElement( 'div', { className: 'input-text--primary' }, _react2.default.createElement('input', { type: 'password', name: 'password', id: 'new-channel-password', className: 'input-text', placeholder: '', value: this.state.password, onChange: this.handleInput }) ) ) ), this.state.error ? _react2.default.createElement( 'p', { className: 'info-message--failure' }, this.state.error ) : _react2.default.createElement( 'p', { className: 'info-message' }, 'Choose a name and password for your channel' ), _react2.default.createElement( 'div', { className: 'row row--wide' }, _react2.default.createElement( 'button', { className: 'button--primary', onClick: this.createChannel }, 'Create Channel' ) ) ) : _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', { className: 'fine-print' }, this.state.status ), _react2.default.createElement(_ProgressBar2.default, { size: 12 }) ) ); } }]); return ChannelCreateForm; }(_react2.default.Component); exports.default = ChannelCreateForm; /***/ }), /* 107 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ActiveStatusBar = function ActiveStatusBar() { return _react2.default.createElement( 'span', { className: 'progress-bar progress-bar--active' }, '| ' ); }; exports.default = ActiveStatusBar; /***/ }), /* 108 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var InactiveStatusBar = function InactiveStatusBar() { return _react2.default.createElement( 'span', { className: 'progress-bar progress-bar--inactive' }, '| ' ); }; exports.default = InactiveStatusBar; /***/ }), /* 109 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _publish = __webpack_require__(4); var _view = __webpack_require__(110); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { status: publish.status.status, message: publish.status.message }; }; var mapDispatchToProps = { clearFile: _publish.clearFile }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 110 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ProgressBar = __webpack_require__(23); var _ProgressBar2 = _interopRequireDefault(_ProgressBar); var _publish_claim_states = __webpack_require__(111); var publishStates = _interopRequireWildcard(_publish_claim_states); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishStatus = function (_React$Component) { _inherits(PublishStatus, _React$Component); function PublishStatus() { _classCallCheck(this, PublishStatus); return _possibleConstructorReturn(this, (PublishStatus.__proto__ || Object.getPrototypeOf(PublishStatus)).apply(this, arguments)); } _createClass(PublishStatus, [{ key: 'render', value: function render() { var _props = this.props, status = _props.status, message = _props.message, clearFile = _props.clearFile; return _react2.default.createElement( 'div', { className: 'row row--tall flex-container--column flex-container--center-center' }, status === publishStates.LOAD_START && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'File is loading to server' ), _react2.default.createElement( 'p', { className: 'blue' }, '0%' ) ), status === publishStates.LOADING && _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'File is loading to server' ), _react2.default.createElement( 'p', { className: 'blue' }, message ) ) ), status === publishStates.PUBLISHING && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'Upload complete. Your file is now being published on the blockchain...' ), _react2.default.createElement(_ProgressBar2.default, { size: 12 }), _react2.default.createElement( 'p', null, 'Curious what magic is happening here? ', _react2.default.createElement( 'a', { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' }, 'Learn more.' ) ) ), status === publishStates.SUCCESS && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'Your publish is complete! You are being redirected to it now.' ), _react2.default.createElement( 'p', null, 'If you are not automatically redirected, ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: message }, 'click here.' ) ) ), status === publishStates.FAILED && _react2.default.createElement( 'div', { className: 'row align-content-center' }, _react2.default.createElement( 'p', null, 'Something went wrong...' ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'strong', null, message ) ), _react2.default.createElement( 'p', null, 'For help, post the above error text in the #speech channel on the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' }, 'lbry discord' ) ), _react2.default.createElement( 'button', { className: 'button--secondary', onClick: clearFile }, 'Reset' ) ) ); } }]); return PublishStatus; }(_react2.default.Component); ; exports.default = PublishStatus; /***/ }), /* 111 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOAD_START = exports.LOAD_START = 'LOAD_START'; var LOADING = exports.LOADING = 'LOADING'; var PUBLISHING = exports.PUBLISHING = 'PUBLISHING'; var SUCCESS = exports.SUCCESS = 'SUCCESS'; var FAILED = exports.FAILED = 'FAILED'; /***/ }), /* 112 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(113); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var publish = _ref.publish; return { message: publish.disabledMessage }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 113 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PublishDisabledMessage = function (_React$Component) { _inherits(PublishDisabledMessage, _React$Component); function PublishDisabledMessage() { _classCallCheck(this, PublishDisabledMessage); return _possibleConstructorReturn(this, (PublishDisabledMessage.__proto__ || Object.getPrototypeOf(PublishDisabledMessage)).apply(this, arguments)); } _createClass(PublishDisabledMessage, [{ key: 'render', value: function render() { var message = this.props.message; console.log('this.props.message:', message); return _react2.default.createElement( 'div', { className: 'row dropzone--disabled row--tall flex-container--column flex-container--center-center' }, _react2.default.createElement( 'p', { className: 'text--disabled' }, 'Publishing is currently disabled.' ), _react2.default.createElement( 'p', { className: 'text--disabled' }, message ) ); } }]); return PublishDisabledMessage; }(_react2.default.Component); exports.default = PublishDisabledMessage; /***/ }), /* 114 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _SEO = __webpack_require__(11); var _SEO2 = _interopRequireDefault(_SEO); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AboutPage = function (_React$Component) { _inherits(AboutPage, _React$Component); function AboutPage() { _classCallCheck(this, AboutPage); return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments)); } _createClass(AboutPage, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', { className: 'pull-quote' }, 'Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.' ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' }, 'TWITTER' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' }, 'GITHUB' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' }, 'DISCORD CHANNEL' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' }, 'DOCUMENTATION' ) ) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', null, 'Spee.ch is a media-hosting site that reads from and publishes content to the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://lbry.io' }, 'LBRY' ), ' blockchain.' ), _react2.default.createElement( 'p', null, 'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://lbry.io/get' }, 'LBRY' ), ' network. This means that your images are stored in multiple locations without a single point of failure.' ), _react2.default.createElement( 'h3', null, 'Contribute' ), _react2.default.createElement( 'p', null, 'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' }, 'github repo' ), ' and go to town!' ), _react2.default.createElement( 'p', null, 'If you want to improve spee.ch, join our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' }, 'discord channel' ), ' or solve one of our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' }, 'github issues' ), '.' ) ) ) ) ); } }]); return AboutPage; }(_react2.default.Component); ; exports.default = AboutPage; /***/ }), /* 115 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(116); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel; return { loggedInChannelName: channel.loggedInChannel.name }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 116 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(5); var _SEO = __webpack_require__(11); var _SEO2 = _interopRequireDefault(_SEO); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _ChannelLoginForm = __webpack_require__(35); var _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm); var _ChannelCreateForm = __webpack_require__(36); var _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var LoginPage = function (_React$Component) { _inherits(LoginPage, _React$Component); function LoginPage() { _classCallCheck(this, LoginPage); return _possibleConstructorReturn(this, (LoginPage.__proto__ || Object.getPrototypeOf(LoginPage)).apply(this, arguments)); } _createClass(LoginPage, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(newProps) { // re-route the user to the homepage if the user is logged in if (newProps.loggedInChannelName !== this.props.loggedInChannelName) { this.props.history.push('/'); } } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: 'Login', pageUri: 'login' }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', null, 'Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you\'re ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: '/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8' }, 'documenting important events' ), ', or making a public repository for ', _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: '/@catGifs' }, 'cat gifs' ), ' (password: \'1234\'), try creating a channel for it!' ) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'h3', { className: 'h3--no-bottom' }, 'Log in to an existing channel:' ), _react2.default.createElement(_ChannelLoginForm2.default, null), _react2.default.createElement( 'h3', { className: 'h3--no-bottom' }, 'Create a brand new channel:' ), _react2.default.createElement(_ChannelCreateForm2.default, null) ) ) ) ); } }]); return LoginPage; }(_react2.default.Component); ; exports.default = (0, _reactRouterDom.withRouter)(LoginPage); /***/ }), /* 117 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _show = __webpack_require__(8); var _view = __webpack_require__(118); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; return { error: show.request.error, requestType: show.request.type }; }; var mapDispatchToProps = { onHandleShowPageUri: _show.onHandleShowPageUri }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ErrorPage = __webpack_require__(24); var _ErrorPage2 = _interopRequireDefault(_ErrorPage); var _ShowAssetLite = __webpack_require__(119); var _ShowAssetLite2 = _interopRequireDefault(_ShowAssetLite); var _ShowAssetDetails = __webpack_require__(122); var _ShowAssetDetails2 = _interopRequireDefault(_ShowAssetDetails); var _ShowChannel = __webpack_require__(128); var _ShowChannel2 = _interopRequireDefault(_ShowChannel); var _show_request_types = __webpack_require__(37); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowPage = function (_React$Component) { _inherits(ShowPage, _React$Component); function ShowPage() { _classCallCheck(this, ShowPage); return _possibleConstructorReturn(this, (ShowPage.__proto__ || Object.getPrototypeOf(ShowPage)).apply(this, arguments)); } _createClass(ShowPage, [{ key: 'componentDidMount', value: function componentDidMount() { this.props.onHandleShowPageUri(this.props.match.params); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if (nextProps.match.params !== this.props.match.params) { this.props.onHandleShowPageUri(nextProps.match.params); } } }, { key: 'render', value: function render() { var _props = this.props, error = _props.error, requestType = _props.requestType; if (error) { return _react2.default.createElement(_ErrorPage2.default, { error: error }); } switch (requestType) { case _show_request_types.CHANNEL: return _react2.default.createElement(_ShowChannel2.default, null); case _show_request_types.ASSET_LITE: return _react2.default.createElement(_ShowAssetLite2.default, null); case _show_request_types.ASSET_DETAILS: return _react2.default.createElement(_ShowAssetDetails2.default, null); default: return _react2.default.createElement( 'p', null, 'loading...' ); } } }]); return ShowPage; }(_react2.default.Component); ; exports.default = ShowPage; /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(120); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select request info var requestId = show.request.id; // select asset info var asset = void 0; var request = show.requestList[requestId] || null; var assetList = show.assetList; if (request && assetList) { var assetKey = request.key; // note: just store this in the request asset = assetList[assetKey] || null; }; // return props return { asset: asset }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(11); var _SEO2 = _interopRequireDefault(_SEO); var _reactRouterDom = __webpack_require__(5); var _AssetDisplay = __webpack_require__(38); var _AssetDisplay2 = _interopRequireDefault(_AssetDisplay); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowLite = function (_React$Component) { _inherits(ShowLite, _React$Component); function ShowLite() { _classCallCheck(this, ShowLite); return _possibleConstructorReturn(this, (ShowLite.__proto__ || Object.getPrototypeOf(ShowLite)).apply(this, arguments)); } _createClass(ShowLite, [{ key: 'render', value: function render() { var asset = this.props.asset; if (asset) { var _asset$claimData = asset.claimData, name = _asset$claimData.name, claimId = _asset$claimData.claimId; return _react2.default.createElement( 'div', { className: 'row row--tall flex-container--column flex-container--center-center show-lite-container' }, _react2.default.createElement(_SEO2.default, { pageTitle: name, asset: asset }), _react2.default.createElement(_AssetDisplay2.default, null), _react2.default.createElement( _reactRouterDom.Link, { id: 'asset-boilerpate', className: 'link--primary fine-print', to: '/' + claimId + '/' + name }, 'hosted via Spee.ch' ) ); } return _react2.default.createElement( 'div', { className: 'row row--tall row--padded flex-container--column flex-container--center-center' }, _react2.default.createElement( 'p', null, 'loading asset data...' ) ); } }]); return ShowLite; }(_react2.default.Component); ; exports.default = ShowLite; /***/ }), /* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _ProgressBar = __webpack_require__(23); var _ProgressBar2 = _interopRequireDefault(_ProgressBar); var _asset_display_states = __webpack_require__(32); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AssetDisplay = function (_React$Component) { _inherits(AssetDisplay, _React$Component); function AssetDisplay() { _classCallCheck(this, AssetDisplay); return _possibleConstructorReturn(this, (AssetDisplay.__proto__ || Object.getPrototypeOf(AssetDisplay)).apply(this, arguments)); } _createClass(AssetDisplay, [{ key: 'componentDidMount', value: function componentDidMount() { var _props$asset$claimDat = this.props.asset.claimData, name = _props$asset$claimDat.name, claimId = _props$asset$claimDat.claimId; this.props.onFileRequest(name, claimId); } }, { key: 'render', value: function render() { var _props = this.props, status = _props.status, error = _props.error, _props$asset$claimDat2 = _props.asset.claimData, name = _props$asset$claimDat2.name, claimId = _props$asset$claimDat2.claimId, contentType = _props$asset$claimDat2.contentType, fileExt = _props$asset$claimDat2.fileExt, thumbnail = _props$asset$claimDat2.thumbnail; return _react2.default.createElement( 'div', { id: 'asset-display-component' }, status === _asset_display_states.LOCAL_CHECK && _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Checking to see if Spee.ch has your asset locally...' ) ), status === _asset_display_states.UNAVAILABLE && _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Sit tight, we\'re searching the LBRY blockchain for your asset!' ), _react2.default.createElement(_ProgressBar2.default, { size: 12 }), _react2.default.createElement( 'p', null, 'Curious what magic is happening here? ', _react2.default.createElement( 'a', { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' }, 'Learn more.' ) ) ), status === _asset_display_states.ERROR && _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Unfortunately, we couldn\'t download your asset from LBRY. You can help us out by sharing the below error message in the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' }, 'LBRY discord' ), '.' ), _react2.default.createElement( 'i', null, _react2.default.createElement( 'p', { id: 'error-message' }, error ) ) ), status === _asset_display_states.AVAILABLE && function () { switch (contentType) { case 'image/jpeg': case 'image/jpg': case 'image/png': return _react2.default.createElement('img', { className: 'asset', src: '/' + claimId + '/' + name + '.' + fileExt, alt: name }); case 'image/gif': return _react2.default.createElement('img', { className: 'asset', src: '/' + claimId + '/' + name + '.' + fileExt, alt: name }); case 'video/mp4': return _react2.default.createElement( 'video', { className: 'asset video', controls: true, poster: thumbnail }, _react2.default.createElement('source', { src: '/' + claimId + '/' + name + '.' + fileExt }), _react2.default.createElement( 'p', null, 'Your browser does not support the ', _react2.default.createElement( 'code', null, 'video' ), ' element.' ) ); default: return _react2.default.createElement( 'p', null, 'Unsupported file type' ); } }() ); } }]); return AssetDisplay; }(_react2.default.Component); ; exports.default = AssetDisplay; /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(123); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select request info var requestId = show.request.id; // select asset info var asset = void 0; var request = show.requestList[requestId] || null; var assetList = show.assetList; if (request && assetList) { var assetKey = request.key; // note: just store this in the request asset = assetList[assetKey] || null; }; // return props return { asset: asset }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 123 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(11); var _SEO2 = _interopRequireDefault(_SEO); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _ErrorPage = __webpack_require__(24); var _ErrorPage2 = _interopRequireDefault(_ErrorPage); var _AssetTitle = __webpack_require__(124); var _AssetTitle2 = _interopRequireDefault(_AssetTitle); var _AssetDisplay = __webpack_require__(38); var _AssetDisplay2 = _interopRequireDefault(_AssetDisplay); var _AssetInfo = __webpack_require__(126); var _AssetInfo2 = _interopRequireDefault(_AssetInfo); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowAssetDetails = function (_React$Component) { _inherits(ShowAssetDetails, _React$Component); function ShowAssetDetails() { _classCallCheck(this, ShowAssetDetails); return _possibleConstructorReturn(this, (ShowAssetDetails.__proto__ || Object.getPrototypeOf(ShowAssetDetails)).apply(this, arguments)); } _createClass(ShowAssetDetails, [{ key: 'render', value: function render() { var asset = this.props.asset; if (asset) { var name = asset.claimData.name; return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: name + ' - details', asset: asset }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--tall row--padded' }, _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement(_AssetTitle2.default, null) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'row row--padded show-details-container' }, _react2.default.createElement(_AssetDisplay2.default, null) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--sml-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement(_AssetInfo2.default, null) ) ) ) ); }; return _react2.default.createElement(_ErrorPage2.default, { error: 'loading asset data...' }); } }]); return ShowAssetDetails; }(_react2.default.Component); ; exports.default = ShowAssetDetails; /***/ }), /* 124 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(125); var _view2 = _interopRequireDefault(_view); var _show = __webpack_require__(16); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; var _selectAsset = (0, _show.selectAsset)(show), title = _selectAsset.claimData.title; return { title: title }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var AssetTitle = function AssetTitle(_ref) { var title = _ref.title; return _react2.default.createElement( 'div', null, _react2.default.createElement( 'span', { className: 'text--large' }, title ) ); }; exports.default = AssetTitle; /***/ }), /* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(127); var _view2 = _interopRequireDefault(_view); var _show = __webpack_require__(16); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select asset var asset = (0, _show.selectAsset)(show); // return props return { asset: asset }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AssetInfo = function (_React$Component) { _inherits(AssetInfo, _React$Component); function AssetInfo(props) { _classCallCheck(this, AssetInfo); var _this = _possibleConstructorReturn(this, (AssetInfo.__proto__ || Object.getPrototypeOf(AssetInfo)).call(this, props)); _this.copyToClipboard = _this.copyToClipboard.bind(_this); return _this; } _createClass(AssetInfo, [{ key: 'copyToClipboard', value: function copyToClipboard(event) { var elementToCopy = event.target.dataset.elementtocopy; var element = document.getElementById(elementToCopy); element.select(); try { document.execCommand('copy'); } catch (err) { this.setState({ error: 'Oops, unable to copy' }); } } }, { key: 'render', value: function render() { var _props$asset = this.props.asset, shortId = _props$asset.shortId, _props$asset$claimDat = _props$asset.claimData, channelName = _props$asset$claimDat.channelName, certificateId = _props$asset$claimDat.certificateId, description = _props$asset$claimDat.description, name = _props$asset$claimDat.name, claimId = _props$asset$claimDat.claimId, fileExt = _props$asset$claimDat.fileExt, contentType = _props$asset$claimDat.contentType, thumbnail = _props$asset$claimDat.thumbnail, host = _props$asset$claimDat.host; return _react2.default.createElement( 'div', null, channelName && _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Channel:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, _react2.default.createElement( _reactRouterDom.Link, { to: '/' + channelName + ':' + certificateId }, channelName ) ) ) ), description && _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'span', { className: 'text' }, description ) ), _react2.default.createElement( 'div', { id: 'show-share-buttons' }, _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Share:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'div', { className: 'row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap' }, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://twitter.com/intent/tweet?text=' + host + '/' + shortId + '/' + name }, 'twitter' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?u=' + host + '/' + shortId + '/' + name }, 'facebook' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'http://tumblr.com/widgets/share/tool?canonicalUrl=' + host + '/' + shortId + '/' + name }, 'tumblr' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://www.reddit.com/submit?url=' + host + '/' + shortId + '/' + name + '&title=' + name }, 'reddit' ) ) ) ) ), _react2.default.createElement( 'div', { className: 'row row--padded row--wide row--no-top' }, _react2.default.createElement( 'div', { id: 'show-short-link' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Link:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'div', { className: 'row row--short row--wide' }, _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement( 'div', { className: 'input-error', id: 'input-error-copy-short-link', hidden: 'true' }, 'error here' ), _react2.default.createElement('input', { type: 'text', id: 'short-link', className: 'input-disabled input-text--full-width', readOnly: true, spellCheck: 'false', value: host + '/' + shortId + '/' + name + '.' + fileExt, onClick: this.select }) ), _react2.default.createElement('div', { className: 'column column--1' }), _react2.default.createElement( 'div', { className: 'column column--2' }, _react2.default.createElement( 'button', { className: 'button--primary button--wide', 'data-elementtocopy': 'short-link', onClick: this.copyToClipboard }, 'copy' ) ) ) ) ), _react2.default.createElement( 'div', { id: 'show-embed-code' }, _react2.default.createElement( 'div', { className: 'column column--2 column--med-10' }, _react2.default.createElement( 'span', { className: 'text' }, 'Embed:' ) ), _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'div', { className: 'row row--short row--wide' }, _react2.default.createElement( 'div', { className: 'column column--7' }, _react2.default.createElement( 'div', { className: 'input-error', id: 'input-error-copy-embed-text', hidden: 'true' }, 'error here' ), contentType === 'video/mp4' ? _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true, onClick: this.select, spellCheck: 'false', value: '' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true, onClick: this.select, spellCheck: 'false', value: '' }) ), _react2.default.createElement('div', { className: 'column column--1' }), _react2.default.createElement( 'div', { className: 'column column--2' }, _react2.default.createElement( 'button', { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text', onClick: this.copyToClipboard }, 'copy' ) ) ) ) ) ), _react2.default.createElement( 'div', { className: 'flex-container--row flex-container--space-between-bottom' }, _react2.default.createElement( _reactRouterDom.Link, { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt }, _react2.default.createElement( 'span', { className: 'text' }, 'Direct Link' ) ), _react2.default.createElement( 'a', { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name }, 'Download' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' }, 'Report' ) ) ); } }]); return AssetInfo; }(_react2.default.Component); ; exports.default = AssetInfo; /***/ }), /* 128 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(129); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select request info var requestId = show.request.id; // select request var previousRequest = show.requestList[requestId] || null; // select channel var channel = void 0; if (previousRequest) { var channelKey = previousRequest.key; channel = show.channelList[channelKey] || null; } return { channel: channel }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 129 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(11); var _SEO2 = _interopRequireDefault(_SEO); var _ErrorPage = __webpack_require__(24); var _ErrorPage2 = _interopRequireDefault(_ErrorPage); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _ChannelClaimsDisplay = __webpack_require__(130); var _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowChannel = function (_React$Component) { _inherits(ShowChannel, _React$Component); function ShowChannel() { _classCallCheck(this, ShowChannel); return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments)); } _createClass(ShowChannel, [{ key: 'render', value: function render() { var channel = this.props.channel; if (channel) { var name = channel.name, longId = channel.longId, shortId = channel.shortId; return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--tall row--padded' }, _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement( 'h2', null, 'channel name: ', name ), _react2.default.createElement( 'p', { className: 'fine-print' }, 'full channel id: ', longId ), _react2.default.createElement( 'p', { className: 'fine-print' }, 'short channel id: ', shortId ) ), _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement(_ChannelClaimsDisplay2.default, null) ) ) ); }; return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' }); } }]); return ShowChannel; }(_react2.default.Component); ; exports.default = ShowChannel; /***/ }), /* 130 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _show = __webpack_require__(8); var _view = __webpack_require__(131); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select channel key var request = show.requestList[show.request.id]; var channelKey = request.key; // select channel claims var channel = show.channelList[channelKey] || null; // return props return { channelKey: channelKey, channel: channel }; }; var mapDispatchToProps = { onUpdateChannelClaims: _show.onUpdateChannelClaims }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 131 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _AssetPreview = __webpack_require__(132); var _AssetPreview2 = _interopRequireDefault(_AssetPreview); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelClaimsDisplay = function (_React$Component) { _inherits(ChannelClaimsDisplay, _React$Component); function ChannelClaimsDisplay(props) { _classCallCheck(this, ChannelClaimsDisplay); var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props)); _this.showNextResultsPage = _this.showNextResultsPage.bind(_this); _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this); return _this; } _createClass(ChannelClaimsDisplay, [{ key: 'showPreviousResultsPage', value: function showPreviousResultsPage() { var currentPage = this.props.channel.claimsData.currentPage; var previousPage = parseInt(currentPage) - 1; this.showNewPage(previousPage); } }, { key: 'showNextResultsPage', value: function showNextResultsPage() { var currentPage = this.props.channel.claimsData.currentPage; var nextPage = parseInt(currentPage) + 1; this.showNewPage(nextPage); } }, { key: 'showNewPage', value: function showNewPage(page) { var _props = this.props, channelKey = _props.channelKey, _props$channel = _props.channel, name = _props$channel.name, longId = _props$channel.longId; this.props.onUpdateChannelClaims(channelKey, name, longId, page); } }, { key: 'render', value: function render() { var _props$channel$claims = this.props.channel.claimsData, claims = _props$channel$claims.claims, currentPage = _props$channel$claims.currentPage, totalPages = _props$channel$claims.totalPages; return _react2.default.createElement( 'div', { className: 'row row--tall' }, claims.length > 0 ? _react2.default.createElement( 'div', null, claims.map(function (claim, index) { return _react2.default.createElement(_AssetPreview2.default, { claimData: claim, key: claim.name + '-' + index }); }), _react2.default.createElement( 'div', null, currentPage > 1 && _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.showPreviousResultsPage }, 'Previous Page' ), currentPage < totalPages && _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.showNextResultsPage }, 'Next Page' ) ) ) : _react2.default.createElement( 'p', null, 'There are no claims in this channel' ) ); } }]); return ChannelClaimsDisplay; }(_react2.default.Component); ; exports.default = ChannelClaimsDisplay; /***/ }), /* 132 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(133); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var defaultThumbnail = _ref.site.defaults.defaultThumbnail; return { defaultThumbnail: defaultThumbnail }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 133 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(5); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var AssetPreview = function AssetPreview(_ref) { var defaultThumbnail = _ref.defaultThumbnail, _ref$claimData = _ref.claimData, name = _ref$claimData.name, claimId = _ref$claimData.claimId, fileExt = _ref$claimData.fileExt, contentType = _ref$claimData.contentType, thumbnail = _ref$claimData.thumbnail; var directSourceLink = claimId + '/' + name + '.' + fileExt; var showUrlLink = '/' + claimId + '/' + name; return _react2.default.createElement( 'div', { className: 'asset-holder' }, _react2.default.createElement( _reactRouterDom.Link, { to: showUrlLink }, function () { switch (contentType) { case 'image/jpeg': case 'image/jpg': case 'image/png': case 'image/gif': return _react2.default.createElement('img', { className: 'asset-preview', src: directSourceLink, alt: name }); case 'video/mp4': return _react2.default.createElement('img', { className: 'asset-preview video', src: thumbnail || defaultThumbnail, alt: name }); default: return _react2.default.createElement( 'p', null, 'unsupported file type' ); } }() ) ); }; exports.default = AssetPreview; /***/ }), /* 134 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(1); var _view = __webpack_require__(135); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var _ref$site = _ref.site, host = _ref$site.host, title = _ref$site.title; return { host: host, title: title }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 135 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _NavBar = __webpack_require__(7); var _NavBar2 = _interopRequireDefault(_NavBar); var _reactHelmet = __webpack_require__(21); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var FourOhForPage = function (_React$Component) { _inherits(FourOhForPage, _React$Component); function FourOhForPage() { _classCallCheck(this, FourOhForPage); return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments)); } _createClass(FourOhForPage, [{ key: 'render', value: function render() { var _props = this.props, title = _props.title, host = _props.host; return _react2.default.createElement( 'div', null, _react2.default.createElement( _reactHelmet2.default, null, _react2.default.createElement( 'title', null, title, ' - 404' ), _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' }) ), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'h2', null, '404' ), _react2.default.createElement( 'p', null, 'That page does not exist' ) ) ); } }]); return FourOhForPage; }(_react2.default.Component); ; exports.default = FourOhForPage; /***/ }), /* 136 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (helmet, html, preloadedState) { // take the html and preloadedState and return the full page return '\n \n \n \n \n \n \n \n ' + helmet.title.toString() + '\n ' + helmet.meta.toString() + '\n ' + helmet.link.toString() + '\n \n \n \n \n \n \n \n \n
\n
' + html + '
\n
\n \n \n \n \n '; }; /***/ }), /* 137 */ /***/ (function(module, exports) { module.exports = require("redux-saga"); /***/ }), /* 138 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleShowPageUri = handleShowPageUri; exports.watchHandleShowPageUri = watchHandleShowPageUri; var _effects = __webpack_require__(18); var _show_action_types = __webpack_require__(15); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(8); var _show_asset = __webpack_require__(139); var _show_channel = __webpack_require__(141); var _lbryUri = __webpack_require__(143); var _lbryUri2 = _interopRequireDefault(_lbryUri); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly), _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri), _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri); function parseAndUpdateIdentifierAndClaim(modifier, claim) { var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim; return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: // this is a request for an asset // claim will be an asset claim // the identifier could be a channel or a claim id isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0; _context.prev = 1; _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier); isChannel = _lbryUri$parseIdentif.isChannel; channelName = _lbryUri$parseIdentif.channelName; channelClaimId = _lbryUri$parseIdentif.channelClaimId; claimId = _lbryUri$parseIdentif.claimId; _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim); claimName = _lbryUri$parseClaim.claimName; extension = _lbryUri$parseClaim.extension; _context.next = 17; break; case 12: _context.prev = 12; _context.t0 = _context['catch'](1); _context.next = 16; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 16: return _context.abrupt('return', _context.sent); case 17: if (!isChannel) { _context.next = 21; break; } _context.next = 20; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension)); case 20: return _context.abrupt('return', _context.sent); case 21: ; _context.next = 24; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension)); case 24: case 'end': return _context.stop(); } } }, _marked, this, [[1, 12]]); } function parseAndUpdateClaimOnly(claim) { var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2; return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: // this could be a request for an asset or a channel page // claim could be an asset claim or a channel claim isChannel = void 0, channelName = void 0, channelClaimId = void 0; _context2.prev = 1; _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim); isChannel = _lbryUri$parseIdentif2.isChannel; channelName = _lbryUri$parseIdentif2.channelName; channelClaimId = _lbryUri$parseIdentif2.channelClaimId; _context2.next = 13; break; case 8: _context2.prev = 8; _context2.t0 = _context2['catch'](1); _context2.next = 12; return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message)); case 12: return _context2.abrupt('return', _context2.sent); case 13: if (!isChannel) { _context2.next = 17; break; } _context2.next = 16; return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId)); case 16: return _context2.abrupt('return', _context2.sent); case 17: // if not for a channel, parse the claim request claimName = void 0, extension = void 0; _context2.prev = 18; _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim); claimName = _lbryUri$parseClaim2.claimName; extension = _lbryUri$parseClaim2.extension; _context2.next = 29; break; case 24: _context2.prev = 24; _context2.t1 = _context2['catch'](18); _context2.next = 28; return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message)); case 28: return _context2.abrupt('return', _context2.sent); case 29: _context2.next = 31; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension)); case 31: case 'end': return _context2.stop(); } } }, _marked2, this, [[1, 8], [18, 24]]); } function handleShowPageUri(action) { var _action$data, identifier, claim; return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim; if (!identifier) { _context3.next = 5; break; } _context3.next = 4; return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim); case 4: return _context3.abrupt('return', _context3.sent); case 5: _context3.next = 7; return (0, _effects.call)(parseAndUpdateClaimOnly, claim); case 7: case 'end': return _context3.stop(); } } }, _marked3, this); }; function watchHandleShowPageUri() { return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri); case 2: case 'end': return _context4.stop(); } } }, _marked4, this); }; /***/ }), /* 139 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.newAssetRequest = newAssetRequest; exports.watchNewAssetRequest = watchNewAssetRequest; var _effects = __webpack_require__(18); var _show_action_types = __webpack_require__(15); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(8); var _assetApi = __webpack_require__(140); var _show2 = __webpack_require__(16); var _site = __webpack_require__(39); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest); function newAssetRequest(action) { var _action$data, requestType, requestId, name, modifier, state, host, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3; return regeneratorRuntime.wrap(function newAssetRequest$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier; // put an action to update the request in redux _context.next = 3; return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); case 3: _context.next = 5; return (0, _effects.select)(_show2.selectShowState); case 5: state = _context.sent; _context.next = 8; return (0, _effects.select)(_site.selectSiteHost); case 8: host = _context.sent; if (!state.requestList[requestId]) { _context.next = 11; break; } return _context.abrupt('return', null); case 11: // get long id && add request to request list longId = void 0; _context.prev = 12; _context.next = 15; return (0, _effects.call)(_assetApi.getLongClaimId, host, name, modifier); case 15: _ref = _context.sent; longId = _ref.data; _context.next = 24; break; case 19: _context.prev = 19; _context.t0 = _context['catch'](12); _context.next = 23; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 23: return _context.abrupt('return', _context.sent); case 24: assetKey = 'a#' + name + '#' + longId; _context.next = 27; return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey)); case 27: if (!state.assetList[assetKey]) { _context.next = 29; break; } return _context.abrupt('return', null); case 29: // get short Id shortId = void 0; _context.prev = 30; _context.next = 33; return (0, _effects.call)(_assetApi.getShortId, host, name, longId); case 33: _ref2 = _context.sent; shortId = _ref2.data; _context.next = 42; break; case 37: _context.prev = 37; _context.t1 = _context['catch'](30); _context.next = 41; return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); case 41: return _context.abrupt('return', _context.sent); case 42: // get asset claim data claimData = void 0; _context.prev = 43; _context.next = 46; return (0, _effects.call)(_assetApi.getClaimData, host, name, longId); case 46: _ref3 = _context.sent; claimData = _ref3.data; _context.next = 55; break; case 50: _context.prev = 50; _context.t2 = _context['catch'](43); _context.next = 54; return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message)); case 54: return _context.abrupt('return', _context.sent); case 55: _context.next = 57; return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData)); case 57: _context.next = 59; return (0, _effects.put)((0, _show.onRequestError)(null)); case 59: case 'end': return _context.stop(); } } }, _marked, this, [[12, 19], [30, 37], [43, 50]]); }; function watchNewAssetRequest() { return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest); case 2: case 'end': return _context2.stop(); } } }, _marked2, this); }; /***/ }), /* 140 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getLongClaimId = getLongClaimId; exports.getShortId = getShortId; exports.getClaimData = getClaimData; var _request = __webpack_require__(13); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getLongClaimId(host, name, modifier) { var body = {}; // create request params if (modifier) { if (modifier.id) { body['claimId'] = modifier.id; } else { body['channelName'] = modifier.channel.name; body['channelClaimId'] = modifier.channel.id; } } body['claimName'] = name; var params = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }; // create url var url = host + '/api/claim/long-id'; // return the request promise return (0, _request2.default)(url, params); }; function getShortId(host, name, claimId) { var url = host + '/api/claim/short-id/' + claimId + '/' + name; return (0, _request2.default)(url); }; function getClaimData(host, name, claimId) { var url = host + '/api/claim/data/' + name + '/' + claimId; return (0, _request2.default)(url); }; /***/ }), /* 141 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.newChannelRequest = newChannelRequest; exports.watchNewChannelRequest = watchNewChannelRequest; exports.watchUpdateChannelClaims = watchUpdateChannelClaims; var _effects = __webpack_require__(18); var _show_action_types = __webpack_require__(15); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(8); var _channelApi = __webpack_require__(142); var _show2 = __webpack_require__(16); var _site = __webpack_require__(39); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest), _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel), _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims); function newChannelRequest(action) { var _action$data, requestType, requestId, channelName, channelId, state, host, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2; return regeneratorRuntime.wrap(function newChannelRequest$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId; // put an action to update the request in redux _context.next = 3; return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); case 3: _context.next = 5; return (0, _effects.select)(_show2.selectShowState); case 5: state = _context.sent; _context.next = 8; return (0, _effects.select)(_site.selectSiteHost); case 8: host = _context.sent; if (!state.requestList[requestId]) { _context.next = 11; break; } return _context.abrupt('return', null); case 11: // get channel long id longId = void 0, shortId = void 0; _context.prev = 12; _context.next = 15; return (0, _effects.call)(_channelApi.getChannelData, host, channelName, channelId); case 15: _ref = _context.sent; _ref$data = _ref.data; longId = _ref$data.longChannelClaimId; shortId = _ref$data.shortChannelClaimId; _context.next = 26; break; case 21: _context.prev = 21; _context.t0 = _context['catch'](12); _context.next = 25; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 25: return _context.abrupt('return', _context.sent); case 26: // store the request in the channel requests list channelKey = 'c#' + channelName + '#' + longId; _context.next = 29; return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey)); case 29: if (!state.channelList[channelKey]) { _context.next = 31; break; } return _context.abrupt('return', null); case 31: // get channel claims data claimsData = void 0; _context.prev = 32; _context.next = 35; return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, channelName, 1); case 35: _ref2 = _context.sent; claimsData = _ref2.data; _context.next = 44; break; case 39: _context.prev = 39; _context.t1 = _context['catch'](32); _context.next = 43; return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); case 43: return _context.abrupt('return', _context.sent); case 44: _context.next = 46; return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData)); case 46: _context.next = 48; return (0, _effects.put)((0, _show.onRequestError)(null)); case 48: case 'end': return _context.stop(); } } }, _marked, this, [[12, 21], [32, 39]]); } function watchNewChannelRequest() { return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest); case 2: case 'end': return _context2.stop(); } } }, _marked2, this); }; function getNewClaimsAndUpdateChannel(action) { var _action$data2, channelKey, name, longId, page, host, claimsData, _ref3; return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page; _context3.next = 3; return (0, _effects.select)(_site.selectSiteHost); case 3: host = _context3.sent; claimsData = void 0; _context3.prev = 5; _context3.next = 8; return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, name, page); case 8: _ref3 = _context3.sent; claimsData = _ref3.data; _context3.next = 17; break; case 12: _context3.prev = 12; _context3.t0 = _context3['catch'](5); _context3.next = 16; return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message)); case 16: return _context3.abrupt('return', _context3.sent); case 17: _context3.next = 19; return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData)); case 19: case 'end': return _context3.stop(); } } }, _marked3, this, [[5, 12]]); } function watchUpdateChannelClaims() { return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel); case 2: case 'end': return _context4.stop(); } } }, _marked4, this); } /***/ }), /* 142 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getChannelData = getChannelData; exports.getChannelClaims = getChannelClaims; var _request = __webpack_require__(13); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getChannelData(host, id, name) { if (!id) id = 'none'; var url = host + '/api/channel/data/' + name + '/' + id; return (0, _request2.default)(url); }; function getChannelClaims(host, longId, name, page) { if (!page) page = 1; var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page; return (0, _request2.default)(url); }; /***/ }), /* 143 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); module.exports = { REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, CHANNEL_CHAR: '@', parseIdentifier: function parseIdentifier(identifier) { var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars .exec(identifier).map(function (match) { return match || null; }), _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), proto = _componentsRegex$exec2[0], value = _componentsRegex$exec2[1], modifierSeperator = _componentsRegex$exec2[2], modifier = _componentsRegex$exec2[3]; // Validate and process name if (!value) { throw new Error('Check your URL. No channel name provided before "' + modifierSeperator + '"'); } var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); var channelName = isChannel ? value : null; var claimId = void 0; if (isChannel) { if (!channelName) { throw new Error('Check your URL. No channel name after "@".'); } var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); if (nameBadChars) { throw new Error('Check your URL. Invalid characters in channel name: "' + nameBadChars.join(', ') + '".'); } } else { claimId = value; } // Validate and process modifier var channelClaimId = void 0; if (modifierSeperator) { if (!modifier) { throw new Error('Check your URL. No modifier provided after separator "' + modifierSeperator + '"'); } if (modifierSeperator === ':') { channelClaimId = modifier; } else { throw new Error('Check your URL. The "' + modifierSeperator + '" modifier is not currently supported'); } } return { isChannel: isChannel, channelName: channelName, channelClaimId: channelClaimId || null, claimId: claimId || null }; }, parseClaim: function parseClaim(name) { var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension) '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end) ); var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars .exec(name).map(function (match) { return match || null; }), _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), proto = _componentsRegex$exec4[0], claimName = _componentsRegex$exec4[1], extensionSeperator = _componentsRegex$exec4[2], extension = _componentsRegex$exec4[3]; // Validate and process name if (!claimName) { throw new Error('Check your URL. No claim name provided before "."'); } var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); if (nameBadChars) { throw new Error('Check your URL. Invalid characters in claim name: "' + nameBadChars.join(', ') + '".'); } // Validate and process extension if (extensionSeperator) { if (!extension) { throw new Error('Check your URL. No file extension provided after separator "' + extensionSeperator + '".'); } if (extensionSeperator !== '.') { throw new Error('Check your URL. The "' + extensionSeperator + '" separator is not supported in the claim name.'); } } return { claimName: claimName, extension: extension || null }; } }; /***/ }), /* 144 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _require = __webpack_require__(10), sendGAServeEvent = _require.sendGAServeEvent; var _require2 = __webpack_require__(25), determineResponseType = _require2.determineResponseType, flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility, logRequestData = _require2.logRequestData, getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset; var lbryUri = __webpack_require__(26); var handleShowRender = __webpack_require__(27); var SERVE = 'SERVE'; /* route to serve an asset or the react app via the claim name and an identifier */ var identifierClaim = function identifierClaim() { return function (req, res) { var headers = req.headers, ip = req.ip, originalUrl = req.originalUrl, params = req.params; // decide if this is a show request var hasFileExtension = void 0; try { var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim); hasFileExtension = _lbryUri$parseModifie.hasFileExtension; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } var responseType = determineResponseType(hasFileExtension, headers); if (responseType !== SERVE) { return handleShowRender(req, res); } // handle serve request // send google analytics sendGAServeEvent(headers, ip, originalUrl); // parse the claim var claimName = void 0; try { var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim); claimName = _lbryUri$parseClaim.claimName; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // parse the identifier var isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0; try { var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier); isChannel = _lbryUri$parseIdentif.isChannel; channelName = _lbryUri$parseIdentif.channelName; channelClaimId = _lbryUri$parseIdentif.channelClaimId; claimId = _lbryUri$parseIdentif.claimId; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } if (!isChannel) { var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName); var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2); claimId = _flipClaimNameAndIdFo2[0]; claimName = _flipClaimNameAndIdFo2[1]; } // log the request data for debugging logRequestData(responseType, claimName, channelName, claimId); // get the claim Id and then serve the asset getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res); }; }; module.exports = identifierClaim; /***/ }), /* 145 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var signup = __webpack_require__(146); var login = __webpack_require__(147); var logout = __webpack_require__(148); var user = __webpack_require__(149); module.exports = { signup: signup, login: login, logout: logout, user: user }; /***/ }), /* 146 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var signup = function signup() { return function (req, res) { res.status(200).json({ success: true, channelName: req.user.channelName, channelClaimId: req.user.channelClaimId, shortChannelId: req.user.shortChannelId }); }; }; module.exports = signup; /***/ }), /* 147 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var login = function login(passport) { return function (req, res, next) { passport.authenticate('local-login', function (err, user, info) { if (err) { return next(err); } if (!user) { return res.status(400).json({ success: false, message: info.message }); } req.logIn(user, function (err) { if (err) { return next(err); } return res.status(200).json({ success: true, channelName: req.user.channelName, channelClaimId: req.user.channelClaimId, shortChannelId: req.user.shortChannelId }); }); })(req, res, next); }; }; module.exports = login; /***/ }), /* 148 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logout = function logout() { return function (req, res) { req.logout(); res.status(200).json({ success: true, message: 'you successfully logged out' }); }; }; module.exports = logout; /***/ }), /* 149 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var user = function user() { return function (req, res) { if (req.user) { res.status(200).json({ success: true, data: req.user }); } else { res.status(401).json({ success: false, message: 'user is not logged in' }); } }; }; module.exports = user; /***/ }), /* 150 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); function LoggerConfig() { var _this = this; this.logLevel = 'debug'; this.configure = function (config) { if (!config) { return console.log('No logger config received.'); } console.log('configuring winston logger...'); // update values with local config params var logLevel = config.logLevel; _this.logLevel = logLevel; // configure the winston logger logger.configure({ transports: [new logger.transports.Console({ level: _this.logLevel, timestamp: false, colorize: true, prettyPrint: true, handleExceptions: true, humanReadableUnhandledException: true })] }); // test all the log levels console.log('testing winston log levels...'); logger.error('Level 0'); logger.warn('Level 1'); logger.info('Level 2'); logger.verbose('Level 3'); logger.debug('Level 4'); logger.silly('Level 5'); }; }; module.exports = new LoggerConfig(); /***/ }), /* 151 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var winstonSlackWebHook = __webpack_require__(152).SlackWebHook; var winston = __webpack_require__(2); function SlackConfig() { var _this = this; this.slackWebHook = 'default'; this.slackErrorChannel = 'default'; this.slackInfoChannel = 'default'; this.configure = function (config) { if (!config) { return console.log('no slack config received'); } // update variables console.log('configuring slack logger...'); var slackWebHook = config.slackWebHook, slackErrorChannel = config.slackErrorChannel, slackInfoChannel = config.slackInfoChannel; _this.slackWebHook = slackWebHook; _this.slackErrorChannel = slackErrorChannel; _this.slackInfoChannel = slackInfoChannel; // update slack webhook settings if (_this.slackWebHook) { // add a transport for errors to slack if (_this.slackErrorChannel) { winston.add(winstonSlackWebHook, { name: 'slack-errors-transport', level: 'warn', webhookUrl: _this.slackWebHook, channel: _this.slackErrorChannel, username: 'spee.ch', iconEmoji: ':face_with_head_bandage:' }); }; if (slackInfoChannel) { winston.add(winstonSlackWebHook, { name: 'slack-info-transport', level: 'info', webhookUrl: _this.slackWebHook, channel: _this.slackInfoChannel, username: 'spee.ch', iconEmoji: ':nerd_face:' }); }; // send test messages console.log('testing slack logger...'); winston.error('Slack "error" logging is online.'); winston.info('Slack "info" logging is online.'); } else { winston.warn('Slack logging is not enabled because no slackWebHook config var provided.'); } }; }; module.exports = new SlackConfig(); /***/ }), /* 152 */ /***/ (function(module, exports) { module.exports = require("winston-slack-webhook"); /***/ }), /* 153 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var passport = __webpack_require__(154); var localLoginStrategy = __webpack_require__(155); var localSignupStrategy = __webpack_require__(156); var _require = __webpack_require__(157), serializeSpeechUser = _require.serializeSpeechUser, deserializeSpeechUser = _require.deserializeSpeechUser; passport.deserializeUser(deserializeSpeechUser); passport.serializeUser(serializeSpeechUser); passport.use('local-login', localLoginStrategy); passport.use('local-signup', localSignupStrategy); module.exports = passport; /***/ }), /* 154 */ /***/ (function(module, exports) { module.exports = require("passport"); /***/ }), /* 155 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var PassportLocalStrategy = __webpack_require__(40).Strategy; var logger = __webpack_require__(2); var _require = __webpack_require__(9), db = _require.db; var returnUserAndChannelInfo = function returnUserAndChannelInfo(userInstance) { return new Promise(function (resolve, reject) { var userInfo = {}; userInfo['id'] = userInstance.id; userInfo['userName'] = userInstance.userName; userInstance.getChannel().then(function (_ref) { var channelName = _ref.channelName, channelClaimId = _ref.channelClaimId; userInfo['channelName'] = channelName; userInfo['channelClaimId'] = channelClaimId; return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName); }).then(function (shortChannelId) { userInfo['shortChannelId'] = shortChannelId; resolve(userInfo); }).catch(function (error) { reject(error); }); }); }; module.exports = new PassportLocalStrategy({ usernameField: 'username', passwordField: 'password' }, function (username, password, done) { return db.User.findOne({ where: { userName: username } }).then(function (user) { if (!user) { logger.debug('no user found'); return done(null, false, { message: 'Incorrect username or password' }); } return user.comparePassword(password).then(function (isMatch) { if (!isMatch) { logger.debug('incorrect password'); return done(null, false, { message: 'Incorrect username or password' }); } logger.debug('Password was a match, returning User'); return returnUserAndChannelInfo(user).then(function (userInfo) { return done(null, userInfo); }).catch(function (error) { return error; }); }).catch(function (error) { return error; }); }).catch(function (error) { return done(error); }); }); /***/ }), /* 156 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var PassportLocalStrategy = __webpack_require__(40).Strategy; var lbryApi = __webpack_require__(14); var logger = __webpack_require__(2); var _require = __webpack_require__(9), db = _require.db; module.exports = new PassportLocalStrategy({ usernameField: 'username', passwordField: 'password' }, function (username, password, done) { logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .'); var userInfo = {}; // server-side validaton of inputs (username, password) // create the channel and retrieve the metadata return lbryApi.createChannel('@' + username).then(function (tx) { // create user record var userData = { userName: username, password: password }; logger.verbose('userData >', userData); // create user record var channelData = { channelName: '@' + username, channelClaimId: tx.claim_id }; logger.verbose('channelData >', channelData); // create certificate record var certificateData = { claimId: tx.claim_id, name: '@' + username // address, }; logger.verbose('certificateData >', certificateData); // save user and certificate to db return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 3), newUser = _ref2[0], newChannel = _ref2[1], newCertificate = _ref2[2]; logger.verbose('user and certificate successfully created'); // store the relevant newUser info to be passed back for req.User userInfo['id'] = newUser.id; userInfo['userName'] = newUser.userName; userInfo['channelName'] = newChannel.channelName; userInfo['channelClaimId'] = newChannel.channelClaimId; // associate the instances return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]); }).then(function () { logger.verbose('user and certificate successfully associated'); return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName); }).then(function (shortChannelId) { userInfo['shortChannelId'] = shortChannelId; return done(null, userInfo); }).catch(function (error) { logger.error('signup error', error); return done(error); }); }); /***/ }), /* 157 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = { serializeSpeechUser: function serializeSpeechUser(user, done) { // returns user data to be serialized into session console.log('serializing user'); done(null, user); }, deserializeSpeechUser: function deserializeSpeechUser(user, done) { // deserializes session and populates additional info to req.user console.log('deserializing user'); done(null, user); } }; /***/ }), /* 158 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Certificate = __webpack_require__(159); var Channel = __webpack_require__(160); var Claim = __webpack_require__(161); var File = __webpack_require__(162); var Request = __webpack_require__(163); var User = __webpack_require__(164); module.exports = { Certificate: Certificate, Channel: Channel, Claim: Claim, File: File, Request: Request, User: User }; /***/ }), /* 159 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var _require = __webpack_require__(41), returnShortId = _require.returnShortId; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER, TEXT = _ref.TEXT, DECIMAL = _ref.DECIMAL; var Certificate = sequelize.define('Certificate', { address: { type: STRING, default: null }, amount: { type: DECIMAL(19, 8), default: null }, claimId: { type: STRING, default: null }, claimSequence: { type: INTEGER, default: null }, decodedClaim: { type: BOOLEAN, default: null }, depth: { type: INTEGER, default: null }, effectiveAmount: { type: DECIMAL(19, 8), default: null }, hasSignature: { type: BOOLEAN, default: null }, height: { type: INTEGER, default: null }, hex: { type: TEXT('long'), default: null }, name: { type: STRING, default: null }, nout: { type: INTEGER, default: null }, txid: { type: STRING, default: null }, validAtHeight: { type: INTEGER, default: null }, outpoint: { type: STRING, default: null }, valueVersion: { type: STRING, default: null }, claimType: { type: STRING, default: null }, certificateVersion: { type: STRING, default: null }, keyType: { type: STRING, default: null }, publicKey: { type: TEXT('long'), default: null } }, { freezeTableName: true }); Certificate.associate = function (db) { Certificate.belongsTo(db.Channel, { foreignKey: { allowNull: true } }); }; Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) { var _this = this; logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId); return new Promise(function (resolve, reject) { _this.findAll({ where: { name: channelName }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: throw new Error('No channel(s) found with that channel name'); default: return resolve(returnShortId(result, longChannelId)); } }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) { var _this2 = this; logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')'); return new Promise(function (resolve, reject) { _this2.findAll({ where: { name: channelName, claimId: { $like: channelClaimId + '%' } }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: // note results must be sorted return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelIdFromChannelName = function (channelName) { var _this3 = this; logger.debug('getLongChannelIdFromChannelName(' + channelName + ')'); return new Promise(function (resolve, reject) { _this3.findAll({ where: { name: channelName }, order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Certificate.validateLongChannelId = function (name, claimId) { var _this4 = this; logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')'); return new Promise(function (resolve, reject) { _this4.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (!result) { return resolve(null); }; resolve(claimId); }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelId = function (channelName, channelClaimId) { logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')'); if (channelClaimId && channelClaimId.length === 40) { // if a full channel id is provided return this.validateLongChannelId(channelName, channelClaimId); } else if (channelClaimId && channelClaimId.length < 40) { // if a short channel id is provided return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId); } else { return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided } }; return Certificate; }; /***/ }), /* 160 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING; var Channel = sequelize.define('Channel', { channelName: { type: STRING, allowNull: false }, channelClaimId: { type: STRING, allowNull: false } }, { freezeTableName: true }); Channel.associate = function (db) { Channel.belongsTo(db.User); Channel.hasOne(db.Certificate); }; return Channel; }; /***/ }), /* 161 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(2); var _require = __webpack_require__(41), returnShortId = _require.returnShortId; var _require2 = __webpack_require__(6), defaultThumbnail = _require2.assetDefaults.thumbnail, host = _require2.details.host; function determineFileExtensionFromContentType(contentType) { switch (contentType) { case 'image/jpeg': case 'image/jpg': return 'jpeg'; case 'image/png': return 'png'; case 'image/gif': return 'gif'; case 'video/mp4': return 'mp4'; default: logger.debug('setting unknown file type as file extension jpeg'); return 'jpeg'; } }; function determineThumbnail(storedThumbnail, defaultThumbnail) { if (storedThumbnail === '') { return defaultThumbnail; } return storedThumbnail; }; function prepareClaimData(claim) { // logger.debug('preparing claim data based on resolved data:', claim); claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); claim['host'] = host; return claim; }; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER, TEXT = _ref.TEXT, DECIMAL = _ref.DECIMAL; var Claim = sequelize.define('Claim', { address: { type: STRING, default: null }, amount: { type: DECIMAL(19, 8), default: null }, claimId: { type: STRING, default: null }, claimSequence: { type: INTEGER, default: null }, decodedClaim: { type: BOOLEAN, default: null }, depth: { type: INTEGER, default: null }, effectiveAmount: { type: DECIMAL(19, 8), default: null }, hasSignature: { type: BOOLEAN, default: null }, height: { type: INTEGER, default: null }, hex: { type: TEXT('long'), default: null }, name: { type: STRING, default: null }, nout: { type: INTEGER, default: null }, txid: { type: STRING, default: null }, validAtHeight: { type: INTEGER, default: null }, outpoint: { type: STRING, default: null }, claimType: { type: STRING, default: null }, certificateId: { type: STRING, default: null }, author: { type: STRING, default: null }, description: { type: TEXT('long'), default: null }, language: { type: STRING, default: null }, license: { type: STRING, default: null }, licenseUrl: { type: STRING, default: null }, nsfw: { type: BOOLEAN, default: null }, preview: { type: STRING, default: null }, thumbnail: { type: STRING, default: null }, title: { type: STRING, default: null }, metadataVersion: { type: STRING, default: null }, contentType: { type: STRING, default: null }, source: { type: STRING, default: null }, sourceType: { type: STRING, default: null }, sourceVersion: { type: STRING, default: null }, streamVersion: { type: STRING, default: null }, valueVersion: { type: STRING, default: null }, channelName: { type: STRING, allowNull: true, default: null } }, { freezeTableName: true }); Claim.associate = function (db) { Claim.belongsTo(db.File, { foreignKey: { allowNull: true } }); }; Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) { var _this = this; logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId); return new Promise(function (resolve, reject) { _this.findAll({ where: { name: claimName }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: throw new Error('No claim(s) found with that claim name'); default: resolve(returnShortId(result, claimId)); } }).catch(function (error) { reject(error); }); }); }; Claim.getAllChannelClaims = function (channelClaimId) { var _this2 = this; logger.debug('Claim.getAllChannelClaims for ' + channelClaimId); return new Promise(function (resolve, reject) { _this2.findAll({ where: { certificateId: channelClaimId }, order: [['height', 'ASC']], raw: true // returns an array of only data, not an array of instances }).then(function (channelClaimsArray) { // logger.debug('channelclaimsarray length:', channelClaimsArray.length); switch (channelClaimsArray.length) { case 0: return resolve(null); default: channelClaimsArray.forEach(function (claim) { claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); return claim; }); return resolve(channelClaimsArray); } }).catch(function (error) { reject(error); }); }); }; Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) { var _this3 = this; logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId); return new Promise(function (resolve, reject) { _this3.findAll({ where: { name: claimName, certificateId: channelClaimId }, order: [['id', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); case 1: return resolve(result[0].claimId); default: logger.error(result.length + ' records found for "' + claimName + '" in channel "' + channelClaimId + '"'); return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.getLongClaimIdFromShortClaimId = function (name, shortId) { var _this4 = this; return new Promise(function (resolve, reject) { _this4.findAll({ where: { name: name, claimId: { $like: shortId + '%' } }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: // note results must be sorted return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.getTopFreeClaimIdByClaimName = function (name) { var _this5 = this; return new Promise(function (resolve, reject) { _this5.findAll({ where: { name: name }, order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch? }).then(function (result) { logger.debug('length of result', result.length); switch (result.length) { case 0: return resolve(null); default: return resolve(result[0].dataValues.claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.validateLongClaimId = function (name, claimId) { var _this6 = this; return new Promise(function (resolve, reject) { _this6.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (!result) { return resolve(null); }; resolve(claimId); }).catch(function (error) { reject(error); }); }); }; Claim.getLongClaimId = function (claimName, claimId) { logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')'); if (claimId && claimId.length === 40) { // if a full claim id is provided return this.validateLongClaimId(claimName, claimId); } else if (claimId && claimId.length < 40) { return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided } else { return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided } }; Claim.resolveClaim = function (name, claimId) { var _this7 = this; logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId); return new Promise(function (resolve, reject) { _this7.findAll({ where: { name: name, claimId: claimId } }).then(function (claimArray) { switch (claimArray.length) { case 0: return resolve(null); case 1: return resolve(prepareClaimData(claimArray[0].dataValues)); default: logger.error('more than one record matches ' + name + '#' + claimId + ' in db.Claim'); return resolve(prepareClaimData(claimArray[0].dataValues)); } }).catch(function (error) { reject(error); }); }); }; return Claim; }; /***/ }), /* 162 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER; var File = sequelize.define('File', { name: { type: STRING, allowNull: false }, claimId: { type: STRING, allowNull: false }, address: { type: STRING, allowNull: false }, outpoint: { type: STRING, allowNull: false }, height: { type: INTEGER, allowNull: false, default: 0 }, fileName: { type: STRING, allowNull: false }, filePath: { type: STRING, allowNull: false }, fileType: { type: STRING }, nsfw: { type: BOOLEAN, allowNull: false, defaultValue: false }, trendingEligible: { type: BOOLEAN, allowNull: false, defaultValue: true } }, { freezeTableName: true }); File.associate = function (db) { File.hasMany(db.Request); File.hasOne(db.Claim); }; File.getRecentClaims = function () { return this.findAll({ where: { nsfw: false, trendingEligible: true }, order: [['createdAt', 'DESC']], limit: 25 }); }; return File; }; /***/ }), /* 163 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, TEXT = _ref.TEXT; var Request = sequelize.define('Request', { action: { type: STRING, allowNull: false }, url: { type: STRING, allowNull: false }, ipAddress: { type: STRING, allowNull: true }, result: { type: TEXT('long'), allowNull: true, default: null } }, { freezeTableName: true }); Request.associate = function (db) { Request.belongsTo(db.File, { foreignKey: { allowNull: true } }); }; return Request; }; /***/ }), /* 164 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var bcrypt = __webpack_require__(165); var logger = __webpack_require__(2); module.exports = function (sequelize, _ref) { var STRING = _ref.STRING; var User = sequelize.define('User', { userName: { type: STRING, allowNull: false }, password: { type: STRING, allowNull: false } }, { freezeTableName: true }); User.associate = function (db) { User.hasOne(db.Channel); }; User.prototype.comparePassword = function (password) { return bcrypt.compare(password, this.password); }; User.prototype.changePassword = function (newPassword) { var _this = this; return new Promise(function (resolve, reject) { // generate a salt string to use for hashing bcrypt.genSalt(function (saltError, salt) { if (saltError) { logger.error('salt error', saltError); reject(saltError); return; } // generate a hashed version of the user's password bcrypt.hash(newPassword, salt, function (hashError, hash) { // if there is an error with the hash generation return the error if (hashError) { logger.error('hash error', hashError); reject(hashError); return; } // replace the current password with the new hash _this.update({ password: hash }).then(function () { resolve(); }).catch(function (error) { reject(error); }); }); }); }); }; // pre-save hook method to hash the user's password before the user's info is saved to the db. User.hook('beforeCreate', function (user, options) { logger.debug('User.beforeCreate hook...'); return new Promise(function (resolve, reject) { // generate a salt string to use for hashing bcrypt.genSalt(function (saltError, salt) { if (saltError) { logger.error('salt error', saltError); reject(saltError); return; } // generate a hashed version of the user's password bcrypt.hash(user.password, salt, function (hashError, hash) { // if there is an error with the hash generation return the error if (hashError) { logger.error('hash error', hashError); reject(hashError); return; } // replace the password string with the hash password value user.password = hash; resolve(); }); }); }); }); return User; }; /***/ }), /* 165 */ /***/ (function(module, exports) { module.exports = require("bcrypt"); /***/ }) /******/ ]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgOTBiOTA2MmJlMzE0MTc1N2Y0MmMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1yZWR1eFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIndpbnN0b25cIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9lcnJvckhhbmRsZXJzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hY3Rpb25zL3B1Ymxpc2guanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3Qtcm91dGVyLWRvbVwiIiwid2VicGFjazovLy8uL2NvbmZpZy9zaXRlQ29uZmlnLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL05hdkJhci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvYWN0aW9ucy9zaG93LmpzIiwid2VicGFjazovLy8uL2NvbmZpZy9teXNxbENvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9nb29nbGVBbmFseXRpY3MuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvU0VPL2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInByb3AtdHlwZXNcIiIsIndlYnBhY2s6Ly8vLi9jbGllbnQvdXRpbHMvcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9sYnJ5QXBpLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3NlbGVjdG9ycy9zaG93LmpzIiwid2VicGFjazovLy8uL3NlcnZlci9jb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVkdXgtc2FnYS9lZmZlY3RzXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2NvbnRyb2xsZXJzL3B1Ymxpc2hDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3B1Ymxpc2hIZWxwZXJzLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0LWhlbG1ldFwiIiwid2VicGFjazovLy8uL2NsaWVudC9hY3Rpb25zL2NoYW5uZWwuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXIvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9wYWdlcy9FcnJvclBhZ2UvaW5kZXguanN4Iiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3NlcnZlSGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9sYnJ5VXJpLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL2hhbmRsZVNob3dSZW5kZXIuanN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcInJlZHV4XCIiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnN0YW50cy9wdWJsaXNoX2FjdGlvbl90eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29uc3RhbnRzL3B1Ymxpc2hfY2hhbm5lbF9zZWxlY3Rfc3RhdGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvY2hhbm5lbF9hY3Rpb25fdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnN0YW50cy9hc3NldF9kaXNwbGF5X3N0YXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvYXBwLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0Ryb3B6b25lL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxMb2dpbkZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9zZWxlY3RvcnMvc2l0ZS5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwYXNzcG9ydC1sb2NhbFwiIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiYmFiZWwtcG9seWZpbGxcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3aGF0d2ctZmV0Y2hcIiIsIndlYnBhY2s6Ly8vLi9zcGVlY2guanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvY2hhbm5lbEF2YWlsYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJheGlvc1wiIiwid2VicGFjazovLy8uL2NvbmZpZy9sYnJ5Q29uZmlnLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInVuaXZlcnNhbC1hbmFseXRpY3NcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcInNlcXVlbGl6ZVwiIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXBpL2NoYW5uZWxDbGFpbXMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvY2hhbm5lbFBhZ2luYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvY2hhbm5lbERhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvY2hhbm5lbFNob3J0SWQuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvY2xhaW1BdmFpbGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvY2xhaW1EYXRhLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltR2V0LmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltTG9uZ0lkLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltUHVibGlzaC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvYXV0aC9hdXRoZW50aWNhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcm91dGVzL2FwaS9jbGFpbVJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvY2xhaW1TaG9ydElkLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltc0xpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGkvZmlsZUF2YWlsYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcm91dGVzL2Fzc2V0L2luZGV4LmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXNzZXQvc2VydmVBc3NldEJ5Q2xhaW0uanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtZG9tL3NlcnZlclwiIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcmVkdWNlcnMvcHVibGlzaC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcmVkdWNlcnMvY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcmVkdWNlcnMvc2hvdy5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcmVkdWNlcnMvc2l0ZS5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9HQUxpc3RlbmVyL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1nYVwiIiwid2VicGFjazovLy8uL2NsaWVudC9wYWdlcy9Ib21lUGFnZS9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvU0VPL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9wYWdlVGl0bGUuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3V0aWxzL21ldGFUYWdzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9jYW5vbmljYWxMaW5rLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL05hdkJhci92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9Mb2dvL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJjcm9zcy1mZXRjaC9wb2x5ZmlsbFwiIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUb29sL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUb29sL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0Ryb3B6b25lL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9maWxlLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL1B1Ymxpc2hQcmV2aWV3L2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoRGV0YWlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoRGV0YWlscy92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVGl0bGVJbnB1dC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVGl0bGVJbnB1dC92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVXJsSW5wdXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFVybElucHV0L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL1B1Ymxpc2hVcmxNaWRkbGVEaXNwbGF5L2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVGh1bWJuYWlsSW5wdXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFRodW1ibmFpbElucHV0L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoTWV0YWRhdGFJbnB1dHMvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvRXhwYW5kaW5nVGV4dEFyZWEvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxTZWxlY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbFNlbGVjdC92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL0FjdGl2ZVN0YXR1c0Jhci9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvSW5hY3RpdmVTdGF0dXNCYXIvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hTdGF0dXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFN0YXR1cy92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29uc3RhbnRzL3B1Ymxpc2hfY2xhaW1fc3RhdGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaERpc2FibGVkTWVzc2FnZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvQWJvdXRQYWdlL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvTG9naW5QYWdlL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9wYWdlcy9Mb2dpblBhZ2Uvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL1Nob3dQYWdlL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9wYWdlcy9TaG93UGFnZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9TaG93QXNzZXRMaXRlL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldExpdGUvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldERldGFpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0RGV0YWlscy92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9Bc3NldFRpdGxlL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0Fzc2V0VGl0bGUvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXRJbmZvL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0Fzc2V0SW5mby92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9TaG93Q2hhbm5lbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9TaG93Q2hhbm5lbC92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9Bc3NldFByZXZpZXcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvQXNzZXRQcmV2aWV3L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9Gb3VyT2hGb3VyUGFnZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9yZW5kZXJGdWxsUGFnZS5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWR1eC1zYWdhXCIiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3NhZ2FzL3Nob3dfdXJpLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9zYWdhcy9zaG93X2Fzc2V0LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hcGkvYXNzZXRBcGkuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3NhZ2FzL3Nob3dfY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvYXBpL2NoYW5uZWxBcGkuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3V0aWxzL2xicnlVcmkuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hc3NldC9zZXJ2ZUFzc2V0QnlJZGVudGlmaWVyQW5kQ2xhaW0uanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hdXRoL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXV0aC9zaWdudXAuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hdXRoL2xvZ2luLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXV0aC9sb2dvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hdXRoL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vY29uZmlnL2xvZ2dlckNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9jb25maWcvc2xhY2tDb25maWcuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwid2luc3Rvbi1zbGFjay13ZWJob29rXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3Bhc3Nwb3J0L2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInBhc3Nwb3J0XCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3Bhc3Nwb3J0L2xvY2FsLWxvZ2luLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9wYXNzcG9ydC9sb2NhbC1zaWdudXAuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvYXV0aEhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL21vZGVscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvbW9kZWxzL2NlcnRpZmljYXRlLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvbW9kZWxzL2NsYWltLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvZmlsZS5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvbW9kZWxzL3JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL21vZGVscy91c2VyLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImJjcnlwdFwiIl0sIm5hbWVzIjpbImxvZ2dlciIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiaGFuZGxlRXJyb3JSZXNwb25zZSIsIm9yaWdpbmFsVXJsIiwiaXAiLCJlcnJvciIsInJlcyIsInVzZU9iamVjdFByb3BlcnRpZXNJZk5vS2V5cyIsInJldHVybkVycm9yTWVzc2FnZUFuZFN0YXR1cyIsInN0YXR1cyIsIm1lc3NhZ2UiLCJqc29uIiwiY3JlYXRlRXJyb3JSZXNwb25zZVBheWxvYWQiLCJjb2RlIiwiZXJyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsIm5ld0Vycm9yT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJrZXkiLCJzdWNjZXNzIiwic2VsZWN0RmlsZSIsImNsZWFyRmlsZSIsInVwZGF0ZU1ldGFkYXRhIiwidXBkYXRlQ2xhaW0iLCJzZXRQdWJsaXNoSW5DaGFubmVsIiwidXBkYXRlUHVibGlzaFN0YXR1cyIsInVwZGF0ZUVycm9yIiwidXBkYXRlU2VsZWN0ZWRDaGFubmVsIiwidG9nZ2xlTWV0YWRhdGFJbnB1dHMiLCJvbk5ld1RodW1ibmFpbCIsInN0YXJ0UHVibGlzaCIsImFjdGlvbnMiLCJmaWxlIiwidHlwZSIsIkZJTEVfU0VMRUNURUQiLCJkYXRhIiwiRklMRV9DTEVBUiIsIm5hbWUiLCJ2YWx1ZSIsIk1FVEFEQVRBX1VQREFURSIsIkNMQUlNX1VQREFURSIsImNoYW5uZWwiLCJTRVRfUFVCTElTSF9JTl9DSEFOTkVMIiwiUFVCTElTSF9TVEFUVVNfVVBEQVRFIiwiRVJST1JfVVBEQVRFIiwiY2hhbm5lbE5hbWUiLCJTRUxFQ1RFRF9DSEFOTkVMX1VQREFURSIsInNob3dNZXRhZGF0YUlucHV0cyIsIlRPR0dMRV9NRVRBREFUQV9JTlBVVFMiLCJUSFVNQk5BSUxfTkVXIiwiaGlzdG9yeSIsIlBVQkxJU0hfU1RBUlQiLCJTaXRlQ29uZmlnIiwiYW5hbHl0aWNzIiwiZ29vZ2xlSWQiLCJhc3NldERlZmF1bHRzIiwiZGVzY3JpcHRpb24iLCJ0aHVtYm5haWwiLCJ0aXRsZSIsImF1dGgiLCJzZXNzaW9uS2V5IiwiY3VzdG9tQ29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJjb250YWluZXJzIiwicGFnZXMiLCJkZXRhaWxzIiwiaG9zdCIsInBvcnQiLCJ0d2l0dGVyIiwicHVibGlzaGluZyIsImFkZGl0aW9uYWxDbGFpbUFkZHJlc3NlcyIsImRpc2FibGVkIiwiZGlzYWJsZWRNZXNzYWdlIiwicHJpbWFyeUNsYWltQWRkcmVzcyIsInRodW1ibmFpbENoYW5uZWwiLCJ0aHVtYm5haWxDaGFubmVsSWQiLCJ1cGxvYWREaXJlY3RvcnkiLCJjb25maWd1cmUiLCJjb25maWciLCJjb25zb2xlIiwibG9nIiwibWFwU3RhdGVUb1Byb3BzIiwic2l0ZSIsImxvZ2dlZEluQ2hhbm5lbCIsImNoYW5uZWxTaG9ydElkIiwic2hvcnRJZCIsImNoYW5uZWxMb25nSWQiLCJsb25nSWQiLCJzaXRlRGVzY3JpcHRpb24iLCJtYXBEaXNwYXRjaFRvUHJvcHMiLCJvbkNoYW5uZWxMb2dpbiIsImRpc3BhdGNoIiwib25DaGFubmVsTG9nb3V0Iiwib25IYW5kbGVTaG93UGFnZVVyaSIsIm9uUmVxdWVzdEVycm9yIiwib25OZXdDaGFubmVsUmVxdWVzdCIsIm9uTmV3QXNzZXRSZXF1ZXN0Iiwib25SZXF1ZXN0VXBkYXRlIiwiYWRkUmVxdWVzdFRvUmVxdWVzdExpc3QiLCJhZGRBc3NldFRvQXNzZXRMaXN0IiwiYWRkTmV3Q2hhbm5lbFRvQ2hhbm5lbExpc3QiLCJvblVwZGF0ZUNoYW5uZWxDbGFpbXMiLCJ1cGRhdGVDaGFubmVsQ2xhaW1zIiwiZmlsZVJlcXVlc3RlZCIsInVwZGF0ZUZpbGVBdmFpbGFiaWxpdHkiLCJ1cGRhdGVEaXNwbGF5QXNzZXRFcnJvciIsInBhcmFtcyIsIkhBTkRMRV9TSE9XX1VSSSIsIlJFUVVFU1RfRVJST1IiLCJjaGFubmVsSWQiLCJyZXF1ZXN0VHlwZSIsInJlcXVlc3RJZCIsIkNIQU5ORUxfUkVRVUVTVF9ORVciLCJpZCIsImV4dGVuc2lvbiIsIkFTU0VUX1JFUVVFU1RfTkVXIiwibW9kaWZpZXIiLCJSRVFVRVNUX1VQREFURSIsIlJFUVVFU1RfTElTVF9BREQiLCJjbGFpbUlkIiwiY2xhaW1EYXRhIiwiQVNTRVRfQUREIiwiY2xhaW1zRGF0YSIsIkNIQU5ORUxfQUREIiwiY2hhbm5lbEtleSIsInBhZ2UiLCJDSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMiLCJjaGFubmVsTGlzdElkIiwiQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX1NVQ0NFU1MiLCJGSUxFX1JFUVVFU1RFRCIsIkZJTEVfQVZBSUxBQklMSVRZX1VQREFURSIsIkRJU1BMQVlfQVNTRVRfRVJST1IiLCJteXNxbCIsImRiIiwidWEiLCJjcmVhdGVTZXJ2ZUV2ZW50UGFyYW1zIiwiaGVhZGVycyIsImV2ZW50Q2F0ZWdvcnkiLCJldmVudEFjdGlvbiIsImV2ZW50TGFiZWwiLCJpcE92ZXJyaWRlIiwidXNlckFnZW50T3ZlcnJpZGUiLCJjcmVhdGVQdWJsaXNoVGltaW5nRXZlbnRQYXJhbXMiLCJjYXRlZ29yeSIsInZhcmlhYmxlIiwibGFiZWwiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJ1c2VyVGltaW5nQ2F0ZWdvcnkiLCJ1c2VyVGltaW5nVmFyaWFibGVOYW1lIiwidXNlclRpbWluZ1RpbWUiLCJ1c2VyVGltaW5nTGFiZWwiLCJzZW5kR29vZ2xlQW5hbHl0aWNzRXZlbnQiLCJ2aXNpdG9ySWQiLCJyZXBsYWNlIiwidmlzaXRvciIsInN0cmljdENpZEZvcm1hdCIsImh0dHBzIiwiZXZlbnQiLCJzZW5kR29vZ2xlQW5hbHl0aWNzVGltaW5nIiwidGltaW5nIiwiZGVidWciLCJzZW5kR0FTZXJ2ZUV2ZW50Iiwic2VuZEdBVGltaW5nRXZlbnQiLCJjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwiLCJjaGFubmVsX25hbWUiLCJjaGFubmVsX2lkIiwiZGVmYXVsdERlc2NyaXB0aW9uIiwiZGVmYXVsdFRodW1ibmFpbCIsInNpdGVIb3N0Iiwic2l0ZVRpdGxlIiwic2l0ZVR3aXR0ZXIiLCJyZXF1ZXN0IiwicGFyc2VKU09OIiwicmVzcG9uc2UiLCJjaGVja1N0YXR1cyIsImpzb25SZXNwb25zZSIsIkVycm9yIiwidXJsIiwib3B0aW9ucyIsImZldGNoIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJheGlvcyIsImFwaSIsImFwaUhvc3QiLCJhcGlQb3J0IiwibGJyeUFwaVVyaSIsImhhbmRsZUxicnluZXRSZXNwb25zZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXN1bHQiLCJKU09OIiwic3RyaW5naWZ5IiwicHVibGlzaENsYWltIiwicHVibGlzaFBhcmFtcyIsImdhU3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsInBvc3QiLCJtZXRob2QiLCJjYXRjaCIsImdldENsYWltIiwidXJpIiwidGltZW91dCIsImdldENsYWltTGlzdCIsImNsYWltTmFtZSIsInJlc29sdmVVcmkiLCJnZXREb3dubG9hZERpcmVjdG9yeSIsImRvd25sb2FkX2RpcmVjdG9yeSIsImNyZWF0ZUNoYW5uZWwiLCJhbW91bnQiLCJzZWxlY3RBc3NldCIsInNob3ciLCJyZXF1ZXN0TGlzdCIsImFzc2V0S2V5IiwiYXNzZXRMaXN0Iiwic2VsZWN0U2hvd1N0YXRlIiwic3RhdGUiLCJyZXR1cm5QYWdpbmF0ZWRDaGFubmVsQ2xhaW1zIiwiTk9fQ0hBTk5FTCIsIk5PX0NMQUlNIiwiTk9fRklMRSIsImdldENsYWltSWQiLCJjaGFubmVsQ2xhaW1JZCIsImdldENsYWltSWRCeUNoYW5uZWwiLCJnZXRDbGFpbUlkQnlDbGFpbSIsIkNsYWltIiwiZ2V0TG9uZ0NsYWltSWQiLCJsb25nQ2xhaW1JZCIsIkNlcnRpZmljYXRlIiwiZ2V0TG9uZ0NoYW5uZWxJZCIsImxvbmdDaGFubmVsSWQiLCJnZXRDbGFpbUlkQnlMb25nQ2hhbm5lbElkIiwiZ2V0Q2hhbm5lbERhdGEiLCJsb25nQ2hhbm5lbENsYWltSWQiLCJnZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkIiwic2hvcnRDaGFubmVsQ2xhaW1JZCIsImdldENoYW5uZWxDbGFpbXMiLCJnZXRBbGxDaGFubmVsQ2xhaW1zIiwiY2hhbm5lbENsYWltc0FycmF5IiwicGFnaW5hdGVkQ2hhbm5lbFZpZXdEYXRhIiwiZ2V0TG9jYWxGaWxlUmVjb3JkIiwiRmlsZSIsImZpbmRPbmUiLCJ3aGVyZSIsImRhdGFWYWx1ZXMiLCJsYnJ5QXBpIiwicHVibGlzaEhlbHBlcnMiLCJTZXF1ZWxpemUiLCJPcCIsInB1Ymxpc2giLCJmaWxlTmFtZSIsImZpbGVUeXBlIiwicHVibGlzaFJlc3VsdHMiLCJjZXJ0aWZpY2F0ZUlkIiwiaW5mbyIsInR4IiwiQ2hhbm5lbCIsImZpbGVSZWNvcmQiLCJjbGFpbV9pZCIsIm1ldGFkYXRhIiwiYWRkcmVzcyIsImNsYWltX2FkZHJlc3MiLCJvdXRwb2ludCIsInR4aWQiLCJub3V0IiwiaGVpZ2h0IiwiZmlsZVBhdGgiLCJmaWxlX3BhdGgiLCJuc2Z3IiwiY2xhaW1SZWNvcmQiLCJjb250ZW50VHlwZSIsImJpZCIsInVwc2VydENyaXRlcmlhIiwidXBzZXJ0IiwiY2xhaW0iLCJzZXRDbGFpbSIsInNldEZpbGUiLCJkZWxldGVUZW1wb3JhcnlGaWxlIiwiY2xhaW1OYW1lSXNBdmFpbGFibGUiLCJjbGFpbUFkZHJlc3NlcyIsInB1c2giLCJmaW5kQWxsIiwiYXR0cmlidXRlcyIsIm9yIiwiY2hlY2tDaGFubmVsQXZhaWxhYmlsaXR5IiwiZnMiLCJwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0Qm9keSIsImxpY2Vuc2UiLCJpbnZhbGlkTmFtZUNoYXJhY3RlcnMiLCJleGVjIiwicGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzIiwicGF0aCIsInNpemUiLCJ0ZXN0IiwidmFsaWRhdGVGaWxlVHlwZUFuZFNpemUiLCJ0aHVtYm5haWxGaWxlTmFtZSIsInRodW1ibmFpbEZpbGVQYXRoIiwidGh1bWJuYWlsRmlsZVR5cGUiLCJjcmVhdGVCYXNpY1B1Ymxpc2hQYXJhbXMiLCJ0cmltIiwiYXV0aG9yIiwibGFuZ3VhZ2UiLCJjcmVhdGVUaHVtYm5haWxQdWJsaXNoUGFyYW1zIiwidW5saW5rIiwiYWRkR2V0UmVzdWx0c1RvRmlsZURhdGEiLCJmaWxlSW5mbyIsImdldFJlc3VsdCIsImZpbGVfbmFtZSIsImRvd25sb2FkX3BhdGgiLCJjcmVhdGVGaWxlRGF0YSIsInVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCIsIkNIQU5ORUxfVVBEQVRFIiwiUHJvZ3Jlc3NCYXIiLCJwcm9wcyIsImJhcnMiLCJpbmRleCIsImluY3JlbWVudGVyIiwiY3JlYXRlQmFycyIsImJpbmQiLCJzdGFydFByb2dyZXNzQmFyIiwidXBkYXRlUHJvZ3Jlc3NCYXIiLCJzdG9wUHJvZ3Jlc3NCYXIiLCJpIiwiaXNBY3RpdmUiLCJzZXRTdGF0ZSIsInVwZGF0ZUludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwibWFwIiwiYmFyIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsIkVycm9yUGFnZSIsInN0cmluZyIsIlNFUlZFIiwiU0hPVyIsImNsaWVudEFjY2VwdHNIdG1sIiwiYWNjZXB0IiwibWF0Y2giLCJyZXF1ZXN0SXNGcm9tQnJvd3NlciIsImNsaWVudFdhbnRzQXNzZXQiLCJyYW5nZSIsImltYWdlSXNXYW50ZWQiLCJ2aWRlb0lzV2FudGVkIiwiaXNWYWxpZENsYWltSWQiLCJpc1ZhbGlkU2hvcnRJZCIsImlzVmFsaWRTaG9ydElkT3JDbGFpbUlkIiwiaW5wdXQiLCJzZXJ2ZUFzc2V0VG9DbGllbnQiLCJyZWRpcmVjdCIsInZlcmJvc2UiLCJzZW5kRmlsZU9wdGlvbnMiLCJzZW5kRmlsZSIsImdldENsYWltSWRBbmRTZXJ2ZUFzc2V0IiwiZnVsbENsYWltSWQiLCJkZXRlcm1pbmVSZXNwb25zZVR5cGUiLCJoYXNGaWxlRXh0ZW5zaW9uIiwicmVzcG9uc2VUeXBlIiwiZmxpcENsYWltTmFtZUFuZElkRm9yQmFja3dhcmRzQ29tcGF0aWJpbGl0eSIsImlkZW50aWZpZXIiLCJ0ZW1wTmFtZSIsImxvZ1JlcXVlc3REYXRhIiwiUkVHRVhQX0lOVkFMSURfQ0xBSU0iLCJSRUdFWFBfSU5WQUxJRF9DSEFOTkVMIiwiUkVHRVhQX0FERFJFU1MiLCJDSEFOTkVMX0NIQVIiLCJwYXJzZUlkZW50aWZpZXIiLCJjb21wb25lbnRzUmVnZXgiLCJSZWdFeHAiLCJwcm90byIsIm1vZGlmaWVyU2VwZXJhdG9yIiwiaXNDaGFubmVsIiwic3RhcnRzV2l0aCIsIm5hbWVCYWRDaGFycyIsImpvaW4iLCJwYXJzZUNsYWltIiwicGFyc2VNb2RpZmllciIsInJldHVyblNhZ2FXaXRoUGFyYW1zIiwic2FnYSIsInJlcSIsImNvbnRleHQiLCJzYWdhTWlkZGxld2FyZSIsIm1pZGRsZXdhcmUiLCJzdG9yZSIsImFjdGlvbiIsInJ1biIsImRvbmUiLCJodG1sIiwiaGVsbWV0IiwicmVuZGVyU3RhdGljIiwicHJlbG9hZGVkU3RhdGUiLCJnZXRTdGF0ZSIsInNlbmQiLCJMT0dJTiIsIkNSRUFURSIsIkxPQ0FMX0NIRUNLIiwiVU5BVkFJTEFCTEUiLCJFUlJPUiIsIkFWQUlMQUJMRSIsIkFwcCIsImZpbGVFcnJvciIsInNldEZpbGVFcnJvciIsIkNIQU5ORUwiLCJBU1NFVF9MSVRFIiwiQVNTRVRfREVUQUlMUyIsImRpc3BsYXlBc3NldCIsImFzc2V0Iiwib25GaWxlUmVxdWVzdCIsInNlbGVjdFNpdGVTdGF0ZSIsInNlbGVjdFNpdGVIb3N0IiwicmV0dXJuU2hvcnRJZCIsImNsYWltc0FycmF5IiwiY2xhaW1JbmRleCIsInN1YnN0cmluZyIsInNob3J0SWRMZW5ndGgiLCJmaW5kSW5kZXgiLCJlbGVtZW50IiwicG9zc2libGVNYXRjaGVzIiwic2xpY2UiLCJmaWx0ZXIiLCJzbGFjayIsInBhc3Nwb3J0IiwibW9kZWxzIiwicm91dGVzIiwiY2hhbm5lbEF2YWlsYWJpbGl0eSIsImNoYW5uZWxDbGFpbXMiLCJjaGFubmVsRGF0YSIsImNsYWltQXZhaWxhYmlsaXR5IiwiY2xhaW1HZXQiLCJjbGFpbUxvbmdJZCIsImNsYWltUHVibGlzaCIsImNsYWltUmVzb2x2ZSIsImNsYWltU2hvcnRJZCIsImNsYWltc0xpc3QiLCJmaWxlQXZhaWxhYmlsaXR5IiwiYXZhaWxhYmxlTmFtZSIsImxicnlDb25maWciLCJib2R5IiwiQ0xBSU1TX1BFUl9QQUdFIiwiY2xhaW1zIiwidG90YWxQYWdlcyIsImRldGVybWluZVRvdGFsUGFnZXMiLCJwYWdpbmF0aW9uUGFnZSIsImdldFBhZ2VGcm9tUXVlcnkiLCJ2aWV3RGF0YSIsImV4dHJhY3RQYWdlRnJvbUNsYWltcyIsInByZXZpb3VzUGFnZSIsImRldGVybWluZVByZXZpb3VzUGFnZSIsImN1cnJlbnRQYWdlIiwibmV4dFBhZ2UiLCJkZXRlcm1pbmVOZXh0UGFnZSIsInRvdGFsUmVzdWx0cyIsImRldGVybWluZVRvdGFsQ2xhaW1zIiwicGFyc2VJbnQiLCJwYWdlTnVtYmVyIiwiY2xhaW1TdGFydEluZGV4IiwiY2xhaW1FbmRJbmRleCIsInBhZ2VPZkNsYWltcyIsInRvdGFsQ2xhaW1zIiwiZnVsbFBhZ2VzIiwiTWF0aCIsImZsb29yIiwicmVtYWluZGVyIiwiY2hhbm5lbFNob3J0SWRSb3V0ZSIsInJlc29sdmVDbGFpbSIsImNsYWltSW5mbyIsInJlc29sdmVSZXN1bHQiLCJmaWxlRGF0YSIsImNvbXBsZXRlZCIsImF1dGhlbnRpY2F0ZVVzZXIiLCJmaWxlcyIsInVzZXIiLCJjaGFubmVsUGFzc3dvcmQiLCJ2YWxpZGF0ZWRDbGFpbU5hbWUiLCJ0aHVtYm5haWxQdWJsaXNoUGFyYW1zIiwibGJyeVR4IiwiYXV0aGVudGljYXRlQ2hhbm5lbENyZWRlbnRpYWxzIiwidXNlclBhc3N3b3JkIiwiY2hhbm5lbEZpbmRQYXJhbXMiLCJnZXQiLCJVc2VyIiwidXNlck5hbWUiLCJjb21wYXJlUGFzc3dvcmQiLCJpc01hdGNoIiwicmVzb2x2ZWRVcmkiLCJnZXRTaG9ydENsYWltSWRGcm9tTG9uZ0NsYWltSWQiLCJjbGFpbUxpc3QiLCJzZXJ2ZUFzc2V0QnlDbGFpbSIsInNlcnZlQXNzZXRCeUlkZW50aWZpZXJBbmRDbGFpbSIsImxicnlVcmkiLCJoYW5kbGVTaG93UmVuZGVyIiwiaW5pdGlhbFN0YXRlIiwiYXNzaWduIiwicHVibGlzaEluQ2hhbm5lbCIsInNlbGVjdGVkQ2hhbm5lbCIsInB1Ymxpc2hTdWJtaXQiLCJjaGFubmVsTGlzdCIsInNpdGVDb25maWciLCJnb29nbGVBbmFseXRpY3NJZCIsImluaXRpYWxpemUiLCJHQUxpc3RlbmVyIiwic2VuZFBhZ2VWaWV3IiwibG9jYXRpb24iLCJsaXN0ZW4iLCJzZXQiLCJwYXRobmFtZSIsInBhZ2V2aWV3IiwiY2hpbGRyZW4iLCJIb21lUGFnZSIsIlNFTyIsInBhZ2VVcmkiLCJwYWdlVGl0bGUiLCJtZXRhVGFncyIsImNhbm9uaWNhbExpbmsiLCJyZWwiLCJocmVmIiwib2JqZWN0IiwiY3JlYXRlUGFnZVRpdGxlIiwiZGV0ZXJtaW5lT2dUaHVtYm5haWxDb250ZW50VHlwZSIsImZpbGVFeHQiLCJsYXN0SW5kZXhPZiIsImNyZWF0ZUJhc2ljTWV0YVRhZ3MiLCJwcm9wZXJ0eSIsImNvbnRlbnQiLCJjcmVhdGVDaGFubmVsTWV0YVRhZ3MiLCJjcmVhdGVBc3NldE1ldGFUYWdzIiwiZW1iZWRVcmwiLCJzaG93VXJsIiwic291cmNlIiwib2dUaXRsZSIsIm9nRGVzY3JpcHRpb24iLCJvZ1RodW1ibmFpbENvbnRlbnRUeXBlIiwib2dUaHVtYm5haWwiLCJjcmVhdGVNZXRhVGFncyIsImNyZWF0ZUJhc2ljQ2Fub25pY2FsTGluayIsImNyZWF0ZUFzc2V0Q2Fub25pY2FsTGluayIsImNyZWF0ZUNoYW5uZWxDYW5vbmljYWxMaW5rIiwiY3JlYXRlQ2Fub25pY2FsTGluayIsIlZJRVciLCJMT0dPVVQiLCJOYXZCYXIiLCJjaGVja0ZvckxvZ2dlZEluVXNlciIsImxvZ291dFVzZXIiLCJoYW5kbGVTZWxlY3Rpb24iLCJjcmVkZW50aWFscyIsInNob3J0Q2hhbm5lbElkIiwidGFyZ2V0Iiwic2VsZWN0ZWRPcHRpb25zIiwiTG9nbyIsIk5hdkJhckNoYW5uZWxEcm9wZG93biIsImRlZmF1bHRTZWxlY3Rpb24iLCJQdWJsaXNoVG9vbCIsIkRyb3B6b25lIiwiZHJhZ092ZXIiLCJtb3VzZU92ZXIiLCJkaW1QcmV2aWV3IiwiaGFuZGxlRHJvcCIsImhhbmRsZURyYWdPdmVyIiwiaGFuZGxlRHJhZ0VuZCIsImhhbmRsZURyYWdFbnRlciIsImhhbmRsZURyYWdMZWF2ZSIsImhhbmRsZU1vdXNlRW50ZXIiLCJoYW5kbGVNb3VzZUxlYXZlIiwiaGFuZGxlQ2xpY2siLCJoYW5kbGVGaWxlSW5wdXQiLCJjaG9vc2VGaWxlIiwicHJldmVudERlZmF1bHQiLCJkdCIsImRhdGFUcmFuc2ZlciIsIml0ZW1zIiwia2luZCIsImRyb3BwZWRGaWxlIiwiZ2V0QXNGaWxlIiwicmVtb3ZlIiwiY2xlYXJEYXRhIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImNsaWNrIiwiZmlsZUxpc3QiLCJ2YWxpZGF0ZUZpbGUiLCJQdWJsaXNoUHJldmlldyIsImltZ1NvdXJjZSIsInNldFByZXZpZXdJbWFnZVNvdXJjZSIsIm5ld1Byb3BzIiwic2V0UHJldmlld0ltYWdlU291cmNlRnJvbUZpbGUiLCJwcmV2aWV3UmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWRlbmQiLCJib29sIiwiUHVibGlzaERldGFpbHMiLCJvblB1Ymxpc2hTdWJtaXQiLCJvbk1ldGFkYXRhQ2hhbmdlIiwiUHVibGlzaFRpdGxlSW5wdXQiLCJoYW5kbGVJbnB1dCIsImUiLCJsb2dnZWRJbkNoYW5uZWxOYW1lIiwibG9nZ2VkSW5DaGFubmVsU2hvcnRJZCIsInVybEVycm9yIiwib25DbGFpbUNoYW5nZSIsIm9uVXJsRXJyb3IiLCJQdWJsaXNoVXJsSW5wdXQiLCJzZXRDbGFpbU5hbWUiLCJ2YWxpZGF0ZUNsYWltIiwiY2xlYW5zZUlucHV0IiwiZmlsZU5hbWVXaXRob3V0RW5kaW5nIiwiY2xlYW5DbGFpbU5hbWUiLCJVcmxNaWRkbGUiLCJkYXRhVVJJdG9CbG9iIiwiZGF0YVVSSSIsImJ5dGVTdHJpbmciLCJhdG9iIiwic3BsaXQiLCJtaW1lU3RyaW5nIiwiaWEiLCJVaW50OEFycmF5IiwiY2hhckNvZGVBdCIsIkJsb2IiLCJQdWJsaXNoVGh1bWJuYWlsSW5wdXQiLCJ2aWRlb1NvdXJjZSIsInNsaWRlck1pblJhbmdlIiwic2xpZGVyTWF4UmFuZ2UiLCJzbGlkZXJWYWx1ZSIsImhhbmRsZVZpZGVvTG9hZGVkRGF0YSIsImhhbmRsZVNsaWRlckNoYW5nZSIsImNyZWF0ZVRodW1ibmFpbCIsInNldFZpZGVvU291cmNlIiwibmV4dFByb3BzIiwiZGF0YVVyaSIsImJsb2IiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJ0b3RhbE1pbnV0ZXMiLCJ0b3RhbFNlY29uZHMiLCJ2aWRlbyIsImN1cnJlbnRUaW1lIiwiY2FudmFzIiwiY3JlYXRlRWxlbWVudCIsIndpZHRoIiwidmlkZW9XaWR0aCIsInZpZGVvSGVpZ2h0IiwiZ2V0Q29udGV4dCIsImRyYXdJbWFnZSIsImRhdGFVcmwiLCJ0b0RhdGFVUkwiLCJzbmFwc2hvdCIsImRpc3BsYXkiLCJvblRvZ2dsZU1ldGFkYXRhSW5wdXRzIiwiUHVibGlzaE1ldGFkYXRhSW5wdXRzIiwidG9nZ2xlU2hvd0lucHV0cyIsImhhbmRsZVNlbGVjdCIsImNoZWNrZWQiLCJzZWxlY3RlZE9wdGlvbiIsIm1heEhlaWdodCIsIkV4cGFuZGluZ1RleHRhcmVhIiwiX2hhbmRsZUNoYW5nZSIsImFkanVzdFRleHRhcmVhIiwib25DaGFuZ2UiLCJlbCIsInN0eWxlIiwic2Nyb2xsSGVpZ2h0IiwicmVzdCIsIngiLCJmdW5jIiwiY2hhbm5lbEVycm9yIiwib25QdWJsaXNoSW5DaGFubmVsQ2hhbmdlIiwib25DaGFubmVsU2VsZWN0Iiwic3RhdGVzIiwiQ2hhbm5lbFNlbGVjdCIsInRvZ2dsZUFub255bW91c1B1Ymxpc2giLCJDaGFubmVsTG9naW5Gb3JtIiwicGFzc3dvcmQiLCJsb2dpblRvQ2hhbm5lbCIsInVzZXJuYW1lIiwiSGVhZGVycyIsIkNoYW5uZWxDcmVhdGVGb3JtIiwiaGFuZGxlQ2hhbm5lbElucHV0IiwiY2xlYW5zZUNoYW5uZWxJbnB1dCIsInVwZGF0ZUlzQ2hhbm5lbEF2YWlsYWJsZSIsImNoYW5uZWxXaXRoQXRTeW1ib2wiLCJjaGVja0lzUGFzc3dvcmRQcm92aWRlZCIsImNoZWNrSXNDaGFubmVsQXZhaWxhYmxlIiwibWFrZVB1Ymxpc2hDaGFubmVsUmVxdWVzdCIsIkFjdGl2ZVN0YXR1c0JhciIsIkluYWN0aXZlU3RhdHVzQmFyIiwicHVibGlzaFN0YXRlcyIsIlB1Ymxpc2hTdGF0dXMiLCJMT0FEX1NUQVJUIiwiTE9BRElORyIsIlBVQkxJU0hJTkciLCJTVUNDRVNTIiwiRkFJTEVEIiwiUHVibGlzaERpc2FibGVkTWVzc2FnZSIsIkFib3V0UGFnZSIsIkxvZ2luUGFnZSIsIlNob3dQYWdlIiwiU2hvd0xpdGUiLCJBc3NldERpc3BsYXkiLCJTaG93QXNzZXREZXRhaWxzIiwiQXNzZXRUaXRsZSIsIkFzc2V0SW5mbyIsImNvcHlUb0NsaXBib2FyZCIsImVsZW1lbnRUb0NvcHkiLCJkYXRhc2V0IiwiZWxlbWVudHRvY29weSIsInNlbGVjdCIsImV4ZWNDb21tYW5kIiwicHJldmlvdXNSZXF1ZXN0IiwiU2hvd0NoYW5uZWwiLCJDaGFubmVsQ2xhaW1zRGlzcGxheSIsInNob3dOZXh0UmVzdWx0c1BhZ2UiLCJzaG93UHJldmlvdXNSZXN1bHRzUGFnZSIsInNob3dOZXdQYWdlIiwiZGVmYXVsdHMiLCJBc3NldFByZXZpZXciLCJkaXJlY3RTb3VyY2VMaW5rIiwic2hvd1VybExpbmsiLCJGb3VyT2hGb3JQYWdlIiwidG9TdHJpbmciLCJtZXRhIiwibGluayIsImhhbmRsZVNob3dQYWdlVXJpIiwid2F0Y2hIYW5kbGVTaG93UGFnZVVyaSIsInBhcnNlQW5kVXBkYXRlSWRlbnRpZmllckFuZENsYWltIiwicGFyc2VBbmRVcGRhdGVDbGFpbU9ubHkiLCJuZXdBc3NldFJlcXVlc3QiLCJ3YXRjaE5ld0Fzc2V0UmVxdWVzdCIsImdldFNob3J0SWQiLCJnZXRDbGFpbURhdGEiLCJuZXdDaGFubmVsUmVxdWVzdCIsIndhdGNoTmV3Q2hhbm5lbFJlcXVlc3QiLCJ3YXRjaFVwZGF0ZUNoYW5uZWxDbGFpbXMiLCJnZXROZXdDbGFpbXNBbmRVcGRhdGVDaGFubmVsIiwiZXh0ZW5zaW9uU2VwZXJhdG9yIiwiaWRlbnRpZmllckNsYWltIiwic2lnbnVwIiwibG9naW4iLCJsb2dvdXQiLCJuZXh0IiwiYXV0aGVudGljYXRlIiwibG9nSW4iLCJMb2dnZXJDb25maWciLCJsb2dMZXZlbCIsInRyYW5zcG9ydHMiLCJDb25zb2xlIiwibGV2ZWwiLCJ0aW1lc3RhbXAiLCJjb2xvcml6ZSIsInByZXR0eVByaW50IiwiaGFuZGxlRXhjZXB0aW9ucyIsImh1bWFuUmVhZGFibGVVbmhhbmRsZWRFeGNlcHRpb24iLCJ3YXJuIiwic2lsbHkiLCJ3aW5zdG9uU2xhY2tXZWJIb29rIiwiU2xhY2tXZWJIb29rIiwid2luc3RvbiIsIlNsYWNrQ29uZmlnIiwic2xhY2tXZWJIb29rIiwic2xhY2tFcnJvckNoYW5uZWwiLCJzbGFja0luZm9DaGFubmVsIiwiYWRkIiwid2ViaG9va1VybCIsImljb25FbW9qaSIsImxvY2FsTG9naW5TdHJhdGVneSIsImxvY2FsU2lnbnVwU3RyYXRlZ3kiLCJzZXJpYWxpemVTcGVlY2hVc2VyIiwiZGVzZXJpYWxpemVTcGVlY2hVc2VyIiwiZGVzZXJpYWxpemVVc2VyIiwic2VyaWFsaXplVXNlciIsInVzZSIsIlBhc3Nwb3J0TG9jYWxTdHJhdGVneSIsIlN0cmF0ZWd5IiwicmV0dXJuVXNlckFuZENoYW5uZWxJbmZvIiwidXNlckluc3RhbmNlIiwidXNlckluZm8iLCJnZXRDaGFubmVsIiwidXNlcm5hbWVGaWVsZCIsInBhc3N3b3JkRmllbGQiLCJ1c2VyRGF0YSIsImNlcnRpZmljYXRlRGF0YSIsImNyZWF0ZSIsIm5ld1VzZXIiLCJuZXdDaGFubmVsIiwibmV3Q2VydGlmaWNhdGUiLCJzZXRDaGFubmVsIiwic2V0VXNlciIsIlJlcXVlc3QiLCJzZXF1ZWxpemUiLCJTVFJJTkciLCJCT09MRUFOIiwiSU5URUdFUiIsIlRFWFQiLCJERUNJTUFMIiwiZGVmaW5lIiwiZGVmYXVsdCIsImNsYWltU2VxdWVuY2UiLCJkZWNvZGVkQ2xhaW0iLCJkZXB0aCIsImVmZmVjdGl2ZUFtb3VudCIsImhhc1NpZ25hdHVyZSIsImhleCIsInZhbGlkQXRIZWlnaHQiLCJ2YWx1ZVZlcnNpb24iLCJjbGFpbVR5cGUiLCJjZXJ0aWZpY2F0ZVZlcnNpb24iLCJrZXlUeXBlIiwicHVibGljS2V5IiwiZnJlZXplVGFibGVOYW1lIiwiYXNzb2NpYXRlIiwiYmVsb25nc1RvIiwiZm9yZWlnbktleSIsImFsbG93TnVsbCIsIm9yZGVyIiwiZ2V0TG9uZ0NoYW5uZWxJZEZyb21TaG9ydENoYW5uZWxJZCIsIiRsaWtlIiwiZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZSIsInZhbGlkYXRlTG9uZ0NoYW5uZWxJZCIsImhhc09uZSIsImRldGVybWluZUZpbGVFeHRlbnNpb25Gcm9tQ29udGVudFR5cGUiLCJkZXRlcm1pbmVUaHVtYm5haWwiLCJzdG9yZWRUaHVtYm5haWwiLCJwcmVwYXJlQ2xhaW1EYXRhIiwibGljZW5zZVVybCIsInByZXZpZXciLCJtZXRhZGF0YVZlcnNpb24iLCJzb3VyY2VUeXBlIiwic291cmNlVmVyc2lvbiIsInN0cmVhbVZlcnNpb24iLCJyYXciLCJnZXRMb25nQ2xhaW1JZEZyb21TaG9ydENsYWltSWQiLCJnZXRUb3BGcmVlQ2xhaW1JZEJ5Q2xhaW1OYW1lIiwidmFsaWRhdGVMb25nQ2xhaW1JZCIsImNsYWltQXJyYXkiLCJkZWZhdWx0VmFsdWUiLCJ0cmVuZGluZ0VsaWdpYmxlIiwiaGFzTWFueSIsImdldFJlY2VudENsYWltcyIsImxpbWl0IiwiaXBBZGRyZXNzIiwiYmNyeXB0IiwicHJvdG90eXBlIiwiY29tcGFyZSIsImNoYW5nZVBhc3N3b3JkIiwibmV3UGFzc3dvcmQiLCJnZW5TYWx0Iiwic2FsdEVycm9yIiwic2FsdCIsImhhc2giLCJoYXNoRXJyb3IiLCJ1cGRhdGUiLCJob29rIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7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SUFGSCxDQUVRLFlBQU07QUFDVlM7QUFDRCxXQUpILEVBS0dZLEtBTEgsQ0FLUyxpQkFBUztBQUNkWCxtQkFBTzlMLEtBQVA7QUFDRCxXQVBIO0FBUUQsU0FoQkQ7QUFpQkQsT0F4QkQ7QUF5QkQsS0EzQk0sQ0FBUDtBQTRCRCxHQTdCRDs7QUErQkE7QUFDQW9lLE9BQUtrWCxJQUFMLENBQVUsY0FBVixFQUEwQixVQUFDM1gsSUFBRCxFQUFPelMsT0FBUCxFQUFtQjtBQUMzQ3pMLFdBQU91SyxLQUFQLENBQWEsMkJBQWI7QUFDQSxXQUFPLElBQUlxQixPQUFKLENBQVksVUFBQ1EsT0FBRCxFQUFVQyxNQUFWLEVBQXFCO0FBQ3RDO0FBQ0E2b0IsYUFBT0ssT0FBUCxDQUFlLFVBQUNDLFNBQUQsRUFBWUMsSUFBWixFQUFxQjtBQUNsQyxZQUFJRCxTQUFKLEVBQWU7QUFDYngxQixpQkFBT08sS0FBUCxDQUFhLFlBQWIsRUFBMkJpMUIsU0FBM0I7QUFDQW5wQixpQkFBT21wQixTQUFQO0FBQ0E7QUFDRDtBQUNEO0FBQ0FOLGVBQU9RLElBQVAsQ0FBWXhYLEtBQUt3TSxRQUFqQixFQUEyQitLLElBQTNCLEVBQWlDLFVBQUNFLFNBQUQsRUFBWUQsSUFBWixFQUFxQjtBQUNwRDtBQUNBLGNBQUlDLFNBQUosRUFBZTtBQUNiMzFCLG1CQUFPTyxLQUFQLENBQWEsWUFBYixFQUEyQm8xQixTQUEzQjtBQUNBdHBCLG1CQUFPc3BCLFNBQVA7QUFDQTtBQUNEO0FBQ0Q7QUFDQXpYLGVBQUt3TSxRQUFMLEdBQWdCZ0wsSUFBaEI7QUFDQXRwQjtBQUNELFNBVkQ7QUFXRCxPQWxCRDtBQW1CRCxLQXJCTSxDQUFQO0FBc0JELEdBeEJEOztBQTBCQSxTQUFPdVMsSUFBUDtBQUNELENBckZELEM7Ozs7OztBQ0pBLG1DIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQyKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA5MGI5MDYyYmUzMTQxNzU3ZjQyYyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVhY3RcIlxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1yZWR1eFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0LXJlZHV4XCJcbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwid2luc3RvblwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndpbnN0b25cIlxuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBoYW5kbGVFcnJvclJlc3BvbnNlOiBmdW5jdGlvbiAob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBFcnJvciBvbiAke29yaWdpbmFsVXJsfWAsIG1vZHVsZS5leHBvcnRzLnVzZU9iamVjdFByb3BlcnRpZXNJZk5vS2V5cyhlcnJvcikpO1xuICAgIGNvbnN0IFtzdGF0dXMsIG1lc3NhZ2VdID0gbW9kdWxlLmV4cG9ydHMucmV0dXJuRXJyb3JNZXNzYWdlQW5kU3RhdHVzKGVycm9yKTtcbiAgICByZXNcbiAgICAgIC5zdGF0dXMoc3RhdHVzKVxuICAgICAgLmpzb24obW9kdWxlLmV4cG9ydHMuY3JlYXRlRXJyb3JSZXNwb25zZVBheWxvYWQoc3RhdHVzLCBtZXNzYWdlKSk7XG4gIH0sXG4gIHJldHVybkVycm9yTWVzc2FnZUFuZFN0YXR1czogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgbGV0IHN0YXR1cywgbWVzc2FnZTtcbiAgICAvLyBjaGVjayBmb3IgZGFlbW9uIGJlaW5nIHR1cm5lZCBvZmZcbiAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VDT05OUkVGVVNFRCcpIHtcbiAgICAgIHN0YXR1cyA9IDUwMztcbiAgICAgIG1lc3NhZ2UgPSAnQ29ubmVjdGlvbiByZWZ1c2VkLiAgVGhlIGRhZW1vbiBtYXkgbm90IGJlIHJ1bm5pbmcuJztcbiAgICAgIC8vIGZhbGxiYWNrIGZvciBldmVyeXRoaW5nIGVsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdHVzID0gNDAwO1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3I7XG4gICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFtzdGF0dXMsIG1lc3NhZ2VdO1xuICB9LFxuICB1c2VPYmplY3RQcm9wZXJ0aWVzSWZOb0tleXM6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZXJyKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBuZXdFcnJvck9iamVjdCA9IHt9O1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgbmV3RXJyb3JPYmplY3Rba2V5XSA9IGVycltrZXldO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3RXJyb3JPYmplY3Q7XG4gICAgfVxuICAgIHJldHVybiBlcnI7XG4gIH0sXG4gIGNyZWF0ZUVycm9yUmVzcG9uc2VQYXlsb2FkIChzdGF0dXMsIG1lc3NhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzLFxuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBtZXNzYWdlLFxuICAgIH07XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcyIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3B1Ymxpc2hfYWN0aW9uX3R5cGVzJztcblxuLy8gZXhwb3J0IGFjdGlvbiBjcmVhdG9yc1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEZpbGUgKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkZJTEVfU0VMRUNURUQsXG4gICAgZGF0YTogZmlsZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZpbGUgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRklMRV9DTEVBUixcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNZXRhZGF0YSAobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLk1FVEFEQVRBX1VQREFURSxcbiAgICBkYXRhOiB7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDbGFpbSAodmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNMQUlNX1VQREFURSxcbiAgICBkYXRhOiB2YWx1ZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRQdWJsaXNoSW5DaGFubmVsIChjaGFubmVsKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5TRVRfUFVCTElTSF9JTl9DSEFOTkVMLFxuICAgIGNoYW5uZWwsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUHVibGlzaFN0YXR1cyAoc3RhdHVzLCBtZXNzYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5QVUJMSVNIX1NUQVRVU19VUERBVEUsXG4gICAgZGF0YToge1xuICAgICAgc3RhdHVzLFxuICAgICAgbWVzc2FnZSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUVycm9yIChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRVJST1JfVVBEQVRFLFxuICAgIGRhdGE6IHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkQ2hhbm5lbCAoY2hhbm5lbE5hbWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlNFTEVDVEVEX0NIQU5ORUxfVVBEQVRFLFxuICAgIGRhdGE6IGNoYW5uZWxOYW1lLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZU1ldGFkYXRhSW5wdXRzIChzaG93TWV0YWRhdGFJbnB1dHMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlRPR0dMRV9NRVRBREFUQV9JTlBVVFMsXG4gICAgZGF0YTogc2hvd01ldGFkYXRhSW5wdXRzLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uTmV3VGh1bWJuYWlsIChmaWxlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5USFVNQk5BSUxfTkVXLFxuICAgIGRhdGE6IGZpbGUsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRQdWJsaXNoIChoaXN0b3J5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5QVUJMSVNIX1NUQVJULFxuICAgIGRhdGE6IHsgaGlzdG9yeSB9LFxuICB9O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2FjdGlvbnMvcHVibGlzaC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LXJvdXRlci1kb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1yb3V0ZXItZG9tXCJcbi8vIG1vZHVsZSBpZCA9IDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZnVuY3Rpb24gU2l0ZUNvbmZpZyAoKSB7XG4gIHRoaXMuYW5hbHl0aWNzID0ge1xuICAgIGdvb2dsZUlkOiAnZGVmYXVsdCcsXG4gIH07XG4gIHRoaXMuYXNzZXREZWZhdWx0cyA9IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FuIGFzc2V0IHB1Ymxpc2hlZCBvbiBTcGVlLmNoJyxcbiAgICB0aHVtYm5haWwgIDogJ2h0dHBzOi8vc3BlZS5jaC9hc3NldHMvaW1nL3ZpZGVvX3RodW1iX2RlZmF1bHQucG5nJyxcbiAgICB0aXRsZSAgICAgIDogJ1NwZWUuY2gnLFxuICB9O1xuICB0aGlzLmF1dGggPSB7XG4gICAgc2Vzc2lvbktleTogJ2RlZmF1bHQnLFxuICB9O1xuICB0aGlzLmN1c3RvbUNvbXBvbmVudHMgPSB7XG4gICAgY29tcG9uZW50czoge30sXG4gICAgY29udGFpbmVyczoge30sXG4gICAgcGFnZXMgICAgIDoge30sXG4gIH07XG4gIHRoaXMuZGV0YWlscyA9IHtcbiAgICBkZXNjcmlwdGlvbjogJ09wZW4tc291cmNlLCBkZWNlbnRyYWxpemVkIGltYWdlIGFuZCB2aWRlbyBzaGFyaW5nLicsXG4gICAgaG9zdCAgICAgICA6ICdkZWZhdWx0JyxcbiAgICBwb3J0ICAgICAgIDogMzAwMCxcbiAgICB0aXRsZSAgICAgIDogJ1NwZWUuY2gnLFxuICAgIHR3aXR0ZXIgICAgOiAnQHNwZWVfY2gnLFxuICB9O1xuICB0aGlzLnB1Ymxpc2hpbmcgPSB7XG4gICAgYWRkaXRpb25hbENsYWltQWRkcmVzc2VzOiBbXSxcbiAgICBkaXNhYmxlZCAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgIGRpc2FibGVkTWVzc2FnZSAgICAgICAgIDogJ1BsZWFzZSBjaGVjayBiYWNrIHNvb24uJyxcbiAgICBwcmltYXJ5Q2xhaW1BZGRyZXNzICAgICA6ICdkZWZhdWx0JyxcbiAgICB0aHVtYm5haWxDaGFubmVsICAgICAgICA6ICdkZWZhdWx0JyxcbiAgICB0aHVtYm5haWxDaGFubmVsSWQgICAgICA6ICdkZWZhdWx0JyxcbiAgICB1cGxvYWREaXJlY3RvcnkgICAgICAgICA6ICcvaG9tZS9sYnJ5L1VwbG9hZHMnLFxuICB9O1xuICB0aGlzLmNvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdObyBzaXRlIGNvbmZpZyByZWNlaXZlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgeyBhbmFseXRpY3MsIGFzc2V0RGVmYXVsdHMsIGF1dGgsIGN1c3RvbUNvbXBvbmVudHMsIGRldGFpbHMsIHB1Ymxpc2hpbmcgfSA9IGNvbmZpZztcbiAgICB0aGlzLmFuYWx5dGljcyA9IGFuYWx5dGljcztcbiAgICB0aGlzLmFzc2V0RGVmYXVsdHMgPSBhc3NldERlZmF1bHRzO1xuICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB0aGlzLnB1Ymxpc2hpbmcgPSBwdWJsaXNoaW5nO1xuICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cyA9IGN1c3RvbUNvbXBvbmVudHM7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTaXRlQ29uZmlnKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvc2l0ZUNvbmZpZy5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyB1cGRhdGVMb2dnZWRJbkNoYW5uZWwgfSBmcm9tICdhY3Rpb25zL2NoYW5uZWwnO1xuaW1wb3J0IHt1cGRhdGVTZWxlY3RlZENoYW5uZWx9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBjaGFubmVsLCBzaXRlIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsTmFtZSAgIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgICBjaGFubmVsU2hvcnRJZDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwuc2hvcnRJZCxcbiAgICBjaGFubmVsTG9uZ0lkIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubG9uZ0lkLFxuICAgIHNpdGVEZXNjcmlwdGlvbjogc2l0ZS5kZXNjcmlwdGlvbixcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNoYW5uZWxMb2dpbjogKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKG5hbWUpKTtcbiAgICB9LFxuICAgIG9uQ2hhbm5lbExvZ291dDogKCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG51bGwsIG51bGwsIG51bGwpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9OYXZCYXIvaW5kZXguanMiLCJpbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9zaG93X2FjdGlvbl90eXBlcyc7XG5cbmltcG9ydCB7IENIQU5ORUwsIEFTU0VUX0xJVEUsIEFTU0VUX0RFVEFJTFMgfSBmcm9tICdjb25zdGFudHMvc2hvd19yZXF1ZXN0X3R5cGVzJztcblxuLy8gYmFzaWMgcmVxdWVzdCBwYXJzaW5nXG5leHBvcnQgZnVuY3Rpb24gb25IYW5kbGVTaG93UGFnZVVyaSAocGFyYW1zKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5IQU5ETEVfU0hPV19VUkksXG4gICAgZGF0YTogcGFyYW1zLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uUmVxdWVzdEVycm9yIChlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuUkVRVUVTVF9FUlJPUixcbiAgICBkYXRhOiBlcnJvcixcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvbk5ld0NoYW5uZWxSZXF1ZXN0IChjaGFubmVsTmFtZSwgY2hhbm5lbElkKSB7XG4gIGNvbnN0IHJlcXVlc3RUeXBlID0gQ0hBTk5FTDtcbiAgY29uc3QgcmVxdWVzdElkID0gYGNyIyR7Y2hhbm5lbE5hbWV9IyR7Y2hhbm5lbElkfWA7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DSEFOTkVMX1JFUVVFU1RfTkVXLFxuICAgIGRhdGE6IHsgcmVxdWVzdFR5cGUsIHJlcXVlc3RJZCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uTmV3QXNzZXRSZXF1ZXN0IChuYW1lLCBpZCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCwgZXh0ZW5zaW9uKSB7XG4gIGNvbnN0IHJlcXVlc3RUeXBlID0gZXh0ZW5zaW9uID8gQVNTRVRfTElURSA6IEFTU0VUX0RFVEFJTFM7XG4gIGNvbnN0IHJlcXVlc3RJZCA9IGBhciMke25hbWV9IyR7aWR9IyR7Y2hhbm5lbE5hbWV9IyR7Y2hhbm5lbElkfWA7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5BU1NFVF9SRVFVRVNUX05FVyxcbiAgICBkYXRhOiB7XG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIG5hbWUsXG4gICAgICBtb2RpZmllcjoge1xuICAgICAgICBpZCxcbiAgICAgICAgY2hhbm5lbDoge1xuICAgICAgICAgIG5hbWU6IGNoYW5uZWxOYW1lLFxuICAgICAgICAgIGlkICA6IGNoYW5uZWxJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvblJlcXVlc3RVcGRhdGUgKHJlcXVlc3RUeXBlLCByZXF1ZXN0SWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlJFUVVFU1RfVVBEQVRFLFxuICAgIGRhdGE6IHtcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgcmVxdWVzdElkLFxuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkUmVxdWVzdFRvUmVxdWVzdExpc3QgKGlkLCBlcnJvciwga2V5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5SRVFVRVNUX0xJU1RfQURELFxuICAgIGRhdGE6IHsgaWQsIGVycm9yLCBrZXkgfSxcbiAgfTtcbn07XG5cbi8vIGFzc2V0IGFjdGlvbnNcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFzc2V0VG9Bc3NldExpc3QgKGlkLCBlcnJvciwgbmFtZSwgY2xhaW1JZCwgc2hvcnRJZCwgY2xhaW1EYXRhKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5BU1NFVF9BREQsXG4gICAgZGF0YTogeyBpZCwgZXJyb3IsIG5hbWUsIGNsYWltSWQsIHNob3J0SWQsIGNsYWltRGF0YSB9LFxuICB9O1xufVxuXG4vLyBjaGFubmVsIGFjdGlvbnNcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5ld0NoYW5uZWxUb0NoYW5uZWxMaXN0IChpZCwgbmFtZSwgc2hvcnRJZCwgbG9uZ0lkLCBjbGFpbXNEYXRhKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DSEFOTkVMX0FERCxcbiAgICBkYXRhOiB7IGlkLCBuYW1lLCBzaG9ydElkLCBsb25nSWQsIGNsYWltc0RhdGEgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvblVwZGF0ZUNoYW5uZWxDbGFpbXMgKGNoYW5uZWxLZXksIG5hbWUsIGxvbmdJZCwgcGFnZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX0FTWU5DLFxuICAgIGRhdGE6IHtjaGFubmVsS2V5LCBuYW1lLCBsb25nSWQsIHBhZ2V9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNoYW5uZWxDbGFpbXMgKGNoYW5uZWxMaXN0SWQsIGNsYWltc0RhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNIQU5ORUxfQ0xBSU1TX1VQREFURV9TVUNDRVNTLFxuICAgIGRhdGE6IHtjaGFubmVsTGlzdElkLCBjbGFpbXNEYXRhfSxcbiAgfTtcbn07XG5cbi8vIGRpc3BsYXkgYSBmaWxlXG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlUmVxdWVzdGVkIChuYW1lLCBjbGFpbUlkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5GSUxFX1JFUVVFU1RFRCxcbiAgICBkYXRhOiB7IG5hbWUsIGNsYWltSWQgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVGaWxlQXZhaWxhYmlsaXR5IChzdGF0dXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkZJTEVfQVZBSUxBQklMSVRZX1VQREFURSxcbiAgICBkYXRhOiBzdGF0dXMsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGlzcGxheUFzc2V0RXJyb3IgKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5ESVNQTEFZX0FTU0VUX0VSUk9SLFxuICAgIGRhdGE6IGVycm9yLFxuICB9O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hY3Rpb25zL3Nob3cuanMiLCJmdW5jdGlvbiBteXNxbCAoKSB7XG4gIHRoaXMuZGIgPSB7fTtcbiAgdGhpcy5jb25maWd1cmUgPSAoZGIpID0+IHtcbiAgICBpZiAoIWRiKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ05vIE15U1FMIGNvbmZpZyByZWNlaXZlZC4nKTtcbiAgICB9XG4gICAgLy8gY29uZmlndXJlIGNyZWRlbnRpYWxzXG4gICAgY29uc29sZS5sb2coJ2NvbmZpZ3VyaW5nIG15c3FsLi4uJyk7XG4gICAgdGhpcy5kYiA9IGRiO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgbXlzcWwoKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvbmZpZy9teXNxbENvbmZpZy5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHVhID0gcmVxdWlyZSgndW5pdmVyc2FsLWFuYWx5dGljcycpO1xuY29uc3QgeyBhbmFseXRpY3MgOiB7IGdvb2dsZUlkIH0sIGRldGFpbHM6IHsgdGl0bGUgfSB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuZnVuY3Rpb24gY3JlYXRlU2VydmVFdmVudFBhcmFtcyAoaGVhZGVycywgaXAsIG9yaWdpbmFsVXJsKSB7XG4gIHJldHVybiB7XG4gICAgZXZlbnRDYXRlZ29yeSAgICA6ICdjbGllbnQgcmVxdWVzdHMnLFxuICAgIGV2ZW50QWN0aW9uICAgICAgOiAnc2VydmUgcmVxdWVzdCcsXG4gICAgZXZlbnRMYWJlbCAgICAgICA6IG9yaWdpbmFsVXJsLFxuICAgIGlwT3ZlcnJpZGUgICAgICAgOiBpcCxcbiAgICB1c2VyQWdlbnRPdmVycmlkZTogaGVhZGVyc1sndXNlci1hZ2VudCddLFxuICB9O1xufTtcblxuZnVuY3Rpb24gY3JlYXRlUHVibGlzaFRpbWluZ0V2ZW50UGFyYW1zIChjYXRlZ29yeSwgdmFyaWFibGUsIGxhYmVsLCBzdGFydFRpbWUsIGVuZFRpbWUpIHtcbiAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICByZXR1cm4ge1xuICAgIHVzZXJUaW1pbmdDYXRlZ29yeSAgICA6IGNhdGVnb3J5LFxuICAgIHVzZXJUaW1pbmdWYXJpYWJsZU5hbWU6IHZhcmlhYmxlLFxuICAgIHVzZXJUaW1pbmdUaW1lICAgICAgICA6IGR1cmF0aW9uLFxuICAgIHVzZXJUaW1pbmdMYWJlbCAgICAgICA6IGxhYmVsLFxuICB9O1xufTtcblxuZnVuY3Rpb24gc2VuZEdvb2dsZUFuYWx5dGljc0V2ZW50IChpcCwgcGFyYW1zKSB7XG4gIGNvbnN0IHZpc2l0b3JJZCA9IGlwLnJlcGxhY2UoL1xcLi9nLCAnLScpO1xuICBjb25zdCB2aXNpdG9yID0gdWEoZ29vZ2xlSWQsIHZpc2l0b3JJZCwgeyBzdHJpY3RDaWRGb3JtYXQ6IGZhbHNlLCBodHRwczogdHJ1ZSB9KTtcbiAgdmlzaXRvci5ldmVudChwYXJhbXMsIChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dvb2dsZSBBbmFseXRpY3MgRXZlbnQgRXJyb3IgPj4nLCBlcnIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBzZW5kR29vZ2xlQW5hbHl0aWNzVGltaW5nICh2aXNpdG9ySWQsIHBhcmFtcykge1xuICBjb25zdCB2aXNpdG9yID0gdWEoZ29vZ2xlSWQsIHZpc2l0b3JJZCwgeyBzdHJpY3RDaWRGb3JtYXQ6IGZhbHNlLCBodHRwczogdHJ1ZSB9KTtcbiAgdmlzaXRvci50aW1pbmcocGFyYW1zLCAoZXJyKSA9PiB7XG4gICAgaWYgKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdHb29nbGUgQW5hbHl0aWNzIEV2ZW50IEVycm9yID4+JywgZXJyKTtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKGBUaW1pbmcgZXZlbnQgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gZ29vZ2xlIGFuYWx5dGljc2ApO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZW5kR0FTZXJ2ZUV2ZW50IChoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBjcmVhdGVTZXJ2ZUV2ZW50UGFyYW1zKGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCk7XG4gICAgc2VuZEdvb2dsZUFuYWx5dGljc0V2ZW50KGlwLCBwYXJhbXMpO1xuICB9LFxuICBzZW5kR0FUaW1pbmdFdmVudCAoY2F0ZWdvcnksIHZhcmlhYmxlLCBsYWJlbCwgc3RhcnRUaW1lLCBlbmRUaW1lKSB7XG4gICAgY29uc3QgcGFyYW1zID0gY3JlYXRlUHVibGlzaFRpbWluZ0V2ZW50UGFyYW1zKGNhdGVnb3J5LCB2YXJpYWJsZSwgbGFiZWwsIHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gICAgc2VuZEdvb2dsZUFuYWx5dGljc1RpbWluZyh0aXRsZSwgcGFyYW1zKTtcbiAgfSxcbiAgY2hvb3NlR2FMYnJ5bmV0UHVibGlzaExhYmVsICh7IGNoYW5uZWxfbmFtZTogY2hhbm5lbE5hbWUsIGNoYW5uZWxfaWQ6IGNoYW5uZWxJZCB9KSB7XG4gICAgcmV0dXJuIChjaGFubmVsTmFtZSB8fCBjaGFubmVsSWQgPyAnUFVCTElTSF9JTl9DSEFOTkVMX0NMQUlNJyA6ICdQVUJMSVNIX0FOT05ZTU9VU19DTEFJTScpO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2dvb2dsZUFuYWx5dGljcy5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaXRlIH0pID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0RGVzY3JpcHRpb24sIGRlZmF1bHRUaHVtYm5haWwsIGRlc2NyaXB0aW9uOiBzaXRlRGVzY3JpcHRpb24sIGhvc3Q6IHNpdGVIb3N0LCB0aXRsZTogc2l0ZVRpdGxlLCB0d2l0dGVyOiBzaXRlVHdpdHRlciB9ID0gc2l0ZTtcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0RGVzY3JpcHRpb24sXG4gICAgZGVmYXVsdFRodW1ibmFpbCxcbiAgICBzaXRlRGVzY3JpcHRpb24sXG4gICAgc2l0ZUhvc3QsXG4gICAgc2l0ZVRpdGxlLFxuICAgIHNpdGVUd2l0dGVyLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvU0VPL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvcC10eXBlc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInByb3AtdHlwZXNcIlxuLy8gbW9kdWxlIGlkID0gMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICdjcm9zcy1mZXRjaC9wb2x5ZmlsbCc7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBKU09OIHJldHVybmVkIGJ5IGEgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSByZXNwb25zZSBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9ICAgICAgICAgIFRoZSBwYXJzZWQgSlNPTiBmcm9tIHRoZSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSlNPTiAocmVzcG9uc2UpIHtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHN0YXR1cyByZXR1cm5lZCBieSBhIG5ldHdvcmsgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBUaGUgcGFyc2VkIEpTT04gZnJvbSB0aGUgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHJldHVybiB7b2JqZWN0IHwgdW5kZWZpbmVkfSBSZXR1cm5zIG9iamVjdCB3aXRoIHN0YXR1cyBhbmQgc3RhdHVzVGV4dCwgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3RhdHVzIChyZXNwb25zZSwganNvblJlc3BvbnNlKSB7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgIHJldHVybiBqc29uUmVzcG9uc2U7XG4gIH1cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoanNvblJlc3BvbnNlLm1lc3NhZ2UpO1xuICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhIFVSTCwgcmV0dXJuaW5nIGEgcHJvbWlzZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsICAgICAgIFRoZSBVUkwgd2Ugd2FudCB0byByZXF1ZXN0XG4gKiBAcGFyYW0gIHtvYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyB3ZSB3YW50IHRvIHBhc3MgdG8gXCJmZXRjaFwiXG4gKlxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgVGhlIHJlc3BvbnNlIGRhdGFcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucylcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3Jlc3BvbnNlLCBwYXJzZUpTT04ocmVzcG9uc2UpXSk7XG4gICAgfSlcbiAgICAudGhlbigoW3Jlc3BvbnNlLCBqc29uUmVzcG9uc2VdKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tTdGF0dXMocmVzcG9uc2UsIGpzb25SZXNwb25zZSk7XG4gICAgfSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvcmVxdWVzdC5qcyIsImNvbnN0IGF4aW9zID0gcmVxdWlyZSgnYXhpb3MnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHsgYXBpOiB7IGFwaUhvc3QsIGFwaVBvcnQgfSB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL2xicnlDb25maWcuanMnKTtcbmNvbnN0IGxicnlBcGlVcmkgPSAnaHR0cDovLycgKyBhcGlIb3N0ICsgJzonICsgYXBpUG9ydDtcbmNvbnN0IHsgY2hvb3NlR2FMYnJ5bmV0UHVibGlzaExhYmVsLCBzZW5kR0FUaW1pbmdFdmVudCB9ID0gcmVxdWlyZSgnLi9nb29nbGVBbmFseXRpY3MuanMnKTtcblxuY29uc3QgaGFuZGxlTGJyeW5ldFJlc3BvbnNlID0gKHsgZGF0YSB9LCByZXNvbHZlLCByZWplY3QpID0+IHtcbiAgbG9nZ2VyLmRlYnVnKCdsYnJ5IGFwaSBkYXRhOicsIGRhdGEpO1xuICBpZiAoZGF0YS5yZXN1bHQpIHtcbiAgICAvLyBjaGVjayBmb3IgYW4gZXJyb3JcbiAgICBpZiAoZGF0YS5yZXN1bHQuZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTGJyeW5ldCBhcGkgZXJyb3I6JywgZGF0YS5yZXN1bHQuZXJyb3IpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihkYXRhLnJlc3VsdC5lcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gICAgcmVzb2x2ZShkYXRhLnJlc3VsdCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGZhbGxiYWNrIGluIGNhc2UgaXQganVzdCB0aW1lZCBvdXRcbiAgcmVqZWN0KEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwdWJsaXNoQ2xhaW0gKHB1Ymxpc2hQYXJhbXMpIHtcbiAgICBsb2dnZXIuZGVidWcoYGxicnlBcGkgPj4gUHVibGlzaGluZyBjbGFpbSB0byBcIiR7cHVibGlzaFBhcmFtcy5uYW1lfVwiYCk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAncHVibGlzaCcsXG4gICAgICAgICAgcGFyYW1zOiBwdWJsaXNoUGFyYW1zLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAncHVibGlzaCcsIGNob29zZUdhTGJyeW5ldFB1Ymxpc2hMYWJlbChwdWJsaXNoUGFyYW1zKSwgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgICAgIGhhbmRsZUxicnluZXRSZXNwb25zZShyZXNwb25zZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Q2xhaW0gKHVyaSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBHZXR0aW5nIENsYWltIGZvciBcIiR7dXJpfVwiYCk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgICBwYXJhbXM6IHsgdXJpLCB0aW1lb3V0OiAyMCB9LFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAnZ2V0Q2xhaW0nLCAnR0VUJywgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgICAgIGhhbmRsZUxicnluZXRSZXNwb25zZShyZXNwb25zZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Q2xhaW1MaXN0IChjbGFpbU5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGxicnlBcGkgPj4gR2V0dGluZyBjbGFpbV9saXN0IGZvciBcIiR7Y2xhaW1OYW1lfVwiYCk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAnY2xhaW1fbGlzdCcsXG4gICAgICAgICAgcGFyYW1zOiB7IG5hbWU6IGNsYWltTmFtZSB9LFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAnZ2V0Q2xhaW1MaXN0JywgJ0NMQUlNX0xJU1QnLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaGFuZGxlTGJyeW5ldFJlc3BvbnNlKHJlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICByZXNvbHZlVXJpICh1cmkpIHtcbiAgICBsb2dnZXIuZGVidWcoYGxicnlBcGkgPj4gUmVzb2x2aW5nIFVSSSBmb3IgXCIke3VyaX1cImApO1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXhpb3NcbiAgICAgICAgLnBvc3QobGJyeUFwaVVyaSwge1xuICAgICAgICAgIG1ldGhvZDogJ3Jlc29sdmUnLFxuICAgICAgICAgIHBhcmFtczogeyB1cmkgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAncmVzb2x2ZVVyaScsICdSRVNPTFZFJywgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgICAgIGlmIChkYXRhLnJlc3VsdFt1cmldLmVycm9yKSB7ICAvLyBjaGVjayBmb3IgZXJyb3JzXG4gICAgICAgICAgICByZWplY3QoZGF0YS5yZXN1bHRbdXJpXS5lcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHsgIC8vIGlmIG5vIGVycm9ycywgcmVzb2x2ZVxuICAgICAgICAgICAgcmVzb2x2ZShkYXRhLnJlc3VsdFt1cmldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldERvd25sb2FkRGlyZWN0b3J5ICgpIHtcbiAgICBsb2dnZXIuZGVidWcoJ2xicnlBcGkgPj4gUmV0cmlldmluZyB0aGUgZG93bmxvYWQgZGlyZWN0b3J5IHBhdGggZnJvbSBsYnJ5IGRhZW1vbi4uLicpO1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXhpb3NcbiAgICAgICAgLnBvc3QobGJyeUFwaVVyaSwge1xuICAgICAgICAgIG1ldGhvZDogJ3NldHRpbmdzX2dldCcsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdsYnJ5bmV0JywgJ2dldERvd25sb2FkRGlyZWN0b3J5JywgJ1NFVFRJTkdTX0dFVCcsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5yZXN1bHQuZG93bmxvYWRfZGlyZWN0b3J5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBsYnJ5IGRhZW1vbiwgYnV0IHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZG93bmxvYWQgZGlyZWN0b3J5LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0xicnluZXQgRXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoJy9ob21lL2xicnkvRG93bmxvYWRzLycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgY3JlYXRlQ2hhbm5lbCAobmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBDcmVhdGluZyBjaGFubmVsIGZvciAke25hbWV9Li4uYCk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAnY2hhbm5lbF9uZXcnLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgY2hhbm5lbF9uYW1lOiBuYW1lLFxuICAgICAgICAgICAgYW1vdW50ICAgICAgOiAwLjEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdsYnJ5bmV0JywgJ2NyZWF0ZUNoYW5uZWwnLCAnQ0hBTk5FTF9ORVcnLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaGFuZGxlTGJyeW5ldFJlc3BvbnNlKHJlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2xicnlBcGkuanMiLCIvLyByZXF1ZXN0IGFjdGlvbnNcbmV4cG9ydCBjb25zdCBIQU5ETEVfU0hPV19VUkkgPSAnSEFORExFX1NIT1dfVVJJJztcbmV4cG9ydCBjb25zdCBSRVFVRVNUX0VSUk9SID0gJ1JFUVVFU1RfRVJST1InO1xuZXhwb3J0IGNvbnN0IFJFUVVFU1RfVVBEQVRFID0gJ1JFUVVFU1RfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBBU1NFVF9SRVFVRVNUX05FVyA9ICdBU1NFVF9SRVFVRVNUX05FVyc7XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9SRVFVRVNUX05FVyA9ICdDSEFOTkVMX1JFUVVFU1RfTkVXJztcbmV4cG9ydCBjb25zdCBSRVFVRVNUX0xJU1RfQUREID0gJ1JFUVVFU1RfTElTVF9BREQnO1xuXG4vLyBhc3NldCBhY3Rpb25zXG5leHBvcnQgY29uc3QgQVNTRVRfQUREID0gYEFTU0VUX0FERGA7XG5cbi8vIGNoYW5uZWwgYWN0aW9uc1xuZXhwb3J0IGNvbnN0IENIQU5ORUxfQUREID0gJ0NIQU5ORUxfQUREJztcblxuZXhwb3J0IGNvbnN0IENIQU5ORUxfQ0xBSU1TX1VQREFURV9BU1lOQyA9ICdDSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMnO1xuZXhwb3J0IGNvbnN0IENIQU5ORUxfQ0xBSU1TX1VQREFURV9TVUNDRVNTID0gJ0NIQU5ORUxfQ0xBSU1TX1VQREFURV9TVUNDRVNTJztcblxuLy8gYXNzZXQvZmlsZSBkaXNwbGF5IGFjdGlvbnNcbmV4cG9ydCBjb25zdCBGSUxFX1JFUVVFU1RFRCA9ICdGSUxFX1JFUVVFU1RFRCc7XG5leHBvcnQgY29uc3QgRklMRV9BVkFJTEFCSUxJVFlfVVBEQVRFID0gJ0ZJTEVfQVZBSUxBQklMSVRZX1VQREFURSc7XG5leHBvcnQgY29uc3QgRElTUExBWV9BU1NFVF9FUlJPUiA9ICdESVNQTEFZX0FTU0VUX0VSUk9SJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMuanMiLCJleHBvcnQgY29uc3Qgc2VsZWN0QXNzZXQgPSAoc2hvdykgPT4ge1xuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtzaG93LnJlcXVlc3QuaWRdO1xuICBjb25zdCBhc3NldEtleSA9IHJlcXVlc3Qua2V5O1xuICByZXR1cm4gc2hvdy5hc3NldExpc3RbYXNzZXRLZXldO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdFNob3dTdGF0ZSA9IChzdGF0ZSkgPT4ge1xuICByZXR1cm4gc3RhdGUuc2hvdztcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvc2VsZWN0b3JzL3Nob3cuanMiLCJjb25zdCB7IGRiIH0gPSByZXF1aXJlKCdteXNxbENvbmZpZycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyByZXR1cm5QYWdpbmF0ZWRDaGFubmVsQ2xhaW1zIH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL2NoYW5uZWxQYWdpbmF0aW9uLmpzJyk7XG5cbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XG5jb25zdCBOT19DTEFJTSA9ICdOT19DTEFJTSc7XG5jb25zdCBOT19GSUxFID0gJ05PX0ZJTEUnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q2xhaW1JZCAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBuYW1lLCBjbGFpbUlkKSB7XG4gICAgaWYgKGNoYW5uZWxOYW1lKSB7XG4gICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuZ2V0Q2xhaW1JZEJ5Q2hhbm5lbChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuZ2V0Q2xhaW1JZEJ5Q2xhaW0obmFtZSwgY2xhaW1JZCk7XG4gICAgfVxuICB9LFxuICBnZXRDbGFpbUlkQnlDbGFpbSAoY2xhaW1OYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRDbGFpbUlkQnlDbGFpbSgke2NsYWltTmFtZX0sICR7Y2xhaW1JZH0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRiLkNsYWltLmdldExvbmdDbGFpbUlkKGNsYWltTmFtZSwgY2xhaW1JZClcbiAgICAgICAgLnRoZW4obG9uZ0NsYWltSWQgPT4ge1xuICAgICAgICAgIGlmICghbG9uZ0NsYWltSWQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoTk9fQ0xBSU0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGxvbmdDbGFpbUlkKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Q2xhaW1JZEJ5Q2hhbm5lbCAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldENsYWltSWRCeUNoYW5uZWwoJHtjaGFubmVsTmFtZX0sICR7Y2hhbm5lbENsYWltSWR9LCAke2NsYWltTmFtZX0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRiLkNlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKSAvLyAxLiBnZXQgdGhlIGxvbmcgY2hhbm5lbCBpZFxuICAgICAgICAudGhlbihsb25nQ2hhbm5lbElkID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbG9uZ0NoYW5uZWxJZCwgZGIuQ2xhaW0uZ2V0Q2xhaW1JZEJ5TG9uZ0NoYW5uZWxJZChsb25nQ2hhbm5lbElkLCBjbGFpbU5hbWUpXSk7ICAvLyAyLiBnZXQgdGhlIGxvbmcgY2xhaW0gaWRcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbElkLCBsb25nQ2xhaW1JZF0pID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKE5PX0NIQU5ORUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWxvbmdDbGFpbUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShOT19DTEFJTSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUobG9uZ0NsYWltSWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDaGFubmVsRGF0YSAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBwYWdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIDEuIGdldCB0aGUgbG9uZyBjaGFubmVsIElkIChtYWtlIHN1cmUgY2hhbm5lbCBleGlzdHMpXG4gICAgICBkYi5DZXJ0aWZpY2F0ZS5nZXRMb25nQ2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZClcbiAgICAgICAgLnRoZW4obG9uZ0NoYW5uZWxDbGFpbUlkID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gMi4gZ2V0IHRoZSBzaG9ydCBJRCBhbmQgYWxsIGNsYWltcyBmb3IgdGhhdCBjaGFubmVsXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtsb25nQ2hhbm5lbENsYWltSWQsIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQobG9uZ0NoYW5uZWxDbGFpbUlkLCBjaGFubmVsTmFtZSldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbENsYWltSWQsIHNob3J0Q2hhbm5lbENsYWltSWRdKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKE5PX0NIQU5ORUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyAzLiByZXR1cm4gYWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBjaGFubmVsTmFtZSxcbiAgICAgICAgICAgIGxvbmdDaGFubmVsQ2xhaW1JZCxcbiAgICAgICAgICAgIHNob3J0Q2hhbm5lbENsYWltSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldENoYW5uZWxDbGFpbXMgKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgcGFnZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyAxLiBnZXQgdGhlIGxvbmcgY2hhbm5lbCBJZCAobWFrZSBzdXJlIGNoYW5uZWwgZXhpc3RzKVxuICAgICAgZGIuQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpXG4gICAgICAgIC50aGVuKGxvbmdDaGFubmVsQ2xhaW1JZCA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIDIuIGdldCB0aGUgc2hvcnQgSUQgYW5kIGFsbCBjbGFpbXMgZm9yIHRoYXQgY2hhbm5lbFxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbG9uZ0NoYW5uZWxDbGFpbUlkLCBkYi5DbGFpbS5nZXRBbGxDaGFubmVsQ2xhaW1zKGxvbmdDaGFubmVsQ2xhaW1JZCldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbENsYWltSWQsIGNoYW5uZWxDbGFpbXNBcnJheV0pID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoTk9fQ0hBTk5FTCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIDMuIGZvcm1hdCB0aGUgZGF0YSBmb3IgdGhlIHZpZXcsIGluY2x1ZGluZyBwYWdpbmF0aW9uXG4gICAgICAgICAgbGV0IHBhZ2luYXRlZENoYW5uZWxWaWV3RGF0YSA9IHJldHVyblBhZ2luYXRlZENoYW5uZWxDbGFpbXMoY2hhbm5lbE5hbWUsIGxvbmdDaGFubmVsQ2xhaW1JZCwgY2hhbm5lbENsYWltc0FycmF5LCBwYWdlKTtcbiAgICAgICAgICAvLyA0LiByZXR1cm4gYWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIGFuZCBjb250ZW50c1xuICAgICAgICAgIHJlc29sdmUocGFnaW5hdGVkQ2hhbm5lbFZpZXdEYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0TG9jYWxGaWxlUmVjb3JkIChjbGFpbUlkLCBuYW1lKSB7XG4gICAgcmV0dXJuIGRiLkZpbGUuZmluZE9uZSh7d2hlcmU6IHtjbGFpbUlkLCBuYW1lfX0pXG4gICAgICAudGhlbihmaWxlID0+IHtcbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgcmV0dXJuIE5PX0ZJTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGUuZGF0YVZhbHVlcztcbiAgICAgIH0pO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9jb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWR1eC1zYWdhL2VmZmVjdHNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eC1zYWdhL2VmZmVjdHNcIlxuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyBkYiB9ID0gcmVxdWlyZSgnbXlzcWxDb25maWcnKTtcbmNvbnN0IGxicnlBcGkgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2xicnlBcGkuanMnKTtcbmNvbnN0IHB1Ymxpc2hIZWxwZXJzID0gcmVxdWlyZSgnLi4vaGVscGVycy9wdWJsaXNoSGVscGVycy5qcycpO1xuY29uc3QgeyBwdWJsaXNoaW5nOiB7IHByaW1hcnlDbGFpbUFkZHJlc3MsIGFkZGl0aW9uYWxDbGFpbUFkZHJlc3NlcyB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuY29uc3QgU2VxdWVsaXplID0gcmVxdWlyZSgnc2VxdWVsaXplJyk7XG5jb25zdCBPcCA9IFNlcXVlbGl6ZS5PcDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHB1Ymxpc2ggKHB1Ymxpc2hQYXJhbXMsIGZpbGVOYW1lLCBmaWxlVHlwZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgcHVibGlzaFJlc3VsdHMsIGNlcnRpZmljYXRlSWQsIGNoYW5uZWxOYW1lO1xuICAgICAgLy8gcHVibGlzaCB0aGUgZmlsZVxuICAgICAgcmV0dXJuIGxicnlBcGkucHVibGlzaENsYWltKHB1Ymxpc2hQYXJhbXMpXG4gICAgICAgIC50aGVuKHR4ID0+IHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgU3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZCAke3B1Ymxpc2hQYXJhbXMubmFtZX0gJHtmaWxlTmFtZX1gLCB0eCk7XG4gICAgICAgICAgcHVibGlzaFJlc3VsdHMgPSB0eDtcbiAgICAgICAgICAvLyBnZXQgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb25cbiAgICAgICAgICBpZiAocHVibGlzaFBhcmFtcy5jaGFubmVsX25hbWUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgdGhpcyBjbGFpbSB3YXMgcHVibGlzaGVkIGluIGNoYW5uZWw6ICR7cHVibGlzaFBhcmFtcy5jaGFubmVsX25hbWV9YCk7XG4gICAgICAgICAgICByZXR1cm4gZGIuQ2hhbm5lbC5maW5kT25lKHt3aGVyZToge2NoYW5uZWxOYW1lOiBwdWJsaXNoUGFyYW1zLmNoYW5uZWxfbmFtZX19KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCd0aGlzIGNsYWltIHdhcyBub3QgcHVibGlzaGVkIGluIGEgY2hhbm5lbCcpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAudGhlbihjaGFubmVsID0+IHtcbiAgICAgICAgLy8gc2V0IGNoYW5uZWwgaW5mb3JtYXRpb25cbiAgICAgICAgICBjZXJ0aWZpY2F0ZUlkID0gbnVsbDtcbiAgICAgICAgICBjaGFubmVsTmFtZSA9IG51bGw7XG4gICAgICAgICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgICAgICAgIGNlcnRpZmljYXRlSWQgPSBjaGFubmVsLmNoYW5uZWxDbGFpbUlkO1xuICAgICAgICAgICAgY2hhbm5lbE5hbWUgPSBjaGFubmVsLmNoYW5uZWxOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuZGVidWcoYGNlcnRpZmljYXRlSWQ6ICR7Y2VydGlmaWNhdGVJZH1gKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBjcmVhdGUgdGhlIEZpbGUgcmVjb3JkXG4gICAgICAgICAgY29uc3QgZmlsZVJlY29yZCA9IHtcbiAgICAgICAgICAgIG5hbWUgICAgICAgOiBwdWJsaXNoUGFyYW1zLm5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkICAgIDogcHVibGlzaFJlc3VsdHMuY2xhaW1faWQsXG4gICAgICAgICAgICB0aXRsZSAgICAgIDogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYWRkcmVzcyAgICA6IHB1Ymxpc2hQYXJhbXMuY2xhaW1fYWRkcmVzcyxcbiAgICAgICAgICAgIG91dHBvaW50ICAgOiBgJHtwdWJsaXNoUmVzdWx0cy50eGlkfToke3B1Ymxpc2hSZXN1bHRzLm5vdXR9YCxcbiAgICAgICAgICAgIGhlaWdodCAgICAgOiAwLFxuICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICBmaWxlUGF0aCAgIDogcHVibGlzaFBhcmFtcy5maWxlX3BhdGgsXG4gICAgICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgICAgIG5zZncgICAgICAgOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLm5zZncsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBjcmVhdGUgdGhlIENsYWltIHJlY29yZFxuICAgICAgICAgIGNvbnN0IGNsYWltUmVjb3JkID0ge1xuICAgICAgICAgICAgbmFtZSAgICAgICA6IHB1Ymxpc2hQYXJhbXMubmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQgICAgOiBwdWJsaXNoUmVzdWx0cy5jbGFpbV9pZCxcbiAgICAgICAgICAgIHRpdGxlICAgICAgOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBhZGRyZXNzICAgIDogcHVibGlzaFBhcmFtcy5jbGFpbV9hZGRyZXNzLFxuICAgICAgICAgICAgdGh1bWJuYWlsICA6IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEudGh1bWJuYWlsLFxuICAgICAgICAgICAgb3V0cG9pbnQgICA6IGAke3B1Ymxpc2hSZXN1bHRzLnR4aWR9OiR7cHVibGlzaFJlc3VsdHMubm91dH1gLFxuICAgICAgICAgICAgaGVpZ2h0ICAgICA6IDAsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogZmlsZVR5cGUsXG4gICAgICAgICAgICBuc2Z3ICAgICAgIDogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS5uc2Z3LFxuICAgICAgICAgICAgYW1vdW50ICAgICA6IHB1Ymxpc2hQYXJhbXMuYmlkLFxuICAgICAgICAgICAgY2VydGlmaWNhdGVJZCxcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lLFxuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gdXBzZXJ0IGNyaXRlcmlhXG4gICAgICAgICAgY29uc3QgdXBzZXJ0Q3JpdGVyaWEgPSB7XG4gICAgICAgICAgICBuYW1lICAgOiBwdWJsaXNoUGFyYW1zLm5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkOiBwdWJsaXNoUmVzdWx0cy5jbGFpbV9pZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIHVwc2VydCB0aGUgcmVjb3Jkc1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZGIudXBzZXJ0KGRiLkZpbGUsIGZpbGVSZWNvcmQsIHVwc2VydENyaXRlcmlhLCAnRmlsZScpLCBkYi51cHNlcnQoZGIuQ2xhaW0sIGNsYWltUmVjb3JkLCB1cHNlcnRDcml0ZXJpYSwgJ0NsYWltJyldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtmaWxlLCBjbGFpbV0pID0+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZpbGUgYW5kIENsYWltIHJlY29yZHMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2ZpbGUuc2V0Q2xhaW0oY2xhaW0pLCBjbGFpbS5zZXRGaWxlKGZpbGUpXSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZpbGUgYW5kIENsYWltIHJlY29yZHMgc3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQnKTtcbiAgICAgICAgICByZXNvbHZlKHB1Ymxpc2hSZXN1bHRzKTsgLy8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHQgZnJvbSBsYnJ5QXBpLnB1Ymxpc2hDbGFpbTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1BVQkxJU0ggRVJST1InLCBlcnJvcik7XG4gICAgICAgICAgcHVibGlzaEhlbHBlcnMuZGVsZXRlVGVtcG9yYXJ5RmlsZShwdWJsaXNoUGFyYW1zLmZpbGVfcGF0aCk7IC8vIGRlbGV0ZSB0aGUgbG9jYWwgZmlsZVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBjbGFpbU5hbWVJc0F2YWlsYWJsZSAobmFtZSkge1xuICAgIGNvbnN0IGNsYWltQWRkcmVzc2VzID0gYWRkaXRpb25hbENsYWltQWRkcmVzc2VzIHx8IFtdO1xuICAgIGNsYWltQWRkcmVzc2VzLnB1c2gocHJpbWFyeUNsYWltQWRkcmVzcyk7XG4gICAgLy8gZmluZCBhbnkgcmVjb3JkcyB3aGVyZSB0aGUgbmFtZSBpcyB1c2VkXG4gICAgcmV0dXJuIGRiLkNsYWltXG4gICAgICAuZmluZEFsbCh7XG4gICAgICAgIGF0dHJpYnV0ZXM6IFsnYWRkcmVzcyddLFxuICAgICAgICB3aGVyZSAgICAgOiB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBhZGRyZXNzOiB7XG4gICAgICAgICAgICBbT3Aub3JdOiBjbGFpbUFkZHJlc3NlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoYXQgY2xhaW0gaXMgYWxyZWFkeSBpbiB1c2UnKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgfSxcbiAgY2hlY2tDaGFubmVsQXZhaWxhYmlsaXR5IChuYW1lKSB7XG4gICAgcmV0dXJuIGRiLkNoYW5uZWxcbiAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgd2hlcmU6IHsgY2hhbm5lbE5hbWU6IG5hbWUgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGF0IGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiBjbGFpbWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvY29udHJvbGxlcnMvcHVibGlzaENvbnRyb2xsZXIuanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IHsgZGV0YWlscywgcHVibGlzaGluZyB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlUHVibGlzaEFwaVJlcXVlc3RCb2R5ICh7bmFtZSwgbnNmdywgbGljZW5zZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCB0aHVtYm5haWx9KSB7XG4gICAgLy8gdmFsaWRhdGUgbmFtZVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBuYW1lIGZpZWxkIGZvdW5kIGluIHJlcXVlc3QnKTtcbiAgICB9XG4gICAgY29uc3QgaW52YWxpZE5hbWVDaGFyYWN0ZXJzID0gL1teQS1aYS16MC05LC1dLy5leGVjKG5hbWUpO1xuICAgIGlmIChpbnZhbGlkTmFtZUNoYXJhY3RlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNsYWltIG5hbWUgeW91IHByb3ZpZGVkIGlzIG5vdCBhbGxvd2VkLiAgT25seSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQ6IEEtWiwgYS16LCAwLTksIGFuZCBcIi1cIicpO1xuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzXG4gICAgbnNmdyA9IChuc2Z3ID09PSAndHJ1ZScpO1xuICAgIGxpY2Vuc2UgPSBsaWNlbnNlIHx8IG51bGw7XG4gICAgdGl0bGUgPSB0aXRsZSB8fCBudWxsO1xuICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgbnVsbDtcbiAgICB0aHVtYm5haWwgPSB0aHVtYm5haWwgfHwgbnVsbDtcbiAgICAvLyByZXR1cm4gcmVzdWx0c1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgbnNmdyxcbiAgICAgIGxpY2Vuc2UsXG4gICAgICB0aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgdGh1bWJuYWlsLFxuICAgIH07XG4gIH0sXG4gIHBhcnNlUHVibGlzaEFwaVJlcXVlc3RGaWxlcyAoe2ZpbGUsIHRodW1ibmFpbH0pIHtcbiAgICAvLyBtYWtlIHN1cmUgYSBmaWxlIHdhcyBwcm92aWRlZFxuICAgIGlmICghZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHdpdGgga2V5IG9mIFtmaWxlXSBmb3VuZCBpbiByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGlmICghZmlsZS5wYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZpbGUgcGF0aCBmb3VuZCcpO1xuICAgIH1cbiAgICBpZiAoIWZpbGUudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHR5cGUgZm91bmQnKTtcbiAgICB9XG4gICAgaWYgKCFmaWxlLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZmlsZSB0eXBlIGZvdW5kJyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHRoZSBmaWxlIG5hbWVcbiAgICBpZiAoLycvLnRlc3QoZmlsZS5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcG9zdHJvcGhlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGZpbGUgbmFtZScpO1xuICAgIH1cbiAgICAvLyB2YWxpZGF0ZSB0aGUgZmlsZVxuICAgIG1vZHVsZS5leHBvcnRzLnZhbGlkYXRlRmlsZVR5cGVBbmRTaXplKGZpbGUpO1xuICAgIC8vIHJldHVybiByZXN1bHRzXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lICAgICAgICAgOiBmaWxlLm5hbWUsXG4gICAgICBmaWxlUGF0aCAgICAgICAgIDogZmlsZS5wYXRoLFxuICAgICAgZmlsZVR5cGUgICAgICAgICA6IGZpbGUudHlwZSxcbiAgICAgIHRodW1ibmFpbEZpbGVOYW1lOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLm5hbWUgOiBudWxsKSxcbiAgICAgIHRodW1ibmFpbEZpbGVQYXRoOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLnBhdGggOiBudWxsKSxcbiAgICAgIHRodW1ibmFpbEZpbGVUeXBlOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLnR5cGUgOiBudWxsKSxcbiAgICB9O1xuICB9LFxuICB2YWxpZGF0ZUZpbGVUeXBlQW5kU2l6ZSAoZmlsZSkge1xuICAgIC8vIGNoZWNrIGZpbGUgdHlwZSBhbmQgc2l6ZVxuICAgIHN3aXRjaCAoZmlsZS50eXBlKSB7XG4gICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgICBpZiAoZmlsZS5zaXplID4gMTAwMDAwMDApIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ3B1Ymxpc2ggPiBmaWxlIHZhbGlkYXRpb24gPiAuanBlZy8uanBnLy5wbmcgd2FzIHRvbyBiaWcnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCBpbWFnZXMgYXJlIGxpbWl0ZWQgdG8gMTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDUwMDAwMDAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoID4gZmlsZSB2YWxpZGF0aW9uID4gLmdpZiB3YXMgdG9vIGJpZycpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIC5naWZzIGFyZSBsaW1pdGVkIHRvIDUwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiA1MDAwMDAwMCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygncHVibGlzaCA+IGZpbGUgdmFsaWRhdGlvbiA+IC5tcDQgd2FzIHRvbyBiaWcnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCB2aWRlb3MgYXJlIGxpbWl0ZWQgdG8gNTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoID4gZmlsZSB2YWxpZGF0aW9uID4gdW5yZWNvZ25pemVkIGZpbGUgdHlwZScpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSAnICsgZmlsZS50eXBlICsgJyBjb250ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZC4gIE9ubHksIC5qcGVnLCAucG5nLCAuZ2lmLCBhbmQgLm1wNCBmaWxlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG4gIH0sXG4gIGNyZWF0ZUJhc2ljUHVibGlzaFBhcmFtcyAoZmlsZVBhdGgsIG5hbWUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbGljZW5zZSwgbnNmdywgdGh1bWJuYWlsKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBQdWJsaXNoIFBhcmFtZXRlcnNgKTtcbiAgICAvLyBwcm92aWRlIGRlZmF1bHRzIGZvciB0aXRsZVxuICAgIGlmICh0aXRsZSA9PT0gbnVsbCB8fCB0aXRsZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aXRsZSA9IG5hbWU7XG4gICAgfVxuICAgIC8vIHByb3ZpZGUgZGVmYXVsdCBmb3IgZGVzY3JpcHRpb25cbiAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwgfHwgZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICB9XG4gICAgLy8gcHJvdmlkZSBkZWZhdWx0IGZvciBsaWNlbnNlXG4gICAgaWYgKGxpY2Vuc2UgPT09IG51bGwgfHwgbGljZW5zZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBsaWNlbnNlID0gJyAnOyAgLy8gZGVmYXVsdCB0byBlbXB0eSBzdHJpbmdcbiAgICB9XG4gICAgLy8gY3JlYXRlIHRoZSBwdWJsaXNoIHBhcmFtc1xuICAgIGNvbnN0IHB1Ymxpc2hQYXJhbXMgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZmlsZV9wYXRoOiBmaWxlUGF0aCxcbiAgICAgIGJpZCAgICAgIDogMC4wMSxcbiAgICAgIG1ldGFkYXRhIDoge1xuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGF1dGhvciAgOiBkZXRhaWxzLnRpdGxlLFxuICAgICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgICAgbGljZW5zZSxcbiAgICAgICAgbnNmdyxcbiAgICAgIH0sXG4gICAgICBjbGFpbV9hZGRyZXNzOiBwdWJsaXNoaW5nLnByaW1hcnlDbGFpbUFkZHJlc3MsXG4gICAgfTtcbiAgICAvLyBhZGQgdGh1bWJuYWlsIHRvIGNoYW5uZWwgaWYgdmlkZW9cbiAgICBpZiAodGh1bWJuYWlsKSB7XG4gICAgICBwdWJsaXNoUGFyYW1zWydtZXRhZGF0YSddWyd0aHVtYm5haWwnXSA9IHRodW1ibmFpbDtcbiAgICB9XG4gICAgcmV0dXJuIHB1Ymxpc2hQYXJhbXM7XG4gIH0sXG4gIGNyZWF0ZVRodW1ibmFpbFB1Ymxpc2hQYXJhbXMgKHRodW1ibmFpbEZpbGVQYXRoLCBjbGFpbU5hbWUsIGxpY2Vuc2UsIG5zZncpIHtcbiAgICBpZiAoIXRodW1ibmFpbEZpbGVQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgVGh1bWJuYWlsIFB1Ymxpc2ggUGFyYW1ldGVyc2ApO1xuICAgIC8vIGNyZWF0ZSB0aGUgcHVibGlzaCBwYXJhbXNcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSAgICAgOiBgJHtjbGFpbU5hbWV9LXRodW1iYCxcbiAgICAgIGZpbGVfcGF0aDogdGh1bWJuYWlsRmlsZVBhdGgsXG4gICAgICBiaWQgICAgICA6IDAuMDEsXG4gICAgICBtZXRhZGF0YSA6IHtcbiAgICAgICAgdGl0bGUgICAgICA6IGAke2NsYWltTmFtZX0gdGh1bWJuYWlsYCxcbiAgICAgICAgZGVzY3JpcHRpb246IGBhIHRodW1ibmFpbCBmb3IgJHtjbGFpbU5hbWV9YCxcbiAgICAgICAgYXV0aG9yICAgICA6IGRldGFpbHMudGl0bGUsXG4gICAgICAgIGxhbmd1YWdlICAgOiAnZW4nLFxuICAgICAgICBsaWNlbnNlLFxuICAgICAgICBuc2Z3LFxuICAgICAgfSxcbiAgICAgIGNsYWltX2FkZHJlc3M6IHB1Ymxpc2hpbmcucHJpbWFyeUNsYWltQWRkcmVzcyxcbiAgICAgIGNoYW5uZWxfbmFtZSA6IHB1Ymxpc2hpbmcudGh1bWJuYWlsQ2hhbm5lbCxcbiAgICAgIGNoYW5uZWxfaWQgICA6IHB1Ymxpc2hpbmcudGh1bWJuYWlsQ2hhbm5lbElkLFxuICAgIH07XG4gIH0sXG4gIGRlbGV0ZVRlbXBvcmFyeUZpbGUgKGZpbGVQYXRoKSB7XG4gICAgZnMudW5saW5rKGZpbGVQYXRoLCBlcnIgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYGVycm9yIGRlbGV0aW5nIHRlbXBvcmFyeSBmaWxlICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1Zyhgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgICB9KTtcbiAgfSxcbiAgYWRkR2V0UmVzdWx0c1RvRmlsZURhdGEgKGZpbGVJbmZvLCBnZXRSZXN1bHQpIHtcbiAgICBmaWxlSW5mby5maWxlTmFtZSA9IGdldFJlc3VsdC5maWxlX25hbWU7XG4gICAgZmlsZUluZm8uZmlsZVBhdGggPSBnZXRSZXN1bHQuZG93bmxvYWRfcGF0aDtcbiAgICByZXR1cm4gZmlsZUluZm87XG4gIH0sXG4gIGNyZWF0ZUZpbGVEYXRhICh7IG5hbWUsIGNsYWltSWQsIG91dHBvaW50LCBoZWlnaHQsIGFkZHJlc3MsIG5zZncsIGNvbnRlbnRUeXBlIH0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGNsYWltSWQsXG4gICAgICBvdXRwb2ludCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGFkZHJlc3MsXG4gICAgICBmaWxlTmFtZTogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgICBmaWxlVHlwZTogY29udGVudFR5cGUsXG4gICAgICBuc2Z3LFxuICAgIH07XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1oZWxtZXRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1oZWxtZXRcIlxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvY2hhbm5lbF9hY3Rpb25fdHlwZXMnO1xuXG4vLyBleHBvcnQgYWN0aW9uIGNyZWF0b3JzXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMb2dnZWRJbkNoYW5uZWwgKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQ0hBTk5FTF9VUERBVEUsXG4gICAgZGF0YToge1xuICAgICAgbmFtZSxcbiAgICAgIHNob3J0SWQsXG4gICAgICBsb25nSWQsXG4gICAgfSxcbiAgfTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvYWN0aW9ucy9jaGFubmVsLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQWN0aXZlU3RhdHVzQmFyIGZyb20gJ2NvbXBvbmVudHMvQWN0aXZlU3RhdHVzQmFyJztcbmltcG9ydCBJbmFjdGl2ZVN0YXR1c0JhciBmcm9tICdjb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyJztcblxuY2xhc3MgUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGJhcnMgICAgICAgOiBbXSxcbiAgICAgIGluZGV4ICAgICAgOiAwLFxuICAgICAgaW5jcmVtZW50ZXI6IDEsXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZUJhcnMgPSB0aGlzLmNyZWF0ZUJhcnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnN0YXJ0UHJvZ3Jlc3NCYXIgPSB0aGlzLnN0YXJ0UHJvZ3Jlc3NCYXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzQmFyID0gdGhpcy51cGRhdGVQcm9ncmVzc0Jhci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc3RvcFByb2dyZXNzQmFyID0gdGhpcy5zdG9wUHJvZ3Jlc3NCYXIuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5jcmVhdGVCYXJzKCk7XG4gICAgdGhpcy5zdGFydFByb2dyZXNzQmFyKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIHRoaXMuc3RvcFByb2dyZXNzQmFyKCk7XG4gIH1cbiAgY3JlYXRlQmFycyAoKSB7XG4gICAgY29uc3QgYmFycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHRoaXMucHJvcHMuc2l6ZTsgaSsrKSB7XG4gICAgICBiYXJzLnB1c2goe2lzQWN0aXZlOiBmYWxzZX0pO1xuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKHsgYmFycyB9KTtcbiAgfVxuICBzdGFydFByb2dyZXNzQmFyICgpIHtcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy51cGRhdGVQcm9ncmVzc0Jhci5iaW5kKHRoaXMpLCAzMDApO1xuICB9O1xuICB1cGRhdGVQcm9ncmVzc0JhciAoKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5zdGF0ZS5pbmRleDtcbiAgICBsZXQgaW5jcmVtZW50ZXIgPSB0aGlzLnN0YXRlLmluY3JlbWVudGVyO1xuICAgIGxldCBiYXJzID0gdGhpcy5zdGF0ZS5iYXJzO1xuICAgIC8vIGZsaXAgaW5jcmVtZW50ZXIgaWYgbmVjZXNzYXJ5LCB0byBzdGF5IGluIGJvdW5kc1xuICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPiB0aGlzLnByb3BzLnNpemUpKSB7XG4gICAgICBpbmNyZW1lbnRlciA9IGluY3JlbWVudGVyICogLTE7XG4gICAgICBpbmRleCArPSBpbmNyZW1lbnRlcjtcbiAgICB9XG4gICAgLy8gdXBkYXRlIHRoZSBpbmRleGVkIGJhclxuICAgIGlmIChpbmNyZW1lbnRlciA+IDApIHtcbiAgICAgIGJhcnNbaW5kZXhdLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFyc1tpbmRleF0uaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8vIGluY3JlbWVudCBpbmRleFxuICAgIGluZGV4ICs9IGluY3JlbWVudGVyO1xuICAgIC8vIHVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYmFycyxcbiAgICAgIGluY3JlbWVudGVyLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG4gIH07XG4gIHN0b3BQcm9ncmVzc0JhciAoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZUludGVydmFsKTtcbiAgfTtcbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAge3RoaXMuc3RhdGUuYmFycy5tYXAoKGJhciwgaW5kZXgpID0+IGJhci5pc0FjdGl2ZSA/IDxBY3RpdmVTdGF0dXNCYXIga2V5PXtpbmRleH0gLz4gOiA8SW5hY3RpdmVTdGF0dXNCYXIga2V5PXtpbmRleH0vPil9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5Qcm9ncmVzc0Jhci5wcm9wVHlwZXMgPSB7XG4gIHNpemU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzQmFyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXIvaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgTmF2QmFyIGZyb20gJ2NvbnRhaW5lcnMvTmF2QmFyJztcblxuY2xhc3MgRXJyb3JQYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGVycm9yIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgIDxwPntlcnJvcn08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuRXJyb3JQYWdlLnByb3BUeXBlcyA9IHtcbiAgZXJyb3I6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVycm9yUGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9FcnJvclBhZ2UvaW5kZXguanN4IiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyBnZXRDbGFpbUlkLCBnZXRMb2NhbEZpbGVSZWNvcmQgfSA9IHJlcXVpcmUoJy4uL2NvbnRyb2xsZXJzL3NlcnZlQ29udHJvbGxlci5qcycpO1xuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCcuL2Vycm9ySGFuZGxlcnMuanMnKTtcblxuY29uc3QgU0VSVkUgPSAnU0VSVkUnO1xuY29uc3QgU0hPVyA9ICdTSE9XJztcbmNvbnN0IE5PX0ZJTEUgPSAnTk9fRklMRSc7XG5jb25zdCBOT19DSEFOTkVMID0gJ05PX0NIQU5ORUwnO1xuY29uc3QgTk9fQ0xBSU0gPSAnTk9fQ0xBSU0nO1xuXG5mdW5jdGlvbiBjbGllbnRBY2NlcHRzSHRtbCAoe2FjY2VwdH0pIHtcbiAgcmV0dXJuIGFjY2VwdCAmJiBhY2NlcHQubWF0Y2goL3RleHRcXC9odG1sLyk7XG59O1xuXG5mdW5jdGlvbiByZXF1ZXN0SXNGcm9tQnJvd3NlciAoaGVhZGVycykge1xuICByZXR1cm4gaGVhZGVyc1sndXNlci1hZ2VudCddICYmIGhlYWRlcnNbJ3VzZXItYWdlbnQnXS5tYXRjaCgvTW96aWxsYS8pO1xufTtcblxuZnVuY3Rpb24gY2xpZW50V2FudHNBc3NldCAoe2FjY2VwdCwgcmFuZ2V9KSB7XG4gIGNvbnN0IGltYWdlSXNXYW50ZWQgPSBhY2NlcHQgJiYgYWNjZXB0Lm1hdGNoKC9pbWFnZVxcLy4qLykgJiYgIWFjY2VwdC5tYXRjaCgvdGV4dFxcL2h0bWwvKSAmJiAhYWNjZXB0Lm1hdGNoKC90ZXh0XFwvXFwqLyk7XG4gIGNvbnN0IHZpZGVvSXNXYW50ZWQgPSBhY2NlcHQgJiYgcmFuZ2U7XG4gIHJldHVybiBpbWFnZUlzV2FudGVkIHx8IHZpZGVvSXNXYW50ZWQ7XG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkQ2xhaW1JZCAoY2xhaW1JZCkge1xuICByZXR1cm4gKChjbGFpbUlkLmxlbmd0aCA9PT0gNDApICYmICEvW15BLVphLXowLTldL2cudGVzdChjbGFpbUlkKSk7XG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkU2hvcnRJZCAoY2xhaW1JZCkge1xuICByZXR1cm4gY2xhaW1JZC5sZW5ndGggPT09IDE7ICAvLyBpdCBzaG91bGQgcmVhbGx5IGV2YWx1YXRlIHRoZSBzaG9ydCB1cmwgaXRzZWxmXG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkU2hvcnRJZE9yQ2xhaW1JZCAoaW5wdXQpIHtcbiAgcmV0dXJuIChpc1ZhbGlkQ2xhaW1JZChpbnB1dCkgfHwgaXNWYWxpZFNob3J0SWQoaW5wdXQpKTtcbn07XG5cbmZ1bmN0aW9uIHNlcnZlQXNzZXRUb0NsaWVudCAoY2xhaW1JZCwgbmFtZSwgcmVzKSB7XG4gIHJldHVybiBnZXRMb2NhbEZpbGVSZWNvcmQoY2xhaW1JZCwgbmFtZSlcbiAgICAudGhlbihmaWxlUmVjb3JkID0+IHtcbiAgICAgIC8vIGNoZWNrIHRoYXQgYSBsb2NhbCByZWNvcmQgd2FzIGZvdW5kXG4gICAgICBpZiAoZmlsZVJlY29yZCA9PT0gTk9fRklMRSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cygzMDcpLnJlZGlyZWN0KGAvYXBpL2NsYWltL2dldC8ke25hbWV9LyR7Y2xhaW1JZH1gKTtcbiAgICAgIH1cbiAgICAgIC8vIHNlcnZlIHRoZSBmaWxlXG4gICAgICBjb25zdCB7ZmlsZVBhdGgsIGZpbGVUeXBlfSA9IGZpbGVSZWNvcmQ7XG4gICAgICBsb2dnZXIudmVyYm9zZShgc2VydmluZyBmaWxlOiAke2ZpbGVQYXRofWApO1xuICAgICAgY29uc3Qgc2VuZEZpbGVPcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnOiAnbm9zbmlmZicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZScgICAgICAgICAgOiBmaWxlVHlwZSB8fCAnaW1hZ2UvanBlZycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmRGaWxlKGZpbGVQYXRoLCBzZW5kRmlsZU9wdGlvbnMpO1xuICAgIH0pXG4gICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENsYWltSWRBbmRTZXJ2ZUFzc2V0IChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZCwgb3JpZ2luYWxVcmwsIGlwLCByZXMpIHtcbiAgICAvLyBnZXQgdGhlIGNsYWltIElkIGFuZCB0aGVuIHNlcnZlIHRoZSBhc3NldFxuICAgIGdldENsYWltSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUsIGNsYWltSWQpXG4gICAgICAudGhlbihmdWxsQ2xhaW1JZCA9PiB7XG4gICAgICAgIGlmIChmdWxsQ2xhaW1JZCA9PT0gTk9fQ0xBSU0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnbm8gY2xhaW0gaWQgY291bGQgYmUgZm91bmQnfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnVsbENsYWltSWQgPT09IE5PX0NIQU5ORUwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnbm8gY2hhbm5lbCBpZCBjb3VsZCBiZSBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXJ2ZUFzc2V0VG9DbGllbnQoZnVsbENsYWltSWQsIGNsYWltTmFtZSwgcmVzKTtcbiAgICAgICAgLy8gcG9zdFRvU3RhdHMocmVzcG9uc2VUeXBlLCBvcmlnaW5hbFVybCwgaXAsIGNsYWltTmFtZSwgZnVsbENsYWltSWQsICdzdWNjZXNzJyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgICAvLyBwb3N0VG9TdGF0cyhyZXNwb25zZVR5cGUsIG9yaWdpbmFsVXJsLCBpcCwgY2xhaW1OYW1lLCBmdWxsQ2xhaW1JZCwgJ2ZhaWwnKTtcbiAgICAgIH0pO1xuICB9LFxuICBkZXRlcm1pbmVSZXNwb25zZVR5cGUgKGhhc0ZpbGVFeHRlbnNpb24sIGhlYWRlcnMpIHtcbiAgICBsZXQgcmVzcG9uc2VUeXBlO1xuICAgIGlmIChoYXNGaWxlRXh0ZW5zaW9uKSB7XG4gICAgICByZXNwb25zZVR5cGUgPSBTRVJWRTsgIC8vIGFzc3VtZSBhIHNlcnZlIHJlcXVlc3QgaWYgZmlsZSBleHRlbnNpb24gaXMgcHJlc2VudFxuICAgICAgaWYgKGNsaWVudEFjY2VwdHNIdG1sKGhlYWRlcnMpKSB7ICAvLyBpZiB0aGUgcmVxdWVzdCBjb21lcyBmcm9tIGEgYnJvd3NlciwgY2hhbmdlIGl0IHRvIGEgc2hvdyByZXF1ZXN0XG4gICAgICAgIHJlc3BvbnNlVHlwZSA9IFNIT1c7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlVHlwZSA9IFNIT1c7XG4gICAgICBpZiAoY2xpZW50V2FudHNBc3NldChoZWFkZXJzKSAmJiByZXF1ZXN0SXNGcm9tQnJvd3NlcihoZWFkZXJzKSkgeyAgLy8gdGhpcyBpcyBpbiBjYXNlIHNvbWVvbmUgZW1iZWRzIGEgc2hvdyB1cmxcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTaG93IHJlcXVlc3QgY2FtZSBmcm9tIGJyb3dzZXIgYnV0IHdhbnRzIGFuIGltYWdlL3ZpZGVvLiBDaGFuZ2luZyByZXNwb25zZSB0byBzZXJ2ZS4uLicpO1xuICAgICAgICByZXNwb25zZVR5cGUgPSBTRVJWRTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlVHlwZTtcbiAgfSxcbiAgZmxpcENsYWltTmFtZUFuZElkRm9yQmFja3dhcmRzQ29tcGF0aWJpbGl0eSAoaWRlbnRpZmllciwgbmFtZSkge1xuICAgIC8vIHRoaXMgaXMgYSBwYXRjaCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAnL25hbWUvY2xhaW1faWQnIHVybCBmb3JtYXRcbiAgICBpZiAoaXNWYWxpZFNob3J0SWRPckNsYWltSWQobmFtZSkgJiYgIWlzVmFsaWRTaG9ydElkT3JDbGFpbUlkKGlkZW50aWZpZXIpKSB7XG4gICAgICBjb25zdCB0ZW1wTmFtZSA9IG5hbWU7XG4gICAgICBuYW1lID0gaWRlbnRpZmllcjtcbiAgICAgIGlkZW50aWZpZXIgPSB0ZW1wTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIFtpZGVudGlmaWVyLCBuYW1lXTtcbiAgfSxcbiAgbG9nUmVxdWVzdERhdGEgKHJlc3BvbnNlVHlwZSwgY2xhaW1OYW1lLCBjaGFubmVsTmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZygncmVzcG9uc2VUeXBlID09PScsIHJlc3BvbnNlVHlwZSk7XG4gICAgbG9nZ2VyLmRlYnVnKCdjbGFpbSBuYW1lID09PSAnLCBjbGFpbU5hbWUpO1xuICAgIGxvZ2dlci5kZWJ1ZygnY2hhbm5lbCBuYW1lID09PScsIGNoYW5uZWxOYW1lKTtcbiAgICBsb2dnZXIuZGVidWcoJ2NsYWltIGlkID09PScsIGNsYWltSWQpO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL3NlcnZlSGVscGVycy5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFR0VYUF9JTlZBTElEX0NMQUlNICA6IC9bXkEtWmEtejAtOS1dL2csXG4gIFJFR0VYUF9JTlZBTElEX0NIQU5ORUw6IC9bXkEtWmEtejAtOS1AXS9nLFxuICBSRUdFWFBfQUREUkVTUyAgICAgICAgOiAvXmIoPz1bXjBPSWxdezMyLDMzfSlbMC05QS1aYS16XXszMiwzM30kLyxcbiAgQ0hBTk5FTF9DSEFSICAgICAgICAgIDogJ0AnLFxuICBwYXJzZUlkZW50aWZpZXIgICAgICAgOiBmdW5jdGlvbiAoaWRlbnRpZmllcikge1xuICAgIGxvZ2dlci5kZWJ1ZygncGFyc2luZyBpZGVudGlmaWVyOicsIGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjL10qKScgKyAvLyB2YWx1ZSAoc3RvcHMgYXQgdGhlIGZpcnN0IHNlcGFyYXRvciBvciBlbmQpXG4gICAgICAnKFs6JCNdPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCB2YWx1ZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleFxuICAgICAgLmV4ZWMoaWRlbnRpZmllcilcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3Byb3RvfSwgJHt2YWx1ZX0sICR7bW9kaWZpZXJTZXBlcmF0b3J9LCAke21vZGlmaWVyfWApO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbmFtZVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciB1cmwuICBObyBjaGFubmVsIG5hbWUgcHJvdmlkZWQgYmVmb3JlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCBpc0NoYW5uZWwgPSB2YWx1ZS5zdGFydHNXaXRoKG1vZHVsZS5leHBvcnRzLkNIQU5ORUxfQ0hBUik7XG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBpc0NoYW5uZWwgPyB2YWx1ZSA6IG51bGw7XG4gICAgbGV0IGNsYWltSWQ7XG4gICAgaWYgKGlzQ2hhbm5lbCkge1xuICAgICAgaWYgKCFjaGFubmVsTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNoYW5uZWwgbmFtZSBhZnRlciBALicpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZUJhZENoYXJzID0gKGNoYW5uZWxOYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DSEFOTkVMKTtcbiAgICAgIGlmIChuYW1lQmFkQ2hhcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gY2hhbm5lbCBuYW1lOiAke25hbWVCYWRDaGFycy5qb2luKCcsICcpfS5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xhaW1JZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGNoYW5uZWxDbGFpbUlkO1xuICAgIGlmIChtb2RpZmllclNlcGVyYXRvcikge1xuICAgICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1vZGlmaWVyIHByb3ZpZGVkIGFmdGVyIHNlcGFyYXRvciBcIiR7bW9kaWZpZXJTZXBlcmF0b3J9XCJgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yID09PSAnOicpIHtcbiAgICAgICAgY2hhbm5lbENsYWltSWQgPSBtb2RpZmllcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cIiBtb2RpZmllciBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaXNDaGFubmVsLFxuICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICBjaGFubmVsQ2xhaW1JZCxcbiAgICAgIGNsYWltSWQsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VDbGFpbTogZnVuY3Rpb24gKGNsYWltKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdwYXJzaW5nIG5hbWU6JywgY2xhaW0pO1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjLy5dKiknICsgLy8gbmFtZSAoc3RvcHMgYXQgdGhlIGZpcnN0IG1vZGlmaWVyKVxuICAgICAgJyhbOiQjLl0/KShbXi9dKiknIC8vIG1vZGlmaWVyIHNlcGFyYXRvciwgbW9kaWZpZXIgKHN0b3BzIGF0IHRoZSBmaXJzdCBwYXRoIHNlcGFyYXRvciBvciBlbmQpXG4gICAgKTtcbiAgICBjb25zdCBbcHJvdG8sIGNsYWltTmFtZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleFxuICAgICAgLmV4ZWMoY2xhaW0pXG4gICAgICAubWFwKG1hdGNoID0+IG1hdGNoIHx8IG51bGwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtwcm90b30sICR7Y2xhaW1OYW1lfSwgJHttb2RpZmllclNlcGVyYXRvcn0sICR7bW9kaWZpZXJ9YCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBuYW1lXG4gICAgaWYgKCFjbGFpbU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY2xhaW0gbmFtZSBwcm92aWRlZCBiZWZvcmUgLicpO1xuICAgIH1cbiAgICBjb25zdCBuYW1lQmFkQ2hhcnMgPSAoY2xhaW1OYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DTEFJTSk7XG4gICAgaWYgKG5hbWVCYWRDaGFycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gY2xhaW0gbmFtZTogJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX0uYCk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yKSB7XG4gICAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmlsZSBleHRlbnNpb24gcHJvdmlkZWQgYWZ0ZXIgc2VwYXJhdG9yICR7bW9kaWZpZXJTZXBlcmF0b3J9LmApO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yICE9PSAnLicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHttb2RpZmllclNlcGVyYXRvcn0gbW9kaWZpZXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY2xhaW0gbmFtZWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyByZXR1cm4gcmVzdWx0c1xuICAgIHJldHVybiB7XG4gICAgICBjbGFpbU5hbWUsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VNb2RpZmllcjogZnVuY3Rpb24gKGNsYWltKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdwYXJzaW5nIG1vZGlmaWVyOicsIGNsYWltKTtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy8uXSopJyArIC8vIG5hbWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBtb2RpZmllcilcbiAgICAgICcoWzokIy5dPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCBjbGFpbU5hbWUsIG1vZGlmaWVyU2VwZXJhdG9yLCBtb2RpZmllcl0gPSBjb21wb25lbnRzUmVnZXhcbiAgICAgIC5leGVjKGNsYWltKVxuICAgICAgLm1hcChtYXRjaCA9PiBtYXRjaCB8fCBudWxsKTtcbiAgICBsb2dnZXIuZGVidWcoYCR7cHJvdG99LCAke2NsYWltTmFtZX0sICR7bW9kaWZpZXJTZXBlcmF0b3J9LCAke21vZGlmaWVyfWApO1xuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGhhc0ZpbGVFeHRlbnNpb24gPSBmYWxzZTtcbiAgICBpZiAobW9kaWZpZXJTZXBlcmF0b3IpIHtcbiAgICAgIGhhc0ZpbGVFeHRlbnNpb24gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaGFzRmlsZUV4dGVuc2lvbixcbiAgICB9O1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2xicnlVcmkuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUmVkdWNlciBmcm9tICcuLi8uLi9jbGllbnQvcmVkdWNlcnMvaW5kZXgnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBTdGF0aWNSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBHQUxpc3RlbmVyIGZyb20gJy4uLy4uL2NsaWVudC9jb21wb25lbnRzL0dBTGlzdGVuZXIvaW5kZXgnO1xuaW1wb3J0IEFwcCBmcm9tICcuLi8uLi9jbGllbnQvYXBwJztcbmltcG9ydCByZW5kZXJGdWxsUGFnZSBmcm9tICcuL3JlbmRlckZ1bGxQYWdlJztcbmltcG9ydCBjcmVhdGVTYWdhTWlkZGxld2FyZSBmcm9tICdyZWR1eC1zYWdhJztcbmltcG9ydCB7IGNhbGwgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0IHsgaGFuZGxlU2hvd1BhZ2VVcmkgfSBmcm9tICcuLi8uLi9jbGllbnQvc2FnYXMvc2hvd191cmknO1xuaW1wb3J0IHsgb25IYW5kbGVTaG93UGFnZVVyaSB9IGZyb20gJy4uLy4uL2NsaWVudC9hY3Rpb25zL3Nob3cnO1xuXG5pbXBvcnQgSGVsbWV0IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG5cbmNvbnN0IHJldHVyblNhZ2FXaXRoUGFyYW1zID0gKHNhZ2EsIHBhcmFtcykgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gKiAoKSB7XG4gICAgeWllbGQgY2FsbChzYWdhLCBwYXJhbXMpO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAocmVxLCByZXMpID0+IHtcbiAgbGV0IGNvbnRleHQgPSB7fTtcblxuICAvLyBjcmVhdGUgYW5kIGFwcGx5IG1pZGRsZXdhcmVcbiAgY29uc3Qgc2FnYU1pZGRsZXdhcmUgPSBjcmVhdGVTYWdhTWlkZGxld2FyZSgpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gYXBwbHlNaWRkbGV3YXJlKHNhZ2FNaWRkbGV3YXJlKTtcblxuICAvLyBjcmVhdGUgYSBuZXcgUmVkdXggc3RvcmUgaW5zdGFuY2VcbiAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShSZWR1Y2VyLCBtaWRkbGV3YXJlKTtcblxuICAvLyBjcmVhdGUgc2FnYVxuICBjb25zdCBhY3Rpb24gPSBvbkhhbmRsZVNob3dQYWdlVXJpKHJlcS5wYXJhbXMpO1xuICBjb25zdCBzYWdhID0gcmV0dXJuU2FnYVdpdGhQYXJhbXMoaGFuZGxlU2hvd1BhZ2VVcmksIGFjdGlvbik7XG5cbiAgLy8gcnVuIHRoZSBzYWdhIG1pZGRsZXdhcmVcbiAgc2FnYU1pZGRsZXdhcmVcbiAgICAucnVuKHNhZ2EpXG4gICAgLmRvbmVcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyByZW5kZXIgY29tcG9uZW50IHRvIGEgc3RyaW5nXG4gICAgICBjb25zdCBodG1sID0gcmVuZGVyVG9TdHJpbmcoXG4gICAgICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxuICAgICAgICAgIDxTdGF0aWNSb3V0ZXIgbG9jYXRpb249e3JlcS51cmx9IGNvbnRleHQ9e2NvbnRleHR9PlxuICAgICAgICAgICAgPEdBTGlzdGVuZXI+XG4gICAgICAgICAgICAgIDxBcHAgLz5cbiAgICAgICAgICAgIDwvR0FMaXN0ZW5lcj5cbiAgICAgICAgICA8L1N0YXRpY1JvdXRlcj5cbiAgICAgICAgPC9Qcm92aWRlcj5cbiAgICAgICk7XG5cbiAgICAgIC8vIGdldCBoZWFkIHRhZ3MgZnJvbSBoZWxtZXRcbiAgICAgIGNvbnN0IGhlbG1ldCA9IEhlbG1ldC5yZW5kZXJTdGF0aWMoKTtcblxuICAgICAgLy8gY2hlY2sgZm9yIGEgcmVkaXJlY3RcbiAgICAgIGlmIChjb250ZXh0LnVybCkge1xuICAgICAgICByZXR1cm4gcmVzLnJlZGlyZWN0KDMwMSwgY29udGV4dC51cmwpO1xuICAgICAgfVxuXG4gICAgICAvLyBnZXQgdGhlIGluaXRpYWwgc3RhdGUgZnJvbSBvdXIgUmVkdXggc3RvcmVcbiAgICAgIGNvbnN0IHByZWxvYWRlZFN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAgICAgLy8gc2VuZCB0aGUgcmVuZGVyZWQgcGFnZSBiYWNrIHRvIHRoZSBjbGllbnRcbiAgICAgIHJlcy5zZW5kKHJlbmRlckZ1bGxQYWdlKGhlbG1ldCwgaHRtbCwgcHJlbG9hZGVkU3RhdGUpKTtcbiAgICB9KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9oYW5kbGVTaG93UmVuZGVyLmpzeCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZHV4XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVkdXhcIlxuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGNvbnN0IEZJTEVfU0VMRUNURUQgPSAnRklMRV9TRUxFQ1RFRCc7XG5leHBvcnQgY29uc3QgRklMRV9DTEVBUiA9ICdGSUxFX0NMRUFSJztcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9VUERBVEUgPSAnTUVUQURBVEFfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBDTEFJTV9VUERBVEUgPSAnQ0xBSU1fVVBEQVRFJztcbmV4cG9ydCBjb25zdCBTRVRfUFVCTElTSF9JTl9DSEFOTkVMID0gJ1NFVF9QVUJMSVNIX0lOX0NIQU5ORUwnO1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hfU1RBVFVTX1VQREFURSA9ICdQVUJMSVNIX1NUQVRVU19VUERBVEUnO1xuZXhwb3J0IGNvbnN0IEVSUk9SX1VQREFURSA9ICdFUlJPUl9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IFNFTEVDVEVEX0NIQU5ORUxfVVBEQVRFID0gJ1NFTEVDVEVEX0NIQU5ORUxfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBUT0dHTEVfTUVUQURBVEFfSU5QVVRTID0gJ1RPR0dMRV9NRVRBREFUQV9JTlBVVFMnO1xuZXhwb3J0IGNvbnN0IFRIVU1CTkFJTF9ORVcgPSAnVEhVTUJOQUlMX05FVyc7XG5leHBvcnQgY29uc3QgUFVCTElTSF9TVEFSVCA9ICdQVUJMSVNIX1NUQVJUJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb25zdGFudHMvcHVibGlzaF9hY3Rpb25fdHlwZXMuanMiLCJleHBvcnQgY29uc3QgTE9HSU4gPSAnRXhpc3RpbmcnO1xuZXhwb3J0IGNvbnN0IENSRUFURSA9ICdOZXcnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9wdWJsaXNoX2NoYW5uZWxfc2VsZWN0X3N0YXRlcy5qcyIsImV4cG9ydCBjb25zdCBDSEFOTkVMX1VQREFURSA9ICdDSEFOTkVMX1VQREFURSc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29uc3RhbnRzL2NoYW5uZWxfYWN0aW9uX3R5cGVzLmpzIiwiZXhwb3J0IGNvbnN0IExPQ0FMX0NIRUNLID0gJ0xPQ0FMX0NIRUNLJztcbmV4cG9ydCBjb25zdCBVTkFWQUlMQUJMRSA9ICdVTkFWQUlMQUJMRSc7XG5leHBvcnQgY29uc3QgRVJST1IgPSAnRVJST1InO1xuZXhwb3J0IGNvbnN0IEFWQUlMQUJMRSA9ICdBVkFJTEFCTEUnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9hc3NldF9kaXNwbGF5X3N0YXRlcy5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSb3V0ZSwgU3dpdGNoIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgSG9tZVBhZ2UgZnJvbSAncGFnZXMvSG9tZVBhZ2UnO1xuaW1wb3J0IEFib3V0UGFnZSBmcm9tICdwYWdlcy9BYm91dFBhZ2UnO1xuaW1wb3J0IExvZ2luUGFnZSBmcm9tICdwYWdlcy9Mb2dpblBhZ2UnO1xuaW1wb3J0IFNob3dQYWdlIGZyb20gJ3BhZ2VzL1Nob3dQYWdlJztcbmltcG9ydCBGb3VyT2hGb3VyUGFnZSBmcm9tICdjb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlJztcbi8vIGltcG9ydCB7IGR5bmFtaWNJbXBvcnQgfSBmcm9tICd1dGlscy9keW5hbWljSW1wb3J0Jztcbi8vIGNvbnN0IEhvbWVQYWdlID0gZHluYW1pY0ltcG9ydCgncGFnZXMvSG9tZVBhZ2UnKTsgLy8gb3IgdXNlIHRoZSBwcm92aWRlZCBsb2NhbCBob21lcGFnZVxuXG5jb25zdCBBcHAgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFN3aXRjaD5cbiAgICAgIDxSb3V0ZSBleGFjdCBwYXRoPScvJyBjb21wb25lbnQ9e0hvbWVQYWdlfSAvPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy9hYm91dCcgY29tcG9uZW50PXtBYm91dFBhZ2V9IC8+XG4gICAgICA8Um91dGUgZXhhY3QgcGF0aD0nL2xvZ2luJyBjb21wb25lbnQ9e0xvZ2luUGFnZX0gLz5cbiAgICAgIDxSb3V0ZSBleGFjdCBwYXRoPScvOmlkZW50aWZpZXIvOmNsYWltJyBjb21wb25lbnQ9e1Nob3dQYWdlfSAvPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy86Y2xhaW0nIGNvbXBvbmVudD17U2hvd1BhZ2V9IC8+XG4gICAgICA8Um91dGUgY29tcG9uZW50PXtGb3VyT2hGb3VyUGFnZX0gLz5cbiAgICA8L1N3aXRjaD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hcHAuanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgc2VsZWN0RmlsZSwgdXBkYXRlRXJyb3IsIGNsZWFyRmlsZSB9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBmaWxlICAgICA6IHB1Ymxpc2guZmlsZSxcbiAgICB0aHVtYm5haWw6IHB1Ymxpc2gudGh1bWJuYWlsLFxuICAgIGZpbGVFcnJvcjogcHVibGlzaC5lcnJvci5maWxlLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIHNlbGVjdEZpbGU6IChmaWxlKSA9PiB7XG4gICAgICBkaXNwYXRjaChzZWxlY3RGaWxlKGZpbGUpKTtcbiAgICB9LFxuICAgIHNldEZpbGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaChjbGVhckZpbGUoKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVFcnJvcignZmlsZScsIHZhbHVlKSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvRHJvcHpvbmUvaW5kZXguanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgdXBkYXRlTG9nZ2VkSW5DaGFubmVsIH0gZnJvbSAnYWN0aW9ucy9jaGFubmVsJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQge3VwZGF0ZVNlbGVjdGVkQ2hhbm5lbH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9wdWJsaXNoJztcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uQ2hhbm5lbExvZ2luOiAobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVMb2dnZWRJbkNoYW5uZWwobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVTZWxlY3RlZENoYW5uZWwobmFtZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG51bGwsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCB9IGZyb20gJ2FjdGlvbnMvY2hhbm5lbCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHt1cGRhdGVTZWxlY3RlZENoYW5uZWx9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNoYW5uZWxMb2dpbjogKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKG5hbWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vaW5kZXguanMiLCJleHBvcnQgY29uc3QgQ0hBTk5FTCA9ICdDSEFOTkVMJztcbmV4cG9ydCBjb25zdCBBU1NFVF9MSVRFID0gJ0FTU0VUX0xJVEUnO1xuZXhwb3J0IGNvbnN0IEFTU0VUX0RFVEFJTFMgPSAnQVNTRVRfREVUQUlMUyc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29uc3RhbnRzL3Nob3dfcmVxdWVzdF90eXBlcy5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHsgZmlsZVJlcXVlc3RlZCB9IGZyb20gJ2FjdGlvbnMvc2hvdyc7XG5pbXBvcnQgeyBzZWxlY3RBc3NldCB9IGZyb20gJ3NlbGVjdG9ycy9zaG93JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCBlcnJvciBhbmQgc3RhdHVzXG4gIGNvbnN0IGVycm9yICA9IHNob3cuZGlzcGxheUFzc2V0LmVycm9yO1xuICBjb25zdCBzdGF0dXMgPSBzaG93LmRpc3BsYXlBc3NldC5zdGF0dXM7XG4gIC8vIHNlbGVjdCBhc3NldFxuICBjb25zdCBhc3NldCA9IHNlbGVjdEFzc2V0KHNob3cpO1xuICAvLyAgcmV0dXJuIHByb3BzXG4gIHJldHVybiB7XG4gICAgZXJyb3IsXG4gICAgc3RhdHVzLFxuICAgIGFzc2V0LFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uRmlsZVJlcXVlc3Q6IChuYW1lLCBjbGFpbUlkKSA9PiB7XG4gICAgICBkaXNwYXRjaChmaWxlUmVxdWVzdGVkKG5hbWUsIGNsYWltSWQpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldERpc3BsYXkvaW5kZXguanMiLCJleHBvcnQgY29uc3Qgc2VsZWN0U2l0ZVN0YXRlID0gKHN0YXRlKSA9PiB7XG4gIHJldHVybiBzdGF0ZS5zaXRlO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdFNpdGVIb3N0ID0gKHN0YXRlKSA9PiB7XG4gIHJldHVybiBzdGF0ZS5zaXRlLmhvc3Q7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3NlbGVjdG9ycy9zaXRlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGFzc3BvcnQtbG9jYWxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJwYXNzcG9ydC1sb2NhbFwiXG4vLyBtb2R1bGUgaWQgPSA0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmV0dXJuU2hvcnRJZDogZnVuY3Rpb24gKGNsYWltc0FycmF5LCBsb25nSWQpIHtcbiAgICBsZXQgY2xhaW1JbmRleDtcbiAgICBsZXQgc2hvcnRJZCA9IGxvbmdJZC5zdWJzdHJpbmcoMCwgMSk7IC8vIGRlZmF1bHQgc2hvcnQgaWQgaXMgdGhlIGZpcnN0IGxldHRlclxuICAgIGxldCBzaG9ydElkTGVuZ3RoID0gMDtcbiAgICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGlzIGNsYWltIGlkXG4gICAgY2xhaW1JbmRleCA9IGNsYWltc0FycmF5LmZpbmRJbmRleChlbGVtZW50ID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LmNsYWltSWQgPT09IGxvbmdJZDtcbiAgICB9KTtcbiAgICBpZiAoY2xhaW1JbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xhaW0gaWQgbm90IGZvdW5kIGluIGNsYWltcyBsaXN0Jyk7XG4gICAgfVxuICAgIC8vIGdldCBhbiBhcnJheSBvZiBhbGwgY2xhaW1zIHdpdGggbG93ZXIgaGVpZ2h0XG4gICAgbGV0IHBvc3NpYmxlTWF0Y2hlcyA9IGNsYWltc0FycmF5LnNsaWNlKDAsIGNsYWltSW5kZXgpO1xuICAgIC8vIHJlbW92ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgc2FtZSBwcmVmaXhlcyB1bnRpbCBub25lIGFyZSBsZWZ0LlxuICAgIHdoaWxlIChwb3NzaWJsZU1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgc2hvcnRJZExlbmd0aCArPSAxO1xuICAgICAgc2hvcnRJZCA9IGxvbmdJZC5zdWJzdHJpbmcoMCwgc2hvcnRJZExlbmd0aCk7XG4gICAgICBwb3NzaWJsZU1hdGNoZXMgPSBwb3NzaWJsZU1hdGNoZXMuZmlsdGVyKGVsZW1lbnQgPT4ge1xuICAgICAgICByZXR1cm4gKGVsZW1lbnQuY2xhaW1JZCAmJiAoZWxlbWVudC5jbGFpbUlkLnN1YnN0cmluZygwLCBzaG9ydElkTGVuZ3RoKSA9PT0gc2hvcnRJZCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzaG9ydElkO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJiYWJlbC1wb2x5ZmlsbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImJhYmVsLXBvbHlmaWxsXCJcbi8vIG1vZHVsZSBpZCA9IDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndoYXR3Zy1mZXRjaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndoYXR3Zy1mZXRjaFwiXG4vLyBtb2R1bGUgaWQgPSA0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBhcGkgPSByZXF1aXJlKCcuL3NlcnZlci9yb3V0ZXMvYXBpLycpO1xuY29uc3QgYXNzZXQgPSByZXF1aXJlKCcuL3NlcnZlci9yb3V0ZXMvYXNzZXQvJyk7XG5jb25zdCBhdXRoID0gcmVxdWlyZSgnLi9zZXJ2ZXIvcm91dGVzL2F1dGgvJyk7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCcuL2NvbmZpZy9sb2dnZXJDb25maWcuanMnKTtcbmNvbnN0IG15c3FsID0gcmVxdWlyZSgnLi9jb25maWcvbXlzcWxDb25maWcnKTtcbmNvbnN0IHNpdGUgPSByZXF1aXJlKCcuL2NvbmZpZy9zaXRlQ29uZmlnJyk7XG5jb25zdCBzbGFjayA9IHJlcXVpcmUoJy4vY29uZmlnL3NsYWNrQ29uZmlnLmpzJyk7XG5jb25zdCBwYXNzcG9ydCA9IHJlcXVpcmUoJy4vc2VydmVyL3Bhc3Nwb3J0LycpO1xuY29uc3QgbW9kZWxzID0gcmVxdWlyZSgnLi9zZXJ2ZXIvbW9kZWxzLycpO1xuY29uc3QgQXBwID0gcmVxdWlyZSgnLi9jbGllbnQvYXBwJyk7XG5cbmNvbnN0IGV4cG9ydHMgPSB7XG4gIEFwcCxcbiAgbG9nZ2VyLFxuICBtb2RlbHMsXG4gIG15c3FsLFxuICBwYXNzcG9ydCxcbiAgc2l0ZSxcbiAgc2xhY2ssXG4gIHJvdXRlczoge1xuICAgIGFwaSxcbiAgICBhc3NldCxcbiAgICBhdXRoLFxuICB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3BlZWNoLmpzIiwiY29uc3QgY2hhbm5lbEF2YWlsYWJpbGl0eSA9IHJlcXVpcmUoJy4vY2hhbm5lbEF2YWlsYWJpbGl0eScpO1xyXG5jb25zdCBjaGFubmVsQ2xhaW1zID0gcmVxdWlyZSgnLi9jaGFubmVsQ2xhaW1zJyk7XHJcbmNvbnN0IGNoYW5uZWxEYXRhID0gcmVxdWlyZSgnLi9jaGFubmVsRGF0YScpO1xyXG5jb25zdCBjaGFubmVsU2hvcnRJZCA9IHJlcXVpcmUoJy4vY2hhbm5lbFNob3J0SWQnKTtcclxuY29uc3QgY2xhaW1BdmFpbGFiaWxpdHkgPSByZXF1aXJlKCcuL2NsYWltQXZhaWxhYmlsaXR5Jyk7XHJcbmNvbnN0IGNsYWltRGF0YSA9IHJlcXVpcmUoJy4vY2xhaW1EYXRhJyk7XHJcbmNvbnN0IGNsYWltR2V0ID0gcmVxdWlyZSgnLi9jbGFpbUdldCcpO1xyXG5jb25zdCBjbGFpbUxvbmdJZCA9IHJlcXVpcmUoJy4vY2xhaW1Mb25nSWQnKTtcclxuY29uc3QgY2xhaW1QdWJsaXNoID0gcmVxdWlyZSgnLi9jbGFpbVB1Ymxpc2gnKTtcclxuY29uc3QgY2xhaW1SZXNvbHZlID0gcmVxdWlyZSgnLi9jbGFpbVJlc29sdmUnKTtcclxuY29uc3QgY2xhaW1TaG9ydElkID0gcmVxdWlyZSgnLi9jbGFpbVNob3J0SWQnKTtcclxuY29uc3QgY2xhaW1zTGlzdCA9IHJlcXVpcmUoJy4vY2xhaW1zTGlzdCcpO1xyXG5jb25zdCBmaWxlQXZhaWxhYmlsaXR5ID0gcmVxdWlyZSgnLi9maWxlQXZhaWxhYmlsaXR5Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICBjaGFubmVsQXZhaWxhYmlsaXR5LFxyXG4gIGNoYW5uZWxDbGFpbXMsXHJcbiAgY2hhbm5lbERhdGEsXHJcbiAgY2hhbm5lbFNob3J0SWQsXHJcbiAgY2xhaW1BdmFpbGFiaWxpdHksXHJcbiAgY2xhaW1EYXRhLFxyXG4gIGNsYWltR2V0LFxyXG4gIGNsYWltTG9uZ0lkLFxyXG4gIGNsYWltUHVibGlzaCxcclxuICBjbGFpbVJlc29sdmUsXHJcbiAgY2xhaW1TaG9ydElkLFxyXG4gIGNsYWltc0xpc3QsXHJcbiAgZmlsZUF2YWlsYWJpbGl0eSxcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9hcGkvaW5kZXguanMiLCJjb25zdCB7IGNoZWNrQ2hhbm5lbEF2YWlsYWJpbGl0eSB9ID0gcmVxdWlyZSgnY29udHJvbGxlcnMvcHVibGlzaENvbnRyb2xsZXIuanMnKTtcclxuY29uc3QgeyBzZW5kR0FUaW1pbmdFdmVudCB9ID0gcmVxdWlyZSgnaGVscGVycy9nb29nbGVBbmFseXRpY3MuanMnKTtcclxuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbi8qXHJcblxyXG4gIHJvdXRlIHRvIGNoZWNrIHdoZXRoZXIgc2l0ZSBoYXMgcHVibGlzaGVkIHRvIGEgY2hhbm5lbFxyXG5cclxuKi9cclxuXHJcbmNvbnN0IGNoYW5uZWxBdmFpbGFiaWxpdHkgPSAoKSA9PiB7XHJcbiAgcmV0dXJuICh7IGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zOiB7IG5hbWUgfSB9LCByZXMpID0+IHtcclxuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgIGNoZWNrQ2hhbm5lbEF2YWlsYWJpbGl0eShuYW1lKVxyXG4gICAgICAudGhlbihhdmFpbGFibGVOYW1lID0+IHtcclxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbihhdmFpbGFibGVOYW1lKTtcclxuICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnZW5kLXRvLWVuZCcsICdjbGFpbSBuYW1lIGF2YWlsYWJpbGl0eScsIG5hbWUsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICBoYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XHJcbiAgICAgIH0pO1xyXG4gIH07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGNoYW5uZWxBdmFpbGFiaWxpdHk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXBpL2NoYW5uZWxBdmFpbGFiaWxpdHkuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJheGlvc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImF4aW9zXCJcbi8vIG1vZHVsZSBpZCA9IDQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxicnlDb25maWcgPSB7XG4gIGFwaToge1xuICAgIGFwaUhvc3Q6ICdsb2NhbGhvc3QnLFxuICAgIGFwaVBvcnQ6ICc1Mjc5JyxcbiAgfSxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbGJyeUNvbmZpZztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvbmZpZy9sYnJ5Q29uZmlnLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidW5pdmVyc2FsLWFuYWx5dGljc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInVuaXZlcnNhbC1hbmFseXRpY3NcIlxuLy8gbW9kdWxlIGlkID0gNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJmc1wiXG4vLyBtb2R1bGUgaWQgPSA1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzZXF1ZWxpemVcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJzZXF1ZWxpemVcIlxuLy8gbW9kdWxlIGlkID0gNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgeyBnZXRDaGFubmVsQ2xhaW1zIH0gPSByZXF1aXJlKCdjb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMnKTtcclxuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XHJcblxyXG4vKlxyXG5cclxuICByb3V0ZSB0byBnZXQgYWxsIGNsYWltcyBmb3IgY2hhbm5lbFxyXG5cclxuKi9cclxuXHJcbmNvbnN0IGNoYW5uZWxDbGFpbXMgPSAoKSA9PiB7XHJcbiAgcmV0dXJuICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xyXG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBwYXJhbXMuY2hhbm5lbE5hbWU7XHJcbiAgICBsZXQgY2hhbm5lbENsYWltSWQgPSBwYXJhbXMuY2hhbm5lbENsYWltSWQ7XHJcbiAgICBpZiAoY2hhbm5lbENsYWltSWQgPT09ICdub25lJykgY2hhbm5lbENsYWltSWQgPSBudWxsO1xyXG4gICAgY29uc3QgcGFnZSA9IHBhcmFtcy5wYWdlO1xyXG4gICAgZ2V0Q2hhbm5lbENsYWltcyhjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIHBhZ2UpXHJcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhID09PSBOT19DSEFOTkVMKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnTm8gbWF0Y2hpbmcgY2hhbm5lbCB3YXMgZm91bmQnfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjaGFubmVsQ2xhaW1zO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2FwaS9jaGFubmVsQ2xhaW1zLmpzIiwiY29uc3QgQ0xBSU1TX1BFUl9QQUdFID0gMTI7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZXR1cm5QYWdpbmF0ZWRDaGFubmVsQ2xhaW1zIChjaGFubmVsTmFtZSwgbG9uZ0NoYW5uZWxDbGFpbUlkLCBjbGFpbXMsIHBhZ2UpIHtcbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gbW9kdWxlLmV4cG9ydHMuZGV0ZXJtaW5lVG90YWxQYWdlcyhjbGFpbXMpO1xuICAgIGNvbnN0IHBhZ2luYXRpb25QYWdlID0gbW9kdWxlLmV4cG9ydHMuZ2V0UGFnZUZyb21RdWVyeShwYWdlKTtcbiAgICBjb25zdCB2aWV3RGF0YSA9IHtcbiAgICAgIGNoYW5uZWxOYW1lICAgICAgIDogY2hhbm5lbE5hbWUsXG4gICAgICBsb25nQ2hhbm5lbENsYWltSWQ6IGxvbmdDaGFubmVsQ2xhaW1JZCxcbiAgICAgIGNsYWltcyAgICAgICAgICAgIDogbW9kdWxlLmV4cG9ydHMuZXh0cmFjdFBhZ2VGcm9tQ2xhaW1zKGNsYWltcywgcGFnaW5hdGlvblBhZ2UpLFxuICAgICAgcHJldmlvdXNQYWdlICAgICAgOiBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVQcmV2aW91c1BhZ2UocGFnaW5hdGlvblBhZ2UpLFxuICAgICAgY3VycmVudFBhZ2UgICAgICAgOiBwYWdpbmF0aW9uUGFnZSxcbiAgICAgIG5leHRQYWdlICAgICAgICAgIDogbW9kdWxlLmV4cG9ydHMuZGV0ZXJtaW5lTmV4dFBhZ2UodG90YWxQYWdlcywgcGFnaW5hdGlvblBhZ2UpLFxuICAgICAgdG90YWxQYWdlcyAgICAgICAgOiB0b3RhbFBhZ2VzLFxuICAgICAgdG90YWxSZXN1bHRzICAgICAgOiBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVUb3RhbENsYWltcyhjbGFpbXMpLFxuICAgIH07XG4gICAgcmV0dXJuIHZpZXdEYXRhO1xuICB9LFxuICBnZXRQYWdlRnJvbVF1ZXJ5IChwYWdlKSB7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHJldHVybiBwYXJzZUludChwYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGV4dHJhY3RQYWdlRnJvbUNsYWltcyAoY2xhaW1zLCBwYWdlTnVtYmVyKSB7XG4gICAgaWYgKCFjbGFpbXMpIHtcbiAgICAgIHJldHVybiBbXTsgIC8vIGlmIG5vIGNsYWltcywgcmV0dXJuIHRoaXMgZGVmYXVsdFxuICAgIH1cbiAgICAvLyBsb2dnZXIuZGVidWcoJ2NsYWltcyBpcyBhcnJheT8nLCBBcnJheS5pc0FycmF5KGNsYWltcykpO1xuICAgIC8vIGxvZ2dlci5kZWJ1ZyhgcGFnZU51bWJlciAke3BhZ2VOdW1iZXJ9IGlzIG51bWJlcj9gLCBOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpKTtcbiAgICBjb25zdCBjbGFpbVN0YXJ0SW5kZXggPSAocGFnZU51bWJlciAtIDEpICogQ0xBSU1TX1BFUl9QQUdFO1xuICAgIGNvbnN0IGNsYWltRW5kSW5kZXggPSBjbGFpbVN0YXJ0SW5kZXggKyBDTEFJTVNfUEVSX1BBR0U7XG4gICAgY29uc3QgcGFnZU9mQ2xhaW1zID0gY2xhaW1zLnNsaWNlKGNsYWltU3RhcnRJbmRleCwgY2xhaW1FbmRJbmRleCk7XG4gICAgcmV0dXJuIHBhZ2VPZkNsYWltcztcbiAgfSxcbiAgZGV0ZXJtaW5lVG90YWxQYWdlcyAoY2xhaW1zKSB7XG4gICAgaWYgKCFjbGFpbXMpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3RhbENsYWltcyA9IGNsYWltcy5sZW5ndGg7XG4gICAgICBpZiAodG90YWxDbGFpbXMgPCBDTEFJTVNfUEVSX1BBR0UpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsUGFnZXMgPSBNYXRoLmZsb29yKHRvdGFsQ2xhaW1zIC8gQ0xBSU1TX1BFUl9QQUdFKTtcbiAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHRvdGFsQ2xhaW1zICUgQ0xBSU1TX1BFUl9QQUdFO1xuICAgICAgaWYgKHJlbWFpbmRlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZnVsbFBhZ2VzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bGxQYWdlcyArIDE7XG4gICAgfVxuICB9LFxuICBkZXRlcm1pbmVQcmV2aW91c1BhZ2UgKGN1cnJlbnRQYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRQYWdlID09PSAxKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRQYWdlIC0gMTtcbiAgfSxcbiAgZGV0ZXJtaW5lTmV4dFBhZ2UgKHRvdGFsUGFnZXMsIGN1cnJlbnRQYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRQYWdlICsgMTtcbiAgfSxcbiAgZGV0ZXJtaW5lVG90YWxDbGFpbXMgKGNsYWltcykge1xuICAgIGlmICghY2xhaW1zKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGNsYWltcy5sZW5ndGg7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvY2hhbm5lbFBhZ2luYXRpb24uanMiLCJjb25zdCB7IGdldENoYW5uZWxEYXRhIH0gPSByZXF1aXJlKCdjb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMnKTtcclxuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XHJcblxyXG4vKlxyXG5cclxuICByb3V0ZSB0byBnZXQgZGF0YSBmb3IgYSBjaGFubmVsXHJcblxyXG4qL1xyXG5cclxuY29uc3QgY2hhbm5lbERhdGEgPSAoKSA9PiB7XHJcbiAgcmV0dXJuICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xyXG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBwYXJhbXMuY2hhbm5lbE5hbWU7XHJcbiAgICBsZXQgY2hhbm5lbENsYWltSWQgPSBwYXJhbXMuY2hhbm5lbENsYWltSWQ7XHJcbiAgICBpZiAoY2hhbm5lbENsYWltSWQgPT09ICdub25lJykgY2hhbm5lbENsYWltSWQgPSBudWxsO1xyXG4gICAgZ2V0Q2hhbm5lbERhdGEoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCAwKVxyXG4gICAgICAudGhlbihkYXRhID0+IHtcclxuICAgICAgICBpZiAoZGF0YSA9PT0gTk9fQ0hBTk5FTCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ05vIG1hdGNoaW5nIGNoYW5uZWwgd2FzIGZvdW5kJ30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YX0pO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcclxuICAgICAgfSk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gY2hhbm5lbERhdGE7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXBpL2NoYW5uZWxEYXRhLmpzIiwiY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbi8qXHJcblxyXG5yb3V0ZSB0byBnZXQgYSBzaG9ydCBjaGFubmVsIGlkIGZyb20gbG9uZyBjaGFubmVsIElkXHJcblxyXG4qL1xyXG5cclxuY29uc3QgY2hhbm5lbFNob3J0SWRSb3V0ZSA9IChkYikgPT4ge1xyXG4gIHJldHVybiAoeyBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9LCByZXMpID0+IHtcclxuICAgIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQocGFyYW1zLmxvbmdJZCwgcGFyYW1zLm5hbWUpXHJcbiAgICAgIC50aGVuKHNob3J0SWQgPT4ge1xyXG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHNob3J0SWQpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcclxuICAgICAgfSk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gY2hhbm5lbFNob3J0SWRSb3V0ZTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9hcGkvY2hhbm5lbFNob3J0SWQuanMiLCJjb25zdCB7IGNsYWltTmFtZUlzQXZhaWxhYmxlIH0gPSByZXF1aXJlKCdjb250cm9sbGVycy9wdWJsaXNoQ29udHJvbGxlci5qcycpO1xyXG5jb25zdCB7IHNlbmRHQVRpbWluZ0V2ZW50IH0gPSByZXF1aXJlKCdoZWxwZXJzL2dvb2dsZUFuYWx5dGljcy5qcycpO1xyXG5jb25zdCB7IGhhbmRsZUVycm9yUmVzcG9uc2UgfSA9IHJlcXVpcmUoJ2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcycpO1xyXG5cclxuLypcclxuXHJcbiAgcm91dGUgdG8gY2hlY2sgd2hldGhlciB0aGlzIHNpdGUgcHVibGlzaGVkIHRvIGEgY2xhaW1cclxuXHJcbiovXHJcblxyXG5jb25zdCBjbGFpbUF2YWlsYWJpbGl0eSA9ICgpID0+IHtcclxuICByZXR1cm4gKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXM6IHsgbmFtZSB9IH0sIHJlcykgPT4ge1xyXG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgY2xhaW1OYW1lSXNBdmFpbGFibGUobmFtZSlcclxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbihyZXN1bHQpO1xyXG4gICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdlbmQtdG8tZW5kJywgJ2NsYWltIG5hbWUgYXZhaWxhYmlsaXR5JywgbmFtZSwgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcclxuICAgICAgfSk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gY2xhaW1BdmFpbGFiaWxpdHk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltQXZhaWxhYmlsaXR5LmpzIiwiY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbi8qXHJcblxyXG4gIHJvdXRlIHRvIHJldHVybiBkYXRhIGZvciBhIGNsYWltXHJcblxyXG4qL1xyXG5cclxuY29uc3QgY2xhaW1EYXRhID0gKGRiKSA9PiB7XHJcbiAgcmV0dXJuICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xyXG4gICAgY29uc3QgY2xhaW1OYW1lID0gcGFyYW1zLmNsYWltTmFtZTtcclxuICAgIGxldCBjbGFpbUlkID0gcGFyYW1zLmNsYWltSWQ7XHJcbiAgICBpZiAoY2xhaW1JZCA9PT0gJ25vbmUnKSBjbGFpbUlkID0gbnVsbDtcclxuICAgIGRiLkNsYWltLnJlc29sdmVDbGFpbShjbGFpbU5hbWUsIGNsYWltSWQpXHJcbiAgICAgIC50aGVuKGNsYWltSW5mbyA9PiB7XHJcbiAgICAgICAgaWYgKCFjbGFpbUluZm8pIHtcclxuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdObyBjbGFpbSBjb3VsZCBiZSBmb3VuZCd9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IGNsYWltSW5mb30pO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcclxuICAgICAgfSk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gY2xhaW1EYXRhO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2FwaS9jbGFpbURhdGEuanMiLCJjb25zdCB7IGdldENsYWltIH0gPSByZXF1aXJlKCdoZWxwZXJzL2xicnlBcGkuanMnKTtcclxuY29uc3QgeyBhZGRHZXRSZXN1bHRzVG9GaWxlRGF0YSwgY3JlYXRlRmlsZURhdGEgfSA9IHJlcXVpcmUoJy4uLy4uL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMnKTtcclxuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbi8qXHJcblxyXG4gIHJvdXRlIHRvIGdldCBhIGNsYWltXHJcblxyXG4qL1xyXG5cclxuY29uc3QgY2xhaW1HZXQgPSAoZGIpID0+IHtcclxuICByZXR1cm4gKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XHJcbiAgICBjb25zdCBuYW1lID0gcGFyYW1zLm5hbWU7XHJcbiAgICBjb25zdCBjbGFpbUlkID0gcGFyYW1zLmNsYWltSWQ7XHJcbiAgICAvLyByZXNvbHZlIHRoZSBjbGFpbVxyXG4gICAgZGIuQ2xhaW0ucmVzb2x2ZUNsYWltKG5hbWUsIGNsYWltSWQpXHJcbiAgICAgIC50aGVuKHJlc29sdmVSZXN1bHQgPT4ge1xyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBhIGNsYWltIGFjdHVhbGx5IGV4aXN0cyBhdCB0aGF0IHVyaVxyXG4gICAgICAgIGlmICghcmVzb2x2ZVJlc3VsdCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBtYXRjaGluZyB1cmkgZm91bmQgaW4gQ2xhaW0gdGFibGUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGZpbGVEYXRhID0gY3JlYXRlRmlsZURhdGEocmVzb2x2ZVJlc3VsdCk7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBjbGFpbVxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZmlsZURhdGEsIGdldENsYWltKGAke25hbWV9IyR7Y2xhaW1JZH1gKV0pO1xyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoWyBmaWxlRGF0YSwgZ2V0UmVzdWx0IF0pID0+IHtcclxuICAgICAgICBmaWxlRGF0YSA9IGFkZEdldFJlc3VsdHNUb0ZpbGVEYXRhKGZpbGVEYXRhLCBnZXRSZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZGIudXBzZXJ0KGRiLkZpbGUsIGZpbGVEYXRhLCB7bmFtZSwgY2xhaW1JZH0sICdGaWxlJyksIGdldFJlc3VsdF0pO1xyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoWyBmaWxlUmVjb3JkLCB7bWVzc2FnZSwgY29tcGxldGVkfSBdKSA9PiB7XHJcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBtZXNzYWdlLCBjb21wbGV0ZWQgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjbGFpbUdldDtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9hcGkvY2xhaW1HZXQuanMiLCJjb25zdCB7IGdldENsYWltSWQgfSA9IHJlcXVpcmUoJ2NvbnRyb2xsZXJzL3NlcnZlQ29udHJvbGxlci5qcycpO1xyXG5jb25zdCB7IGhhbmRsZUVycm9yUmVzcG9uc2UgfSA9IHJlcXVpcmUoJ2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcycpO1xyXG5cclxuY29uc3QgTk9fQ0hBTk5FTCA9ICdOT19DSEFOTkVMJztcclxuY29uc3QgTk9fQ0xBSU0gPSAnTk9fQ0xBSU0nO1xyXG5cclxuLypcclxuXHJcbiAgcm91dGUgdG8gZ2V0IGEgbG9uZyBjbGFpbSBpZFxyXG5cclxuKi9cclxuXHJcbmNvbnN0IGNsYWltTG9uZ0lkID0gKCkgPT4ge1xyXG4gIHJldHVybiAoeyBpcCwgb3JpZ2luYWxVcmwsIGJvZHksIHBhcmFtcyB9LCByZXMpID0+IHtcclxuICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gYm9keS5jaGFubmVsTmFtZTtcclxuICAgIGNvbnN0IGNoYW5uZWxDbGFpbUlkID0gYm9keS5jaGFubmVsQ2xhaW1JZDtcclxuICAgIGNvbnN0IGNsYWltTmFtZSA9IGJvZHkuY2xhaW1OYW1lO1xyXG4gICAgY29uc3QgY2xhaW1JZCA9IGJvZHkuY2xhaW1JZDtcclxuICAgIGdldENsYWltSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUsIGNsYWltSWQpXHJcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gTk9fQ0hBTk5FTCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ05vIG1hdGNoaW5nIGNoYW5uZWwgY291bGQgYmUgZm91bmQnfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PX0NMQUlNKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnTm8gbWF0Y2hpbmcgY2xhaW0gaWQgY291bGQgYmUgZm91bmQnfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHR9KTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICBoYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XHJcbiAgICAgIH0pO1xyXG4gIH07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGNsYWltTG9uZ0lkO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2FwaS9jbGFpbUxvbmdJZC5qcyIsImNvbnN0IHsgY3JlYXRlQmFzaWNQdWJsaXNoUGFyYW1zLCBjcmVhdGVUaHVtYm5haWxQdWJsaXNoUGFyYW1zLCBwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0Qm9keSwgcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzIH0gPSByZXF1aXJlKCdoZWxwZXJzL3B1Ymxpc2hIZWxwZXJzLmpzJyk7XHJcbmNvbnN0IHsgY2xhaW1OYW1lSXNBdmFpbGFibGUsIHB1Ymxpc2ggfSA9IHJlcXVpcmUoJ2NvbnRyb2xsZXJzL3B1Ymxpc2hDb250cm9sbGVyLmpzJyk7XHJcbmNvbnN0IHsgYXV0aGVudGljYXRlVXNlciB9ID0gcmVxdWlyZSgnYXV0aC9hdXRoZW50aWNhdGlvbi5qcycpO1xyXG5jb25zdCB7IHNlbmRHQVRpbWluZ0V2ZW50IH0gPSByZXF1aXJlKCdoZWxwZXJzL2dvb2dsZUFuYWx5dGljcy5qcycpO1xyXG5jb25zdCB7IGhhbmRsZUVycm9yUmVzcG9uc2UgfSA9IHJlcXVpcmUoJ2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcycpO1xyXG5jb25zdCB7IGRldGFpbHM6IHsgaG9zdCB9IH0gPSByZXF1aXJlKCdzaXRlQ29uZmlnLmpzJyk7XHJcblxyXG4vKlxyXG5cclxuICByb3V0ZSB0byBwdWJsaXNoIGEgY2xhaW0gdGhyb3VnaCB0aGUgZGFlbW9uXHJcblxyXG4qL1xyXG5cclxuY29uc3QgY2xhaW1QdWJsaXNoID0gKGRiKSA9PiB7XHJcbiAgcmV0dXJuICh7IGJvZHksIGZpbGVzLCBoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwsIHVzZXIgfSwgcmVzKSA9PiB7XHJcbiAgICAvLyBkZWZpbmUgdmFyaWFibGVzXHJcbiAgICBsZXQgIGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZCwgZGVzY3JpcHRpb24sIGZpbGVOYW1lLCBmaWxlUGF0aCwgZmlsZVR5cGUsIGdhU3RhcnRUaW1lLCBsaWNlbnNlLCBuYW1lLCBuc2Z3LCB0aHVtYm5haWwsIHRodW1ibmFpbEZpbGVOYW1lLCB0aHVtYm5haWxGaWxlUGF0aCwgdGh1bWJuYWlsRmlsZVR5cGUsIHRpdGxlO1xyXG4gICAgLy8gcmVjb3JkIHRoZSBzdGFydCB0aW1lIG9mIHRoZSByZXF1ZXN0XHJcbiAgICBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcbiAgICAvLyB2YWxpZGF0ZSB0aGUgYm9keSBhbmQgZmlsZXMgb2YgdGhlIHJlcXVlc3RcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIHZhbGlkYXRlQXBpUHVibGlzaFJlcXVlc3QoYm9keSwgZmlsZXMpO1xyXG4gICAgICAoe25hbWUsIG5zZncsIGxpY2Vuc2UsIHRpdGxlLCBkZXNjcmlwdGlvbiwgdGh1bWJuYWlsfSA9IHBhcnNlUHVibGlzaEFwaVJlcXVlc3RCb2R5KGJvZHkpKTtcclxuICAgICAgKHtmaWxlTmFtZSwgZmlsZVBhdGgsIGZpbGVUeXBlLCB0aHVtYm5haWxGaWxlTmFtZSwgdGh1bWJuYWlsRmlsZVBhdGgsIHRodW1ibmFpbEZpbGVUeXBlfSA9IHBhcnNlUHVibGlzaEFwaVJlcXVlc3RGaWxlcyhmaWxlcykpO1xyXG4gICAgICAoe2NoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZH0gPSBib2R5KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2V9KTtcclxuICAgIH1cclxuICAgIC8vIGNoZWNrIGNoYW5uZWwgYXV0aG9yaXphdGlvblxyXG4gICAgUHJvbWlzZVxyXG4gICAgICAuYWxsKFtcclxuICAgICAgICBhdXRoZW50aWNhdGVVc2VyKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZCwgdXNlciksXHJcbiAgICAgICAgY2xhaW1OYW1lSXNBdmFpbGFibGUobmFtZSksXHJcbiAgICAgICAgY3JlYXRlQmFzaWNQdWJsaXNoUGFyYW1zKGZpbGVQYXRoLCBuYW1lLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxpY2Vuc2UsIG5zZncsIHRodW1ibmFpbCksXHJcbiAgICAgICAgY3JlYXRlVGh1bWJuYWlsUHVibGlzaFBhcmFtcyh0aHVtYm5haWxGaWxlUGF0aCwgbmFtZSwgbGljZW5zZSwgbnNmdyksXHJcbiAgICAgIF0pXHJcbiAgICAgIC50aGVuKChbe2NoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZH0sIHZhbGlkYXRlZENsYWltTmFtZSwgcHVibGlzaFBhcmFtcywgdGh1bWJuYWlsUHVibGlzaFBhcmFtc10pID0+IHtcclxuICAgICAgICAvLyBhZGQgY2hhbm5lbCBkZXRhaWxzIHRvIHRoZSBwdWJsaXNoIHBhcmFtc1xyXG4gICAgICAgIGlmIChjaGFubmVsTmFtZSAmJiBjaGFubmVsQ2xhaW1JZCkge1xyXG4gICAgICAgICAgcHVibGlzaFBhcmFtc1snY2hhbm5lbF9uYW1lJ10gPSBjaGFubmVsTmFtZTtcclxuICAgICAgICAgIHB1Ymxpc2hQYXJhbXNbJ2NoYW5uZWxfaWQnXSA9IGNoYW5uZWxDbGFpbUlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBwdWJsaXNoIHRoZSB0aHVtYm5haWxcclxuICAgICAgICBpZiAodGh1bWJuYWlsUHVibGlzaFBhcmFtcykge1xyXG4gICAgICAgICAgcHVibGlzaCh0aHVtYm5haWxQdWJsaXNoUGFyYW1zLCB0aHVtYm5haWxGaWxlTmFtZSwgdGh1bWJuYWlsRmlsZVR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBwdWJsaXNoIHRoZSBhc3NldFxyXG4gICAgICAgIHJldHVybiBwdWJsaXNoKHB1Ymxpc2hQYXJhbXMsIGZpbGVOYW1lLCBmaWxlVHlwZSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe1xyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgIG1lc3NhZ2U6ICdwdWJsaXNoIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgICAgICAgZGF0YSAgIDoge1xyXG4gICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICBjbGFpbUlkOiByZXN1bHQuY2xhaW1faWQsXHJcbiAgICAgICAgICAgIHVybCAgICA6IGAke2hvc3R9LyR7cmVzdWx0LmNsYWltX2lkfS8ke25hbWV9YCxcclxuICAgICAgICAgICAgbGJyeVR4IDogcmVzdWx0LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyByZWNvcmQgdGhlIHB1Ymxpc2ggZW5kIHRpbWUgYW5kIHNlbmQgdG8gZ29vZ2xlIGFuYWx5dGljc1xyXG4gICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdlbmQtdG8tZW5kJywgJ3B1Ymxpc2gnLCBmaWxlVHlwZSwgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcclxuICAgICAgfSk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gY2xhaW1QdWJsaXNoO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2FwaS9jbGFpbVB1Ymxpc2guanMiLCJjb25zdCB7IGRiIH0gPSByZXF1aXJlKCdteXNxbENvbmZpZycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYXV0aGVudGljYXRlVXNlciAoY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCwgY2hhbm5lbFBhc3N3b3JkLCB1c2VyKSB7XG4gICAgLy8gY2FzZTogbm8gY2hhbm5lbE5hbWUgb3IgY2hhbm5lbCBJZCBhcmUgcHJvdmlkZWQgKGFub255bW91cyksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB1c2VyIHRva2VuIGlzIHByb3ZpZGVkXG4gICAgaWYgKCFjaGFubmVsTmFtZSAmJiAhY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGFubmVsTmFtZSAgIDogbnVsbCxcbiAgICAgICAgY2hhbm5lbENsYWltSWQ6IG51bGwsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBjYXNlOiBjaGFubmVsTmFtZSBvciBjaGFubmVsIElkIGFyZSBwcm92aWRlZCB3aXRoIHVzZXIgdG9rZW5cbiAgICBpZiAodXNlcikge1xuICAgICAgaWYgKGNoYW5uZWxOYW1lICYmIGNoYW5uZWxOYW1lICE9PSB1c2VyLmNoYW5uZWxOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHByb3ZpZGVkIGNoYW5uZWwgbmFtZSBkb2VzIG5vdCBtYXRjaCB1c2VyIGNyZWRlbnRpYWxzJyk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbm5lbElkICYmIGNoYW5uZWxJZCAhPT0gdXNlci5jaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBwcm92aWRlZCBjaGFubmVsIGlkIGRvZXMgbm90IG1hdGNoIHVzZXIgY3JlZGVudGlhbHMnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5uZWxOYW1lICAgOiB1c2VyLmNoYW5uZWxOYW1lLFxuICAgICAgICBjaGFubmVsQ2xhaW1JZDogdXNlci5jaGFubmVsQ2xhaW1JZCxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGNhc2U6IGNoYW5uZWxOYW1lIG9yIGNoYW5uZWwgSWQgYXJlIHByb3ZpZGVkIHdpdGggcGFzc3dvcmQgaW5zdGVhZCBvZiB1c2VyIHRva2VuXG4gICAgaWYgKCFjaGFubmVsUGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignbm8gY2hhbm5lbCBwYXNzd29yZCBwcm92aWRlZCcpO1xuICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cy5hdXRoZW50aWNhdGVDaGFubmVsQ3JlZGVudGlhbHMoY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCwgY2hhbm5lbFBhc3N3b3JkKTtcbiAgfSxcbiAgYXV0aGVudGljYXRlQ2hhbm5lbENyZWRlbnRpYWxzIChjaGFubmVsTmFtZSwgY2hhbm5lbElkLCB1c2VyUGFzc3dvcmQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gaG9pc3RlZCB2YXJpYWJsZXNcbiAgICAgIGxldCBjaGFubmVsRGF0YTtcbiAgICAgIC8vIGJ1aWxkIHRoZSBwYXJhbXMgZm9yIGZpbmRpbmcgdGhlIGNoYW5uZWxcbiAgICAgIGxldCBjaGFubmVsRmluZFBhcmFtcyA9IHt9O1xuICAgICAgaWYgKGNoYW5uZWxOYW1lKSBjaGFubmVsRmluZFBhcmFtc1snY2hhbm5lbE5hbWUnXSA9IGNoYW5uZWxOYW1lO1xuICAgICAgaWYgKGNoYW5uZWxJZCkgY2hhbm5lbEZpbmRQYXJhbXNbJ2NoYW5uZWxDbGFpbUlkJ10gPSBjaGFubmVsSWQ7XG4gICAgICAvLyBmaW5kIHRoZSBjaGFubmVsXG4gICAgICBkYi5DaGFubmVsXG4gICAgICAgIC5maW5kT25lKHtcbiAgICAgICAgICB3aGVyZTogY2hhbm5lbEZpbmRQYXJhbXMsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGNoYW5uZWwgPT4ge1xuICAgICAgICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdubyBjaGFubmVsIGZvdW5kJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCwgeW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGF0IGNoYW5uZWwnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hhbm5lbERhdGEgPSBjaGFubmVsLmdldCgpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnY2hhbm5lbCBkYXRhOicsIGNoYW5uZWxEYXRhKTtcbiAgICAgICAgICByZXR1cm4gZGIuVXNlci5maW5kT25lKHtcbiAgICAgICAgICAgIHdoZXJlOiB7IHVzZXJOYW1lOiBjaGFubmVsRGF0YS5jaGFubmVsTmFtZS5zdWJzdHJpbmcoMSkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ25vIHVzZXIgZm91bmQnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkLCB5b3UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoYXQgY2hhbm5lbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdXNlci5jb21wYXJlUGFzc3dvcmQodXNlclBhc3N3b3JkKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oaXNNYXRjaCA9PiB7XG4gICAgICAgICAgaWYgKCFpc01hdGNoKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2luY29ycmVjdCBwYXNzd29yZCcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQsIHlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhhdCBjaGFubmVsJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnLi4ucGFzc3dvcmQgd2FzIGEgbWF0Y2guLi4nKTtcbiAgICAgICAgICByZXNvbHZlKGNoYW5uZWxEYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvYXV0aC9hdXRoZW50aWNhdGlvbi5qcyIsImNvbnN0IHsgcmVzb2x2ZVVyaSB9ID0gcmVxdWlyZSgnaGVscGVycy9sYnJ5QXBpLmpzJyk7XHJcbmNvbnN0IHsgaGFuZGxlRXJyb3JSZXNwb25zZSB9ID0gcmVxdWlyZSgnaGVscGVycy9lcnJvckhhbmRsZXJzLmpzJyk7XHJcblxyXG4vKlxyXG5cclxuICByb3V0ZSB0byBydW4gYSByZXNvbHZlIHJlcXVlc3Qgb24gdGhlIGRhZW1vblxyXG5cclxuKi9cclxuXHJcbmNvbnN0IGNsYWltUmVzb2x2ZSA9ICgpID0+IHtcclxuICByZXR1cm4gKHsgaGVhZGVycywgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XHJcbiAgICByZXNvbHZlVXJpKGAke3BhcmFtcy5uYW1lfSMke3BhcmFtcy5jbGFpbUlkfWApXHJcbiAgICAgIC50aGVuKHJlc29sdmVkVXJpID0+IHtcclxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbihyZXNvbHZlZFVyaSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjbGFpbVJlc29sdmU7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltUmVzb2x2ZS5qcyIsImNvbnN0IHsgaGFuZGxlRXJyb3JSZXNwb25zZSB9ID0gcmVxdWlyZSgnaGVscGVycy9lcnJvckhhbmRsZXJzLmpzJyk7XHJcblxyXG4vKlxyXG5cclxuICByb3V0ZSB0byBnZXQgYSBzaG9ydCBjbGFpbSBpZCBmcm9tIGxvbmcgY2xhaW0gSWRcclxuXHJcbiovXHJcblxyXG5jb25zdCBjbGFpbVNob3J0SWQgPSAoZGIpID0+IHtcclxuICByZXR1cm4gKHsgaXAsIG9yaWdpbmFsVXJsLCBib2R5LCBwYXJhbXMgfSwgcmVzKSA9PiB7XHJcbiAgICBkYi5DbGFpbS5nZXRTaG9ydENsYWltSWRGcm9tTG9uZ0NsYWltSWQocGFyYW1zLmxvbmdJZCwgcGFyYW1zLm5hbWUpXHJcbiAgICAgIC50aGVuKHNob3J0SWQgPT4ge1xyXG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiBzaG9ydElkfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjbGFpbVNob3J0SWQ7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltU2hvcnRJZC5qcyIsImNvbnN0IHsgZ2V0Q2xhaW1MaXN0IH0gPSByZXF1aXJlKCdoZWxwZXJzL2xicnlBcGkuanMnKTtcclxuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbi8qXHJcblxyXG4gIHJvdXRlIHRvIGdldCBsaXN0IG9mIGNsYWltc1xyXG5cclxuKi9cclxuXHJcbmNvbnN0IGNsYWltTGlzdCA9IChkYikgPT4ge1xyXG4gIHJldHVybiAoeyBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9LCByZXMpID0+IHtcclxuICAgIGdldENsYWltTGlzdChwYXJhbXMubmFtZSlcclxuICAgICAgLnRoZW4oY2xhaW1zTGlzdCA9PiB7XHJcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oY2xhaW1zTGlzdCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjbGFpbUxpc3Q7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXBpL2NsYWltc0xpc3QuanMiLCJcclxuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCdoZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMnKTtcclxuXHJcbi8qXHJcblxyXG4gIHJvdXRlIHRvIHNlZSBpZiBhc3NldCBpcyBhdmFpbGFibGUgbG9jYWxseVxyXG5cclxuKi9cclxuXHJcbmNvbnN0IGZpbGVBdmFpbGFiaWxpdHkgPSAoZGIpID0+IHtcclxuICByZXR1cm4gKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XHJcbiAgICBjb25zdCBuYW1lID0gcGFyYW1zLm5hbWU7XHJcbiAgICBjb25zdCBjbGFpbUlkID0gcGFyYW1zLmNsYWltSWQ7XHJcbiAgICBkYi5GaWxlXHJcbiAgICAgIC5maW5kT25lKHtcclxuICAgICAgICB3aGVyZToge1xyXG4gICAgICAgICAgbmFtZSxcclxuICAgICAgICAgIGNsYWltSWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IHRydWV9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IGZhbHNlfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmaWxlQXZhaWxhYmlsaXR5O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2FwaS9maWxlQXZhaWxhYmlsaXR5LmpzIiwiY29uc3Qgc2VydmVBc3NldEJ5Q2xhaW0gPSByZXF1aXJlKCcuL3NlcnZlQXNzZXRCeUNsYWltJyk7XG5jb25zdCBzZXJ2ZUFzc2V0QnlJZGVudGlmaWVyQW5kQ2xhaW0gPSByZXF1aXJlKCcuL3NlcnZlQXNzZXRCeUlkZW50aWZpZXJBbmRDbGFpbScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXJ2ZUFzc2V0QnlDbGFpbSxcbiAgc2VydmVBc3NldEJ5SWRlbnRpZmllckFuZENsYWltLFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXNzZXQvaW5kZXguanMiLCJjb25zdCB7IHNlbmRHQVNlcnZlRXZlbnQgfSA9IHJlcXVpcmUoJ2hlbHBlcnMvZ29vZ2xlQW5hbHl0aWNzJyk7XHJcbmNvbnN0IHsgZGV0ZXJtaW5lUmVzcG9uc2VUeXBlLCBsb2dSZXF1ZXN0RGF0YSwgZ2V0Q2xhaW1JZEFuZFNlcnZlQXNzZXQgfSA9IHJlcXVpcmUoJ2hlbHBlcnMvc2VydmVIZWxwZXJzLmpzJyk7XHJcbmNvbnN0IGxicnlVcmkgPSByZXF1aXJlKCdoZWxwZXJzL2xicnlVcmkuanMnKTtcclxuY29uc3QgaGFuZGxlU2hvd1JlbmRlciA9IHJlcXVpcmUoJ2hlbHBlcnMvaGFuZGxlU2hvd1JlbmRlci5qc3gnKTtcclxuY29uc3QgU0VSVkUgPSAnU0VSVkUnO1xyXG5cclxuLypcclxuXHJcbiAgcm91dGUgdG8gc2VydmUgYW4gYXNzZXQgb3IgdGhlIHJlYWN0IGFwcCB2aWEgdGhlIGNsYWltIG5hbWUgb25seVxyXG5cclxuKi9cclxuXHJcbmNvbnN0IGNsYWltID0gKCkgPT4ge1xyXG4gIHJldHVybiAocmVxLCByZXMpID0+IHtcclxuICAgIGNvbnN0IHsgaGVhZGVycywgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSA9IHJlcTtcclxuICAgIC8vIGRlY2lkZSBpZiB0aGlzIGlzIGEgc2hvdyByZXF1ZXN0XHJcbiAgICBsZXQgaGFzRmlsZUV4dGVuc2lvbjtcclxuICAgIHRyeSB7XHJcbiAgICAgICh7IGhhc0ZpbGVFeHRlbnNpb24gfSA9IGxicnlVcmkucGFyc2VNb2RpZmllcihwYXJhbXMuY2xhaW0pKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2V9KTtcclxuICAgIH1cclxuICAgIGxldCByZXNwb25zZVR5cGUgPSBkZXRlcm1pbmVSZXNwb25zZVR5cGUoaGFzRmlsZUV4dGVuc2lvbiwgaGVhZGVycyk7XHJcbiAgICBpZiAocmVzcG9uc2VUeXBlICE9PSBTRVJWRSkge1xyXG4gICAgICByZXR1cm4gaGFuZGxlU2hvd1JlbmRlcihyZXEsIHJlcyk7XHJcbiAgICB9XHJcbiAgICAvLyBoYW5kbGUgc2VydmUgcmVxdWVzdFxyXG4gICAgLy8gc2VuZCBnb29nbGUgYW5hbHl0aWNzXHJcbiAgICBzZW5kR0FTZXJ2ZUV2ZW50KGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCk7XHJcbiAgICAvLyBwYXJzZSB0aGUgY2xhaW1cclxuICAgIGxldCBjbGFpbU5hbWU7XHJcbiAgICB0cnkge1xyXG4gICAgICAoe2NsYWltTmFtZX0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0ocGFyYW1zLmNsYWltKSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlfSk7XHJcbiAgICB9XHJcbiAgICAvLyBsb2cgdGhlIHJlcXVlc3QgZGF0YSBmb3IgZGVidWdnaW5nXHJcbiAgICBsb2dSZXF1ZXN0RGF0YShyZXNwb25zZVR5cGUsIGNsYWltTmFtZSwgbnVsbCwgbnVsbCk7XHJcbiAgICAvLyBnZXQgdGhlIGNsYWltIElkIGFuZCB0aGVuIHNlcnZlIHRoZSBhc3NldFxyXG4gICAgZ2V0Q2xhaW1JZEFuZFNlcnZlQXNzZXQobnVsbCwgbnVsbCwgY2xhaW1OYW1lLCBudWxsLCBvcmlnaW5hbFVybCwgaXAsIHJlcyk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gY2xhaW07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXNzZXQvc2VydmVBc3NldEJ5Q2xhaW0uanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1kb20vc2VydmVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVhY3QtZG9tL3NlcnZlclwiXG4vLyBtb2R1bGUgaWQgPSA2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUHVibGlzaFJlZHVjZXIgZnJvbSAncmVkdWNlcnMvcHVibGlzaCc7XG5pbXBvcnQgQ2hhbm5lbFJlZHVjZXIgZnJvbSAncmVkdWNlcnMvY2hhbm5lbCc7XG5pbXBvcnQgU2hvd1JlZHVjZXIgZnJvbSAncmVkdWNlcnMvc2hvdyc7XG5pbXBvcnQgU2l0ZVJlZHVjZXIgZnJvbSAncmVkdWNlcnMvc2l0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmVSZWR1Y2Vycyh7XG4gIGNoYW5uZWw6IENoYW5uZWxSZWR1Y2VyLFxuICBwdWJsaXNoOiBQdWJsaXNoUmVkdWNlcixcbiAgc2hvdyAgIDogU2hvd1JlZHVjZXIsXG4gIHNpdGUgICA6IFNpdGVSZWR1Y2VyLFxufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcmVkdWNlcnMvaW5kZXguanMiLCJpbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9wdWJsaXNoX2FjdGlvbl90eXBlcyc7XG5pbXBvcnQgeyBMT0dJTiB9IGZyb20gJ2NvbnN0YW50cy9wdWJsaXNoX2NoYW5uZWxfc2VsZWN0X3N0YXRlcyc7XG5jb25zdCB7IHB1Ymxpc2hpbmcgfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgZGlzYWJsZWQgICAgICAgICAgOiBwdWJsaXNoaW5nLmRpc2FibGVkLFxuICBkaXNhYmxlZE1lc3NhZ2UgICA6IHB1Ymxpc2hpbmcuZGlzYWJsZWRNZXNzYWdlLFxuICBwdWJsaXNoSW5DaGFubmVsICA6IGZhbHNlLFxuICBzZWxlY3RlZENoYW5uZWwgICA6IExPR0lOLFxuICBzaG93TWV0YWRhdGFJbnB1dHM6IGZhbHNlLFxuICBzdGF0dXMgICAgICAgICAgICA6IHtcbiAgICBzdGF0dXMgOiBudWxsLFxuICAgIG1lc3NhZ2U6IG51bGwsXG4gIH0sXG4gIGVycm9yOiB7XG4gICAgZmlsZSAgICAgICAgIDogbnVsbCxcbiAgICB1cmwgICAgICAgICAgOiBudWxsLFxuICAgIGNoYW5uZWwgICAgICA6IG51bGwsXG4gICAgcHVibGlzaFN1Ym1pdDogbnVsbCxcbiAgfSxcbiAgZmlsZSAgICA6IG51bGwsXG4gIGNsYWltICAgOiAnJyxcbiAgbWV0YWRhdGE6IHtcbiAgICB0aXRsZSAgICAgIDogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIGxpY2Vuc2UgICAgOiAnJyxcbiAgICBuc2Z3ICAgICAgIDogZmFsc2UsXG4gIH0sXG4gIHRodW1ibmFpbDogbnVsbCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIGFjdGlvbnMuRklMRV9TRUxFQ1RFRDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUsIHsgIC8vIG5vdGU6IGNsZWFycyB0byBpbml0aWFsIHN0YXRlXG4gICAgICAgIGZpbGU6IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLkZJTEVfQ0xFQVI6XG4gICAgICByZXR1cm4gaW5pdGlhbFN0YXRlO1xuICAgIGNhc2UgYWN0aW9ucy5NRVRBREFUQV9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgbWV0YWRhdGE6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLm1ldGFkYXRhLCB7XG4gICAgICAgICAgW2FjdGlvbi5kYXRhLm5hbWVdOiBhY3Rpb24uZGF0YS52YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuQ0xBSU1fVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGNsYWltOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5TRVRfUFVCTElTSF9JTl9DSEFOTkVMOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHB1Ymxpc2hJbkNoYW5uZWw6IGFjdGlvbi5jaGFubmVsLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlBVQkxJU0hfU1RBVFVTX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzdGF0dXM6IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLkVSUk9SX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlcnJvcjogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXJyb3IsIHtcbiAgICAgICAgICBbYWN0aW9uLmRhdGEubmFtZV06IGFjdGlvbi5kYXRhLnZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5TRUxFQ1RFRF9DSEFOTkVMX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzZWxlY3RlZENoYW5uZWw6IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlRPR0dMRV9NRVRBREFUQV9JTlBVVFM6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgc2hvd01ldGFkYXRhSW5wdXRzOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5USFVNQk5BSUxfTkVXOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHRodW1ibmFpbDogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcmVkdWNlcnMvcHVibGlzaC5qcyIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL2NoYW5uZWxfYWN0aW9uX3R5cGVzJztcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBsb2dnZWRJbkNoYW5uZWw6IHtcbiAgICBuYW1lICAgOiBudWxsLFxuICAgIHNob3J0SWQ6IG51bGwsXG4gICAgbG9uZ0lkIDogbnVsbCxcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIGFjdGlvbnMuQ0hBTk5FTF9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgbG9nZ2VkSW5DaGFubmVsOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9yZWR1Y2Vycy9jaGFubmVsLmpzIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgTE9DQUxfQ0hFQ0ssIEVSUk9SIH0gZnJvbSAnY29uc3RhbnRzL2Fzc2V0X2Rpc3BsYXlfc3RhdGVzJztcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICByZXF1ZXN0OiB7XG4gICAgZXJyb3I6IG51bGwsXG4gICAgdHlwZSA6IG51bGwsXG4gICAgaWQgICA6IG51bGwsXG4gIH0sXG4gIHJlcXVlc3RMaXN0IDoge30sXG4gIGNoYW5uZWxMaXN0IDoge30sXG4gIGFzc2V0TGlzdCAgIDoge30sXG4gIGRpc3BsYXlBc3NldDoge1xuICAgIGVycm9yIDogbnVsbCxcbiAgICBzdGF0dXM6IExPQ0FMX0NIRUNLLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIC8vIGhhbmRsZSByZXF1ZXN0XG4gICAgY2FzZSBhY3Rpb25zLlJFUVVFU1RfRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVxdWVzdCwge1xuICAgICAgICAgIGVycm9yOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuUkVRVUVTVF9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVxdWVzdCwge1xuICAgICAgICAgIHR5cGU6IGFjdGlvbi5kYXRhLnJlcXVlc3RUeXBlLFxuICAgICAgICAgIGlkICA6IGFjdGlvbi5kYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBzdG9yZSByZXF1ZXN0c1xuICAgIGNhc2UgYWN0aW9ucy5SRVFVRVNUX0xJU1RfQUREOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHJlcXVlc3RMaXN0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZXF1ZXN0TGlzdCwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5pZF06IHtcbiAgICAgICAgICAgIGVycm9yOiBhY3Rpb24uZGF0YS5lcnJvcixcbiAgICAgICAgICAgIGtleSAgOiBhY3Rpb24uZGF0YS5rZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBhc3NldCBkYXRhXG4gICAgY2FzZSBhY3Rpb25zLkFTU0VUX0FERDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBhc3NldExpc3Q6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmFzc2V0TGlzdCwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5pZF06IHtcbiAgICAgICAgICAgIGVycm9yICAgIDogYWN0aW9uLmRhdGEuZXJyb3IsXG4gICAgICAgICAgICBuYW1lICAgICA6IGFjdGlvbi5kYXRhLm5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkICA6IGFjdGlvbi5kYXRhLmNsYWltSWQsXG4gICAgICAgICAgICBzaG9ydElkICA6IGFjdGlvbi5kYXRhLnNob3J0SWQsXG4gICAgICAgICAgICBjbGFpbURhdGE6IGFjdGlvbi5kYXRhLmNsYWltRGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIC8vIGNoYW5uZWwgZGF0YVxuICAgIGNhc2UgYWN0aW9ucy5DSEFOTkVMX0FERDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBjaGFubmVsTGlzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuY2hhbm5lbExpc3QsIHtcbiAgICAgICAgICBbYWN0aW9uLmRhdGEuaWRdOiB7XG4gICAgICAgICAgICBuYW1lICAgICAgOiBhY3Rpb24uZGF0YS5uYW1lLFxuICAgICAgICAgICAgbG9uZ0lkICAgIDogYWN0aW9uLmRhdGEubG9uZ0lkLFxuICAgICAgICAgICAgc2hvcnRJZCAgIDogYWN0aW9uLmRhdGEuc2hvcnRJZCxcbiAgICAgICAgICAgIGNsYWltc0RhdGE6IGFjdGlvbi5kYXRhLmNsYWltc0RhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgY2hhbm5lbExpc3Q6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNoYW5uZWxMaXN0LCB7XG4gICAgICAgICAgW2FjdGlvbi5kYXRhLmNoYW5uZWxMaXN0SWRdOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5jaGFubmVsTGlzdFthY3Rpb24uZGF0YS5jaGFubmVsTGlzdElkXSwge1xuICAgICAgICAgICAgY2xhaW1zRGF0YTogYWN0aW9uLmRhdGEuY2xhaW1zRGF0YSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBkaXNwbGF5IGFuIGFzc2V0XG4gICAgY2FzZSBhY3Rpb25zLkZJTEVfQVZBSUxBQklMSVRZX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBkaXNwbGF5QXNzZXQ6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmRpc3BsYXlBc3NldCwge1xuICAgICAgICAgIHN0YXR1czogYWN0aW9uLmRhdGEsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLkRJU1BMQVlfQVNTRVRfRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZGlzcGxheUFzc2V0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5kaXNwbGF5QXNzZXQsIHtcbiAgICAgICAgICBlcnJvciA6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgIHN0YXR1czogRVJST1IsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3JlZHVjZXJzL3Nob3cuanMiLCJjb25zdCBzaXRlQ29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuY29uc3Qge1xuICBhbmFseXRpY3M6IHtcbiAgICBnb29nbGVJZDogZ29vZ2xlQW5hbHl0aWNzSWQsXG4gIH0sXG4gIGFzc2V0RGVmYXVsdHM6IHtcbiAgICB0aHVtYm5haWw6IGRlZmF1bHRUaHVtYm5haWwsXG4gICAgZGVzY3JpcHRpb246IGRlZmF1bHREZXNjcmlwdGlvbixcbiAgfSxcbiAgZGV0YWlsczoge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIGhvc3QsXG4gICAgdGl0bGUsXG4gICAgdHdpdHRlcixcbiAgfSxcbn0gPSBzaXRlQ29uZmlnO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGRlc2NyaXB0aW9uLFxuICBnb29nbGVBbmFseXRpY3NJZCxcbiAgaG9zdCxcbiAgdGl0bGUsXG4gIHR3aXR0ZXIsXG4gIGRlZmF1bHREZXNjcmlwdGlvbixcbiAgZGVmYXVsdFRodW1ibmFpbCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcmVkdWNlcnMvc2l0ZS5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgR29vZ2xlQW5hbHl0aWNzIGZyb20gJ3JlYWN0LWdhJztcbmltcG9ydCB7IHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmNvbnN0IHsgYW5hbHl0aWNzOiB7IGdvb2dsZUlkIH0gfSA9IHJlcXVpcmUoJy4uLy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbkdvb2dsZUFuYWx5dGljcy5pbml0aWFsaXplKGdvb2dsZUlkKTtcblxuY2xhc3MgR0FMaXN0ZW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLnNlbmRQYWdlVmlldyh0aGlzLnByb3BzLmhpc3RvcnkubG9jYXRpb24pO1xuICAgIHRoaXMucHJvcHMuaGlzdG9yeS5saXN0ZW4odGhpcy5zZW5kUGFnZVZpZXcpO1xuICB9XG5cbiAgc2VuZFBhZ2VWaWV3IChsb2NhdGlvbikge1xuICAgIEdvb2dsZUFuYWx5dGljcy5zZXQoeyBwYWdlOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICBHb29nbGVBbmFseXRpY3MucGFnZXZpZXcobG9jYXRpb24ucGF0aG5hbWUpO1xuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKEdBTGlzdGVuZXIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvR0FMaXN0ZW5lci9pbmRleC5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1nYVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0LWdhXCJcbi8vIG1vZHVsZSBpZCA9IDc2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU0VPIGZyb20gJ2NvbXBvbmVudHMvU0VPJztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IFB1Ymxpc2hUb29sIGZyb20gJ2NvbnRhaW5lcnMvUHVibGlzaFRvb2wnO1xuXG5jbGFzcyBIb21lUGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXsncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uJ30+XG4gICAgICAgIDxTRU8gLz5cbiAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQgZmxleC1jb250YWluZXItLWNvbHVtbid9PlxuICAgICAgICAgIDxQdWJsaXNoVG9vbCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEhvbWVQYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3BhZ2VzL0hvbWVQYWdlL2luZGV4LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgSGVsbWV0IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQgeyBjcmVhdGVQYWdlVGl0bGUgfSBmcm9tICd1dGlscy9wYWdlVGl0bGUnO1xuaW1wb3J0IHsgY3JlYXRlTWV0YVRhZ3MgfSBmcm9tICd1dGlscy9tZXRhVGFncyc7XG5pbXBvcnQgeyBjcmVhdGVDYW5vbmljYWxMaW5rIH0gZnJvbSAndXRpbHMvY2Fub25pY2FsTGluayc7XG5cbmNsYXNzIFNFTyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgLy8gcHJvcHMgZnJvbSBzdGF0ZVxuICAgIGNvbnN0IHsgZGVmYXVsdERlc2NyaXB0aW9uLCBkZWZhdWx0VGh1bWJuYWlsLCBzaXRlRGVzY3JpcHRpb24sIHNpdGVIb3N0LCBzaXRlVGl0bGUsIHNpdGVUd2l0dGVyIH0gPSB0aGlzLnByb3BzO1xuICAgIC8vIHByb3BzIGZyb20gcGFyZW50XG4gICAgY29uc3QgeyBhc3NldCwgY2hhbm5lbCwgcGFnZVVyaSB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgeyBwYWdlVGl0bGUgfSA9IHRoaXMucHJvcHM7XG4gICAgLy8gY3JlYXRlIHBhZ2UgdGl0bGUsIHRhZ3MsIGFuZCBjYW5vbmljYWwgbGlua1xuICAgIHBhZ2VUaXRsZSA9IGNyZWF0ZVBhZ2VUaXRsZShzaXRlVGl0bGUsIHBhZ2VUaXRsZSk7XG4gICAgY29uc3QgbWV0YVRhZ3MgPSBjcmVhdGVNZXRhVGFncyhzaXRlRGVzY3JpcHRpb24sIHNpdGVIb3N0LCBzaXRlVGl0bGUsIHNpdGVUd2l0dGVyLCBhc3NldCwgY2hhbm5lbCwgZGVmYXVsdERlc2NyaXB0aW9uLCBkZWZhdWx0VGh1bWJuYWlsKTtcbiAgICBjb25zdCBjYW5vbmljYWxMaW5rID0gY3JlYXRlQ2Fub25pY2FsTGluayhhc3NldCwgY2hhbm5lbCwgcGFnZVVyaSwgc2l0ZUhvc3QpO1xuICAgIC8vIHJlbmRlciByZXN1bHRzXG4gICAgcmV0dXJuIChcbiAgICAgIDxIZWxtZXRcbiAgICAgICAgdGl0bGU9e3BhZ2VUaXRsZX1cbiAgICAgICAgbWV0YT17bWV0YVRhZ3N9XG4gICAgICAgIGxpbms9e1t7cmVsOiAnY2Fub25pY2FsJywgaHJlZjogY2Fub25pY2FsTGlua31dfVxuICAgICAgLz5cbiAgICApO1xuICB9XG59O1xuXG5TRU8ucHJvcFR5cGVzID0ge1xuICBwYWdlVGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHBhZ2VVcmkgIDogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2hhbm5lbCAgOiBQcm9wVHlwZXMub2JqZWN0LFxuICBhc3NldCAgICA6IFByb3BUeXBlcy5vYmplY3QsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBTRU87XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9TRU8vdmlldy5qc3giLCJleHBvcnQgY29uc3QgY3JlYXRlUGFnZVRpdGxlID0gKHNpdGVUaXRsZSwgcGFnZVRpdGxlKSA9PiB7XG4gIGlmICghcGFnZVRpdGxlKSB7XG4gICAgcmV0dXJuIGAke3NpdGVUaXRsZX1gO1xuICB9XG4gIHJldHVybiBgJHtzaXRlVGl0bGV9IC0gJHtwYWdlVGl0bGV9YDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvcGFnZVRpdGxlLmpzIiwiY29uc3QgZGV0ZXJtaW5lT2dUaHVtYm5haWxDb250ZW50VHlwZSA9ICh0aHVtYm5haWwpID0+IHtcbiAgaWYgKHRodW1ibmFpbCkge1xuICAgIGNvbnN0IGZpbGVFeHQgPSB0aHVtYm5haWwuc3Vic3RyaW5nKHRodW1ibmFpbC5sYXN0SW5kZXhPZignLicpKTtcbiAgICBzd2l0Y2ggKGZpbGVFeHQpIHtcbiAgICAgIGNhc2UgJ2pwZWcnOlxuICAgICAgY2FzZSAnanBnJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9qcGVnJztcbiAgICAgIGNhc2UgJ3BuZyc6XG4gICAgICAgIHJldHVybiAnaW1hZ2UvcG5nJztcbiAgICAgIGNhc2UgJ2dpZic6XG4gICAgICAgIHJldHVybiAnaW1hZ2UvZ2lmJztcbiAgICAgIGNhc2UgJ21wNCc6XG4gICAgICAgIHJldHVybiAndmlkZW8vbXA0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnaW1hZ2UvanBlZyc7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn07XG5cbmNvbnN0IGNyZWF0ZUJhc2ljTWV0YVRhZ3MgPSAoc2l0ZUhvc3QsIHNpdGVEZXNjcmlwdGlvbiwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlcikgPT4ge1xuICByZXR1cm4gW1xuICAgIHtwcm9wZXJ0eTogJ29nOnRpdGxlJywgY29udGVudDogc2l0ZVRpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiBzaXRlSG9zdH0sXG4gICAge3Byb3BlcnR5OiAnb2c6c2l0ZV9uYW1lJywgY29udGVudDogc2l0ZVRpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzpkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IHNpdGVEZXNjcmlwdGlvbn0sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpzaXRlJywgY29udGVudDogc2l0ZVR3aXR0ZXJ9LFxuICAgIHtwcm9wZXJ0eTogJ3R3aXR0ZXI6Y2FyZCcsIGNvbnRlbnQ6ICdzdW1tYXJ5J30sXG4gIF07XG59O1xuXG5jb25zdCBjcmVhdGVDaGFubmVsTWV0YVRhZ3MgPSAoc2l0ZVRpdGxlLCBzaXRlSG9zdCwgc2l0ZVR3aXR0ZXIsIGNoYW5uZWwpID0+IHtcbiAgY29uc3QgeyBuYW1lLCBsb25nSWQgfSA9IGNoYW5uZWw7XG4gIHJldHVybiBbXG4gICAge3Byb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiBgJHtuYW1lfSBvbiAke3NpdGVUaXRsZX1gfSxcbiAgICB7cHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiBgJHtzaXRlSG9zdH0vJHtuYW1lfToke2xvbmdJZH1gfSxcbiAgICB7cHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiBzaXRlVGl0bGV9LFxuICAgIHtwcm9wZXJ0eTogJ29nOmRlc2NyaXB0aW9uJywgY29udGVudDogYCR7bmFtZX0sIGEgY2hhbm5lbCBvbiAke3NpdGVUaXRsZX1gfSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOnNpdGUnLCBjb250ZW50OiBzaXRlVHdpdHRlcn0sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3N1bW1hcnknfSxcbiAgXTtcbn07XG5cbmNvbnN0IGNyZWF0ZUFzc2V0TWV0YVRhZ3MgPSAoc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIsIGFzc2V0LCBkZWZhdWx0RGVzY3JpcHRpb24sIGRlZmF1bHRUaHVtYm5haWwpID0+IHtcbiAgY29uc3QgeyBjbGFpbURhdGEgfSA9IGFzc2V0O1xuICBjb25zdCB7IGNvbnRlbnRUeXBlIH0gPSBjbGFpbURhdGE7XG4gIGNvbnN0IGVtYmVkVXJsID0gYCR7c2l0ZUhvc3R9LyR7Y2xhaW1EYXRhLmNsYWltSWR9LyR7Y2xhaW1EYXRhLm5hbWV9YDtcbiAgY29uc3Qgc2hvd1VybCA9IGAke3NpdGVIb3N0fS8ke2NsYWltRGF0YS5jbGFpbUlkfS8ke2NsYWltRGF0YS5uYW1lfWA7XG4gIGNvbnN0IHNvdXJjZSA9IGAke3NpdGVIb3N0fS8ke2NsYWltRGF0YS5jbGFpbUlkfS8ke2NsYWltRGF0YS5uYW1lfS4ke2NsYWltRGF0YS5maWxlRXh0fWA7XG4gIGNvbnN0IG9nVGl0bGUgPSBjbGFpbURhdGEudGl0bGUgfHwgY2xhaW1EYXRhLm5hbWU7XG4gIGNvbnN0IG9nRGVzY3JpcHRpb24gPSBjbGFpbURhdGEuZGVzY3JpcHRpb24gfHwgZGVmYXVsdERlc2NyaXB0aW9uO1xuICBjb25zdCBvZ1RodW1ibmFpbENvbnRlbnRUeXBlID0gZGV0ZXJtaW5lT2dUaHVtYm5haWxDb250ZW50VHlwZShjbGFpbURhdGEudGh1bWJuYWlsKTtcbiAgY29uc3Qgb2dUaHVtYm5haWwgPSBjbGFpbURhdGEudGh1bWJuYWlsIHx8IGRlZmF1bHRUaHVtYm5haWw7XG4gIGNvbnN0IG1ldGFUYWdzID0gW1xuICAgIHtwcm9wZXJ0eTogJ29nOnRpdGxlJywgY29udGVudDogb2dUaXRsZX0sXG4gICAge3Byb3BlcnR5OiAnb2c6dXJsJywgY29udGVudDogc2hvd1VybH0sXG4gICAge3Byb3BlcnR5OiAnb2c6c2l0ZV9uYW1lJywgY29udGVudDogc2l0ZVRpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzpkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IG9nRGVzY3JpcHRpb259LFxuICAgIHtwcm9wZXJ0eTogJ29nOmltYWdlOndpZHRoJywgY29udGVudDogNjAwfSxcbiAgICB7cHJvcGVydHk6ICdvZzppbWFnZTpoZWlnaHQnLCBjb250ZW50OiAzMTV9LFxuICAgIHtwcm9wZXJ0eTogJ3R3aXR0ZXI6c2l0ZScsIGNvbnRlbnQ6IHNpdGVUd2l0dGVyfSxcbiAgXTtcbiAgaWYgKGNvbnRlbnRUeXBlID09PSAndmlkZW8vbXA0JyB8fCBjb250ZW50VHlwZSA9PT0gJ3ZpZGVvL3dlYm0nKSB7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp2aWRlbycsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dmlkZW86c2VjdXJlX3VybCcsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dmlkZW86dHlwZScsIGNvbnRlbnQ6IGNvbnRlbnRUeXBlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzppbWFnZScsIGNvbnRlbnQ6IG9nVGh1bWJuYWlsfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzppbWFnZTp0eXBlJywgY29udGVudDogb2dUaHVtYm5haWxDb250ZW50VHlwZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dHlwZScsIGNvbnRlbnQ6ICd2aWRlbyd9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6Y2FyZCcsIGNvbnRlbnQ6ICdwbGF5ZXInfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcicsIGNvbnRlbnQ6IGVtYmVkVXJsfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcjp3aWR0aCcsIGNvbnRlbnQ6IDYwMH0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjp0ZXh0OnBsYXllcl93aWR0aCcsIGNvbnRlbnQ6IDYwMH0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpwbGF5ZXI6aGVpZ2h0JywgY29udGVudDogMzM3fSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcjpzdHJlYW0nLCBjb250ZW50OiBzb3VyY2V9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyOnN0cmVhbTpjb250ZW50X3R5cGUnLCBjb250ZW50OiBjb250ZW50VHlwZX0pO1xuICB9IGVsc2Uge1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6aW1hZ2UnLCBjb250ZW50OiBzb3VyY2V9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOmltYWdlOnR5cGUnLCBjb250ZW50OiBjb250ZW50VHlwZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6dHlwZScsIGNvbnRlbnQ6ICdhcnRpY2xlJ30pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3N1bW1hcnlfbGFyZ2VfaW1hZ2UnfSk7XG4gIH1cbiAgcmV0dXJuIG1ldGFUYWdzO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU1ldGFUYWdzID0gKHNpdGVEZXNjcmlwdGlvbiwgc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIsIGFzc2V0LCBjaGFubmVsLCBkZWZhdWx0RGVzY3JpcHRpb24sIGRlZmF1bHRUaHVtYm5haWwpID0+IHtcbiAgaWYgKGFzc2V0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUFzc2V0TWV0YVRhZ3Moc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIsIGFzc2V0LCBkZWZhdWx0RGVzY3JpcHRpb24sIGRlZmF1bHRUaHVtYm5haWwpO1xuICB9O1xuICBpZiAoY2hhbm5lbCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFubmVsTWV0YVRhZ3Moc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIsIGNoYW5uZWwpO1xuICB9O1xuICByZXR1cm4gY3JlYXRlQmFzaWNNZXRhVGFncyhzaXRlRGVzY3JpcHRpb24sIHNpdGVIb3N0LCBzaXRlVGl0bGUsIHNpdGVUd2l0dGVyKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvbWV0YVRhZ3MuanMiLCJjb25zdCBjcmVhdGVCYXNpY0Nhbm9uaWNhbExpbmsgPSAocGFnZSwgc2l0ZUhvc3QpID0+IHtcbiAgcmV0dXJuIGAke3NpdGVIb3N0fS8ke3BhZ2V9YDtcbn07XG5cbmNvbnN0IGNyZWF0ZUFzc2V0Q2Fub25pY2FsTGluayA9IChhc3NldCwgc2l0ZUhvc3QpID0+IHtcbiAgbGV0IGNoYW5uZWxOYW1lLCBjZXJ0aWZpY2F0ZUlkLCBuYW1lLCBjbGFpbUlkO1xuICBpZiAoYXNzZXQuY2xhaW1EYXRhKSB7XG4gICAgKHsgY2hhbm5lbE5hbWUsIGNlcnRpZmljYXRlSWQsIG5hbWUsIGNsYWltSWQgfSA9IGFzc2V0LmNsYWltRGF0YSk7XG4gIH07XG4gIGlmIChjaGFubmVsTmFtZSkge1xuICAgIHJldHVybiBgJHtzaXRlSG9zdH0vJHtjaGFubmVsTmFtZX06JHtjZXJ0aWZpY2F0ZUlkfS8ke25hbWV9YDtcbiAgfTtcbiAgcmV0dXJuIGAke3NpdGVIb3N0fS8ke2NsYWltSWR9LyR7bmFtZX1gO1xufTtcblxuY29uc3QgY3JlYXRlQ2hhbm5lbENhbm9uaWNhbExpbmsgPSAoY2hhbm5lbCwgc2l0ZUhvc3QpID0+IHtcbiAgY29uc3QgeyBuYW1lLCBsb25nSWQgfSA9IGNoYW5uZWw7XG4gIHJldHVybiBgJHtzaXRlSG9zdH0vJHtuYW1lfToke2xvbmdJZH1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNhbm9uaWNhbExpbmsgPSAoYXNzZXQsIGNoYW5uZWwsIHBhZ2UsIHNpdGVIb3N0KSA9PiB7XG4gIGlmIChhc3NldCkge1xuICAgIHJldHVybiBjcmVhdGVBc3NldENhbm9uaWNhbExpbmsoYXNzZXQsIHNpdGVIb3N0KTtcbiAgfVxuICBpZiAoY2hhbm5lbCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFubmVsQ2Fub25pY2FsTGluayhjaGFubmVsLCBzaXRlSG9zdCk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJhc2ljQ2Fub25pY2FsTGluayhwYWdlLCBzaXRlSG9zdCk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL2Nhbm9uaWNhbExpbmsuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTmF2TGluaywgd2l0aFJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IExvZ28gZnJvbSAnY29tcG9uZW50cy9Mb2dvJztcbmltcG9ydCBOYXZCYXJDaGFubmVsRHJvcGRvd24gZnJvbSAnY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5jb25zdCBWSUVXID0gJ1ZJRVcnO1xuY29uc3QgTE9HT1VUID0gJ0xPR09VVCc7XG5cbmNsYXNzIE5hdkJhciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmNoZWNrRm9yTG9nZ2VkSW5Vc2VyID0gdGhpcy5jaGVja0ZvckxvZ2dlZEluVXNlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMubG9nb3V0VXNlciA9IHRoaXMubG9nb3V0VXNlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uID0gdGhpcy5oYW5kbGVTZWxlY3Rpb24uYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkIGluXG4gICAgdGhpcy5jaGVja0ZvckxvZ2dlZEluVXNlcigpO1xuICB9XG4gIGNoZWNrRm9yTG9nZ2VkSW5Vc2VyICgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7Y3JlZGVudGlhbHM6ICdpbmNsdWRlJ307XG4gICAgcmVxdWVzdCgnL3VzZXInLCBwYXJhbXMpXG4gICAgICAudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dpbihkYXRhLmNoYW5uZWxOYW1lLCBkYXRhLnNob3J0Q2hhbm5lbElkLCBkYXRhLmNoYW5uZWxDbGFpbUlkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnL3VzZXIgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuICBsb2dvdXRVc2VyICgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7Y3JlZGVudGlhbHM6ICdpbmNsdWRlJ307XG4gICAgcmVxdWVzdCgnL2xvZ291dCcsIHBhcmFtcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dvdXQoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnL2xvZ291dCBlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgaGFuZGxlU2VsZWN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnNlbGVjdGVkT3B0aW9uc1swXS52YWx1ZTtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlIExPR09VVDpcbiAgICAgICAgdGhpcy5sb2dvdXRVc2VyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWSUVXOlxuICAgICAgICAvLyByZWRpcmVjdCB0byBjaGFubmVsIHBhZ2VcbiAgICAgICAgdGhpcy5wcm9wcy5oaXN0b3J5LnB1c2goYC8ke3RoaXMucHJvcHMuY2hhbm5lbE5hbWV9OiR7dGhpcy5wcm9wcy5jaGFubmVsTG9uZ0lkfWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc2l0ZURlc2NyaXB0aW9uIH0gPSAgdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgbmF2LWJhcic+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1zaG9ydCBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWNlbnRlcic+XG4gICAgICAgICAgPExvZ28gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbmF2LWJhci0tY2VudGVyJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nbmF2LWJhci10YWdsaW5lJz57c2l0ZURlc2NyaXB0aW9ufTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbmF2LWJhci0tcmlnaHQnPlxuICAgICAgICAgICAgPE5hdkxpbmsgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyBhY3RpdmVDbGFzc05hbWU9J2xpbmstLW5hdi1hY3RpdmUnIHRvPScvJyBleGFjdD5QdWJsaXNoPC9OYXZMaW5rPlxuICAgICAgICAgICAgPE5hdkxpbmsgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyAgYWN0aXZlQ2xhc3NOYW1lPSdsaW5rLS1uYXYtYWN0aXZlJyB0bz0nL2Fib3V0Jz5BYm91dDwvTmF2TGluaz5cbiAgICAgICAgICAgIHsgdGhpcy5wcm9wcy5jaGFubmVsTmFtZSA/IChcbiAgICAgICAgICAgICAgPE5hdkJhckNoYW5uZWxEcm9wZG93blxuICAgICAgICAgICAgICAgIGNoYW5uZWxOYW1lPXt0aGlzLnByb3BzLmNoYW5uZWxOYW1lfVxuICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbj17dGhpcy5oYW5kbGVTZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGlvbj17dGhpcy5wcm9wcy5jaGFubmVsTmFtZX1cbiAgICAgICAgICAgICAgICBWSUVXPXtWSUVXfVxuICAgICAgICAgICAgICAgIExPR09VVD17TE9HT1VUfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPE5hdkxpbmsgaWQ9J25hdi1iYXItbG9naW4tbGluaycgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyBhY3RpdmVDbGFzc05hbWU9J2xpbmstLW5hdi1hY3RpdmUnIHRvPScvbG9naW4nPkNoYW5uZWw8L05hdkxpbms+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFJvdXRlcihOYXZCYXIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvTmF2QmFyL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcblxuZnVuY3Rpb24gTG9nbyAoKSB7XG4gIHJldHVybiAoXG4gICAgPHN2ZyB2ZXJzaW9uPScxLjEnIGlkPSdMYXllcl8xJyB4PScwcHgnIHk9JzBweCcgaGVpZ2h0PScyNHB4JyB2aWV3Qm94PScwIDAgODAgMzEnIGVuYWJsZUJhY2tncm91bmQ9J25ldyAwIDAgODAgMzEnIGNsYXNzTmFtZT0nbmF2LWJhci1sb2dvJz5cbiAgICAgIDxMaW5rIHRvPScvJz5cbiAgICAgICAgPHRpdGxlPkxvZ288L3RpdGxlPlxuICAgICAgICA8ZGVzYz5TcGVlLmNoIGxvZ288L2Rlc2M+XG4gICAgICAgIDxnIGlkPSdBYm91dCc+XG4gICAgICAgICAgPGcgaWQ9J1B1Ymxpc2gtRm9ybS1WMi1feDI4X2ZpbGxlZF94MjlfJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtNDIuMDAwMDAwLCAtMjMuMDAwMDAwKSc+XG4gICAgICAgICAgICA8ZyBpZD0nR3JvdXAtMTcnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDQyLjAwMDAwMCwgMjIuMDAwMDAwKSc+XG4gICAgICAgICAgICAgIDx0ZXh0IHRyYW5zZm9ybT0nbWF0cml4KDEgMCAwIDEgMCAyMCknIGZvbnRTaXplPScyNScgZm9udEZhbWlseT0nUm9ib3RvJz5TcGVlJmx0O2g8L3RleHQ+XG4gICAgICAgICAgICAgIDxnIGlkPSdHcm91cC0xNicgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMC4wMDAwMDAsIDMwLjAwMDAwMCknPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzA5RjkxMScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTAuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5JyBmaWxsPSdub25lJyBzdHJva2U9JyMwMjlENzQnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J00xNi41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBpZD0nTGluZS04LUNvcHktMicgZmlsbD0nbm9uZScgc3Ryb2tlPScjRTM1QkQ4JyBzdHJva2VXaWR0aD0nMScgc3Ryb2tlTGluZWNhcD0nc3F1YXJlJyBkPSdNMzIuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5LTMnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzQxNTZDNScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTQ4LjUsMS41aDE1JyAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgtQ29weS00JyBmaWxsPSdub25lJyBzdHJva2U9JyM2MzU2ODgnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J002NC41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9nPlxuICAgICAgPC9MaW5rPlxuICAgIDwvc3ZnPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nbztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0xvZ28vaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gTmF2QmFyQ2hhbm5lbERyb3Bkb3duICh7IGNoYW5uZWxOYW1lLCBoYW5kbGVTZWxlY3Rpb24sIGRlZmF1bHRTZWxlY3Rpb24sIFZJRVcsIExPR09VVCB9KSB7XG4gIHJldHVybiAoXG4gICAgPHNlbGVjdCB0eXBlPSd0ZXh0JyBpZD0nbmF2LWJhci1jaGFubmVsLXNlbGVjdCcgY2xhc3NOYW1lPSdzZWxlY3Qgc2VsZWN0LS1hcnJvdyBsaW5rLS1uYXYnIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3Rpb259IHZhbHVlPXtkZWZhdWx0U2VsZWN0aW9ufT5cbiAgICAgIDxvcHRpb24gaWQ9J25hdi1iYXItY2hhbm5lbC1zZWxlY3QtY2hhbm5lbC1vcHRpb24nPntjaGFubmVsTmFtZX08L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9e1ZJRVd9PlZpZXc8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9e0xPR09VVH0+TG9nb3V0PC9vcHRpb24+XG4gICAgPC9zZWxlY3Q+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOYXZCYXJDaGFubmVsRHJvcGRvd247XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duL2luZGV4LmpzeCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyb3NzLWZldGNoL3BvbHlmaWxsXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiY3Jvc3MtZmV0Y2gvcG9seWZpbGxcIlxuLy8gbW9kdWxlIGlkID0gODVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlZDogcHVibGlzaC5kaXNhYmxlZCxcbiAgICBmaWxlICAgIDogcHVibGlzaC5maWxlLFxuICAgIHN0YXR1cyAgOiBwdWJsaXNoLnN0YXR1cy5zdGF0dXMsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVG9vbC9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRHJvcHpvbmUgZnJvbSAnY29udGFpbmVycy9Ecm9wem9uZSc7XG5pbXBvcnQgUHVibGlzaERldGFpbHMgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoRGV0YWlscyc7XG5pbXBvcnQgUHVibGlzaFN0YXR1cyBmcm9tICdjb250YWluZXJzL1B1Ymxpc2hTdGF0dXMnO1xuaW1wb3J0IFB1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoRGlzYWJsZWRNZXNzYWdlJztcblxuY2xhc3MgUHVibGlzaFRvb2wgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygncHVibGlzaCBpcyBkaXNhYmxlZCcpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFB1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UgLz5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdwdWJsaXNoIGlzIG5vdCBkaXNhYmxlZCcpO1xuICAgICAgaWYgKHRoaXMucHJvcHMuZmlsZSkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5zdGF0dXMpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFB1Ymxpc2hTdGF0dXMgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiA8UHVibGlzaERldGFpbHMgLz47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiA8RHJvcHpvbmUgLz47XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoVG9vbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUb29sL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHZhbGlkYXRlRmlsZSB9IGZyb20gJ3V0aWxzL2ZpbGUnO1xuaW1wb3J0IFB1Ymxpc2hQcmV2aWV3IGZyb20gJ2NvbXBvbmVudHMvUHVibGlzaFByZXZpZXcnO1xuXG5jbGFzcyBEcm9wem9uZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZHJhZ092ZXIgIDogZmFsc2UsXG4gICAgICBtb3VzZU92ZXIgOiBmYWxzZSxcbiAgICAgIGRpbVByZXZpZXc6IGZhbHNlLFxuICAgIH07XG4gICAgdGhpcy5oYW5kbGVEcm9wID0gdGhpcy5oYW5kbGVEcm9wLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVEcmFnT3ZlciA9IHRoaXMuaGFuZGxlRHJhZ092ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSB0aGlzLmhhbmRsZURyYWdFbmQuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZURyYWdFbnRlciA9IHRoaXMuaGFuZGxlRHJhZ0VudGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVEcmFnTGVhdmUgPSB0aGlzLmhhbmRsZURyYWdMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTW91c2VFbnRlciA9IHRoaXMuaGFuZGxlTW91c2VFbnRlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSA9IHRoaXMuaGFuZGxlTW91c2VMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVGaWxlSW5wdXQgPSB0aGlzLmhhbmRsZUZpbGVJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2hvb3NlRmlsZSA9IHRoaXMuY2hvb3NlRmlsZS5iaW5kKHRoaXMpO1xuICB9XG4gIGhhbmRsZURyb3AgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogZmFsc2V9KTtcbiAgICAvLyBpZiBkcm9wcGVkIGl0ZW1zIGFyZW4ndCBmaWxlcywgcmVqZWN0IHRoZW1cbiAgICBjb25zdCBkdCA9IGV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICBpZiAoZHQuaXRlbXMpIHtcbiAgICAgIGlmIChkdC5pdGVtc1swXS5raW5kID09PSAnZmlsZScpIHtcbiAgICAgICAgY29uc3QgZHJvcHBlZEZpbGUgPSBkdC5pdGVtc1swXS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgdGhpcy5jaG9vc2VGaWxlKGRyb3BwZWRGaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaGFuZGxlRHJhZ092ZXIgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBoYW5kbGVEcmFnRW5kIChldmVudCkge1xuICAgIHZhciBkdCA9IGV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICBpZiAoZHQuaXRlbXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHQuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZHQuaXRlbXMucmVtb3ZlKGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuY2xlYXJEYXRhKCk7XG4gICAgfVxuICB9XG4gIGhhbmRsZURyYWdFbnRlciAoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7ZHJhZ092ZXI6IHRydWUsIGRpbVByZXZpZXc6IHRydWV9KTtcbiAgfVxuICBoYW5kbGVEcmFnTGVhdmUgKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe2RyYWdPdmVyOiBmYWxzZSwgZGltUHJldmlldzogZmFsc2V9KTtcbiAgfVxuICBoYW5kbGVNb3VzZUVudGVyICgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHttb3VzZU92ZXI6IHRydWUsIGRpbVByZXZpZXc6IHRydWV9KTtcbiAgfVxuICBoYW5kbGVNb3VzZUxlYXZlICgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHttb3VzZU92ZXI6IGZhbHNlLCBkaW1QcmV2aWV3OiBmYWxzZX0pO1xuICB9XG4gIGhhbmRsZUNsaWNrIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVfaW5wdXQnKS5jbGljaygpO1xuICB9XG4gIGhhbmRsZUZpbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGZpbGVMaXN0ID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuICAgIHRoaXMuY2hvb3NlRmlsZShmaWxlTGlzdFswXSk7XG4gIH1cbiAgY2hvb3NlRmlsZSAoZmlsZSkge1xuICAgIGlmIChmaWxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWxpZGF0ZUZpbGUoZmlsZSk7IC8vIHZhbGlkYXRlIHRoZSBmaWxlJ3MgbmFtZSwgdHlwZSwgYW5kIHNpemVcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNldEZpbGVFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIC8vIHN0YWdlIGl0IHNvIGl0IHdpbGwgYmUgcmVhZHkgd2hlbiB0aGUgcHVibGlzaCBidXR0b24gaXMgY2xpY2tlZFxuICAgICAgdGhpcy5wcm9wcy5zZWxlY3RGaWxlKGZpbGUpO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uJz5cbiAgICAgICAgPGZvcm0+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT0naW5wdXQtZmlsZScgdHlwZT0nZmlsZScgaWQ9J2ZpbGVfaW5wdXQnIG5hbWU9J2ZpbGVfaW5wdXQnIGFjY2VwdD0ndmlkZW8vKixpbWFnZS8qJyBvbkNoYW5nZT17dGhpcy5oYW5kbGVGaWxlSW5wdXR9IGVuY1R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIC8+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgICAgPGRpdiBpZD0ncHJldmlldy1kcm9wem9uZScgY2xhc3NOYW1lPXsncm93IHJvdy0tcGFkZGVkIHJvdy0tdGFsbCBkcm9wem9uZScgKyAodGhpcy5zdGF0ZS5kcmFnT3ZlciA/ICcgZHJvcHpvbmUtLWRyYWctb3ZlcicgOiAnJyl9IG9uRHJvcD17dGhpcy5oYW5kbGVEcm9wfSBvbkRyYWdPdmVyPXt0aGlzLmhhbmRsZURyYWdPdmVyfSBvbkRyYWdFbmQ9e3RoaXMuaGFuZGxlRHJhZ0VuZH0gb25EcmFnRW50ZXI9e3RoaXMuaGFuZGxlRHJhZ0VudGVyfSBvbkRyYWdMZWF2ZT17dGhpcy5oYW5kbGVEcmFnTGVhdmV9IG9uTW91c2VFbnRlcj17dGhpcy5oYW5kbGVNb3VzZUVudGVyfSBvbk1vdXNlTGVhdmU9e3RoaXMuaGFuZGxlTW91c2VMZWF2ZX0gb25DbGljaz17dGhpcy5oYW5kbGVDbGlja30+XG4gICAgICAgICAge3RoaXMucHJvcHMuZmlsZSA/IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxQdWJsaXNoUHJldmlld1xuICAgICAgICAgICAgICAgIGRpbVByZXZpZXc9e3RoaXMuc3RhdGUuZGltUHJldmlld31cbiAgICAgICAgICAgICAgICBmaWxlPXt0aGlzLnByb3BzLmZpbGV9XG4gICAgICAgICAgICAgICAgdGh1bWJuYWlsPXt0aGlzLnByb3BzLnRodW1ibmFpbH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBpZD0nZHJvcHpvbmUtdGV4dC1ob2xkZXInIGNsYXNzTmFtZT17J2ZsZXgtY29udGFpbmVyLS1jb2x1bW4gZmxleC1jb250YWluZXItLWNlbnRlci1jZW50ZXInfT5cbiAgICAgICAgICAgICAgICB7IHRoaXMuc3RhdGUuZHJhZ092ZXIgPyAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdkcm9wem9uZS1kcmFnb3Zlcic+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nYmx1ZSc+RHJvcCBpdC48L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgeyB0aGlzLnN0YXRlLm1vdXNlT3ZlciA/IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2Ryb3B6b25lLWluc3RydWN0aW9ucyc+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLXBsYWNlaG9sZGVyIGluZm8tbWVzc2FnZS0tZmFpbHVyZScgaWQ9J2lucHV0LWVycm9yLWZpbGUtc2VsZWN0aW9uJz57dGhpcy5wcm9wcy5maWxlRXJyb3J9PC9wPlxuICAgICAgICAgICAgICAgICAgICA8cD5EcmFnICYgZHJvcCBpbWFnZSBvciB2aWRlbyBoZXJlIHRvIHB1Ymxpc2g8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nZmluZS1wcmludCc+T1I8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nYmx1ZS0tdW5kZXJsaW5lZCc+Q0hPT1NFIEZJTEU8L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgaWQ9J2Ryb3B6b25lLXRleHQtaG9sZGVyJyBjbGFzc05hbWU9eydmbGV4LWNvbnRhaW5lci0tY29sdW1uIGZsZXgtY29udGFpbmVyLS1jZW50ZXItY2VudGVyJ30+XG4gICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5kcmFnT3ZlciA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPSdkcm9wem9uZS1kcmFnb3Zlcic+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J2JsdWUnPkRyb3AgaXQuPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2Ryb3B6b25lLWluc3RydWN0aW9ucyc+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS1wbGFjZWhvbGRlciBpbmZvLW1lc3NhZ2UtLWZhaWx1cmUnIGlkPSdpbnB1dC1lcnJvci1maWxlLXNlbGVjdGlvbic+e3RoaXMucHJvcHMuZmlsZUVycm9yfTwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPkRyYWcgJiBkcm9wIGltYWdlIG9yIHZpZGVvIGhlcmUgdG8gcHVibGlzaDwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nZmluZS1wcmludCc+T1I8L3A+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J2JsdWUtLXVuZGVybGluZWQnPkNIT09TRSBGSUxFPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEcm9wem9uZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0Ryb3B6b25lL3ZpZXcuanN4IiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIHZhbGlkYXRlRmlsZSAoZmlsZSkge1xuICAgIGlmICghZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGlmICgvJy8udGVzdChmaWxlLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Fwb3N0cm9waGVzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgZmlsZSBuYW1lJyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHNpemUgYW5kIHR5cGVcbiAgICBzd2l0Y2ggKGZpbGUudHlwZSkge1xuICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6XG4gICAgICBjYXNlICdpbWFnZS9qcGcnOlxuICAgICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDEwMDAwMDAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSwgaW1hZ2VzIGFyZSBsaW1pdGVkIHRvIDEwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ltYWdlL2dpZic6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiA1MDAwMDAwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIEdJRnMgYXJlIGxpbWl0ZWQgdG8gNTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmlkZW8vbXA0JzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDUwMDAwMDAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSwgdmlkZW9zIGFyZSBsaW1pdGVkIHRvIDUwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihmaWxlLnR5cGUgKyAnIGlzIG5vdCBhIHN1cHBvcnRlZCBmaWxlIHR5cGUuIE9ubHksIC5qcGVnLCAucG5nLCAuZ2lmLCBhbmQgLm1wNCBmaWxlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL2ZpbGUuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuY2xhc3MgUHVibGlzaFByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGltZ1NvdXJjZSAgICAgICA6ICcnLFxuICAgICAgZGVmYXVsdFRodW1ibmFpbDogJy9hc3NldHMvaW1nL3ZpZGVvX3RodW1iX2RlZmF1bHQucG5nJyxcbiAgICB9O1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLnNldFByZXZpZXdJbWFnZVNvdXJjZSh0aGlzLnByb3BzLmZpbGUpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG5ld1Byb3BzKSB7XG4gICAgaWYgKG5ld1Byb3BzLmZpbGUgIT09IHRoaXMucHJvcHMuZmlsZSkge1xuICAgICAgdGhpcy5zZXRQcmV2aWV3SW1hZ2VTb3VyY2UobmV3UHJvcHMuZmlsZSk7XG4gICAgfVxuICAgIGlmIChuZXdQcm9wcy50aHVtYm5haWwgIT09IHRoaXMucHJvcHMudGh1bWJuYWlsKSB7XG4gICAgICBpZiAobmV3UHJvcHMudGh1bWJuYWlsKSB7XG4gICAgICAgIHRoaXMuc2V0UHJldmlld0ltYWdlU291cmNlRnJvbUZpbGUobmV3UHJvcHMudGh1bWJuYWlsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ltZ1NvdXJjZTogdGhpcy5zdGF0ZS5kZWZhdWx0VGh1bWJuYWlsfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNldFByZXZpZXdJbWFnZVNvdXJjZUZyb21GaWxlIChmaWxlKSB7XG4gICAgY29uc3QgcHJldmlld1JlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcHJldmlld1JlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHByZXZpZXdSZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1nU291cmNlOiBwcmV2aWV3UmVhZGVyLnJlc3VsdH0pO1xuICAgIH07XG4gIH1cbiAgc2V0UHJldmlld0ltYWdlU291cmNlIChmaWxlKSB7XG4gICAgaWYgKGZpbGUudHlwZSAhPT0gJ3ZpZGVvL21wNCcpIHtcbiAgICAgIHRoaXMuc2V0UHJldmlld0ltYWdlU291cmNlRnJvbUZpbGUoZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnRodW1ibmFpbCkge1xuICAgICAgICB0aGlzLnNldFByZXZpZXdJbWFnZVNvdXJjZUZyb21GaWxlKHRoaXMucHJvcHMudGh1bWJuYWlsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoe2ltZ1NvdXJjZTogdGhpcy5zdGF0ZS5kZWZhdWx0VGh1bWJuYWlsfSk7XG4gICAgfVxuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxpbWdcbiAgICAgICAgaWQ9J2Ryb3B6b25lLXByZXZpZXcnXG4gICAgICAgIHNyYz17dGhpcy5zdGF0ZS5pbWdTb3VyY2V9XG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5kaW1QcmV2aWV3ID8gJ2RpbScgOiAnJ31cbiAgICAgICAgYWx0PSdwdWJsaXNoIHByZXZpZXcnXG4gICAgICAvPlxuICAgICk7XG4gIH1cbn07XG5cblB1Ymxpc2hQcmV2aWV3LnByb3BUeXBlcyA9IHtcbiAgZGltUHJldmlldzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgZmlsZSAgICAgIDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB0aHVtYm5haWwgOiBQcm9wVHlwZXMub2JqZWN0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHVibGlzaFByZXZpZXc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9QdWJsaXNoUHJldmlldy9pbmRleC5qc3giLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7Y2xlYXJGaWxlLCBzdGFydFB1Ymxpc2h9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBjaGFubmVsLCBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBmaWxlOiBwdWJsaXNoLmZpbGUsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSB7XG4gIGNsZWFyRmlsZSxcbiAgc3RhcnRQdWJsaXNoLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoRGV0YWlscy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB3aXRoUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgRHJvcHpvbmUgZnJvbSAnY29udGFpbmVycy9Ecm9wem9uZSc7XG5pbXBvcnQgUHVibGlzaFRpdGxlSW5wdXQgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoVGl0bGVJbnB1dCc7XG5pbXBvcnQgUHVibGlzaFVybElucHV0IGZyb20gJ2NvbnRhaW5lcnMvUHVibGlzaFVybElucHV0JztcbmltcG9ydCBQdWJsaXNoVGh1bWJuYWlsSW5wdXQgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoVGh1bWJuYWlsSW5wdXQnO1xuaW1wb3J0IFB1Ymxpc2hNZXRhZGF0YUlucHV0cyBmcm9tICdjb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cyc7XG5pbXBvcnQgQ2hhbm5lbFNlbGVjdCBmcm9tICdjb250YWluZXJzL0NoYW5uZWxTZWxlY3QnO1xuXG5jbGFzcyBQdWJsaXNoRGV0YWlscyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMub25QdWJsaXNoU3VibWl0ID0gdGhpcy5vblB1Ymxpc2hTdWJtaXQuYmluZCh0aGlzKTtcbiAgfVxuICBvblB1Ymxpc2hTdWJtaXQgKCkge1xuICAgIHRoaXMucHJvcHMuc3RhcnRQdWJsaXNoKHRoaXMucHJvcHMuaGlzdG9yeSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLW5vLWJvdHRvbSc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xMCc+XG4gICAgICAgICAgPFB1Ymxpc2hUaXRsZUlucHV0IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7LyogbGVmdCBjb2x1bW4gKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tc21sLTEwJyA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgICA8RHJvcHpvbmUgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsvKiByaWdodCBjb2x1bW4gKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tc21sLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICA8ZGl2IGlkPSdwdWJsaXNoLWFjdGl2ZS1hcmVhJyBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0tbm8tdG9wIHJvdy0td2lkZSc+XG4gICAgICAgICAgICAgIDxQdWJsaXNoVXJsSW5wdXQgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLXRvcCByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICA8Q2hhbm5lbFNlbGVjdCAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7ICh0aGlzLnByb3BzLmZpbGUudHlwZSA9PT0gJ3ZpZGVvL21wNCcpICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLXRvcCByb3ctLXdpZGUgJz5cbiAgICAgICAgICAgICAgICA8UHVibGlzaFRodW1ibmFpbElucHV0IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1uby10b3Agcm93LS1uby1ib3R0b20gcm93LS13aWRlJz5cbiAgICAgICAgICAgICAgPFB1Ymxpc2hNZXRhZGF0YUlucHV0cyAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0td2lkZSBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9J3B1Ymxpc2gtc3VibWl0JyBjbGFzc05hbWU9J2J1dHRvbi0tcHJpbWFyeSBidXR0b24tLWxhcmdlJyBvbkNsaWNrPXt0aGlzLm9uUHVibGlzaFN1Ym1pdH0+UHVibGlzaDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0tbm8tYm90dG9tIGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9J2J1dHRvbi0tY2FuY2VsJyBvbkNsaWNrPXt0aGlzLnByb3BzLmNsZWFyRmlsZX0+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nZmluZS1wcmludCc+QnkgY2xpY2tpbmcgJ1B1Ymxpc2gnLCB5b3UgYWZmaXJtIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0cyB0byBwdWJsaXNoIHRoaXMgY29udGVudCB0byB0aGUgTEJSWSBuZXR3b3JrLCBhbmQgdGhhdCB5b3UgdW5kZXJzdGFuZCB0aGUgcHJvcGVydGllcyBvZiBwdWJsaXNoaW5nIGl0IHRvIGEgZGVjZW50cmFsaXplZCwgdXNlci1jb250cm9sbGVkIG5ldHdvcmsuIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9sZWFybic+UmVhZCBtb3JlLjwvYT48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKFB1Ymxpc2hEZXRhaWxzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hEZXRhaWxzL3ZpZXcuanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge3VwZGF0ZU1ldGFkYXRhfSBmcm9tICdhY3Rpb25zL3B1Ymxpc2gnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHB1Ymxpc2gubWV0YWRhdGEudGl0bGUsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBkaXNwYXRjaCA9PiB7XG4gIHJldHVybiB7XG4gICAgb25NZXRhZGF0YUNoYW5nZTogKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVNZXRhZGF0YShuYW1lLCB2YWx1ZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUaXRsZUlucHV0L2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY2xhc3MgUHVibGlzaFRpdGxlSW5wdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVJbnB1dCA9IHRoaXMuaGFuZGxlSW5wdXQuYmluZCh0aGlzKTtcbiAgfVxuICBoYW5kbGVJbnB1dCAoZSkge1xuICAgIGNvbnN0IG5hbWUgPSBlLnRhcmdldC5uYW1lO1xuICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5wcm9wcy5vbk1ldGFkYXRhQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3B1Ymxpc2gtdGl0bGUnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCB0ZXh0LS1sYXJnZSBpbnB1dC10ZXh0LS1mdWxsLXdpZHRoJyBuYW1lPSd0aXRsZScgcGxhY2Vob2xkZXI9J0dpdmUgeW91ciBwb3N0IGEgdGl0bGUuLi4nIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUlucHV0fSB2YWx1ZT17dGhpcy5wcm9wcy50aXRsZX0gLz5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hUaXRsZUlucHV0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFRpdGxlSW5wdXQvdmlldy5qc3giLCJpbXBvcnQge3VwZGF0ZUNsYWltLCB1cGRhdGVFcnJvcn0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgY2hhbm5lbCwgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgbG9nZ2VkSW5DaGFubmVsTmFtZSAgIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgICBsb2dnZWRJbkNoYW5uZWxTaG9ydElkOiBjaGFubmVsLmxvZ2dlZEluQ2hhbm5lbC5zaG9ydElkLFxuICAgIGZpbGVOYW1lICAgICAgICAgICAgICA6IHB1Ymxpc2guZmlsZS5uYW1lLFxuICAgIHB1Ymxpc2hJbkNoYW5uZWwgICAgICA6IHB1Ymxpc2gucHVibGlzaEluQ2hhbm5lbCxcbiAgICBzZWxlY3RlZENoYW5uZWwgICAgICAgOiBwdWJsaXNoLnNlbGVjdGVkQ2hhbm5lbCxcbiAgICBjbGFpbSAgICAgICAgICAgICAgICAgOiBwdWJsaXNoLmNsYWltLFxuICAgIHVybEVycm9yICAgICAgICAgICAgICA6IHB1Ymxpc2guZXJyb3IudXJsLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uQ2xhaW1DaGFuZ2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlQ2xhaW0odmFsdWUpKTtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZUVycm9yKCdwdWJsaXNoU3VibWl0JywgbnVsbCkpO1xuICAgIH0sXG4gICAgb25VcmxFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVFcnJvcigndXJsJywgdmFsdWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVXJsSW5wdXQvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAndXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgVXJsTWlkZGxlIGZyb20gJ2NvbXBvbmVudHMvUHVibGlzaFVybE1pZGRsZURpc3BsYXknO1xuXG5jbGFzcyBQdWJsaXNoVXJsSW5wdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVJbnB1dCA9IHRoaXMuaGFuZGxlSW5wdXQuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgeyBjbGFpbSwgZmlsZU5hbWUgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFjbGFpbSkge1xuICAgICAgdGhpcy5zZXRDbGFpbU5hbWUoZmlsZU5hbWUpO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICh7IGNsYWltLCBmaWxlTmFtZSB9KSB7XG4gICAgLy8gaWYgYSBuZXcgZmlsZSB3YXMgY2hvc2VuLCB1cGRhdGUgdGhlIGNsYWltIG5hbWVcbiAgICBpZiAoZmlsZU5hbWUgIT09IHRoaXMucHJvcHMuZmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldENsYWltTmFtZShmaWxlTmFtZSk7XG4gICAgfVxuICAgIC8vIGlmIHRoZSBjbGFpbSBoYXMgdXBkYXRlZCwgY2hlY2sgaXRzIGF2YWlsYWJpbGl0eVxuICAgIGlmIChjbGFpbSAhPT0gdGhpcy5wcm9wcy5jbGFpbSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNsYWltKGNsYWltKTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlSW5wdXQgKGV2ZW50KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHZhbHVlID0gdGhpcy5jbGVhbnNlSW5wdXQodmFsdWUpO1xuICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGVcbiAgICB0aGlzLnByb3BzLm9uQ2xhaW1DaGFuZ2UodmFsdWUpO1xuICB9XG4gIGNsZWFuc2VJbnB1dCAoaW5wdXQpIHtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1xccysvZywgJy0nKTsgLy8gcmVwbGFjZSBzcGFjZXMgd2l0aCBkYXNoZXNcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05LV0vZywgJycpOyAgLy8gcmVtb3ZlIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBBLVosIGEteiwgMC05LCBvciAnLSdcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgc2V0Q2xhaW1OYW1lIChmaWxlTmFtZSkge1xuICAgIGNvbnN0IGZpbGVOYW1lV2l0aG91dEVuZGluZyA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpKTtcbiAgICBjb25zdCBjbGVhbkNsYWltTmFtZSA9IHRoaXMuY2xlYW5zZUlucHV0KGZpbGVOYW1lV2l0aG91dEVuZGluZyk7XG4gICAgdGhpcy5wcm9wcy5vbkNsYWltQ2hhbmdlKGNsZWFuQ2xhaW1OYW1lKTtcbiAgfVxuICB2YWxpZGF0ZUNsYWltIChjbGFpbSkge1xuICAgIGlmICghY2xhaW0pIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uVXJsRXJyb3IoJ0VudGVyIGEgdXJsIGFib3ZlJyk7XG4gICAgfVxuICAgIHJlcXVlc3QoYC9hcGkvY2xhaW0vYXZhaWxhYmlsaXR5LyR7Y2xhaW19YClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vblVybEVycm9yKG51bGwpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vblVybEVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNsYWltLCBsb2dnZWRJbkNoYW5uZWxOYW1lLCBsb2dnZWRJbkNoYW5uZWxTaG9ydElkLCBwdWJsaXNoSW5DaGFubmVsLCBzZWxlY3RlZENoYW5uZWwsIHVybEVycm9yIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMTAgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSBzcGFuLS1yZWxhdGl2ZSc+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd1cmwtdGV4dC0tc2Vjb25kYXJ5Jz5zcGVlLmNoIC8gPC9zcGFuPlxuICAgICAgICAgIDxVcmxNaWRkbGVcbiAgICAgICAgICAgIHB1Ymxpc2hJbkNoYW5uZWw9e3B1Ymxpc2hJbkNoYW5uZWx9XG4gICAgICAgICAgICBzZWxlY3RlZENoYW5uZWw9e3NlbGVjdGVkQ2hhbm5lbH1cbiAgICAgICAgICAgIGxvZ2dlZEluQ2hhbm5lbE5hbWU9e2xvZ2dlZEluQ2hhbm5lbE5hbWV9XG4gICAgICAgICAgICBsb2dnZWRJbkNoYW5uZWxTaG9ydElkPXtsb2dnZWRJbkNoYW5uZWxTaG9ydElkfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdjbGFpbS1uYW1lLWlucHV0JyBjbGFzc05hbWU9J2lucHV0LXRleHQnIG5hbWU9J2NsYWltJyBwbGFjZWhvbGRlcj0neW91ci11cmwtaGVyZScgb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IHZhbHVlPXtjbGFpbX0gLz5cbiAgICAgICAgICB7IChjbGFpbSAmJiAhdXJsRXJyb3IpICYmIDxzcGFuIGlkPSdpbnB1dC1zdWNjZXNzLWNsYWltLW5hbWUnIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1zdWNjZXNzIHNwYW4tLWFic29sdXRlJz57J1xcdTI3MTMnfTwvc3Bhbj4gfVxuICAgICAgICAgIHsgdXJsRXJyb3IgJiYgPHNwYW4gaWQ9J2lucHV0LXN1Y2Nlc3MtY2hhbm5lbC1uYW1lJyBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSBzcGFuLS1hYnNvbHV0ZSc+eydcXHUyNzE2J308L3NwYW4+IH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgeyB1cmxFcnJvciA/IChcbiAgICAgICAgICAgIDxwIGlkPSdpbnB1dC1lcnJvci1jbGFpbS1uYW1lJyBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSc+e3VybEVycm9yfTwvcD5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UnPkNob29zZSBhIGN1c3RvbSB1cmw8L3A+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hVcmxJbnB1dDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hVcmxJbnB1dC92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5mdW5jdGlvbiBVcmxNaWRkbGUgKHtwdWJsaXNoSW5DaGFubmVsLCBzZWxlY3RlZENoYW5uZWwsIGxvZ2dlZEluQ2hhbm5lbE5hbWUsIGxvZ2dlZEluQ2hhbm5lbFNob3J0SWR9KSB7XG4gIGlmIChwdWJsaXNoSW5DaGFubmVsKSB7XG4gICAgaWYgKHNlbGVjdGVkQ2hhbm5lbCA9PT0gbG9nZ2VkSW5DaGFubmVsTmFtZSkge1xuICAgICAgcmV0dXJuIDxzcGFuIGlkPSd1cmwtY2hhbm5lbCcgY2xhc3NOYW1lPSd1cmwtdGV4dC0tc2Vjb25kYXJ5Jz57bG9nZ2VkSW5DaGFubmVsTmFtZX06e2xvZ2dlZEluQ2hhbm5lbFNob3J0SWR9IC88L3NwYW4+O1xuICAgIH1cbiAgICByZXR1cm4gPHNwYW4gaWQ9J3VybC1jaGFubmVsLXBsYWNlaG9sZGVyJyBjbGFzc05hbWU9J3VybC10ZXh0LS1zZWNvbmRhcnkgdG9vbHRpcCc+QGNoYW5uZWw8c3BhblxuICAgICAgY2xhc3NOYW1lPSd0b29sdGlwLXRleHQnPlNlbGVjdCBhIGNoYW5uZWwgYmVsb3c8L3NwYW4+IC88L3NwYW4+O1xuICB9XG4gIHJldHVybiAoXG4gICAgPHNwYW4gaWQ9J3VybC1uby1jaGFubmVsLXBsYWNlaG9sZGVyJyBjbGFzc05hbWU9J3VybC10ZXh0LS1zZWNvbmRhcnkgdG9vbHRpcCc+eHl6PHNwYW4gY2xhc3NOYW1lPSd0b29sdGlwLXRleHQnPlRoaXMgd2lsbCBiZSBhIHJhbmRvbSBpZDwvc3Bhbj4gLzwvc3Bhbj5cbiAgKTtcbn1cblxuVXJsTWlkZGxlLnByb3BUeXBlcyA9IHtcbiAgcHVibGlzaEluQ2hhbm5lbCAgICAgIDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbG9nZ2VkSW5DaGFubmVsTmFtZSAgIDogUHJvcFR5cGVzLnN0cmluZyxcbiAgbG9nZ2VkSW5DaGFubmVsU2hvcnRJZDogUHJvcFR5cGVzLnN0cmluZyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFVybE1pZGRsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL1B1Ymxpc2hVcmxNaWRkbGVEaXNwbGF5L2luZGV4LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBvbk5ld1RodW1ibmFpbCB9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoOiB7IGZpbGUgfSB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZmlsZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IHtcbiAgb25OZXdUaHVtYm5haWwsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUaHVtYm5haWxJbnB1dC9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIGRhdGFVUkl0b0Jsb2IoZGF0YVVSSSkge1xuICAvLyBjb252ZXJ0IGJhc2U2NC9VUkxFbmNvZGVkIGRhdGEgY29tcG9uZW50IHRvIHJhdyBiaW5hcnkgZGF0YSBoZWxkIGluIGEgc3RyaW5nXG4gIGxldCBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJJLnNwbGl0KCcsJylbMV0pO1xuICAvLyBzZXBhcmF0ZSBvdXQgdGhlIG1pbWUgY29tcG9uZW50XG4gIGxldCBtaW1lU3RyaW5nID0gZGF0YVVSSS5zcGxpdCgnLCcpWzBdLnNwbGl0KCc6JylbMV0uc3BsaXQoJzsnKVswXTtcbiAgLy8gd3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSBzdHJpbmcgdG8gYSB0eXBlZCBhcnJheVxuICBsZXQgaWEgPSBuZXcgVWludDhBcnJheShieXRlU3RyaW5nLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZVN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgIGlhW2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBuZXcgQmxvYihbaWFdLCB7dHlwZTogbWltZVN0cmluZ30pO1xufVxuXG5jbGFzcyBQdWJsaXNoVGh1bWJuYWlsSW5wdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZpZGVvU291cmNlICAgOiBudWxsLFxuICAgICAgZXJyb3IgICAgICAgICA6IG51bGwsXG4gICAgICBzbGlkZXJNaW5SYW5nZTogMSxcbiAgICAgIHNsaWRlck1heFJhbmdlOiBudWxsLFxuICAgICAgc2xpZGVyVmFsdWUgICA6IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZVZpZGVvTG9hZGVkRGF0YSA9IHRoaXMuaGFuZGxlVmlkZW9Mb2FkZWREYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVTbGlkZXJDaGFuZ2UgPSB0aGlzLmhhbmRsZVNsaWRlckNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlVGh1bWJuYWlsID0gdGhpcy5jcmVhdGVUaHVtYm5haWwuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgeyBmaWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIHRoaXMuc2V0VmlkZW9Tb3VyY2UoZmlsZSk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV4dFByb3BzKSB7XG4gICAgLy8gaWYgZmlsZSBjaGFuZ2VzXG4gICAgaWYgKG5leHRQcm9wcy5maWxlICYmIG5leHRQcm9wcy5maWxlICE9PSB0aGlzLnByb3BzLmZpbGUpIHtcbiAgICAgIGNvbnN0IHsgZmlsZSB9ID0gbmV4dFByb3BzO1xuICAgICAgdGhpcy5zZXRWaWRlb1NvdXJjZShmaWxlKTtcbiAgICB9O1xuICB9XG4gIHNldFZpZGVvU291cmNlIChmaWxlKSB7XG4gICAgY29uc3QgcHJldmlld1JlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcHJldmlld1JlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHByZXZpZXdSZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVVyaSA9IHByZXZpZXdSZWFkZXIucmVzdWx0O1xuICAgICAgY29uc3QgYmxvYiA9IGRhdGFVUkl0b0Jsb2IoZGF0YVVyaSk7XG4gICAgICBjb25zdCB2aWRlb1NvdXJjZSA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdmlkZW9Tb3VyY2UgfSk7XG4gICAgfTtcbiAgfVxuICBoYW5kbGVWaWRlb0xvYWRlZERhdGEgKGV2ZW50KSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSBldmVudC50YXJnZXQuZHVyYXRpb247XG4gICAgY29uc3QgdG90YWxNaW51dGVzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAvIDYwKTtcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKGR1cmF0aW9uICUgNjApO1xuICAgIC8vIHNldCB0aGUgc2xpZGVyXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzbGlkZXJNYXhSYW5nZTogZHVyYXRpb24gKiAxMDAsXG4gICAgICBzbGlkZXJWYWx1ZSAgIDogZHVyYXRpb24gKiAxMDAgLyAyLFxuICAgICAgdG90YWxNaW51dGVzLFxuICAgICAgdG90YWxTZWNvbmRzLFxuICAgIH0pO1xuICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSB2aWRlb1xuICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWRlby10aHVtYi1wbGF5ZXInKTtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IGR1cmF0aW9uIC8gMjtcbiAgfVxuICBoYW5kbGVTbGlkZXJDaGFuZ2UgKGV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUpO1xuICAgIC8vIHVwZGF0ZSB0aGUgc2xpZGVyIHZhbHVlXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzbGlkZXJWYWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gICAgLy8gdXBkYXRlIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIHZpZGVvXG4gICAgbGV0IHZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZGVvLXRodW1iLXBsYXllcicpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdmFsdWUgLyAxMDA7XG4gIH1cbiAgY3JlYXRlVGh1bWJuYWlsICgpIHtcbiAgICAvLyB0YWtlIGEgc25hcHNob3RcbiAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlkZW8tdGh1bWItcGxheWVyJyk7XG4gICAgbGV0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHZpZGVvLnZpZGVvV2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0O1xuICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgIGNvbnN0IGJsb2IgPSBkYXRhVVJJdG9CbG9iKGRhdGFVcmwpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IEZpbGUoW2Jsb2JdLCBgdGh1bWJuYWlsLnBuZ2AsIHtcbiAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxuICAgIH0pO1xuICAgIC8vIHNldCB0aGUgdGh1bWJuYWlsIGluIHJlZHV4IHN0b3JlXG4gICAgaWYgKHNuYXBzaG90KSB7XG4gICAgICB0aGlzLnByb3BzLm9uTmV3VGh1bWJuYWlsKHNuYXBzaG90KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGVycm9yLCB2aWRlb1NvdXJjZSwgc2xpZGVyTWluUmFuZ2UsIHNsaWRlck1heFJhbmdlLCBzbGlkZXJWYWx1ZSwgdG90YWxNaW51dGVzLCB0b3RhbFNlY29uZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJz5UaHVtYm5haWw6PC9sYWJlbD5cbiAgICAgICAgPHZpZGVvXG4gICAgICAgICAgaWQ9J3ZpZGVvLXRodW1iLXBsYXllcidcbiAgICAgICAgICBwcmVsb2FkPSdtZXRhZGF0YSdcbiAgICAgICAgICBtdXRlZFxuICAgICAgICAgIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX1cbiAgICAgICAgICBwbGF5c0lubGluZVxuICAgICAgICAgIG9uTG9hZGVkRGF0YT17dGhpcy5oYW5kbGVWaWRlb0xvYWRlZERhdGF9XG4gICAgICAgICAgc3JjPXt2aWRlb1NvdXJjZX1cbiAgICAgICAgICBvblNlZWtlZD17dGhpcy5jcmVhdGVUaHVtYm5haWx9XG4gICAgICAgIC8+XG4gICAgICAgIHtcbiAgICAgICAgICBzbGlkZXJWYWx1ZSA/IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWNlbnRlcicgc3R5bGU9e3t3aWR0aDogJzEwMCUnfX0+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UnPjAnMDBcIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2luZm8tbWVzc2FnZSc+e3RvdGFsTWludXRlc30ne3RvdGFsU2Vjb25kc31cIjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPSdyYW5nZSdcbiAgICAgICAgICAgICAgICAgIG1pbj17c2xpZGVyTWluUmFuZ2V9XG4gICAgICAgICAgICAgICAgICBtYXg9e3NsaWRlck1heFJhbmdlfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e3NsaWRlclZhbHVlfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdzbGlkZXInXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVTbGlkZXJDaGFuZ2V9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UnID5sb2FkaW5nLi4uIDwvcD5cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgeyBlcnJvciA/IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSc+e2Vycm9yfTwvcD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZSc+VXNlIHNsaWRlciB0byBzZXQgdGh1bWJuYWlsPC9wPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoVGh1bWJuYWlsSW5wdXQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVGh1bWJuYWlsSW5wdXQvdmlldy5qc3giLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7dXBkYXRlTWV0YWRhdGEsIHRvZ2dsZU1ldGFkYXRhSW5wdXRzfSBmcm9tICdhY3Rpb25zL3B1Ymxpc2gnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgc2hvd01ldGFkYXRhSW5wdXRzOiBwdWJsaXNoLnNob3dNZXRhZGF0YUlucHV0cyxcbiAgICBkZXNjcmlwdGlvbiAgICAgICA6IHB1Ymxpc2gubWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgbGljZW5zZSAgICAgICAgICAgOiBwdWJsaXNoLm1ldGFkYXRhLmxpY2Vuc2UsXG4gICAgbnNmdyAgICAgICAgICAgICAgOiBwdWJsaXNoLm1ldGFkYXRhLm5zZncsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBkaXNwYXRjaCA9PiB7XG4gIHJldHVybiB7XG4gICAgb25NZXRhZGF0YUNoYW5nZTogKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVNZXRhZGF0YShuYW1lLCB2YWx1ZSkpO1xuICAgIH0sXG4gICAgb25Ub2dnbGVNZXRhZGF0YUlucHV0czogKHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh0b2dnbGVNZXRhZGF0YUlucHV0cyh2YWx1ZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXhwYW5kaW5nVGV4dEFyZWEgZnJvbSAnY29tcG9uZW50cy9FeHBhbmRpbmdUZXh0QXJlYSc7XG5cbmNsYXNzIFB1Ymxpc2hNZXRhZGF0YUlucHV0cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnRvZ2dsZVNob3dJbnB1dHMgPSB0aGlzLnRvZ2dsZVNob3dJbnB1dHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZUlucHV0ID0gdGhpcy5oYW5kbGVJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0ID0gdGhpcy5oYW5kbGVTZWxlY3QuYmluZCh0aGlzKTtcbiAgfVxuICB0b2dnbGVTaG93SW5wdXRzICgpIHtcbiAgICB0aGlzLnByb3BzLm9uVG9nZ2xlTWV0YWRhdGFJbnB1dHMoIXRoaXMucHJvcHMuc2hvd01ldGFkYXRhSW5wdXRzKTtcbiAgfVxuICBoYW5kbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQudHlwZSA9PT0gJ2NoZWNrYm94JyA/IHRhcmdldC5jaGVja2VkIDogdGFyZ2V0LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXQubmFtZTtcbiAgICB0aGlzLnByb3BzLm9uTWV0YWRhdGFDaGFuZ2UobmFtZSwgdmFsdWUpO1xuICB9XG4gIGhhbmRsZVNlbGVjdCAoZXZlbnQpIHtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBldmVudC50YXJnZXQuc2VsZWN0ZWRPcHRpb25zWzBdLnZhbHVlO1xuICAgIHRoaXMucHJvcHMub25NZXRhZGF0YUNoYW5nZShuYW1lLCBzZWxlY3RlZE9wdGlvbik7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0ncHVibGlzaC1kZXRhaWxzJyBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLXRvcCByb3ctLXdpZGUnPlxuICAgICAgICB7dGhpcy5wcm9wcy5zaG93TWV0YWRhdGFJbnB1dHMgJiYgKFxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPSdwdWJsaXNoLWxpY2Vuc2UnIGNsYXNzTmFtZT0nbGFiZWwnPkRlc2NyaXB0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8RXhwYW5kaW5nVGV4dEFyZWFcbiAgICAgICAgICAgICAgICAgIGlkPSdwdWJsaXNoLWRlc2NyaXB0aW9uJ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSd0ZXh0YXJlYSB0ZXh0YXJlYS0tcHJpbWFyeSB0ZXh0YXJlYS0tZnVsbC13aWR0aCdcbiAgICAgICAgICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgICAgICAgICBtYXhMZW5ndGg9ezIwMDB9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBtYXhIZWlnaHQ6IDIwMCB9fVxuICAgICAgICAgICAgICAgICAgbmFtZT0nZGVzY3JpcHRpb24nXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0nT3B0aW9uYWwgZGVzY3JpcHRpb24nXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUlucHV0fSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPSdwdWJsaXNoLWxpY2Vuc2UnIGNsYXNzTmFtZT0nbGFiZWwnPkxpY2Vuc2U6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgdHlwZT0ndGV4dCcgbmFtZT0nbGljZW5zZScgaWQ9J3B1Ymxpc2gtbGljZW5zZScgY2xhc3NOYW1lPSdzZWxlY3Qgc2VsZWN0LS1wcmltYXJ5JyBvbkNoYW5nZT17dGhpcy5oYW5kbGVTZWxlY3R9PlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nICc+VW5zcGVjaWZpZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J1B1YmxpYyBEb21haW4nPlB1YmxpYyBEb21haW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J0NyZWF0aXZlIENvbW1vbnMnPkNyZWF0aXZlIENvbW1vbnM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLW5vLXRvcCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zJz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj0ncHVibGlzaC1uc2Z3JyBjbGFzc05hbWU9J2xhYmVsJz5NYXR1cmU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcnPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9J2lucHV0LWNoZWNrYm94JyB0eXBlPSdjaGVja2JveCcgaWQ9J3B1Ymxpc2gtbnNmdycgbmFtZT0nbnNmdycgdmFsdWU9e3RoaXMucHJvcHMubnNmd30gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXNlY29uZGFyeScgb25DbGljaz17dGhpcy50b2dnbGVTaG93SW5wdXRzfT57dGhpcy5wcm9wcy5zaG93TWV0YWRhdGFJbnB1dHMgPyAnbGVzcycgOiAnbW9yZSd9PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hNZXRhZGF0YUlucHV0cztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy92aWV3LmpzeCIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jbGFzcyBFeHBhbmRpbmdUZXh0YXJlYSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLl9oYW5kbGVDaGFuZ2UgPSB0aGlzLl9oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5hZGp1c3RUZXh0YXJlYSh7fSk7XG4gIH1cbiAgX2hhbmRsZUNoYW5nZSAoZXZlbnQpIHtcbiAgICBjb25zdCB7IG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChvbkNoYW5nZSkgb25DaGFuZ2UoZXZlbnQpO1xuICAgIHRoaXMuYWRqdXN0VGV4dGFyZWEoZXZlbnQpO1xuICB9XG4gIGFkanVzdFRleHRhcmVhICh7IHRhcmdldCA9IHRoaXMuZWwgfSkge1xuICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSAwO1xuICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBgJHt0YXJnZXQuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgLi4ucmVzdCB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPHRleHRhcmVhXG4gICAgICAgIHsuLi5yZXN0fVxuICAgICAgICByZWY9e3ggPT4gdGhpcy5lbCA9IHh9XG4gICAgICAgIG9uQ2hhbmdlPXt0aGlzLl9oYW5kbGVDaGFuZ2V9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuRXhwYW5kaW5nVGV4dGFyZWEucHJvcFR5cGVzID0ge1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBFeHBhbmRpbmdUZXh0YXJlYTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0V4cGFuZGluZ1RleHRBcmVhL2luZGV4LmpzeCIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtzZXRQdWJsaXNoSW5DaGFubmVsLCB1cGRhdGVTZWxlY3RlZENoYW5uZWwsIHVwZGF0ZUVycm9yfSBmcm9tICdhY3Rpb25zL3B1Ymxpc2gnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgY2hhbm5lbCwgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgbG9nZ2VkSW5DaGFubmVsTmFtZTogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgICBwdWJsaXNoSW5DaGFubmVsICAgOiBwdWJsaXNoLnB1Ymxpc2hJbkNoYW5uZWwsXG4gICAgc2VsZWN0ZWRDaGFubmVsICAgIDogcHVibGlzaC5zZWxlY3RlZENoYW5uZWwsXG4gICAgY2hhbm5lbEVycm9yICAgICAgIDogcHVibGlzaC5lcnJvci5jaGFubmVsLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uUHVibGlzaEluQ2hhbm5lbENoYW5nZTogKHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVFcnJvcignY2hhbm5lbCcsIG51bGwpKTtcbiAgICAgIGRpc3BhdGNoKHNldFB1Ymxpc2hJbkNoYW5uZWwodmFsdWUpKTtcbiAgICB9LFxuICAgIG9uQ2hhbm5lbFNlbGVjdDogKHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVFcnJvcignY2hhbm5lbCcsIG51bGwpKTtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZVNlbGVjdGVkQ2hhbm5lbCh2YWx1ZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxTZWxlY3QvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENoYW5uZWxMb2dpbkZvcm0gZnJvbSAnY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtJztcbmltcG9ydCBDaGFubmVsQ3JlYXRlRm9ybSBmcm9tICdjb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtJztcbmltcG9ydCAqIGFzIHN0YXRlcyBmcm9tICdjb25zdGFudHMvcHVibGlzaF9jaGFubmVsX3NlbGVjdF9zdGF0ZXMnO1xuXG5jbGFzcyBDaGFubmVsU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMudG9nZ2xlQW5vbnltb3VzUHVibGlzaCA9IHRoaXMudG9nZ2xlQW5vbnltb3VzUHVibGlzaC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uID0gdGhpcy5oYW5kbGVTZWxlY3Rpb24uYmluZCh0aGlzKTtcbiAgfVxuICB0b2dnbGVBbm9ueW1vdXNQdWJsaXNoIChldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gJ2Fub255bW91cycpIHtcbiAgICAgIHRoaXMucHJvcHMub25QdWJsaXNoSW5DaGFubmVsQ2hhbmdlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5vblB1Ymxpc2hJbkNoYW5uZWxDaGFuZ2UodHJ1ZSk7XG4gICAgfVxuICB9XG4gIGhhbmRsZVNlbGVjdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGV2ZW50LnRhcmdldC5zZWxlY3RlZE9wdGlvbnNbMF0udmFsdWU7XG4gICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxTZWxlY3Qoc2VsZWN0ZWRPcHRpb24pO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxmb3JtPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nYW5vbnltb3VzLW9yLWNoYW5uZWwnIGlkPSdhbm9ueW1vdXMtcmFkaW8nIGNsYXNzTmFtZT0naW5wdXQtcmFkaW8nIHZhbHVlPSdhbm9ueW1vdXMnIGNoZWNrZWQ9eyF0aGlzLnByb3BzLnB1Ymxpc2hJbkNoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLnRvZ2dsZUFub255bW91c1B1Ymxpc2h9IC8+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCBsYWJlbC0tcG9pbnRlcicgaHRtbEZvcj0nYW5vbnltb3VzLXJhZGlvJz5Bbm9ueW1vdXM8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nYW5vbnltb3VzLW9yLWNoYW5uZWwnIGlkPSdjaGFubmVsLXJhZGlvJyBjbGFzc05hbWU9J2lucHV0LXJhZGlvJyB2YWx1ZT0naW4gYSBjaGFubmVsJyBjaGVja2VkPXt0aGlzLnByb3BzLnB1Ymxpc2hJbkNoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLnRvZ2dsZUFub255bW91c1B1Ymxpc2h9IC8+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCBsYWJlbC0tcG9pbnRlcicgaHRtbEZvcj0nY2hhbm5lbC1yYWRpbyc+SW4gYSBjaGFubmVsPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7IHRoaXMucHJvcHMuY2hhbm5lbEVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUnPnt0aGlzLnByb3BzLmNoYW5uZWxFcnJvcn08L3A+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5QdWJsaXNoIGFub255bW91c2x5IG9yIGluIGEgY2hhbm5lbDwvcD5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIHsgdGhpcy5wcm9wcy5wdWJsaXNoSW5DaGFubmVsICYmIChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMnPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCcgaHRtbEZvcj0nY2hhbm5lbC1uYW1lLXNlbGVjdCc+Q2hhbm5lbDo8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcnPlxuICAgICAgICAgICAgICA8c2VsZWN0IHR5cGU9J3RleHQnIGlkPSdjaGFubmVsLW5hbWUtc2VsZWN0JyBjbGFzc05hbWU9J3NlbGVjdCBzZWxlY3QtLWFycm93JyB2YWx1ZT17dGhpcy5wcm9wcy5zZWxlY3RlZENoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZVNlbGVjdGlvbn0+XG4gICAgICAgICAgICAgICAgeyB0aGlzLnByb3BzLmxvZ2dlZEluQ2hhbm5lbE5hbWUgJiYgPG9wdGlvbiB2YWx1ZT17dGhpcy5wcm9wcy5sb2dnZWRJbkNoYW5uZWxOYW1lfSBpZD0ncHVibGlzaC1jaGFubmVsLXNlbGVjdC1jaGFubmVsLW9wdGlvbic+e3RoaXMucHJvcHMubG9nZ2VkSW5DaGFubmVsTmFtZX08L29wdGlvbj4gfVxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9e3N0YXRlcy5MT0dJTn0+RXhpc3Rpbmc8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtzdGF0ZXMuQ1JFQVRFfT5OZXc8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHsgKHRoaXMucHJvcHMuc2VsZWN0ZWRDaGFubmVsID09PSBzdGF0ZXMuTE9HSU4pICYmIDxDaGFubmVsTG9naW5Gb3JtIC8+IH1cbiAgICAgICAgICAgIHsgKHRoaXMucHJvcHMuc2VsZWN0ZWRDaGFubmVsID09PSBzdGF0ZXMuQ1JFQVRFKSAmJiA8Q2hhbm5lbENyZWF0ZUZvcm0gLz4gfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGFubmVsU2VsZWN0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbFNlbGVjdC92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcblxuY2xhc3MgQ2hhbm5lbExvZ2luRm9ybSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZXJyb3IgICA6IG51bGwsXG4gICAgICBuYW1lICAgIDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZUlucHV0ID0gdGhpcy5oYW5kbGVJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMubG9naW5Ub0NoYW5uZWwgPSB0aGlzLmxvZ2luVG9DaGFubmVsLmJpbmQodGhpcyk7XG4gIH1cbiAgaGFuZGxlSW5wdXQgKGV2ZW50KSB7XG4gICAgY29uc3QgbmFtZSA9IGV2ZW50LnRhcmdldC5uYW1lO1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1tuYW1lXTogdmFsdWV9KTtcbiAgfVxuICBsb2dpblRvQ2hhbm5lbCAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG1ldGhvZCA6ICdQT1NUJyxcbiAgICAgIGJvZHkgICA6IEpTT04uc3RyaW5naWZ5KHt1c2VybmFtZTogdGhpcy5zdGF0ZS5uYW1lLCBwYXNzd29yZDogdGhpcy5zdGF0ZS5wYXNzd29yZH0pLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSksXG4gICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgIH07XG4gICAgcmVxdWVzdCgnbG9naW4nLCBwYXJhbXMpXG4gICAgICAudGhlbigoe3N1Y2Nlc3MsIGNoYW5uZWxOYW1lLCBzaG9ydENoYW5uZWxJZCwgY2hhbm5lbENsYWltSWQsIG1lc3NhZ2V9KSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dpbihjaGFubmVsTmFtZSwgc2hvcnRDaGFubmVsSWQsIGNoYW5uZWxDbGFpbUlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBtZXNzYWdlfSk7XG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7J2Vycm9yJzogZXJyb3J9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGZvcm0gaWQ9J2NoYW5uZWwtbG9naW4tZm9ybSc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlIHJvdy0tc2hvcnQnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJyBodG1sRm9yPSdjaGFubmVsLWxvZ2luLW5hbWUtaW5wdXQnPk5hbWU6PC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNiBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1sZWZ0LWJvdHRvbSc+XG4gICAgICAgICAgICAgIDxzcGFuPkA8L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nY2hhbm5lbC1sb2dpbi1uYW1lLWlucHV0JyBjbGFzc05hbWU9J2lucHV0LXRleHQnIG5hbWU9J25hbWUnIHBsYWNlaG9sZGVyPSdZb3VyIENoYW5uZWwgTmFtZScgdmFsdWU9e3RoaXMuc3RhdGUuY2hhbm5lbE5hbWV9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUlucHV0fSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0td2lkZSByb3ctLXNob3J0Jz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMyBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCcgaHRtbEZvcj0nY2hhbm5lbC1sb2dpbi1wYXNzd29yZC1pbnB1dCcgPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTYgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2lucHV0LXRleHQtLXByaW1hcnknPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIGlkPSdjaGFubmVsLWxvZ2luLXBhc3N3b3JkLWlucHV0JyBuYW1lPSdwYXNzd29yZCcgY2xhc3NOYW1lPSdpbnB1dC10ZXh0JyBwbGFjZWhvbGRlcj0nJyB2YWx1ZT17dGhpcy5zdGF0ZS5jaGFubmVsUGFzc3dvcmR9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUlucHV0fSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7IHRoaXMuc3RhdGUuZXJyb3IgPyAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUnPnt0aGlzLnN0YXRlLmVycm9yfTwvcD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZSc+RW50ZXIgdGhlIG5hbWUgYW5kIHBhc3N3b3JkIGZvciB5b3VyIGNoYW5uZWw8L3A+XG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlJz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1wcmltYXJ5JyBvbkNsaWNrPXt0aGlzLmxvZ2luVG9DaGFubmVsfT5BdXRoZW50aWNhdGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGFubmVsTG9naW5Gb3JtO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbExvZ2luRm9ybS92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAnY29tcG9uZW50cy9Qcm9ncmVzc0Jhcic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcblxuY2xhc3MgQ2hhbm5lbENyZWF0ZUZvcm0gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGVycm9yICAgOiBudWxsLFxuICAgICAgY2hhbm5lbCA6ICcnLFxuICAgICAgcGFzc3dvcmQ6ICcnLFxuICAgICAgc3RhdHVzICA6IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZUNoYW5uZWxJbnB1dCA9IHRoaXMuaGFuZGxlQ2hhbm5lbElucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVJbnB1dCA9IHRoaXMuaGFuZGxlSW5wdXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWwgPSB0aGlzLmNyZWF0ZUNoYW5uZWwuYmluZCh0aGlzKTtcbiAgfVxuICBjbGVhbnNlQ2hhbm5lbElucHV0IChpbnB1dCkge1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvXFxzKy9nLCAnLScpOyAvLyByZXBsYWNlIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTktXS9nLCAnJyk7ICAvLyByZW1vdmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEEtWiwgYS16LCAwLTksIG9yICctJ1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICBoYW5kbGVDaGFubmVsSW5wdXQgKGV2ZW50KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHZhbHVlID0gdGhpcy5jbGVhbnNlQ2hhbm5lbElucHV0KHZhbHVlKTtcbiAgICB0aGlzLnNldFN0YXRlKHtjaGFubmVsOiB2YWx1ZX0pO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGVJc0NoYW5uZWxBdmFpbGFibGUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtlcnJvcjogJ1BsZWFzZSBlbnRlciBhIGNoYW5uZWwgbmFtZSd9KTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlSW5wdXQgKGV2ZW50KSB7XG4gICAgY29uc3QgbmFtZSA9IGV2ZW50LnRhcmdldC5uYW1lO1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1tuYW1lXTogdmFsdWV9KTtcbiAgfVxuICB1cGRhdGVJc0NoYW5uZWxBdmFpbGFibGUgKGNoYW5uZWwpIHtcbiAgICBjb25zdCBjaGFubmVsV2l0aEF0U3ltYm9sID0gYEAke2NoYW5uZWx9YDtcbiAgICByZXF1ZXN0KGAvYXBpL2NoYW5uZWwvYXZhaWxhYmlsaXR5LyR7Y2hhbm5lbFdpdGhBdFN5bWJvbH1gKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBudWxsfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICB9KTtcbiAgfVxuICBjaGVja0lzQ2hhbm5lbEF2YWlsYWJsZSAoY2hhbm5lbCkge1xuICAgIGNvbnN0IGNoYW5uZWxXaXRoQXRTeW1ib2wgPSBgQCR7Y2hhbm5lbH1gO1xuICAgIHJldHVybiByZXF1ZXN0KGAvYXBpL2NoYW5uZWwvYXZhaWxhYmlsaXR5LyR7Y2hhbm5lbFdpdGhBdFN5bWJvbH1gKTtcbiAgfVxuICBjaGVja0lzUGFzc3dvcmRQcm92aWRlZCAocGFzc3dvcmQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFwYXNzd29yZCB8fCBwYXNzd29yZC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIHBhc3N3b3JkJykpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG4gIG1ha2VQdWJsaXNoQ2hhbm5lbFJlcXVlc3QgKHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG1ldGhvZCA6ICdQT1NUJyxcbiAgICAgIGJvZHkgICA6IEpTT04uc3RyaW5naWZ5KHt1c2VybmFtZSwgcGFzc3dvcmR9KSxcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0pLFxuICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXF1ZXN0KCcvc2lnbnVwJywgcGFyYW1zKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5mb3J0dW5hdGVseSwgd2UgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hpbGUgY3JlYXRpbmcgeW91ciBjaGFubmVsLiBQbGVhc2UgbGV0IHVzIGtub3cgaW4gRGlzY29yZCEgJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgY3JlYXRlQ2hhbm5lbCAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY2hlY2tJc1Bhc3N3b3JkUHJvdmlkZWQodGhpcy5zdGF0ZS5wYXNzd29yZClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tJc0NoYW5uZWxBdmFpbGFibGUodGhpcy5zdGF0ZS5jaGFubmVsKTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3N0YXR1czogJ1dlIGFyZSBwdWJsaXNoaW5nIHlvdXIgbmV3IGNoYW5uZWwuICBTaXQgdGlnaHQuLi4nfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VQdWJsaXNoQ2hhbm5lbFJlcXVlc3QodGhpcy5zdGF0ZS5jaGFubmVsLCB0aGlzLnN0YXRlLnBhc3N3b3JkKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtzdGF0dXM6IG51bGx9KTtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dpbihyZXN1bHQuY2hhbm5lbE5hbWUsIHJlc3VsdC5zaG9ydENoYW5uZWxJZCwgcmVzdWx0LmNoYW5uZWxDbGFpbUlkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7J2Vycm9yJzogZXJyb3IubWVzc2FnZSwgc3RhdHVzOiBudWxsfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7J2Vycm9yJzogZXJyb3IsIHN0YXR1czogbnVsbH0pO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgeyAhdGhpcy5zdGF0ZS5zdGF0dXMgPyAoXG4gICAgICAgICAgPGZvcm0gaWQ9J3B1Ymxpc2gtY2hhbm5lbC1mb3JtJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlIHJvdy0tc2hvcnQnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMyBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwnIGh0bWxGb3I9J25ldy1jaGFubmVsLW5hbWUnPk5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTYgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC10ZXh0LS1wcmltYXJ5IGZsZXgtY29udGFpbmVyLS1yb3cgZmxleC1jb250YWluZXItLWxlZnQtYm90dG9tIHNwYW4tLXJlbGF0aXZlJz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nY2hhbm5lbCcgaWQ9J25ldy1jaGFubmVsLW5hbWUnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCcgcGxhY2Vob2xkZXI9J2V4YW1wbGVDaGFubmVsTmFtZScgdmFsdWU9e3RoaXMuc3RhdGUuY2hhbm5lbH0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbm5lbElucHV0fSAvPlxuICAgICAgICAgICAgICAgICAgeyAodGhpcy5zdGF0ZS5jaGFubmVsICYmICF0aGlzLnN0YXRlLmVycm9yKSAmJiA8c3BhbiBpZD0naW5wdXQtc3VjY2Vzcy1jaGFubmVsLW5hbWUnIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1zdWNjZXNzIHNwYW4tLWFic29sdXRlJz57J1xcdTI3MTMnfTwvc3Bhbj4gfVxuICAgICAgICAgICAgICAgICAgeyB0aGlzLnN0YXRlLmVycm9yICYmIDxzcGFuIGlkPSdpbnB1dC1zdWNjZXNzLWNoYW5uZWwtbmFtZScgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUgc3Bhbi0tYWJzb2x1dGUnPnsnXFx1MjcxNid9PC9zcGFuPiB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0td2lkZSByb3ctLXNob3J0Jz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJyBodG1sRm9yPSduZXctY2hhbm5lbC1wYXNzd29yZCc+UGFzc3dvcmQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTYgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC10ZXh0LS1wcmltYXJ5Jz5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdwYXNzd29yZCcgbmFtZT0ncGFzc3dvcmQnIGlkPSduZXctY2hhbm5lbC1wYXNzd29yZCcgY2xhc3NOYW1lPSdpbnB1dC10ZXh0JyAgcGxhY2Vob2xkZXI9JycgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3dvcmR9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUlucHV0fSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge3RoaXMuc3RhdGUuZXJyb3IgPyAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1mYWlsdXJlJz57dGhpcy5zdGF0ZS5lcnJvcn08L3A+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZSc+Q2hvb3NlIGEgbmFtZSBhbmQgcGFzc3dvcmQgZm9yIHlvdXIgY2hhbm5lbDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0td2lkZSc+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnknIG9uQ2xpY2s9e3RoaXMuY3JlYXRlQ2hhbm5lbH0+Q3JlYXRlIENoYW5uZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdmaW5lLXByaW50Jz57dGhpcy5zdGF0ZS5zdGF0dXN9PC9wPlxuICAgICAgICAgICAgPFByb2dyZXNzQmFyIHNpemU9ezEyfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGFubmVsQ3JlYXRlRm9ybTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQWN0aXZlU3RhdHVzQmFyID0gKCkgPT4ge1xuICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPSdwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLS1hY3RpdmUnPnwgPC9zcGFuPjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFjdGl2ZVN0YXR1c0JhcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0FjdGl2ZVN0YXR1c0Jhci9pbmRleC5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5jb25zdCBJbmFjdGl2ZVN0YXR1c0JhciA9ICgpID0+IHtcbiAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT0ncHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci0taW5hY3RpdmUnPnwgPC9zcGFuPjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEluYWN0aXZlU3RhdHVzQmFyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvSW5hY3RpdmVTdGF0dXNCYXIvaW5kZXguanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge2NsZWFyRmlsZX0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIHN0YXR1cyA6IHB1Ymxpc2guc3RhdHVzLnN0YXR1cyxcbiAgICBtZXNzYWdlOiBwdWJsaXNoLnN0YXR1cy5tZXNzYWdlLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0ge1xuICBjbGVhckZpbGUsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hTdGF0dXMvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXInO1xuaW1wb3J0ICogYXMgcHVibGlzaFN0YXRlcyBmcm9tICdjb25zdGFudHMvcHVibGlzaF9jbGFpbV9zdGF0ZXMnO1xuXG5jbGFzcyBQdWJsaXNoU3RhdHVzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHN0YXR1cywgbWVzc2FnZSwgY2xlYXJGaWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uIGZsZXgtY29udGFpbmVyLS1jZW50ZXItY2VudGVyJz5cbiAgICAgICAge3N0YXR1cyA9PT0gcHVibGlzaFN0YXRlcy5MT0FEX1NUQVJUICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgYWxpZ24tY29udGVudC1jZW50ZXInPlxuICAgICAgICAgIDxwPkZpbGUgaXMgbG9hZGluZyB0byBzZXJ2ZXI8L3A+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlJz4wJTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAge3N0YXR1cyA9PT0gcHVibGlzaFN0YXRlcy5MT0FESU5HICYmXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgICA8cD5GaWxlIGlzIGxvYWRpbmcgdG8gc2VydmVyPC9wPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlJz57bWVzc2FnZX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHtzdGF0dXMgPT09IHB1Ymxpc2hTdGF0ZXMuUFVCTElTSElORyAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICA8cD5VcGxvYWQgY29tcGxldGUuICBZb3VyIGZpbGUgaXMgbm93IGJlaW5nIHB1Ymxpc2hlZCBvbiB0aGUgYmxvY2tjaGFpbi4uLjwvcD5cbiAgICAgICAgICA8UHJvZ3Jlc3NCYXIgc2l6ZT17MTJ9IC8+XG4gICAgICAgICAgPHA+Q3VyaW91cyB3aGF0IG1hZ2ljIGlzIGhhcHBlbmluZyBoZXJlPyA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9mYXEvd2hhdC1pcy1sYnJ5Jz5MZWFybiBtb3JlLjwvYT48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHtzdGF0dXMgPT09IHB1Ymxpc2hTdGF0ZXMuU1VDQ0VTUyAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICA8cD5Zb3VyIHB1Ymxpc2ggaXMgY29tcGxldGUhIFlvdSBhcmUgYmVpbmcgcmVkaXJlY3RlZCB0byBpdCBub3cuPC9wPlxuICAgICAgICAgIDxwPklmIHlvdSBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RlZCwgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj17bWVzc2FnZX0+Y2xpY2sgaGVyZS48L2E+PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7c3RhdHVzID09PSBwdWJsaXNoU3RhdGVzLkZBSUxFRCAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICA8cD5Tb21ldGhpbmcgd2VudCB3cm9uZy4uLjwvcD5cbiAgICAgICAgICA8cD48c3Ryb25nPnttZXNzYWdlfTwvc3Ryb25nPjwvcD5cbiAgICAgICAgICA8cD5Gb3IgaGVscCwgcG9zdCB0aGUgYWJvdmUgZXJyb3IgdGV4dCBpbiB0aGUgI3NwZWVjaCBjaGFubmVsIG9uIHRoZSA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9J2h0dHBzOi8vZGlzY29yZC5nZy9Zallid2hTJyB0YXJnZXQ9J19ibGFuayc+bGJyeSBkaXNjb3JkPC9hPjwvcD5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1zZWNvbmRhcnknIG9uQ2xpY2s9e2NsZWFyRmlsZX0+UmVzZXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hTdGF0dXM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoU3RhdHVzL3ZpZXcuanN4IiwiZXhwb3J0IGNvbnN0IExPQURfU1RBUlQgPSAnTE9BRF9TVEFSVCc7XG5leHBvcnQgY29uc3QgTE9BRElORyA9ICdMT0FESU5HJztcbmV4cG9ydCBjb25zdCBQVUJMSVNISU5HID0gJ1BVQkxJU0hJTkcnO1xuZXhwb3J0IGNvbnN0IFNVQ0NFU1MgPSAnU1VDQ0VTUyc7XG5leHBvcnQgY29uc3QgRkFJTEVEID0gJ0ZBSUxFRCc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29uc3RhbnRzL3B1Ymxpc2hfY2xhaW1fc3RhdGVzLmpzIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBwdWJsaXNoLmRpc2FibGVkTWVzc2FnZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5jbGFzcyBQdWJsaXNoRGlzYWJsZWRNZXNzYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5wcm9wcy5tZXNzYWdlO1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLnByb3BzLm1lc3NhZ2U6JywgbWVzc2FnZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgZHJvcHpvbmUtLWRpc2FibGVkIHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uIGZsZXgtY29udGFpbmVyLS1jZW50ZXItY2VudGVyJz5cbiAgICAgICAgPHAgY2xhc3NOYW1lPSd0ZXh0LS1kaXNhYmxlZCc+UHVibGlzaGluZyBpcyBjdXJyZW50bHkgZGlzYWJsZWQuPC9wPlxuICAgICAgICA8cCBjbGFzc05hbWU9J3RleHQtLWRpc2FibGVkJz57bWVzc2FnZX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hEaXNhYmxlZE1lc3NhZ2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoRGlzYWJsZWRNZXNzYWdlL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IFNFTyBmcm9tICdjb21wb25lbnRzL1NFTyc7XG5cbmNsYXNzIEFib3V0UGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxTRU8gcGFnZVRpdGxlPXsnQWJvdXQnfSBwYWdlVXJpPXsnYWJvdXQnfSAvPlxuICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tbWVkLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdwdWxsLXF1b3RlJz5TcGVlLmNoIGlzIGFuIG9wZW4tc291cmNlIHByb2plY3QuICBQbGVhc2UgY29udHJpYnV0ZSB0byB0aGUgZXhpc3Rpbmcgc2l0ZSwgb3IgZm9yayBpdCBhbmQgbWFrZSB5b3VyIG93bi48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vdHdpdHRlci5jb20vc3BlZV9jaCc+VFdJVFRFUjwvYT48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaCc+R0lUSFVCPC9hPjwvcD5cbiAgICAgICAgICAgICAgPHA+PGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnPkRJU0NPUkQgQ0hBTk5FTDwvYT48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaC9ibG9iL21hc3Rlci9SRUFETUUubWQnPkRPQ1VNRU5UQVRJT048L2E+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8cD5TcGVlLmNoIGlzIGEgbWVkaWEtaG9zdGluZyBzaXRlIHRoYXQgcmVhZHMgZnJvbSBhbmQgcHVibGlzaGVzIGNvbnRlbnQgdG8gdGhlIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9sYnJ5LmlvJz5MQlJZPC9hPiBibG9ja2NoYWluLjwvcD5cbiAgICAgICAgICAgICAgPHA+U3BlZS5jaCBpcyBhIGhvc3Rpbmcgc2VydmljZSwgYnV0IHdpdGggdGhlIGFkZGVkIGJlbmVmaXQgdGhhdCBpdCBzdG9yZXMgeW91ciBjb250ZW50IG9uIGEgZGVjZW50cmFsaXplZCBuZXR3b3JrIG9mIGNvbXB1dGVycyAtLSB0aGUgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2xicnkuaW8vZ2V0Jz5MQlJZPC9hPiBuZXR3b3JrLiAgVGhpcyBtZWFucyB0aGF0IHlvdXIgaW1hZ2VzIGFyZSBzdG9yZWQgaW4gbXVsdGlwbGUgbG9jYXRpb25zIHdpdGhvdXQgYSBzaW5nbGUgcG9pbnQgb2YgZmFpbHVyZS48L3A+XG4gICAgICAgICAgICAgIDxoMz5Db250cmlidXRlPC9oMz5cbiAgICAgICAgICAgICAgPHA+SWYgeW91IGhhdmUgYW4gaWRlYSBmb3IgeW91ciBvd24gc3BlZS5jaC1saWtlIHNpdGUgb24gdG9wIG9mIExCUlksIGZvcmsgb3VyIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2xicnlpby9zcGVlLmNoJz5naXRodWIgcmVwbzwvYT4gYW5kIGdvIHRvIHRvd24hPC9wPlxuICAgICAgICAgICAgICA8cD5JZiB5b3Ugd2FudCB0byBpbXByb3ZlIHNwZWUuY2gsIGpvaW4gb3VyIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnPmRpc2NvcmQgY2hhbm5lbDwvYT4gb3Igc29sdmUgb25lIG9mIG91ciA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaC9pc3N1ZXMnPmdpdGh1YiBpc3N1ZXM8L2E+LjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFib3V0UGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9BYm91dFBhZ2UvaW5kZXguanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBjaGFubmVsIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBsb2dnZWRJbkNoYW5uZWxOYW1lOiBjaGFubmVsLmxvZ2dlZEluQ2hhbm5lbC5uYW1lLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3BhZ2VzL0xvZ2luUGFnZS9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB3aXRoUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgU0VPIGZyb20gJ2NvbXBvbmVudHMvU0VPJztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IENoYW5uZWxMb2dpbkZvcm0gZnJvbSAnY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtJztcbmltcG9ydCBDaGFubmVsQ3JlYXRlRm9ybSBmcm9tICdjb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtJztcblxuY2xhc3MgTG9naW5QYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV3UHJvcHMpIHtcbiAgICAvLyByZS1yb3V0ZSB0aGUgdXNlciB0byB0aGUgaG9tZXBhZ2UgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluXG4gICAgaWYgKG5ld1Byb3BzLmxvZ2dlZEluQ2hhbm5lbE5hbWUgIT09IHRoaXMucHJvcHMubG9nZ2VkSW5DaGFubmVsTmFtZSkge1xuICAgICAgdGhpcy5wcm9wcy5oaXN0b3J5LnB1c2goYC9gKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPFNFTyBwYWdlVGl0bGU9eydMb2dpbid9IHBhZ2VVcmk9eydsb2dpbid9IC8+XG4gICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8cD5DaGFubmVscyBhbGxvdyB5b3UgdG8gcHVibGlzaCBhbmQgZ3JvdXAgY29udGVudCB1bmRlciBhbiBpZGVudGl0eS4gWW91IGNhbiBjcmVhdGUgYSBjaGFubmVsIGZvciB5b3Vyc2VsZiwgb3Igc2hhcmUgb25lIHdpdGggbGlrZS1taW5kZWQgZnJpZW5kcy4gIFlvdSBjYW4gY3JlYXRlIDEgY2hhbm5lbCwgb3IgMTAwLCBzbyB3aGV0aGVyIHlvdSdyZSA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPScvQGNhdGFsb25pYTIwMTc6NDNkY2Y0NzE2M2NhYTIxZDg0MDRkOWZlOWIzMGY3OGVmM2UxNDZhOCc+ZG9jdW1lbnRpbmcgaW1wb3J0YW50IGV2ZW50czwvYT4sIG9yIG1ha2luZyBhIHB1YmxpYyByZXBvc2l0b3J5IGZvciA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPScvQGNhdEdpZnMnPmNhdCBnaWZzPC9hPiAocGFzc3dvcmQ6ICcxMjM0JyksIHRyeSBjcmVhdGluZyBhIGNoYW5uZWwgZm9yIGl0ITwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tbWVkLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT0naDMtLW5vLWJvdHRvbSc+TG9nIGluIHRvIGFuIGV4aXN0aW5nIGNoYW5uZWw6PC9oMz5cbiAgICAgICAgICAgICAgPENoYW5uZWxMb2dpbkZvcm0gLz5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT0naDMtLW5vLWJvdHRvbSc+Q3JlYXRlIGEgYnJhbmQgbmV3IGNoYW5uZWw6PC9oMz5cbiAgICAgICAgICAgICAgPENoYW5uZWxDcmVhdGVGb3JtIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKExvZ2luUGFnZSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcGFnZXMvTG9naW5QYWdlL3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IG9uSGFuZGxlU2hvd1BhZ2VVcmkgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZXJyb3IgICAgICA6IHNob3cucmVxdWVzdC5lcnJvcixcbiAgICByZXF1ZXN0VHlwZTogc2hvdy5yZXF1ZXN0LnR5cGUsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSB7XG4gIG9uSGFuZGxlU2hvd1BhZ2VVcmksXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9TaG93UGFnZS9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXJyb3JQYWdlIGZyb20gJ3BhZ2VzL0Vycm9yUGFnZSc7XG5pbXBvcnQgU2hvd0Fzc2V0TGl0ZSBmcm9tICdjb250YWluZXJzL1Nob3dBc3NldExpdGUnO1xuaW1wb3J0IFNob3dBc3NldERldGFpbHMgZnJvbSAnY29udGFpbmVycy9TaG93QXNzZXREZXRhaWxzJztcbmltcG9ydCBTaG93Q2hhbm5lbCBmcm9tICdjb250YWluZXJzL1Nob3dDaGFubmVsJztcblxuaW1wb3J0IHsgQ0hBTk5FTCwgQVNTRVRfTElURSwgQVNTRVRfREVUQUlMUyB9IGZyb20gJ2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMnO1xuXG5jbGFzcyBTaG93UGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLnByb3BzLm9uSGFuZGxlU2hvd1BhZ2VVcmkodGhpcy5wcm9wcy5tYXRjaC5wYXJhbXMpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG5leHRQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMubWF0Y2gucGFyYW1zICE9PSB0aGlzLnByb3BzLm1hdGNoLnBhcmFtcykge1xuICAgICAgdGhpcy5wcm9wcy5vbkhhbmRsZVNob3dQYWdlVXJpKG5leHRQcm9wcy5tYXRjaC5wYXJhbXMpO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZXJyb3IsIHJlcXVlc3RUeXBlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEVycm9yUGFnZSBlcnJvcj17ZXJyb3J9IC8+XG4gICAgICApO1xuICAgIH1cbiAgICBzd2l0Y2ggKHJlcXVlc3RUeXBlKSB7XG4gICAgICBjYXNlIENIQU5ORUw6XG4gICAgICAgIHJldHVybiA8U2hvd0NoYW5uZWwgLz47XG4gICAgICBjYXNlIEFTU0VUX0xJVEU6XG4gICAgICAgIHJldHVybiA8U2hvd0Fzc2V0TGl0ZSAvPjtcbiAgICAgIGNhc2UgQVNTRVRfREVUQUlMUzpcbiAgICAgICAgcmV0dXJuIDxTaG93QXNzZXREZXRhaWxzIC8+O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDxwPmxvYWRpbmcuLi48L3A+O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2hvd1BhZ2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcGFnZXMvU2hvd1BhZ2Uvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCByZXF1ZXN0IGluZm9cbiAgY29uc3QgcmVxdWVzdElkID0gc2hvdy5yZXF1ZXN0LmlkO1xuICAvLyBzZWxlY3QgYXNzZXQgaW5mb1xuICBsZXQgYXNzZXQ7XG4gIGNvbnN0IHJlcXVlc3QgPSBzaG93LnJlcXVlc3RMaXN0W3JlcXVlc3RJZF0gfHwgbnVsbDtcbiAgY29uc3QgYXNzZXRMaXN0ID0gc2hvdy5hc3NldExpc3Q7XG4gIGlmIChyZXF1ZXN0ICYmIGFzc2V0TGlzdCkge1xuICAgIGNvbnN0IGFzc2V0S2V5ID0gcmVxdWVzdC5rZXk7ICAvLyBub3RlOiBqdXN0IHN0b3JlIHRoaXMgaW4gdGhlIHJlcXVlc3RcbiAgICBhc3NldCA9IGFzc2V0TGlzdFthc3NldEtleV0gfHwgbnVsbDtcbiAgfTtcbiAgLy8gcmV0dXJuIHByb3BzXG4gIHJldHVybiB7XG4gICAgYXNzZXQsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9TaG93QXNzZXRMaXRlL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IEFzc2V0RGlzcGxheSBmcm9tICdjb250YWluZXJzL0Fzc2V0RGlzcGxheSc7XG5cbmNsYXNzIFNob3dMaXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGFzc2V0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChhc3NldCkge1xuICAgICAgY29uc3QgeyBuYW1lLCBjbGFpbUlkIH0gPSBhc3NldC5jbGFpbURhdGE7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uIGZsZXgtY29udGFpbmVyLS1jZW50ZXItY2VudGVyIHNob3ctbGl0ZS1jb250YWluZXInPlxuICAgICAgICAgIDxTRU8gcGFnZVRpdGxlPXtuYW1lfSBhc3NldD17YXNzZXR9IC8+XG4gICAgICAgICAgPEFzc2V0RGlzcGxheSAvPlxuICAgICAgICAgIDxMaW5rIGlkPSdhc3NldC1ib2lsZXJwYXRlJyBjbGFzc05hbWU9J2xpbmstLXByaW1hcnkgZmluZS1wcmludCcgdG89e2AvJHtjbGFpbUlkfS8ke25hbWV9YH0+aG9zdGVkXG4gICAgICAgICAgICB2aWEgU3BlZS5jaDwvTGluaz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQgZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlcic+XG4gICAgICAgIDxwPmxvYWRpbmcgYXNzZXQgZGF0YS4uLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dMaXRlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0TGl0ZS92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAnY29tcG9uZW50cy9Qcm9ncmVzc0Jhcic7XG5pbXBvcnQgeyBMT0NBTF9DSEVDSywgVU5BVkFJTEFCTEUsIEVSUk9SLCBBVkFJTEFCTEUgfSBmcm9tICdjb25zdGFudHMvYXNzZXRfZGlzcGxheV9zdGF0ZXMnO1xuXG5jbGFzcyBBc3NldERpc3BsYXkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgeyBhc3NldDogeyBjbGFpbURhdGE6IHsgbmFtZSwgY2xhaW1JZCB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5wcm9wcy5vbkZpbGVSZXF1ZXN0KG5hbWUsIGNsYWltSWQpO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBzdGF0dXMsIGVycm9yLCBhc3NldDogeyBjbGFpbURhdGE6IHsgbmFtZSwgY2xhaW1JZCwgY29udGVudFR5cGUsIGZpbGVFeHQsIHRodW1ibmFpbCB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9J2Fzc2V0LWRpc3BsYXktY29tcG9uZW50Jz5cbiAgICAgICAgeyhzdGF0dXMgPT09IExPQ0FMX0NIRUNLKSAmJlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxwPkNoZWNraW5nIHRvIHNlZSBpZiBTcGVlLmNoIGhhcyB5b3VyIGFzc2V0IGxvY2FsbHkuLi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHsoc3RhdHVzID09PSBVTkFWQUlMQUJMRSkgJiZcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD5TaXQgdGlnaHQsIHdlJ3JlIHNlYXJjaGluZyB0aGUgTEJSWSBibG9ja2NoYWluIGZvciB5b3VyIGFzc2V0ITwvcD5cbiAgICAgICAgICA8UHJvZ3Jlc3NCYXIgc2l6ZT17MTJ9IC8+XG4gICAgICAgICAgPHA+Q3VyaW91cyB3aGF0IG1hZ2ljIGlzIGhhcHBlbmluZyBoZXJlPyA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9mYXEvd2hhdC1pcy1sYnJ5Jz5MZWFybiBtb3JlLjwvYT48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHsoc3RhdHVzID09PSBFUlJPUikgJiZcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD5VbmZvcnR1bmF0ZWx5LCB3ZSBjb3VsZG4ndCBkb3dubG9hZCB5b3VyIGFzc2V0IGZyb20gTEJSWS4gIFlvdSBjYW4gaGVscCB1cyBvdXQgYnkgc2hhcmluZyB0aGUgYmVsb3cgZXJyb3IgbWVzc2FnZSBpbiB0aGUgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2Rpc2NvcmQuZ2cvWWpZYndoUycgdGFyZ2V0PSdfYmxhbmsnPkxCUlkgZGlzY29yZDwvYT4uPC9wPlxuICAgICAgICAgIDxpPjxwIGlkPSdlcnJvci1tZXNzYWdlJz57ZXJyb3J9PC9wPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgeyhzdGF0dXMgPT09IEFWQUlMQUJMRSkgJiZcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nYXNzZXQnXG4gICAgICAgICAgICAgICAgICBzcmM9e2AvJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfVxuICAgICAgICAgICAgICAgICAgYWx0PXtuYW1lfSAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Fzc2V0J1xuICAgICAgICAgICAgICAgICAgc3JjPXtgLyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH1cbiAgICAgICAgICAgICAgICAgIGFsdD17bmFtZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSAndmlkZW8vbXA0JzpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8dmlkZW8gY2xhc3NOYW1lPSdhc3NldCB2aWRlbycgY29udHJvbHMgcG9zdGVyPXt0aHVtYm5haWx9PlxuICAgICAgICAgICAgICAgICAgPHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICBzcmM9e2AvJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxwPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8Y29kZT52aWRlbzwvY29kZT4gZWxlbWVudC48L3A+XG4gICAgICAgICAgICAgICAgPC92aWRlbz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHA+VW5zdXBwb3J0ZWQgZmlsZSB0eXBlPC9wPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBc3NldERpc3BsYXk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldERpc3BsYXkvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCByZXF1ZXN0IGluZm9cbiAgY29uc3QgcmVxdWVzdElkID0gc2hvdy5yZXF1ZXN0LmlkO1xuICAvLyBzZWxlY3QgYXNzZXQgaW5mb1xuICBsZXQgYXNzZXQ7XG4gIGNvbnN0IHJlcXVlc3QgPSBzaG93LnJlcXVlc3RMaXN0W3JlcXVlc3RJZF0gfHwgbnVsbDtcbiAgY29uc3QgYXNzZXRMaXN0ID0gc2hvdy5hc3NldExpc3Q7XG4gIGlmIChyZXF1ZXN0ICYmIGFzc2V0TGlzdCkge1xuICAgIGNvbnN0IGFzc2V0S2V5ID0gcmVxdWVzdC5rZXk7ICAvLyBub3RlOiBqdXN0IHN0b3JlIHRoaXMgaW4gdGhlIHJlcXVlc3RcbiAgICBhc3NldCA9IGFzc2V0TGlzdFthc3NldEtleV0gfHwgbnVsbDtcbiAgfTtcbiAgLy8gcmV0dXJuIHByb3BzXG4gIHJldHVybiB7XG4gICAgYXNzZXQsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9TaG93QXNzZXREZXRhaWxzL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgRXJyb3JQYWdlIGZyb20gJ3BhZ2VzL0Vycm9yUGFnZSc7XG5pbXBvcnQgQXNzZXRUaXRsZSBmcm9tICdjb250YWluZXJzL0Fzc2V0VGl0bGUnO1xuaW1wb3J0IEFzc2V0RGlzcGxheSBmcm9tICdjb250YWluZXJzL0Fzc2V0RGlzcGxheSc7XG5pbXBvcnQgQXNzZXRJbmZvIGZyb20gJ2NvbnRhaW5lcnMvQXNzZXRJbmZvJztcblxuY2xhc3MgU2hvd0Fzc2V0RGV0YWlscyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBhc3NldCB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoYXNzZXQpIHtcbiAgICAgIGNvbnN0IHsgY2xhaW1EYXRhOiB7IG5hbWUgfSB9ID0gYXNzZXQ7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxTRU8gcGFnZVRpdGxlPXtgJHtuYW1lfSAtIGRldGFpbHNgfSBhc3NldD17YXNzZXR9IC8+XG4gICAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS10YWxsIHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xMCc+XG4gICAgICAgICAgICAgIDxBc3NldFRpdGxlIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tc21sLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCBzaG93LWRldGFpbHMtY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8QXNzZXREaXNwbGF5IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1zbWwtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICAgICAgICA8QXNzZXRJbmZvIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JQYWdlIGVycm9yPXsnbG9hZGluZyBhc3NldCBkYXRhLi4uJ30gLz5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTaG93QXNzZXREZXRhaWxzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0RGV0YWlscy92aWV3LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHsgc2VsZWN0QXNzZXQgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICBjb25zdCB7IGNsYWltRGF0YTogeyB0aXRsZSB9IH0gPSBzZWxlY3RBc3NldChzaG93KTtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0Fzc2V0VGl0bGUvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5jb25zdCBBc3NldFRpdGxlID0gKHsgdGl0bGUgfSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXY+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQtLWxhcmdlJz57dGl0bGV9PC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXNzZXRUaXRsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0Fzc2V0VGl0bGUvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IHNlbGVjdEFzc2V0IH0gZnJvbSAnc2VsZWN0b3JzL3Nob3cnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgLy8gc2VsZWN0IGFzc2V0XG4gIGNvbnN0IGFzc2V0ID0gc2VsZWN0QXNzZXQoc2hvdyk7XG4gIC8vICByZXR1cm4gcHJvcHNcbiAgcmV0dXJuIHtcbiAgICBhc3NldCxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0Fzc2V0SW5mby9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5cbmNsYXNzIEFzc2V0SW5mbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmNvcHlUb0NsaXBib2FyZCA9IHRoaXMuY29weVRvQ2xpcGJvYXJkLmJpbmQodGhpcyk7XG4gIH1cbiAgY29weVRvQ2xpcGJvYXJkIChldmVudCkge1xuICAgIHZhciBlbGVtZW50VG9Db3B5ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuZWxlbWVudHRvY29weTtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb0NvcHkpO1xuICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtlcnJvcjogJ09vcHMsIHVuYWJsZSB0byBjb3B5J30pO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgYXNzZXQ6IHsgc2hvcnRJZCwgY2xhaW1EYXRhIDogeyBjaGFubmVsTmFtZSwgY2VydGlmaWNhdGVJZCwgZGVzY3JpcHRpb24sIG5hbWUsIGNsYWltSWQsIGZpbGVFeHQsIGNvbnRlbnRUeXBlLCB0aHVtYm5haWwsIGhvc3QgfSB9IH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICB7Y2hhbm5lbE5hbWUgJiZcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLXdpZGUgcm93LS1uby10b3AnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0yIGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+Q2hhbm5lbDo8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0Jz48TGluayB0bz17YC8ke2NoYW5uZWxOYW1lfToke2NlcnRpZmljYXRlSWR9YH0+e2NoYW5uZWxOYW1lfTwvTGluaz48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAge2Rlc2NyaXB0aW9uICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS13aWRlIHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPntkZXNjcmlwdGlvbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBpZD0nc2hvdy1zaGFyZS1idXR0b25zJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0td2lkZSByb3ctLW5vLXRvcCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMiBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+U2hhcmU6PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3JvdyByb3ctLXNob3J0IHJvdy0td2lkZSBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWJvdHRvbSBmbGV4LWNvbnRhaW5lci0td3JhcCc+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj17YGh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3RleHQ9JHtob3N0fS8ke3Nob3J0SWR9LyR7bmFtZX1gfT50d2l0dGVyPC9hPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9e2BodHRwczovL3d3dy5mYWNlYm9vay5jb20vc2hhcmVyL3NoYXJlci5waHA/dT0ke2hvc3R9LyR7c2hvcnRJZH0vJHtuYW1lfWB9PmZhY2Vib29rPC9hPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9e2BodHRwOi8vdHVtYmxyLmNvbS93aWRnZXRzL3NoYXJlL3Rvb2w/Y2Fub25pY2FsVXJsPSR7aG9zdH0vJHtzaG9ydElkfS8ke25hbWV9YH0+dHVtYmxyPC9hPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9e2BodHRwczovL3d3dy5yZWRkaXQuY29tL3N1Ym1pdD91cmw9JHtob3N0fS8ke3Nob3J0SWR9LyR7bmFtZX0mdGl0bGU9JHtuYW1lfWB9PnJlZGRpdDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLXdpZGUgcm93LS1uby10b3AnPlxuICAgICAgICAgIDxkaXYgaWQ9J3Nob3ctc2hvcnQtbGluayc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMiBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+TGluazo8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXNob3J0IHJvdy0td2lkZSc+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcnPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2lucHV0LWVycm9yJyBpZD0naW5wdXQtZXJyb3ItY29weS1zaG9ydC1saW5rJyBoaWRkZW49J3RydWUnPmVycm9yIGhlcmU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nc2hvcnQtbGluaycgY2xhc3NOYW1lPSdpbnB1dC1kaXNhYmxlZCBpbnB1dC10ZXh0LS1mdWxsLXdpZHRoJyByZWFkT25seVxuICAgICAgICAgICAgICAgICAgICBzcGVsbENoZWNrPSdmYWxzZSdcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Ake2hvc3R9LyR7c2hvcnRJZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zZWxlY3R9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEnIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTInPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9J2J1dHRvbi0tcHJpbWFyeSBidXR0b24tLXdpZGUnIGRhdGEtZWxlbWVudHRvY29weT0nc2hvcnQtbGluaydcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5jb3B5VG9DbGlwYm9hcmR9PmNvcHlcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD0nc2hvdy1lbWJlZC1jb2RlJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0yIGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0Jz5FbWJlZDo8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXNob3J0IHJvdy0td2lkZSc+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcnPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2lucHV0LWVycm9yJyBpZD0naW5wdXQtZXJyb3ItY29weS1lbWJlZC10ZXh0JyBoaWRkZW49J3RydWUnPmVycm9yIGhlcmU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIHsoY29udGVudFR5cGUgPT09ICd2aWRlby9tcDQnKSA/IChcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdlbWJlZC10ZXh0JyBjbGFzc05hbWU9J2lucHV0LWRpc2FibGVkIGlucHV0LXRleHQtLWZ1bGwtd2lkdGgnIHJlYWRPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zZWxlY3R9IHNwZWxsQ2hlY2s9J2ZhbHNlJ1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtgPHZpZGVvIHdpZHRoPVwiMTAwJVwiIGNvbnRyb2xzIHBvc3Rlcj1cIiR7dGh1bWJuYWlsfVwiIHNyYz1cIiR7aG9zdH0vJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1cIi8+PC92aWRlbz5gfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdlbWJlZC10ZXh0JyBjbGFzc05hbWU9J2lucHV0LWRpc2FibGVkIGlucHV0LXRleHQtLWZ1bGwtd2lkdGgnIHJlYWRPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zZWxlY3R9IHNwZWxsQ2hlY2s9J2ZhbHNlJ1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtgPGltZyBzcmM9XCIke2hvc3R9LyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9XCIvPmB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xJyAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0yJz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnkgYnV0dG9uLS13aWRlJyBkYXRhLWVsZW1lbnR0b2NvcHk9J2VtYmVkLXRleHQnXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuY29weVRvQ2xpcGJvYXJkfT5jb3B5XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2ZsZXgtY29udGFpbmVyLS1yb3cgZmxleC1jb250YWluZXItLXNwYWNlLWJldHdlZW4tYm90dG9tJz5cbiAgICAgICAgICA8TGluayBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRvPXtgLyR7c2hvcnRJZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH0+PHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT0ndGV4dCc+RGlyZWN0IExpbms8L3NwYW4+PC9MaW5rPlxuICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj17YCR7aG9zdH0vJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfSBkb3dubG9hZD17bmFtZX0+RG93bmxvYWQ8L2E+XG4gICAgICAgICAgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9sYnJ5LmlvL2RtY2EnPlJlcG9ydDwvYT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFzc2V0SW5mbztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0Fzc2V0SW5mby92aWV3LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgLy8gc2VsZWN0IHJlcXVlc3QgaW5mb1xuICBjb25zdCByZXF1ZXN0SWQgPSBzaG93LnJlcXVlc3QuaWQ7XG4gIC8vIHNlbGVjdCByZXF1ZXN0XG4gIGNvbnN0IHByZXZpb3VzUmVxdWVzdCA9IHNob3cucmVxdWVzdExpc3RbcmVxdWVzdElkXSB8fCBudWxsO1xuICAvLyBzZWxlY3QgY2hhbm5lbFxuICBsZXQgY2hhbm5lbDtcbiAgaWYgKHByZXZpb3VzUmVxdWVzdCkge1xuICAgIGNvbnN0IGNoYW5uZWxLZXkgPSBwcmV2aW91c1JlcXVlc3Qua2V5O1xuICAgIGNoYW5uZWwgPSBzaG93LmNoYW5uZWxMaXN0W2NoYW5uZWxLZXldIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0NoYW5uZWwvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNFTyBmcm9tICdjb21wb25lbnRzL1NFTyc7XG5pbXBvcnQgRXJyb3JQYWdlIGZyb20gJ3BhZ2VzL0Vycm9yUGFnZSc7XG5pbXBvcnQgTmF2QmFyIGZyb20gJ2NvbnRhaW5lcnMvTmF2QmFyJztcbmltcG9ydCBDaGFubmVsQ2xhaW1zRGlzcGxheSBmcm9tICdjb250YWluZXJzL0NoYW5uZWxDbGFpbXNEaXNwbGF5JztcblxuY2xhc3MgU2hvd0NoYW5uZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgY2hhbm5lbCB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgY29uc3QgeyBuYW1lLCBsb25nSWQsIHNob3J0SWQgfSA9IGNoYW5uZWw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxTRU8gcGFnZVRpdGxlPXtuYW1lfSBjaGFubmVsPXtjaGFubmVsfSAvPlxuICAgICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMTAnPlxuICAgICAgICAgICAgICA8aDI+Y2hhbm5lbCBuYW1lOiB7bmFtZX08L2gyPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9eydmaW5lLXByaW50J30+ZnVsbCBjaGFubmVsIGlkOiB7bG9uZ0lkfTwvcD5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmluZS1wcmludCd9PnNob3J0IGNoYW5uZWwgaWQ6IHtzaG9ydElkfTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEwJz5cbiAgICAgICAgICAgICAgPENoYW5uZWxDbGFpbXNEaXNwbGF5IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxFcnJvclBhZ2UgZXJyb3I9eydsb2FkaW5nIGNoYW5uZWwgZGF0YS4uLid9IC8+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2hvd0NoYW5uZWw7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9TaG93Q2hhbm5lbC92aWV3LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBvblVwZGF0ZUNoYW5uZWxDbGFpbXMgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCBjaGFubmVsIGtleVxuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtzaG93LnJlcXVlc3QuaWRdO1xuICBjb25zdCBjaGFubmVsS2V5ID0gcmVxdWVzdC5rZXk7XG4gIC8vIHNlbGVjdCBjaGFubmVsIGNsYWltc1xuICBjb25zdCBjaGFubmVsID0gc2hvdy5jaGFubmVsTGlzdFtjaGFubmVsS2V5XSB8fCBudWxsO1xuICAvLyByZXR1cm4gcHJvcHNcbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsS2V5LFxuICAgIGNoYW5uZWwsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSB7XG4gIG9uVXBkYXRlQ2hhbm5lbENsYWltcyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENsYWltc0Rpc3BsYXkvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEFzc2V0UHJldmlldyBmcm9tICdjb21wb25lbnRzL0Fzc2V0UHJldmlldyc7XG5cbmNsYXNzIENoYW5uZWxDbGFpbXNEaXNwbGF5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc2hvd05leHRSZXN1bHRzUGFnZSA9IHRoaXMuc2hvd05leHRSZXN1bHRzUGFnZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2UgPSB0aGlzLnNob3dQcmV2aW91c1Jlc3VsdHNQYWdlLmJpbmQodGhpcyk7XG4gIH1cbiAgc2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2UgKCkge1xuICAgIGNvbnN0IHsgY2hhbm5lbDogeyBjbGFpbXNEYXRhOiB7IGN1cnJlbnRQYWdlIH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBwcmV2aW91c1BhZ2UgPSBwYXJzZUludChjdXJyZW50UGFnZSkgLSAxO1xuICAgIHRoaXMuc2hvd05ld1BhZ2UocHJldmlvdXNQYWdlKTtcbiAgfVxuICBzaG93TmV4dFJlc3VsdHNQYWdlICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWw6IHsgY2xhaW1zRGF0YTogeyBjdXJyZW50UGFnZSB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSBwYXJzZUludChjdXJyZW50UGFnZSkgKyAxO1xuICAgIHRoaXMuc2hvd05ld1BhZ2UobmV4dFBhZ2UpO1xuICB9XG4gIHNob3dOZXdQYWdlIChwYWdlKSB7XG4gICAgY29uc3QgeyBjaGFubmVsS2V5LCBjaGFubmVsOiB7IG5hbWUsIGxvbmdJZCB9IH0gPSB0aGlzLnByb3BzO1xuICAgIHRoaXMucHJvcHMub25VcGRhdGVDaGFubmVsQ2xhaW1zKGNoYW5uZWxLZXksIG5hbWUsIGxvbmdJZCwgcGFnZSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWw6IHsgY2xhaW1zRGF0YTogeyBjbGFpbXMsIGN1cnJlbnRQYWdlLCB0b3RhbFBhZ2VzIH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwnPlxuICAgICAgICB7KGNsYWltcy5sZW5ndGggPiAwKSA/IChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge2NsYWltcy5tYXAoKGNsYWltLCBpbmRleCkgPT4gPEFzc2V0UHJldmlld1xuICAgICAgICAgICAgICBjbGFpbURhdGE9e2NsYWltfVxuICAgICAgICAgICAgICBrZXk9e2Ake2NsYWltLm5hbWV9LSR7aW5kZXh9YH1cbiAgICAgICAgICAgIC8+KX1cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIHsoY3VycmVudFBhZ2UgPiAxKSAmJlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17J2J1dHRvbi0tc2Vjb25kYXJ5J30gb25DbGljaz17dGhpcy5zaG93UHJldmlvdXNSZXN1bHRzUGFnZX0+UHJldmlvdXMgUGFnZTwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHsoY3VycmVudFBhZ2UgPCB0b3RhbFBhZ2VzKSAmJlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17J2J1dHRvbi0tc2Vjb25kYXJ5J30gb25DbGljaz17dGhpcy5zaG93TmV4dFJlc3VsdHNQYWdlfT5OZXh0IFBhZ2U8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPHA+VGhlcmUgYXJlIG5vIGNsYWltcyBpbiB0aGlzIGNoYW5uZWw8L3A+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDaGFubmVsQ2xhaW1zRGlzcGxheTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxDbGFpbXNEaXNwbGF5L3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7c2l0ZToge2RlZmF1bHRzOiB7IGRlZmF1bHRUaHVtYm5haWwgfX19KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdFRodW1ibmFpbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0Fzc2V0UHJldmlldy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5cbmNvbnN0IEFzc2V0UHJldmlldyA9ICh7IGRlZmF1bHRUaHVtYm5haWwsIGNsYWltRGF0YTogeyBuYW1lLCBjbGFpbUlkLCBmaWxlRXh0LCBjb250ZW50VHlwZSwgdGh1bWJuYWlsIH0gfSkgPT4ge1xuICBjb25zdCBkaXJlY3RTb3VyY2VMaW5rID0gYCR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YDtcbiAgY29uc3Qgc2hvd1VybExpbmsgPSBgLyR7Y2xhaW1JZH0vJHtuYW1lfWA7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9J2Fzc2V0LWhvbGRlcic+XG4gICAgICA8TGluayB0bz17c2hvd1VybExpbmt9ID5cbiAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9qcGcnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2dpZic6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnYXNzZXQtcHJldmlldyd9XG4gICAgICAgICAgICAgICAgICBzcmM9e2RpcmVjdFNvdXJjZUxpbmt9XG4gICAgICAgICAgICAgICAgICBhbHQ9e25hbWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnYXNzZXQtcHJldmlldyB2aWRlbyd9XG4gICAgICAgICAgICAgICAgICBzcmM9e3RodW1ibmFpbCB8fCBkZWZhdWx0VGh1bWJuYWlsfVxuICAgICAgICAgICAgICAgICAgYWx0PXtuYW1lfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxwPnVuc3VwcG9ydGVkIGZpbGUgdHlwZTwvcD5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCl9XG4gICAgICA8L0xpbms+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBc3NldFByZXZpZXc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9Bc3NldFByZXZpZXcvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2l0ZTogeyBob3N0LCB0aXRsZSB9IH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBob3N0LFxuICAgIHRpdGxlLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvRm91ck9oRm91clBhZ2UvaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IEhlbG1ldCBmcm9tICdyZWFjdC1oZWxtZXQnO1xuXG5jbGFzcyBGb3VyT2hGb3JQYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7dGl0bGUsIGhvc3R9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPEhlbG1ldD5cbiAgICAgICAgICA8dGl0bGU+e3RpdGxlfSAtIDQwNDwvdGl0bGU+XG4gICAgICAgICAgPGxpbmsgcmVsPSdjYW5vbmljYWwnIGhyZWY9e2Ake2hvc3R9LzQwNGB9IC8+XG4gICAgICAgIDwvSGVsbWV0PlxuICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgIDxoMj40MDQ8L2gyPlxuICAgICAgICAgIDxwPlRoYXQgcGFnZSBkb2VzIG5vdCBleGlzdDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb3VyT2hGb3JQYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvRm91ck9oRm91clBhZ2Uvdmlldy5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IChoZWxtZXQsIGh0bWwsIHByZWxvYWRlZFN0YXRlKSA9PiB7XG4gIC8vIHRha2UgdGhlIGh0bWwgYW5kIHByZWxvYWRlZFN0YXRlIGFuZCByZXR1cm4gdGhlIGZ1bGwgcGFnZVxuICByZXR1cm4gYFxuICAgIDwhRE9DVFlQRSBodG1sPlxuICAgIDxodG1sIGxhbmc9XCJlblwiIHByZWZpeD1cIm9nOiBodHRwOi8vb2dwLm1lL25zIyBmYjogaHR0cDovL29ncC5tZS9ucy9mYiNcIj5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICAgICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEsIHVzZXItc2NhbGFibGU9bm9cIj5cbiAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9XCJYLVVBLUNvbXBhdGlibGVcIiBjb250ZW50PVwiaWU9ZWRnZVwiPlxuICAgICAgICAgICAgPCEtLWhlbG1ldC0tPlxuICAgICAgICAgICAgJHtoZWxtZXQudGl0bGUudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICR7aGVsbWV0Lm1ldGEudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICR7aGVsbWV0LmxpbmsudG9TdHJpbmcoKX1cbiAgICAgICAgICAgIDwhLS1zdHlsZSBzaGVldHMtLT5cbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiL2Fzc2V0cy9jc3MvcmVzZXQuY3NzXCIgdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi9hc3NldHMvY3NzL2dlbmVyYWwuY3NzXCIgdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi9hc3NldHMvY3NzL21lZGlhUXVlcmllcy5jc3NcIiB0eXBlPVwidGV4dC9jc3NcIj5cbiAgICAgICAgICAgIDwhLS1nb29nbGUgZm9udC0tPlxuICAgICAgICAgICAgPGxpbmsgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86MzAwXCIgcmVsPVwic3R5bGVzaGVldFwiPlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5IGlkPVwibWFpbi1ib2R5XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlYWN0LWFwcFwiIGNsYXNzPVwicm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uXCI+JHtodG1sfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICAgICAgIHdpbmRvdy5fX1BSRUxPQURFRF9TVEFURV9fID0gJHtKU09OLnN0cmluZ2lmeShwcmVsb2FkZWRTdGF0ZSkucmVwbGFjZSgvPC9nLCAnXFxcXFxcdTAwM2MnKX1cbiAgICAgICAgICAgIDwvc2NyaXB0PlxuICAgICAgICAgICAgPHNjcmlwdCBzcmM9XCIvYnVuZGxlL2J1bmRsZS5qc1wiPjwvc2NyaXB0PlxuICAgICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICBgO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL3JlbmRlckZ1bGxQYWdlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVkdXgtc2FnYVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlZHV4LXNhZ2FcIlxuLy8gbW9kdWxlIGlkID0gMTM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IGNhbGwsIHB1dCwgdGFrZUxhdGVzdCB9IGZyb20gJ3JlZHV4LXNhZ2EvZWZmZWN0cyc7XG5pbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9zaG93X2FjdGlvbl90eXBlcyc7XG5pbXBvcnQgeyBvblJlcXVlc3RFcnJvciwgb25OZXdDaGFubmVsUmVxdWVzdCwgb25OZXdBc3NldFJlcXVlc3QgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IHsgbmV3QXNzZXRSZXF1ZXN0IH0gZnJvbSAnc2FnYXMvc2hvd19hc3NldCc7XG5pbXBvcnQgeyBuZXdDaGFubmVsUmVxdWVzdCB9IGZyb20gJ3NhZ2FzL3Nob3dfY2hhbm5lbCc7XG5pbXBvcnQgbGJyeVVyaSBmcm9tICd1dGlscy9sYnJ5VXJpJztcblxuZnVuY3Rpb24gKiBwYXJzZUFuZFVwZGF0ZUlkZW50aWZpZXJBbmRDbGFpbSAobW9kaWZpZXIsIGNsYWltKSB7XG4gIC8vIHRoaXMgaXMgYSByZXF1ZXN0IGZvciBhbiBhc3NldFxuICAvLyBjbGFpbSB3aWxsIGJlIGFuIGFzc2V0IGNsYWltXG4gIC8vIHRoZSBpZGVudGlmaWVyIGNvdWxkIGJlIGEgY2hhbm5lbCBvciBhIGNsYWltIGlkXG4gIGxldCBpc0NoYW5uZWwsIGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgY2xhaW1JZCwgY2xhaW1OYW1lLCBleHRlbnNpb247XG4gIHRyeSB7XG4gICAgKHsgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltSWQgfSA9IGxicnlVcmkucGFyc2VJZGVudGlmaWVyKG1vZGlmaWVyKSk7XG4gICAgKHsgY2xhaW1OYW1lLCBleHRlbnNpb24gfSA9IGxicnlVcmkucGFyc2VDbGFpbShjbGFpbSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB5aWVsZCBwdXQob25SZXF1ZXN0RXJyb3IoZXJyb3IubWVzc2FnZSkpO1xuICB9XG4gIC8vIHRyaWdnZXIgYW4gbmV3IGFjdGlvbiB0byB1cGRhdGUgdGhlIHN0b3JlXG4gIGlmIChpc0NoYW5uZWwpIHtcbiAgICByZXR1cm4geWllbGQgY2FsbChuZXdBc3NldFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0KGNsYWltTmFtZSwgbnVsbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBleHRlbnNpb24pKTtcbiAgfTtcbiAgeWllbGQgY2FsbChuZXdBc3NldFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0KGNsYWltTmFtZSwgY2xhaW1JZCwgbnVsbCwgbnVsbCwgZXh0ZW5zaW9uKSk7XG59XG5mdW5jdGlvbiAqIHBhcnNlQW5kVXBkYXRlQ2xhaW1Pbmx5IChjbGFpbSkge1xuICAvLyB0aGlzIGNvdWxkIGJlIGEgcmVxdWVzdCBmb3IgYW4gYXNzZXQgb3IgYSBjaGFubmVsIHBhZ2VcbiAgLy8gY2xhaW0gY291bGQgYmUgYW4gYXNzZXQgY2xhaW0gb3IgYSBjaGFubmVsIGNsYWltXG4gIGxldCBpc0NoYW5uZWwsIGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZDtcbiAgdHJ5IHtcbiAgICAoeyBpc0NoYW5uZWwsIGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCB9ID0gbGJyeVVyaS5wYXJzZUlkZW50aWZpZXIoY2xhaW0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyB0cmlnZ2VyIGFuIG5ldyBhY3Rpb24gdG8gdXBkYXRlIHRoZSBzdG9yZVxuICAvLyByZXR1cm4gZWFybHkgaWYgdGhpcyByZXF1ZXN0IGlzIGZvciBhIGNoYW5uZWxcbiAgaWYgKGlzQ2hhbm5lbCkge1xuICAgIHJldHVybiB5aWVsZCBjYWxsKG5ld0NoYW5uZWxSZXF1ZXN0LCBvbk5ld0NoYW5uZWxSZXF1ZXN0KGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCkpO1xuICB9XG4gIC8vIGlmIG5vdCBmb3IgYSBjaGFubmVsLCBwYXJzZSB0aGUgY2xhaW0gcmVxdWVzdFxuICBsZXQgY2xhaW1OYW1lLCBleHRlbnNpb247XG4gIHRyeSB7XG4gICAgKHtjbGFpbU5hbWUsIGV4dGVuc2lvbn0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0oY2xhaW0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICB5aWVsZCBjYWxsKG5ld0Fzc2V0UmVxdWVzdCwgb25OZXdBc3NldFJlcXVlc3QoY2xhaW1OYW1lLCBudWxsLCBudWxsLCBudWxsLCBleHRlbnNpb24pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uICogaGFuZGxlU2hvd1BhZ2VVcmkgKGFjdGlvbikge1xuICBjb25zdCB7IGlkZW50aWZpZXIsIGNsYWltIH0gPSBhY3Rpb24uZGF0YTtcbiAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4geWllbGQgY2FsbChwYXJzZUFuZFVwZGF0ZUlkZW50aWZpZXJBbmRDbGFpbSwgaWRlbnRpZmllciwgY2xhaW0pO1xuICB9XG4gIHlpZWxkIGNhbGwocGFyc2VBbmRVcGRhdGVDbGFpbU9ubHksIGNsYWltKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiAqIHdhdGNoSGFuZGxlU2hvd1BhZ2VVcmkgKCkge1xuICB5aWVsZCB0YWtlTGF0ZXN0KGFjdGlvbnMuSEFORExFX1NIT1dfVVJJLCBoYW5kbGVTaG93UGFnZVVyaSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3NhZ2FzL3Nob3dfdXJpLmpzIiwiaW1wb3J0IHsgY2FsbCwgcHV0LCBzZWxlY3QsIHRha2VMYXRlc3QgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgYWRkUmVxdWVzdFRvUmVxdWVzdExpc3QsIG9uUmVxdWVzdEVycm9yLCBvblJlcXVlc3RVcGRhdGUsIGFkZEFzc2V0VG9Bc3NldExpc3QgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IHsgZ2V0TG9uZ0NsYWltSWQsIGdldFNob3J0SWQsIGdldENsYWltRGF0YSB9IGZyb20gJ2FwaS9hc3NldEFwaSc7XG5pbXBvcnQgeyBzZWxlY3RTaG93U3RhdGUgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5pbXBvcnQgeyBzZWxlY3RTaXRlSG9zdCB9IGZyb20gJ3NlbGVjdG9ycy9zaXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uICogbmV3QXNzZXRSZXF1ZXN0IChhY3Rpb24pIHtcbiAgY29uc3QgeyByZXF1ZXN0VHlwZSwgcmVxdWVzdElkLCBuYW1lLCBtb2RpZmllciB9ID0gYWN0aW9uLmRhdGE7XG4gIC8vIHB1dCBhbiBhY3Rpb24gdG8gdXBkYXRlIHRoZSByZXF1ZXN0IGluIHJlZHV4XG4gIHlpZWxkIHB1dChvblJlcXVlc3RVcGRhdGUocmVxdWVzdFR5cGUsIHJlcXVlc3RJZCkpO1xuICAvLyBpcyB0aGlzIGFuIGV4aXN0aW5nIHJlcXVlc3Q/XG4gIC8vIElmIHRoaXMgdXJpIGlzIGluIHRoZSByZXF1ZXN0IGxpc3QsIGl0J3MgYWxyZWFkeSBiZWVuIGZldGNoZWRcbiAgY29uc3Qgc3RhdGUgPSB5aWVsZCBzZWxlY3Qoc2VsZWN0U2hvd1N0YXRlKTtcbiAgY29uc3QgaG9zdCA9IHlpZWxkIHNlbGVjdChzZWxlY3RTaXRlSG9zdCk7XG4gIGlmIChzdGF0ZS5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZ2V0IGxvbmcgaWQgJiYgYWRkIHJlcXVlc3QgdG8gcmVxdWVzdCBsaXN0XG4gIGxldCBsb25nSWQ7XG4gIHRyeSB7XG4gICAgKHtkYXRhOiBsb25nSWR9ID0geWllbGQgY2FsbChnZXRMb25nQ2xhaW1JZCwgaG9zdCwgbmFtZSwgbW9kaWZpZXIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICBjb25zdCBhc3NldEtleSA9IGBhIyR7bmFtZX0jJHtsb25nSWR9YDtcbiAgeWllbGQgcHV0KGFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0KHJlcXVlc3RJZCwgbnVsbCwgYXNzZXRLZXkpKTtcbiAgLy8gaXMgdGhpcyBhbiBleGlzdGluZyBhc3NldD9cbiAgLy8gSWYgdGhpcyBhc3NldCBpcyBpbiB0aGUgYXNzZXQgbGlzdCwgaXQncyBhbHJlYWR5IGJlZW4gZmV0Y2hlZFxuICBpZiAoc3RhdGUuYXNzZXRMaXN0W2Fzc2V0S2V5XSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGdldCBzaG9ydCBJZFxuICBsZXQgc2hvcnRJZDtcbiAgdHJ5IHtcbiAgICAoe2RhdGE6IHNob3J0SWR9ID0geWllbGQgY2FsbChnZXRTaG9ydElkLCBob3N0LCBuYW1lLCBsb25nSWQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyBnZXQgYXNzZXQgY2xhaW0gZGF0YVxuICBsZXQgY2xhaW1EYXRhO1xuICB0cnkge1xuICAgICh7ZGF0YTogY2xhaW1EYXRhfSA9IHlpZWxkIGNhbGwoZ2V0Q2xhaW1EYXRhLCBob3N0LCBuYW1lLCBsb25nSWQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyBhZGQgYXNzZXQgdG8gYXNzZXQgbGlzdFxuICB5aWVsZCBwdXQoYWRkQXNzZXRUb0Fzc2V0TGlzdChhc3NldEtleSwgbnVsbCwgbmFtZSwgbG9uZ0lkLCBzaG9ydElkLCBjbGFpbURhdGEpKTtcbiAgLy8gY2xlYXIgYW55IGVycm9ycyBpbiByZXF1ZXN0IGVycm9yXG4gIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihudWxsKSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaE5ld0Fzc2V0UmVxdWVzdCAoKSB7XG4gIHlpZWxkIHRha2VMYXRlc3QoYWN0aW9ucy5BU1NFVF9SRVFVRVNUX05FVywgbmV3QXNzZXRSZXF1ZXN0KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvc2FnYXMvc2hvd19hc3NldC5qcyIsImltcG9ydCBSZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9uZ0NsYWltSWQgKGhvc3QsIG5hbWUsIG1vZGlmaWVyKSB7XG4gIGxldCBib2R5ID0ge307XG4gIC8vIGNyZWF0ZSByZXF1ZXN0IHBhcmFtc1xuICBpZiAobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXIuaWQpIHtcbiAgICAgIGJvZHlbJ2NsYWltSWQnXSA9IG1vZGlmaWVyLmlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBib2R5WydjaGFubmVsTmFtZSddID0gbW9kaWZpZXIuY2hhbm5lbC5uYW1lO1xuICAgICAgYm9keVsnY2hhbm5lbENsYWltSWQnXSA9IG1vZGlmaWVyLmNoYW5uZWwuaWQ7XG4gICAgfVxuICB9XG4gIGJvZHlbJ2NsYWltTmFtZSddID0gbmFtZTtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIG1ldGhvZCA6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5ICAgOiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgfTtcbiAgLy8gY3JlYXRlIHVybFxuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2xhaW0vbG9uZy1pZGA7XG4gIC8vIHJldHVybiB0aGUgcmVxdWVzdCBwcm9taXNlXG4gIHJldHVybiBSZXF1ZXN0KHVybCwgcGFyYW1zKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaG9ydElkIChob3N0LCBuYW1lLCBjbGFpbUlkKSB7XG4gIGNvbnN0IHVybCA9IGAke2hvc3R9L2FwaS9jbGFpbS9zaG9ydC1pZC8ke2NsYWltSWR9LyR7bmFtZX1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsYWltRGF0YSAoaG9zdCwgbmFtZSwgY2xhaW1JZCkge1xuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2xhaW0vZGF0YS8ke25hbWV9LyR7Y2xhaW1JZH1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hcGkvYXNzZXRBcGkuanMiLCJpbXBvcnQge2NhbGwsIHB1dCwgc2VsZWN0LCB0YWtlTGF0ZXN0fSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgYWRkTmV3Q2hhbm5lbFRvQ2hhbm5lbExpc3QsIGFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0LCBvblJlcXVlc3RFcnJvciwgb25SZXF1ZXN0VXBkYXRlLCB1cGRhdGVDaGFubmVsQ2xhaW1zIH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCB7IGdldENoYW5uZWxDbGFpbXMsIGdldENoYW5uZWxEYXRhIH0gZnJvbSAnYXBpL2NoYW5uZWxBcGknO1xuaW1wb3J0IHsgc2VsZWN0U2hvd1N0YXRlIH0gZnJvbSAnc2VsZWN0b3JzL3Nob3cnO1xuaW1wb3J0IHsgc2VsZWN0U2l0ZUhvc3QgfSBmcm9tICdzZWxlY3RvcnMvc2l0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiAqIG5ld0NoYW5uZWxSZXF1ZXN0IChhY3Rpb24pIHtcbiAgY29uc3QgeyByZXF1ZXN0VHlwZSwgcmVxdWVzdElkLCBjaGFubmVsTmFtZSwgY2hhbm5lbElkIH0gPSBhY3Rpb24uZGF0YTtcbiAgLy8gcHV0IGFuIGFjdGlvbiB0byB1cGRhdGUgdGhlIHJlcXVlc3QgaW4gcmVkdXhcbiAgeWllbGQgcHV0KG9uUmVxdWVzdFVwZGF0ZShyZXF1ZXN0VHlwZSwgcmVxdWVzdElkKSk7XG4gIC8vIGlzIHRoaXMgYW4gZXhpc3RpbmcgcmVxdWVzdD9cbiAgLy8gSWYgdGhpcyB1cmkgaXMgaW4gdGhlIHJlcXVlc3QgbGlzdCwgaXQncyBhbHJlYWR5IGJlZW4gZmV0Y2hlZFxuICBjb25zdCBzdGF0ZSA9IHlpZWxkIHNlbGVjdChzZWxlY3RTaG93U3RhdGUpO1xuICBjb25zdCBob3N0ID0geWllbGQgc2VsZWN0KHNlbGVjdFNpdGVIb3N0KTtcbiAgaWYgKHN0YXRlLnJlcXVlc3RMaXN0W3JlcXVlc3RJZF0pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBnZXQgY2hhbm5lbCBsb25nIGlkXG4gIGxldCBsb25nSWQsIHNob3J0SWQ7XG4gIHRyeSB7XG4gICAgKHsgZGF0YToge2xvbmdDaGFubmVsQ2xhaW1JZDogbG9uZ0lkLCBzaG9ydENoYW5uZWxDbGFpbUlkOiBzaG9ydElkfSB9ID0geWllbGQgY2FsbChnZXRDaGFubmVsRGF0YSwgaG9zdCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB5aWVsZCBwdXQob25SZXF1ZXN0RXJyb3IoZXJyb3IubWVzc2FnZSkpO1xuICB9XG4gIC8vIHN0b3JlIHRoZSByZXF1ZXN0IGluIHRoZSBjaGFubmVsIHJlcXVlc3RzIGxpc3RcbiAgY29uc3QgY2hhbm5lbEtleSA9IGBjIyR7Y2hhbm5lbE5hbWV9IyR7bG9uZ0lkfWA7XG4gIHlpZWxkIHB1dChhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0SWQsIG51bGwsIGNoYW5uZWxLZXkpKTtcbiAgLy8gaXMgdGhpcyBhbiBleGlzdGluZyBjaGFubmVsP1xuICAvLyBJZiB0aGlzIGNoYW5uZWwgaXMgaW4gdGhlIGNoYW5uZWwgbGlzdCwgaXQncyBhbHJlYWR5IGJlZW4gZmV0Y2hlZFxuICBpZiAoc3RhdGUuY2hhbm5lbExpc3RbY2hhbm5lbEtleV0pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBnZXQgY2hhbm5lbCBjbGFpbXMgZGF0YVxuICBsZXQgY2xhaW1zRGF0YTtcbiAgdHJ5IHtcbiAgICAoeyBkYXRhOiBjbGFpbXNEYXRhIH0gPSB5aWVsZCBjYWxsKGdldENoYW5uZWxDbGFpbXMsIGhvc3QsIGxvbmdJZCwgY2hhbm5lbE5hbWUsIDEpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyBzdG9yZSB0aGUgY2hhbm5lbCBkYXRhIGluIHRoZSBjaGFubmVsIGxpc3RcbiAgeWllbGQgcHV0KGFkZE5ld0NoYW5uZWxUb0NoYW5uZWxMaXN0KGNoYW5uZWxLZXksIGNoYW5uZWxOYW1lLCBzaG9ydElkLCBsb25nSWQsIGNsYWltc0RhdGEpKTtcbiAgLy8gY2xlYXIgYW55IHJlcXVlc3QgZXJyb3JzXG4gIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiAqIHdhdGNoTmV3Q2hhbm5lbFJlcXVlc3QgKCkge1xuICB5aWVsZCB0YWtlTGF0ZXN0KGFjdGlvbnMuQ0hBTk5FTF9SRVFVRVNUX05FVywgbmV3Q2hhbm5lbFJlcXVlc3QpO1xufTtcblxuZnVuY3Rpb24gKiBnZXROZXdDbGFpbXNBbmRVcGRhdGVDaGFubmVsIChhY3Rpb24pIHtcbiAgY29uc3QgeyBjaGFubmVsS2V5LCBuYW1lLCBsb25nSWQsIHBhZ2UgfSA9IGFjdGlvbi5kYXRhO1xuICBjb25zdCBob3N0ID0geWllbGQgc2VsZWN0KHNlbGVjdFNpdGVIb3N0KTtcbiAgbGV0IGNsYWltc0RhdGE7XG4gIHRyeSB7XG4gICAgKHsgZGF0YTogY2xhaW1zRGF0YSB9ID0geWllbGQgY2FsbChnZXRDaGFubmVsQ2xhaW1zLCBob3N0LCBsb25nSWQsIG5hbWUsIHBhZ2UpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICB5aWVsZCBwdXQodXBkYXRlQ2hhbm5lbENsYWltcyhjaGFubmVsS2V5LCBjbGFpbXNEYXRhKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiAqIHdhdGNoVXBkYXRlQ2hhbm5lbENsYWltcyAoKSB7XG4gIHlpZWxkIHRha2VMYXRlc3QoYWN0aW9ucy5DSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMsIGdldE5ld0NsYWltc0FuZFVwZGF0ZUNoYW5uZWwpO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3NhZ2FzL3Nob3dfY2hhbm5lbC5qcyIsImltcG9ydCBSZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbm5lbERhdGEgKGhvc3QsIGlkLCBuYW1lKSB7XG4gIGlmICghaWQpIGlkID0gJ25vbmUnO1xuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2hhbm5lbC9kYXRhLyR7bmFtZX0vJHtpZH1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxDbGFpbXMgKGhvc3QsIGxvbmdJZCwgbmFtZSwgcGFnZSkge1xuICBpZiAoIXBhZ2UpIHBhZ2UgPSAxO1xuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2hhbm5lbC9jbGFpbXMvJHtuYW1lfS8ke2xvbmdJZH0vJHtwYWdlfWA7XG4gIHJldHVybiBSZXF1ZXN0KHVybCk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2FwaS9jaGFubmVsQXBpLmpzIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFR0VYUF9JTlZBTElEX0NMQUlNICA6IC9bXkEtWmEtejAtOS1dL2csXG4gIFJFR0VYUF9JTlZBTElEX0NIQU5ORUw6IC9bXkEtWmEtejAtOS1AXS9nLFxuICBSRUdFWFBfQUREUkVTUyAgICAgICAgOiAvXmIoPz1bXjBPSWxdezMyLDMzfSlbMC05QS1aYS16XXszMiwzM30kLyxcbiAgQ0hBTk5FTF9DSEFSICAgICAgICAgIDogJ0AnLFxuICBwYXJzZUlkZW50aWZpZXIgICAgICAgOiBmdW5jdGlvbiAoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjL10qKScgKyAvLyB2YWx1ZSAoc3RvcHMgYXQgdGhlIGZpcnN0IHNlcGFyYXRvciBvciBlbmQpXG4gICAgICAnKFs6JCNdPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCB2YWx1ZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleCAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgLmV4ZWMoaWRlbnRpZmllcilcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBuYW1lXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIE5vIGNoYW5uZWwgbmFtZSBwcm92aWRlZCBiZWZvcmUgXCIke21vZGlmaWVyU2VwZXJhdG9yfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IGlzQ2hhbm5lbCA9IHZhbHVlLnN0YXJ0c1dpdGgobW9kdWxlLmV4cG9ydHMuQ0hBTk5FTF9DSEFSKTtcbiAgICBjb25zdCBjaGFubmVsTmFtZSA9IGlzQ2hhbm5lbCA/IHZhbHVlIDogbnVsbDtcbiAgICBsZXQgY2xhaW1JZDtcbiAgICBpZiAoaXNDaGFubmVsKSB7XG4gICAgICBpZiAoIWNoYW5uZWxOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBVUkwuICBObyBjaGFubmVsIG5hbWUgYWZ0ZXIgXCJAXCIuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBuYW1lQmFkQ2hhcnMgPSAoY2hhbm5lbE5hbWUpLm1hdGNoKG1vZHVsZS5leHBvcnRzLlJFR0VYUF9JTlZBTElEX0NIQU5ORUwpO1xuICAgICAgaWYgKG5hbWVCYWRDaGFycykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNoYW5uZWwgbmFtZTogXCIke25hbWVCYWRDaGFycy5qb2luKCcsICcpfVwiLmApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjbGFpbUlkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbW9kaWZpZXJcbiAgICBsZXQgY2hhbm5lbENsYWltSWQ7XG4gICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yKSB7XG4gICAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBObyBtb2RpZmllciBwcm92aWRlZCBhZnRlciBzZXBhcmF0b3IgXCIke21vZGlmaWVyU2VwZXJhdG9yfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RpZmllclNlcGVyYXRvciA9PT0gJzonKSB7XG4gICAgICAgIGNoYW5uZWxDbGFpbUlkID0gbW9kaWZpZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgVGhlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cIiBtb2RpZmllciBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaXNDaGFubmVsLFxuICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICBjaGFubmVsQ2xhaW1JZDogY2hhbm5lbENsYWltSWQgfHwgbnVsbCxcbiAgICAgIGNsYWltSWQgICAgICAgOiBjbGFpbUlkIHx8IG51bGwsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VDbGFpbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy8uXSopJyArIC8vIG5hbWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBleHRlbnNpb24pXG4gICAgICAnKFs6JCMuXT8pKFteL10qKScgLy8gZXh0ZW5zaW9uIHNlcGFyYXRvciwgZXh0ZW5zaW9uIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCBjbGFpbU5hbWUsIGV4dGVuc2lvblNlcGVyYXRvciwgZXh0ZW5zaW9uXSA9IGNvbXBvbmVudHNSZWdleCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAuZXhlYyhuYW1lKVxuICAgICAgLm1hcChtYXRjaCA9PiBtYXRjaCB8fCBudWxsKTtcblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG5hbWVcbiAgICBpZiAoIWNsYWltTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGVjayB5b3VyIFVSTC4gIE5vIGNsYWltIG5hbWUgcHJvdmlkZWQgYmVmb3JlIFwiLlwiJyk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWVCYWRDaGFycyA9IChjbGFpbU5hbWUpLm1hdGNoKG1vZHVsZS5leHBvcnRzLlJFR0VYUF9JTlZBTElEX0NMQUlNKTtcbiAgICBpZiAobmFtZUJhZENoYXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNsYWltIG5hbWU6IFwiJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX1cIi5gKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgZXh0ZW5zaW9uXG4gICAgaWYgKGV4dGVuc2lvblNlcGVyYXRvcikge1xuICAgICAgaWYgKCFleHRlbnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIE5vIGZpbGUgZXh0ZW5zaW9uIHByb3ZpZGVkIGFmdGVyIHNlcGFyYXRvciBcIiR7ZXh0ZW5zaW9uU2VwZXJhdG9yfVwiLmApO1xuICAgICAgfVxuICAgICAgaWYgKGV4dGVuc2lvblNlcGVyYXRvciAhPT0gJy4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBUaGUgXCIke2V4dGVuc2lvblNlcGVyYXRvcn1cIiBzZXBhcmF0b3IgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY2xhaW0gbmFtZS5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYWltTmFtZSxcbiAgICAgIGV4dGVuc2lvbjogZXh0ZW5zaW9uIHx8IG51bGwsXG4gICAgfTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvbGJyeVVyaS5qcyIsImNvbnN0IHsgc2VuZEdBU2VydmVFdmVudCB9ID0gcmVxdWlyZSgnaGVscGVycy9nb29nbGVBbmFseXRpY3MnKTtcclxuY29uc3QgeyBkZXRlcm1pbmVSZXNwb25zZVR5cGUsIGZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHksIGxvZ1JlcXVlc3REYXRhLCBnZXRDbGFpbUlkQW5kU2VydmVBc3NldCB9ID0gcmVxdWlyZSgnaGVscGVycy9zZXJ2ZUhlbHBlcnMuanMnKTtcclxuY29uc3QgbGJyeVVyaSA9IHJlcXVpcmUoJ2hlbHBlcnMvbGJyeVVyaS5qcycpO1xyXG5jb25zdCBoYW5kbGVTaG93UmVuZGVyID0gcmVxdWlyZSgnaGVscGVycy9oYW5kbGVTaG93UmVuZGVyLmpzeCcpO1xyXG5cclxuY29uc3QgU0VSVkUgPSAnU0VSVkUnO1xyXG5cclxuLypcclxuXHJcbiAgcm91dGUgdG8gc2VydmUgYW4gYXNzZXQgb3IgdGhlIHJlYWN0IGFwcCB2aWEgdGhlIGNsYWltIG5hbWUgYW5kIGFuIGlkZW50aWZpZXJcclxuXHJcbiovXHJcblxyXG5jb25zdCBpZGVudGlmaWVyQ2xhaW0gPSAoKSA9PiB7XHJcbiAgcmV0dXJuIChyZXEsIHJlcykgPT4ge1xyXG4gICAgY29uc3QgeyBoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9ID0gcmVxO1xyXG4gICAgLy8gZGVjaWRlIGlmIHRoaXMgaXMgYSBzaG93IHJlcXVlc3RcclxuICAgIGxldCBoYXNGaWxlRXh0ZW5zaW9uO1xyXG4gICAgdHJ5IHtcclxuICAgICAgKHsgaGFzRmlsZUV4dGVuc2lvbiB9ID0gbGJyeVVyaS5wYXJzZU1vZGlmaWVyKHBhcmFtcy5jbGFpbSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc3BvbnNlVHlwZSA9IGRldGVybWluZVJlc3BvbnNlVHlwZShoYXNGaWxlRXh0ZW5zaW9uLCBoZWFkZXJzKTtcclxuICAgIGlmIChyZXNwb25zZVR5cGUgIT09IFNFUlZFKSB7XHJcbiAgICAgIHJldHVybiBoYW5kbGVTaG93UmVuZGVyKHJlcSwgcmVzKTtcclxuICAgIH1cclxuICAgIC8vIGhhbmRsZSBzZXJ2ZSByZXF1ZXN0XHJcbiAgICAvLyBzZW5kIGdvb2dsZSBhbmFseXRpY3NcclxuICAgIHNlbmRHQVNlcnZlRXZlbnQoaGVhZGVycywgaXAsIG9yaWdpbmFsVXJsKTtcclxuICAgIC8vIHBhcnNlIHRoZSBjbGFpbVxyXG4gICAgbGV0IGNsYWltTmFtZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICh7IGNsYWltTmFtZSB9ID0gbGJyeVVyaS5wYXJzZUNsYWltKHBhcmFtcy5jbGFpbSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xyXG4gICAgfVxyXG4gICAgLy8gcGFyc2UgdGhlIGlkZW50aWZpZXJcclxuICAgIGxldCBpc0NoYW5uZWwsIGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgY2xhaW1JZDtcclxuICAgIHRyeSB7XHJcbiAgICAgICh7IGlzQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbUlkIH0gPSBsYnJ5VXJpLnBhcnNlSWRlbnRpZmllcihwYXJhbXMuaWRlbnRpZmllcikpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0NoYW5uZWwpIHtcclxuICAgICAgW2NsYWltSWQsIGNsYWltTmFtZV0gPSBmbGlwQ2xhaW1OYW1lQW5kSWRGb3JCYWNrd2FyZHNDb21wYXRpYmlsaXR5KGNsYWltSWQsIGNsYWltTmFtZSk7XHJcbiAgICB9XHJcbiAgICAvLyBsb2cgdGhlIHJlcXVlc3QgZGF0YSBmb3IgZGVidWdnaW5nXHJcbiAgICBsb2dSZXF1ZXN0RGF0YShyZXNwb25zZVR5cGUsIGNsYWltTmFtZSwgY2hhbm5lbE5hbWUsIGNsYWltSWQpO1xyXG4gICAgLy8gZ2V0IHRoZSBjbGFpbSBJZCBhbmQgdGhlbiBzZXJ2ZSB0aGUgYXNzZXRcclxuICAgIGdldENsYWltSWRBbmRTZXJ2ZUFzc2V0KGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgY2xhaW1OYW1lLCBjbGFpbUlkLCBvcmlnaW5hbFVybCwgaXAsIHJlcyk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpZmllckNsYWltO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2Fzc2V0L3NlcnZlQXNzZXRCeUlkZW50aWZpZXJBbmRDbGFpbS5qcyIsImNvbnN0IHNpZ251cCA9IHJlcXVpcmUoJy4vc2lnbnVwJyk7XG5jb25zdCBsb2dpbiA9IHJlcXVpcmUoJy4vbG9naW4nKTtcbmNvbnN0IGxvZ291dCA9IHJlcXVpcmUoJy4vbG9nb3V0Jyk7XG5jb25zdCB1c2VyID0gcmVxdWlyZSgnLi91c2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzaWdudXAsXG4gIGxvZ2luLFxuICBsb2dvdXQsXG4gIHVzZXIsXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9hdXRoL2luZGV4LmpzIiwiY29uc3Qgc2lnbnVwID0gKCkgPT4ge1xyXG4gIHJldHVybiAocmVxLCByZXMpID0+IHtcclxuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtcclxuICAgICAgc3VjY2VzcyAgICAgICA6IHRydWUsXHJcbiAgICAgIGNoYW5uZWxOYW1lICAgOiByZXEudXNlci5jaGFubmVsTmFtZSxcclxuICAgICAgY2hhbm5lbENsYWltSWQ6IHJlcS51c2VyLmNoYW5uZWxDbGFpbUlkLFxyXG4gICAgICBzaG9ydENoYW5uZWxJZDogcmVxLnVzZXIuc2hvcnRDaGFubmVsSWQsXHJcbiAgICB9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBzaWdudXA7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXV0aC9zaWdudXAuanMiLCJjb25zdCBsb2dpbiA9IChwYXNzcG9ydCkgPT4ge1xyXG4gIHJldHVybiAocmVxLCByZXMsIG5leHQpID0+IHtcclxuICAgIHBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSgnbG9jYWwtbG9naW4nLCAoZXJyLCB1c2VyLCBpbmZvKSA9PiB7XHJcbiAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICByZXR1cm4gbmV4dChlcnIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdXNlcikge1xyXG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIG1lc3NhZ2U6IGluZm8ubWVzc2FnZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXEubG9nSW4odXNlciwgKGVycikgPT4ge1xyXG4gICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgIHJldHVybiBuZXh0KGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7XHJcbiAgICAgICAgICBzdWNjZXNzICAgICAgIDogdHJ1ZSxcclxuICAgICAgICAgIGNoYW5uZWxOYW1lICAgOiByZXEudXNlci5jaGFubmVsTmFtZSxcclxuICAgICAgICAgIGNoYW5uZWxDbGFpbUlkOiByZXEudXNlci5jaGFubmVsQ2xhaW1JZCxcclxuICAgICAgICAgIHNob3J0Q2hhbm5lbElkOiByZXEudXNlci5zaG9ydENoYW5uZWxJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KShyZXEsIHJlcywgbmV4dCk7XHJcbiAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gbG9naW47XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXV0aC9sb2dpbi5qcyIsImNvbnN0IGxvZ291dCA9ICgpID0+IHtcclxuICByZXR1cm4gKHJlcSwgcmVzKSA9PiB7XHJcbiAgICByZXEubG9nb3V0KCk7XHJcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgbWVzc2FnZTogJ3lvdSBzdWNjZXNzZnVsbHkgbG9nZ2VkIG91dCd9KTtcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBsb2dvdXQ7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXV0aC9sb2dvdXQuanMiLCJjb25zdCB1c2VyID0gKCkgPT4ge1xyXG4gIHJldHVybiAocmVxLCByZXMpID0+IHtcclxuICAgIGlmIChyZXEudXNlcikge1xyXG4gICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogcmVxLnVzZXJ9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcy5zdGF0dXMoNDAxKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ3VzZXIgaXMgbm90IGxvZ2dlZCBpbid9KTtcclxuICAgIH1cclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB1c2VyO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2F1dGgvdXNlci5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxuZnVuY3Rpb24gTG9nZ2VyQ29uZmlnICgpIHtcbiAgdGhpcy5sb2dMZXZlbCA9ICdkZWJ1Zyc7XG4gIHRoaXMuY29uZmlndXJlID0gKGNvbmZpZykgPT4ge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ05vIGxvZ2dlciBjb25maWcgcmVjZWl2ZWQuJyk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdjb25maWd1cmluZyB3aW5zdG9uIGxvZ2dlci4uLicpO1xuICAgIC8vIHVwZGF0ZSB2YWx1ZXMgd2l0aCBsb2NhbCBjb25maWcgcGFyYW1zXG4gICAgY29uc3Qge2xvZ0xldmVsfSA9IGNvbmZpZztcbiAgICB0aGlzLmxvZ0xldmVsID0gbG9nTGV2ZWw7XG4gICAgLy8gY29uZmlndXJlIHRoZSB3aW5zdG9uIGxvZ2dlclxuICAgIGxvZ2dlci5jb25maWd1cmUoe1xuICAgICAgdHJhbnNwb3J0czogW1xuICAgICAgICBuZXcgKGxvZ2dlci50cmFuc3BvcnRzLkNvbnNvbGUpKHtcbiAgICAgICAgICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmxvZ0xldmVsLFxuICAgICAgICAgIHRpbWVzdGFtcCAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIGNvbG9yaXplICAgICAgICAgICAgICAgICAgICAgICA6IHRydWUsXG4gICAgICAgICAgcHJldHR5UHJpbnQgICAgICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICBoYW5kbGVFeGNlcHRpb25zICAgICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICAgIGh1bWFuUmVhZGFibGVVbmhhbmRsZWRFeGNlcHRpb246IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICAvLyB0ZXN0IGFsbCB0aGUgbG9nIGxldmVsc1xuICAgIGNvbnNvbGUubG9nKCd0ZXN0aW5nIHdpbnN0b24gbG9nIGxldmVscy4uLicpO1xuICAgIGxvZ2dlci5lcnJvcignTGV2ZWwgMCcpO1xuICAgIGxvZ2dlci53YXJuKCdMZXZlbCAxJyk7XG4gICAgbG9nZ2VyLmluZm8oJ0xldmVsIDInKTtcbiAgICBsb2dnZXIudmVyYm9zZSgnTGV2ZWwgMycpO1xuICAgIGxvZ2dlci5kZWJ1ZygnTGV2ZWwgNCcpO1xuICAgIGxvZ2dlci5zaWxseSgnTGV2ZWwgNScpO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgTG9nZ2VyQ29uZmlnKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvbG9nZ2VyQ29uZmlnLmpzIiwiY29uc3Qgd2luc3RvblNsYWNrV2ViSG9vayA9IHJlcXVpcmUoJ3dpbnN0b24tc2xhY2std2ViaG9vaycpLlNsYWNrV2ViSG9vaztcbmNvbnN0IHdpbnN0b24gPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5cbmZ1bmN0aW9uIFNsYWNrQ29uZmlnICgpIHtcbiAgdGhpcy5zbGFja1dlYkhvb2sgICAgICA9ICdkZWZhdWx0JztcbiAgdGhpcy5zbGFja0Vycm9yQ2hhbm5lbCA9ICdkZWZhdWx0JztcbiAgdGhpcy5zbGFja0luZm9DaGFubmVsICA9ICdkZWZhdWx0JztcbiAgdGhpcy5jb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygnbm8gc2xhY2sgY29uZmlnIHJlY2VpdmVkJyk7XG4gICAgfVxuICAgIC8vIHVwZGF0ZSB2YXJpYWJsZXNcbiAgICBjb25zb2xlLmxvZygnY29uZmlndXJpbmcgc2xhY2sgbG9nZ2VyLi4uJyk7XG4gICAgY29uc3Qge3NsYWNrV2ViSG9vaywgc2xhY2tFcnJvckNoYW5uZWwsIHNsYWNrSW5mb0NoYW5uZWx9ID0gY29uZmlnO1xuICAgIHRoaXMuc2xhY2tXZWJIb29rID0gc2xhY2tXZWJIb29rO1xuICAgIHRoaXMuc2xhY2tFcnJvckNoYW5uZWwgPSBzbGFja0Vycm9yQ2hhbm5lbDtcbiAgICB0aGlzLnNsYWNrSW5mb0NoYW5uZWwgPSBzbGFja0luZm9DaGFubmVsO1xuICAgIC8vIHVwZGF0ZSBzbGFjayB3ZWJob29rIHNldHRpbmdzXG4gICAgaWYgKHRoaXMuc2xhY2tXZWJIb29rKSB7XG4gICAgICAvLyBhZGQgYSB0cmFuc3BvcnQgZm9yIGVycm9ycyB0byBzbGFja1xuICAgICAgaWYgKHRoaXMuc2xhY2tFcnJvckNoYW5uZWwpIHtcbiAgICAgICAgd2luc3Rvbi5hZGQod2luc3RvblNsYWNrV2ViSG9vaywge1xuICAgICAgICAgIG5hbWUgICAgICA6ICdzbGFjay1lcnJvcnMtdHJhbnNwb3J0JyxcbiAgICAgICAgICBsZXZlbCAgICAgOiAnd2FybicsXG4gICAgICAgICAgd2ViaG9va1VybDogdGhpcy5zbGFja1dlYkhvb2ssXG4gICAgICAgICAgY2hhbm5lbCAgIDogdGhpcy5zbGFja0Vycm9yQ2hhbm5lbCxcbiAgICAgICAgICB1c2VybmFtZSAgOiAnc3BlZS5jaCcsXG4gICAgICAgICAgaWNvbkVtb2ppIDogJzpmYWNlX3dpdGhfaGVhZF9iYW5kYWdlOicsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGlmIChzbGFja0luZm9DaGFubmVsKSB7XG4gICAgICAgIHdpbnN0b24uYWRkKHdpbnN0b25TbGFja1dlYkhvb2ssIHtcbiAgICAgICAgICBuYW1lICAgICAgOiAnc2xhY2staW5mby10cmFuc3BvcnQnLFxuICAgICAgICAgIGxldmVsICAgICA6ICdpbmZvJyxcbiAgICAgICAgICB3ZWJob29rVXJsOiB0aGlzLnNsYWNrV2ViSG9vayxcbiAgICAgICAgICBjaGFubmVsICAgOiB0aGlzLnNsYWNrSW5mb0NoYW5uZWwsXG4gICAgICAgICAgdXNlcm5hbWUgIDogJ3NwZWUuY2gnLFxuICAgICAgICAgIGljb25FbW9qaSA6ICc6bmVyZF9mYWNlOicsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8vIHNlbmQgdGVzdCBtZXNzYWdlc1xuICAgICAgY29uc29sZS5sb2coJ3Rlc3Rpbmcgc2xhY2sgbG9nZ2VyLi4uJyk7XG4gICAgICB3aW5zdG9uLmVycm9yKCdTbGFjayBcImVycm9yXCIgbG9nZ2luZyBpcyBvbmxpbmUuJyk7XG4gICAgICB3aW5zdG9uLmluZm8oJ1NsYWNrIFwiaW5mb1wiIGxvZ2dpbmcgaXMgb25saW5lLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5zdG9uLndhcm4oJ1NsYWNrIGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQgYmVjYXVzZSBubyBzbGFja1dlYkhvb2sgY29uZmlnIHZhciBwcm92aWRlZC4nKTtcbiAgICB9XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTbGFja0NvbmZpZygpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29uZmlnL3NsYWNrQ29uZmlnLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwid2luc3Rvbi1zbGFjay13ZWJob29rXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwid2luc3Rvbi1zbGFjay13ZWJob29rXCJcbi8vIG1vZHVsZSBpZCA9IDE1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBwYXNzcG9ydCA9IHJlcXVpcmUoJ3Bhc3Nwb3J0Jyk7XHJcbmNvbnN0IGxvY2FsTG9naW5TdHJhdGVneSA9IHJlcXVpcmUoJy4vbG9jYWwtbG9naW4uanMnKTtcclxuY29uc3QgbG9jYWxTaWdudXBTdHJhdGVneSA9IHJlcXVpcmUoJy4vbG9jYWwtc2lnbnVwLmpzJyk7XHJcbmNvbnN0IHsgc2VyaWFsaXplU3BlZWNoVXNlciwgZGVzZXJpYWxpemVTcGVlY2hVc2VyIH0gPSByZXF1aXJlKCdoZWxwZXJzL2F1dGhIZWxwZXJzLmpzJyk7XHJcblxyXG5wYXNzcG9ydC5kZXNlcmlhbGl6ZVVzZXIoZGVzZXJpYWxpemVTcGVlY2hVc2VyKTtcclxucGFzc3BvcnQuc2VyaWFsaXplVXNlcihzZXJpYWxpemVTcGVlY2hVc2VyKTtcclxucGFzc3BvcnQudXNlKCdsb2NhbC1sb2dpbicsIGxvY2FsTG9naW5TdHJhdGVneSk7XHJcbnBhc3Nwb3J0LnVzZSgnbG9jYWwtc2lnbnVwJywgbG9jYWxTaWdudXBTdHJhdGVneSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHBhc3Nwb3J0O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcGFzc3BvcnQvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXNzcG9ydFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInBhc3Nwb3J0XCJcbi8vIG1vZHVsZSBpZCA9IDE1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBQYXNzcG9ydExvY2FsU3RyYXRlZ3kgPSByZXF1aXJlKCdwYXNzcG9ydC1sb2NhbCcpLlN0cmF0ZWd5O1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyBkYiB9ID0gcmVxdWlyZSgnbXlzcWxDb25maWcnKTtcblxuY29uc3QgcmV0dXJuVXNlckFuZENoYW5uZWxJbmZvID0gKHVzZXJJbnN0YW5jZSkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCB1c2VySW5mbyA9IHt9O1xuICAgIHVzZXJJbmZvWydpZCddID0gdXNlckluc3RhbmNlLmlkO1xuICAgIHVzZXJJbmZvWyd1c2VyTmFtZSddID0gdXNlckluc3RhbmNlLnVzZXJOYW1lO1xuICAgIHVzZXJJbnN0YW5jZVxuICAgICAgLmdldENoYW5uZWwoKVxuICAgICAgLnRoZW4oKHtjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWR9KSA9PiB7XG4gICAgICAgIHVzZXJJbmZvWydjaGFubmVsTmFtZSddID0gY2hhbm5lbE5hbWU7XG4gICAgICAgIHVzZXJJbmZvWydjaGFubmVsQ2xhaW1JZCddID0gY2hhbm5lbENsYWltSWQ7XG4gICAgICAgIHJldHVybiBkYi5DZXJ0aWZpY2F0ZS5nZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkKGNoYW5uZWxDbGFpbUlkLCBjaGFubmVsTmFtZSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oc2hvcnRDaGFubmVsSWQgPT4ge1xuICAgICAgICB1c2VySW5mb1snc2hvcnRDaGFubmVsSWQnXSA9IHNob3J0Q2hhbm5lbElkO1xuICAgICAgICByZXNvbHZlKHVzZXJJbmZvKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgUGFzc3BvcnRMb2NhbFN0cmF0ZWd5KFxuICB7XG4gICAgdXNlcm5hbWVGaWVsZDogJ3VzZXJuYW1lJyxcbiAgICBwYXNzd29yZEZpZWxkOiAncGFzc3dvcmQnLFxuICB9LFxuICAodXNlcm5hbWUsIHBhc3N3b3JkLCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGRiLlVzZXJcbiAgICAgIC5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHt1c2VyTmFtZTogdXNlcm5hbWV9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ25vIHVzZXIgZm91bmQnKTtcbiAgICAgICAgICByZXR1cm4gZG9uZShudWxsLCBmYWxzZSwge21lc3NhZ2U6ICdJbmNvcnJlY3QgdXNlcm5hbWUgb3IgcGFzc3dvcmQnfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzZXIuY29tcGFyZVBhc3N3b3JkKHBhc3N3b3JkKVxuICAgICAgICAgIC50aGVuKGlzTWF0Y2ggPT4ge1xuICAgICAgICAgICAgaWYgKCFpc01hdGNoKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnaW5jb3JyZWN0IHBhc3N3b3JkJyk7XG4gICAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIGZhbHNlLCB7bWVzc2FnZTogJ0luY29ycmVjdCB1c2VybmFtZSBvciBwYXNzd29yZCd9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUGFzc3dvcmQgd2FzIGEgbWF0Y2gsIHJldHVybmluZyBVc2VyJyk7XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVXNlckFuZENoYW5uZWxJbmZvKHVzZXIpXG4gICAgICAgICAgICAgIC50aGVuKHVzZXJJbmZvID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShudWxsLCB1c2VySW5mbyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgcmV0dXJuIGRvbmUoZXJyb3IpO1xuICAgICAgfSk7XG4gIH0sXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3Bhc3Nwb3J0L2xvY2FsLWxvZ2luLmpzIiwiY29uc3QgUGFzc3BvcnRMb2NhbFN0cmF0ZWd5ID0gcmVxdWlyZSgncGFzc3BvcnQtbG9jYWwnKS5TdHJhdGVneTtcbmNvbnN0IGxicnlBcGkgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2xicnlBcGkuanMnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHsgZGIgfSA9IHJlcXVpcmUoJ215c3FsQ29uZmlnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFBhc3Nwb3J0TG9jYWxTdHJhdGVneShcbiAge1xuICAgIHVzZXJuYW1lRmllbGQ6ICd1c2VybmFtZScsXG4gICAgcGFzc3dvcmRGaWVsZDogJ3Bhc3N3b3JkJyxcbiAgfSxcbiAgKHVzZXJuYW1lLCBwYXNzd29yZCwgZG9uZSkgPT4ge1xuICAgIGxvZ2dlci52ZXJib3NlKGBuZXcgY2hhbm5lbCBzaWdudXAgcmVxdWVzdC4gdXNlcjogJHt1c2VybmFtZX0gcGFzczogJHtwYXNzd29yZH0gLmApO1xuICAgIGxldCB1c2VySW5mbyA9IHt9O1xuICAgIC8vIHNlcnZlci1zaWRlIHZhbGlkYXRvbiBvZiBpbnB1dHMgKHVzZXJuYW1lLCBwYXNzd29yZClcblxuICAgIC8vIGNyZWF0ZSB0aGUgY2hhbm5lbCBhbmQgcmV0cmlldmUgdGhlIG1ldGFkYXRhXG4gICAgcmV0dXJuIGxicnlBcGkuY3JlYXRlQ2hhbm5lbChgQCR7dXNlcm5hbWV9YClcbiAgICAgIC50aGVuKHR4ID0+IHtcbiAgICAgICAgLy8gY3JlYXRlIHVzZXIgcmVjb3JkXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0ge1xuICAgICAgICAgIHVzZXJOYW1lOiB1c2VybmFtZSxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgIH07XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKCd1c2VyRGF0YSA+JywgdXNlckRhdGEpO1xuICAgICAgICAvLyBjcmVhdGUgdXNlciByZWNvcmRcbiAgICAgICAgY29uc3QgY2hhbm5lbERhdGEgPSB7XG4gICAgICAgICAgY2hhbm5lbE5hbWUgICA6IGBAJHt1c2VybmFtZX1gLFxuICAgICAgICAgIGNoYW5uZWxDbGFpbUlkOiB0eC5jbGFpbV9pZCxcbiAgICAgICAgfTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ2NoYW5uZWxEYXRhID4nLCBjaGFubmVsRGF0YSk7XG4gICAgICAgIC8vIGNyZWF0ZSBjZXJ0aWZpY2F0ZSByZWNvcmRcbiAgICAgICAgY29uc3QgY2VydGlmaWNhdGVEYXRhID0ge1xuICAgICAgICAgIGNsYWltSWQ6IHR4LmNsYWltX2lkLFxuICAgICAgICAgIG5hbWUgICA6IGBAJHt1c2VybmFtZX1gLFxuICAgICAgICAgIC8vIGFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKCdjZXJ0aWZpY2F0ZURhdGEgPicsIGNlcnRpZmljYXRlRGF0YSk7XG4gICAgICAgIC8vIHNhdmUgdXNlciBhbmQgY2VydGlmaWNhdGUgdG8gZGJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtkYi5Vc2VyLmNyZWF0ZSh1c2VyRGF0YSksIGRiLkNoYW5uZWwuY3JlYXRlKGNoYW5uZWxEYXRhKSwgZGIuQ2VydGlmaWNhdGUuY3JlYXRlKGNlcnRpZmljYXRlRGF0YSldKTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoW25ld1VzZXIsIG5ld0NoYW5uZWwsIG5ld0NlcnRpZmljYXRlXSkgPT4ge1xuICAgICAgICBsb2dnZXIudmVyYm9zZSgndXNlciBhbmQgY2VydGlmaWNhdGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQnKTtcbiAgICAgICAgLy8gc3RvcmUgdGhlIHJlbGV2YW50IG5ld1VzZXIgaW5mbyB0byBiZSBwYXNzZWQgYmFjayBmb3IgcmVxLlVzZXJcbiAgICAgICAgdXNlckluZm9bJ2lkJ10gPSBuZXdVc2VyLmlkO1xuICAgICAgICB1c2VySW5mb1sndXNlck5hbWUnXSA9IG5ld1VzZXIudXNlck5hbWU7XG4gICAgICAgIHVzZXJJbmZvWydjaGFubmVsTmFtZSddID0gbmV3Q2hhbm5lbC5jaGFubmVsTmFtZTtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxDbGFpbUlkJ10gPSBuZXdDaGFubmVsLmNoYW5uZWxDbGFpbUlkO1xuICAgICAgICAvLyBhc3NvY2lhdGUgdGhlIGluc3RhbmNlc1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW25ld0NlcnRpZmljYXRlLnNldENoYW5uZWwobmV3Q2hhbm5lbCksIG5ld0NoYW5uZWwuc2V0VXNlcihuZXdVc2VyKV0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ3VzZXIgYW5kIGNlcnRpZmljYXRlIHN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkJyk7XG4gICAgICAgIHJldHVybiBkYi5DZXJ0aWZpY2F0ZS5nZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkKHVzZXJJbmZvLmNoYW5uZWxDbGFpbUlkLCB1c2VySW5mby5jaGFubmVsTmFtZSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oc2hvcnRDaGFubmVsSWQgPT4ge1xuICAgICAgICB1c2VySW5mb1snc2hvcnRDaGFubmVsSWQnXSA9IHNob3J0Q2hhbm5lbElkO1xuICAgICAgICByZXR1cm4gZG9uZShudWxsLCB1c2VySW5mbyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdzaWdudXAgZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBkb25lKGVycm9yKTtcbiAgICAgIH0pO1xuICB9XG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3Bhc3Nwb3J0L2xvY2FsLXNpZ251cC5qcyIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXJpYWxpemVTcGVlY2hVc2VyICh1c2VyLCBkb25lKSB7ICAvLyByZXR1cm5zIHVzZXIgZGF0YSB0byBiZSBzZXJpYWxpemVkIGludG8gc2Vzc2lvblxuICAgIGNvbnNvbGUubG9nKCdzZXJpYWxpemluZyB1c2VyJyk7XG4gICAgZG9uZShudWxsLCB1c2VyKTtcbiAgfSxcbiAgZGVzZXJpYWxpemVTcGVlY2hVc2VyICh1c2VyLCBkb25lKSB7ICAvLyBkZXNlcmlhbGl6ZXMgc2Vzc2lvbiBhbmQgcG9wdWxhdGVzIGFkZGl0aW9uYWwgaW5mbyB0byByZXEudXNlclxuICAgIGNvbnNvbGUubG9nKCdkZXNlcmlhbGl6aW5nIHVzZXInKTtcbiAgICBkb25lKG51bGwsIHVzZXIpO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2F1dGhIZWxwZXJzLmpzIiwiY29uc3QgQ2VydGlmaWNhdGUgPSByZXF1aXJlKCdtb2RlbHMvY2VydGlmaWNhdGUuanMnKTtcclxuY29uc3QgQ2hhbm5lbCA9IHJlcXVpcmUoJ21vZGVscy9jaGFubmVsLmpzJyk7XHJcbmNvbnN0IENsYWltID0gcmVxdWlyZSgnbW9kZWxzL2NsYWltLmpzJyk7XHJcbmNvbnN0IEZpbGUgPSByZXF1aXJlKCdtb2RlbHMvZmlsZS5qcycpO1xyXG5jb25zdCBSZXF1ZXN0ID0gcmVxdWlyZSgnbW9kZWxzL3JlcXVlc3QuanMnKTtcclxuY29uc3QgVXNlciA9IHJlcXVpcmUoJ21vZGVscy91c2VyLmpzJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICBDZXJ0aWZpY2F0ZSxcclxuICBDaGFubmVsLFxyXG4gIENsYWltLFxyXG4gIEZpbGUsXHJcbiAgUmVxdWVzdCxcclxuICBVc2VyLFxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9tb2RlbHMvaW5kZXguanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCB7IHJldHVyblNob3J0SWQgfSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvc2VxdWVsaXplSGVscGVycy5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChzZXF1ZWxpemUsIHsgU1RSSU5HLCBCT09MRUFOLCBJTlRFR0VSLCBURVhULCBERUNJTUFMIH0pID0+IHtcbiAgY29uc3QgQ2VydGlmaWNhdGUgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdDZXJ0aWZpY2F0ZScsXG4gICAge1xuICAgICAgYWRkcmVzczoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYW1vdW50OiB7XG4gICAgICAgIHR5cGUgICA6IERFQ0lNQUwoMTksIDgpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYWltSWQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYWltU2VxdWVuY2U6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBkZWNvZGVkQ2xhaW06IHtcbiAgICAgICAgdHlwZSAgIDogQk9PTEVBTixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBkZXB0aDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGVmZmVjdGl2ZUFtb3VudDoge1xuICAgICAgICB0eXBlICAgOiBERUNJTUFMKDE5LCA4KSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBoYXNTaWduYXR1cmU6IHtcbiAgICAgICAgdHlwZSAgIDogQk9PTEVBTixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBoZXg6IHtcbiAgICAgICAgdHlwZSAgIDogVEVYVCgnbG9uZycpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG5vdXQ6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB0eGlkOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB2YWxpZEF0SGVpZ2h0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgb3V0cG9pbnQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHZhbHVlVmVyc2lvbjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1UeXBlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjZXJ0aWZpY2F0ZVZlcnNpb246IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGtleVR5cGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHB1YmxpY0tleToge1xuICAgICAgICB0eXBlICAgOiBURVhUKCdsb25nJyksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgZnJlZXplVGFibGVOYW1lOiB0cnVlLFxuICAgIH1cbiAgKTtcblxuICBDZXJ0aWZpY2F0ZS5hc3NvY2lhdGUgPSBkYiA9PiB7XG4gICAgQ2VydGlmaWNhdGUuYmVsb25nc1RvKGRiLkNoYW5uZWwsIHtcbiAgICAgIGZvcmVpZ25LZXk6IHtcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBDZXJ0aWZpY2F0ZS5nZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkID0gZnVuY3Rpb24gKGxvbmdDaGFubmVsSWQsIGNoYW5uZWxOYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkICR7Y2hhbm5lbE5hbWV9OiR7bG9uZ0NoYW5uZWxJZH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHtuYW1lOiBjaGFubmVsTmFtZX0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY2hhbm5lbChzKSBmb3VuZCB3aXRoIHRoYXQgY2hhbm5lbCBuYW1lJyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXR1cm5TaG9ydElkKHJlc3VsdCwgbG9uZ0NoYW5uZWxJZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDZXJ0aWZpY2F0ZS5nZXRMb25nQ2hhbm5lbElkRnJvbVNob3J0Q2hhbm5lbElkID0gZnVuY3Rpb24gKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0TG9uZ0NoYW5uZWxJZEZyb21TaG9ydENoYW5uZWxJZCgke2NoYW5uZWxOYW1lfSwgJHtjaGFubmVsQ2xhaW1JZH0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgICBuYW1lICAgOiBjaGFubmVsTmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQ6IHtcbiAgICAgICAgICAgICAgJGxpa2U6IGAke2NoYW5uZWxDbGFpbUlkfSVgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9yZGVyOiBbWydoZWlnaHQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6IC8vIG5vdGUgcmVzdWx0cyBtdXN0IGJlIHNvcnRlZFxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRbMF0uY2xhaW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWRGcm9tQ2hhbm5lbE5hbWUgPSBmdW5jdGlvbiAoY2hhbm5lbE5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldExvbmdDaGFubmVsSWRGcm9tQ2hhbm5lbE5hbWUoJHtjaGFubmVsTmFtZX0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7IG5hbWU6IGNoYW5uZWxOYW1lIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2VmZmVjdGl2ZUFtb3VudCcsICdERVNDJ10sIFsnaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRbMF0uY2xhaW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLnZhbGlkYXRlTG9uZ0NoYW5uZWxJZCA9IGZ1bmN0aW9uIChuYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGB2YWxpZGF0ZUxvbmdDaGFubmVsSWQoJHtuYW1lfSwgJHtjbGFpbUlkfSlgKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHtuYW1lLCBjbGFpbUlkfSxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmVzb2x2ZShjbGFpbUlkKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDZXJ0aWZpY2F0ZS5nZXRMb25nQ2hhbm5lbElkID0gZnVuY3Rpb24gKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0TG9uZ0NoYW5uZWxJZCgke2NoYW5uZWxOYW1lfSwgJHtjaGFubmVsQ2xhaW1JZH0pYCk7XG4gICAgaWYgKGNoYW5uZWxDbGFpbUlkICYmIChjaGFubmVsQ2xhaW1JZC5sZW5ndGggPT09IDQwKSkgeyAgLy8gaWYgYSBmdWxsIGNoYW5uZWwgaWQgaXMgcHJvdmlkZWRcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlTG9uZ0NoYW5uZWxJZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENsYWltSWQgJiYgY2hhbm5lbENsYWltSWQubGVuZ3RoIDwgNDApIHsgIC8vIGlmIGEgc2hvcnQgY2hhbm5lbCBpZCBpcyBwcm92aWRlZFxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9uZ0NoYW5uZWxJZEZyb21TaG9ydENoYW5uZWxJZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb25nQ2hhbm5lbElkRnJvbUNoYW5uZWxOYW1lKGNoYW5uZWxOYW1lKTsgIC8vIGlmIG5vIGNoYW5uZWwgaWQgcHJvdmlkZWRcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENlcnRpZmljYXRlO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9tb2RlbHMvY2VydGlmaWNhdGUuanMiLCJtb2R1bGUuZXhwb3J0cyA9IChzZXF1ZWxpemUsIHsgU1RSSU5HIH0pID0+IHtcbiAgY29uc3QgQ2hhbm5lbCA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ0NoYW5uZWwnLFxuICAgIHtcbiAgICAgIGNoYW5uZWxOYW1lOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGNoYW5uZWxDbGFpbUlkOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZyZWV6ZVRhYmxlTmFtZTogdHJ1ZSxcbiAgICB9XG4gICk7XG5cbiAgQ2hhbm5lbC5hc3NvY2lhdGUgPSBkYiA9PiB7XG4gICAgQ2hhbm5lbC5iZWxvbmdzVG8oZGIuVXNlcik7XG4gICAgQ2hhbm5lbC5oYXNPbmUoZGIuQ2VydGlmaWNhdGUpO1xuICB9O1xuXG4gIHJldHVybiBDaGFubmVsO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9tb2RlbHMvY2hhbm5lbC5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHsgcmV0dXJuU2hvcnRJZCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXF1ZWxpemVIZWxwZXJzLmpzJyk7XG5jb25zdCB7IGFzc2V0RGVmYXVsdHM6IHsgdGh1bWJuYWlsOiBkZWZhdWx0VGh1bWJuYWlsIH0sIGRldGFpbHM6IHsgaG9zdCB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVGaWxlRXh0ZW5zaW9uRnJvbUNvbnRlbnRUeXBlIChjb250ZW50VHlwZSkge1xuICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XG4gICAgY2FzZSAnaW1hZ2UvanBlZyc6XG4gICAgY2FzZSAnaW1hZ2UvanBnJzpcbiAgICAgIHJldHVybiAnanBlZyc7XG4gICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgIHJldHVybiAncG5nJztcbiAgICBjYXNlICdpbWFnZS9naWYnOlxuICAgICAgcmV0dXJuICdnaWYnO1xuICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICByZXR1cm4gJ21wNCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIGxvZ2dlci5kZWJ1Zygnc2V0dGluZyB1bmtub3duIGZpbGUgdHlwZSBhcyBmaWxlIGV4dGVuc2lvbiBqcGVnJyk7XG4gICAgICByZXR1cm4gJ2pwZWcnO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVUaHVtYm5haWwgKHN0b3JlZFRodW1ibmFpbCwgZGVmYXVsdFRodW1ibmFpbCkge1xuICBpZiAoc3RvcmVkVGh1bWJuYWlsID09PSAnJykge1xuICAgIHJldHVybiBkZWZhdWx0VGh1bWJuYWlsO1xuICB9XG4gIHJldHVybiBzdG9yZWRUaHVtYm5haWw7XG59O1xuXG5mdW5jdGlvbiBwcmVwYXJlQ2xhaW1EYXRhIChjbGFpbSkge1xuICAvLyBsb2dnZXIuZGVidWcoJ3ByZXBhcmluZyBjbGFpbSBkYXRhIGJhc2VkIG9uIHJlc29sdmVkIGRhdGE6JywgY2xhaW0pO1xuICBjbGFpbVsndGh1bWJuYWlsJ10gPSBkZXRlcm1pbmVUaHVtYm5haWwoY2xhaW0udGh1bWJuYWlsLCBkZWZhdWx0VGh1bWJuYWlsKTtcbiAgY2xhaW1bJ2ZpbGVFeHQnXSA9IGRldGVybWluZUZpbGVFeHRlbnNpb25Gcm9tQ29udGVudFR5cGUoY2xhaW0uY29udGVudFR5cGUpO1xuICBjbGFpbVsnaG9zdCddID0gaG9zdDtcbiAgcmV0dXJuIGNsYWltO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORywgQk9PTEVBTiwgSU5URUdFUiwgVEVYVCwgREVDSU1BTCB9KSA9PiB7XG4gIGNvbnN0IENsYWltID0gc2VxdWVsaXplLmRlZmluZShcbiAgICAnQ2xhaW0nLFxuICAgIHtcbiAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGFtb3VudDoge1xuICAgICAgICB0eXBlICAgOiBERUNJTUFMKDE5LCA4KSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbUlkOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbVNlcXVlbmNlOiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVjb2RlZENsYWltOiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVwdGg6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBlZmZlY3RpdmVBbW91bnQ6IHtcbiAgICAgICAgdHlwZSAgIDogREVDSU1BTCgxOSwgOCksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGFzU2lnbmF0dXJlOiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGV4OiB7XG4gICAgICAgIHR5cGUgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBub3V0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdHhpZDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsaWRBdEhlaWdodDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG91dHBvaW50OiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbVR5cGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNlcnRpZmljYXRlSWQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGF1dGhvcjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgdHlwZSAgIDogVEVYVCgnbG9uZycpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxhbmd1YWdlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBsaWNlbnNlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBsaWNlbnNlVXJsOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBuc2Z3OiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgcHJldmlldzoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGh1bWJuYWlsOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB0aXRsZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbWV0YWRhdGFWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjb250ZW50VHlwZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VUeXBlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzdHJlYW1WZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB2YWx1ZVZlcnNpb246IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNoYW5uZWxOYW1lOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICAgIGRlZmF1bHQgIDogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIENsYWltLmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBDbGFpbS5iZWxvbmdzVG8oZGIuRmlsZSwge1xuICAgICAgZm9yZWlnbktleToge1xuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldFNob3J0Q2xhaW1JZEZyb21Mb25nQ2xhaW1JZCA9IGZ1bmN0aW9uIChjbGFpbUlkLCBjbGFpbU5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYENsYWltLmdldFNob3J0Q2xhaW1JZEZyb21Mb25nQ2xhaW1JZCBmb3IgJHtjbGFpbU5hbWV9IyR7Y2xhaW1JZH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZTogY2xhaW1OYW1lIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY2xhaW0ocykgZm91bmQgd2l0aCB0aGF0IGNsYWltIG5hbWUnKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuU2hvcnRJZChyZXN1bHQsIGNsYWltSWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0QWxsQ2hhbm5lbENsYWltcyA9IGZ1bmN0aW9uIChjaGFubmVsQ2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xhaW0uZ2V0QWxsQ2hhbm5lbENsYWltcyBmb3IgJHtjaGFubmVsQ2xhaW1JZH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgY2VydGlmaWNhdGVJZDogY2hhbm5lbENsYWltSWQgfSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgICByYXcgIDogdHJ1ZSwgIC8vIHJldHVybnMgYW4gYXJyYXkgb2Ygb25seSBkYXRhLCBub3QgYW4gYXJyYXkgb2YgaW5zdGFuY2VzXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGNoYW5uZWxDbGFpbXNBcnJheSA9PiB7XG4gICAgICAgICAgLy8gbG9nZ2VyLmRlYnVnKCdjaGFubmVsY2xhaW1zYXJyYXkgbGVuZ3RoOicsIGNoYW5uZWxDbGFpbXNBcnJheS5sZW5ndGgpO1xuICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbENsYWltc0FycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGNoYW5uZWxDbGFpbXNBcnJheS5mb3JFYWNoKGNsYWltID0+IHtcbiAgICAgICAgICAgICAgICBjbGFpbVsnZmlsZUV4dCddID0gZGV0ZXJtaW5lRmlsZUV4dGVuc2lvbkZyb21Db250ZW50VHlwZShjbGFpbS5jb250ZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgY2xhaW1bJ3RodW1ibmFpbCddID0gZGV0ZXJtaW5lVGh1bWJuYWlsKGNsYWltLnRodW1ibmFpbCwgZGVmYXVsdFRodW1ibmFpbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoY2hhbm5lbENsYWltc0FycmF5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0Q2xhaW1JZEJ5TG9uZ0NoYW5uZWxJZCA9IGZ1bmN0aW9uIChjaGFubmVsQ2xhaW1JZCwgY2xhaW1OYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBmaW5kaW5nIGNsYWltIGlkIGZvciBjbGFpbSAke2NsYWltTmFtZX0gZnJvbSBjaGFubmVsICR7Y2hhbm5lbENsYWltSWR9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7IG5hbWU6IGNsYWltTmFtZSwgY2VydGlmaWNhdGVJZDogY2hhbm5lbENsYWltSWQgfSxcbiAgICAgICAgICBvcmRlcjogW1snaWQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGAke3Jlc3VsdC5sZW5ndGh9IHJlY29yZHMgZm91bmQgZm9yIFwiJHtjbGFpbU5hbWV9XCIgaW4gY2hhbm5lbCBcIiR7Y2hhbm5lbENsYWltSWR9XCJgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRMb25nQ2xhaW1JZEZyb21TaG9ydENsYWltSWQgPSBmdW5jdGlvbiAobmFtZSwgc2hvcnRJZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQ6IHtcbiAgICAgICAgICAgICAgJGxpa2U6IGAke3Nob3J0SWR9JWAsXG4gICAgICAgICAgICB9fSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBkZWZhdWx0OiAvLyBub3RlIHJlc3VsdHMgbXVzdCBiZSBzb3J0ZWRcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRUb3BGcmVlQ2xhaW1JZEJ5Q2xhaW1OYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZSB9LFxuICAgICAgICAgIG9yZGVyOiBbWydlZmZlY3RpdmVBbW91bnQnLCAnREVTQyddLCBbJ2hlaWdodCcsICdBU0MnXV0sICAvLyBub3RlOiBtYXliZSBoZWlnaHQgYW5kIGVmZmVjdGl2ZSBhbW91bnQgbmVlZCB0byBzd2l0Y2g/XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdsZW5ndGggb2YgcmVzdWx0JywgcmVzdWx0Lmxlbmd0aCk7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmRhdGFWYWx1ZXMuY2xhaW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLnZhbGlkYXRlTG9uZ0NsYWltSWQgPSBmdW5jdGlvbiAobmFtZSwgY2xhaW1JZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge25hbWUsIGNsYWltSWR9LFxuICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXNvbHZlKGNsYWltSWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldExvbmdDbGFpbUlkID0gZnVuY3Rpb24gKGNsYWltTmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0TG9uZ0NsYWltSWQoJHtjbGFpbU5hbWV9LCAke2NsYWltSWR9KWApO1xuICAgIGlmIChjbGFpbUlkICYmIChjbGFpbUlkLmxlbmd0aCA9PT0gNDApKSB7ICAvLyBpZiBhIGZ1bGwgY2xhaW0gaWQgaXMgcHJvdmlkZWRcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlTG9uZ0NsYWltSWQoY2xhaW1OYW1lLCBjbGFpbUlkKTtcbiAgICB9IGVsc2UgaWYgKGNsYWltSWQgJiYgY2xhaW1JZC5sZW5ndGggPCA0MCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9uZ0NsYWltSWRGcm9tU2hvcnRDbGFpbUlkKGNsYWltTmFtZSwgY2xhaW1JZCk7ICAvLyBpZiBhIHNob3J0IGNsYWltIGlkIGlzIHByb3ZpZGVkXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRvcEZyZWVDbGFpbUlkQnlDbGFpbU5hbWUoY2xhaW1OYW1lKTsgIC8vIGlmIG5vIGNsYWltIGlkIGlzIHByb3ZpZGVkXG4gICAgfVxuICB9O1xuXG4gIENsYWltLnJlc29sdmVDbGFpbSA9IGZ1bmN0aW9uIChuYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDbGFpbS5yZXNvbHZlQ2xhaW06ICR7bmFtZX0gJHtjbGFpbUlkfWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZTogeyBuYW1lLCBjbGFpbUlkIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGNsYWltQXJyYXkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoY2xhaW1BcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHByZXBhcmVDbGFpbURhdGEoY2xhaW1BcnJheVswXS5kYXRhVmFsdWVzKSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYG1vcmUgdGhhbiBvbmUgcmVjb3JkIG1hdGNoZXMgJHtuYW1lfSMke2NsYWltSWR9IGluIGRiLkNsYWltYCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHByZXBhcmVDbGFpbURhdGEoY2xhaW1BcnJheVswXS5kYXRhVmFsdWVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBDbGFpbTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvbW9kZWxzL2NsYWltLmpzIiwibW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORywgQk9PTEVBTiwgSU5URUdFUiB9KSA9PiB7XG4gIGNvbnN0IEZpbGUgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdGaWxlJyxcbiAgICB7XG4gICAgICBuYW1lOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGNsYWltSWQ6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgYWRkcmVzczoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBvdXRwb2ludDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgdHlwZSAgICAgOiBJTlRFR0VSLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0ICA6IDAsXG4gICAgICB9LFxuICAgICAgZmlsZU5hbWU6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZmlsZVBhdGg6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZmlsZVR5cGU6IHtcbiAgICAgICAgdHlwZTogU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIG5zZnc6IHtcbiAgICAgICAgdHlwZSAgICAgICAgOiBCT09MRUFOLFxuICAgICAgICBhbGxvd051bGwgICA6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHRyZW5kaW5nRWxpZ2libGU6IHtcbiAgICAgICAgdHlwZSAgICAgICAgOiBCT09MRUFOLFxuICAgICAgICBhbGxvd051bGwgICA6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgZnJlZXplVGFibGVOYW1lOiB0cnVlLFxuICAgIH1cbiAgKTtcblxuICBGaWxlLmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBGaWxlLmhhc01hbnkoZGIuUmVxdWVzdCk7XG4gICAgRmlsZS5oYXNPbmUoZGIuQ2xhaW0pO1xuICB9O1xuXG4gIEZpbGUuZ2V0UmVjZW50Q2xhaW1zID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmRBbGwoe1xuICAgICAgd2hlcmU6IHsgbnNmdzogZmFsc2UsIHRyZW5kaW5nRWxpZ2libGU6IHRydWUgfSxcbiAgICAgIG9yZGVyOiBbWydjcmVhdGVkQXQnLCAnREVTQyddXSxcbiAgICAgIGxpbWl0OiAyNSxcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRmlsZTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvbW9kZWxzL2ZpbGUuanMiLCJtb2R1bGUuZXhwb3J0cyA9IChzZXF1ZWxpemUsIHsgU1RSSU5HLCBCT09MRUFOLCBURVhUIH0pID0+IHtcbiAgY29uc3QgUmVxdWVzdCA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ1JlcXVlc3QnLFxuICAgIHtcbiAgICAgIGFjdGlvbjoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB1cmw6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgaXBBZGRyZXNzOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICB9LFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHR5cGUgICAgIDogVEVYVCgnbG9uZycpLFxuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICAgIGRlZmF1bHQgIDogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIFJlcXVlc3QuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIFJlcXVlc3QuYmVsb25nc1RvKGRiLkZpbGUsIHtcbiAgICAgIGZvcmVpZ25LZXk6IHtcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gUmVxdWVzdDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvbW9kZWxzL3JlcXVlc3QuanMiLCIndXNlIHN0cmljdCc7XG5jb25zdCBiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHQnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORyB9KSA9PiB7XG4gIGNvbnN0IFVzZXIgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdVc2VyJyxcbiAgICB7XG4gICAgICB1c2VyTmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBwYXNzd29yZDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIFVzZXIuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIFVzZXIuaGFzT25lKGRiLkNoYW5uZWwpO1xuICB9O1xuXG4gIFVzZXIucHJvdG90eXBlLmNvbXBhcmVQYXNzd29yZCA9IGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgIHJldHVybiBiY3J5cHQuY29tcGFyZShwYXNzd29yZCwgdGhpcy5wYXNzd29yZCk7XG4gIH07XG5cbiAgVXNlci5wcm90b3R5cGUuY2hhbmdlUGFzc3dvcmQgPSBmdW5jdGlvbiAobmV3UGFzc3dvcmQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gZ2VuZXJhdGUgYSBzYWx0IHN0cmluZyB0byB1c2UgZm9yIGhhc2hpbmdcbiAgICAgIGJjcnlwdC5nZW5TYWx0KChzYWx0RXJyb3IsIHNhbHQpID0+IHtcbiAgICAgICAgaWYgKHNhbHRFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignc2FsdCBlcnJvcicsIHNhbHRFcnJvcik7XG4gICAgICAgICAgcmVqZWN0KHNhbHRFcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgaGFzaGVkIHZlcnNpb24gb2YgdGhlIHVzZXIncyBwYXNzd29yZFxuICAgICAgICBiY3J5cHQuaGFzaChuZXdQYXNzd29yZCwgc2FsdCwgKGhhc2hFcnJvciwgaGFzaCkgPT4ge1xuICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIGhhc2ggZ2VuZXJhdGlvbiByZXR1cm4gdGhlIGVycm9yXG4gICAgICAgICAgaWYgKGhhc2hFcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdoYXNoIGVycm9yJywgaGFzaEVycm9yKTtcbiAgICAgICAgICAgIHJlamVjdChoYXNoRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByZXBsYWNlIHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpdGggdGhlIG5ldyBoYXNoXG4gICAgICAgICAgdGhpc1xuICAgICAgICAgICAgLnVwZGF0ZSh7cGFzc3dvcmQ6IGhhc2h9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZS1zYXZlIGhvb2sgbWV0aG9kIHRvIGhhc2ggdGhlIHVzZXIncyBwYXNzd29yZCBiZWZvcmUgdGhlIHVzZXIncyBpbmZvIGlzIHNhdmVkIHRvIHRoZSBkYi5cbiAgVXNlci5ob29rKCdiZWZvcmVDcmVhdGUnLCAodXNlciwgb3B0aW9ucykgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZygnVXNlci5iZWZvcmVDcmVhdGUgaG9vay4uLicpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBnZW5lcmF0ZSBhIHNhbHQgc3RyaW5nIHRvIHVzZSBmb3IgaGFzaGluZ1xuICAgICAgYmNyeXB0LmdlblNhbHQoKHNhbHRFcnJvciwgc2FsdCkgPT4ge1xuICAgICAgICBpZiAoc2FsdEVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdzYWx0IGVycm9yJywgc2FsdEVycm9yKTtcbiAgICAgICAgICByZWplY3Qoc2FsdEVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBoYXNoZWQgdmVyc2lvbiBvZiB0aGUgdXNlcidzIHBhc3N3b3JkXG4gICAgICAgIGJjcnlwdC5oYXNoKHVzZXIucGFzc3dvcmQsIHNhbHQsIChoYXNoRXJyb3IsIGhhc2gpID0+IHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBoYXNoIGdlbmVyYXRpb24gcmV0dXJuIHRoZSBlcnJvclxuICAgICAgICAgIGlmIChoYXNoRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignaGFzaCBlcnJvcicsIGhhc2hFcnJvcik7XG4gICAgICAgICAgICByZWplY3QoaGFzaEVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVwbGFjZSB0aGUgcGFzc3dvcmQgc3RyaW5nIHdpdGggdGhlIGhhc2ggcGFzc3dvcmQgdmFsdWVcbiAgICAgICAgICB1c2VyLnBhc3N3b3JkID0gaGFzaDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBVc2VyO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9tb2RlbHMvdXNlci5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJjcnlwdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImJjcnlwdFwiXG4vLyBtb2R1bGUgaWQgPSAxNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==