react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
398 lines (321 loc) • 33.9 kB
JavaScript
var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _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; };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
import { Record, List, Map, fromJS } from 'immutable';
import { MODE_IDLE, MODE_2D_PAN } from './constants';
import { SNAP_MASK } from './utils/snap';
var safeLoadMapList = function safeLoadMapList(mapList, Model, defaultMap) {
return mapList ? new Map(mapList).map(function (m) {
return new Model(m);
}).toMap() : defaultMap || new Map();
};
export var Guide = function (_Record) {
_inherits(Guide, _Record);
function Guide() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Guide);
return _possibleConstructorReturn(this, (Guide.__proto__ || Object.getPrototypeOf(Guide)).call(this, _extends({}, json, {
properties: fromJS(json.properties || {})
})));
}
return Guide;
}(Record({
id: '',
type: '',
properties: Map()
}, 'Guide'));
export var DefaultGuides = new Map({
'h1': new Guide({
id: 'h1',
type: 'horizontal-streak',
properties: {
step: 20,
colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd']
}
}),
'v1': new Guide({
id: 'v1',
type: 'vertical-streak',
properties: {
step: 20,
colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd']
}
})
});
export var ElementsSet = function (_Record2) {
_inherits(ElementsSet, _Record2);
function ElementsSet() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, ElementsSet);
return _possibleConstructorReturn(this, (ElementsSet.__proto__ || Object.getPrototypeOf(ElementsSet)).call(this, {
vertices: new List(json.vertices || []),
lines: new List(json.lines || []),
holes: new List(json.holes || []),
areas: new List(json.areas || []),
items: new List(json.items || [])
}));
}
return ElementsSet;
}(Record({
vertices: new List(),
lines: new List(),
holes: new List(),
areas: new List(),
items: new List()
}, 'ElementsSet'));
var sharedAttributes = {
id: '',
type: '',
prototype: '',
name: '',
misc: new Map(),
selected: false,
properties: new Map()
};
export var Vertex = function (_Record3) {
_inherits(Vertex, _Record3);
function Vertex() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Vertex);
return _possibleConstructorReturn(this, (Vertex.__proto__ || Object.getPrototypeOf(Vertex)).call(this, _extends({}, json, {
lines: new List(json.lines || []),
areas: new List(json.areas || [])
})));
}
return Vertex;
}(Record(_extends({}, sharedAttributes, {
x: -1,
y: -1,
prototype: 'vertices',
lines: new List(),
areas: new List()
}), 'Vertex'));
export var Line = function (_Record4) {
_inherits(Line, _Record4);
function Line() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Line);
return _possibleConstructorReturn(this, (Line.__proto__ || Object.getPrototypeOf(Line)).call(this, _extends({}, json, {
properties: fromJS(json.properties || {}),
vertices: new List(json.vertices || []),
holes: new List(json.holes || [])
})));
}
return Line;
}(Record(_extends({}, sharedAttributes, {
prototype: 'lines',
vertices: new List(),
holes: new List()
}), 'Line'));
export var Hole = function (_Record5) {
_inherits(Hole, _Record5);
function Hole() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Hole);
return _possibleConstructorReturn(this, (Hole.__proto__ || Object.getPrototypeOf(Hole)).call(this, _extends({}, json, {
properties: fromJS(json.properties || {})
})));
}
return Hole;
}(Record(_extends({}, sharedAttributes, {
prototype: 'holes',
offset: -1,
line: ''
}), 'Hole'));
export var Area = function (_Record6) {
_inherits(Area, _Record6);
function Area() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Area);
return _possibleConstructorReturn(this, (Area.__proto__ || Object.getPrototypeOf(Area)).call(this, _extends({}, json, {
properties: fromJS(json.properties || {}),
vertices: new List(json.vertices || [])
})));
}
return Area;
}(Record(_extends({}, sharedAttributes, {
prototype: 'areas',
vertices: new List(),
holes: new List(),
showHeatMap: false,
heatMapText: '',
heatMapColor: [],
tooltip: {}
}), 'Area'));
export var Item = function (_Record7) {
_inherits(Item, _Record7);
function Item() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Item);
return _possibleConstructorReturn(this, (Item.__proto__ || Object.getPrototypeOf(Item)).call(this, _extends({}, json, {
properties: fromJS(json.properties || {})
})));
}
return Item;
}(Record(_extends({}, sharedAttributes, {
prototype: 'items',
x: 0,
y: 0,
rotation: 0
}), 'Item'));
export var Layer = function (_Record8) {
_inherits(Layer, _Record8);
function Layer() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Layer);
return _possibleConstructorReturn(this, (Layer.__proto__ || Object.getPrototypeOf(Layer)).call(this, _extends({}, json, {
vertices: safeLoadMapList(json.vertices, Vertex),
lines: safeLoadMapList(json.lines, Line),
holes: safeLoadMapList(json.holes, Hole),
areas: safeLoadMapList(json.areas, Area),
items: safeLoadMapList(json.items, Item),
selected: new ElementsSet(json.selected)
})));
}
return Layer;
}(Record({
id: '',
altitude: 0,
order: 0,
opacity: 1,
name: '',
visible: true,
vertices: new Map(),
lines: new Map(),
holes: new Map(),
areas: new Map(),
items: new Map(),
selected: new ElementsSet()
}, 'Layer'));
export var DefaultLayers = new Map({
'layer-1': new Layer({ id: 'layer-1', name: 'default' })
});
export var Scene = function (_Record9) {
_inherits(Scene, _Record9);
function Scene() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Scene);
var layers = safeLoadMapList(json.layers, Layer, DefaultLayers);
return _possibleConstructorReturn(this, (Scene.__proto__ || Object.getPrototypeOf(Scene)).call(this, _extends({}, json, {
guides: safeLoadMapList(json.guides, Guide, DefaultGuides),
layers: layers,
selectedLayer: layers.first().id,
meta: json.meta ? fromJS(json.meta) : new Map()
})));
}
return Scene;
}(Record({
unit: 'cm',
layers: new Map(),
guides: new Map(),
selectedLayer: null,
fontSize: 12,
width: 3000,
height: 2000,
meta: new Map() //additional info
}, 'Scene'));
export var CatalogElement = function (_Record10) {
_inherits(CatalogElement, _Record10);
function CatalogElement() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, CatalogElement);
return _possibleConstructorReturn(this, (CatalogElement.__proto__ || Object.getPrototypeOf(CatalogElement)).call(this, _extends({}, json, {
info: fromJS(json.info),
properties: fromJS(json.properties)
})));
}
return CatalogElement;
}(Record({
name: '',
prototype: '',
info: new Map(),
properties: new Map()
}, 'CatalogElement'));
export var Catalog = function (_Record11) {
_inherits(Catalog, _Record11);
function Catalog() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Catalog);
var elements = safeLoadMapList(json.elements, CatalogElement);
return _possibleConstructorReturn(this, (Catalog.__proto__ || Object.getPrototypeOf(Catalog)).call(this, {
elements: elements,
ready: !elements.isEmpty()
}));
}
_createClass(Catalog, [{
key: 'factoryElement',
value: function factoryElement(type, options) {
var initialProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (!this.elements.has(type)) {
var catList = this.elements.map(function (element) {
return element.name;
}).toArray();
throw new Error('Element ' + type + ' does not exist in catalog ' + catList);
}
var element = this.elements.get(type);
var properties = element.properties.map(function (value, key) {
return initialProperties[key] || value.get('defaultValue');
});
switch (element.prototype) {
case 'lines':
return new Line(options).merge({ properties: properties });
case 'holes':
return new Hole(options).merge({ properties: properties });
case 'areas':
return new Area(options).merge({ properties: properties });
case 'items':
return new Item(options).merge({ properties: properties });
default:
throw new Error('prototype not valid');
}
}
}]);
return Catalog;
}(Record({
ready: false,
page: "root",
path: new List(),
elements: new Map()
}, 'Catalog'));
export var State = function (_Record12) {
_inherits(State, _Record12);
function State() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, State);
var scene = new Scene(json.scene);
return _possibleConstructorReturn(this, (State.__proto__ || Object.getPrototypeOf(State)).call(this, _extends({}, json, {
scene: scene,
sceneHistory: json.sceneHistory ? json.sceneHistory : new List([scene]),
catalog: new Catalog(json.catalog || {}),
viewer2D: new Map(json.viewer2D || {}),
drawingSupport: new Map(json.drawingSupport || {}),
draggingSupport: new Map(json.draggingSupport || {}),
rotatingSupport: new Map(json.rotatingSupport || {}),
misc: json.misc ? fromJS(json.misc) : new Map()
})));
}
return State;
}(Record({
mode: MODE_IDLE,
scene: new Scene(),
sceneHistory: new List([new Scene()]),
catalog: new Catalog(),
viewer2D: new Map(),
mouse: new Map({ x: 0, y: 0 }),
zoom: 0,
areasText: new Map(),
snapMask: SNAP_MASK,
snapElements: new List(),
activeSnapElement: null,
drawingSupport: new Map(),
draggingSupport: new Map(),
rotatingSupport: new Map(),
errors: new List(),
warnings: new List(),
clipboardProperties: null,
selectedElementsHistory: new List(),
misc: new Map() //additional info
}, 'State'));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlbHMuanMiXSwibmFtZXMiOlsiUmVjb3JkIiwiTGlzdCIsIk1hcCIsImZyb21KUyIsIk1PREVfSURMRSIsIk1PREVfMkRfUEFOIiwiU05BUF9NQVNLIiwic2FmZUxvYWRNYXBMaXN0IiwibWFwTGlzdCIsIk1vZGVsIiwiZGVmYXVsdE1hcCIsIm1hcCIsIm0iLCJ0b01hcCIsIkd1aWRlIiwianNvbiIsInByb3BlcnRpZXMiLCJpZCIsInR5cGUiLCJEZWZhdWx0R3VpZGVzIiwic3RlcCIsImNvbG9ycyIsIkVsZW1lbnRzU2V0IiwidmVydGljZXMiLCJsaW5lcyIsImhvbGVzIiwiYXJlYXMiLCJpdGVtcyIsInNoYXJlZEF0dHJpYnV0ZXMiLCJwcm90b3R5cGUiLCJuYW1lIiwibWlzYyIsInNlbGVjdGVkIiwiVmVydGV4IiwieCIsInkiLCJMaW5lIiwiSG9sZSIsIm9mZnNldCIsImxpbmUiLCJBcmVhIiwic2hvd0hlYXRNYXAiLCJoZWF0TWFwVGV4dCIsImhlYXRNYXBDb2xvciIsInRvb2x0aXAiLCJJdGVtIiwicm90YXRpb24iLCJMYXllciIsImFsdGl0dWRlIiwib3JkZXIiLCJvcGFjaXR5IiwidmlzaWJsZSIsIkRlZmF1bHRMYXllcnMiLCJTY2VuZSIsImxheWVycyIsImd1aWRlcyIsInNlbGVjdGVkTGF5ZXIiLCJmaXJzdCIsIm1ldGEiLCJ1bml0IiwiZm9udFNpemUiLCJ3aWR0aCIsImhlaWdodCIsIkNhdGFsb2dFbGVtZW50IiwiaW5mbyIsIkNhdGFsb2ciLCJlbGVtZW50cyIsInJlYWR5IiwiaXNFbXB0eSIsIm9wdGlvbnMiLCJpbml0aWFsUHJvcGVydGllcyIsImhhcyIsImNhdExpc3QiLCJlbGVtZW50IiwidG9BcnJheSIsIkVycm9yIiwiZ2V0IiwidmFsdWUiLCJrZXkiLCJtZXJnZSIsInBhZ2UiLCJwYXRoIiwiU3RhdGUiLCJzY2VuZSIsInNjZW5lSGlzdG9yeSIsImNhdGFsb2ciLCJ2aWV3ZXIyRCIsImRyYXdpbmdTdXBwb3J0IiwiZHJhZ2dpbmdTdXBwb3J0Iiwicm90YXRpbmdTdXBwb3J0IiwibW9kZSIsIm1vdXNlIiwiem9vbSIsImFyZWFzVGV4dCIsInNuYXBNYXNrIiwic25hcEVsZW1lbnRzIiwiYWN0aXZlU25hcEVsZW1lbnQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsImNsaXBib2FyZFByb3BlcnRpZXMiLCJzZWxlY3RlZEVsZW1lbnRzSGlzdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLFNBQVFBLE1BQVIsRUFBZ0JDLElBQWhCLEVBQXNCQyxHQUF0QixFQUEyQkMsTUFBM0IsUUFBd0MsV0FBeEM7QUFDQSxTQUFRQyxTQUFSLEVBQW1CQyxXQUFuQixRQUFxQyxhQUFyQztBQUNBLFNBQVFDLFNBQVIsUUFBd0IsY0FBeEI7O0FBRUEsSUFBSUMsa0JBQWtCLFNBQWxCQSxlQUFrQixDQUFDQyxPQUFELEVBQVVDLEtBQVYsRUFBaUJDLFVBQWpCLEVBQWdDO0FBQ3BELFNBQU9GLFVBQ0gsSUFBSU4sR0FBSixDQUFRTSxPQUFSLEVBQWlCRyxHQUFqQixDQUFxQjtBQUFBLFdBQUssSUFBSUYsS0FBSixDQUFVRyxDQUFWLENBQUw7QUFBQSxHQUFyQixFQUF3Q0MsS0FBeEMsRUFERyxHQUVGSCxjQUFjLElBQUlSLEdBQUosRUFGbkI7QUFHRCxDQUpEOztBQU9BLFdBQWFZLEtBQWI7QUFBQTs7QUFLRSxtQkFBdUI7QUFBQSxRQUFYQyxJQUFXLHVFQUFKLEVBQUk7O0FBQUE7O0FBQUEsc0hBRWhCQSxJQUZnQjtBQUduQkMsa0JBQVliLE9BQU9ZLEtBQUtDLFVBQUwsSUFBbUIsRUFBMUI7QUFITztBQUt0Qjs7QUFWSDtBQUFBLEVBQTJCaEIsT0FBTztBQUNoQ2lCLE1BQUksRUFENEI7QUFFaENDLFFBQU0sRUFGMEI7QUFHaENGLGNBQVlkO0FBSG9CLENBQVAsRUFJeEIsT0FKd0IsQ0FBM0I7O0FBYUEsT0FBTyxJQUFNaUIsZ0JBQWdCLElBQUlqQixHQUFKLENBQVE7QUFDbkMsUUFBTSxJQUFJWSxLQUFKLENBQVU7QUFDZEcs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QmMsQ0FBUCxFQW9CeEIsT0FwQndCLENBQTNCIiwiZmlsZSI6Im1vZGVscy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVjb3JkLCBMaXN0LCBNYXAsIGZyb21KU30gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7TU9ERV9JRExFLCBNT0RFXzJEX1BBTn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtTTkFQX01BU0t9IGZyb20gJy4vdXRpbHMvc25hcCc7XG5cbmxldCBzYWZlTG9hZE1hcExpc3QgPSAobWFwTGlzdCwgTW9kZWwsIGRlZmF1bHRNYXApID0+IHtcbiAgcmV0dXJuIG1hcExpc3RcbiAgICA/IG5ldyBNYXAobWFwTGlzdCkubWFwKG0gPT4gbmV3IE1vZGVsKG0pKS50b01hcCgpXG4gICAgOiAoZGVmYXVsdE1hcCB8fCBuZXcgTWFwKCkpO1xufTtcblxuXG5leHBvcnQgY2xhc3MgR3VpZGUgZXh0ZW5kcyBSZWNvcmQoe1xuICBpZDogJycsXG4gIHR5cGU6ICcnLFxuICBwcm9wZXJ0aWVzOiBNYXAoKVxufSwgJ0d1aWRlJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSlcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdEd1aWRlcyA9IG5ldyBNYXAoe1xuICAnaDEnOiBuZXcgR3VpZGUoe1xuICAgIGlkOiAnaDEnLFxuICAgIHR5cGU6ICdob3Jpem9udGFsLXN0cmVhaycsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc3RlcDogMjAsXG4gICAgICBjb2xvcnM6IFsnIzgwODA4MCcsICcjZGRkJywgJyNkZGQnLCAnI2RkZCcsICcjZGRkJ11cbiAgICB9XG4gIH0pLFxuICAndjEnOiBuZXcgR3VpZGUoe1xuICAgIGlkOiAndjEnLFxuICAgIHR5cGU6ICd2ZXJ0aWNhbC1zdHJlYWsnLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHN0ZXA6IDIwLFxuICAgICAgY29sb3JzOiBbJyM4MDgwODAnLCAnI2RkZCcsICcjZGRkJywgJyNkZGQnLCAnI2RkZCddXG4gICAgfVxuICB9KVxufSk7XG5cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRzU2V0IGV4dGVuZHMgUmVjb3JkKHtcbiAgdmVydGljZXM6IG5ldyBMaXN0KCksXG4gIGxpbmVzOiBuZXcgTGlzdCgpLFxuICBob2xlczogbmV3IExpc3QoKSxcbiAgYXJlYXM6IG5ldyBMaXN0KCksXG4gIGl0ZW1zOiBuZXcgTGlzdCgpLFxufSwgJ0VsZW1lbnRzU2V0Jykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICB2ZXJ0aWNlczogbmV3IExpc3QoanNvbi52ZXJ0aWNlcyB8fCBbXSksXG4gICAgICBsaW5lczogbmV3IExpc3QoanNvbi5saW5lcyB8fCBbXSksXG4gICAgICBob2xlczogbmV3IExpc3QoanNvbi5ob2xlcyB8fCBbXSksXG4gICAgICBhcmVhczogbmV3IExpc3QoanNvbi5hcmVhcyB8fCBbXSksXG4gICAgICBpdGVtczogbmV3IExpc3QoanNvbi5pdGVtcyB8fCBbXSlcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IHNoYXJlZEF0dHJpYnV0ZXMgPVxue1xuICBpZDogJycsXG4gIHR5cGU6ICcnLFxuICBwcm90b3R5cGU6ICcnLFxuICBuYW1lOiAnJyxcbiAgbWlzYzogbmV3IE1hcCgpLFxuICBzZWxlY3RlZDogZmFsc2UsXG4gIHByb3BlcnRpZXM6IG5ldyBNYXAoKSxcbn1cblxuZXhwb3J0IGNsYXNzIFZlcnRleCBleHRlbmRzIFJlY29yZCh7XG4gIC4uLnNoYXJlZEF0dHJpYnV0ZXMsXG4gIHg6IC0xLFxuICB5OiAtMSxcbiAgcHJvdG90eXBlOiAndmVydGljZXMnLFxuICBsaW5lczogbmV3IExpc3QoKSxcbiAgYXJlYXM6IG5ldyBMaXN0KClcbn0sICdWZXJ0ZXgnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBsaW5lczogbmV3IExpc3QoanNvbi5saW5lcyB8fCBbXSksXG4gICAgICBhcmVhczogbmV3IExpc3QoanNvbi5hcmVhcyB8fCBbXSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaW5lIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnbGluZXMnLFxuICB2ZXJ0aWNlczogbmV3IExpc3QoKSxcbiAgaG9sZXM6IG5ldyBMaXN0KClcbn0sICdMaW5lJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSksXG4gICAgICB2ZXJ0aWNlczogbmV3IExpc3QoanNvbi52ZXJ0aWNlcyB8fCBbXSksXG4gICAgICBob2xlczogbmV3IExpc3QoanNvbi5ob2xlcyB8fCBbXSksXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSG9sZSBleHRlbmRzIFJlY29yZCh7XG4gIC4uLnNoYXJlZEF0dHJpYnV0ZXMsXG4gIHByb3RvdHlwZTogJ2hvbGVzJyxcbiAgb2Zmc2V0OiAtMSxcbiAgbGluZTogJydcbn0sICdIb2xlJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcmVhIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnYXJlYXMnLFxuICB2ZXJ0aWNlczogbmV3IExpc3QoKSxcbiAgaG9sZXM6IG5ldyBMaXN0KCksXG4gIHNob3dIZWF0TWFwOiBmYWxzZSxcbiAgaGVhdE1hcFRleHQ6ICcnLFxuICBoZWF0TWFwQ29sb3I6IFtdLFxuICB0b29sdGlwOiB7fSxcbn0sICdBcmVhJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7IFxuICAgICAgLi4uanNvbixcbiAgICAgIHByb3BlcnRpZXM6IGZyb21KUyhqc29uLnByb3BlcnRpZXMgfHwge30pLFxuICAgICAgdmVydGljZXM6IG5ldyBMaXN0KGpzb24udmVydGljZXMgfHwgW10pXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSXRlbSBleHRlbmRzIFJlY29yZCh7XG4gIC4uLnNoYXJlZEF0dHJpYnV0ZXMsXG4gIHByb3RvdHlwZTogJ2l0ZW1zJyxcbiAgeDogMCxcbiAgeTogMCxcbiAgcm90YXRpb246IDBcbn0sICdJdGVtJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMYXllciBleHRlbmRzIFJlY29yZCh7XG4gIGlkOiAnJyxcbiAgYWx0aXR1ZGU6IDAsXG4gIG9yZGVyOiAwLFxuICBvcGFjaXR5OiAxLFxuICBuYW1lOiAnJyxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgdmVydGljZXM6IG5ldyBNYXAoKSxcbiAgbGluZXM6IG5ldyBNYXAoKSxcbiAgaG9sZXM6IG5ldyBNYXAoKSxcbiAgYXJlYXM6IG5ldyBNYXAoKSxcbiAgaXRlbXM6IG5ldyBNYXAoKSxcbiAgc2VsZWN0ZWQ6IG5ldyBFbGVtZW50c1NldCgpLFxufSwgJ0xheWVyJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgdmVydGljZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLnZlcnRpY2VzLCBWZXJ0ZXgpLFxuICAgICAgbGluZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLmxpbmVzLCBMaW5lKSxcbiAgICAgIGhvbGVzOiBzYWZlTG9hZE1hcExpc3QoanNvbi5ob2xlcywgSG9sZSksXG4gICAgICBhcmVhczogc2FmZUxvYWRNYXBMaXN0KGpzb24uYXJlYXMsIEFyZWEpLFxuICAgICAgaXRlbXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLml0ZW1zLCBJdGVtKSxcbiAgICAgIHNlbGVjdGVkOiBuZXcgRWxlbWVudHNTZXQoanNvbi5zZWxlY3RlZClcbiAgICB9KTtcbiAgfVxufVxuXG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0TGF5ZXJzID0gbmV3IE1hcCh7XG4gICdsYXllci0xJzogbmV3IExheWVyKHtpZDogJ2xheWVyLTEnLCBuYW1lOiAnZGVmYXVsdCd9KVxufSk7XG5cblxuZXhwb3J0IGNsYXNzIFNjZW5lIGV4dGVuZHMgUmVjb3JkKHtcbiAgdW5pdDogJ2NtJyxcbiAgbGF5ZXJzOiBuZXcgTWFwKCksXG4gIGd1aWRlczogbmV3IE1hcCgpLFxuICBzZWxlY3RlZExheWVyOiBudWxsLFxuICBmb250U2l6ZTogMTIsXG4gIHdpZHRoOiAzMDAwLFxuICBoZWlnaHQ6IDIwMDAsXG4gIG1ldGE6IG5ldyBNYXAoKSAgIC8vYWRkaXRpb25hbCBpbmZvXG59LCAnU2NlbmUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIGxldCBsYXllcnMgPSBzYWZlTG9hZE1hcExpc3QoanNvbi5sYXllcnMsIExheWVyLCBEZWZhdWx0TGF5ZXJzKTtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgZ3VpZGVzOiBzYWZlTG9hZE1hcExpc3QoanNvbi5ndWlkZXMsIEd1aWRlLCBEZWZhdWx0R3VpZGVzKSxcbiAgICAgIGxheWVycyxcbiAgICAgIHNlbGVjdGVkTGF5ZXI6IGxheWVycy5maXJzdCgpLmlkLFxuICAgICAgbWV0YToganNvbi5tZXRhID8gZnJvbUpTKGpzb24ubWV0YSkgOiBuZXcgTWFwKClcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRhbG9nRWxlbWVudCBleHRlbmRzIFJlY29yZCh7XG4gIG5hbWU6ICcnLFxuICBwcm90b3R5cGU6ICcnLFxuICBpbmZvOiBuZXcgTWFwKCksXG4gIHByb3BlcnRpZXM6IG5ldyBNYXAoKSxcbn0sICdDYXRhbG9nRWxlbWVudCcpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uanNvbixcbiAgICAgIGluZm86IGZyb21KUyhqc29uLmluZm8pLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcylcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0YWxvZyBleHRlbmRzIFJlY29yZCh7XG4gIHJlYWR5OiBmYWxzZSxcbiAgcGFnZTogXCJyb290XCIsXG4gIHBhdGg6IG5ldyBMaXN0KCksXG4gIGVsZW1lbnRzOiBuZXcgTWFwKCksXG59LCAnQ2F0YWxvZycpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgbGV0IGVsZW1lbnRzID0gc2FmZUxvYWRNYXBMaXN0KGpzb24uZWxlbWVudHMsIENhdGFsb2dFbGVtZW50KTtcbiAgICBzdXBlcih7XG4gICAgICBlbGVtZW50cyxcbiAgICAgIHJlYWR5OiAhZWxlbWVudHMuaXNFbXB0eSgpXG4gICAgfSlcbiAgfVxuXG4gIGZhY3RvcnlFbGVtZW50KHR5cGUsIG9wdGlvbnMsIGluaXRpYWxQcm9wZXJ0aWVzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuaGFzKHR5cGUpKSB7XG4gICAgICBsZXQgY2F0TGlzdCA9IHRoaXMuZWxlbWVudHMubWFwKGVsZW1lbnQgPT4gZWxlbWVudC5uYW1lKS50b0FycmF5KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHt0eXBlfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nICR7Y2F0TGlzdH1gKTtcbiAgICB9XG5cbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZWxlbWVudHMuZ2V0KHR5cGUpO1xuICAgIGxldCBwcm9wZXJ0aWVzID0gZWxlbWVudC5wcm9wZXJ0aWVzLm1hcCgodmFsdWUsIGtleSkgPT4gaW5pdGlhbFByb3BlcnRpZXNba2V5XSB8fCB2YWx1ZS5nZXQoJ2RlZmF1bHRWYWx1ZScpKTtcblxuICAgIHN3aXRjaCAoZWxlbWVudC5wcm90b3R5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmVzJzpcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGNhc2UgJ2hvbGVzJzpcbiAgICAgICAgcmV0dXJuIG5ldyBIb2xlKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGNhc2UgJ2FyZWFzJzpcbiAgICAgICAgcmV0dXJuIG5ldyBBcmVhKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGNhc2UgJ2l0ZW1zJzpcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVtKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvdG90eXBlIG5vdCB2YWxpZCcpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RhdGUgZXh0ZW5kcyBSZWNvcmQoe1xuICBtb2RlOiBNT0RFX0lETEUsXG4gIHNjZW5lOiBuZXcgU2NlbmUoKSxcbiAgc2NlbmVIaXN0b3J5OiBuZXcgTGlzdChbbmV3IFNjZW5lKCldKSxcbiAgY2F0YWxvZzogbmV3IENhdGFsb2coKSxcbiAgdmlld2VyMkQ6IG5ldyBNYXAoKSxcbiAgbW91c2U6IG5ldyBNYXAoe3g6IDAsIHk6IDB9KSxcbiAgem9vbTogMCxcbiAgYXJlYXNUZXh0OiBuZXcgTWFwKCksXG4gIHNuYXBNYXNrOiBTTkFQX01BU0ssXG4gIHNuYXBFbGVtZW50czogbmV3IExpc3QoKSxcbiAgYWN0aXZlU25hcEVsZW1lbnQ6IG51bGwsXG4gIGRyYXdpbmdTdXBwb3J0OiBuZXcgTWFwKCksXG4gIGRyYWdnaW5nU3VwcG9ydDogbmV3IE1hcCgpLFxuICByb3RhdGluZ1N1cHBvcnQ6IG5ldyBNYXAoKSxcbiAgZXJyb3JzOiBuZXcgTGlzdCgpLFxuICB3YXJuaW5nczogbmV3IExpc3QoKSxcbiAgY2xpcGJvYXJkUHJvcGVydGllczogbnVsbCxcbiAgc2VsZWN0ZWRFbGVtZW50c0hpc3Rvcnk6IG5ldyBMaXN0KCksXG4gIG1pc2M6IG5ldyBNYXAoKSAgIC8vYWRkaXRpb25hbCBpbmZvXG59LCAnU3RhdGUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIGxldCBzY2VuZSA9IG5ldyBTY2VuZShqc29uLnNjZW5lKTtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgc2NlbmUsXG4gICAgICBzY2VuZUhpc3Rvcnk6IGpzb24uc2NlbmVIaXN0b3J5ID8ganNvbi5zY2VuZUhpc3RvcnkgOiBuZXcgTGlzdChbc2NlbmVdKSxcbiAgICAgIGNhdGFsb2c6IG5ldyBDYXRhbG9nKGpzb24uY2F0YWxvZyB8fCB7fSksXG4gICAgICB2aWV3ZXIyRDogbmV3IE1hcChqc29uLnZpZXdlcjJEIHx8IHt9KSxcbiAgICAgIGRyYXdpbmdTdXBwb3J0OiBuZXcgTWFwKGpzb24uZHJhd2luZ1N1cHBvcnQgfHwge30pLFxuICAgICAgZHJhZ2dpbmdTdXBwb3J0OiBuZXcgTWFwKGpzb24uZHJhZ2dpbmdTdXBwb3J0IHx8IHt9KSxcbiAgICAgIHJvdGF0aW5nU3VwcG9ydDogbmV3IE1hcChqc29uLnJvdGF0aW5nU3VwcG9ydCB8fCB7fSksXG4gICAgICBtaXNjOiBqc29uLm1pc2MgPyBmcm9tSlMoanNvbi5taXNjKSA6IG5ldyBNYXAoKVxuICAgIH0pXG4gIH1cbn1cblxuXG5cbiJdfQ==