react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
217 lines (171 loc) • 24.4 kB
JavaScript
import { List, Map } from 'immutable';
import { SELECT_TOOL_DRAWING_ITEM, UPDATE_DRAWING_ITEM, END_DRAWING_ITEM, BEGIN_DRAGGING_ITEM, UPDATE_DRAGGING_ITEM, END_DRAGGING_ITEM, BEGIN_ROTATING_ITEM, UPDATE_ROTATING_ITEM, END_ROTATING_ITEM, SELECT_ITEM, MODE_IDLE, MODE_DRAWING_ITEM, MODE_DRAGGING_ITEM, MODE_ROTATING_ITEM } from '../constants';
import { addItem, removeItem, unselect, select, unselectAll } from '../utils/layer-operations';
import * as Geometry from '../utils/geometry';
export default function (state, action) {
switch (action.type) {
case SELECT_ITEM:
return selectItem(state, action.layerID, action.itemID);
case SELECT_TOOL_DRAWING_ITEM:
return selectToolDrawingItem(state, action.sceneComponentType);
case UPDATE_DRAWING_ITEM:
return updateDrawingItem(state, action.layerID, action.x, action.y);
case END_DRAWING_ITEM:
return endDrawingItem(state, action.layerID, action.x, action.y);
case BEGIN_DRAGGING_ITEM:
return beginDraggingItem(state, action.layerID, action.itemID, action.x, action.y);
case UPDATE_DRAGGING_ITEM:
return updateDraggingItem(state, action.x, action.y);
case END_DRAGGING_ITEM:
return endDraggingItem(state, action.x, action.y);
case BEGIN_ROTATING_ITEM:
return beginRotatingItem(state, action.layerID, action.itemID, action.x, action.y);
case UPDATE_ROTATING_ITEM:
return updateRotatingItem(state, action.x, action.y);
case END_ROTATING_ITEM:
return endRotatingItem(state, action.x, action.y);
default:
return state;
}
}
function selectToolDrawingItem(state, sceneComponentType) {
return state.merge({
mode: MODE_DRAWING_ITEM,
drawingSupport: Map({
type: sceneComponentType
})
});
}
/** holes operations **/
function updateDrawingItem(state, layerID, x, y) {
var drawingSupport = state.drawingSupport,
catalog = state.catalog;
var scene = state.scene.updateIn(['layers', layerID], function (layer) {
return layer.withMutations(function (layer) {
if (drawingSupport.has('currentID')) {
layer.updateIn(['items', drawingSupport.get('currentID')], function (item) {
return item.merge({ x: x, y: y });
});
} else {
var _addItem = addItem(layer, drawingSupport.get('type'), x, y, 200, 100, 0, catalog),
item = _addItem.item;
select(layer, 'items', item.id);
drawingSupport = drawingSupport.set('currentID', item.id);
}
});
});
return state.merge({
scene: scene,
drawingSupport: drawingSupport
});
}
function endDrawingItem(state, layerID, x, y) {
var catalog = state.catalog;
state = updateDrawingItem(state, layerID, x, y, catalog);
var scene = state.scene.updateIn(['layers', layerID], function (layer) {
return unselectAll(layer);
});
return state.merge({
scene: scene,
sceneHistory: state.sceneHistory.push(scene),
drawingSupport: Map({
type: state.drawingSupport.get('type')
})
});
}
function beginDraggingItem(state, layerID, itemID, x, y) {
var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]);
return state.merge({
mode: MODE_DRAGGING_ITEM,
draggingSupport: Map({
layerID: layerID,
itemID: itemID,
startPointX: x,
startPointY: y,
originalX: item.x,
originalY: item.y
})
});
}
function updateDraggingItem(state, x, y) {
var draggingSupport = state.draggingSupport,
scene = state.scene;
var layerID = draggingSupport.get('layerID');
var itemID = draggingSupport.get('itemID');
var startPointX = draggingSupport.get('startPointX');
var startPointY = draggingSupport.get('startPointY');
var originalX = draggingSupport.get('originalX');
var originalY = draggingSupport.get('originalY');
var diffX = startPointX - x;
var diffY = startPointY - y;
var item = scene.getIn(['layers', layerID, 'items', itemID]);
item = item.merge({
x: originalX - diffX,
y: originalY - diffY
});
return state.merge({
scene: scene.mergeIn(['layers', layerID, 'items', itemID], item)
});
}
function endDraggingItem(state, x, y) {
state = updateDraggingItem(state, x, y);
return state.merge({
mode: MODE_IDLE,
sceneHistory: state.sceneHistory.push(state.scene)
});
}
function beginRotatingItem(state, layerID, itemID, x, y) {
var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]);
return state.merge({
mode: MODE_ROTATING_ITEM,
rotatingSupport: Map({
layerID: layerID,
itemID: itemID
})
});
}
function updateRotatingItem(state, x, y) {
var rotatingSupport = state.rotatingSupport,
scene = state.scene;
var layerID = rotatingSupport.get('layerID');
var itemID = rotatingSupport.get('itemID');
var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]);
var deltaX = x - item.x;
var deltaY = y - item.y;
var rotation = Math.atan2(deltaY, deltaX) * 180 / Math.PI - 90;
if (-5 < rotation && rotation < 5) rotation = 0;
if (-95 < rotation && rotation < -85) rotation = -90;
if (-185 < rotation && rotation < -175) rotation = -180;
if (85 < rotation && rotation < 90) rotation = 90;
if (-270 < rotation && rotation < -265) rotation = 90;
item = item.merge({
rotation: rotation
});
return state.merge({
scene: scene.mergeIn(['layers', layerID, 'items', itemID], item)
});
}
function endRotatingItem(state, x, y) {
state = updateRotatingItem(state, x, y);
return state.merge({
mode: MODE_IDLE,
sceneHistory: state.sceneHistory.push(state.scene)
});
}
function selectItem(state, layerID, itemID) {
var scene = state.scene;
scene = scene.merge({
layers: scene.layers.map(unselectAll),
selectedLayer: layerID
});
scene = scene.updateIn(['layers', layerID], function (layer) {
return layer.withMutations(function (layer) {
select(layer, 'items', itemID);
});
});
return state.merge({
scene: scene,
sceneHistory: state.sceneHistory.push(scene)
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy9pdGVtcy1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbIkxpc3QiLCJNYXAiLCJTRUxFQ1RfVE9PTF9EUkFXSU5HX0lURU0iLCJVUERBVEVfRFJBV0lOR19JVEVNIiwiRU5EX0RSQVdJTkdfSVRFTSIsIkJFR0lOX0RSQUdHSU5HX0lURU0iLCJVUERBVEVfRFJBR0dJTkdfSVRFTSIsIkVORF9EUkFHR0lOR19JVEVNIiwiQkVHSU5fUk9UQVRJTkdfSVRFTSIsIlVQREFURV9ST1RBVElOR19JVEVNIiwiRU5EX1JPVEFUSU5HX0lURU0iLCJTRUxFQ1RfSVRFTSIsIk1PREVfSURMRSIsIk1PREVfRFJBV0lOR19JVEVNIiwiTU9ERV9EUkFHR0lOR19JVEVNIiwiTU9ERV9ST1RBVElOR19JVEVNIiwiYWRkSXRlbSIsInJlbW92ZUl0ZW0iLCJ1bnNlbGVjdCIsInNlbGVjdCIsInVuc2VsZWN0QWxsIiwiR2VvbWV0cnkiLCJzdGF0ZSIsImFjdGlvbiIsInR5cGUiLCJzZWxlY3RJdGVtIiwibGF5ZXJJRCIsIml0ZW1JRCIsInNlbGVjdFRvb2xEcmF3aW5nSXRlbSIsInNjZW5lQ29tcG9uZW50VHlwZSIsInVwZGF0ZURyYXdpbmdJdGVtIiwieCIsInkiLCJlbmREcmF3aW5nSXRlbSIsImJlZ2luRHJhZ2dpbmdJdGVtIiwidXBkYXRlRHJhZ2dpbmdJdGVtIiwiZW5kRHJhZ2dpbmdJdGVtIiwiYmVnaW5Sb3RhdGluZ0l0ZW0iLCJ1cGRhdGVSb3RhdGluZ0l0ZW0iLCJlbmRSb3RhdGluZ0l0ZW0iLCJtZXJnZSIsIm1vZGUiLCJkcmF3aW5nU3VwcG9ydCIsImNhdGFsb2ciLCJzY2VuZSIsInVwZGF0ZUluIiwibGF5ZXIiLCJ3aXRoTXV0YXRpb25zIiwiaGFzIiwiZ2V0IiwiaXRlbSIsImlkIiwic2V0Iiwic2NlbmVIaXN0b3J5IiwicHVzaCIsImdldEluIiwiZHJhZ2dpbmdTdXBwb3J0Iiwic3RhcnRQb2ludFgiLCJzdGFydFBvaW50WSIsIm9yaWdpbmFsWCIsIm9yaWdpbmFsWSIsImRpZmZYIiwiZGlmZlkiLCJtZXJnZUluIiwicm90YXRpbmdTdXBwb3J0IiwiZGVsdGFYIiwiZGVsdGFZIiwicm90YXRpb24iLCJNYXRoIiwiYXRhbjIiLCJQSSIsImxheWVycyIsIm1hcCIsInNlbGVjdGVkTGF5ZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQVIsRUFBY0MsR0FBZCxRQUF3QixXQUF4Qjs7QUFFQSxTQUNFQyx3QkFERixFQUVFQyxtQkFGRixFQUdFQyxnQkFIRixFQUlFQyxtQkFKRixFQUtFQyxvQkFMRixFQU1FQyxpQkFORixFQU9FQyxtQkFQRixFQVFFQyxvQkFSRixFQVNFQyxpQkFURixFQVVFQyxXQVZGLEVBWUVDLFNBWkYsRUFhRUMsaUJBYkYsRUFjRUMsa0JBZEYsRUFlRUMsa0JBZkYsUUFnQk8sY0FoQlA7O0FBa0JBLFNBQVFDLE9BQVIsRUFBaUJDLFVBQWpCLEVBQTZCQyxRQUE3QixFQUF1Q0MsTUFBdkMsRUFBK0NDLFdBQS9DLFFBQWlFLDJCQUFqRTtBQUNBLE9BQU8sS0FBS0MsUUFBWixNQUEwQixtQkFBMUI7O0FBRUEsZUFBZSxVQUFVQyxLQUFWLEVBQWlCQyxNQUFqQixFQUF5QjtBQUN0QyxVQUFRQSxPQUFPQyxJQUFmO0FBQ0UsU0FBS2IsV0FBTDtBQUNFLGFBQU9jLFdBQVdILEtBQVgsRUFBa0JDLE9BQU9HLE9BQXpCLEVBQWtDSCxPQUFPSSxNQUF6QyxDQUFQOztBQUVGLFNBQUt6Qix3QkFBTDtBQUNFLGFBQU8wQixzQkFBc0JOLEtBQXRCLEVBQTZCQyxPQUFPTSxrQkFBcEMsQ0FBUDs7QUFFRixTQUFLMUIsbUJBQUw7QUFDRSxhQUFPMkIsa0JBQWtCUixLQUFsQixFQUF5QkMsT0FBT0csT0FBaEMsRUFBeUNILE9BQU9RLENBQWhELEVBQW1EUixPQUFPUyxDQUExRCxDQUFQOztBQUVGLFNBQUs1QixnQkFBTDtBQUNFLGFBQU82QixlQUFlWCxLQUFmLEVBQXNCQyxPQUFPRyxPQUE3QixFQUFzQ0gsT0FBT1EsQ0FBN0MsRUFBZ0RSLE9BQU9TLENBQXZELENBQVA7O0FBRUYsU0FBSzNCLG1CQUFMO0FBQ0UsYUFBTzZCLGtCQUFrQlosS0FBbEIsRUFBeUJDLE9BQU9HLE9BQWhDLEVBQXlDSCxPQUFPSSxNQUFoRCxFQUF3REosT0FBT1EsQ0FBL0QsRUFBa0VSLE9BQU9TLENBQXpFLENBQVA7O0FBRUYsU0FBSzFCLG9CQUFMO0FBQ0UsYUFBTzZCLG1CQUFtQmIsS0FBbkIsRUFBMEJDLE9BQU9RLENBQWpDLEVBQW9DUixPQUFPUyxDQUEzQyxDQUFQOztBQUVGLFNBQUt6QixpQkFBTDtBQUNFLGFBQU82QixnQkFBZ0JkLEtBQWhCLEVBQXVCQyxPQUFPUSxDQUE5QixFQUFpQ1IsT0FBT1MsQ0FBeEMsQ0FBUDs7QUFFRixTQUFLeEIsbUJBQUw7QUFDRSxhQUFPNkIsa0JBQWtCZixLQUFsQixFQUF5QkMsT0FBT0csT0FBaEMsRUFBeUNILE9BQU9JLE1BQWhELEVBQXdESixPQUFPUSxDQUEvRCxFQUFrRVIsT0FBT1MsQ0FBekUsQ0FBUDs7QUFFRixTQUFLdkIsb0JBQUw7QUFDRSxhQUFPNkIsbUJBQW1CaEIsS0FBbkIsRUFBMEJDLE9BQU9RLENBQWpDLEVBQW9DUixPQUFPUyxDQUEzQyxDQUFQOztBQUVGLFNBQUt0QixpQkFBTDtBQUNFLGFBQU82QixnQkFBZ0JqQixLQUFoQixFQUF1QkMsT0FBT1EsQ0FBOUIsRUFBaUNSLE9BQU9TLENBQXhDLENBQVA7O0FBRUY7QUFDRSxhQUFPVixLQUFQO0FBaENKO0FBa0NEOztBQUVELFNBQVNNLHFCQUFULENBQStCTixLQUEvQixFQUFzQ08sa0JBQXRDLEVBQTBEO0FBQ3hELFNBQU9QLE1BQU1rQixLQUFOLENBQVk7QUFDakJDLFVBQU01QixpQkFEVztBQUVqQjZCLG9CQUFnQnpDLElBQUk7QUFDbEJ1QixZQUFNSztBQURZLEtBQUo7QUFGQyxHQUFaLENBQVA7QUFNRDs7QUFFRDtBQUNBLFNBQVNDLGlCQUFULENBQTJCUixLQUEzQixFQUFrQ0ksT0FBbEMsRUFBMkNLLENBQTNDLEVBQThDQyxDQUE5QyxFQUFpRDtBQUFBLE1BQzFDVSxjQUQwQyxHQUNmcEIsS0FEZSxDQUMxQ29CLGNBRDBDO0FBQUEsTUFDMUJDLE9BRDBCLEdBQ2ZyQixLQURlLENBQzFCcUIsT0FEMEI7OztBQUcvQyxNQUFJQyxRQUFRdEIsTUFBTXNCLEtBQU4sQ0FBWUMsUUFBWixDQUFxQixDQUFDLFFBQUQsRUFBV25CLE9BQVgsQ0FBckIsRUFBMEM7QUFBQSxXQUFTb0IsTUFBTUMsYUFBTixDQUFvQixpQkFBUzs7QUFFMUYsVUFBSUwsZUFBZU0sR0FBZixDQUFtQixXQUFuQixDQUFKLEVBQXFDO0FBQ25DRixjQUFNRCxRQUFOLENBQWUsQ0FBQyxPQUFELEVBQVVILGVBQWVPLEdBQWYsQ0FBbUIsV0FBbkIsQ0FBVixDQUFmLEVBQTJEO0FBQUEsaUJBQVFDLEtBQUtWLEtBQUwsQ0FBVyxFQUFDVCxJQUFELEVBQUlDLElBQUosRUFBWCxDQUFSO0FBQUEsU0FBM0Q7QUFDRCxPQUZELE1BRU87QUFBQSx1QkFDUWhCLFFBQVE4QixLQUFSLEVBQWVKLGVBQWVPLEdBQWYsQ0FBbUIsTUFBbkIsQ0FBZixFQUEyQ2xCLENBQTNDLEVBQThDQyxDQUE5QyxFQUFpRCxHQUFqRCxFQUFzRCxHQUF0RCxFQUEyRCxDQUEzRCxFQUE4RFcsT0FBOUQsQ0FEUjtBQUFBLFlBQ0FPLElBREEsWUFDQUEsSUFEQTs7QUFFTC9CLGVBQU8yQixLQUFQLEVBQWMsT0FBZCxFQUF1QkksS0FBS0MsRUFBNUI7QUFDQVQseUJBQWlCQSxlQUFlVSxHQUFmLENBQW1CLFdBQW5CLEVBQWdDRixLQUFLQyxFQUFyQyxDQUFqQjtBQUNEO0FBQ0YsS0FUOEQsQ0FBVDtBQUFBLEdBQTFDLENBQVo7O0FBV0EsU0FBTzdCLE1BQU1rQixLQUFOLENBQVk7QUFDakJJLGdCQURpQjtBQUVqQkY7QUFGaUIsR0FBWixDQUFQO0FBSUQ7O0FBRUQsU0FBU1QsY0FBVCxDQUF3QlgsS0FBeEIsRUFBK0JJLE9BQS9CLEVBQXdDSyxDQUF4QyxFQUEyQ0MsQ0FBM0MsRUFBOEM7QUFDNUMsTUFBSVcsVUFBVXJCLE1BQU1xQixPQUFwQjtBQUNBckIsVUFBUVEsa0JBQWtCUixLQUFsQixFQUF5QkksT0FBekIsRUFBa0NLLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3Q1csT0FBeEMsQ0FBUjtBQUNBLE1BQUlDLFFBQVF0QixNQUFNc0IsS0FBTixDQUFZQyxRQUFaLENBQXFCLENBQUMsUUFBRCxFQUFXbkIsT0FBWCxDQUFyQixFQUEwQztBQUFBLFdBQVNOLFlBQVkwQixLQUFaLENBQVQ7QUFBQSxHQUExQyxDQUFaO0FBQ0EsU0FBT3hCLE1BQU1rQixLQUFOLENBQVk7QUFDakJJLGdCQURpQjtBQUVqQlMsa0JBQWMvQixNQUFNK0IsWUFBTixDQUFtQkMsSUFBbkIsQ0FBd0JWLEtBQXhCLENBRkc7QUFHakJGLG9CQUFnQnpDLElBQUk7QUFDbEJ1QixZQUFNRixNQUFNb0IsY0FBTixDQUFxQk8sR0FBckIsQ0FBeUIsTUFBekI7QUFEWSxLQUFKO0FBSEMsR0FBWixDQUFQO0FBUUQ7O0FBRUQsU0FBU2YsaUJBQVQsQ0FBMkJaLEtBQTNCLEVBQWtDSSxPQUFsQyxFQUEyQ0MsTUFBM0MsRUFBbURJLENBQW5ELEVBQXNEQyxDQUF0RCxFQUF5RDs7QUFFdkQsTUFBSWtCLE9BQU81QixNQUFNaUMsS0FBTixDQUFZLENBQUMsT0FBRCxFQUFVLFFBQVYsRUFBb0I3QixPQUFwQixFQUE2QixPQUE3QixFQUFzQ0MsTUFBdEMsQ0FBWixDQUFYOztBQUVBLFNBQU9MLE1BQU1rQixLQUFOLENBQVk7QUFDakJDLFVBQU0zQixrQkFEVztBQUVqQjBDLHFCQUFpQnZELElBQUk7QUFDbkJ5QixzQkFEbUI7QUFFbkJDLG9CQUZtQjtBQUduQjhCLG1CQUFhMUIsQ0FITTtBQUluQjJCLG1CQUFhMUIsQ0FKTTtBQUtuQjJCLGlCQUFXVCxLQUFLbkIsQ0FMRztBQU1uQjZCLGlCQUFXVixLQUFLbEI7QUFORyxLQUFKO0FBRkEsR0FBWixDQUFQO0FBV0Q7O0FBRUQsU0FBU0csa0JBQVQsQ0FBNEJiLEtBQTVCLEVBQW1DUyxDQUFuQyxFQUFzQ0MsQ0FBdEMsRUFBeUM7QUFBQSxNQUNsQ3dCLGVBRGtDLEdBQ1JsQyxLQURRLENBQ2xDa0MsZUFEa0M7QUFBQSxNQUNqQlosS0FEaUIsR0FDUnRCLEtBRFEsQ0FDakJzQixLQURpQjs7O0FBR3ZDLE1BQUlsQixVQUFVOEIsZ0JBQWdCUCxHQUFoQixDQUFvQixTQUFwQixDQUFkO0FBQ0EsTUFBSXRCLFNBQVM2QixnQkFBZ0JQLEdBQWhCLENBQW9CLFFBQXBCLENBQWI7QUFDQSxNQUFJUSxjQUFjRCxnQkFBZ0JQLEdBQWhCLENBQW9CLGFBQXBCLENBQWxCO0FBQ0EsTUFBSVMsY0FBY0YsZ0JBQWdCUCxHQUFoQixDQUFvQixhQUFwQixDQUFsQjtBQUNBLE1BQUlVLFlBQVlILGdCQUFnQlAsR0FBaEIsQ0FBb0IsV0FBcEIsQ0FBaEI7QUFDQSxNQUFJVyxZQUFZSixnQkFBZ0JQLEdBQWhCLENBQW9CLFdBQXBCLENBQWhCOztBQUVBLE1BQUlZLFFBQVFKLGNBQWMxQixDQUExQjtBQUNBLE1BQUkrQixRQUFRSixjQUFjMUIsQ0FBMUI7O0FBRUEsTUFBSWtCLE9BQU9OLE1BQU1XLEtBQU4sQ0FBWSxDQUFDLFFBQUQsRUFBVzdCLE9BQVgsRUFBb0IsT0FBcEIsRUFBNkJDLE1BQTdCLENBQVosQ0FBWDtBQUNBdUIsU0FBT0EsS0FBS1YsS0FBTCxDQUFXO0FBQ2hCVCxPQUFHNEIsWUFBWUUsS0FEQztBQUVoQjdCLE9BQUc0QixZQUFZRTtBQUZDLEdBQVgsQ0FBUDs7QUFLQSxTQUFPeEMsTUFBTWtCLEtBQU4sQ0FBWTtBQUNqQkksV0FBT0EsTUFBTW1CLE9BQU4sQ0FBYyxDQUFDLFFBQUQsRUFBV3JDLE9BQVgsRUFBb0IsT0FBcEIsRUFBNkJDLE1BQTdCLENBQWQsRUFBb0R1QixJQUFwRDtBQURVLEdBQVosQ0FBUDtBQUdEOztBQUVELFNBQVNkLGVBQVQsQ0FBeUJkLEtBQXpCLEVBQWdDUyxDQUFoQyxFQUFtQ0MsQ0FBbkMsRUFBc0M7QUFDcENWLFVBQVFhLG1CQUFtQmIsS0FBbkIsRUFBMEJTLENBQTFCLEVBQTZCQyxDQUE3QixDQUFSO0FBQ0EsU0FBT1YsTUFBTWtCLEtBQU4sQ0FBWTtBQUNqQkMsVUFBTTdCLFNBRFc7QUFFakJ5QyxrQkFBYy9CLE1BQU0rQixZQUFOLENBQW1CQyxJQUFuQixDQUF3QmhDLE1BQU1zQixLQUE5QjtBQUZHLEdBQVosQ0FBUDtBQUlEOztBQUVELFNBQVNQLGlCQUFULENBQTJCZixLQUEzQixFQUFrQ0ksT0FBbEMsRUFBMkNDLE1BQTNDLEVBQW1ESSxDQUFuRCxFQUFzREMsQ0FBdEQsRUFBeUQ7O0FBRXZELE1BQUlrQixPQUFPNUIsTUFBTWlDLEtBQU4sQ0FBWSxDQUFDLE9BQUQsRUFBVSxRQUFWLEVBQW9CN0IsT0FBcEIsRUFBNkIsT0FBN0IsRUFBc0NDLE1BQXRDLENBQVosQ0FBWDs7QUFFQSxTQUFPTCxNQUFNa0IsS0FBTixDQUFZO0FBQ2pCQyxVQUFNMUIsa0JBRFc7QUFFakJpRCxxQkFBaUIvRCxJQUFJO0FBQ25CeUIsc0JBRG1CO0FBRW5CQztBQUZtQixLQUFKO0FBRkEsR0FBWixDQUFQO0FBT0Q7O0FBRUQsU0FBU1csa0JBQVQsQ0FBNEJoQixLQUE1QixFQUFtQ1MsQ0FBbkMsRUFBc0NDLENBQXRDLEVBQXlDO0FBQUEsTUFDbENnQyxlQURrQyxHQUNSMUMsS0FEUSxDQUNsQzBDLGVBRGtDO0FBQUEsTUFDakJwQixLQURpQixHQUNSdEIsS0FEUSxDQUNqQnNCLEtBRGlCOzs7QUFHdkMsTUFBSWxCLFVBQVVzQyxnQkFBZ0JmLEdBQWhCLENBQW9CLFNBQXBCLENBQWQ7QUFDQSxNQUFJdEIsU0FBU3FDLGdCQUFnQmYsR0FBaEIsQ0FBb0IsUUFBcEIsQ0FBYjtBQUNBLE1BQUlDLE9BQU81QixNQUFNaUMsS0FBTixDQUFZLENBQUMsT0FBRCxFQUFVLFFBQVYsRUFBb0I3QixPQUFwQixFQUE2QixPQUE3QixFQUFzQ0MsTUFBdEMsQ0FBWixDQUFYOztBQUVBLE1BQUlzQyxTQUFTbEMsSUFBSW1CLEtBQUtuQixDQUF0QjtBQUNBLE1BQUltQyxTQUFTbEMsSUFBSWtCLEtBQUtsQixDQUF0QjtBQUNBLE1BQUltQyxXQUFXQyxLQUFLQyxLQUFMLENBQVdILE1BQVgsRUFBbUJELE1BQW5CLElBQTZCLEdBQTdCLEdBQW1DRyxLQUFLRSxFQUF4QyxHQUE2QyxFQUE1RDs7QUFFQSxNQUFJLENBQUMsQ0FBRCxHQUFLSCxRQUFMLElBQWlCQSxXQUFXLENBQWhDLEVBQW1DQSxXQUFXLENBQVg7QUFDbkMsTUFBSSxDQUFDLEVBQUQsR0FBTUEsUUFBTixJQUFrQkEsV0FBVyxDQUFDLEVBQWxDLEVBQXNDQSxXQUFXLENBQUMsRUFBWjtBQUN0QyxNQUFJLENBQUMsR0FBRCxHQUFPQSxRQUFQLElBQW1CQSxXQUFXLENBQUMsR0FBbkMsRUFBd0NBLFdBQVcsQ0FBQyxHQUFaO0FBQ3hDLE1BQUksS0FBS0EsUUFBTCxJQUFpQkEsV0FBVyxFQUFoQyxFQUFvQ0EsV0FBVyxFQUFYO0FBQ3BDLE1BQUksQ0FBQyxHQUFELEdBQU9BLFFBQVAsSUFBbUJBLFdBQVcsQ0FBQyxHQUFuQyxFQUF3Q0EsV0FBVyxFQUFYOztBQUV4Q2pCLFNBQU9BLEtBQUtWLEtBQUwsQ0FBVztBQUNoQjJCO0FBRGdCLEdBQVgsQ0FBUDs7QUFJQSxTQUFPN0MsTUFBTWtCLEtBQU4sQ0FBWTtBQUNqQkksV0FBT0EsTUFBTW1CLE9BQU4sQ0FBYyxDQUFDLFFBQUQsRUFBV3JDLE9BQVgsRUFBb0IsT0FBcEIsRUFBNkJDLE1BQTdCLENBQWQsRUFBb0R1QixJQUFwRDtBQURVLEdBQVosQ0FBUDtBQUdEOztBQUVELFNBQVNYLGVBQVQsQ0FBeUJqQixLQUF6QixFQUFnQ1MsQ0FBaEMsRUFBbUNDLENBQW5DLEVBQXNDO0FBQ3BDVixVQUFRZ0IsbUJBQW1CaEIsS0FBbkIsRUFBMEJTLENBQTFCLEVBQTZCQyxDQUE3QixDQUFSO0FBQ0EsU0FBT1YsTUFBTWtCLEtBQU4sQ0FBWTtBQUNqQkMsVUFBTTdCLFNBRFc7QUFFakJ5QyxrQkFBYy9CLE1BQU0rQixZQUFOLENBQW1CQyxJQUFuQixDQUF3QmhDLE1BQU1zQixLQUE5QjtBQUZHLEdBQVosQ0FBUDtBQUlEOztBQUVELFNBQVNuQixVQUFULENBQW9CSCxLQUFwQixFQUEyQkksT0FBM0IsRUFBb0NDLE1BQXBDLEVBQTRDO0FBQzFDLE1BQUlpQixRQUFRdEIsTUFBTXNCLEtBQWxCOztBQUVBQSxVQUFRQSxNQUFNSixLQUFOLENBQVk7QUFDbEIrQixZQUFRM0IsTUFBTTJCLE1BQU4sQ0FBYUMsR0FBYixDQUFpQnBELFdBQWpCLENBRFU7QUFFbEJxRCxtQkFBZS9DO0FBRkcsR0FBWixDQUFSOztBQUtBa0IsVUFBUUEsTUFBTUMsUUFBTixDQUFlLENBQUMsUUFBRCxFQUFXbkIsT0FBWCxDQUFmLEVBQW9DO0FBQUEsV0FBU29CLE1BQU1DLGFBQU4sQ0FBb0IsaUJBQVM7QUFDOUU1QixhQUFPMkIsS0FBUCxFQUFjLE9BQWQsRUFBdUJuQixNQUF2QjtBQUNELEtBRmtELENBQVQ7QUFBQSxHQUFwQyxDQUFSOztBQUtBLFNBQU9MLE1BQU1rQixLQUFOLENBQVk7QUFDakJJLGdCQURpQjtBQUVqQlMsa0JBQWMvQixNQUFNK0IsWUFBTixDQUFtQkMsSUFBbkIsQ0FBd0JWLEtBQXhCO0FBRkcsR0FBWixDQUFQO0FBSUQiLCJmaWxlIjoiaXRlbXMtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdCwgTWFwfSBmcm9tICdpbW11dGFibGUnO1xuXG5pbXBvcnQge1xuICBTRUxFQ1RfVE9PTF9EUkFXSU5HX0lURU0sXG4gIFVQREFURV9EUkFXSU5HX0lURU0sXG4gIEVORF9EUkFXSU5HX0lURU0sXG4gIEJFR0lOX0RSQUdHSU5HX0lURU0sXG4gIFVQREFURV9EUkFHR0lOR19JVEVNLFxuICBFTkRfRFJBR0dJTkdfSVRFTSxcbiAgQkVHSU5fUk9UQVRJTkdfSVRFTSxcbiAgVVBEQVRFX1JPVEFUSU5HX0lURU0sXG4gIEVORF9ST1RBVElOR19JVEVNLFxuICBTRUxFQ1RfSVRFTSxcblxuICBNT0RFX0lETEUsXG4gIE1PREVfRFJBV0lOR19JVEVNLFxuICBNT0RFX0RSQUdHSU5HX0lURU0sXG4gIE1PREVfUk9UQVRJTkdfSVRFTVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5pbXBvcnQge2FkZEl0ZW0sIHJlbW92ZUl0ZW0sIHVuc2VsZWN0LCBzZWxlY3QsIHVuc2VsZWN0QWxsfSBmcm9tICcuLi91dGlscy9sYXllci1vcGVyYXRpb25zJztcbmltcG9ydCAqIGFzIEdlb21ldHJ5IGZyb20gJy4uL3V0aWxzL2dlb21ldHJ5JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgU0VMRUNUX0lURU06XG4gICAgICByZXR1cm4gc2VsZWN0SXRlbShzdGF0ZSwgYWN0aW9uLmxheWVySUQsIGFjdGlvbi5pdGVtSUQpO1xuXG4gICAgY2FzZSBTRUxFQ1RfVE9PTF9EUkFXSU5HX0lURU06XG4gICAgICByZXR1cm4gc2VsZWN0VG9vbERyYXdpbmdJdGVtKHN0YXRlLCBhY3Rpb24uc2NlbmVDb21wb25lbnRUeXBlKTtcblxuICAgIGNhc2UgVVBEQVRFX0RSQVdJTkdfSVRFTTpcbiAgICAgIHJldHVybiB1cGRhdGVEcmF3aW5nSXRlbShzdGF0ZSwgYWN0aW9uLmxheWVySUQsIGFjdGlvbi54LCBhY3Rpb24ueSk7XG5cbiAgICBjYXNlIEVORF9EUkFXSU5HX0lURU06XG4gICAgICByZXR1cm4gZW5kRHJhd2luZ0l0ZW0oc3RhdGUsIGFjdGlvbi5sYXllcklELCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBCRUdJTl9EUkFHR0lOR19JVEVNOlxuICAgICAgcmV0dXJuIGJlZ2luRHJhZ2dpbmdJdGVtKHN0YXRlLCBhY3Rpb24ubGF5ZXJJRCwgYWN0aW9uLml0ZW1JRCwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgVVBEQVRFX0RSQUdHSU5HX0lURU06XG4gICAgICByZXR1cm4gdXBkYXRlRHJhZ2dpbmdJdGVtKHN0YXRlLCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBFTkRfRFJBR0dJTkdfSVRFTTpcbiAgICAgIHJldHVybiBlbmREcmFnZ2luZ0l0ZW0oc3RhdGUsIGFjdGlvbi54LCBhY3Rpb24ueSk7XG5cbiAgICBjYXNlIEJFR0lOX1JPVEFUSU5HX0lURU06XG4gICAgICByZXR1cm4gYmVnaW5Sb3RhdGluZ0l0ZW0oc3RhdGUsIGFjdGlvbi5sYXllcklELCBhY3Rpb24uaXRlbUlELCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBVUERBVEVfUk9UQVRJTkdfSVRFTTpcbiAgICAgIHJldHVybiB1cGRhdGVSb3RhdGluZ0l0ZW0oc3RhdGUsIGFjdGlvbi54LCBhY3Rpb24ueSk7XG5cbiAgICBjYXNlIEVORF9ST1RBVElOR19JVEVNOlxuICAgICAgcmV0dXJuIGVuZFJvdGF0aW5nSXRlbShzdGF0ZSwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VsZWN0VG9vbERyYXdpbmdJdGVtKHN0YXRlLCBzY2VuZUNvbXBvbmVudFR5cGUpIHtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX0RSQVdJTkdfSVRFTSxcbiAgICBkcmF3aW5nU3VwcG9ydDogTWFwKHtcbiAgICAgIHR5cGU6IHNjZW5lQ29tcG9uZW50VHlwZVxuICAgIH0pXG4gIH0pO1xufVxuXG4vKiogaG9sZXMgb3BlcmF0aW9ucyAqKi9cbmZ1bmN0aW9uIHVwZGF0ZURyYXdpbmdJdGVtKHN0YXRlLCBsYXllcklELCB4LCB5KSB7XG4gIGxldCB7ZHJhd2luZ1N1cHBvcnQsIGNhdGFsb2d9ID0gc3RhdGU7XG5cbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmUudXBkYXRlSW4oWydsYXllcnMnLCBsYXllcklEXSwgbGF5ZXIgPT4gbGF5ZXIud2l0aE11dGF0aW9ucyhsYXllciA9PiB7XG5cbiAgICBpZiAoZHJhd2luZ1N1cHBvcnQuaGFzKCdjdXJyZW50SUQnKSkge1xuICAgICAgbGF5ZXIudXBkYXRlSW4oWydpdGVtcycsIGRyYXdpbmdTdXBwb3J0LmdldCgnY3VycmVudElEJyldLCBpdGVtID0+IGl0ZW0ubWVyZ2Uoe3gsIHl9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7aXRlbX0gPSBhZGRJdGVtKGxheWVyLCBkcmF3aW5nU3VwcG9ydC5nZXQoJ3R5cGUnKSwgeCwgeSwgMjAwLCAxMDAsIDAsIGNhdGFsb2cpO1xuICAgICAgc2VsZWN0KGxheWVyLCAnaXRlbXMnLCBpdGVtLmlkKTtcbiAgICAgIGRyYXdpbmdTdXBwb3J0ID0gZHJhd2luZ1N1cHBvcnQuc2V0KCdjdXJyZW50SUQnLCBpdGVtLmlkKTtcbiAgICB9XG4gIH0pKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lLFxuICAgIGRyYXdpbmdTdXBwb3J0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbmREcmF3aW5nSXRlbShzdGF0ZSwgbGF5ZXJJRCwgeCwgeSkge1xuICBsZXQgY2F0YWxvZyA9IHN0YXRlLmNhdGFsb2c7XG4gIHN0YXRlID0gdXBkYXRlRHJhd2luZ0l0ZW0oc3RhdGUsIGxheWVySUQsIHgsIHksIGNhdGFsb2cpO1xuICBsZXQgc2NlbmUgPSBzdGF0ZS5zY2VuZS51cGRhdGVJbihbJ2xheWVycycsIGxheWVySURdLCBsYXllciA9PiB1bnNlbGVjdEFsbChsYXllcikpO1xuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc2NlbmUpLFxuICAgIGRyYXdpbmdTdXBwb3J0OiBNYXAoe1xuICAgICAgdHlwZTogc3RhdGUuZHJhd2luZ1N1cHBvcnQuZ2V0KCd0eXBlJylcbiAgICB9KVxuICB9KTtcblxufVxuXG5mdW5jdGlvbiBiZWdpbkRyYWdnaW5nSXRlbShzdGF0ZSwgbGF5ZXJJRCwgaXRlbUlELCB4LCB5KSB7XG5cbiAgbGV0IGl0ZW0gPSBzdGF0ZS5nZXRJbihbJ3NjZW5lJywgJ2xheWVycycsIGxheWVySUQsICdpdGVtcycsIGl0ZW1JRF0pO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9EUkFHR0lOR19JVEVNLFxuICAgIGRyYWdnaW5nU3VwcG9ydDogTWFwKHtcbiAgICAgIGxheWVySUQsXG4gICAgICBpdGVtSUQsXG4gICAgICBzdGFydFBvaW50WDogeCxcbiAgICAgIHN0YXJ0UG9pbnRZOiB5LFxuICAgICAgb3JpZ2luYWxYOiBpdGVtLngsXG4gICAgICBvcmlnaW5hbFk6IGl0ZW0ueVxuICAgIH0pXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEcmFnZ2luZ0l0ZW0oc3RhdGUsIHgsIHkpIHtcbiAgbGV0IHtkcmFnZ2luZ1N1cHBvcnQsIHNjZW5lfSA9IHN0YXRlO1xuXG4gIGxldCBsYXllcklEID0gZHJhZ2dpbmdTdXBwb3J0LmdldCgnbGF5ZXJJRCcpO1xuICBsZXQgaXRlbUlEID0gZHJhZ2dpbmdTdXBwb3J0LmdldCgnaXRlbUlEJyk7XG4gIGxldCBzdGFydFBvaW50WCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ3N0YXJ0UG9pbnRYJyk7XG4gIGxldCBzdGFydFBvaW50WSA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ3N0YXJ0UG9pbnRZJyk7XG4gIGxldCBvcmlnaW5hbFggPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdvcmlnaW5hbFgnKTtcbiAgbGV0IG9yaWdpbmFsWSA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ29yaWdpbmFsWScpO1xuXG4gIGxldCBkaWZmWCA9IHN0YXJ0UG9pbnRYIC0geDtcbiAgbGV0IGRpZmZZID0gc3RhcnRQb2ludFkgLSB5O1xuXG4gIGxldCBpdGVtID0gc2NlbmUuZ2V0SW4oWydsYXllcnMnLCBsYXllcklELCAnaXRlbXMnLCBpdGVtSURdKTtcbiAgaXRlbSA9IGl0ZW0ubWVyZ2Uoe1xuICAgIHg6IG9yaWdpbmFsWCAtIGRpZmZYLFxuICAgIHk6IG9yaWdpbmFsWSAtIGRpZmZZXG4gIH0pO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmU6IHNjZW5lLm1lcmdlSW4oWydsYXllcnMnLCBsYXllcklELCAnaXRlbXMnLCBpdGVtSURdLCBpdGVtKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZW5kRHJhZ2dpbmdJdGVtKHN0YXRlLCB4LCB5KSB7XG4gIHN0YXRlID0gdXBkYXRlRHJhZ2dpbmdJdGVtKHN0YXRlLCB4LCB5KTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX0lETEUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzdGF0ZS5zY2VuZSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJlZ2luUm90YXRpbmdJdGVtKHN0YXRlLCBsYXllcklELCBpdGVtSUQsIHgsIHkpIHtcblxuICBsZXQgaXRlbSA9IHN0YXRlLmdldEluKFsnc2NlbmUnLCAnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX1JPVEFUSU5HX0lURU0sXG4gICAgcm90YXRpbmdTdXBwb3J0OiBNYXAoe1xuICAgICAgbGF5ZXJJRCxcbiAgICAgIGl0ZW1JRFxuICAgIH0pXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSb3RhdGluZ0l0ZW0oc3RhdGUsIHgsIHkpIHtcbiAgbGV0IHtyb3RhdGluZ1N1cHBvcnQsIHNjZW5lfSA9IHN0YXRlO1xuXG4gIGxldCBsYXllcklEID0gcm90YXRpbmdTdXBwb3J0LmdldCgnbGF5ZXJJRCcpO1xuICBsZXQgaXRlbUlEID0gcm90YXRpbmdTdXBwb3J0LmdldCgnaXRlbUlEJyk7XG4gIGxldCBpdGVtID0gc3RhdGUuZ2V0SW4oWydzY2VuZScsICdsYXllcnMnLCBsYXllcklELCAnaXRlbXMnLCBpdGVtSURdKTtcblxuICBsZXQgZGVsdGFYID0geCAtIGl0ZW0ueDtcbiAgbGV0IGRlbHRhWSA9IHkgLSBpdGVtLnk7XG4gIGxldCByb3RhdGlvbiA9IE1hdGguYXRhbjIoZGVsdGFZLCBkZWx0YVgpICogMTgwIC8gTWF0aC5QSSAtIDkwO1xuXG4gIGlmICgtNSA8IHJvdGF0aW9uICYmIHJvdGF0aW9uIDwgNSkgcm90YXRpb24gPSAwO1xuICBpZiAoLTk1IDwgcm90YXRpb24gJiYgcm90YXRpb24gPCAtODUpIHJvdGF0aW9uID0gLTkwO1xuICBpZiAoLTE4NSA8IHJvdGF0aW9uICYmIHJvdGF0aW9uIDwgLTE3NSkgcm90YXRpb24gPSAtMTgwO1xuICBpZiAoODUgPCByb3RhdGlvbiAmJiByb3RhdGlvbiA8IDkwKSByb3RhdGlvbiA9IDkwO1xuICBpZiAoLTI3MCA8IHJvdGF0aW9uICYmIHJvdGF0aW9uIDwgLTI2NSkgcm90YXRpb24gPSA5MDtcblxuICBpdGVtID0gaXRlbS5tZXJnZSh7XG4gICAgcm90YXRpb24sXG4gIH0pO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmU6IHNjZW5lLm1lcmdlSW4oWydsYXllcnMnLCBsYXllcklELCAnaXRlbXMnLCBpdGVtSURdLCBpdGVtKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZW5kUm90YXRpbmdJdGVtKHN0YXRlLCB4LCB5KSB7XG4gIHN0YXRlID0gdXBkYXRlUm90YXRpbmdJdGVtKHN0YXRlLCB4LCB5KTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX0lETEUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzdGF0ZS5zY2VuZSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdEl0ZW0oc3RhdGUsIGxheWVySUQsIGl0ZW1JRCkge1xuICBsZXQgc2NlbmUgPSBzdGF0ZS5zY2VuZTtcblxuICBzY2VuZSA9IHNjZW5lLm1lcmdlKHtcbiAgICBsYXllcnM6IHNjZW5lLmxheWVycy5tYXAodW5zZWxlY3RBbGwpLFxuICAgIHNlbGVjdGVkTGF5ZXI6IGxheWVySURcbiAgfSk7XG5cbiAgc2NlbmUgPSBzY2VuZS51cGRhdGVJbihbJ2xheWVycycsIGxheWVySURdLCBsYXllciA9PiBsYXllci53aXRoTXV0YXRpb25zKGxheWVyID0+IHtcbiAgICAgIHNlbGVjdChsYXllciwgJ2l0ZW1zJywgaXRlbUlEKTtcbiAgICB9KVxuICApO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSlcbn1cbiJdfQ==