UNPKG

@nebula.gl/layers

Version:

A suite of 3D-enabled data editing layers, suitable for deck.gl

550 lines (477 loc) 64.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _layers = require("@deck.gl/layers"); var _editModes = require("@nebula.gl/edit-modes"); var _editableLayer = _interopRequireDefault(require("./editable-layer")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 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 DEFAULT_LINE_COLOR = [0x0, 0x0, 0x0, 0x99]; var DEFAULT_FILL_COLOR = [0x0, 0x0, 0x0, 0x90]; var DEFAULT_SELECTED_LINE_COLOR = [0x0, 0x0, 0x0, 0xff]; var DEFAULT_SELECTED_FILL_COLOR = [0x0, 0x0, 0x90, 0x90]; var DEFAULT_TENTATIVE_LINE_COLOR = [0x90, 0x90, 0x90, 0xff]; var DEFAULT_TENTATIVE_FILL_COLOR = [0x90, 0x90, 0x90, 0x90]; var DEFAULT_EDITING_EXISTING_POINT_COLOR = [0xc0, 0x0, 0x0, 0xff]; var DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR = [0x0, 0x0, 0x0, 0x80]; var DEFAULT_EDITING_SNAP_POINT_COLOR = [0x7c, 0x00, 0xc0, 0xff]; var DEFAULT_EDITING_POINT_OUTLINE_COLOR = [0xff, 0xff, 0xff, 0xff]; var DEFAULT_EDITING_EXISTING_POINT_RADIUS = 5; var DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS = 3; var DEFAULT_EDITING_SNAP_POINT_RADIUS = 7; var DEFAULT_EDIT_MODE = _editModes.DrawPolygonMode; function guideAccessor(accessor) { if (!accessor || typeof accessor !== 'function') { return accessor; } return function (guideMaybeWrapped) { return accessor(unwrapGuide(guideMaybeWrapped)); }; } // The object handed to us from deck.gl is different depending on the version of deck.gl used, unwrap as necessary function unwrapGuide(guideMaybeWrapped) { if (guideMaybeWrapped.__source) { return guideMaybeWrapped.__source.object; } else if (guideMaybeWrapped.sourceFeature) { return guideMaybeWrapped.sourceFeature.feature; } // It is not wrapped, return as is return guideMaybeWrapped; } function getEditHandleColor(handle) { switch (handle.properties.editHandleType) { case 'existing': return DEFAULT_EDITING_EXISTING_POINT_COLOR; case 'snap-source': return DEFAULT_EDITING_SNAP_POINT_COLOR; case 'intermediate': default: return DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR; } } function getEditHandleOutlineColor(handle) { return DEFAULT_EDITING_POINT_OUTLINE_COLOR; } function getEditHandleRadius(handle) { switch (handle.properties.editHandleType) { case 'existing': return DEFAULT_EDITING_EXISTING_POINT_RADIUS; case 'snap': return DEFAULT_EDITING_SNAP_POINT_RADIUS; case 'intermediate': default: return DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS; } } var defaultProps = { mode: DEFAULT_EDIT_MODE, // Edit and interaction events onEdit: function onEdit() {}, pickable: true, pickingRadius: 10, pickingDepth: 5, fp64: false, filled: true, stroked: true, lineWidthScale: 1, lineWidthMinPixels: 1, lineWidthMaxPixels: Number.MAX_SAFE_INTEGER, lineWidthUnits: 'pixels', lineJointRounded: false, lineMiterLimit: 4, pointRadiusScale: 1, pointRadiusMinPixels: 2, pointRadiusMaxPixels: Number.MAX_SAFE_INTEGER, getLineColor: function getLineColor(feature, isSelected, mode) { return isSelected ? DEFAULT_SELECTED_LINE_COLOR : DEFAULT_LINE_COLOR; }, getFillColor: function getFillColor(feature, isSelected, mode) { return isSelected ? DEFAULT_SELECTED_FILL_COLOR : DEFAULT_FILL_COLOR; }, getRadius: function getRadius(f) { return f && f.properties && f.properties.radius || f && f.properties && f.properties.size || 1; }, getLineWidth: function getLineWidth(f) { return f && f.properties && f.properties.lineWidth || 3; }, // Tentative feature rendering getTentativeLineColor: function getTentativeLineColor(f) { return DEFAULT_TENTATIVE_LINE_COLOR; }, getTentativeFillColor: function getTentativeFillColor(f) { return DEFAULT_TENTATIVE_FILL_COLOR; }, getTentativeLineWidth: function getTentativeLineWidth(f) { return f && f.properties && f.properties.lineWidth || 3; }, editHandleType: 'point', // point handles editHandlePointRadiusScale: 1, editHandlePointOutline: true, editHandlePointStrokeWidth: 2, editHandlePointRadiusMinPixels: 4, editHandlePointRadiusMaxPixels: 8, getEditHandlePointColor: getEditHandleColor, getEditHandlePointOutlineColor: getEditHandleOutlineColor, getEditHandlePointRadius: getEditHandleRadius, // icon handles editHandleIconAtlas: null, editHandleIconMapping: null, editHandleIconSizeScale: 1, getEditHandleIcon: function getEditHandleIcon(handle) { return handle.properties.editHandleType; }, getEditHandleIconSize: 10, getEditHandleIconColor: getEditHandleColor, getEditHandleIconAngle: 0, // misc billboard: true }; // Mapping of mode name to mode class (for legacy purposes) var modeNameMapping = { view: _editModes.ViewMode, // Alter modes modify: _editModes.ModifyMode, translate: new _editModes.SnappableMode(new _editModes.TranslateMode()), transform: new _editModes.SnappableMode(new _editModes.TransformMode()), scale: _editModes.ScaleMode, rotate: _editModes.RotateMode, duplicate: _editModes.DuplicateMode, split: _editModes.SplitPolygonMode, extrude: _editModes.ExtrudeMode, elevation: _editModes.ElevationMode, // Draw modes drawPoint: _editModes.DrawPointMode, drawLineString: _editModes.DrawLineStringMode, drawPolygon: _editModes.DrawPolygonMode, drawRectangle: _editModes.DrawRectangleMode, drawSquareFromCenter: _editModes.DrawSquareFromCenterMode, drawCircleFromCenter: _editModes.DrawCircleFromCenterMode, drawCircleByBoundingBox: _editModes.DrawCircleByDiameterMode, drawEllipseByBoundingBox: _editModes.DrawEllipseByBoundingBoxMode, drawRectangleUsing3Points: _editModes.DrawRectangleUsingThreePointsMode, drawEllipseUsing3Points: _editModes.DrawEllipseUsingThreePointsMode, draw90DegreePolygon: _editModes.Draw90DegreePolygonMode, drawPolygonByDragging: _editModes.DrawPolygonByDraggingMode }; // type State = { // mode: GeoJsonEditMode, // tentativeFeature: ?Feature, // editHandles: any[], // selectedFeatures: Feature[] // }; var EditableGeoJsonLayer = /*#__PURE__*/function (_EditableLayer) { _inherits(EditableGeoJsonLayer, _EditableLayer); var _super = _createSuper(EditableGeoJsonLayer); function EditableGeoJsonLayer() { _classCallCheck(this, EditableGeoJsonLayer); return _super.apply(this, arguments); } _createClass(EditableGeoJsonLayer, [{ key: "renderLayers", // props: Props; // setState: ($Shape<State>) => void; value: function renderLayers() { var subLayerProps = this.getSubLayerProps({ id: 'geojson', // Proxy most GeoJsonLayer props as-is data: this.props.data, fp64: this.props.fp64, filled: this.props.filled, stroked: this.props.stroked, lineWidthScale: this.props.lineWidthScale, lineWidthMinPixels: this.props.lineWidthMinPixels, lineWidthMaxPixels: this.props.lineWidthMaxPixels, lineWidthUnits: this.props.lineWidthUnits, lineJointRounded: this.props.lineJointRounded, lineMiterLimit: this.props.lineMiterLimit, pointRadiusScale: this.props.pointRadiusScale, pointRadiusMinPixels: this.props.pointRadiusMinPixels, pointRadiusMaxPixels: this.props.pointRadiusMaxPixels, getLineColor: this.selectionAwareAccessor(this.props.getLineColor), getFillColor: this.selectionAwareAccessor(this.props.getFillColor), getRadius: this.selectionAwareAccessor(this.props.getRadius), getLineWidth: this.selectionAwareAccessor(this.props.getLineWidth), _subLayerProps: { 'line-strings': { billboard: this.props.billboard }, 'polygons-stroke': { billboard: this.props.billboard } }, updateTriggers: { getLineColor: [this.props.selectedFeatureIndexes, this.props.mode], getFillColor: [this.props.selectedFeatureIndexes, this.props.mode], getRadius: [this.props.selectedFeatureIndexes, this.props.mode], getLineWidth: [this.props.selectedFeatureIndexes, this.props.mode] } }); var layers = [new _layers.GeoJsonLayer(subLayerProps)]; layers = layers.concat(this.createGuidesLayers(), this.createTooltipsLayers()); return layers; } }, { key: "initializeState", value: function initializeState() { _get(_getPrototypeOf(EditableGeoJsonLayer.prototype), "initializeState", this).call(this); this.setState({ selectedFeatures: [], editHandles: [] }); } // TODO: is this the best way to properly update state from an outside event handler? }, { key: "shouldUpdateState", value: function shouldUpdateState(opts) { // console.log( // 'shouldUpdateState', // opts.changeFlags.propsOrDataChanged, // opts.changeFlags.stateChanged // ); return _get(_getPrototypeOf(EditableGeoJsonLayer.prototype), "shouldUpdateState", this).call(this, opts) || opts.changeFlags.stateChanged; } }, { key: "updateState", value: function updateState(_ref) { var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags; // @ts-ignore _get(_getPrototypeOf(EditableGeoJsonLayer.prototype), "updateState", this).call(this, { oldProps: oldProps, props: props, changeFlags: changeFlags }); if (changeFlags.propsOrDataChanged) { var modePropChanged = Object.keys(oldProps).length === 0 || props.mode !== oldProps.mode; if (modePropChanged) { var mode; if (typeof props.mode === 'function') { // They passed a constructor/class, so new it up var ModeConstructor = props.mode; mode = new ModeConstructor(); } else if (typeof props.mode === 'string') { // Lookup the mode based on its name (for backwards compatibility) mode = modeNameMapping[props.mode]; // eslint-disable-next-line no-console console.warn("Deprecated use of passing `mode` as a string. Pass the mode's class constructor instead."); } else { // Should be an instance of EditMode in this case mode = props.mode; } if (!mode) { console.warn("No mode configured for ".concat(String(props.mode))); // eslint-disable-line no-console,no-undef // Use default mode mode = new DEFAULT_EDIT_MODE(); } if (mode !== this.state.mode) { this.setState({ mode: mode, cursor: null }); } } } var selectedFeatures = []; if (Array.isArray(props.selectedFeatureIndexes)) { // TODO: needs improved testing, i.e. checking for duplicates, NaNs, out of range numbers, ... selectedFeatures = props.selectedFeatureIndexes.map(function (elem) { return props.data.features[elem]; }); } this.setState({ selectedFeatures: selectedFeatures }); } }, { key: "getModeProps", value: function getModeProps(props) { var _this = this; return { modeConfig: props.modeConfig, data: props.data, selectedIndexes: props.selectedFeatureIndexes, lastPointerMoveEvent: this.state.lastPointerMoveEvent, cursor: this.state.cursor, onEdit: function onEdit(editAction) { // Force a re-render // This supports double-click where we need to ensure that there's a re-render between the two clicks // even though the data wasn't changed, just the internal tentative feature. _this.setNeedsUpdate(); props.onEdit(editAction); }, onUpdateCursor: function onUpdateCursor(cursor) { _this.setState({ cursor: cursor }); } }; } }, { key: "selectionAwareAccessor", value: function selectionAwareAccessor(accessor) { var _this2 = this; if (typeof accessor !== 'function') { return accessor; } return function (feature) { return accessor(feature, _this2.isFeatureSelected(feature), _this2.props.mode); }; } }, { key: "isFeatureSelected", value: function isFeatureSelected(feature) { if (!this.props.data || !this.props.selectedFeatureIndexes) { return false; } if (!this.props.selectedFeatureIndexes.length) { return false; } var featureIndex = this.props.data.features.indexOf(feature); return this.props.selectedFeatureIndexes.includes(featureIndex); } }, { key: "getPickingInfo", value: function getPickingInfo(_ref2) { var info = _ref2.info, sourceLayer = _ref2.sourceLayer; if (sourceLayer.id.endsWith('guides')) { // If user is picking an editing handle, add additional data to the info info.isGuide = true; } return info; } }, { key: "createGuidesLayers", value: function createGuidesLayers() { var mode = this.getActiveMode(); var guides = mode.getGuides(this.getModeProps(this.props)); if (!guides || !guides.features.length) { return []; } var pointLayerProps; if (this.props.editHandleType === 'icon') { pointLayerProps = { type: _layers.IconLayer, iconAtlas: this.props.editHandleIconAtlas, iconMapping: this.props.editHandleIconMapping, sizeScale: this.props.editHandleIconSizeScale, getIcon: guideAccessor(this.props.getEditHandleIcon), getSize: guideAccessor(this.props.getEditHandleIconSize), getColor: guideAccessor(this.props.getEditHandleIconColor), getAngle: guideAccessor(this.props.getEditHandleIconAngle) }; } else { pointLayerProps = { type: _layers.ScatterplotLayer, radiusScale: this.props.editHandlePointRadiusScale, stroked: this.props.editHandlePointOutline, getLineWidth: this.props.editHandlePointStrokeWidth, radiusMinPixels: this.props.editHandlePointRadiusMinPixels, radiusMaxPixels: this.props.editHandlePointRadiusMaxPixels, getRadius: guideAccessor(this.props.getEditHandlePointRadius), getFillColor: guideAccessor(this.props.getEditHandlePointColor), getLineColor: guideAccessor(this.props.getEditHandlePointOutlineColor) }; } var layer = new _layers.GeoJsonLayer(this.getSubLayerProps({ id: "guides", data: guides, fp64: this.props.fp64, _subLayerProps: { points: pointLayerProps }, lineWidthScale: this.props.lineWidthScale, lineWidthMinPixels: this.props.lineWidthMinPixels, lineWidthMaxPixels: this.props.lineWidthMaxPixels, lineWidthUnits: this.props.lineWidthUnits, lineJointRounded: this.props.lineJointRounded, lineMiterLimit: this.props.lineMiterLimit, getLineColor: guideAccessor(this.props.getTentativeLineColor), getLineWidth: guideAccessor(this.props.getTentativeLineWidth), getFillColor: guideAccessor(this.props.getTentativeFillColor) })); return [layer]; } }, { key: "createTooltipsLayers", value: function createTooltipsLayers() { var mode = this.getActiveMode(); var tooltips = mode.getTooltips(this.getModeProps(this.props)); var layer = new _layers.TextLayer(this.getSubLayerProps({ id: "tooltips", data: tooltips })); return [layer]; } }, { key: "onLayerClick", value: function onLayerClick(event) { this.getActiveMode().handleClick(event, this.getModeProps(this.props)); } }, { key: "onLayerKeyUp", value: function onLayerKeyUp(event) { this.getActiveMode().handleKeyUp(event, this.getModeProps(this.props)); } }, { key: "onStartDragging", value: function onStartDragging(event) { this.getActiveMode().handleStartDragging(event, this.getModeProps(this.props)); } }, { key: "onDragging", value: function onDragging(event) { this.getActiveMode().handleDragging(event, this.getModeProps(this.props)); } }, { key: "onStopDragging", value: function onStopDragging(event) { this.getActiveMode().handleStopDragging(event, this.getModeProps(this.props)); } }, { key: "onPointerMove", value: function onPointerMove(event) { this.setState({ lastPointerMoveEvent: event }); this.getActiveMode().handlePointerMove(event, this.getModeProps(this.props)); } }, { key: "getCursor", value: function getCursor(_ref3) { var isDragging = _ref3.isDragging; if (this.state === null) { // Layer in 'Awaiting state' return null; } var cursor = this.state.cursor; if (!cursor) { // default cursor cursor = isDragging ? 'grabbing' : 'grab'; } return cursor; } }, { key: "getActiveMode", value: function getActiveMode() { return this.state.mode; } }]); return EditableGeoJsonLayer; }(_editableLayer["default"]); exports["default"] = EditableGeoJsonLayer; _defineProperty(EditableGeoJsonLayer, "layerName", 'EditableGeoJsonLayer'); _defineProperty(EditableGeoJsonLayer, "defaultProps", defaultProps); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvZWRpdGFibGUtZ2VvanNvbi1sYXllci50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0xJTkVfQ09MT1IiLCJERUZBVUxUX0ZJTExfQ09MT1IiLCJERUZBVUxUX1NFTEVDVEVEX0xJTkVfQ09MT1IiLCJERUZBVUxUX1NFTEVDVEVEX0ZJTExfQ09MT1IiLCJERUZBVUxUX1RFTlRBVElWRV9MSU5FX0NPTE9SIiwiREVGQVVMVF9URU5UQVRJVkVfRklMTF9DT0xPUiIsIkRFRkFVTFRfRURJVElOR19FWElTVElOR19QT0lOVF9DT0xPUiIsIkRFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfQ09MT1IiLCJERUZBVUxUX0VESVRJTkdfU05BUF9QT0lOVF9DT0xPUiIsIkRFRkFVTFRfRURJVElOR19QT0lOVF9PVVRMSU5FX0NPTE9SIiwiREVGQVVMVF9FRElUSU5HX0VYSVNUSU5HX1BPSU5UX1JBRElVUyIsIkRFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfUkFESVVTIiwiREVGQVVMVF9FRElUSU5HX1NOQVBfUE9JTlRfUkFESVVTIiwiREVGQVVMVF9FRElUX01PREUiLCJEcmF3UG9seWdvbk1vZGUiLCJndWlkZUFjY2Vzc29yIiwiYWNjZXNzb3IiLCJndWlkZU1heWJlV3JhcHBlZCIsInVud3JhcEd1aWRlIiwiX19zb3VyY2UiLCJvYmplY3QiLCJzb3VyY2VGZWF0dXJlIiwiZmVhdHVyZSIsImdldEVkaXRIYW5kbGVDb2xvciIsImhhbmRsZSIsInByb3BlcnRpZXMiLCJlZGl0SGFuZGxlVHlwZSIsImdldEVkaXRIYW5kbGVPdXRsaW5lQ29sb3IiLCJnZXRFZGl0SGFuZGxlUmFkaXVzIiwiZGVmYXVsdFByb3BzIiwibW9kZSIsIm9uRWRpdCIsInBpY2thYmxlIiwicGlja2luZ1JhZGl1cyIsInBpY2tpbmdEZXB0aCIsImZwNjQiLCJmaWxsZWQiLCJzdHJva2VkIiwibGluZVdpZHRoU2NhbGUiLCJsaW5lV2lkdGhNaW5QaXhlbHMiLCJsaW5lV2lkdGhNYXhQaXhlbHMiLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwibGluZVdpZHRoVW5pdHMiLCJsaW5lSm9pbnRSb3VuZGVkIiwibGluZU1pdGVyTGltaXQiLCJwb2ludFJhZGl1c1NjYWxlIiwicG9pbnRSYWRpdXNNaW5QaXhlbHMiLCJwb2ludFJhZGl1c01heFBpeGVscyIsImdldExpbmVDb2xvciIsImlzU2VsZWN0ZWQiLCJnZXRGaWxsQ29sb3IiLCJnZXRSYWRpdXMiLCJmIiwicmFkaXVzIiwic2l6ZSIsImdldExpbmVXaWR0aCIsImxpbmVXaWR0aCIsImdldFRlbnRhdGl2ZUxpbmVDb2xvciIsImdldFRlbnRhdGl2ZUZpbGxDb2xvciIsImdldFRlbnRhdGl2ZUxpbmVXaWR0aCIsImVkaXRIYW5kbGVQb2ludFJhZGl1c1NjYWxlIiwiZWRpdEhhbmRsZVBvaW50T3V0bGluZSIsImVkaXRIYW5kbGVQb2ludFN0cm9rZVdpZHRoIiwiZWRpdEhhbmRsZVBvaW50UmFkaXVzTWluUGl4ZWxzIiwiZWRpdEhhbmRsZVBvaW50UmFkaXVzTWF4UGl4ZWxzIiwiZ2V0RWRpdEhhbmRsZVBvaW50Q29sb3IiLCJnZXRFZGl0SGFuZGxlUG9pbnRPdXRsaW5lQ29sb3IiLCJnZXRFZGl0SGFuZGxlUG9pbnRSYWRpdXMiLCJlZGl0SGFuZGxlSWNvbkF0bGFzIiwiZWRpdEhhbmRsZUljb25NYXBwaW5nIiwiZWRpdEhhbmRsZUljb25TaXplU2NhbGUiLCJnZXRFZGl0SGFuZGxlSWNvbiIsImdldEVkaXRIYW5kbGVJY29uU2l6ZSIsImdldEVkaXRIYW5kbGVJY29uQ29sb3IiLCJnZXRFZGl0SGFuZGxlSWNvbkFuZ2xlIiwiYmlsbGJvYXJkIiwibW9kZU5hbWVNYXBwaW5nIiwidmlldyIsIlZpZXdNb2RlIiwibW9kaWZ5IiwiTW9kaWZ5TW9kZSIsInRyYW5zbGF0ZSIsIlNuYXBwYWJsZU1vZGUiLCJUcmFuc2xhdGVNb2RlIiwidHJhbnNmb3JtIiwiVHJhbnNmb3JtTW9kZSIsInNjYWxlIiwiU2NhbGVNb2RlIiwicm90YXRlIiwiUm90YXRlTW9kZSIsImR1cGxpY2F0ZSIsIkR1cGxpY2F0ZU1vZGUiLCJzcGxpdCIsIlNwbGl0UG9seWdvbk1vZGUiLCJleHRydWRlIiwiRXh0cnVkZU1vZGUiLCJlbGV2YXRpb24iLCJFbGV2YXRpb25Nb2RlIiwiZHJhd1BvaW50IiwiRHJhd1BvaW50TW9kZSIsImRyYXdMaW5lU3RyaW5nIiwiRHJhd0xpbmVTdHJpbmdNb2RlIiwiZHJhd1BvbHlnb24iLCJkcmF3UmVjdGFuZ2xlIiwiRHJhd1JlY3RhbmdsZU1vZGUiLCJkcmF3U3F1YXJlRnJvbUNlbnRlciIsIkRyYXdTcXVhcmVGcm9tQ2VudGVyTW9kZSIsImRyYXdDaXJjbGVGcm9tQ2VudGVyIiwiRHJhd0NpcmNsZUZyb21DZW50ZXJNb2RlIiwiZHJhd0NpcmNsZUJ5Qm91bmRpbmdCb3giLCJEcmF3Q2lyY2xlQnlEaWFtZXRlck1vZGUiLCJkcmF3RWxsaXBzZUJ5Qm91bmRpbmdCb3giLCJEcmF3RWxsaXBzZUJ5Qm91bmRpbmdCb3hNb2RlIiwiZHJhd1JlY3RhbmdsZVVzaW5nM1BvaW50cyIsIkRyYXdSZWN0YW5nbGVVc2luZ1RocmVlUG9pbnRzTW9kZSIsImRyYXdFbGxpcHNlVXNpbmczUG9pbnRzIiwiRHJhd0VsbGlwc2VVc2luZ1RocmVlUG9pbnRzTW9kZSIsImRyYXc5MERlZ3JlZVBvbHlnb24iLCJEcmF3OTBEZWdyZWVQb2x5Z29uTW9kZSIsImRyYXdQb2x5Z29uQnlEcmFnZ2luZyIsIkRyYXdQb2x5Z29uQnlEcmFnZ2luZ01vZGUiLCJFZGl0YWJsZUdlb0pzb25MYXllciIsInN1YkxheWVyUHJvcHMiLCJnZXRTdWJMYXllclByb3BzIiwiaWQiLCJkYXRhIiwicHJvcHMiLCJzZWxlY3Rpb25Bd2FyZUFjY2Vzc29yIiwiX3N1YkxheWVyUHJvcHMiLCJ1cGRhdGVUcmlnZ2VycyIsInNlbGVjdGVkRmVhdHVyZUluZGV4ZXMiLCJsYXllcnMiLCJHZW9Kc29uTGF5ZXIiLCJjb25jYXQiLCJjcmVhdGVHdWlkZXNMYXllcnMiLCJjcmVhdGVUb29sdGlwc0xheWVycyIsInNldFN0YXRlIiwic2VsZWN0ZWRGZWF0dXJlcyIsImVkaXRIYW5kbGVzIiwib3B0cyIsImNoYW5nZUZsYWdzIiwic3RhdGVDaGFuZ2VkIiwib2xkUHJvcHMiLCJwcm9wc09yRGF0YUNoYW5nZWQiLCJtb2RlUHJvcENoYW5nZWQiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiTW9kZUNvbnN0cnVjdG9yIiwiY29uc29sZSIsIndhcm4iLCJTdHJpbmciLCJzdGF0ZSIsImN1cnNvciIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImVsZW0iLCJmZWF0dXJlcyIsIm1vZGVDb25maWciLCJzZWxlY3RlZEluZGV4ZXMiLCJsYXN0UG9pbnRlck1vdmVFdmVudCIsImVkaXRBY3Rpb24iLCJzZXROZWVkc1VwZGF0ZSIsIm9uVXBkYXRlQ3Vyc29yIiwiaXNGZWF0dXJlU2VsZWN0ZWQiLCJmZWF0dXJlSW5kZXgiLCJpbmRleE9mIiwiaW5jbHVkZXMiLCJpbmZvIiwic291cmNlTGF5ZXIiLCJlbmRzV2l0aCIsImlzR3VpZGUiLCJnZXRBY3RpdmVNb2RlIiwiZ3VpZGVzIiwiZ2V0R3VpZGVzIiwiZ2V0TW9kZVByb3BzIiwicG9pbnRMYXllclByb3BzIiwidHlwZSIsIkljb25MYXllciIsImljb25BdGxhcyIsImljb25NYXBwaW5nIiwic2l6ZVNjYWxlIiwiZ2V0SWNvbiIsImdldFNpemUiLCJnZXRDb2xvciIsImdldEFuZ2xlIiwiU2NhdHRlcnBsb3RMYXllciIsInJhZGl1c1NjYWxlIiwicmFkaXVzTWluUGl4ZWxzIiwicmFkaXVzTWF4UGl4ZWxzIiwibGF5ZXIiLCJwb2ludHMiLCJ0b29sdGlwcyIsImdldFRvb2x0aXBzIiwiVGV4dExheWVyIiwiZXZlbnQiLCJoYW5kbGVDbGljayIsImhhbmRsZUtleVVwIiwiaGFuZGxlU3RhcnREcmFnZ2luZyIsImhhbmRsZURyYWdnaW5nIiwiaGFuZGxlU3RvcERyYWdnaW5nIiwiaGFuZGxlUG9pbnRlck1vdmUiLCJpc0RyYWdnaW5nIiwiRWRpdGFibGVMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUVBOztBQW1DQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxrQkFBa0IsR0FBRyxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixJQUFoQixDQUEzQjtBQUNBLElBQU1DLGtCQUFrQixHQUFHLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCLElBQWhCLENBQTNCO0FBQ0EsSUFBTUMsMkJBQTJCLEdBQUcsQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsRUFBZ0IsSUFBaEIsQ0FBcEM7QUFDQSxJQUFNQywyQkFBMkIsR0FBRyxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsSUFBWCxFQUFpQixJQUFqQixDQUFwQztBQUNBLElBQU1DLDRCQUE0QixHQUFHLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLENBQXJDO0FBQ0EsSUFBTUMsNEJBQTRCLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsQ0FBckM7QUFDQSxJQUFNQyxvQ0FBb0MsR0FBRyxDQUFDLElBQUQsRUFBTyxHQUFQLEVBQVksR0FBWixFQUFpQixJQUFqQixDQUE3QztBQUNBLElBQU1DLHdDQUF3QyxHQUFHLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCLElBQWhCLENBQWpEO0FBQ0EsSUFBTUMsZ0NBQWdDLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsQ0FBekM7QUFDQSxJQUFNQyxtQ0FBbUMsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixJQUFuQixDQUE1QztBQUNBLElBQU1DLHFDQUFxQyxHQUFHLENBQTlDO0FBQ0EsSUFBTUMseUNBQXlDLEdBQUcsQ0FBbEQ7QUFDQSxJQUFNQyxpQ0FBaUMsR0FBRyxDQUExQztBQUVBLElBQU1DLGlCQUFpQixHQUFHQywwQkFBMUI7O0FBRUEsU0FBU0MsYUFBVCxDQUF1QkMsUUFBdkIsRUFBaUM7QUFDL0IsTUFBSSxDQUFDQSxRQUFELElBQWEsT0FBT0EsUUFBUCxLQUFvQixVQUFyQyxFQUFpRDtBQUMvQyxXQUFPQSxRQUFQO0FBQ0Q7O0FBQ0QsU0FBTyxVQUFDQyxpQkFBRDtBQUFBLFdBQXVCRCxRQUFRLENBQUNFLFdBQVcsQ0FBQ0QsaUJBQUQsQ0FBWixDQUEvQjtBQUFBLEdBQVA7QUFDRCxDLENBRUQ7OztBQUNBLFNBQVNDLFdBQVQsQ0FBcUJELGlCQUFyQixFQUF3QztBQUN0QyxNQUFJQSxpQkFBaUIsQ0FBQ0UsUUFBdEIsRUFBZ0M7QUFDOUIsV0FBT0YsaUJBQWlCLENBQUNFLFFBQWxCLENBQTJCQyxNQUFsQztBQUNELEdBRkQsTUFFTyxJQUFJSCxpQkFBaUIsQ0FBQ0ksYUFBdEIsRUFBcUM7QUFDMUMsV0FBT0osaUJBQWlCLENBQUNJLGFBQWxCLENBQWdDQyxPQUF2QztBQUNELEdBTHFDLENBTXRDOzs7QUFDQSxTQUFPTCxpQkFBUDtBQUNEOztBQUVELFNBQVNNLGtCQUFULENBQTRCQyxNQUE1QixFQUFvQztBQUNsQyxVQUFRQSxNQUFNLENBQUNDLFVBQVAsQ0FBa0JDLGNBQTFCO0FBQ0UsU0FBSyxVQUFMO0FBQ0UsYUFBT3BCLG9DQUFQOztBQUNGLFNBQUssYUFBTDtBQUNFLGFBQU9FLGdDQUFQOztBQUNGLFNBQUssY0FBTDtBQUNBO0FBQ0UsYUFBT0Qsd0NBQVA7QUFQSjtBQVNEOztBQUVELFNBQVNvQix5QkFBVCxDQUFtQ0gsTUFBbkMsRUFBMkM7QUFDekMsU0FBT2YsbUNBQVA7QUFDRDs7QUFFRCxTQUFTbUIsbUJBQVQsQ0FBNkJKLE1BQTdCLEVBQXFDO0FBQ25DLFVBQVFBLE1BQU0sQ0FBQ0MsVUFBUCxDQUFrQkMsY0FBMUI7QUFDRSxTQUFLLFVBQUw7QUFDRSxhQUFPaEIscUNBQVA7O0FBQ0YsU0FBSyxNQUFMO0FBQ0UsYUFBT0UsaUNBQVA7O0FBQ0YsU0FBSyxjQUFMO0FBQ0E7QUFDRSxhQUFPRCx5Q0FBUDtBQVBKO0FBU0Q7O0FBRUQsSUFBTWtCLFlBQVksR0FBRztBQUNuQkMsRUFBQUEsSUFBSSxFQUFFakIsaUJBRGE7QUFHbkI7QUFDQWtCLEVBQUFBLE1BQU0sRUFBRSxrQkFBTSxDQUFFLENBSkc7QUFNbkJDLEVBQUFBLFFBQVEsRUFBRSxJQU5TO0FBT25CQyxFQUFBQSxhQUFhLEVBQUUsRUFQSTtBQVFuQkMsRUFBQUEsWUFBWSxFQUFFLENBUks7QUFTbkJDLEVBQUFBLElBQUksRUFBRSxLQVRhO0FBVW5CQyxFQUFBQSxNQUFNLEVBQUUsSUFWVztBQVduQkMsRUFBQUEsT0FBTyxFQUFFLElBWFU7QUFZbkJDLEVBQUFBLGNBQWMsRUFBRSxDQVpHO0FBYW5CQyxFQUFBQSxrQkFBa0IsRUFBRSxDQWJEO0FBY25CQyxFQUFBQSxrQkFBa0IsRUFBRUMsTUFBTSxDQUFDQyxnQkFkUjtBQWVuQkMsRUFBQUEsY0FBYyxFQUFFLFFBZkc7QUFnQm5CQyxFQUFBQSxnQkFBZ0IsRUFBRSxLQWhCQztBQWlCbkJDLEVBQUFBLGNBQWMsRUFBRSxDQWpCRztBQWtCbkJDLEVBQUFBLGdCQUFnQixFQUFFLENBbEJDO0FBbUJuQkMsRUFBQUEsb0JBQW9CLEVBQUUsQ0FuQkg7QUFvQm5CQyxFQUFBQSxvQkFBb0IsRUFBRVAsTUFBTSxDQUFDQyxnQkFwQlY7QUFxQm5CTyxFQUFBQSxZQUFZLEVBQUUsc0JBQUMzQixPQUFELEVBQVU0QixVQUFWLEVBQXNCcEIsSUFBdEI7QUFBQSxXQUNab0IsVUFBVSxHQUFHaEQsMkJBQUgsR0FBaUNGLGtCQUQvQjtBQUFBLEdBckJLO0FBdUJuQm1ELEVBQUFBLFlBQVksRUFBRSxzQkFBQzdCLE9BQUQsRUFBVTRCLFVBQVYsRUFBc0JwQixJQUF0QjtBQUFBLFdBQ1pvQixVQUFVLEdBQUcvQywyQkFBSCxHQUFpQ0Ysa0JBRC9CO0FBQUEsR0F2Qks7QUF5Qm5CbUQsRUFBQUEsU0FBUyxFQUFFLG1CQUFDQyxDQUFEO0FBQUEsV0FDUkEsQ0FBQyxJQUFJQSxDQUFDLENBQUM1QixVQUFQLElBQXFCNEIsQ0FBQyxDQUFDNUIsVUFBRixDQUFhNkIsTUFBbkMsSUFBK0NELENBQUMsSUFBSUEsQ0FBQyxDQUFDNUIsVUFBUCxJQUFxQjRCLENBQUMsQ0FBQzVCLFVBQUYsQ0FBYThCLElBQWpGLElBQTBGLENBRGpGO0FBQUEsR0F6QlE7QUEyQm5CQyxFQUFBQSxZQUFZLEVBQUUsc0JBQUNILENBQUQ7QUFBQSxXQUFRQSxDQUFDLElBQUlBLENBQUMsQ0FBQzVCLFVBQVAsSUFBcUI0QixDQUFDLENBQUM1QixVQUFGLENBQWFnQyxTQUFuQyxJQUFpRCxDQUF4RDtBQUFBLEdBM0JLO0FBNkJuQjtBQUNBQyxFQUFBQSxxQkFBcUIsRUFBRSwrQkFBQ0wsQ0FBRDtBQUFBLFdBQU9qRCw0QkFBUDtBQUFBLEdBOUJKO0FBK0JuQnVELEVBQUFBLHFCQUFxQixFQUFFLCtCQUFDTixDQUFEO0FBQUEsV0FBT2hELDRCQUFQO0FBQUEsR0EvQko7QUFnQ25CdUQsRUFBQUEscUJBQXFCLEVBQUUsK0JBQUNQLENBQUQ7QUFBQSxXQUFRQSxDQUFDLElBQUlBLENBQUMsQ0FBQzVCLFVBQVAsSUFBcUI0QixDQUFDLENBQUM1QixVQUFGLENBQWFnQyxTQUFuQyxJQUFpRCxDQUF4RDtBQUFBLEdBaENKO0FBa0NuQi9CLEVBQUFBLGNBQWMsRUFBRSxPQWxDRztBQW9DbkI7QUFDQW1DLEVBQUFBLDBCQUEwQixFQUFFLENBckNUO0FBc0NuQkMsRUFBQUEsc0JBQXNCLEVBQUUsSUF0Q0w7QUF1Q25CQyxFQUFBQSwwQkFBMEIsRUFBRSxDQXZDVDtBQXdDbkJDLEVBQUFBLDhCQUE4QixFQUFFLENBeENiO0FBeUNuQkMsRUFBQUEsOEJBQThCLEVBQUUsQ0F6Q2I7QUEwQ25CQyxFQUFBQSx1QkFBdUIsRUFBRTNDLGtCQTFDTjtBQTJDbkI0QyxFQUFBQSw4QkFBOEIsRUFBRXhDLHlCQTNDYjtBQTRDbkJ5QyxFQUFBQSx3QkFBd0IsRUFBRXhDLG1CQTVDUDtBQThDbkI7QUFDQXlDLEVBQUFBLG1CQUFtQixFQUFFLElBL0NGO0FBZ0RuQkMsRUFBQUEscUJBQXFCLEVBQUUsSUFoREo7QUFpRG5CQyxFQUFBQSx1QkFBdUIsRUFBRSxDQWpETjtBQWtEbkJDLEVBQUFBLGlCQUFpQixFQUFFLDJCQUFDaEQsTUFBRDtBQUFBLFdBQVlBLE1BQU0sQ0FBQ0MsVUFBUCxDQUFrQkMsY0FBOUI7QUFBQSxHQWxEQTtBQW1EbkIrQyxFQUFBQSxxQkFBcUIsRUFBRSxFQW5ESjtBQW9EbkJDLEVBQUFBLHNCQUFzQixFQUFFbkQsa0JBcERMO0FBcURuQm9ELEVBQUFBLHNCQUFzQixFQUFFLENBckRMO0FBdURuQjtBQUNBQyxFQUFBQSxTQUFTLEVBQUU7QUF4RFEsQ0FBckIsQyxDQTJEQTs7QUFDQSxJQUFNQyxlQUFlLEdBQUc7QUFDdEJDLEVBQUFBLElBQUksRUFBRUMsbUJBRGdCO0FBR3RCO0FBQ0FDLEVBQUFBLE1BQU0sRUFBRUMscUJBSmM7QUFLdEJDLEVBQUFBLFNBQVMsRUFBRSxJQUFJQyx3QkFBSixDQUFrQixJQUFJQyx3QkFBSixFQUFsQixDQUxXO0FBT3RCQyxFQUFBQSxTQUFTLEVBQUUsSUFBSUYsd0JBQUosQ0FBa0IsSUFBSUcsd0JBQUosRUFBbEIsQ0FQVztBQVF0QkMsRUFBQUEsS0FBSyxFQUFFQyxvQkFSZTtBQVN0QkMsRUFBQUEsTUFBTSxFQUFFQyxxQkFUYztBQVV0QkMsRUFBQUEsU0FBUyxFQUFFQyx3QkFWVztBQVd0QkMsRUFBQUEsS0FBSyxFQUFFQywyQkFYZTtBQVl0QkMsRUFBQUEsT0FBTyxFQUFFQyxzQkFaYTtBQWF0QkMsRUFBQUEsU0FBUyxFQUFFQyx3QkFiVztBQWV0QjtBQUNBQyxFQUFBQSxTQUFTLEVBQUVDLHdCQWhCVztBQWlCdEJDLEVBQUFBLGNBQWMsRUFBRUMsNkJBakJNO0FBa0J0QkMsRUFBQUEsV0FBVyxFQUFFekYsMEJBbEJTO0FBbUJ0QjBGLEVBQUFBLGFBQWEsRUFBRUMsNEJBbkJPO0FBb0J0QkMsRUFBQUEsb0JBQW9CLEVBQUVDLG1DQXBCQTtBQXFCdEJDLEVBQUFBLG9CQUFvQixFQUFFQyxtQ0FyQkE7QUFzQnRCQyxFQUFBQSx1QkFBdUIsRUFBRUMsbUNBdEJIO0FBdUJ0QkMsRUFBQUEsd0JBQXdCLEVBQUVDLHVDQXZCSjtBQXdCdEJDLEVBQUFBLHlCQUF5QixFQUFFQyw0Q0F4Qkw7QUF5QnRCQyxFQUFBQSx1QkFBdUIsRUFBRUMsMENBekJIO0FBMEJ0QkMsRUFBQUEsbUJBQW1CLEVBQUVDLGtDQTFCQztBQTJCdEJDLEVBQUFBLHFCQUFxQixFQUFFQztBQTNCRCxDQUF4Qjs7QUFzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBRXFCQyxvQjs7Ozs7Ozs7Ozs7OztBQUduQjtBQUVBO21DQUNlO0FBQ2IsVUFBTUMsYUFBYSxHQUFHLEtBQUtDLGdCQUFMLENBQXNCO0FBQzFDQyxRQUFBQSxFQUFFLEVBQUUsU0FEc0M7QUFHMUM7QUFDQUMsUUFBQUEsSUFBSSxFQUFFLEtBQUtDLEtBQUwsQ0FBV0QsSUFKeUI7QUFLMUMzRixRQUFBQSxJQUFJLEVBQUUsS0FBSzRGLEtBQUwsQ0FBVzVGLElBTHlCO0FBTTFDQyxRQUFBQSxNQUFNLEVBQUUsS0FBSzJGLEtBQUwsQ0FBVzNGLE1BTnVCO0FBTzFDQyxRQUFBQSxPQUFPLEVBQUUsS0FBSzBGLEtBQUwsQ0FBVzFGLE9BUHNCO0FBUTFDQyxRQUFBQSxjQUFjLEVBQUUsS0FBS3lGLEtBQUwsQ0FBV3pGLGNBUmU7QUFTMUNDLFFBQUFBLGtCQUFrQixFQUFFLEtBQUt3RixLQUFMLENBQVd4RixrQkFUVztBQVUxQ0MsUUFBQUEsa0JBQWtCLEVBQUUsS0FBS3VGLEtBQUwsQ0FBV3ZGLGtCQVZXO0FBVzFDRyxRQUFBQSxjQUFjLEVBQUUsS0FBS29GLEtBQUwsQ0FBV3BGLGNBWGU7QUFZMUNDLFFBQUFBLGdCQUFnQixFQUFFLEtBQUttRixLQUFMLENBQVduRixnQkFaYTtBQWExQ0MsUUFBQUEsY0FBYyxFQUFFLEtBQUtrRixLQUFMLENBQVdsRixjQWJlO0FBYzFDQyxRQUFBQSxnQkFBZ0IsRUFBRSxLQUFLaUYsS0FBTCxDQUFXakYsZ0JBZGE7QUFlMUNDLFFBQUFBLG9CQUFvQixFQUFFLEtBQUtnRixLQUFMLENBQVdoRixvQkFmUztBQWdCMUNDLFFBQUFBLG9CQUFvQixFQUFFLEtBQUsrRSxLQUFMLENBQVcvRSxvQkFoQlM7QUFpQjFDQyxRQUFBQSxZQUFZLEVBQUUsS0FBSytFLHNCQUFMLENBQTRCLEtBQUtELEtBQUwsQ0FBVzlFLFlBQXZDLENBakI0QjtBQWtCMUNFLFFBQUFBLFlBQVksRUFBRSxLQUFLNkUsc0JBQUwsQ0FBNEIsS0FBS0QsS0FBTCxDQUFXNUUsWUFBdkMsQ0FsQjRCO0FBbUIxQ0MsUUFBQUEsU0FBUyxFQUFFLEtBQUs0RSxzQkFBTCxDQUE0QixLQUFLRCxLQUFMLENBQVczRSxTQUF2QyxDQW5CK0I7QUFvQjFDSSxRQUFBQSxZQUFZLEVBQUUsS0FBS3dFLHNCQUFMLENBQTRCLEtBQUtELEtBQUwsQ0FBV3ZFLFlBQXZDLENBcEI0QjtBQXNCMUN5RSxRQUFBQSxjQUFjLEVBQUU7QUFDZCwwQkFBZ0I7QUFDZHJELFlBQUFBLFNBQVMsRUFBRSxLQUFLbUQsS0FBTCxDQUFXbkQ7QUFEUixXQURGO0FBSWQsNkJBQW1CO0FBQ2pCQSxZQUFBQSxTQUFTLEVBQUUsS0FBS21ELEtBQUwsQ0FBV25EO0FBREw7QUFKTCxTQXRCMEI7QUErQjFDc0QsUUFBQUEsY0FBYyxFQUFFO0FBQ2RqRixVQUFBQSxZQUFZLEVBQUUsQ0FBQyxLQUFLOEUsS0FBTCxDQUFXSSxzQkFBWixFQUFvQyxLQUFLSixLQUFMLENBQVdqRyxJQUEvQyxDQURBO0FBRWRxQixVQUFBQSxZQUFZLEVBQUUsQ0FBQyxLQUFLNEUsS0FBTCxDQUFXSSxzQkFBWixFQUFvQyxLQUFLSixLQUFMLENBQVdqRyxJQUEvQyxDQUZBO0FBR2RzQixVQUFBQSxTQUFTLEVBQUUsQ0FBQyxLQUFLMkUsS0FBTCxDQUFXSSxzQkFBWixFQUFvQyxLQUFLSixLQUFMLENBQVdqRyxJQUEvQyxDQUhHO0FBSWQwQixVQUFBQSxZQUFZLEVBQUUsQ0FBQyxLQUFLdUUsS0FBTCxDQUFXSSxzQkFBWixFQUFvQyxLQUFLSixLQUFMLENBQVdqRyxJQUEvQztBQUpBO0FBL0IwQixPQUF0QixDQUF0QjtBQXVDQSxVQUFJc0csTUFBVyxHQUFHLENBQUMsSUFBSUMsb0JBQUosQ0FBaUJWLGFBQWpCLENBQUQsQ0FBbEI7QUFFQVMsTUFBQUEsTUFBTSxHQUFHQSxNQUFNLENBQUNFLE1BQVAsQ0FBYyxLQUFLQyxrQkFBTCxFQUFkLEVBQXlDLEtBQUtDLG9CQUFMLEVBQXpDLENBQVQ7QUFFQSxhQUFPSixNQUFQO0FBQ0Q7OztzQ0FFaUI7QUFDaEI7O0FBRUEsV0FBS0ssUUFBTCxDQUFjO0FBQ1pDLFFBQUFBLGdCQUFnQixFQUFFLEVBRE47QUFFWkMsUUFBQUEsV0FBVyxFQUFFO0FBRkQsT0FBZDtBQUlELEssQ0FFRDs7OztzQ0FDa0JDLEksRUFBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBTyw0RkFBd0JBLElBQXhCLEtBQWlDQSxJQUFJLENBQUNDLFdBQUwsQ0FBaUJDLFlBQXpEO0FBQ0Q7OztzQ0FVRTtBQUFBLFVBUERmLEtBT0MsUUFQREEsS0FPQztBQUFBLFVBTkRnQixRQU1DLFFBTkRBLFFBTUM7QUFBQSxVQUxERixXQUtDLFFBTERBLFdBS0M7O0FBQ0Q7QUFDQSw0RkFBa0I7QUFBRUUsUUFBQUEsUUFBUSxFQUFSQSxRQUFGO0FBQVloQixRQUFBQSxLQUFLLEVBQUxBLEtBQVo7QUFBbUJjLFFBQUFBLFdBQVcsRUFBWEE7QUFBbkIsT0FBbEI7O0FBRUEsVUFBSUEsV0FBVyxDQUFDRyxrQkFBaEIsRUFBb0M7QUFDbEMsWUFBTUMsZUFBZSxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWUosUUFBWixFQUFzQkssTUFBdEIsS0FBaUMsQ0FBakMsSUFBc0NyQixLQUFLLENBQUNqRyxJQUFOLEtBQWVpSCxRQUFRLENBQUNqSCxJQUF0Rjs7QUFDQSxZQUFJbUgsZUFBSixFQUFxQjtBQUNuQixjQUFJbkgsSUFBSjs7QUFDQSxjQUFJLE9BQU9pRyxLQUFLLENBQUNqRyxJQUFiLEtBQXNCLFVBQTFCLEVBQXNDO0FBQ3BDO0FBQ0EsZ0JBQU11SCxlQUFlLEdBQUd0QixLQUFLLENBQUNqRyxJQUE5QjtBQUNBQSxZQUFBQSxJQUFJLEdBQUcsSUFBSXVILGVBQUosRUFBUDtBQUNELFdBSkQsTUFJTyxJQUFJLE9BQU90QixLQUFLLENBQUNqRyxJQUFiLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ3pDO0FBQ0FBLFlBQUFBLElBQUksR0FBRytDLGVBQWUsQ0FBQ2tELEtBQUssQ0FBQ2pHLElBQVAsQ0FBdEIsQ0FGeUMsQ0FHekM7O0FBQ0F3SCxZQUFBQSxPQUFPLENBQUNDLElBQVIsQ0FDRSwwRkFERjtBQUdELFdBUE0sTUFPQTtBQUNMO0FBQ0F6SCxZQUFBQSxJQUFJLEdBQUdpRyxLQUFLLENBQUNqRyxJQUFiO0FBQ0Q7O0FBRUQsY0FBSSxDQUFDQSxJQUFMLEVBQVc7QUFDVHdILFlBQUFBLE9BQU8sQ0FBQ0MsSUFBUixrQ0FBdUNDLE1BQU0sQ0FBQ3pCLEtBQUssQ0FBQ2pHLElBQVAsQ0FBN0MsR0FEUyxDQUNxRDtBQUM5RDs7QUFDQUEsWUFBQUEsSUFBSSxHQUFHLElBQUlqQixpQkFBSixFQUFQO0FBQ0Q7O0FBRUQsY0FBSWlCLElBQUksS0FBSyxLQUFLMkgsS0FBTCxDQUFXM0gsSUFBeEIsRUFBOEI7QUFDNUIsaUJBQUsyRyxRQUFMLENBQWM7QUFBRTNHLGNBQUFBLElBQUksRUFBSkEsSUFBRjtBQUFRNEgsY0FBQUEsTUFBTSxFQUFFO0FBQWhCLGFBQWQ7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsVUFBSWhCLGdCQUFnQixHQUFHLEVBQXZCOztBQUNBLFVBQUlpQixLQUFLLENBQUNDLE9BQU4sQ0FBYzdCLEtBQUssQ0FBQ0ksc0JBQXBCLENBQUosRUFBaUQ7QUFDL0M7QUFDQU8sUUFBQUEsZ0JBQWdCLEdBQUdYLEtBQUssQ0FBQ0ksc0JBQU4sQ0FBNkIwQixHQUE3QixDQUFpQyxVQUFDQyxJQUFEO0FBQUEsaUJBQVUvQixLQUFLLENBQUNELElBQU4sQ0FBV2lDLFFBQVgsQ0FBb0JELElBQXBCLENBQVY7QUFBQSxTQUFqQyxDQUFuQjtBQUNEOztBQUVELFdBQUtyQixRQUFMLENBQWM7QUFBRUMsUUFBQUEsZ0JBQWdCLEVBQWhCQTtBQUFGLE9BQWQ7QUFDRDs7O2lDQUVZWCxLLEVBQWM7QUFBQTs7QUFDekIsYUFBTztBQUNMaUMsUUFBQUEsVUFBVSxFQUFFakMsS0FBSyxDQUFDaUMsVUFEYjtBQUVMbEMsUUFBQUEsSUFBSSxFQUFFQyxLQUFLLENBQUNELElBRlA7QUFHTG1DLFFBQUFBLGVBQWUsRUFBRWxDLEtBQUssQ0FBQ0ksc0JBSGxCO0FBSUwrQixRQUFBQSxvQkFBb0IsRUFBRSxLQUFLVCxLQUFMLENBQVdTLG9CQUo1QjtBQUtMUixRQUFBQSxNQUFNLEVBQUUsS0FBS0QsS0FBTCxDQUFXQyxNQUxkO0FBTUwzSCxRQUFBQSxNQUFNLEVBQUUsZ0JBQUNvSSxVQUFELEVBQStDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLFVBQUEsS0FBSSxDQUFDQyxjQUFMOztBQUNBckMsVUFBQUEsS0FBSyxDQUFDaEcsTUFBTixDQUFhb0ksVUFBYjtBQUNELFNBWkk7QUFhTEUsUUFBQUEsY0FBYyxFQUFFLHdCQUFDWCxNQUFELEVBQXVDO0FBQ3JELFVBQUEsS0FBSSxDQUFDakIsUUFBTCxDQUFjO0FBQUVpQixZQUFBQSxNQUFNLEVBQU5BO0FBQUYsV0FBZDtBQUNEO0FBZkksT0FBUDtBQWlCRDs7OzJDQUVzQjFJLFEsRUFBZTtBQUFBOztBQUNwQyxVQUFJLE9BQU9BLFFBQVAsS0FBb0IsVUFBeEIsRUFBb0M7QUFDbEMsZUFBT0EsUUFBUDtBQUNEOztBQUNELGFBQU8sVUFBQ00sT0FBRDtBQUFBLGVBQ0xOLFFBQVEsQ0FBQ00sT0FBRCxFQUFVLE1BQUksQ0FBQ2dKLGlCQUFMLENBQXVCaEosT0FBdkIsQ0FBVixFQUEyQyxNQUFJLENBQUN5RyxLQUFMLENBQVdqRyxJQUF0RCxDQURIO0FBQUEsT0FBUDtBQUVEOzs7c0NBRWlCUixPLEVBQThCO0FBQzlDLFVBQUksQ0FBQyxLQUFLeUcsS0FBTCxDQUFXRCxJQUFaLElBQW9CLENBQUMsS0FBS0MsS0FBTCxDQUFXSSxzQkFBcEMsRUFBNEQ7QUFDMUQsZUFBTyxLQUFQO0FBQ0Q7O0FBQ0QsVUFBSSxDQUFDLEtBQUtKLEtBQUwsQ0FBV0ksc0JBQVgsQ0FBa0NpQixNQUF2QyxFQUErQztBQUM3QyxlQUFPLEtBQVA7QUFDRDs7QUFDRCxVQUFNbUIsWUFBWSxHQUFHLEtBQUt4QyxLQUFMLENBQVdELElBQVgsQ0FBZ0JpQyxRQUFoQixDQUF5QlMsT0FBekIsQ0FBaUNsSixPQUFqQyxDQUFyQjtBQUNBLGFBQU8sS0FBS3lHLEtBQUwsQ0FBV0ksc0JBQVgsQ0FBa0NzQyxRQUFsQyxDQUEyQ0YsWUFBM0MsQ0FBUDtBQUNEOzs7MENBRTBEO0FBQUEsVUFBMUNHLElBQTBDLFNBQTFDQSxJQUEwQztBQUFBLFVBQXBDQyxXQUFvQyxTQUFwQ0EsV0FBb0M7O0FBQ3pELFVBQUlBLFdBQVcsQ0FBQzlDLEVBQVosQ0FBZStDLFFBQWYsQ0FBd0IsUUFBeEIsQ0FBSixFQUF1QztBQUNyQztBQUNBRixRQUFBQSxJQUFJLENBQUNHLE9BQUwsR0FBZSxJQUFmO0FBQ0Q7O0FBRUQsYUFBT0gsSUFBUDtBQUNEOzs7eUNBRW9CO0FBQ25CLFVBQU01SSxJQUFJLEdBQUcsS0FBS2dKLGFBQUwsRUFBYjtBQUNBLFVBQU1DLE1BQXlCLEdBQUdqSixJQUFJLENBQUNrSixTQUFMLENBQWUsS0FBS0MsWUFBTCxDQUFrQixLQUFLbEQsS0FBdkIsQ0FBZixDQUFsQzs7QUFFQSxVQUFJLENBQUNnRCxNQUFELElBQVcsQ0FBQ0EsTUFBTSxDQUFDaEIsUUFBUCxDQUFnQlgsTUFBaEMsRUFBd0M7QUFDdEMsZUFBTyxFQUFQO0FBQ0Q7O0FBRUQsVUFBSThCLGVBQUo7O0FBQ0EsVUFBSSxLQUFLbkQsS0FBTCxDQUFXckcsY0FBWCxLQUE4QixNQUFsQyxFQUEwQztBQUN4Q3dKLFFBQUFBLGVBQWUsR0FBRztBQUNoQkMsVUFBQUEsSUFBSSxFQUFFQyxpQkFEVTtBQUVoQkMsVUFBQUEsU0FBUyxFQUFFLEtBQUt0RCxLQUFMLENBQVcxRCxtQkFGTjtBQUdoQmlILFVBQUFBLFdBQVcsRUFBRSxLQUFLdkQsS0FBTCxDQUFXekQscUJBSFI7QUFJaEJpSCxVQUFBQSxTQUFTLEVBQUUsS0FBS3hELEtBQUwsQ0FBV3hELHVCQUpOO0FBS2hCaUgsVUFBQUEsT0FBTyxFQUFFekssYUFBYSxDQUFDLEtBQUtnSCxLQUFMLENBQVd2RCxpQkFBWixDQUxOO0FBTWhCaUgsVUFBQUEsT0FBTyxFQUFFMUssYUFBYSxDQUFDLEtBQUtnSCxLQUFMLENBQVd0RCxxQkFBWixDQU5OO0FBT2hCaUgsVUFBQUEsUUFBUSxFQUFFM0ssYUFBYSxDQUFDLEtBQUtnSCxLQUFMLENBQVdyRCxzQkFBWixDQVBQO0FBUWhCaUgsVUFBQUEsUUFBUSxFQUFFNUssYUFBYSxDQUFDLEtBQUtnSCxLQUFMLENBQVdwRCxzQkFBWjtBQVJQLFNBQWxCO0FBVUQsT0FYRCxNQVdPO0FBQ0x1RyxRQUFBQSxlQUFlLEdBQUc7QUFDaEJDLFVBQUFBLElBQUksRUFBRVMsd0JBRFU7QUFFaEJDLFVBQUFBLFdBQVcsRUFBRSxLQUFLOUQsS0FBTCxDQUFXbEUsMEJBRlI7QUFHaEJ4QixVQUFBQSxPQUFPLEVBQUUsS0FBSzBGLEtBQUwsQ0FBV2pFLHNCQUhKO0FBSWhCTixVQUFBQSxZQUFZLEVBQUUsS0FBS3VFLEtBQUwsQ0FBV2hFLDBCQUpUO0FBS2hCK0gsVUFBQUEsZUFBZSxFQUFFLEtBQUsvRCxLQUFMLENBQVcvRCw4QkFMWjtBQU1oQitILFVBQUFBLGVBQWUsRUFBRSxLQUFLaEUsS0FBTCxDQUFXOUQsOEJBTlo7QUFPaEJiLFVBQUFBLFNBQVMsRUFBRXJDLGFBQWEsQ0FBQyxLQUFLZ0gsS0FBTCxDQUFXM0Qsd0JBQVosQ0FQUjtBQVFoQmpCLFVBQUFBLFlBQVksRUFBRXBDLGFBQWEsQ0FBQyxLQUFLZ0gsS0FBTCxDQUFXN0QsdUJBQVosQ0FSWDtBQVNoQmpCLFVBQUFBLFlBQVksRUFBRWxDLGFBQWEsQ0FBQyxLQUFLZ0gsS0FBTCxDQUFXNUQsOEJBQVo7QUFUWCxTQUFsQjtBQVdEOztBQUVELFVBQU02SCxLQUFLLEdBQUcsSUFBSTNELG9CQUFKLENBQ1osS0FBS1QsZ0JBQUwsQ0FBc0I7QUFDcEJDLFFBQUFBLEVBQUUsVUFEa0I7QUFFcEJDLFFBQUFBLElBQUksRUFBRWlELE1BRmM7QUFHcEI1SSxRQUFBQSxJQUFJLEVBQUUsS0FBSzRGLEtBQUwsQ0FBVzVGLElBSEc7QUFJcEI4RixRQUFBQSxjQUFjLEVBQUU7QUFDZGdFLFVBQUFBLE1BQU0sRUFBRWY7QUFETSxTQUpJO0FBT3BCNUksUUFBQUEsY0FBYyxFQUFFLEtBQUt5RixLQUFMLENBQVd6RixjQVBQO0FBUXBCQyxRQUFBQSxrQkFBa0IsRUFBRSxLQUFLd0YsS0FBTCxDQUFXeEYsa0JBUlg7QUFTcEJDLFFBQUFBLGtCQUFrQixFQUFFLEtBQUt1RixLQUFMLENBQVd2RixrQkFUWDtBQVVwQkcsUUFBQUEsY0FBYyxFQUFFLEtBQUtvRixLQUFMLENBQVdwRixjQVZQO0FBV3BCQyxRQUFBQSxnQkFBZ0IsRUFBRSxLQUFLbUYsS0FBTCxDQUFXbkYsZ0JBWFQ7QUFZcEJDLFFBQUFBLGNBQWMsRUFBRSxLQUFLa0YsS0FBTCxDQUFXbEYsY0FaUDtBQWFwQkksUUFBQUEsWUFBWSxFQUFFbEMsYUFBYSxDQUFDLEtBQUtnSCxLQUFMLENBQVdyRSxxQkFBWixDQWJQO0FBY3BCRixRQUFBQSxZQUFZLEVBQUV6QyxhQUFhLENBQUMsS0FBS2dILEtBQUwsQ0FBV25FLHFCQUFaLENBZFA7QUFlcEJULFFBQUFBLFlBQVksRUFBRXBDLGFBQWEsQ0FBQyxLQUFLZ0gsS0FBTCxDQUFXcEUscUJBQVo7QUFmUCxPQUF0QixDQURZLENBQWQ7QUFvQkEsYUFBTyxDQUFDcUksS0FBRCxDQUFQO0FBQ0Q7OzsyQ0FFc0I7QUFDckIsVUFBTWxLLElBQUksR0FBRyxLQUFLZ0osYUFBTCxFQUFiO0FBQ0EsVUFBTW9CLFFBQVEsR0FBR3BLLElBQUksQ0FBQ3FLLFdBQUwsQ0FBaUIsS0FBS2xCLFlBQUwsQ0FBa0IsS0FBS2xELEtBQXZCLENBQWpCLENBQWpCO0FBRUEsVUFBTWlFLEtBQUssR0FBRyxJQUFJSSxpQkFBSixDQUNaLEtBQUt4RSxnQkFBTCxDQUFzQjtBQUNwQkMsUUFBQUEsRUFBRSxZQURrQjtBQUVwQkMsUUFBQUEsSUFBSSxFQUFFb0U7QUFGYyxPQUF0QixDQURZLENBQWQ7QUFPQSxhQUFPLENBQUNGLEtBQUQsQ0FBUDtBQUNEOzs7aUNBRVlLLEssRUFBbUI7QUFDOUIsV0FBS3ZCLGFBQUwsR0FBcUJ3QixXQUFyQixDQUFpQ0QsS0FBakMsRUFBd0MsS0FBS3BCLFlBQUwsQ0FBa0IsS0FBS2xELEtBQXZCLENBQXhDO0FBQ0Q7OztpQ0FFWXNFLEssRUFBc0I7QUFDakMsV0FBS3ZCLGFBQUwsR0FBcUJ5QixXQUFyQixDQUFpQ0YsS0FBakMsRUFBd0MsS0FBS3BCLFlBQUwsQ0FBa0IsS0FBS2xELEtBQXZCLENBQXhDO0FBQ0Q7OztvQ0FFZXNFLEssRUFBMkI7QUFDekMsV0FBS3ZCLGFBQUwsR0FBcUIwQixtQkFBckIsQ0FBeUNILEtBQXpDLEVBQWdELEtBQUtwQixZQUFMLENBQWtCLEtBQUtsRCxLQUF2QixDQUFoRDtBQUNEOzs7K0JBRVVzRSxLLEVBQXNCO0FBQy9CLFdBQUt2QixhQUFMLEdBQXFCMkIsY0FBckIsQ0FBb0NKLEtBQXBDLEVBQTJDLEtBQUtwQixZQUFMLENBQWtCLEtBQUtsRCxLQUF2QixDQUEzQztBQUNEOzs7bUNBRWNzRSxLLEVBQTBCO0FBQ3ZDLFdBQUt2QixhQUFMLEdBQXFCNEIsa0JBQXJCLENBQXdDTCxLQUF4QyxFQUErQyxLQUFLcEIsWUFBTCxDQUFrQixLQUFLbEQsS0FBdkIsQ0FBL0M7QUFDRDs7O2tDQUVhc0UsSyxFQUF5QjtBQUNyQyxXQUFLNUQsUUFBTCxDQUFjO0FBQUV5QixRQUFBQSxvQkFBb0IsRUFBRW1DO0FBQXhCLE9BQWQ7QUFDQSxXQUFLdkIsYUFBTCxHQUFxQjZCLGlCQUFyQixDQUF1Q04sS0FBdkMsRUFBOEMsS0FBS3BCLFlBQUwsQ0FBa0IsS0FBS2xELEtBQXZCLENBQTlDO0FBQ0Q7OztxQ0FFa0Q7QUFBQSxVQUF2QzZFLFVBQXVDLFNBQXZDQSxVQUF1Qzs7QUFDakQsVUFBSSxLQUFLbkQsS0FBTCxLQUFlLElBQW5CLEVBQXlCO0FBQ3ZCO0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7O0FBSmdELFVBTTNDQyxNQU4yQyxHQU1oQyxLQUFLRCxLQU4yQixDQU0zQ0MsTUFOMkM7O0FBT2pELFVBQUksQ0FBQ0EsTUFBTCxFQUFhO0FBQ1g7QUFDQUEsUUFBQUEsTUFBTSxHQUFHa0QsVUFBVSxHQUFHLFVBQUgsR0FBZ0IsTUFBbkM7QUFDRDs7QUFDRCxhQUFPbEQsTUFBUDtBQUNEOzs7b0NBRW9DO0FBQ25DLGFBQU8sS0FBS0QsS0FBTCxDQUFXM0gsSUFBbEI7QUFDRDs7OztFQTdSK0MrSyx5Qjs7OztnQkFBN0JuRixvQixlQUNBLHNCOztnQkFEQUEsb0Isa0JBRUc3RixZIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbmltcG9ydCB7IEdlb0pzb25MYXllciwgU2NhdHRlcnBsb3RMYXllciwgSWNvbkxheWVyLCBUZXh0TGF5ZXIgfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG5pbXBvcnQge1xuICBWaWV3TW9kZSxcbiAgTW9kaWZ5TW9kZSxcbiAgVHJhbnNsYXRlTW9kZSxcbiAgU2NhbGVNb2RlLFxuICBSb3RhdGVNb2RlLFxuICBEdXBsaWNhdGVNb2RlLFxuICBTcGxpdFBvbHlnb25Nb2RlLFxuICBFeHRydWRlTW9kZSxcbiAgRWxldmF0aW9uTW9kZSxcbiAgRHJhd1BvaW50TW9kZSxcbiAgRHJhd0xpbmVTdHJpbmdNb2RlLFxuICBEcmF3UG9seWdvbk1vZGUsXG4gIERyYXdSZWN0YW5nbGVNb2RlLFxuICBEcmF3U3F1YXJlRnJvbUNlbnRlck1vZGUsXG4gIERyYXdDaXJjbGVGcm9tQ2VudGVyTW9kZSxcbiAgRHJhd0NpcmNsZUJ5RGlhbWV0ZXJNb2RlLFxuICBEcmF3RWxsaXBzZUJ5Qm91bmRpbmdCb3hNb2RlLFxuICBEcmF3UmVjdGFuZ2xlVXNpbmdUaHJlZVBvaW50c01vZGUsXG4gIERyYXdFbGxpcHNlVXNpbmdUaHJlZVBvaW50c01vZGUsXG4gIERyYXc5MERlZ3JlZVBvbHlnb25Nb2RlLFxuICBEcmF3UG9seWdvbkJ5RHJhZ2dpbmdNb2RlLFxuICBTbmFwcGFibGVNb2RlLFxuICBUcmFuc2Zvcm1Nb2RlLFxuICBFZGl0QWN0aW9uLFxuICBDbGlja0V2ZW50LFxuICBTdGFydERyYWdnaW5nRXZlbnQsXG4gIFN0b3BEcmFnZ2luZ0V2ZW50LFxuICBEcmFnZ2luZ0V2ZW50LFxuICBQb2ludGVyTW92ZUV2ZW50LFxuICBHZW9Kc29uRWRpdE1vZGVUeXBlLFxuICBHZW9Kc29uRWRpdE1vZGVDb25zdHJ1Y3RvcixcbiAgRmVhdHVyZUNvbGxlY3Rpb24sXG59IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5cbmltcG9ydCBFZGl0YWJsZUxheWVyIGZyb20gJy4vZWRpdGFibGUtbGF5ZXInO1xuXG5jb25zdCBERUZBVUxUX0xJTkVfQ09MT1IgPSBbMHgwLCAweDAsIDB4MCwgMHg5OV07XG5jb25zdCBERUZBVUxUX0ZJTExfQ09MT1IgPSBbMHgwLCAweDAsIDB4MCwgMHg5MF07XG5jb25zdCBERUZBVUxUX1NFTEVDVEVEX0xJTkVfQ09MT1IgPSBbMHgwLCAweDAsIDB4MCwgMHhmZl07XG5jb25zdCBERUZBVUxUX1NFTEVDVEVEX0ZJTExfQ09MT1IgPSBbMHgwLCAweDAsIDB4OTAsIDB4OTBdO1xuY29uc3QgREVGQVVMVF9URU5UQVRJVkVfTElORV9DT0xPUiA9IFsweDkwLCAweDkwLCAweDkwLCAweGZmXTtcbmNvbnN0IERFRkFVTFRfVEVOVEFUSVZFX0ZJTExfQ09MT1IgPSBbMHg5MCwgMHg5MCwgMHg5MCwgMHg5MF07XG5jb25zdCBERUZBVUxUX0VESVRJTkdfRVhJU1RJTkdfUE9JTlRfQ09MT1IgPSBbMHhjMCwgMHgwLCAweDAsIDB4ZmZdO1xuY29uc3QgREVGQVVMVF9FRElUSU5HX0lOVEVSTUVESUFURV9QT0lOVF9DT0xPUiA9IFsweDAsIDB4MCwgMHgwLCAweDgwXTtcbmNvbnN0IERFRkFVTFRfRURJVElOR19TTkFQX1BPSU5UX0NPTE9SID0gWzB4N2MsIDB4MDAsIDB4YzAsIDB4ZmZdO1xuY29uc3QgREVGQVVMVF9FRElUSU5HX1BPSU5UX09VVExJTkVfQ09MT1IgPSBbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl07XG5jb25zdCBERUZBVUxUX0VESVRJTkdfRVhJU1RJTkdfUE9JTlRfUkFESVVTID0gNTtcbmNvbnN0IERFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfUkFESVVTID0gMztcbmNvbnN0IERFRkFVTFRfRURJVElOR19TTkFQX1BPSU5UX1JBRElVUyA9IDc7XG5cbmNvbnN0IERFRkFVTFRfRURJVF9NT0RFID0gRHJhd1BvbHlnb25Nb2RlO1xuXG5mdW5jdGlvbiBndWlkZUFjY2Vzc29yKGFjY2Vzc29yKSB7XG4gIGlmICghYWNjZXNzb3IgfHwgdHlwZW9mIGFjY2Vzc29yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGFjY2Vzc29yO1xuICB9XG4gIHJldHVybiAoZ3VpZGVNYXliZVdyYXBwZWQpID0+IGFjY2Vzc29yKHVud3JhcEd1aWRlKGd1aWRlTWF5YmVXcmFwcGVkKSk7XG59XG5cbi8vIFRoZSBvYmplY3QgaGFuZGVkIHRvIHVzIGZyb20gZGVjay5nbCBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIGRlY2suZ2wgdXNlZCwgdW53cmFwIGFzIG5lY2Vzc2FyeVxuZnVuY3Rpb24gdW53cmFwR3VpZGUoZ3VpZGVNYXliZVdyYXBwZWQpIHtcbiAgaWYgKGd1aWRlTWF5YmVXcmFwcGVkLl9fc291cmNlKSB7XG4gICAgcmV0dXJuIGd1aWRlTWF5YmVXcmFwcGVkLl9fc291cmNlLm9iamVjdDtcbiAgfSBlbHNlIGlmIChndWlkZU1heWJlV3JhcHBlZC5zb3VyY2VGZWF0dXJlKSB7XG4gICAgcmV0dXJuIGd1aWRlTWF5YmVXcmFwcGVkLnNvdXJjZUZlYXR1cmUuZmVhdHVyZTtcbiAgfVxuICAvLyBJdCBpcyBub3Qgd3JhcHBlZCwgcmV0dXJuIGFzIGlzXG4gIHJldHVybiBndWlkZU1heWJlV3JhcHBlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RWRpdEhhbmRsZUNvbG9yKGhhbmRsZSkge1xuICBzd2l0Y2ggKGhhbmRsZS5wcm9wZXJ0aWVzLmVkaXRIYW5kbGVUeXBlKSB7XG4gICAgY2FzZSAnZXhpc3RpbmcnOlxuICAgICAgcmV0dXJuIERFRkFVTFRfRURJVElOR19FWElTVElOR19QT0lOVF9DT0xPUjtcbiAgICBjYXNlICdzbmFwLXNvdXJjZSc6XG4gICAgICByZXR1cm4gREVGQVVMVF9FRElUSU5HX1NOQVBfUE9JTlRfQ09MT1I7XG4gICAgY2FzZSAnaW50ZXJtZWRpYXRlJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIERFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfQ09MT1I7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RWRpdEhhbmRsZU91dGxpbmVDb2xvcihoYW5kbGUpIHtcbiAgcmV0dXJuIERFRkFVTFRfRURJVElOR19QT0lOVF9PVVRMSU5FX0NPTE9SO1xufVxuXG5mdW5jdGlvbiBnZXRFZGl0SGFuZGxlUmFkaXVzKGhhbmRsZSkge1xuICBzd2l0Y2ggKGhhbmRsZS5wcm9wZXJ0aWVzLmVkaXRIYW5kbGVUeXBlKSB7XG4gICAgY2FzZSAnZXhpc3RpbmcnOlxuICAgICAgcmV0dXJuIERFRkFVTFRfRURJVElOR19FWElTVElOR19QT0lOVF9SQURJVVM7XG4gICAgY2FzZSAnc25hcCc6XG4gICAgICByZXR1cm4gREVGQVVMVF9FRElUSU5HX1NOQVBfUE9JTlRfUkFESVVTO1xuICAgIGNhc2UgJ2ludGVybWVkaWF0ZSc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBERUZBVUxUX0VESVRJTkdfSU5URVJNRURJQVRFX1BPSU5UX1JBRElVUztcbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIG1vZGU6IERFRkFVTFRfRURJVF9NT0RFLFxuXG4gIC8vIEVkaXQgYW5kIGludGVyYWN0aW9uIGV2ZW50c1xuICBvbkVkaXQ6ICgpID0+IHt9LFxuXG4gIHBpY2thYmxlOiB0cnVlLFxuICBwaWNraW5nUmFkaXVzOiAxMCxcbiAgcGlja2luZ0RlcHRoOiA1LFxuICBmcDY0OiBmYWxzZSxcbiAgZmlsbGVkOiB0cnVlLFxuICBzdHJva2VkOiB0cnVlLFxuICBsaW5lV2lkdGhTY2FsZTogMSxcbiAgbGluZVdpZHRoTWluUGl4ZWxzOiAxLFxuICBsaW5lV2lkdGhNYXhQaXhlbHM6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICBsaW5lV2lkdGhVbml0czogJ3BpeGVscycsXG4gIGxpbmVKb2ludFJvdW5kZWQ6IGZhbHNlLFxuICBsaW5lTWl0ZXJMaW1pdDogNCxcbiAgcG9pbnRSYWRpdXNTY2FsZTogMSxcbiAgcG9pbnRSYWRpdXNNaW5QaXhlbHM6IDIsXG4gIHBvaW50UmFkaXVzTWF4UGl4ZWxzOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgZ2V0TGluZUNvbG9yOiAoZmVhdHVyZSwgaXNTZWxlY3RlZCwgbW9kZSkgPT5cbiAgICBpc1NlbGVjdGVkID8gREVGQVVMVF9TRUxFQ1RFRF9MSU5FX0NPTE9SIDogREVGQVVMVF9MSU5FX0NPTE9SLFxuICBnZXRGaWxsQ29sb3I6IChmZWF0dXJlLCBpc1NlbGVjdGVkLCBtb2RlKSA9PlxuICAgIGlzU2VsZWN0ZWQgPyBERUZBVUxUX1NFTEVDVEVEX0ZJTExfQ09MT1IgOiBERUZBVUxUX0ZJTExfQ09MT1IsXG4gIGdldFJhZGl1czogKGYpID0+XG4gICAgKGYgJiYgZi5wcm9wZXJ0aWVzICYmIGYucHJvcGVydGllcy5yYWRpdXMpIHx8IChmICYmIGYucHJvcGVydGllcyAmJiBmLnByb3BlcnRpZXMuc2l6ZSkgfHwgMSxcbiAgZ2V0TGluZVdpZHRoOiAoZikgPT4gKGYgJiYgZi5wcm9wZXJ0aWVzICYmIGYucHJvcGVydGllcy5saW5lV2lkdGgpIHx8IDMsXG5cbiAgLy8gVGVudGF0aXZlIGZlYXR1cmUgcmVuZGVyaW5nXG4gIGdldFRlbnRhdGl2ZUxpbmVDb2xvcjogKGYpID0+IERFRkFVTFRfVEVOVEFUSVZFX0xJTkVfQ09MT1IsXG4gIGdldFRlbnRhdGl2ZUZpbGxDb2xvcjogKGYpID0+IERFRkFVTFRfVEVOVEFUSVZFX0ZJTExfQ09MT1IsXG4gIGdldFRlbnRhdGl2ZUxpbmVXaWR0aDogKGYpID0+IChmICYmIGYucHJvcGVydGllcyAmJiBmLnByb3BlcnRpZXMubGluZVdpZHRoKSB8fCAzLFxuXG4gIGVkaXRIYW5kbGVUeXBlOiAncG9pbnQnLFxuXG4gIC8vIHBvaW50IGhhbmRsZXNcbiAgZWRpdEhhbmRsZVBvaW50UmFkaXVzU2NhbGU6IDEsXG4gIGVkaXRIYW5kbGVQb2ludE91dGxpbmU6IHRydWUsXG4gIGVkaXRIYW5kbGVQb2ludFN0cm9rZVdpZHRoOiAyLFxuICBlZGl0SGFuZGxlUG9pbnRSYWRpdXNNaW5QaXhlbHM6IDQsXG4gIGVkaXRIYW5kbGVQb2ludFJhZGl1c01heFBpeGVsczogOCxcbiAgZ2V0RWRpdEhhbmRsZVBvaW50Q29sb3I6IGdldEVkaXRIYW5kbGVDb2xvcixcbiAgZ2V0RWRpdEhhbmRsZVBvaW50T3V0bGluZUNvbG9yOiBnZXRFZGl0SGFuZGxlT3V0bGluZUNvbG9yLFxuICBnZXRFZGl0SGFuZGxlUG9pbnRSYWRpdXM6IGdldEVkaXRIYW5kbGVSYWRpdXMsXG5cbiAgLy8gaWNvbiBoYW5kbGVzXG4gIGVkaXRIYW5kbGVJY29uQXRsYXM6IG51bGwsXG4gIGVkaXRIYW5kbGVJY29uTWFwcGluZzogbnVsbCxcbiAgZWRpdEhhbmRsZUljb25TaXplU2NhbGU6IDEsXG4gIGdldEVkaXRIYW5kbGVJY29uOiAoaGFuZGxlKSA9PiBoYW5kbGUucHJvcGVydGllcy5lZGl0SGFuZGxlVHlwZSxcbiAgZ2V0RWRpdEhhbmRsZUljb25TaXplOiAxMCxcbiAgZ2V0RWRpdEhhbmRsZUljb25Db2xvcjogZ2V0RWRpdEhhbmRsZUNvbG9yLFxuICBnZXRFZGl0SGFuZGxlSWNvbkFuZ2x