@jacobsdigitalfactory/react-image-hotspots
Version:
React component for rendering images with hotspots
569 lines (512 loc) • 76.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _Hotspot = _interopRequireDefault(require("./Hotspot"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { 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 _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
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 ImageHotspots =
/*#__PURE__*/
function (_React$Component) {
_inherits(ImageHotspots, _React$Component);
function ImageHotspots(props) {
var _this;
_classCallCheck(this, ImageHotspots);
_this = _possibleConstructorReturn(this, _getPrototypeOf(ImageHotspots).call(this, props));
_defineProperty(_assertThisInitialized(_this), "componentDidMount", function () {
var _this$props = _this.props,
hideFullscreenControl = _this$props.hideFullscreenControl,
hideZoomControls = _this$props.hideZoomControls,
hideMinimap = _this$props.hideMinimap,
hotspots = _this$props.hotspots,
background = _this$props.background;
var _this$container$curre = _this.container.current,
width = _this$container$curre.offsetWidth,
height = _this$container$curre.offsetHeight;
var orientation = width > height ? 'landscape' : 'portrait';
var ratio = orientation === 'landscape' ? width / height : height / width;
_this.setState({
container: {
width: width,
height: height,
ratio: ratio,
orientation: orientation,
background: background
},
hideFullscreenControl: hideFullscreenControl,
hideZoomControls: hideZoomControls,
hideMinimap: hideMinimap,
hotspots: hotspots
});
window.addEventListener('resize', _this.onWindowResize);
});
_defineProperty(_assertThisInitialized(_this), "componentWillUnmount", function () {
window.removeEventListener('resize', _this.onWindowResize);
});
_defineProperty(_assertThisInitialized(_this), "startDrag", function (event, element) {
var cursorX = event.clientX;
var cursorY = event.clientY;
if (element === 'image') {
_this.setState(function (state) {
return _objectSpread({}, state, {
cursorX: cursorX,
cursorY: cursorY,
dragging: true
});
});
} else if (element === 'guide') {// TODO
}
event.preventDefault();
});
_defineProperty(_assertThisInitialized(_this), "whileDrag", function (event) {
var _this$state = _this.state,
image = _this$state.image,
minimap = _this$state.minimap;
var cursorX = event.clientX;
var cursorY = event.clientY;
var deltaX = cursorX - _this.state.cursorX;
var deltaY = cursorY - _this.state.cursorY;
var newOffsetX = image.offsetX + deltaX;
var newOffsetY = image.offsetY + deltaY;
_this.setState(function (state) {
return _objectSpread({}, state, {
cursorX: cursorX,
cursorY: cursorY,
image: _objectSpread({}, image, {
offsetX: newOffsetX,
offsetY: newOffsetY
}),
minimap: _objectSpread({}, minimap, {
offsetX: -(minimap.width / image.width * newOffsetX),
offsetY: -(minimap.height / image.height * newOffsetY)
})
});
});
});
_defineProperty(_assertThisInitialized(_this), "stopDrag", function () {
var _this$state2 = _this.state,
container = _this$state2.container,
image = _this$state2.image,
minimap = _this$state2.minimap;
var deltaX = container.width - image.width - image.offsetX;
var deltaY = container.height - image.height - image.offsetY;
var offsetXMax = container.orientation === image.orientation ? -Math.abs(image.width - container.width) : -Math.abs(container.width - image.width);
var offsetYMax = container.orientation === image.orientation ? -Math.abs(container.height - image.height) : -Math.abs(image.height - container.height);
_this.setState(function (state) {
return _objectSpread({}, state, {
image: _objectSpread({}, state.image, {
offsetX: image.offsetX >= 0 ? 0 : deltaX >= 0 ? offsetXMax : image.offsetX,
offsetY: image.offsetY >= 0 ? container.height > image.height ? container.height / 2 - image.height / 2 : 0 : deltaY >= 0 ? container.height > image.height ? container.height / 2 - image.height / 2 : offsetYMax : image.offsetY
}),
minimap: _objectSpread({}, state.minimap, {
offsetX: image.offsetX >= 0 || image.width < container.width ? 0 : deltaX >= 0 ? -(minimap.height / image.height * offsetXMax) : -(minimap.height / image.height * image.offsetX),
offsetY: image.offsetY >= 0 || image.height < container.height ? 0 : deltaY >= 0 ? -(minimap.height / image.height * offsetYMax) : -(minimap.height / image.height * image.offsetY)
}),
dragging: false
});
});
});
_defineProperty(_assertThisInitialized(_this), "onImageLoad", function (_ref) {
var image = _ref.target;
var initialWidth = image.offsetWidth,
initialHeight = image.offsetHeight;
var _this$state3 = _this.state,
container = _this$state3.container,
minimap = _this$state3.minimap,
hideZoomControls = _this$state3.hideZoomControls,
hideMinimap = _this$state3.hideMinimap;
var orientation = initialWidth > initialHeight ? 'landscape' : 'portrait';
var ratio = orientation === 'landscape' ? initialWidth / initialHeight : initialHeight / initialWidth;
var width = container.orientation === orientation ? orientation === 'landscape' ? ratio >= container.ratio ? container.width // landscape image bigger than landscape container
: container.height * ratio // landscape image smaller than landscape container
: ratio >= container.ratio ? container.height / ratio // portrait image bigger than portrait container
: container.width // portrait image smaller than portrait container
: orientation === 'landscape' ? container.width // landscape image and portrait container
: container.height / ratio; // portrait image and landscape container
var height = container.orientation === orientation ? orientation === 'landscape' ? ratio >= container.ratio ? container.width / ratio // landscape image bigger than landscape container
: container.height // landscape image smaller than landscape container
: ratio >= container.ratio ? container.height // portrait image bigger than portrait container
: container.width * ratio // portrait image smaller than portrait container
: orientation === 'landscape' ? container.width / ratio // landscape image and portrait container
: container.height; // portrait image and landscape container
var resizable = initialWidth > width || initialHeight > height;
_this.setState(function (prevState) {
return _objectSpread({}, prevState, {
image: _objectSpread({}, prevState.image, {
initialWidth: initialWidth,
initialHeight: initialHeight,
width: width,
height: height,
scale: 1,
ratio: ratio,
orientation: orientation,
offsetX: 0,
offsetY: container.height / 2 - height / 2
}),
minimap: _objectSpread({}, minimap, {
width: orientation === 'landscape' ? minimap.initialSize : minimap.initialSize / ratio,
height: orientation === 'portrait' ? minimap.initialSize : minimap.initialSize / ratio,
guideWidth: orientation === 'landscape' ? minimap.initialSize : minimap.initialSize / ratio,
guideHeight: orientation === 'portrait' ? minimap.initialSize : minimap.initialSize / ratio
}),
hideZoomControls: hideZoomControls || !resizable,
hideMinimap: hideMinimap || !resizable,
resizable: resizable,
draggable: false
});
});
});
_defineProperty(_assertThisInitialized(_this), "onWindowResize", function () {
var _this$container$curre2 = _this.container.current,
width = _this$container$curre2.offsetWidth,
height = _this$container$curre2.offsetHeight;
var orientation = width > height ? 'landscape' : 'portrait';
var ratio = orientation === 'landscape' ? width / height : height / width;
_this.setState({
container: {
width: width,
height: height,
ratio: ratio,
orientation: orientation
}
});
_this.zoom(_this.state.image.scale);
});
_defineProperty(_assertThisInitialized(_this), "toggleFullscreen", function () {
var fullscreen = _this.state.fullscreen;
if (!fullscreen) {
_this.requestFullscreen(_this.container.current);
_this.setState({
fullscreen: true
});
} else {
_this.exitFullscreen();
_this.setState({
fullscreen: false
});
}
});
_defineProperty(_assertThisInitialized(_this), "zoom", function (scale) {
if (scale > 0) {
var _this$state4 = _this.state,
container = _this$state4.container,
image = _this$state4.image,
minimap = _this$state4.minimap;
var width = container.orientation === image.orientation ? image.orientation === 'landscape' ? image.ratio >= container.ratio ? container.width * scale // landscape image bigger than landscape container
: container.height * image.ratio * scale // landscape image smaller than landscape container
: image.ratio >= container.ratio ? container.height / image.ratio * scale // portrait image bigger than portrait container
: container.width * scale // portrait image smaller than portrait container
: image.orientation === 'landscape' ? container.width * scale // landscape image and portrait container
: container.height / image.ratio * scale; // portrait image and landscape container
var height = container.orientation === image.orientation ? image.orientation === 'landscape' ? image.ratio >= container.ratio ? container.width / image.ratio * scale // landscape image bigger than landscape container
: container.height * scale // landscape image smaller than landscape container
: image.ratio >= container.ratio ? container.height * scale // portrait image bigger than portrait container
: container.width * image.ratio * scale // portrait image smaller than portrait container
: image.orientation === 'landscape' ? container.width / image.ratio * scale // landscape image and portrait container
: container.height * scale; // portrait image and landscape container
var guideWidth = container.width >= width ? minimap.width : minimap.width / (width / container.width);
var guideHeight = container.height >= height ? minimap.height : minimap.height / (height / container.height);
var deltaX = Math.round(width - image.width);
var deltaY = Math.round(height - image.height);
var guideDeltaX = Math.round(guideWidth - minimap.guideWidth);
var guideDeltaY = Math.round(guideHeight - minimap.guideHeight);
var offsetX = image.offsetX - deltaX / 2;
var offsetY = image.offsetY - deltaY / 2;
var guideOffsetX = Math.round(minimap.offsetX - guideDeltaX / 2);
var guideOffsetY = Math.round(minimap.offsetY - guideDeltaY / 2);
var offsetXMax = -Math.abs(Math.round(container.width - width));
var offsetYMax = -Math.abs(Math.round(container.height - height));
var guideOffsetXMax = Math.round(minimap.width - guideWidth);
var guideOffsetYMax = Math.round(minimap.height - guideHeight);
if (image.initialWidth > width && image.initialHeight > height) {
_this.setState(function (prevState) {
return {
image: _objectSpread({}, prevState.image, {
width: width,
height: height,
scale: scale,
offsetX: offsetX >= 0 || container.width > width ? 0 : image.offsetX <= offsetXMax ? offsetXMax : offsetX,
offsetY: container.height > height ? container.height / 2 - height / 2 : offsetY >= 0 ? 0 : image.offsetY < offsetYMax ? offsetYMax : offsetY
}),
minimap: _objectSpread({}, prevState.minimap, {
guideWidth: guideWidth,
guideHeight: guideHeight,
offsetX: guideOffsetX <= 0 ? 0 : minimap.offsetX < guideOffsetXMax ? guideOffsetX : guideOffsetXMax,
offsetY: guideOffsetY <= 0 || height < container.height ? 0 : minimap.offsetY < guideOffsetYMax ? guideOffsetY : guideOffsetYMax
}),
draggable: scale > 1
};
});
} // Reset image position
if (scale === 1) {
_this.setState(function (prevState) {
return {
image: _objectSpread({}, prevState.image, {
offsetX: 0,
offsetY: container.height / 2 - height / 2
}),
minimap: _objectSpread({}, prevState.minimap, {
offsetX: 0,
offsetY: 0
})
};
});
}
}
});
_defineProperty(_assertThisInitialized(_this), "requestFullscreen", function (element) {
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
}
});
_defineProperty(_assertThisInitialized(_this), "exitFullscreen", function () {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
});
_defineProperty(_assertThisInitialized(_this), "render", function () {
var _this$props2 = _this.props,
src = _this$props2.src,
alt = _this$props2.alt,
hotspots = _this$props2.hotspots,
background = _this$props2.background;
var _this$state5 = _this.state,
container = _this$state5.container,
image = _this$state5.image,
minimap = _this$state5.minimap,
fullscreen = _this$state5.fullscreen,
dragging = _this$state5.dragging,
hideFullscreenControl = _this$state5.hideFullscreenControl,
hideZoomControls = _this$state5.hideZoomControls,
hideMinimap = _this$state5.hideMinimap,
draggable = _this$state5.draggable;
var imageLoaded = image.initialWidth && image.initialHeight;
var containerStyle = {
width: '100%',
height: '100%',
position: 'relative',
overflow: 'hidden',
textAlign: 'center',
background: background || container.background
};
var imageStyle = {
position: 'relative',
left: image.offsetX,
top: image.offsetY
};
var hotspotsStyle = {
position: 'absolute',
top: image.offsetY,
left: image.offsetX,
right: image.offsetX >= 0 ? 0 : 'auto',
margin: 'auto',
pointerEvents: 'none'
};
var topControlsStyle = {
position: 'absolute',
top: 10,
right: 10,
pointerEvents: _this.state.dragging ? 'none' : 'auto'
};
var bottomControlsStyle = {
position: 'absolute',
bottom: 10,
right: 10,
pointerEvents: _this.state.dragging ? 'none' : 'auto'
};
var buttonStyle = {
width: '25px',
height: '25px',
border: 'none',
background: '#fff',
boxShadow: '0px 0px 2px 0px rgba(0,0,0,0.5)'
};
var minimapStyle = {
width: minimap.width,
height: minimap.height,
position: 'absolute',
display: 'block',
bottom: 10,
left: 10,
background: '#fff',
boxShadow: '0px 0px 2px 0px rgba(0,0,0,0.5)',
pointerEvents: 'none'
};
var guideStyle = {
width: minimap.guideWidth,
height: minimap.guideHeight,
position: 'absolute',
display: 'block',
left: minimap.offsetX,
top: minimap.offsetY,
border: '1px solid rgba(64, 139, 252, 0.8)',
background: 'rgba(64, 139, 252, 0.1)',
pointerEvents: 'none'
};
if (imageLoaded) {
if (container.orientation === 'landscape') {
imageStyle.height = image.height;
} else {
imageStyle.width = image.width;
}
if (image.orientation === 'landscape') {
hotspotsStyle.width = image.width;
hotspotsStyle.height = image.width / image.ratio;
} else {
hotspotsStyle.width = image.height / image.ratio;
hotspotsStyle.height = image.height;
}
}
return _react["default"].createElement("div", {
className: "react-image-hotspots",
ref: _this.container,
style: containerStyle,
onMouseOut: function onMouseOut(event) {
if (dragging) {
_this.stopDrag(event);
}
},
onBlur: function onBlur(event) {
if (dragging) {
_this.stopDrag(event);
}
}
}, src && _react["default"].createElement("img", {
src: src,
alt: alt,
onLoad: _this.onImageLoad,
style: imageStyle,
onMouseDown: function onMouseDown(event) {
if (!hideZoomControls && draggable) {
_this.startDrag(event, 'image');
}
},
onMouseMove: function onMouseMove(event) {
if (!hideZoomControls && dragging) {
_this.whileDrag(event);
}
},
onMouseUp: function onMouseUp(event) {
if (dragging) {
_this.stopDrag(event);
}
}
}), hotspots && _react["default"].createElement("div", {
style: hotspotsStyle
}, hotspots.map(function (hotspot, i) {
return _react["default"].createElement(_Hotspot["default"], _extends({
key: i
}, hotspot));
})), !hideFullscreenControl && _react["default"].createElement("div", {
style: topControlsStyle
}, _react["default"].createElement("button", {
style: buttonStyle,
onClick: function onClick() {
return _this.toggleFullscreen();
}
}, fullscreen ? 'X' : 'FS')), !hideZoomControls && _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("div", {
style: bottomControlsStyle
}, draggable && _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("button", {
style: buttonStyle,
onClick: function onClick() {
return _this.zoom(1);
}
}, "Fit"), _react["default"].createElement("br", null), _react["default"].createElement("br", null)), _react["default"].createElement("button", {
style: buttonStyle,
onClick: function onClick() {
return _this.zoom(image.scale + 1);
}
}, "+"), _react["default"].createElement("br", null), _react["default"].createElement("button", {
style: buttonStyle,
onClick: function onClick() {
return _this.zoom(image.scale - 1);
}
}, "-")), !hideMinimap && _react["default"].createElement("div", {
style: minimapStyle
}, src && _react["default"].createElement("img", {
src: src,
width: minimapStyle.width,
height: minimapStyle.height
}), _react["default"].createElement("div", {
style: guideStyle
}))));
});
_this.state = {
container: {
width: undefined,
height: undefined,
ratio: undefined,
orientation: undefined,
background: undefined
},
image: {
initialWidth: undefined,
initialHeight: undefined,
width: undefined,
height: undefined,
scale: undefined,
ratio: undefined,
orientation: undefined,
offsetX: undefined,
offsetY: undefined
},
minimap: {
initialSize: 100,
width: undefined,
height: undefined,
guideWidth: undefined,
guideHeight: undefined,
offsetX: 0,
offsetY: 0
},
hideFullscreenControl: false,
hideZoomControls: false,
hideMinimap: false,
resizable: undefined,
draggable: undefined,
cursorX: undefined,
cursorY: undefined,
mcursorX: undefined,
mcursorY: undefined,
dragging: undefined,
isGuideDragging: undefined,
hotspots: []
};
_this.container = _react["default"].createRef();
return _this;
}
return ImageHotspots;
}(_react["default"].Component);
ImageHotspots.propTypes = {
src: _propTypes["default"].string,
alt: _propTypes["default"].string,
hotspots: _propTypes["default"].array
};
var _default = ImageHotspots;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9JbWFnZUhvdHNwb3RzLmpzIl0sIm5hbWVzIjpbIkltYWdlSG90c3BvdHMiLCJwcm9wcyIsImhpZGVGdWxsc2NyZWVuQ29udHJvbCIsImhpZGVab29tQ29udHJvbHMiLCJoaWRlTWluaW1hcCIsImhvdHNwb3RzIiwiYmFja2dyb3VuZCIsImNvbnRhaW5lciIsImN1cnJlbnQiLCJ3aWR0aCIsIm9mZnNldFdpZHRoIiwiaGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib3JpZW50YXRpb24iLCJyYXRpbyIsInNldFN0YXRlIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uV2luZG93UmVzaXplIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImV2ZW50IiwiZWxlbWVudCIsImN1cnNvclgiLCJjbGllbnRYIiwiY3Vyc29yWSIsImNsaWVudFkiLCJzdGF0ZSIsImRyYWdnaW5nIiwicHJldmVudERlZmF1bHQiLCJpbWFnZSIsIm1pbmltYXAiLCJkZWx0YVgiLCJkZWx0YVkiLCJuZXdPZmZzZXRYIiwib2Zmc2V0WCIsIm5ld09mZnNldFkiLCJvZmZzZXRZIiwib2Zmc2V0WE1heCIsIk1hdGgiLCJhYnMiLCJvZmZzZXRZTWF4IiwidGFyZ2V0IiwiaW5pdGlhbFdpZHRoIiwiaW5pdGlhbEhlaWdodCIsInJlc2l6YWJsZSIsInByZXZTdGF0ZSIsInNjYWxlIiwiaW5pdGlhbFNpemUiLCJndWlkZVdpZHRoIiwiZ3VpZGVIZWlnaHQiLCJkcmFnZ2FibGUiLCJ6b29tIiwiZnVsbHNjcmVlbiIsInJlcXVlc3RGdWxsc2NyZWVuIiwiZXhpdEZ1bGxzY3JlZW4iLCJyb3VuZCIsImd1aWRlRGVsdGFYIiwiZ3VpZGVEZWx0YVkiLCJndWlkZU9mZnNldFgiLCJndWlkZU9mZnNldFkiLCJndWlkZU9mZnNldFhNYXgiLCJndWlkZU9mZnNldFlNYXgiLCJtb3pSZXF1ZXN0RnVsbFNjcmVlbiIsIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiwibXNSZXF1ZXN0RnVsbHNjcmVlbiIsImRvY3VtZW50IiwibW96Q2FuY2VsRnVsbFNjcmVlbiIsIndlYmtpdEV4aXRGdWxsc2NyZWVuIiwibXNFeGl0RnVsbHNjcmVlbiIsInNyYyIsImFsdCIsImltYWdlTG9hZGVkIiwiY29udGFpbmVyU3R5bGUiLCJwb3NpdGlvbiIsIm92ZXJmbG93IiwidGV4dEFsaWduIiwiaW1hZ2VTdHlsZSIsImxlZnQiLCJ0b3AiLCJob3RzcG90c1N0eWxlIiwicmlnaHQiLCJtYXJnaW4iLCJwb2ludGVyRXZlbnRzIiwidG9wQ29udHJvbHNTdHlsZSIsImJvdHRvbUNvbnRyb2xzU3R5bGUiLCJib3R0b20iLCJidXR0b25TdHlsZSIsImJvcmRlciIsImJveFNoYWRvdyIsIm1pbmltYXBTdHlsZSIsImRpc3BsYXkiLCJndWlkZVN0eWxlIiwic3RvcERyYWciLCJvbkltYWdlTG9hZCIsInN0YXJ0RHJhZyIsIndoaWxlRHJhZyIsIm1hcCIsImhvdHNwb3QiLCJpIiwidG9nZ2xlRnVsbHNjcmVlbiIsInVuZGVmaW5lZCIsIm1jdXJzb3JYIiwibWN1cnNvclkiLCJpc0d1aWRlRHJhZ2dpbmciLCJSZWFjdCIsImNyZWF0ZVJlZiIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFycmF5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRU1BLGE7Ozs7O0FBQ0oseUJBQWFDLEtBQWIsRUFBb0I7QUFBQTs7QUFBQTs7QUFDbEIsdUZBQU1BLEtBQU47O0FBRGtCLHdFQWdEQSxZQUFNO0FBQUEsd0JBT3BCLE1BQUtBLEtBUGU7QUFBQSxVQUV0QkMscUJBRnNCLGVBRXRCQSxxQkFGc0I7QUFBQSxVQUd0QkMsZ0JBSHNCLGVBR3RCQSxnQkFIc0I7QUFBQSxVQUl0QkMsV0FKc0IsZUFJdEJBLFdBSnNCO0FBQUEsVUFLdEJDLFFBTHNCLGVBS3RCQSxRQUxzQjtBQUFBLFVBTXRCQyxVQU5zQixlQU10QkEsVUFOc0I7QUFBQSxr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