UNPKG

kepler.gl

Version:

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

282 lines (277 loc) 41.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = 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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _meshLayers = require("@deck.gl/mesh-layers"); var _engine = require("@luma.gl/engine"); var _rasterMeshLayerShaders = require("./raster-mesh-layer-shaders"); var _rasterLayerShaders = require("../raster-layer/raster-layer-shaders"); var _images = require("../images"); var _util = require("../util"); var _pipelineValidationPatch = require("../pipeline-validation-patch"); var _constants = require("@kepler.gl/constants"); 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; })(); } function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function validateGeometryAttributes(attributes) { if (!(attributes.positions || attributes.POSITION)) { throw new Error('RasterMeshLayer requires "positions" or "POSITION" attribute in mesh property.'); } } /* * Convert mesh data into geometry * @returns geometry */ function getGeometry(data) { if ('attributes' in data && data.attributes) { validateGeometryAttributes(data.attributes); if (data instanceof _engine.Geometry) { return data; } return new _engine.Geometry(data); } else if ('positions' in data || 'POSITION' in data) { validateGeometryAttributes(data); return new _engine.Geometry({ attributes: data }); } throw Error('Invalid mesh'); } var defaultProps = _objectSpread(_objectSpread({}, _meshLayers.SimpleMeshLayer.defaultProps), {}, { modules: { type: 'array', value: [], compare: true }, images: { type: 'object', value: {}, compare: true }, moduleProps: { type: 'object', value: {}, compare: true }, onRedrawNeeded: { type: 'function', value: null, compare: false } }); var RasterMeshLayer = exports["default"] = /*#__PURE__*/function (_SimpleMeshLayer) { function RasterMeshLayer() { var _this; (0, _classCallCheck2["default"])(this, RasterMeshLayer); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, RasterMeshLayer, [].concat(args)); (0, _defineProperty2["default"])(_this, "_redrawScheduled", false); return _this; } (0, _inherits2["default"])(RasterMeshLayer, _SimpleMeshLayer); return (0, _createClass2["default"])(RasterMeshLayer, [{ key: "initializeState", value: function initializeState() { (0, _pipelineValidationPatch.patchPipelineValidation)(); (0, _rasterLayerShaders.ensureRasterHooksRegistered)(); this.setState({ images: {} }); _superPropGet(RasterMeshLayer, "initializeState", this, 3)([]); } }, { key: "getShaders", value: function getShaders() { var _this$props$modules = this.props.modules, modules = _this$props$modules === void 0 ? [] : _this$props$modules; var lumaModules = (0, _rasterLayerShaders.prepareLumaModules)(modules); var parentShaders = _superPropGet(RasterMeshLayer, "getShaders", this, 3)([]); return _objectSpread(_objectSpread({}, parentShaders), {}, { vs: (0, _rasterMeshLayerShaders.buildRasterMeshVertexShader)(), fs: (0, _rasterMeshLayerShaders.buildRasterMeshFragmentShader)(), modules: [].concat((0, _toConsumableArray2["default"])(parentShaders.modules || []), [_rasterMeshLayerShaders.rasterMeshUniforms], (0, _toConsumableArray2["default"])(lumaModules)) }); } // eslint-disable-next-line complexity }, { key: "updateState", value: function updateState(params) { var props = params.props, oldProps = params.oldProps, changeFlags = params.changeFlags, context = params.context; _superPropGet(RasterMeshLayer, "updateState", this, 3)([{ props: props, oldProps: oldProps, changeFlags: changeFlags, context: context }]); var modules = props && props.modules; var oldModules = oldProps && oldProps.modules; if (props.mesh !== oldProps.mesh || changeFlags.extensionsChanged || !(0, _util.modulesEqual)(modules, oldModules)) { var _this$getAttributeMan; if (this.state.model) { var _this$state$model$des, _this$state$model; (_this$state$model$des = (_this$state$model = this.state.model).destroy) === null || _this$state$model$des === void 0 || _this$state$model$des.call(_this$state$model); } if (props.mesh) { this.state.model = this.getModel(props.mesh); var attributes = props.mesh.attributes || props.mesh; this.setState({ hasNormals: Boolean(attributes.NORMAL || attributes.normals) }); } (_this$getAttributeMan = this.getAttributeManager()) === null || _this$getAttributeMan === void 0 || _this$getAttributeMan.invalidateAll(); } if (props && props.images) { this.updateImages({ props: props, oldProps: oldProps }); } if (this.state.model) { var _this$state$model$set, _this$state$model2; (_this$state$model$set = (_this$state$model2 = this.state.model).setTopology) === null || _this$state$model$set === void 0 || _this$state$model$set.call(_this$state$model2, this.props.wireframe ? _constants.TOPOLOGY.LINE_STRIP : _constants.TOPOLOGY.TRIANGLE_LIST); } } }, { key: "updateImages", value: function updateImages(_ref) { var props = _ref.props, oldProps = _ref.oldProps; var images = this.state.images; var device = this.context.device; var gl = (device === null || device === void 0 ? void 0 : device.gl) || this.context.gl; var newImages = (0, _images.loadImages)({ gl: gl, device: device, images: images, imagesData: props.images, oldImagesData: oldProps.images }); if (newImages) { this.setState({ images: newImages }); } } }, { key: "draw", value: function draw(_opts) { var _this$props$opacity; var _this$state = this.state, model = _this$state.model, images = _this$state.images; var moduleProps = this.props.moduleProps; if (!model || !images || Object.keys(images).length === 0 || !Object.values(images).every(function (item) { return item; })) { return; } // Set mesh-specific UBO uniforms model.shaderInputs.setProps({ rasterMesh: { meshOpacity: (_this$props$opacity = this.props.opacity) !== null && _this$props$opacity !== void 0 ? _this$props$opacity : 1, meshFlatShading: !this.state.hasNormals ? 1.0 : 0.0 } }); // Set props for each custom module through shaderInputs. // Call getUniforms ourselves to skip inactive modules (null return), // avoiding the ShaderInputs null-fallback that would dump all textures // into bindings every frame. var allModuleProps = _objectSpread(_objectSpread({}, moduleProps), images); var modules = this.props.modules || []; var _iterator = _createForOfIteratorHelper(modules), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var mod = _step.value; if (mod.getUniforms) { var result = mod.getUniforms(allModuleProps); if (result) { model.shaderInputs.setProps((0, _defineProperty2["default"])({}, mod.name, result)); } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var drawSuccess = model.draw(this.context.renderPass); if (!drawSuccess) { this._scheduleRedraw(); } } }, { key: "_scheduleRedraw", value: function _scheduleRedraw() { var _this2 = this; if (this._redrawScheduled) return; this._redrawScheduled = true; requestAnimationFrame(function () { var _this2$context$layerM; _this2._redrawScheduled = false; if (_this2.context.deck) { // @ts-expect-error accessing private deck.gl property _this2.context.deck._needsRedraw = 'RasterMeshLayer pipeline pending'; } (_this2$context$layerM = _this2.context.layerManager) === null || _this2$context$layerM === void 0 || _this2$context$layerM.setNeedsRedraw('RasterMeshLayer pipeline pending'); if (typeof _this2.props.onRedrawNeeded === 'function') { _this2.props.onRedrawNeeded(); } }); } }, { key: "finalizeState", value: function finalizeState() { _superPropGet(RasterMeshLayer, "finalizeState", this, 3)([this.context]); if (this.state.images) { for (var _i = 0, _Object$values = Object.values(this.state.images); _i < _Object$values.length; _i++) { var image = _Object$values[_i]; if (Array.isArray(image)) { image.map(function (x) { var _x$delete; return x && (x.destroy ? x.destroy() : (_x$delete = x["delete"]) === null || _x$delete === void 0 ? void 0 : _x$delete.call(x)); }); } else if (image) { var _image$delete; image.destroy ? image.destroy() : (_image$delete = image["delete"]) === null || _image$delete === void 0 ? void 0 : _image$delete.call(image); } } } } }, { key: "getModel", value: function getModel(mesh) { var device = this.context.device || this.context.gl; var model = new _engine.Model(device, Object.assign({}, this.getShaders(), { id: this.props.id, geometry: getGeometry(mesh), isInstanced: false })); return model; } }]); }(_meshLayers.SimpleMeshLayer); RasterMeshLayer.layerName = 'RasterMeshLayer'; RasterMeshLayer.defaultProps = defaultProps; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWVzaExheWVycyIsInJlcXVpcmUiLCJfZW5naW5lIiwiX3Jhc3Rlck1lc2hMYXllclNoYWRlcnMiLCJfcmFzdGVyTGF5ZXJTaGFkZXJzIiwiX2ltYWdlcyIsIl91dGlsIiwiX3BpcGVsaW5lVmFsaWRhdGlvblBhdGNoIiwiX2NvbnN0YW50cyIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWxpZGF0ZUdlb21ldHJ5QXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJwb3NpdGlvbnMiLCJQT1NJVElPTiIsIkVycm9yIiwiZ2V0R2VvbWV0cnkiLCJkYXRhIiwiR2VvbWV0cnkiLCJkZWZhdWx0UHJvcHMiLCJTaW1wbGVNZXNoTGF5ZXIiLCJtb2R1bGVzIiwidHlwZSIsImNvbXBhcmUiLCJpbWFnZXMiLCJtb2R1bGVQcm9wcyIsIm9uUmVkcmF3TmVlZGVkIiwiUmFzdGVyTWVzaExheWVyIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIl9rZXkiLCJjb25jYXQiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImluaXRpYWxpemVTdGF0ZSIsInBhdGNoUGlwZWxpbmVWYWxpZGF0aW9uIiwiZW5zdXJlUmFzdGVySG9va3NSZWdpc3RlcmVkIiwic2V0U3RhdGUiLCJnZXRTaGFkZXJzIiwiX3RoaXMkcHJvcHMkbW9kdWxlcyIsInByb3BzIiwibHVtYU1vZHVsZXMiLCJwcmVwYXJlTHVtYU1vZHVsZXMiLCJwYXJlbnRTaGFkZXJzIiwidnMiLCJidWlsZFJhc3Rlck1lc2hWZXJ0ZXhTaGFkZXIiLCJmcyIsImJ1aWxkUmFzdGVyTWVzaEZyYWdtZW50U2hhZGVyIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInJhc3Rlck1lc2hVbmlmb3JtcyIsInVwZGF0ZVN0YXRlIiwicGFyYW1zIiwib2xkUHJvcHMiLCJjaGFuZ2VGbGFncyIsImNvbnRleHQiLCJvbGRNb2R1bGVzIiwibWVzaCIsImV4dGVuc2lvbnNDaGFuZ2VkIiwibW9kdWxlc0VxdWFsIiwiX3RoaXMkZ2V0QXR0cmlidXRlTWFuIiwic3RhdGUiLCJtb2RlbCIsIl90aGlzJHN0YXRlJG1vZGVsJGRlcyIsIl90aGlzJHN0YXRlJG1vZGVsIiwiZGVzdHJveSIsImdldE1vZGVsIiwiaGFzTm9ybWFscyIsIk5PUk1BTCIsIm5vcm1hbHMiLCJnZXRBdHRyaWJ1dGVNYW5hZ2VyIiwiaW52YWxpZGF0ZUFsbCIsInVwZGF0ZUltYWdlcyIsIl90aGlzJHN0YXRlJG1vZGVsJHNldCIsIl90aGlzJHN0YXRlJG1vZGVsMiIsInNldFRvcG9sb2d5Iiwid2lyZWZyYW1lIiwiVE9QT0xPR1kiLCJMSU5FX1NUUklQIiwiVFJJQU5HTEVfTElTVCIsIl9yZWYiLCJkZXZpY2UiLCJnbCIsIm5ld0ltYWdlcyIsImxvYWRJbWFnZXMiLCJpbWFnZXNEYXRhIiwib2xkSW1hZ2VzRGF0YSIsImRyYXciLCJfb3B0cyIsIl90aGlzJHByb3BzJG9wYWNpdHkiLCJfdGhpcyRzdGF0ZSIsInZhbHVlcyIsImV2ZXJ5IiwiaXRlbSIsInNoYWRlcklucHV0cyIsInNldFByb3BzIiwicmFzdGVyTWVzaCIsIm1lc2hPcGFjaXR5Iiwib3BhY2l0eSIsIm1lc2hGbGF0U2hhZGluZyIsImFsbE1vZHVsZVByb3BzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJtb2QiLCJnZXRVbmlmb3JtcyIsInJlc3VsdCIsImVyciIsImRyYXdTdWNjZXNzIiwicmVuZGVyUGFzcyIsIl9zY2hlZHVsZVJlZHJhdyIsIl90aGlzMiIsIl9yZWRyYXdTY2hlZHVsZWQiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJfdGhpczIkY29udGV4dCRsYXllck0iLCJkZWNrIiwiX25lZWRzUmVkcmF3IiwibGF5ZXJNYW5hZ2VyIiwic2V0TmVlZHNSZWRyYXciLCJmaW5hbGl6ZVN0YXRlIiwiX2kiLCJfT2JqZWN0JHZhbHVlcyIsImltYWdlIiwibWFwIiwieCIsIl94JGRlbGV0ZSIsIl9pbWFnZSRkZWxldGUiLCJNb2RlbCIsImFzc2lnbiIsImlkIiwiZ2VvbWV0cnkiLCJpc0luc3RhbmNlZCIsImxheWVyTmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYXN0ZXIvcmFzdGVyLW1lc2gtbGF5ZXIvcmFzdGVyLW1lc2gtbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtVcGRhdGVQYXJhbWV0ZXJzfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7U2ltcGxlTWVzaExheWVyLCBTaW1wbGVNZXNoTGF5ZXJQcm9wc30gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtHZW9tZXRyeX0gZnJvbSAnQGx1bWEuZ2wvZW5naW5lJztcbmltcG9ydCB7TW9kZWx9IGZyb20gJ0BsdW1hLmdsL2VuZ2luZSc7XG5cbmltcG9ydCB7XG4gIGJ1aWxkUmFzdGVyTWVzaEZyYWdtZW50U2hhZGVyLFxuICBidWlsZFJhc3Rlck1lc2hWZXJ0ZXhTaGFkZXIsXG4gIHJhc3Rlck1lc2hVbmlmb3Jtc1xufSBmcm9tICcuL3Jhc3Rlci1tZXNoLWxheWVyLXNoYWRlcnMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlUmFzdGVySG9va3NSZWdpc3RlcmVkLFxuICBwcmVwYXJlTHVtYU1vZHVsZXNcbn0gZnJvbSAnLi4vcmFzdGVyLWxheWVyL3Jhc3Rlci1sYXllci1zaGFkZXJzJztcbmltcG9ydCB7bG9hZEltYWdlc30gZnJvbSAnLi4vaW1hZ2VzJztcbmltcG9ydCB0eXBlIHtSYXN0ZXJMYXllckFkZGVkUHJvcHMsIEltYWdlU3RhdGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7bW9kdWxlc0VxdWFsfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7cGF0Y2hQaXBlbGluZVZhbGlkYXRpb259IGZyb20gJy4uL3BpcGVsaW5lLXZhbGlkYXRpb24tcGF0Y2gnO1xuaW1wb3J0IHtUT1BPTE9HWX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG50eXBlIE1lc2ggPSBTaW1wbGVNZXNoTGF5ZXJQcm9wc1snbWVzaCddO1xuXG5pbnRlcmZhY2UgTWVzaERhdGEge1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBvc2l0aW9ucz86IHVua25vd247XG4gIFBPU0lUSU9OPzogdW5rbm93bjtcbiAgTk9STUFMPzogdW5rbm93bjtcbiAgbm9ybWFscz86IHVua25vd247XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlR2VvbWV0cnlBdHRyaWJ1dGVzKGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gIGlmICghKGF0dHJpYnV0ZXMucG9zaXRpb25zIHx8IGF0dHJpYnV0ZXMuUE9TSVRJT04pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1Jhc3Rlck1lc2hMYXllciByZXF1aXJlcyBcInBvc2l0aW9uc1wiIG9yIFwiUE9TSVRJT05cIiBhdHRyaWJ1dGUgaW4gbWVzaCBwcm9wZXJ0eS4nXG4gICAgKTtcbiAgfVxufVxuXG4vKlxuICogQ29udmVydCBtZXNoIGRhdGEgaW50byBnZW9tZXRyeVxuICogQHJldHVybnMgZ2VvbWV0cnlcbiAqL1xuZnVuY3Rpb24gZ2V0R2VvbWV0cnkoZGF0YTogTWVzaERhdGEgfCBHZW9tZXRyeSk6IEdlb21ldHJ5IHtcbiAgaWYgKCdhdHRyaWJ1dGVzJyBpbiBkYXRhICYmIGRhdGEuYXR0cmlidXRlcykge1xuICAgIHZhbGlkYXRlR2VvbWV0cnlBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcyk7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBHZW9tZXRyeSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgR2VvbWV0cnkoZGF0YSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEdlb21ldHJ5PlswXSk7XG4gIH0gZWxzZSBpZiAoJ3Bvc2l0aW9ucycgaW4gZGF0YSB8fCAnUE9TSVRJT04nIGluIGRhdGEpIHtcbiAgICB2YWxpZGF0ZUdlb21ldHJ5QXR0cmlidXRlcyhkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICByZXR1cm4gbmV3IEdlb21ldHJ5KHtcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB9IGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgR2VvbWV0cnk+WzBdKTtcbiAgfVxuICB0aHJvdyBFcnJvcignSW52YWxpZCBtZXNoJyk7XG59XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgLi4uU2ltcGxlTWVzaExheWVyLmRlZmF1bHRQcm9wcyxcbiAgbW9kdWxlczoge3R5cGU6ICdhcnJheScsIHZhbHVlOiBbXSwgY29tcGFyZTogdHJ1ZX0sXG4gIGltYWdlczoge3R5cGU6ICdvYmplY3QnLCB2YWx1ZToge30sIGNvbXBhcmU6IHRydWV9LFxuICBtb2R1bGVQcm9wczoge3R5cGU6ICdvYmplY3QnLCB2YWx1ZToge30sIGNvbXBhcmU6IHRydWV9LFxuICBvblJlZHJhd05lZWRlZDoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiBudWxsLCBjb21wYXJlOiBmYWxzZX1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhc3Rlck1lc2hMYXllciBleHRlbmRzIFNpbXBsZU1lc2hMYXllcjxhbnksIFJhc3RlckxheWVyQWRkZWRQcm9wcz4ge1xuICBkZWNsYXJlIHN0YXRlOiBTaW1wbGVNZXNoTGF5ZXI8UmFzdGVyTGF5ZXJBZGRlZFByb3BzPlsnc3RhdGUnXSAmIHtcbiAgICBpbWFnZXM6IEltYWdlU3RhdGU7XG4gIH07XG5cbiAgX3JlZHJhd1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGluaXRpYWxpemVTdGF0ZSgpOiB2b2lkIHtcbiAgICBwYXRjaFBpcGVsaW5lVmFsaWRhdGlvbigpO1xuICAgIGVuc3VyZVJhc3Rlckhvb2tzUmVnaXN0ZXJlZCgpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2ltYWdlczoge319KTtcbiAgICBzdXBlci5pbml0aWFsaXplU3RhdGUoKTtcbiAgfVxuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICBjb25zdCB7bW9kdWxlcyA9IFtdfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBsdW1hTW9kdWxlcyA9IHByZXBhcmVMdW1hTW9kdWxlcyhtb2R1bGVzKTtcbiAgICBjb25zdCBwYXJlbnRTaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcmVudFNoYWRlcnMsXG4gICAgICB2czogYnVpbGRSYXN0ZXJNZXNoVmVydGV4U2hhZGVyKCksXG4gICAgICBmczogYnVpbGRSYXN0ZXJNZXNoRnJhZ21lbnRTaGFkZXIoKSxcbiAgICAgIG1vZHVsZXM6IFsuLi4ocGFyZW50U2hhZGVycy5tb2R1bGVzIHx8IFtdKSwgcmFzdGVyTWVzaFVuaWZvcm1zLCAuLi5sdW1hTW9kdWxlc11cbiAgICB9O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgdXBkYXRlU3RhdGUocGFyYW1zOiBVcGRhdGVQYXJhbWV0ZXJzPFNpbXBsZU1lc2hMYXllcjxhbnksIFJhc3RlckxheWVyQWRkZWRQcm9wcz4+KTogdm9pZCB7XG4gICAgY29uc3Qge3Byb3BzLCBvbGRQcm9wcywgY2hhbmdlRmxhZ3MsIGNvbnRleHR9ID0gcGFyYW1zO1xuICAgIHN1cGVyLnVwZGF0ZVN0YXRlKHtwcm9wcywgb2xkUHJvcHMsIGNoYW5nZUZsYWdzLCBjb250ZXh0fSk7XG5cbiAgICBjb25zdCBtb2R1bGVzID0gcHJvcHMgJiYgcHJvcHMubW9kdWxlcztcbiAgICBjb25zdCBvbGRNb2R1bGVzID0gb2xkUHJvcHMgJiYgb2xkUHJvcHMubW9kdWxlcztcblxuICAgIGlmIChcbiAgICAgIHByb3BzLm1lc2ggIT09IG9sZFByb3BzLm1lc2ggfHxcbiAgICAgIGNoYW5nZUZsYWdzLmV4dGVuc2lvbnNDaGFuZ2VkIHx8XG4gICAgICAhbW9kdWxlc0VxdWFsKG1vZHVsZXMsIG9sZE1vZHVsZXMpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5tb2RlbCkge1xuICAgICAgICB0aGlzLnN0YXRlLm1vZGVsLmRlc3Ryb3k/LigpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLm1lc2gpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb2RlbCA9IHRoaXMuZ2V0TW9kZWwocHJvcHMubWVzaCBhcyBNZXNoKTtcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gKChwcm9wcy5tZXNoIGFzIE1lc2hEYXRhKS5hdHRyaWJ1dGVzIHx8IHByb3BzLm1lc2gpIGFzIE1lc2hEYXRhO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBoYXNOb3JtYWxzOiBCb29sZWFuKGF0dHJpYnV0ZXMuTk9STUFMIHx8IGF0dHJpYnV0ZXMubm9ybWFscylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZU1hbmFnZXIoKT8uaW52YWxpZGF0ZUFsbCgpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAmJiBwcm9wcy5pbWFnZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlSW1hZ2VzKHtwcm9wcywgb2xkUHJvcHN9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5tb2RlbCkge1xuICAgICAgdGhpcy5zdGF0ZS5tb2RlbC5zZXRUb3BvbG9neT8uKFxuICAgICAgICB0aGlzLnByb3BzLndpcmVmcmFtZSA/IFRPUE9MT0dZLkxJTkVfU1RSSVAgOiBUT1BPTE9HWS5UUklBTkdMRV9MSVNUXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUltYWdlcyh7XG4gICAgcHJvcHMsXG4gICAgb2xkUHJvcHNcbiAgfToge1xuICAgIHByb3BzOiBSYXN0ZXJMYXllckFkZGVkUHJvcHM7XG4gICAgb2xkUHJvcHM6IFJhc3RlckxheWVyQWRkZWRQcm9wcztcbiAgfSk6IHZvaWQge1xuICAgIGNvbnN0IHtpbWFnZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBkZXZpY2UgPSB0aGlzLmNvbnRleHQuZGV2aWNlO1xuICAgIGNvbnN0IGdsID0gZGV2aWNlPy5nbCB8fCB0aGlzLmNvbnRleHQuZ2w7XG5cbiAgICBjb25zdCBuZXdJbWFnZXMgPSBsb2FkSW1hZ2VzKHtcbiAgICAgIGdsLFxuICAgICAgZGV2aWNlLFxuICAgICAgaW1hZ2VzLFxuICAgICAgaW1hZ2VzRGF0YTogcHJvcHMuaW1hZ2VzLFxuICAgICAgb2xkSW1hZ2VzRGF0YTogb2xkUHJvcHMuaW1hZ2VzXG4gICAgfSk7XG5cbiAgICBpZiAobmV3SW1hZ2VzKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZXM6IG5ld0ltYWdlc30pO1xuICAgIH1cbiAgfVxuXG4gIGRyYXcoX29wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgY29uc3Qge21vZGVsLCBpbWFnZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7bW9kdWxlUHJvcHN9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmIChcbiAgICAgICFtb2RlbCB8fFxuICAgICAgIWltYWdlcyB8fFxuICAgICAgT2JqZWN0LmtleXMoaW1hZ2VzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICFPYmplY3QudmFsdWVzKGltYWdlcykuZXZlcnkoaXRlbSA9PiBpdGVtKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldCBtZXNoLXNwZWNpZmljIFVCTyB1bmlmb3Jtc1xuICAgIG1vZGVsLnNoYWRlcklucHV0cy5zZXRQcm9wcyh7XG4gICAgICByYXN0ZXJNZXNoOiB7XG4gICAgICAgIG1lc2hPcGFjaXR5OiB0aGlzLnByb3BzLm9wYWNpdHkgPz8gMSxcbiAgICAgICAgbWVzaEZsYXRTaGFkaW5nOiAhdGhpcy5zdGF0ZS5oYXNOb3JtYWxzID8gMS4wIDogMC4wXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgcHJvcHMgZm9yIGVhY2ggY3VzdG9tIG1vZHVsZSB0aHJvdWdoIHNoYWRlcklucHV0cy5cbiAgICAvLyBDYWxsIGdldFVuaWZvcm1zIG91cnNlbHZlcyB0byBza2lwIGluYWN0aXZlIG1vZHVsZXMgKG51bGwgcmV0dXJuKSxcbiAgICAvLyBhdm9pZGluZyB0aGUgU2hhZGVySW5wdXRzIG51bGwtZmFsbGJhY2sgdGhhdCB3b3VsZCBkdW1wIGFsbCB0ZXh0dXJlc1xuICAgIC8vIGludG8gYmluZGluZ3MgZXZlcnkgZnJhbWUuXG4gICAgY29uc3QgYWxsTW9kdWxlUHJvcHMgPSB7Li4ubW9kdWxlUHJvcHMsIC4uLmltYWdlc307XG4gICAgY29uc3QgbW9kdWxlcyA9IHRoaXMucHJvcHMubW9kdWxlcyB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgICBpZiAobW9kLmdldFVuaWZvcm1zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG1vZC5nZXRVbmlmb3JtcyhhbGxNb2R1bGVQcm9wcyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBtb2RlbC5zaGFkZXJJbnB1dHMuc2V0UHJvcHMoe1ttb2QubmFtZV06IHJlc3VsdH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHJhd1N1Y2Nlc3MgPSBtb2RlbC5kcmF3KHRoaXMuY29udGV4dC5yZW5kZXJQYXNzKTtcbiAgICBpZiAoIWRyYXdTdWNjZXNzKSB7XG4gICAgICB0aGlzLl9zY2hlZHVsZVJlZHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIF9zY2hlZHVsZVJlZHJhdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVkcmF3U2NoZWR1bGVkKSByZXR1cm47XG4gICAgdGhpcy5fcmVkcmF3U2NoZWR1bGVkID0gdHJ1ZTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVkcmF3U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5jb250ZXh0LmRlY2spIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBhY2Nlc3NpbmcgcHJpdmF0ZSBkZWNrLmdsIHByb3BlcnR5XG4gICAgICAgIHRoaXMuY29udGV4dC5kZWNrLl9uZWVkc1JlZHJhdyA9ICdSYXN0ZXJNZXNoTGF5ZXIgcGlwZWxpbmUgcGVuZGluZyc7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRleHQubGF5ZXJNYW5hZ2VyPy5zZXROZWVkc1JlZHJhdygnUmFzdGVyTWVzaExheWVyIHBpcGVsaW5lIHBlbmRpbmcnKTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vblJlZHJhd05lZWRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnByb3BzLm9uUmVkcmF3TmVlZGVkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmaW5hbGl6ZVN0YXRlKCk6IHZvaWQge1xuICAgIHN1cGVyLmZpbmFsaXplU3RhdGUodGhpcy5jb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmltYWdlcykge1xuICAgICAgZm9yIChjb25zdCBpbWFnZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3RhdGUuaW1hZ2VzKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbWFnZSkpIHtcbiAgICAgICAgICBpbWFnZS5tYXAoeCA9PiB4ICYmICh4LmRlc3Ryb3kgPyB4LmRlc3Ryb3koKSA6IHguZGVsZXRlPy4oKSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGltYWdlKSB7XG4gICAgICAgICAgaW1hZ2UuZGVzdHJveSA/IGltYWdlLmRlc3Ryb3koKSA6IGltYWdlLmRlbGV0ZT8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TW9kZWwobWVzaDogTWVzaCk6IE1vZGVsIHtcbiAgICBjb25zdCBkZXZpY2UgPSB0aGlzLmNvbnRleHQuZGV2aWNlIHx8IHRoaXMuY29udGV4dC5nbDtcblxuICAgIGNvbnN0IG1vZGVsID0gbmV3IE1vZGVsKFxuICAgICAgZGV2aWNlLFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5nZXRTaGFkZXJzKCksIHtcbiAgICAgICAgaWQ6IHRoaXMucHJvcHMuaWQsXG4gICAgICAgIGdlb21ldHJ5OiBnZXRHZW9tZXRyeShtZXNoIGFzIE1lc2hEYXRhIHwgR2VvbWV0cnkpLFxuICAgICAgICBpc0luc3RhbmNlZDogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxufVxuXG5SYXN0ZXJNZXNoTGF5ZXIubGF5ZXJOYW1lID0gJ1Jhc3Rlck1lc2hMYXllcic7XG5SYXN0ZXJNZXNoTGF5ZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxXQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFHQSxJQUFBRSx1QkFBQSxHQUFBRixPQUFBO0FBS0EsSUFBQUcsbUJBQUEsR0FBQUgsT0FBQTtBQUlBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLHdCQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxVQUFBLEdBQUFQLE9BQUE7QUFBOEMsU0FBQVEsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFBSywyQkFBQSxDQUFBUCxDQUFBLE1BQUFDLENBQUEsSUFBQUQsQ0FBQSx1QkFBQUEsQ0FBQSxDQUFBUSxNQUFBLElBQUFOLENBQUEsS0FBQUYsQ0FBQSxHQUFBRSxDQUFBLE9BQUFPLEVBQUEsTUFBQUMsQ0FBQSxZQUFBQSxFQUFBLGVBQUFDLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFBLEVBQUEsV0FBQUgsRUFBQSxJQUFBVCxDQUFBLENBQUFRLE1BQUEsS0FBQUssSUFBQSxXQUFBQSxJQUFBLE1BQUFDLEtBQUEsRUFBQWQsQ0FBQSxDQUFBUyxFQUFBLFVBQUFSLENBQUEsV0FBQUEsRUFBQUQsQ0FBQSxVQUFBQSxDQUFBLEtBQUFlLENBQUEsRUFBQUwsQ0FBQSxnQkFBQU0sU0FBQSxpSkFBQUMsQ0FBQSxFQUFBQyxDQUFBLE9BQUFDLENBQUEsZ0JBQUFSLENBQUEsV0FBQUEsRUFBQSxJQUFBVCxDQUFBLEdBQUFBLENBQUEsQ0FBQWtCLElBQUEsQ0FBQXBCLENBQUEsTUFBQVksQ0FBQSxXQUFBQSxFQUFBLFFBQUFaLENBQUEsR0FBQUUsQ0FBQSxDQUFBbUIsSUFBQSxXQUFBSCxDQUFBLEdBQUFsQixDQUFBLENBQUFhLElBQUEsRUFBQWIsQ0FBQSxLQUFBQyxDQUFBLFdBQUFBLEVBQUFELENBQUEsSUFBQW1CLENBQUEsT0FBQUYsQ0FBQSxHQUFBakIsQ0FBQSxLQUFBZSxDQUFBLFdBQUFBLEVBQUEsVUFBQUcsQ0FBQSxZQUFBaEIsQ0FBQSxjQUFBQSxDQUFBLDhCQUFBaUIsQ0FBQSxRQUFBRixDQUFBO0FBQUEsU0FBQVYsNEJBQUFQLENBQUEsRUFBQWtCLENBQUEsUUFBQWxCLENBQUEsMkJBQUFBLENBQUEsU0FBQXNCLGlCQUFBLENBQUF0QixDQUFBLEVBQUFrQixDQUFBLE9BQUFoQixDQUFBLE1BQUFxQixRQUFBLENBQUFILElBQUEsQ0FBQXBCLENBQUEsRUFBQXdCLEtBQUEsNkJBQUF0QixDQUFBLElBQUFGLENBQUEsQ0FBQXlCLFdBQUEsS0FBQXZCLENBQUEsR0FBQUYsQ0FBQSxDQUFBeUIsV0FBQSxDQUFBQyxJQUFBLGFBQUF4QixDQUFBLGNBQUFBLENBQUEsR0FBQUcsS0FBQSxDQUFBc0IsSUFBQSxDQUFBM0IsQ0FBQSxvQkFBQUUsQ0FBQSwrQ0FBQTBCLElBQUEsQ0FBQTFCLENBQUEsSUFBQW9CLGlCQUFBLENBQUF0QixDQUFBLEVBQUFrQixDQUFBO0FBQUEsU0FBQUksa0JBQUF0QixDQUFBLEVBQUFrQixDQUFBLGFBQUFBLENBQUEsSUFBQUEsQ0FBQSxHQUFBbEIsQ0FBQSxDQUFBUSxNQUFBLE1BQUFVLENBQUEsR0FBQWxCLENBQUEsQ0FBQVEsTUFBQSxZQUFBUCxDQUFBLE1BQUFXLENBQUEsR0FBQVAsS0FBQSxDQUFBYSxDQUFBLEdBQUFqQixDQUFBLEdBQUFpQixDQUFBLEVBQUFqQixDQUFBLElBQUFXLENBQUEsQ0FBQVgsQ0FBQSxJQUFBRCxDQUFBLENBQUFDLENBQUEsVUFBQVcsQ0FBQTtBQUFBLFNBQUFpQixXQUFBM0IsQ0FBQSxFQUFBZSxDQUFBLEVBQUFoQixDQUFBLFdBQUFnQixDQUFBLE9BQUFhLGdCQUFBLGFBQUFiLENBQUEsT0FBQWMsMkJBQUEsYUFBQTdCLENBQUEsRUFBQThCLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBakIsQ0FBQSxFQUFBaEIsQ0FBQSxZQUFBNkIsZ0JBQUEsYUFBQTVCLENBQUEsRUFBQXVCLFdBQUEsSUFBQVIsQ0FBQSxDQUFBa0IsS0FBQSxDQUFBakMsQ0FBQSxFQUFBRCxDQUFBO0FBQUEsU0FBQStCLDBCQUFBLGNBQUE5QixDQUFBLElBQUFrQyxPQUFBLENBQUFDLFNBQUEsQ0FBQUMsT0FBQSxDQUFBbEIsSUFBQSxDQUFBYSxPQUFBLENBQUFDLFNBQUEsQ0FBQUUsT0FBQSxpQ0FBQWxDLENBQUEsYUFBQThCLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUE5QixDQUFBO0FBQUEsU0FBQXFDLGNBQUFyQyxDQUFBLEVBQUFELENBQUEsRUFBQUQsQ0FBQSxFQUFBaUIsQ0FBQSxRQUFBdUIsQ0FBQSxPQUFBQyxLQUFBLGlCQUFBWCxnQkFBQSxpQkFBQWIsQ0FBQSxHQUFBZixDQUFBLENBQUFtQyxTQUFBLEdBQUFuQyxDQUFBLEdBQUFELENBQUEsRUFBQUQsQ0FBQSxjQUFBaUIsQ0FBQSxhQUFBZixDQUFBLFdBQUFzQyxDQUFBLENBQUFMLEtBQUEsQ0FBQW5DLENBQUEsRUFBQUUsQ0FBQSxPQUFBc0MsQ0FBQTtBQUFBLFNBQUFFLFFBQUF6QyxDQUFBLEVBQUFELENBQUEsUUFBQUUsQ0FBQSxHQUFBeUMsTUFBQSxDQUFBQyxJQUFBLENBQUEzQyxDQUFBLE9BQUEwQyxNQUFBLENBQUFFLHFCQUFBLFFBQUE1QixDQUFBLEdBQUEwQixNQUFBLENBQUFFLHFCQUFBLENBQUE1QyxDQUFBLEdBQUFELENBQUEsS0FBQWlCLENBQUEsR0FBQUEsQ0FBQSxDQUFBNkIsTUFBQSxXQUFBOUMsQ0FBQSxXQUFBMkMsTUFBQSxDQUFBSSx3QkFBQSxDQUFBOUMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFnRCxVQUFBLE9BQUE5QyxDQUFBLENBQUErQyxJQUFBLENBQUFkLEtBQUEsQ0FBQWpDLENBQUEsRUFBQWUsQ0FBQSxZQUFBZixDQUFBO0FBQUEsU0FBQWdELGNBQUFqRCxDQUFBLGFBQUFELENBQUEsTUFBQUEsQ0FBQSxHQUFBbUQsU0FBQSxDQUFBM0MsTUFBQSxFQUFBUixDQUFBLFVBQUFFLENBQUEsV0FBQWlELFNBQUEsQ0FBQW5ELENBQUEsSUFBQW1ELFNBQUEsQ0FBQW5ELENBQUEsUUFBQUEsQ0FBQSxPQUFBMEMsT0FBQSxDQUFBQyxNQUFBLENBQUF6QyxDQUFBLE9BQUFrRCxPQUFBLFdBQUFwRCxDQUFBLFFBQUFxRCxnQkFBQSxhQUFBcEQsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsQ0FBQUYsQ0FBQSxTQUFBMkMsTUFBQSxDQUFBVyx5QkFBQSxHQUFBWCxNQUFBLENBQUFZLGdCQUFBLENBQUF0RCxDQUFBLEVBQUEwQyxNQUFBLENBQUFXLHlCQUFBLENBQUFwRCxDQUFBLEtBQUF3QyxPQUFBLENBQUFDLE1BQUEsQ0FBQXpDLENBQUEsR0FBQWtELE9BQUEsV0FBQXBELENBQUEsSUFBQTJDLE1BQUEsQ0FBQWEsY0FBQSxDQUFBdkQsQ0FBQSxFQUFBRCxDQUFBLEVBQUEyQyxNQUFBLENBQUFJLHdCQUFBLENBQUE3QyxDQUFBLEVBQUFGLENBQUEsaUJBQUFDLENBQUEsSUFyQjlDO0FBQ0E7QUFpQ0EsU0FBU3dELDBCQUEwQkEsQ0FBQ0MsVUFBbUMsRUFBRTtFQUN2RSxJQUFJLEVBQUVBLFVBQVUsQ0FBQ0MsU0FBUyxJQUFJRCxVQUFVLENBQUNFLFFBQVEsQ0FBQyxFQUFFO0lBQ2xELE1BQU0sSUFBSUMsS0FBSyxDQUNiLGdGQUNGLENBQUM7RUFDSDtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsV0FBV0EsQ0FBQ0MsSUFBeUIsRUFBWTtFQUN4RCxJQUFJLFlBQVksSUFBSUEsSUFBSSxJQUFJQSxJQUFJLENBQUNMLFVBQVUsRUFBRTtJQUMzQ0QsMEJBQTBCLENBQUNNLElBQUksQ0FBQ0wsVUFBVSxDQUFDO0lBQzNDLElBQUlLLElBQUksWUFBWUMsZ0JBQVEsRUFBRTtNQUM1QixPQUFPRCxJQUFJO0lBQ2I7SUFDQSxPQUFPLElBQUlDLGdCQUFRLENBQUNELElBQWlELENBQUM7RUFDeEUsQ0FBQyxNQUFNLElBQUksV0FBVyxJQUFJQSxJQUFJLElBQUksVUFBVSxJQUFJQSxJQUFJLEVBQUU7SUFDcEROLDBCQUEwQixDQUFDTSxJQUErQixDQUFDO0lBQzNELE9BQU8sSUFBSUMsZ0JBQVEsQ0FBQztNQUNsQk4sVUFBVSxFQUFFSztJQUNkLENBQThDLENBQUM7RUFDakQ7RUFDQSxNQUFNRixLQUFLLENBQUMsY0FBYyxDQUFDO0FBQzdCO0FBRUEsSUFBTUksWUFBWSxHQUFBZixhQUFBLENBQUFBLGFBQUEsS0FDYmdCLDJCQUFlLENBQUNELFlBQVk7RUFDL0JFLE9BQU8sRUFBRTtJQUFDQyxJQUFJLEVBQUUsT0FBTztJQUFFdEQsS0FBSyxFQUFFLEVBQUU7SUFBRXVELE9BQU8sRUFBRTtFQUFJLENBQUM7RUFDbERDLE1BQU0sRUFBRTtJQUFDRixJQUFJLEVBQUUsUUFBUTtJQUFFdEQsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUFFdUQsT0FBTyxFQUFFO0VBQUksQ0FBQztFQUNsREUsV0FBVyxFQUFFO0lBQUNILElBQUksRUFBRSxRQUFRO0lBQUV0RCxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQUV1RCxPQUFPLEVBQUU7RUFBSSxDQUFDO0VBQ3ZERyxjQUFjLEVBQUU7SUFBQ0osSUFBSSxFQUFFLFVBQVU7SUFBRXRELEtBQUssRUFBRSxJQUFJO0lBQUV1RCxPQUFPLEVBQUU7RUFBSztBQUFDLEVBQ2hFO0FBQUMsSUFFbUJJLGVBQWUsR0FBQUMsT0FBQSxxQ0FBQUMsZ0JBQUE7RUFBQSxTQUFBRixnQkFBQTtJQUFBLElBQUFHLEtBQUE7SUFBQSxJQUFBQyxnQkFBQSxtQkFBQUosZUFBQTtJQUFBLFNBQUFLLElBQUEsR0FBQTNCLFNBQUEsQ0FBQTNDLE1BQUEsRUFBQXVFLElBQUEsT0FBQTFFLEtBQUEsQ0FBQXlFLElBQUEsR0FBQUUsSUFBQSxNQUFBQSxJQUFBLEdBQUFGLElBQUEsRUFBQUUsSUFBQTtNQUFBRCxJQUFBLENBQUFDLElBQUEsSUFBQTdCLFNBQUEsQ0FBQTZCLElBQUE7SUFBQTtJQUFBSixLQUFBLEdBQUEvQyxVQUFBLE9BQUE0QyxlQUFBLEtBQUFRLE1BQUEsQ0FBQUYsSUFBQTtJQUFBLElBQUExQixnQkFBQSxhQUFBdUIsS0FBQSxzQkFLZixLQUFLO0lBQUEsT0FBQUEsS0FBQTtFQUFBO0VBQUEsSUFBQU0sVUFBQSxhQUFBVCxlQUFBLEVBQUFFLGdCQUFBO0VBQUEsV0FBQVEsYUFBQSxhQUFBVixlQUFBO0lBQUFXLEdBQUE7SUFBQXRFLEtBQUEsRUFFeEIsU0FBQXVFLGVBQWVBLENBQUEsRUFBUztNQUN0QixJQUFBQyxnREFBdUIsRUFBQyxDQUFDO01BQ3pCLElBQUFDLCtDQUEyQixFQUFDLENBQUM7TUFDN0IsSUFBSSxDQUFDQyxRQUFRLENBQUM7UUFBQ2xCLE1BQU0sRUFBRSxDQUFDO01BQUMsQ0FBQyxDQUFDO01BQzNCL0IsYUFBQSxDQUFBa0MsZUFBQTtJQUNGO0VBQUM7SUFBQVcsR0FBQTtJQUFBdEUsS0FBQSxFQUVELFNBQUEyRSxVQUFVQSxDQUFBLEVBQVE7TUFDaEIsSUFBQUMsbUJBQUEsR0FBdUIsSUFBSSxDQUFDQyxLQUFLLENBQTFCeEIsT0FBTztRQUFQQSxPQUFPLEdBQUF1QixtQkFBQSxjQUFHLEVBQUUsR0FBQUEsbUJBQUE7TUFFbkIsSUFBTUUsV0FBVyxHQUFHLElBQUFDLHNDQUFrQixFQUFDMUIsT0FBTyxDQUFDO01BQy9DLElBQU0yQixhQUFhLEdBQUF2RCxhQUFBLENBQUFrQyxlQUFBLDRCQUFxQjtNQUV4QyxPQUFBdkIsYUFBQSxDQUFBQSxhQUFBLEtBQ0s0QyxhQUFhO1FBQ2hCQyxFQUFFLEVBQUUsSUFBQUMsbURBQTJCLEVBQUMsQ0FBQztRQUNqQ0MsRUFBRSxFQUFFLElBQUFDLHFEQUE2QixFQUFDLENBQUM7UUFDbkMvQixPQUFPLEtBQUFjLE1BQUEsS0FBQWtCLG1CQUFBLGFBQU9MLGFBQWEsQ0FBQzNCLE9BQU8sSUFBSSxFQUFFLElBQUdpQywwQ0FBa0IsT0FBQUQsbUJBQUEsYUFBS1AsV0FBVztNQUFDO0lBRW5GOztJQUVBO0VBQUE7SUFBQVIsR0FBQTtJQUFBdEUsS0FBQSxFQUNBLFNBQUF1RixXQUFXQSxDQUFDQyxNQUFxRSxFQUFRO01BQ3ZGLElBQU9YLEtBQUssR0FBb0NXLE1BQU0sQ0FBL0NYLEtBQUs7UUFBRVksUUFBUSxHQUEwQkQsTUFBTSxDQUF4Q0MsUUFBUTtRQUFFQyxXQUFXLEdBQWFGLE1BQU0sQ0FBOUJFLFdBQVc7UUFBRUMsT0FBTyxHQUFJSCxNQUFNLENBQWpCRyxPQUFPO01BQzVDbEUsYUFBQSxDQUFBa0MsZUFBQSwyQkFBa0I7UUFBQ2tCLEtBQUssRUFBTEEsS0FBSztRQUFFWSxRQUFRLEVBQVJBLFFBQVE7UUFBRUMsV0FBVyxFQUFYQSxXQUFXO1FBQUVDLE9BQU8sRUFBUEE7TUFBTyxDQUFDO01BRXpELElBQU10QyxPQUFPLEdBQUd3QixLQUFLLElBQUlBLEtBQUssQ0FBQ3hCLE9BQU87TUFDdEMsSUFBTXVDLFVBQVUsR0FBR0gsUUFBUSxJQUFJQSxRQUFRLENBQUNwQyxPQUFPO01BRS9DLElBQ0V3QixLQUFLLENBQUNnQixJQUFJLEtBQUtKLFFBQVEsQ0FBQ0ksSUFBSSxJQUM1QkgsV0FBVyxDQUFDSSxpQkFBaUIsSUFDN0IsQ0FBQyxJQUFBQyxrQkFBWSxFQUFDMUMsT0FBTyxFQUFFdUMsVUFBVSxDQUFDLEVBQ2xDO1FBQUEsSUFBQUkscUJBQUE7UUFDQSxJQUFJLElBQUksQ0FBQ0MsS0FBSyxDQUFDQyxLQUFLLEVBQUU7VUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxpQkFBQTtVQUNwQixDQUFBRCxxQkFBQSxJQUFBQyxpQkFBQSxPQUFJLENBQUNILEtBQUssQ0FBQ0MsS0FBSyxFQUFDRyxPQUFPLGNBQUFGLHFCQUFBLGVBQXhCQSxxQkFBQSxDQUFBN0YsSUFBQSxDQUFBOEYsaUJBQTJCLENBQUM7UUFDOUI7UUFDQSxJQUFJdkIsS0FBSyxDQUFDZ0IsSUFBSSxFQUFFO1VBQ2QsSUFBSSxDQUFDSSxLQUFLLENBQUNDLEtBQUssR0FBRyxJQUFJLENBQUNJLFFBQVEsQ0FBQ3pCLEtBQUssQ0FBQ2dCLElBQVksQ0FBQztVQUVwRCxJQUFNakQsVUFBVSxHQUFLaUMsS0FBSyxDQUFDZ0IsSUFBSSxDQUFjakQsVUFBVSxJQUFJaUMsS0FBSyxDQUFDZ0IsSUFBaUI7VUFDbEYsSUFBSSxDQUFDbkIsUUFBUSxDQUFDO1lBQ1o2QixVQUFVLEVBQUVqRixPQUFPLENBQUNzQixVQUFVLENBQUM0RCxNQUFNLElBQUk1RCxVQUFVLENBQUM2RCxPQUFPO1VBQzdELENBQUMsQ0FBQztRQUNKO1FBQ0EsQ0FBQVQscUJBQUEsT0FBSSxDQUFDVSxtQkFBbUIsQ0FBQyxDQUFDLGNBQUFWLHFCQUFBLGVBQTFCQSxxQkFBQSxDQUE0QlcsYUFBYSxDQUFDLENBQUM7TUFDN0M7TUFFQSxJQUFJOUIsS0FBSyxJQUFJQSxLQUFLLENBQUNyQixNQUFNLEVBQUU7UUFDekIsSUFBSSxDQUFDb0QsWUFBWSxDQUFDO1VBQUMvQixLQUFLLEVBQUxBLEtBQUs7VUFBRVksUUFBUSxFQUFSQTtRQUFRLENBQUMsQ0FBQztNQUN0QztNQUVBLElBQUksSUFBSSxDQUFDUSxLQUFLLENBQUNDLEtBQUssRUFBRTtRQUFBLElBQUFXLHFCQUFBLEVBQUFDLGtCQUFBO1FBQ3BCLENBQUFELHFCQUFBLElBQUFDLGtCQUFBLE9BQUksQ0FBQ2IsS0FBSyxDQUFDQyxLQUFLLEVBQUNhLFdBQVcsY0FBQUYscUJBQUEsZUFBNUJBLHFCQUFBLENBQUF2RyxJQUFBLENBQUF3RyxrQkFBQSxFQUNFLElBQUksQ0FBQ2pDLEtBQUssQ0FBQ21DLFNBQVMsR0FBR0MsbUJBQVEsQ0FBQ0MsVUFBVSxHQUFHRCxtQkFBUSxDQUFDRSxhQUN4RCxDQUFDO01BQ0g7SUFDRjtFQUFDO0lBQUE3QyxHQUFBO0lBQUF0RSxLQUFBLEVBRUQsU0FBQTRHLFlBQVlBLENBQUFRLElBQUEsRUFNSDtNQUFBLElBTFB2QyxLQUFLLEdBQUF1QyxJQUFBLENBQUx2QyxLQUFLO1FBQ0xZLFFBQVEsR0FBQTJCLElBQUEsQ0FBUjNCLFFBQVE7TUFLUixJQUFPakMsTUFBTSxHQUFJLElBQUksQ0FBQ3lDLEtBQUssQ0FBcEJ6QyxNQUFNO01BQ2IsSUFBTTZELE1BQU0sR0FBRyxJQUFJLENBQUMxQixPQUFPLENBQUMwQixNQUFNO01BQ2xDLElBQU1DLEVBQUUsR0FBRyxDQUFBRCxNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRUMsRUFBRSxLQUFJLElBQUksQ0FBQzNCLE9BQU8sQ0FBQzJCLEVBQUU7TUFFeEMsSUFBTUMsU0FBUyxHQUFHLElBQUFDLGtCQUFVLEVBQUM7UUFDM0JGLEVBQUUsRUFBRkEsRUFBRTtRQUNGRCxNQUFNLEVBQU5BLE1BQU07UUFDTjdELE1BQU0sRUFBTkEsTUFBTTtRQUNOaUUsVUFBVSxFQUFFNUMsS0FBSyxDQUFDckIsTUFBTTtRQUN4QmtFLGFBQWEsRUFBRWpDLFFBQVEsQ0FBQ2pDO01BQzFCLENBQUMsQ0FBQztNQUVGLElBQUkrRCxTQUFTLEVBQUU7UUFDYixJQUFJLENBQUM3QyxRQUFRLENBQUM7VUFBQ2xCLE1BQU0sRUFBRStEO1FBQVMsQ0FBQyxDQUFDO01BQ3BDO0lBQ0Y7RUFBQztJQUFBakQsR0FBQTtJQUFBdEUsS0FBQSxFQUVELFNBQUEySCxJQUFJQSxDQUFDQyxLQUE4QixFQUFRO01BQUEsSUFBQUMsbUJBQUE7TUFDekMsSUFBQUMsV0FBQSxHQUF3QixJQUFJLENBQUM3QixLQUFLO1FBQTNCQyxLQUFLLEdBQUE0QixXQUFBLENBQUw1QixLQUFLO1FBQUUxQyxNQUFNLEdBQUFzRSxXQUFBLENBQU50RSxNQUFNO01BQ3BCLElBQU9DLFdBQVcsR0FBSSxJQUFJLENBQUNvQixLQUFLLENBQXpCcEIsV0FBVztNQUVsQixJQUNFLENBQUN5QyxLQUFLLElBQ04sQ0FBQzFDLE1BQU0sSUFDUDNCLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMEIsTUFBTSxDQUFDLENBQUM5RCxNQUFNLEtBQUssQ0FBQyxJQUNoQyxDQUFDbUMsTUFBTSxDQUFDa0csTUFBTSxDQUFDdkUsTUFBTSxDQUFDLENBQUN3RSxLQUFLLENBQUMsVUFBQUMsSUFBSTtRQUFBLE9BQUlBLElBQUk7TUFBQSxFQUFDLEVBQzFDO1FBQ0E7TUFDRjs7TUFFQTtNQUNBL0IsS0FBSyxDQUFDZ0MsWUFBWSxDQUFDQyxRQUFRLENBQUM7UUFDMUJDLFVBQVUsRUFBRTtVQUNWQyxXQUFXLEdBQUFSLG1CQUFBLEdBQUUsSUFBSSxDQUFDaEQsS0FBSyxDQUFDeUQsT0FBTyxjQUFBVCxtQkFBQSxjQUFBQSxtQkFBQSxHQUFJLENBQUM7VUFDcENVLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQ3RDLEtBQUssQ0FBQ00sVUFBVSxHQUFHLEdBQUcsR0FBRztRQUNsRDtNQUNGLENBQUMsQ0FBQzs7TUFFRjtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQU1pQyxjQUFjLEdBQUFwRyxhQUFBLENBQUFBLGFBQUEsS0FBT3FCLFdBQVcsR0FBS0QsTUFBTSxDQUFDO01BQ2xELElBQU1ILE9BQU8sR0FBRyxJQUFJLENBQUN3QixLQUFLLENBQUN4QixPQUFPLElBQUksRUFBRTtNQUFDLElBQUFvRixTQUFBLEdBQUF4SiwwQkFBQSxDQUN2Qm9FLE9BQU87UUFBQXFGLEtBQUE7TUFBQTtRQUF6QixLQUFBRCxTQUFBLENBQUE1SSxDQUFBLE1BQUE2SSxLQUFBLEdBQUFELFNBQUEsQ0FBQTNJLENBQUEsSUFBQUMsSUFBQSxHQUEyQjtVQUFBLElBQWhCNEksR0FBRyxHQUFBRCxLQUFBLENBQUExSSxLQUFBO1VBQ1osSUFBSTJJLEdBQUcsQ0FBQ0MsV0FBVyxFQUFFO1lBQ25CLElBQU1DLE1BQU0sR0FBR0YsR0FBRyxDQUFDQyxXQUFXLENBQUNKLGNBQWMsQ0FBQztZQUM5QyxJQUFJSyxNQUFNLEVBQUU7Y0FDVjNDLEtBQUssQ0FBQ2dDLFlBQVksQ0FBQ0MsUUFBUSxLQUFBNUYsZ0JBQUEsaUJBQUdvRyxHQUFHLENBQUMvSCxJQUFJLEVBQUdpSSxNQUFNLENBQUMsQ0FBQztZQUNuRDtVQUNGO1FBQ0Y7TUFBQyxTQUFBQyxHQUFBO1FBQUFMLFNBQUEsQ0FBQXRKLENBQUEsQ0FBQTJKLEdBQUE7TUFBQTtRQUFBTCxTQUFBLENBQUF4SSxDQUFBO01BQUE7TUFFRCxJQUFNOEksV0FBVyxHQUFHN0MsS0FBSyxDQUFDeUIsSUFBSSxDQUFDLElBQUksQ0FBQ2hDLE9BQU8sQ0FBQ3FELFVBQVUsQ0FBQztNQUN2RCxJQUFJLENBQUNELFdBQVcsRUFBRTtRQUNoQixJQUFJLENBQUNFLGVBQWUsQ0FBQyxDQUFDO01BQ3hCO0lBQ0Y7RUFBQztJQUFBM0UsR0FBQTtJQUFBdEUsS0FBQSxFQUVELFNBQUFpSixlQUFlQSxDQUFBLEVBQVM7TUFBQSxJQUFBQyxNQUFBO01BQ3RCLElBQUksSUFBSSxDQUFDQyxnQkFBZ0IsRUFBRTtNQUMzQixJQUFJLENBQUNBLGdCQUFnQixHQUFHLElBQUk7TUFDNUJDLHFCQUFxQixDQUFDLFlBQU07UUFBQSxJQUFBQyxxQkFBQTtRQUMxQkgsTUFBSSxDQUFDQyxnQkFBZ0IsR0FBRyxLQUFLO1FBQzdCLElBQUlELE1BQUksQ0FBQ3ZELE9BQU8sQ0FBQzJELElBQUksRUFBRTtVQUNyQjtVQUNBSixNQUFJLENBQUN2RCxPQUFPLENBQUMyRCxJQUFJLENBQUNDLFlBQVksR0FBRyxrQ0FBa0M7UUFDckU7UUFDQSxDQUFBRixxQkFBQSxHQUFBSCxNQUFJLENBQUN2RCxPQUFPLENBQUM2RCxZQUFZLGNBQUFILHFCQUFBLGVBQXpCQSxxQkFBQSxDQUEyQkksY0FBYyxDQUFDLGtDQUFrQyxDQUFDO1FBQzdFLElBQUksT0FBT1AsTUFBSSxDQUFDckUsS0FBSyxDQUFDbkIsY0FBYyxLQUFLLFVBQVUsRUFBRTtVQUNuRHdGLE1BQUksQ0FBQ3JFLEtBQUssQ0FBQ25CLGNBQWMsQ0FBQyxDQUFDO1FBQzdCO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7RUFBQztJQUFBWSxHQUFBO0lBQUF0RSxLQUFBLEVBRUQsU0FBQTBKLGFBQWFBLENBQUEsRUFBUztNQUNwQmpJLGFBQUEsQ0FBQWtDLGVBQUEsNkJBQW9CLElBQUksQ0FBQ2dDLE9BQU87TUFFaEMsSUFBSSxJQUFJLENBQUNNLEtBQUssQ0FBQ3pDLE1BQU0sRUFBRTtRQUNyQixTQUFBbUcsRUFBQSxNQUFBQyxjQUFBLEdBQW9CL0gsTUFBTSxDQUFDa0csTUFBTSxDQUFDLElBQUksQ0FBQzlCLEtBQUssQ0FBQ3pDLE1BQU0sQ0FBQyxFQUFBbUcsRUFBQSxHQUFBQyxjQUFBLENBQUFsSyxNQUFBLEVBQUFpSyxFQUFBLElBQUU7VUFBakQsSUFBTUUsS0FBSyxHQUFBRCxjQUFBLENBQUFELEVBQUE7VUFDZCxJQUFJcEssS0FBSyxDQUFDQyxPQUFPLENBQUNxSyxLQUFLLENBQUMsRUFBRTtZQUN4QkEsS0FBSyxDQUFDQyxHQUFHLENBQUMsVUFBQUMsQ0FBQztjQUFBLElBQUFDLFNBQUE7Y0FBQSxPQUFJRCxDQUFDLEtBQUtBLENBQUMsQ0FBQzFELE9BQU8sR0FBRzBELENBQUMsQ0FBQzFELE9BQU8sQ0FBQyxDQUFDLElBQUEyRCxTQUFBLEdBQUdELENBQUMsVUFBTyxjQUFBQyxTQUFBLHVCQUFSQSxTQUFBLENBQUExSixJQUFBLENBQUF5SixDQUFXLENBQUMsQ0FBQztZQUFBLEVBQUM7VUFDL0QsQ0FBQyxNQUFNLElBQUlGLEtBQUssRUFBRTtZQUFBLElBQUFJLGFBQUE7WUFDaEJKLEtBQUssQ0FBQ3hELE9BQU8sR0FBR3dELEtBQUssQ0FBQ3hELE9BQU8sQ0FBQyxDQUFDLElBQUE0RCxhQUFBLEdBQUdKLEtBQUssVUFBTyxjQUFBSSxhQUFBLHVCQUFaQSxhQUFBLENBQUEzSixJQUFBLENBQUF1SixLQUFlLENBQUM7VUFDcEQ7UUFDRjtNQUNGO0lBQ0Y7RUFBQztJQUFBdkYsR0FBQTtJQUFBdEUsS0FBQSxFQUVELFNBQVVzRyxRQUFRQSxDQUFDVCxJQUFVLEVBQVM7TUFDcEMsSUFBTXdCLE1BQU0sR0FBRyxJQUFJLENBQUMxQixPQUFPLENBQUMwQixNQUFNLElBQUksSUFBSSxDQUFDMUIsT0FBTyxDQUFDMkIsRUFBRTtNQUVyRCxJQUFNcEIsS0FBSyxHQUFHLElBQUlnRSxhQUFLLENBQ3JCN0MsTUFBTSxFQUNOeEYsTUFBTSxDQUFDc0ksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ3hGLFVBQVUsQ0FBQyxDQUFDLEVBQUU7UUFDbkN5RixFQUFFLEVBQUUsSUFBSSxDQUFDdkYsS0FBSyxDQUFDdUYsRUFBRTtRQUNqQkMsUUFBUSxFQUFFckgsV0FBVyxDQUFDNkMsSUFBMkIsQ0FBQztRQUNsRHlFLFdBQVcsRUFBRTtNQUNmLENBQUMsQ0FDSCxDQUFDO01BRUQsT0FBT3BFLEtBQUs7SUFDZDtFQUFDO0FBQUEsRUEvSzBDOUMsMkJBQWU7QUFrTDVETyxlQUFlLENBQUM0RyxTQUFTLEdBQUcsaUJBQWlCO0FBQzdDNUcsZUFBZSxDQUFDUixZQUFZLEdBQUdBLFlBQVkiLCJpZ25vcmVMaXN0IjpbXX0=