UNPKG

gd-canvas

Version:

This set of libraries was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.0 and no dependencies accept gd-tree (it has jquery and jstree) and gd-graph (it has jquery and chart.js).

722 lines 123 kB
import { Types } from './gd-canvas.base'; import { Actions } from './gd-canvas.base'; import { Tools } from './gd-canvas.tools'; import { Point } from 'gd-common'; import { Rect } from 'gd-common'; import { Vector } from 'gd-common'; import { Line } from 'gd-common'; import { CustomObject } from 'gd-canvas-custom-types'; var Selector = /** @class */ (function () { function Selector(canvas, service) { var _this = this; this.service = service; this.canvas = canvas; this.selected = new Array(); this.focused = null; this.tools = new Tools(); service.focusedMove$.subscribe(function (offset) { return _this.OnFocusedMove(offset); }); } Object.defineProperty(Selector.prototype, "StartX", { get: function () { return this.startX; }, set: function (x) { this.startX = x; this.rect = null; }, enumerable: true, configurable: true }); Object.defineProperty(Selector.prototype, "StartY", { get: function () { return this.startY; }, set: function (y) { this.startY = y; this.rect = null; }, enumerable: true, configurable: true }); Object.defineProperty(Selector.prototype, "EndX", { get: function () { return this.endX; }, set: function (x) { this.endX = x; this.rect = null; }, enumerable: true, configurable: true }); Object.defineProperty(Selector.prototype, "EndY", { get: function () { return this.endY; }, set: function (y) { this.endY = y; this.rect = null; }, enumerable: true, configurable: true }); Selector.prototype.OnFocusedMove = function (offset) { for (var i = 0; i < this.selected.length; ++i) { if (this.selected[i].IsFocused) continue; if (this.selected[i].ParentID !== null) continue; this.selected[i].MoveOffset(offset.x, offset.y); } }; Selector.prototype.GetPoints = function () { var x = Math.min(this.startX, this.endX); var y = Math.min(this.startY, this.endY); var w = Math.abs(this.startX - this.endX); var h = Math.abs(this.startY - this.endY); var points = [ { x: x, y: y }, { x: x + w, y: y }, { x: x + w, y: y + h }, { x: x, y: y + h }, { x: x, y: y } ]; return points; }; Selector.prototype.Refresh = function () { if (this.rect !== null) return; var x = Math.min(this.startX, this.endX); var y = Math.min(this.startY, this.endY); var w = Math.abs(this.startX - this.endX); var h = Math.abs(this.startY - this.endY); this.rect = new Rect(x, y, w, h); }; Selector.prototype.Add = function (object) { if (this.rect === null) return false; if (object === undefined) return false; if (object.IsSelected) return false; var flag = true; var x = this.rect.x / this.canvas.scale - this.canvas.canvasOffsetX; var y = this.rect.y / this.canvas.scale - this.canvas.canvasOffsetY; var modelRect = new Rect(x, y, this.rect.w / this.canvas.scale, this.rect.h / this.canvas.scale); var points = object.GetPolygon(); for (var j = 0; j < points.length; ++j) { if (!modelRect.IsContains(points[j])) { flag = false; break; } } if (!flag) return false; if (this.selected.length === 0) { this.focused = object; object.IsFocused = true; } this.selected.push(object); object.IsSelected = true; return true; }; Selector.prototype.ClearSelection = function () { this.selected = new Array(); if (this.focused === null) return; this.focused.IsFocused = false; this.focused.activePoint = -1; this.focused.activeLine = -1; this.focused = null; }; Selector.prototype.Select = function (point, isRightClick) { var toRedraw = []; var object = this.canvas.GetObjectClicked(point); if (object === undefined) { if (this.focused !== null) { var res = this.UnSelect(); this.canvas.DRAW(res); this.service.SelectedChanged(null); } return false; } if (!this.canvas.isAltKey) { if (object.type === Types.polyline) { } if (object.type === Types.polygon) { if (object.Text.IsFocused) { this.selected.push(object); } else { if (!object.IsSelected) { this.UnSelect(); } if (object.activeLine !== -1) { this.selected.push(object); } } } else { if (object.IsRef) { if (object.IsSelected) { object.Reference.IsVisible = !object.Reference.IsVisible; if (object.Reference.IsRef) { object.Reference.Reference.IsVisible = object.Reference.IsVisible; //????????????????????? } } else { object.Reference.IsVisible = true; } } if (!object.IsSelected) { toRedraw = this.UnSelect(); this.selected.push(object); if (CustomObject.Select(object)) { var layer = this.canvas.map.get(object.Type); if (layer !== undefined) { var type = Types[object.Type].toString(); if (toRedraw.indexOf(type) === -1) toRedraw.push(type); var child = this.canvas.mapChildren.get(object.Type); if (child !== undefined) { var type = Types[child].toString(); if (toRedraw.indexOf(type) === -1) toRedraw.push(type); } } var layer = this.canvas.map.get(object.ParentType); if (layer !== undefined) { var type = Types[object.ParentType].toString(); if (toRedraw.indexOf(type) === -1) toRedraw.push(type); } } if (object.type === Types.reference) { object.IsVisible = true; object.Select(); } } } if (this.focused !== null && this.focused !== object) { this.focused.IsFocused = false; this.focused.activePoint = -1; this.focused.activeLine = -1; if (!object.IsSelected) { this.focused.IsSelected = false; } } this.focused = object; this.focused.IsFocused = true; this.focused.IsSelected = true; this.focused.ClickOffsetX = point.x - this.focused.X; this.focused.ClickOffsetY = point.y - this.focused.Y; } else { if (object.type === Types.polygon) { if (object.Text.IsFocused) { this.selected.push(object); } else { if (!object.IsSelected) { this.UnSelect(); } if (object.activeLine !== -1) { this.selected.push(object); } } } else { if (!object.IsSelected) { this.selected.push(object); if (CustomObject.Select(object)) { var layer = this.canvas.map.get(object.Type); if (layer !== undefined) { var type = Types[object.Type].toString(); if (toRedraw.indexOf(type) === -1) toRedraw.push(type); } var layer = this.canvas.map.get(object.ParentType); if (layer !== undefined) { var type = Types[object.ParentType].toString(); if (toRedraw.indexOf(type) === -1) toRedraw.push(type); } } if (object.type === Types.reference) { object.IsVisible = true; } if (object.type === Types.shape) { if (object.IsRef) object.Reference.IsVisible = true; } if (this.focused !== null) { this.focused.IsFocused = false; this.focused.activePoint = -1; this.focused.activeLine = -1; } this.focused = object; this.focused.IsFocused = true; this.focused.IsSelected = true; this.focused.ClickOffsetX = point.x - this.focused.X; this.focused.ClickOffsetY = point.y - this.focused.Y; } else { var i = this.selected.indexOf(object); if (i > -1) { this.selected.splice(i, 1); } object.IsSelected = false; if (object.IsFocused) { this.focused.IsFocused = false; this.focused.activePoint = -1; this.focused.activeLine = -1; this.focused = null; if (this.selected.length > 0) { this.focused = this.selected[0]; this.focused.IsFocused = true; } } } } } var newSelected = Types[object.type]; if (toRedraw.indexOf(newSelected) === -1) toRedraw.push(Types[object.type]); if (toRedraw.indexOf('selected') === -1) toRedraw.push('selected'); if (object.isRef) if (toRedraw.indexOf('reference') === -1) toRedraw.push('reference'); if (object.type === Types.text && object.ParentType === Types.polygon) if (toRedraw.indexOf('polygon') === -1) toRedraw.push('polygon'); this.canvas.DRAW(toRedraw); return true; }; Selector.prototype.UnSelect = function () { if (this.selected.length === 0) return []; var wasSelected = new Array(); wasSelected.push('selected'); for (var i = 0; i < this.selected.length; ++i) { this.selected[i].IsSelected = false; if (CustomObject.UnSelect(this.selected[i])) { var child = this.canvas.mapChildren.get(this.selected[i].type); if (child !== undefined) { var type = Types[child].toString(); if (wasSelected.indexOf(type) === -1) wasSelected.push(type); type = Types[this.selected[i].type].toString(); if (wasSelected.indexOf(type) === -1) wasSelected.push(type); } } switch (this.selected[i].type) { case Types.block: { if (wasSelected.indexOf('block') === -1) wasSelected.push('block'); } break; case Types.dimension: { if (wasSelected.indexOf('dimension') === -1) wasSelected.push('dimension'); } break; case Types.segment: { if (wasSelected.indexOf('segment') === -1) wasSelected.push('segment'); } break; case Types.arc: { if (wasSelected.indexOf('arc') === -1) wasSelected.push('arc'); } break; case Types.polygon: { if (wasSelected.indexOf('polygon') === -1) wasSelected.push('polygon'); } break; case Types.callout: { if (wasSelected.indexOf('callout') === -1) wasSelected.push('callout'); } break; case Types.polyline: { if (wasSelected.indexOf('polyline') === -1) wasSelected.push('polyline'); this.selected[i].activePoint = -1; this.selected[i].activeLine = -1; this.selected[i].activeLineKeeper = -1; } break; case Types.reference: { this.selected[i].IsVisible = false; if (wasSelected.indexOf('reference') === -1) wasSelected.push('reference'); for (var j = 0; j < this.selected[i].Children.length; ++j) { var toRedraw = Types[this.selected[i].Children[j].type]; if (wasSelected.indexOf(toRedraw) === -1) wasSelected.push(toRedraw); } } break; case Types.shape: { if (CustomObject.UnSelect(this.selected[i])) { var layer = this.canvas.map.get(this.selected[i].ParentType); if (layer !== null) { var type = Types[this.selected[i].ParentType].toString(); if (wasSelected.indexOf(type) === -1) wasSelected.push(type); } } if (this.selected[i].IsRef) { this.selected[i].Reference.IsVisible = false; if (this.selected[i].Reference.IsRef) { this.selected[i].Reference.Reference.IsVisible = false; } if (wasSelected.indexOf('reference') === -1) wasSelected.push('reference'); } if (wasSelected.indexOf('shape') === -1) wasSelected.push('shape'); } break; case Types.text: { if (this.selected[i].ParentType === Types.polygon) { if (wasSelected.indexOf('polygon') === -1) wasSelected.push('polygon'); } else { if (wasSelected.indexOf('text') === -1) wasSelected.push('text'); } } break; } } this.ClearSelection(); return wasSelected; }; Selector.prototype.IsContains = function (point) { return false; }; Selector.prototype.Draw = function (c) { if (c === null || c === undefined) return; this.Refresh(); var borderThickness = 0.25; c.clearRect(-0.5, -0.5, this.canvas.width + 1, this.canvas.height + 1); if (this.canvas.action === Actions.select || this.canvas.action === Actions.selectShapes) { c.save(); c.fillStyle = 'rgba(128, 159, 255, 0.15)'; c.strokeStyle = 'rgba( 0, 45, 179, 1.00)'; c.lineWidth = borderThickness; c.beginPath(); c.rect(this.rect.x + (0.5 / this.canvas.scale), this.rect.y + (0.5 / this.canvas.scale), this.rect.w, this.rect.h); c.closePath(); c.fill(); c.stroke(); c.restore(); } if (this.canvas.action === Actions.selectShapesInOrder) { c.save(); c.strokeStyle = 'rgba( 0, 45, 179, 1.00)'; c.lineWidth = borderThickness; c.beginPath(); c.moveTo(this.startX, this.startY); c.lineTo(this.endX, this.endY); c.closePath(); c.stroke(); c.restore(); } CustomObject.DoCustomAction(c, this.canvas.action, this.startX, this.startY, this.endX, this.endY, this.canvas.scale, borderThickness); }; Selector.prototype.DrawRegularGondola = function (c) { var LocationW = 40; var LocationH = 20; var Start = 0; var End = 0; try { var start = new Point(this.StartX / this.canvas.scale, this.StartY / this.canvas.scale); var end = new Point(this.EndX / this.canvas.scale, this.EndY / this.canvas.scale); var vector = new Vector(start, end); var angle = vector.Angle(); var len = vector.Length(); var vectorStartCap = new Vector(start, end); vectorStartCap.Normalize(); vectorStartCap.Scale(-LocationH); var vectorEndCap = new Vector(start, end); vectorEndCap.Normalize(); vectorEndCap.Scale(LocationH); var vector1 = new Vector(start, end); vector1.Rotate90(); vector1.Normalize(); vector1.Scale(LocationH); var vector2 = new Vector(start, end); vector2.Rotate90(); vector2.Rotate90(); vector2.Rotate90(); vector2.Normalize(); vector2.Scale(LocationH); var gondola = new Line(this.startX, this.startY, this.endX, this.endY); var line1 = new Line(this.startX + vector2.x, this.startY + vector2.y, this.startX + vector1.x, this.startY + vector1.y); var line2 = new Line(this.startX + vector1.x, this.startY + vector1.y, this.endX + vector1.x, this.endY + vector1.y); var line3 = new Line(this.endX + vector1.x, this.endY + vector1.y, this.endX + vector2.x, this.endY + vector2.y); var line4 = new Line(this.endX + vector2.x, this.endY + vector2.y, this.startX + vector2.x, this.startY + vector2.y); var line5 = new Line(this.startX + vector1.x, this.startY + vector1.y, this.startX + vectorStartCap.x + vector1.x, this.startY + vectorStartCap.y + vector1.y); var line6 = new Line(this.startX + vectorStartCap.x + vector1.x, this.startY + vectorStartCap.y + vector1.y, this.startX + vectorStartCap.x + vector2.x, this.startY + vectorStartCap.y + vector2.y); var line7 = new Line(this.startX + vectorStartCap.x + vector2.x, this.startY + vectorStartCap.y + vector2.y, this.startX + vector2.x, this.startY + vector2.y); var line8 = new Line(this.endX + vector1.x, this.endY + vector1.y, this.endX + vectorEndCap.x + vector1.x, this.endY + vectorEndCap.y + vector1.y); var line9 = new Line(this.endX + vectorEndCap.x + vector1.x, this.endY + vectorEndCap.y + vector1.y, this.endX + vectorEndCap.x + vector2.x, this.endY + vectorEndCap.y + vector2.y); var line10 = new Line(this.endX + vectorEndCap.x + vector2.x, this.endY + vectorEndCap.y + vector2.y, this.endX + vector2.x, this.endY + vector2.y); c.beginPath(); c.moveTo(gondola.x1, gondola.y1); c.lineTo(gondola.x2, gondola.y2); c.moveTo(line1.x1, line1.y1); c.lineTo(line1.x2, line1.y2); c.lineTo(line2.x2, line2.y2); c.lineTo(line3.x2, line3.y2); c.lineTo(line4.x2, line4.y2); c.moveTo(line5.x1, line5.y1); c.lineTo(line5.x2, line5.y2); c.lineTo(line6.x2, line6.y2); c.lineTo(line7.x2, line7.y2); c.moveTo(line8.x1, line8.y1); c.lineTo(line8.x2, line8.y2); c.lineTo(line9.x2, line9.y2); c.lineTo(line10.x2, line10.y2); c.closePath(); c.stroke(); var vector3 = new Vector(start, end); var tempID = 1; // int tempID = Map.NextAreaID; var count = (len / LocationW); var areaCount = 2 * count + 2; for (var i = 1; i <= count; ++i) { vector3.Normalize(); vector3.Scale(LocationW * i); var line = new Line(this.startX + vector1.x + vector3.x, this.startY + vector1.y + vector3.y, this.startX + vector2.x + vector3.x, this.startY + vector2.y + vector3.y); c.beginPath(); c.moveTo(line.x1, line.y1); c.lineTo(line.x2, line.y2); c.closePath(); c.stroke(); } var vector5 = new Vector(start, end); var vector6 = new Vector(start, end); vector6.Normalize(); vector6.Scale(-LocationW / 2); var vector7 = new Vector(start, end); vector7.Rotate90(); vector7.Normalize(); vector7.Scale(LocationH / 2 - 4); var text = ''; var x = 0; var y = 0; for (var i = 1; i <= count; ++i) { c.save(); vector5.Normalize(); vector5.Scale(LocationW * i); // text = (tempID + i-1).toString(); text = (tempID + 2 * Math.floor(count) + 1 - i).toString(); x = this.startX + vector5.x + vector6.x + vector7.x; y = this.startY + vector5.y + vector6.y + vector7.y; c.translate(x, y); c.rotate(angle * Math.PI / 180); // c.font = '10px Source Sans Pro'; // c.font = '10px Open Sans'; c.font = '10px Sans'; c.fillStyle = 'black'; c.textAlign = 'center'; c.fillText(text, 0, 0); c.restore(); } text = (tempID + Math.floor(count)).toString(); var vector8 = new Vector(start, end); vector8.Normalize(); vector8.Scale(LocationH / 2 - 3); x = this.endX + vector8.x; y = this.endY + vector8.y; c.save(); c.translate(x, y); c.rotate((angle + 90) * Math.PI / 180); c.font = '10px Sans'; c.fillStyle = 'black'; c.textAlign = 'center'; c.fillText(text, 0, 0); c.restore(); vector7.Normalize(); vector7.Scale(-LocationH / 2 + 4); for (var i = 1; i <= count; ++i) { c.save(); vector5.Normalize(); vector5.Scale(LocationW * i); text = (tempID + i - 1).toString(); // text = (tempID + 2 * Math.floor(count) + 1 - i).toString(); x = this.startX + vector5.x + vector6.x + vector7.x; y = this.startY + vector5.y + vector6.y + vector7.y; c.translate(x, y); c.rotate((angle + 180) * Math.PI / 180); c.font = '10px Sans'; c.fillStyle = 'black'; c.textAlign = 'center'; c.fillText(text, 0, 0); c.restore(); } var vector9 = new Vector(start, end); vector9.Normalize(); vector9.Scale(-LocationH / 2 + 4); text = (tempID + 2 * Math.floor(count) + 1).toString(); x = this.startX + vector9.x; y = this.startY + vector9.y; c.save(); c.translate(x, y); c.rotate((angle + 270) * Math.PI / 180); c.font = '10px Sans'; c.fillStyle = 'black'; c.textAlign = 'center'; c.fillText(text, 0, 0); c.restore(); } catch (ex) { } }; Selector.prototype.DrawWallGondola = function (c) { var LocationW = 40; var LocationH = 20; var Start = 0; var End = 0; try { var start = new Point(this.StartX / this.canvas.scale, this.StartY / this.canvas.scale); var end = new Point(this.EndX / this.canvas.scale, this.EndY / this.canvas.scale); var vector = new Vector(start, end); var angle = vector.Angle(); var len = vector.Length(); var vector2 = new Vector(start, end); vector2.Rotate90(); vector2.Normalize(); vector2.Scale(-LocationH); var gondola = new Line(this.startX, this.startY, this.endX, this.endY); var line1 = new Line(this.endX, this.endY, this.endX + vector2.x, this.endY + vector2.y); var line2 = new Line(this.endX + vector2.x, this.endY + vector2.y, this.startX + vector2.x, this.startY + vector2.y); var line3 = new Line(this.startX, this.startY, this.startX + vector2.x, this.startY + vector2.y); c.beginPath(); c.moveTo(gondola.x1, gondola.y1); c.lineTo(gondola.x2, gondola.y2); c.lineTo(line1.x2, line1.y2); c.lineTo(line2.x2, line2.y2); c.lineTo(line3.x2, line3.y2); c.closePath(); c.stroke(); var vector3 = new Vector(start, end); var tempID = 1; // int tempID = Map.NextAreaID; var count = (len / LocationW); var areaCount = 2 * count + 2; for (var i = 1; i <= count; ++i) { vector3.Normalize(); vector3.Scale(LocationW * i); var line = new Line(this.startX + vector3.x, this.startY + vector3.y, this.startX + vector2.x + vector3.x, this.startY + vector2.y + vector3.y); c.beginPath(); c.moveTo(line.x1, line.y1); c.lineTo(line.x2, line.y2); c.closePath(); c.stroke(); } var vector4 = new Vector(start, end); var vector5 = new Vector(start, end); vector5.Normalize(); vector5.Scale(-LocationW / 2 - 5); var vector6 = new Vector(start, end); vector6.Normalize(); vector6.Scale(LocationH / 2 - 3); var text = ''; var x = 0; var y = 0; for (var i = 1; i <= count; ++i) { c.save(); vector4.Normalize(); vector4.Scale(LocationW * i); text = (tempID + i - 1).toString(); x = this.startX + vector4.x + vector5.x + vector6.x; y = this.startY + vector4.y + vector5.y + vector6.x; c.translate(x, y); c.rotate((angle + 180) * Math.PI / 180); c.font = '10px Sans'; c.fillStyle = 'black'; c.textAlign = 'center'; c.fillText(text, 0, 0); c.restore(); } } catch (ex) { } }; Selector.prototype.DrawArea = function (c) { if (this.startX > this.endX) return; if (this.startY > this.endY) return; var LocationW = 40; var LocationH = 20; var paddingLeft = 5; var paddingTop = 5; var paddingRight = 5; var paddingBottom = 5; var rect = new Rect(this.startX, this.startY, this.endX - this.startX, this.endY - this.startY); var itemX = rect.x + paddingLeft * this.canvas.scale; var itemY = rect.y + paddingTop * this.canvas.scale; var text = ''; var tempID = 1; c.globalAlpha = 0.75; c.strokeStyle = '#444'; c.fillStyle = '#eee'; c.save(); c.beginPath(); c.rect(rect.x, rect.y, rect.w, rect.h); c.closePath(); c.fill(); c.stroke(); c.restore(); c.save(); text = 'Area 1'; var x = itemX; var y = itemY; c.font = '10px Sans'; c.fillStyle = 'black'; c.textAlign = 'left'; c.fillText(text, rect.x + 1, rect.y - 3); c.restore(); c.strokeStyle = '#777'; c.fillStyle = '#eee'; if (rect.w < 45 || rect.h < 25) return; var vector4 = new Vector(100, 0); vector4.Normalize(); vector4.Scale(LocationW / 2); var vector5 = new Vector(0, 100); vector5.Normalize(); vector5.Scale(LocationH / 2 + 4); for (var i = 0;; ++i) { if (itemX + LocationW + 3 > rect.x + rect.w) { itemX = rect.x + paddingLeft * this.canvas.scale; itemY = itemY + LocationH + 3; if (itemY + LocationH + 3 > rect.y + rect.h) { break; } } c.save(); c.beginPath(); this.tools.RoundRect(c, itemX, itemY, LocationW, LocationH, 3, '#f00', '#000'); c.closePath(); c.stroke(); c.restore(); c.save(); vector4.Normalize(); vector4.Scale(LocationW / 2); text = (tempID + i).toString(); var x_1 = itemX + vector4.x + vector5.x; var y_1 = itemY + vector4.y + vector5.y; c.font = '10px Sans'; c.fillStyle = 'black'; c.textAlign = 'center'; c.fillText(text, x_1, y_1); c.restore(); itemX = itemX + LocationW + 3; } }; return Selector; }()); export { Selector }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2QtY2FudmFzLnNlbGVjdG9yLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2QtY2FudmFzLyIsInNvdXJjZXMiOlsibGliL2dkLWNhbnZhcy5zZWxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBRXJELE9BQU8sRUFBRSxLQUFLLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFjLE1BQU0sV0FBVyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQWUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBYSxNQUFNLFdBQVcsQ0FBQztBQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFlLE1BQU0sV0FBVyxDQUFDO0FBRTlDLE9BQU8sRUFBRSxZQUFZLEVBQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUUzRDtJQXlCSSxrQkFBYSxNQUEwQixFQUFVLE9BQXlCO1FBQTFFLGlCQVFDO1FBUmdELFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBRXRFLElBQUksQ0FBQyxNQUFNLEdBQUssTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFJLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFFNUIsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUUsVUFBQyxNQUFZLElBQUssT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUExQixDQUEwQixDQUFFLENBQUM7SUFDbkYsQ0FBQztJQXBCRCxzQkFBSSw0QkFBTTthQUFWLGNBQWlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUF1QixDQUFDO2FBQzVF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QUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsT0FBTyxDQUFNLENBQUM7cUJBQUU7b0JBQUMsTUFBTTtnQkFDaEgsS0FBSyxLQUFLLENBQUMsU0FBUztvQkFBRzt3QkFBRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsV0FBVyxDQUFFLENBQUM7cUJBQUU7b0JBQUMsTUFBTTtnQkFDaEgsS0FBSyxLQUFLLENBQUMsT0FBTztvQkFBSzt3QkFBRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQU8sQ0FBQyxDQUFDOzRCQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsU0FBUyxDQUFJLENBQUM7cUJBQUU7b0JBQUMsTUFBTTtnQkFDaEgsS0FBSyxLQUFLLENBQUMsR0FBRztvQkFBUzt3QkFBRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQVcsQ0FBQyxDQUFDOzRCQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFRLENBQUM7cUJBQUU7b0JBQUMsTUFBTTtnQkFDaEgsS0FBSyxLQUFLLENBQUMsT0FBTztvQkFBSzt3QkFBRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQU8sQ0FBQyxDQUFDOzRCQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsU0FBUyxDQUFJLENBQUM7cUJBQUU7b0JBQUMsTUFBTTtnQkFDaEgsS0FBSyxLQUFLLENBQUMsT0FBTztvQkFBSzt3QkFBRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQU8sQ0FBQyxDQUFDOzRCQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsU0FBUyxDQUFJLENBQUM7cUJBQUU7b0JBQUMsTUFBTTtnQkFDaEgsS0FBSyxLQUFLLENBQUMsUUFBUTtvQkFDbkI7d0JBQ0ksSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFNLENBQUMsQ0FBQzs0QkFBRyxXQUFXLENBQUMsSUFBSSxDQUFFLFVBQVUsQ0FBRyxDQUFDO3dCQUM5RSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBUSxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzFDO29CQUFDLE1BQU07Z0JBQ1IsS0FBSyxLQUFLLENBQUMsU0FBUztvQkFDcEI7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO3dCQUNuQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsV0FBVyxDQUFFLENBQUM7d0JBRTlFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQzFEOzRCQUNJLElBQXdCLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzVFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQUcsV0FBVyxDQUFDLElBQUksQ0FBRSxRQUFRLENBQUUsQ0FBQzt5QkFDM0U7cUJBQ0o7b0JBQ0QsTUFBTTtnQkFDTixLQUFLLEtBQUssQ0FBQyxLQUFLO29CQUNoQjt3QkFDSSxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMzQzs0QkFDSSxJQUFJLEtBQUssR0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUUsQ0FBQzs0QkFDakUsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUNsQjtnQ0FDSSxJQUF3QixJQUFJLEdBQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ2hGLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0NBQUcsV0FBVyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUUsQ0FBQzs2QkFDbkU7eUJBQ0o7d0JBRUQsSUFB