UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

242 lines (240 loc) 48.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.WarningMsg = exports.FileUpload = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _reactIntl = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-intl"); var _uploadButton = _interopRequireDefault(require("./upload-button")); var _icons = require("../icons"); var _fileUploadProgress = _interopRequireDefault(require("./file-upload-progress")); var _fileDrop = _interopRequireDefault(require("./file-drop")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _markdownToJsx = _interopRequireDefault(require("markdown-to-jsx")); var _src3 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/localization/src"); var _src4 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/styles/src"); var _linkRenderer = _interopRequireDefault(require("../link-renderer")); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // Breakpoints function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var fileIconColor = '#D3D8E0'; var StyledUploadMessage = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 14px;\n margin-bottom: 12px;\n\n ", ";\n"])), function (props) { return props.theme.textColorLT; }, _src4.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n "])))); var WarningMsg = exports.WarningMsg = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 10px;\n color: ", ";\n font-weight: 500;\n"])), function (props) { return props.theme.errorColor; }); var StyledFileDrop = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n border-radius: 4px;\n border-style: ", ";\n border-width: 1px;\n border-color: ", ";\n text-align: center;\n width: 100%;\n padding: 48px 8px 0;\n height: 360px;\n\n .file-upload-or {\n color: ", ";\n padding-right: 4px;\n }\n\n .file-type-row {\n opacity: 0.5;\n }\n ", ";\n"])), function (props) { return props.dragOver ? 'solid' : 'dashed'; }, function (props) { return props.dragOver ? props.theme.textColorLT : props.theme.subtextColorLT; }, function (props) { return props.theme.linkBtnColor; }, _src4.media.portable(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 16px 4px 0;\n "])))); var MsgWrapper = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"])), function (props) { return props.theme.modalTitleColor; }); var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 48px;\n\n display: flex;\n justify-content: center;\n\n ", ";\n ", ";\n"])), fileIconColor, _src4.media.portable(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _src4.media.palm(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileTypeFow = _styledComponents["default"].div(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n ", ";\n ", ";\n"])), _src4.media.portable(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _src4.media.palm(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileUpload = _styledComponents["default"].div(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["\n .file-drop {\n position: relative;\n }\n"]))); var StyledMessage = _styledComponents["default"].div(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n margin-bottom: 32px;\n\n .loading-action {\n margin-right: 10px;\n }\n .loading-spinner {\n margin-left: 10px;\n }\n"]))); var StyledDragFileWrapper = _styledComponents["default"].div(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 32px;\n ", ";\n ", ";\n"])), _src4.media.portable(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n "]))), _src4.media.portable(_templateObject17 || (_templateObject17 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "])))); var StyledDisclaimer = (0, _styledComponents["default"])(StyledMessage)(_templateObject18 || (_templateObject18 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 auto;\n"]))); function FileUploadFactory() { /** @augments {Component<FileUploadProps>} */ var FileUpload = /*#__PURE__*/function (_Component) { function FileUpload() { var _this; (0, _classCallCheck2["default"])(this, FileUpload); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, FileUpload, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { dragOver: false, fileLoading: false, files: [], errorFiles: [] }); (0, _defineProperty2["default"])(_this, "frame", (0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "_isValidFileType", function (filename) { var _this$props$fileExten = _this.props.fileExtensions, fileExtensions = _this$props$fileExten === void 0 ? [] : _this$props$fileExten; var fileExt = fileExtensions.find(function (ext) { return filename.endsWith(ext); }); return Boolean(fileExt); }); /** @param {FileList} fileList */ (0, _defineProperty2["default"])(_this, "_handleFileInput", function (fileList, event) { if (event) { event.stopPropagation(); } var files = (0, _toConsumableArray2["default"])(fileList).filter(Boolean); var _this$props$disableEx = _this.props.disableExtensionFilter, disableExtensionFilter = _this$props$disableEx === void 0 ? false : _this$props$disableEx; // TODO - move this code out of the component var filesToLoad = []; var errorFiles = []; var _iterator = _createForOfIteratorHelper(files), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var file = _step.value; if (disableExtensionFilter || _this._isValidFileType(file.name)) { filesToLoad.push(file); } else { errorFiles.push(file.name); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var nextState = { files: filesToLoad, errorFiles: errorFiles, dragOver: false }; _this.setState(nextState, function () { return nextState.files.length ? _this.props.onFileUpload(nextState.files) : null; }); }); (0, _defineProperty2["default"])(_this, "_toggleDragState", function (newState) { _this.setState({ dragOver: newState }); }); return _this; } (0, _inherits2["default"])(FileUpload, _Component); return (0, _createClass2["default"])(FileUpload, [{ key: "render", value: function render() { var _this2 = this; var _this$state = this.state, dragOver = _this$state.dragOver, files = _this$state.files, errorFiles = _this$state.errorFiles; var _this$props = this.props, fileLoading = _this$props.fileLoading, fileLoadingProgress = _this$props.fileLoadingProgress, theme = _this$props.theme, intl = _this$props.intl; var _this$props2 = this.props, _this$props2$fileExte = _this$props2.fileExtensions, fileExtensions = _this$props2$fileExte === void 0 ? [] : _this$props2$fileExte, _this$props2$fileForm = _this$props2.fileFormatNames, fileFormatNames = _this$props2$fileForm === void 0 ? [] : _this$props2$fileForm; var fileUploadInfoText = "".concat(intl.formatMessage({ id: 'fileUploader.configUploadMessage' }, { fileFormatNames: fileFormatNames.map(function (format) { return "**".concat(format, "**"); }).join(', ') }), "(").concat(_src2.GUIDES_FILE_FORMAT_DOC, ")."); return /*#__PURE__*/_react["default"].createElement(StyledFileUpload, { className: "file-uploader", ref: this.frame }, _fileDrop["default"] ? /*#__PURE__*/_react["default"].createElement(_fileDrop["default"], { frame: this.frame.current || document, onDragOver: function onDragOver() { return _this2._toggleDragState(true); }, onDragLeave: function onDragLeave() { return _this2._toggleDragState(false); }, onDrop: this._handleFileInput, className: "file-uploader__file-drop" }, /*#__PURE__*/_react["default"].createElement(StyledUploadMessage, { className: "file-upload__message" }, /*#__PURE__*/_react["default"].createElement(_markdownToJsx["default"], { options: { overrides: { a: { component: _linkRenderer["default"] } } } }, fileUploadInfoText)), /*#__PURE__*/_react["default"].createElement(StyledFileDrop, { dragOver: dragOver }, /*#__PURE__*/_react["default"].createElement(StyledFileTypeFow, { className: "file-type-row" }, fileExtensions.map(function (ext) { return /*#__PURE__*/_react["default"].createElement(_icons.FileType, { key: ext, ext: ext, height: "50px", fontSize: "9px" }); })), fileLoading ? /*#__PURE__*/_react["default"].createElement(_fileUploadProgress["default"], { fileLoadingProgress: fileLoadingProgress, theme: theme }) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { style: { opacity: dragOver ? 0.5 : 1 }, className: "file-upload-display-message" }, /*#__PURE__*/_react["default"].createElement(StyledDragNDropIcon, null, /*#__PURE__*/_react["default"].createElement(_icons.DragNDrop, { height: "44px" })), errorFiles.length ? /*#__PURE__*/_react["default"].createElement(WarningMsg, null, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'fileUploader.fileNotSupported', values: { errorFiles: errorFiles.join(', ') } })) : null), !files.length ? /*#__PURE__*/_react["default"].createElement(StyledDragFileWrapper, null, /*#__PURE__*/_react["default"].createElement(MsgWrapper, null, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'fileUploader.message' })), /*#__PURE__*/_react["default"].createElement("span", { className: "file-upload-or" }, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'fileUploader.or' })), /*#__PURE__*/_react["default"].createElement(_uploadButton["default"], { onUpload: this._handleFileInput }, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'fileUploader.browseFiles' }))) : null, /*#__PURE__*/_react["default"].createElement(StyledDisclaimer, null, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'fileUploader.disclaimer' }))))) : null, /*#__PURE__*/_react["default"].createElement(WarningMsg, null, (0, _src.isChrome)() ? /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'fileUploader.chromeMessage' }) : '')); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { if (state.fileLoading && props.fileLoading === false && state.files.length) { return { files: [], fileLoading: props.fileLoading }; } return { fileLoading: props.fileLoading }; } }]); }(_react.Component); return (0, _reactIntl.injectIntl)(FileUpload); } var _default = exports["default"] = FileUploadFactory; var FileUpload = exports.FileUpload = FileUploadFactory(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RJbnRsIiwiX3VwbG9hZEJ1dHRvbiIsIl9pY29ucyIsIl9maWxlVXBsb2FkUHJvZ3Jlc3MiLCJfZmlsZURyb3AiLCJfc3JjIiwiX3NyYzIiLCJfbWFya2Rvd25Ub0pzeCIsIl9zcmMzIiwiX3NyYzQiLCJfbGlua1JlbmRlcmVyIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl90ZW1wbGF0ZU9iamVjdDYiLCJfdGVtcGxhdGVPYmplY3Q3IiwiX3RlbXBsYXRlT2JqZWN0OCIsIl90ZW1wbGF0ZU9iamVjdDkiLCJfdGVtcGxhdGVPYmplY3QxMCIsIl90ZW1wbGF0ZU9iamVjdDExIiwiX3RlbXBsYXRlT2JqZWN0MTIiLCJfdGVtcGxhdGVPYmplY3QxMyIsIl90ZW1wbGF0ZU9iamVjdDE0IiwiX3RlbXBsYXRlT2JqZWN0MTUiLCJfdGVtcGxhdGVPYmplY3QxNiIsIl90ZW1wbGF0ZU9iamVjdDE3IiwiX3RlbXBsYXRlT2JqZWN0MTgiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJmaWxlSWNvbkNvbG9yIiwiU3R5bGVkVXBsb2FkTWVzc2FnZSIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsInRleHRDb2xvckxUIiwibWVkaWEiLCJwb3J0YWJsZSIsIldhcm5pbmdNc2ciLCJleHBvcnRzIiwic3BhbiIsImVycm9yQ29sb3IiLCJTdHlsZWRGaWxlRHJvcCIsImRyYWdPdmVyIiwic3VidGV4dENvbG9yTFQiLCJsaW5rQnRuQ29sb3IiLCJNc2dXcmFwcGVyIiwibW9kYWxUaXRsZUNvbG9yIiwiU3R5bGVkRHJhZ05Ecm9wSWNvbiIsInBhbG0iLCJTdHlsZWRGaWxlVHlwZUZvdyIsIlN0eWxlZEZpbGVVcGxvYWQiLCJTdHlsZWRNZXNzYWdlIiwiU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyIiwiU3R5bGVkRGlzY2xhaW1lciIsIkZpbGVVcGxvYWRGYWN0b3J5IiwiRmlsZVVwbG9hZCIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJndW1lbnRzIiwiYXJncyIsIl9rZXkiLCJjb25jYXQiLCJfZGVmaW5lUHJvcGVydHkyIiwiZmlsZUxvYWRpbmciLCJmaWxlcyIsImVycm9yRmlsZXMiLCJjcmVhdGVSZWYiLCJmaWxlbmFtZSIsIl90aGlzJHByb3BzJGZpbGVFeHRlbiIsImZpbGVFeHRlbnNpb25zIiwiZmlsZUV4dCIsImZpbmQiLCJleHQiLCJlbmRzV2l0aCIsImZpbGVMaXN0IiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZmlsdGVyIiwiX3RoaXMkcHJvcHMkZGlzYWJsZUV4IiwiZGlzYWJsZUV4dGVuc2lvbkZpbHRlciIsImZpbGVzVG9Mb2FkIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJmaWxlIiwiX2lzVmFsaWRGaWxlVHlwZSIsInB1c2giLCJlcnIiLCJuZXh0U3RhdGUiLCJzZXRTdGF0ZSIsIm9uRmlsZVVwbG9hZCIsIm5ld1N0YXRlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJyZW5kZXIiLCJfdGhpczIiLCJfdGhpcyRzdGF0ZSIsInN0YXRlIiwiX3RoaXMkcHJvcHMiLCJmaWxlTG9hZGluZ1Byb2dyZXNzIiwiaW50bCIsIl90aGlzJHByb3BzMiIsIl90aGlzJHByb3BzMiRmaWxlRXh0ZSIsIl90aGlzJHByb3BzMiRmaWxlRm9ybSIsImZpbGVGb3JtYXROYW1lcyIsImZpbGVVcGxvYWRJbmZvVGV4dCIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsIm1hcCIsImZvcm1hdCIsImpvaW4iLCJHVUlERVNfRklMRV9GT1JNQVRfRE9DIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInJlZiIsImZyYW1lIiwiRmlsZURyb3AiLCJjdXJyZW50IiwiZG9jdW1lbnQiLCJvbkRyYWdPdmVyIiwiX3RvZ2dsZURyYWdTdGF0ZSIsIm9uRHJhZ0xlYXZlIiwib25Ecm9wIiwiX2hhbmRsZUZpbGVJbnB1dCIsIm9wdGlvbnMiLCJvdmVycmlkZXMiLCJjb21wb25lbnQiLCJMaW5rUmVuZGVyZXIiLCJGaWxlVHlwZSIsImhlaWdodCIsImZvbnRTaXplIiwiRnJhZ21lbnQiLCJzdHlsZSIsIm9wYWNpdHkiLCJEcmFnTkRyb3AiLCJGb3JtYXR0ZWRNZXNzYWdlIiwidmFsdWVzIiwib25VcGxvYWQiLCJpc0Nocm9tZSIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsIkNvbXBvbmVudCIsImluamVjdEludGwiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NyYy9jb21tb24vZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtpbmplY3RJbnRsLCBXcmFwcGVkQ29tcG9uZW50UHJvcHN9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IFVwbG9hZEJ1dHRvbiBmcm9tICcuL3VwbG9hZC1idXR0b24nO1xuaW1wb3J0IHtEcmFnTkRyb3AsIEZpbGVUeXBlfSBmcm9tICcuLi9pY29ucyc7XG5pbXBvcnQgRmlsZVVwbG9hZFByb2dyZXNzIGZyb20gJy4vZmlsZS11cGxvYWQtcHJvZ3Jlc3MnO1xuaW1wb3J0IEZpbGVEcm9wIGZyb20gJy4vZmlsZS1kcm9wJztcbmltcG9ydCB7RmlsZUxvYWRpbmcsIEZpbGVMb2FkaW5nUHJvZ3Jlc3N9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge2lzQ2hyb21lfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7R1VJREVTX0ZJTEVfRk9STUFUX0RPQ30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IE1hcmtkb3duIGZyb20gJ21hcmtkb3duLXRvLWpzeCc7XG4vLyBCcmVha3BvaW50c1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdAa2VwbGVyLmdsL2xvY2FsaXphdGlvbic7XG5pbXBvcnQge21lZGlhfSBmcm9tICdAa2VwbGVyLmdsL3N0eWxlcyc7XG5cbmltcG9ydCBMaW5rUmVuZGVyZXIgZnJvbSAnLi4vbGluay1yZW5kZXJlcic7XG5cbmNvbnN0IGZpbGVJY29uQ29sb3IgPSAnI0QzRDhFMCc7XG5cbmNvbnN0IFN0eWxlZFVwbG9hZE1lc3NhZ2UgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JMVH07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgYH07XG5gO1xuXG5leHBvcnQgY29uc3QgV2FybmluZ01zZyA9IHN0eWxlZC5zcGFuYFxuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvckNvbG9yfTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbmA7XG5cbmludGVyZmFjZSBTdHlsZWRGaWxlRHJvcFByb3BzIHtcbiAgZHJhZ092ZXI/OiBib29sZWFuO1xufVxuXG5jb25zdCBTdHlsZWRGaWxlRHJvcCA9IHN0eWxlZC5kaXY8U3R5bGVkRmlsZURyb3BQcm9wcz5gXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1zdHlsZTogJHtwcm9wcyA9PiAocHJvcHMuZHJhZ092ZXIgPyAnc29saWQnIDogJ2Rhc2hlZCcpfTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogJHtwcm9wcyA9PiAocHJvcHMuZHJhZ092ZXIgPyBwcm9wcy50aGVtZS50ZXh0Q29sb3JMVCA6IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvckxUKX07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDQ4cHggOHB4IDA7XG4gIGhlaWdodDogMzYwcHg7XG5cbiAgLmZpbGUtdXBsb2FkLW9yIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5saW5rQnRuQ29sb3J9O1xuICAgIHBhZGRpbmctcmlnaHQ6IDRweDtcbiAgfVxuXG4gIC5maWxlLXR5cGUtcm93IHtcbiAgICBvcGFjaXR5OiAwLjU7XG4gIH1cbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBwYWRkaW5nOiAxNnB4IDRweCAwO1xuICBgfTtcbmA7XG5cbmNvbnN0IE1zZ1dyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5tb2RhbFRpdGxlQ29sb3J9O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGhlaWdodDogMzZweDtcbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdORHJvcEljb24gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtmaWxlSWNvbkNvbG9yfTtcbiAgbWFyZ2luLWJvdHRvbTogNDhweDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9O1xuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVUeXBlRm93ID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBgfTtcbiAgJHttZWRpYS5wYWxtYFxuICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgYH07XG5gO1xuXG5jb25zdCBTdHlsZWRGaWxlVXBsb2FkID0gc3R5bGVkLmRpdmBcbiAgLmZpbGUtZHJvcCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRNZXNzYWdlID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1hcmdpbi1ib3R0b206IDMycHg7XG5cbiAgLmxvYWRpbmctYWN0aW9uIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gIH1cbiAgLmxvYWRpbmctc3Bpbm5lciB7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdGaWxlV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi1ib3R0b206IDMycHg7XG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgYH07XG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgYH07XG5gO1xuXG5jb25zdCBTdHlsZWREaXNjbGFpbWVyID0gc3R5bGVkKFN0eWxlZE1lc3NhZ2UpYFxuICBtYXJnaW46IDAgYXV0bztcbmA7XG5cbnR5cGUgRmlsZVVwbG9hZFByb3BzID0ge1xuICBvbkZpbGVVcGxvYWQ6IChmaWxlczogRmlsZVtdKSA9PiB2b2lkO1xuICBmaWxlTG9hZGluZzogRmlsZUxvYWRpbmcgfCBmYWxzZTtcbiAgZmlsZUxvYWRpbmdQcm9ncmVzczogRmlsZUxvYWRpbmdQcm9ncmVzcztcbiAgdGhlbWU6IG9iamVjdDtcbiAgLyoqIEEgbGlzdCBvZiBuYW1lcyBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBzdWl0YWJsZSB0byBwcmVzZW50IHRvIHVzZXIgKi9cbiAgZmlsZUZvcm1hdE5hbWVzPzogc3RyaW5nW107XG4gIC8qKiBBIGxpc3Qgb2YgdHlwaWNhbGx5IDMgbGV0dGVyIGV4dGVuc2lvbnMgKHdpdGhvdXQgJy4nKSBmb3IgZmlsZSBtYXRjaGluZyAqL1xuICBmaWxlRXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xuICAvKiogU2V0IHRvIHRydWUgaWYgYXBwIHdhbnRzIHRvIGRvIGl0cyBvd24gZmlsZSBmaWx0ZXJpbmcgKi9cbiAgZGlzYWJsZUV4dGVuc2lvbkZpbHRlcj86IGJvb2xlYW47XG59ICYgV3JhcHBlZENvbXBvbmVudFByb3BzO1xuXG5mdW5jdGlvbiBGaWxlVXBsb2FkRmFjdG9yeSgpIHtcbiAgLyoqIEBhdWdtZW50cyB7Q29tcG9uZW50PEZpbGVVcGxvYWRQcm9wcz59ICovXG4gIGNsYXNzIEZpbGVVcGxvYWQgZXh0ZW5kcyBDb21wb25lbnQ8RmlsZVVwbG9hZFByb3BzPiB7XG4gICAgc3RhdGUgPSB7XG4gICAgICBkcmFnT3ZlcjogZmFsc2UsXG4gICAgICBmaWxlTG9hZGluZzogZmFsc2UsXG4gICAgICBmaWxlczogW10sXG4gICAgICBlcnJvckZpbGVzOiBbXVxuICAgIH07XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLmZpbGVMb2FkaW5nICYmIHByb3BzLmZpbGVMb2FkaW5nID09PSBmYWxzZSAmJiBzdGF0ZS5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWxlczogW10sXG4gICAgICAgICAgZmlsZUxvYWRpbmc6IHByb3BzLmZpbGVMb2FkaW5nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnJhbWUgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgICBfaXNWYWxpZEZpbGVUeXBlID0gZmlsZW5hbWUgPT4ge1xuICAgICAgY29uc3Qge2ZpbGVFeHRlbnNpb25zID0gW119ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGZpbGVFeHQgPSBmaWxlRXh0ZW5zaW9ucy5maW5kKGV4dCA9PiBmaWxlbmFtZS5lbmRzV2l0aChleHQpKTtcblxuICAgICAgcmV0dXJuIEJvb2xlYW4oZmlsZUV4dCk7XG4gICAgfTtcblxuICAgIC8qKiBAcGFyYW0ge0ZpbGVMaXN0fSBmaWxlTGlzdCAqL1xuICAgIF9oYW5kbGVGaWxlSW5wdXQgPSAoZmlsZUxpc3Q6IEZpbGVMaXN0LCBldmVudDogYW55KSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVzID0gWy4uLmZpbGVMaXN0XS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgIGNvbnN0IHtkaXNhYmxlRXh0ZW5zaW9uRmlsdGVyID0gZmFsc2V9ID0gdGhpcy5wcm9wcztcblxuICAgICAgLy8gVE9ETyAtIG1vdmUgdGhpcyBjb2RlIG91dCBvZiB0aGUgY29tcG9uZW50XG4gICAgICBjb25zdCBmaWxlc1RvTG9hZDogRmlsZVtdID0gW107XG4gICAgICBjb25zdCBlcnJvckZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChkaXNhYmxlRXh0ZW5zaW9uRmlsdGVyIHx8IHRoaXMuX2lzVmFsaWRGaWxlVHlwZShmaWxlLm5hbWUpKSB7XG4gICAgICAgICAgZmlsZXNUb0xvYWQucHVzaChmaWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvckZpbGVzLnB1c2goZmlsZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0U3RhdGUgPSB7ZmlsZXM6IGZpbGVzVG9Mb2FkLCBlcnJvckZpbGVzLCBkcmFnT3ZlcjogZmFsc2V9O1xuXG4gICAgICB0aGlzLnNldFN0YXRlKG5leHRTdGF0ZSwgKCkgPT5cbiAgICAgICAgbmV4dFN0YXRlLmZpbGVzLmxlbmd0aCA/IHRoaXMucHJvcHMub25GaWxlVXBsb2FkKG5leHRTdGF0ZS5maWxlcykgOiBudWxsXG4gICAgICApO1xuICAgIH07XG5cbiAgICBfdG9nZ2xlRHJhZ1N0YXRlID0gbmV3U3RhdGUgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7ZHJhZ092ZXI6IG5ld1N0YXRlfSk7XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtkcmFnT3ZlciwgZmlsZXMsIGVycm9yRmlsZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHtmaWxlTG9hZGluZywgZmlsZUxvYWRpbmdQcm9ncmVzcywgdGhlbWUsIGludGx9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHtmaWxlRXh0ZW5zaW9ucyA9IFtdLCBmaWxlRm9ybWF0TmFtZXMgPSBbXX0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgZmlsZVVwbG9hZEluZm9UZXh0ID0gYCR7aW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdmaWxlVXBsb2FkZXIuY29uZmlnVXBsb2FkTWVzc2FnZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVGb3JtYXROYW1lczogZmlsZUZvcm1hdE5hbWVzLm1hcChmb3JtYXQgPT4gYCoqJHtmb3JtYXR9KipgKS5qb2luKCcsICcpXG4gICAgICAgIH1cbiAgICAgICl9KCR7R1VJREVTX0ZJTEVfRk9STUFUX0RPQ30pLmA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkRmlsZVVwbG9hZCBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZGVyXCIgcmVmPXt0aGlzLmZyYW1lfT5cbiAgICAgICAgICB7RmlsZURyb3AgPyAoXG4gICAgICAgICAgICA8RmlsZURyb3BcbiAgICAgICAgICAgICAgZnJhbWU9e3RoaXMuZnJhbWUuY3VycmVudCB8fCBkb2N1bWVudH1cbiAgICAgICAgICAgICAgb25EcmFnT3Zlcj17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKHRydWUpfVxuICAgICAgICAgICAgICBvbkRyYWdMZWF2ZT17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKGZhbHNlKX1cbiAgICAgICAgICAgICAgb25Ecm9wPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkZXJfX2ZpbGUtZHJvcFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxTdHlsZWRVcGxvYWRNZXNzYWdlIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkX19tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPE1hcmtkb3duXG4gICAgICAgICAgICAgICAgICBvcHRpb25zPXt7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogTGlua1JlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtmaWxlVXBsb2FkSW5mb1RleHR9XG4gICAgICAgICAgICAgICAgPC9NYXJrZG93bj5cbiAgICAgICAgICAgICAgPC9TdHlsZWRVcGxvYWRNZXNzYWdlPlxuICAgICAgICAgICAgICA8U3R5bGVkRmlsZURyb3AgZHJhZ092ZXI9e2RyYWdPdmVyfT5cbiAgICAgICAgICAgICAgICA8U3R5bGVkRmlsZVR5cGVGb3cgY2xhc3NOYW1lPVwiZmlsZS10eXBlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAge2ZpbGVFeHRlbnNpb25zLm1hcChleHQgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8RmlsZVR5cGUga2V5PXtleHR9IGV4dD17ZXh0fSBoZWlnaHQ9XCI1MHB4XCIgZm9udFNpemU9XCI5cHhcIiAvPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRGaWxlVHlwZUZvdz5cbiAgICAgICAgICAgICAgICB7ZmlsZUxvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICA8RmlsZVVwbG9hZFByb2dyZXNzIGZpbGVMb2FkaW5nUHJvZ3Jlc3M9e2ZpbGVMb2FkaW5nUHJvZ3Jlc3N9IHRoZW1lPXt0aGVtZX0gLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7b3BhY2l0eTogZHJhZ092ZXIgPyAwLjUgOiAxfX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZC1kaXNwbGF5LW1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZERyYWdORHJvcEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJhZ05Ecm9wIGhlaWdodD1cIjQ0cHhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRHJhZ05Ecm9wSWNvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIHtlcnJvckZpbGVzLmxlbmd0aCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxXYXJuaW5nTXNnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPXsnZmlsZVVwbG9hZGVyLmZpbGVOb3RTdXBwb3J0ZWQnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz17e2Vycm9yRmlsZXM6IGVycm9yRmlsZXMuam9pbignLCAnKX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1dhcm5pbmdNc2c+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB7IWZpbGVzLmxlbmd0aCA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkRHJhZ0ZpbGVXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPE1zZ1dyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLm1lc3NhZ2UnfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Nc2dXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmlsZS11cGxvYWQtb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWxlVXBsb2FkZXIub3InfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFVwbG9hZEJ1dHRvbiBvblVwbG9hZD17dGhpcy5faGFuZGxlRmlsZUlucHV0fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWxlVXBsb2FkZXIuYnJvd3NlRmlsZXMnfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9VcGxvYWRCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWREcmFnRmlsZVdyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWREaXNjbGFpbWVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLmRpc2NsYWltZXInfSAvPlxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZERpc2NsYWltZXI+XG4gICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L1N0eWxlZEZpbGVEcm9wPlxuICAgICAgICAgICAgPC9GaWxlRHJvcD5cbiAgICAgICAgICApIDogbnVsbH1cblxuICAgICAgICAgIDxXYXJuaW5nTXNnPlxuICAgICAgICAgICAge2lzQ2hyb21lKCkgPyA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci5jaHJvbWVNZXNzYWdlJ30gLz4gOiAnJ31cbiAgICAgICAgICA8L1dhcm5pbmdNc2c+XG4gICAgICAgIDwvU3R5bGVkRmlsZVVwbG9hZD5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluamVjdEludGwoRmlsZVVwbG9hZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVVcGxvYWRGYWN0b3J5O1xuZXhwb3J0IGNvbnN0IEZpbGVVcGxvYWQgPSBGaWxlVXBsb2FkRmFjdG9yeSgpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGFBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLG1CQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxTQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBUSxJQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxLQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxjQUFBLEdBQUFSLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBVyxLQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxLQUFBLEdBQUFaLE9BQUE7QUFFQSxJQUFBYSxhQUFBLEdBQUFYLHNCQUFBLENBQUFGLE9BQUE7QUFBNEMsSUFBQWMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxp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