@babylonjs/gui 5.0.0-alpha.65 → 5.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,7 @@ import { Control } from "./control";
5
5
  import { TextBlock } from "./textBlock";
6
6
  import { Image } from "./image";
7
7
  import { PointerInfoBase } from '@babylonjs/core/Events/pointerEvents';
8
+ import { AdvancedDynamicTexture } from "../advancedDynamicTexture";
8
9
  /**
9
10
  * Class used to create 2D buttons
10
11
  */
@@ -56,6 +57,13 @@ export declare class Button extends Rectangle {
56
57
  _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean;
57
58
  /** @hidden */
58
59
  _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: PointerInfoBase): void;
60
+ /**
61
+ * Serializes the current button
62
+ * @param serializationObject defines the JSON serialized object
63
+ */
64
+ serialize(serializationObject: any): void;
65
+ /** @hidden */
66
+ _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture): void;
59
67
  /**
60
68
  * Creates a new button made with an image and a text
61
69
  * @param name defines the name of the button
@@ -125,6 +125,29 @@ var Button = /** @class */ (function (_super) {
125
125
  }
126
126
  _super.prototype._onPointerUp.call(this, target, coordinates, pointerId, buttonIndex, notifyClick, pi);
127
127
  };
128
+ /**
129
+ * Serializes the current button
130
+ * @param serializationObject defines the JSON serialized object
131
+ */
132
+ Button.prototype.serialize = function (serializationObject) {
133
+ _super.prototype.serialize.call(this, serializationObject);
134
+ if (this._textBlock) {
135
+ serializationObject.textBlockName = this._textBlock.name;
136
+ }
137
+ if (this._image) {
138
+ serializationObject.imageName = this._image.name;
139
+ }
140
+ };
141
+ /** @hidden */
142
+ Button.prototype._parseFromContent = function (serializedObject, host) {
143
+ _super.prototype._parseFromContent.call(this, serializedObject, host);
144
+ if (serializedObject.textBlockName) {
145
+ this._textBlock = this.getChildByName(serializedObject.textBlockName);
146
+ }
147
+ if (serializedObject.imageName) {
148
+ this._image = this.getChildByName(serializedObject.imageName);
149
+ }
150
+ };
128
151
  // Statics
129
152
  /**
130
153
  * Creates a new button made with an image and a text
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/2D/controls/button.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"@babylonjs/core/types\";\r\nimport { Vector2 } from \"@babylonjs/core/Maths/math.vector\";\r\n\r\nimport { Rectangle } from \"./rectangle\";\r\nimport { Control } from \"./control\";\r\nimport { TextBlock } from \"./textBlock\";\r\nimport { Image } from \"./image\";\r\nimport { RegisterClass } from '@babylonjs/core/Misc/typeStore';\r\nimport { PointerInfoBase } from '@babylonjs/core/Events/pointerEvents';\r\n\r\n/**\r\n * Class used to create 2D buttons\r\n */\r\nexport class Button extends Rectangle {\r\n /**\r\n * Function called to generate a pointer enter animation\r\n */\r\n public pointerEnterAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer out animation\r\n */\r\n public pointerOutAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer down animation\r\n */\r\n public pointerDownAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer up animation\r\n */\r\n public pointerUpAnimation: () => void;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the button will let internal controls handle picking instead of doing it directly using its bounding info\r\n */\r\n public delegatePickingToChildren = false;\r\n\r\n private _image: Nullable<Image>;\r\n /**\r\n * Returns the image part of the button (if any)\r\n */\r\n public get image(): Nullable<Image> {\r\n return this._image;\r\n }\r\n\r\n private _textBlock: Nullable<TextBlock>;\r\n /**\r\n * Returns the image part of the button (if any)\r\n */\r\n public get textBlock(): Nullable<TextBlock> {\r\n return this._textBlock;\r\n }\r\n\r\n /**\r\n * Creates a new Button\r\n * @param name defines the name of the button\r\n */\r\n constructor(public name?: string) {\r\n super(name);\r\n\r\n this.thickness = 1;\r\n this.isPointerBlocker = true;\r\n\r\n let alphaStore: Nullable<number> = null;\r\n\r\n this.pointerEnterAnimation = () => {\r\n alphaStore = this.alpha;\r\n this.alpha -= 0.1;\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n if (alphaStore !== null) {\r\n this.alpha = alphaStore;\r\n }\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n this.scaleX -= 0.05;\r\n this.scaleY -= 0.05;\r\n };\r\n\r\n this.pointerUpAnimation = () => {\r\n this.scaleX += 0.05;\r\n this.scaleY += 0.05;\r\n };\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Button\";\r\n }\r\n\r\n // While being a container, the button behaves like a control.\r\n /** @hidden */\r\n public _processPicking(x: number, y: number, pi: PointerInfoBase, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled || !this.isHitTestVisible || !this.isVisible || this.notRenderable) {\r\n return false;\r\n }\r\n\r\n if (!super.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n if (this.delegatePickingToChildren) {\r\n let contains = false;\r\n for (var index = this._children.length - 1; index >= 0; index--) {\r\n var child = this._children[index];\r\n if (child.isEnabled && child.isHitTestVisible && child.isVisible && !child.notRenderable && child.contains(x, y)) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!contains) {\r\n return false;\r\n }\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerEnter(target: Control, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerEnter(target, pi)) {\r\n return false;\r\n }\r\n\r\n if (!this.isReadOnly && this.pointerEnterAnimation) {\r\n this.pointerEnterAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerOut(target: Control, pi: PointerInfoBase, force = false): void {\r\n if (!this.isReadOnly && this.pointerOutAnimation) {\r\n this.pointerOutAnimation();\r\n }\r\n\r\n super._onPointerOut(target, pi, force);\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (!this.isReadOnly && this.pointerDownAnimation) {\r\n this.pointerDownAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: PointerInfoBase): void {\r\n if (!this.isReadOnly && this.pointerUpAnimation) {\r\n this.pointerUpAnimation();\r\n }\r\n\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick, pi);\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new button made with an image and a text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageButton(name: string, text: string, imageUrl: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding text\r\n var textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n textBlock.paddingLeft = \"20%\";\r\n result.addControl(textBlock);\r\n\r\n // Adding image\r\n var iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.width = \"20%\";\r\n iconImage.stretch = Image.STRETCH_UNIFORM;\r\n iconImage.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n result.addControl(iconImage);\r\n\r\n // Store\r\n result._image = iconImage;\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with an image\r\n * @param name defines the name of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageOnlyButton(name: string, imageUrl: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding image\r\n var iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.stretch = Image.STRETCH_FILL;\r\n iconImage.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n result.addControl(iconImage);\r\n\r\n // Store\r\n result._image = iconImage;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with a text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @returns a new Button\r\n */\r\n public static CreateSimpleButton(name: string, text: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding text\r\n var textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n result.addControl(textBlock);\r\n\r\n // Store\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with an image and a centered text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageWithCenterTextButton(name: string, text: string, imageUrl: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding image\r\n var iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.stretch = Image.STRETCH_FILL;\r\n result.addControl(iconImage);\r\n\r\n // Adding text\r\n var textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n result.addControl(textBlock);\r\n\r\n // Store\r\n result._image = iconImage;\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Button\", Button);"]}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/2D/controls/button.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"@babylonjs/core/types\";\r\nimport { Vector2 } from \"@babylonjs/core/Maths/math.vector\";\r\n\r\nimport { Rectangle } from \"./rectangle\";\r\nimport { Control } from \"./control\";\r\nimport { TextBlock } from \"./textBlock\";\r\nimport { Image } from \"./image\";\r\nimport { RegisterClass } from '@babylonjs/core/Misc/typeStore';\r\nimport { PointerInfoBase } from '@babylonjs/core/Events/pointerEvents';\r\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\n\r\n/**\r\n * Class used to create 2D buttons\r\n */\r\nexport class Button extends Rectangle {\r\n /**\r\n * Function called to generate a pointer enter animation\r\n */\r\n public pointerEnterAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer out animation\r\n */\r\n public pointerOutAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer down animation\r\n */\r\n public pointerDownAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer up animation\r\n */\r\n public pointerUpAnimation: () => void;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the button will let internal controls handle picking instead of doing it directly using its bounding info\r\n */\r\n public delegatePickingToChildren = false;\r\n\r\n private _image: Nullable<Image>;\r\n /**\r\n * Returns the image part of the button (if any)\r\n */\r\n public get image(): Nullable<Image> {\r\n return this._image;\r\n }\r\n\r\n private _textBlock: Nullable<TextBlock>;\r\n /**\r\n * Returns the image part of the button (if any)\r\n */\r\n public get textBlock(): Nullable<TextBlock> {\r\n return this._textBlock;\r\n }\r\n\r\n /**\r\n * Creates a new Button\r\n * @param name defines the name of the button\r\n */\r\n constructor(public name?: string) {\r\n super(name);\r\n\r\n this.thickness = 1;\r\n this.isPointerBlocker = true;\r\n\r\n let alphaStore: Nullable<number> = null;\r\n\r\n this.pointerEnterAnimation = () => {\r\n alphaStore = this.alpha;\r\n this.alpha -= 0.1;\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n if (alphaStore !== null) {\r\n this.alpha = alphaStore;\r\n }\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n this.scaleX -= 0.05;\r\n this.scaleY -= 0.05;\r\n };\r\n\r\n this.pointerUpAnimation = () => {\r\n this.scaleX += 0.05;\r\n this.scaleY += 0.05;\r\n };\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Button\";\r\n }\r\n\r\n // While being a container, the button behaves like a control.\r\n /** @hidden */\r\n public _processPicking(x: number, y: number, pi: PointerInfoBase, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled || !this.isHitTestVisible || !this.isVisible || this.notRenderable) {\r\n return false;\r\n }\r\n\r\n if (!super.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n if (this.delegatePickingToChildren) {\r\n let contains = false;\r\n for (var index = this._children.length - 1; index >= 0; index--) {\r\n var child = this._children[index];\r\n if (child.isEnabled && child.isHitTestVisible && child.isVisible && !child.notRenderable && child.contains(x, y)) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!contains) {\r\n return false;\r\n }\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerEnter(target: Control, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerEnter(target, pi)) {\r\n return false;\r\n }\r\n\r\n if (!this.isReadOnly && this.pointerEnterAnimation) {\r\n this.pointerEnterAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerOut(target: Control, pi: PointerInfoBase, force = false): void {\r\n if (!this.isReadOnly && this.pointerOutAnimation) {\r\n this.pointerOutAnimation();\r\n }\r\n\r\n super._onPointerOut(target, pi, force);\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (!this.isReadOnly && this.pointerDownAnimation) {\r\n this.pointerDownAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @hidden */\r\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: PointerInfoBase): void {\r\n if (!this.isReadOnly && this.pointerUpAnimation) {\r\n this.pointerUpAnimation();\r\n }\r\n\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick, pi);\r\n }\r\n\r\n /**\r\n * Serializes the current button\r\n * @param serializationObject defines the JSON serialized object\r\n */\r\n public serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\r\n\r\n if (this._textBlock) {\r\n serializationObject.textBlockName = this._textBlock.name;\r\n }\r\n if (this._image) {\r\n serializationObject.imageName = this._image.name;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n\r\n if (serializedObject.textBlockName) {\r\n this._textBlock = this.getChildByName(serializedObject.textBlockName) as Nullable<TextBlock>;\r\n }\r\n\r\n if (serializedObject.imageName) {\r\n this._image = this.getChildByName(serializedObject.imageName) as Nullable<Image>;\r\n }\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new button made with an image and a text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageButton(name: string, text: string, imageUrl: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding text\r\n var textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n textBlock.paddingLeft = \"20%\";\r\n result.addControl(textBlock);\r\n\r\n // Adding image\r\n var iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.width = \"20%\";\r\n iconImage.stretch = Image.STRETCH_UNIFORM;\r\n iconImage.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n result.addControl(iconImage);\r\n\r\n // Store\r\n result._image = iconImage;\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with an image\r\n * @param name defines the name of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageOnlyButton(name: string, imageUrl: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding image\r\n var iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.stretch = Image.STRETCH_FILL;\r\n iconImage.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n result.addControl(iconImage);\r\n\r\n // Store\r\n result._image = iconImage;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with a text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @returns a new Button\r\n */\r\n public static CreateSimpleButton(name: string, text: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding text\r\n var textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n result.addControl(textBlock);\r\n\r\n // Store\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with an image and a centered text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageWithCenterTextButton(name: string, text: string, imageUrl: string): Button {\r\n var result = new this(name);\r\n\r\n // Adding image\r\n var iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.stretch = Image.STRETCH_FILL;\r\n result.addControl(iconImage);\r\n\r\n // Adding text\r\n var textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n result.addControl(textBlock);\r\n\r\n // Store\r\n result._image = iconImage;\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Button\", Button);"]}
@@ -1580,6 +1580,7 @@ var Control = /** @class */ (function () {
1580
1580
  }
1581
1581
  };
1582
1582
  Control.prototype._evaluateClippingState = function (parentMeasure) {
1583
+ this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);
1583
1584
  if (this.parent && this.parent.clipChildren) {
1584
1585
  parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);
1585
1586
  // Early clip
@@ -1 +1 @@
1
- {"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/2D/controls/control.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAY,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAmB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAMnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAExD;;;GAGG;AACH;IAwnCI,YAAY;IAEZ;;;OAGG;IACH;IACI,sCAAsC;IAC/B,IAAa;QAAb,SAAI,GAAJ,IAAI,CAAS;QA1nChB,WAAM,GAAG,CAAC,CAAC;QACX,cAAS,GAAG,KAAK,CAAC;QAClB,YAAO,GAAG,CAAC,CAAC;QAKpB,cAAc;QACP,oBAAe,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,cAAc;QACP,wBAAmB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,gBAAW,GAAG,OAAO,CAAC;QACtB,eAAU,GAAG,EAAE,CAAC;QAChB,gBAAW,GAAG,EAAE,CAAC;QACjB,cAAS,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAE7E,cAAc;QACP,WAAM,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC7E,cAAc;QACP,YAAO,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAGtE,WAAM,GAAG,EAAE,CAAC;QACZ,WAAM,GAAoB,IAAI,CAAC;QAEvC,cAAc;QACJ,yBAAoB,GAAG,OAAO,CAAC,2BAA2B,CAAC;QACrE,cAAc;QACJ,uBAAkB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QACjE,cAAc;QACJ,aAAQ,GAAG,IAAI,CAAC;QAC1B,cAAc;QACJ,cAAS,GAAG,KAAK,CAAC;QAC5B,cAAc;QACP,uBAAkB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5C,cAAc;QACP,kDAA6C,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACvE,cAAc;QACJ,yBAAoB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,4BAAuB,GAAG,KAAK,CAAC;QAChC,iBAAY,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,kBAAa,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,gBAAW,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,mBAAc,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,cAAc;QACP,UAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,cAAc;QACP,SAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1B,YAAO,GAAG,GAAG,CAAC;QACd,YAAO,GAAG,GAAG,CAAC;QACd,cAAS,GAAG,CAAC,CAAC;QACd,sBAAiB,GAAG,GAAG,CAAC;QACxB,sBAAiB,GAAG,GAAG,CAAC;QAChC,cAAc;QACP,qBAAgB,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC9C,cAAc;QACJ,2BAAsB,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvD,cAAc;QACJ,yBAAoB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACxC,mBAAc,GAAG,IAAI,CAAC;QAGtB,eAAU,GAAG,IAAI,CAAC;QAClB,mBAAc,GAAG,KAAK,CAAC;QACvB,oBAAe,GAAG,SAAS,CAAC;QAC1B,wBAAmB,GAAG,CAAC,CAAC;QAG1B,aAAQ,GAAG,KAAK,CAAC;QACjB,kBAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,eAAU,GAAG,CAAC,CAAC;QACf,gBAAW,GAAG,CAAC,CAAC,CAAC;QACjB,iBAAY,GAAG,KAAK,CAAC;QACrB,oBAAe,GAA8B,EAAE,CAAC;QAChD,sBAAiB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,4BAAuB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,eAAU,GAAG,IAAI,CAAC;QAClB,mBAAc,GAAG,SAAS,CAAC;QAC3B,uBAAkB,GAAG,SAAS,CAAC;QAC/B,gBAAW,GAAG,KAAK,CAAC;QAC9B,cAAc;QACJ,mBAAc,GAAG,KAAK,CAAC;QAEjC,cAAc;QACP,gBAAW,GAAQ,EAAE,CAAC;QAE7B,cAAc;QACP,eAAU,GAAG,KAAK,CAAC;QAE1B,cAAc;QACP,mBAAc,GAAG,KAAK,CAAC;QA6B9B;;WAEG;QAEI,aAAQ,GAAQ,IAAI,CAAC;QAE5B,sFAAsF;QAE/E,qBAAgB,GAAG,IAAI,CAAC;QAC/B,gFAAgF;QAEzE,qBAAgB,GAAG,KAAK,CAAC;QAChC,wEAAwE;QAEjE,qBAAgB,GAAG,KAAK,CAAC;QAEhC;;;WAGG;QAEI,iBAAY,GAAG,IAAI,CAAC;QAE3B;;;WAGG;QAEI,gBAAW,GAAG,IAAI,CAAC;QAE1B;;WAEG;QAEI,mBAAc,GAAG,KAAK,CAAC;QAItB,mBAAc,GAAG,CAAC,CAAC;QAgBnB,mBAAc,GAAG,CAAC,CAAC;QAgBnB,gBAAW,GAAG,CAAC,CAAC;QAChB,wBAAmB,GAAG,CAAC,CAAC;QAkBxB,iBAAY,GAAG,OAAO,CAAC;QAgB/B,iEAAiE;QAE1D,gBAAW,GAAG,EAAE,CAAC;QAExB,cAAc;QACJ,iBAAY,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,cAAc;QACJ,iBAAY,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAiB7C;;WAEG;QACI,sBAAiB,GAAG,IAAI,UAAU,EAAW,CAAC;QACrD;;WAEG;QACI,4BAAuB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE3D;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE1D;;WAEG;QACI,4BAAuB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEnE;;WAEG;QACI,0BAAqB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEjE;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEpE;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE5D;;WAEG;QACI,sBAAiB,GAAG,IAAI,UAAU,EAAW,CAAC;QAErD;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE1D;;WAEG;QACI,0BAAqB,GAAG,IAAI,UAAU,EAAW,CAAC;QAEzD;;WAEG;QACI,wBAAmB,GAAG,IAAI,UAAU,EAAW,CAAC;QAgNvD;;;;;WAKG;QAEI,eAAU,GAAG,CAAC,CAAC;QAEd,6BAAwB,GAAG,IAAI,CAAC;QAsxChC,iBAAY,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAhqB3C,CAAC;IAnhCL,sBAAW,+BAAU;QAJrB;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAED,UAAsB,KAAc;YAChC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC7B,CAAC;;;OAJA;IASD,sBAAW,uCAAkB;QAH7B;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAClC,CAAC;;;OAAA;IA2CD,sBAAW,kCAAa;QAFxB,yFAAyF;aAEzF;YACI,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;aAED,UAAyB,KAAa;YAClC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;gBAC/B,OAAO;aACV;YAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAcD,sBAAW,kCAAa;QAFxB,yFAAyF;aAEzF;YACI,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;aAED,UAAyB,KAAa;YAClC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;gBAC/B,OAAO;aACV;YAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAeD,sBAAW,+BAAU;QAFrB,qFAAqF;aAErF;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAED,UAAsB,KAAa;YAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC;YAE5C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OAXA;IAgBD,sBAAW,gCAAW;QAFtB,4FAA4F;aAE5F;YACI,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;aAED,UAAuB,KAAa;YAChC,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE;gBAC7B,OAAO;aACV;YAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAuBD,sBAAW,6BAAQ;QAHnB,aAAa;QAEb,iCAAiC;aACjC;YACI,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/B,CAAC;;;OAAA;IAED;;;OAGG;IACI,8BAAY,GAAnB;QACI,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IA2DD,sBAAW,yBAAI;QAHf;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;;;OAAA;IAID,sBAAW,+BAAU;QAFrB,iFAAiF;aAEjF;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAED,UAAsB,MAA2D;YAC7E,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC9B,CAAC;;;OAJA;IAQD,sBAAW,0BAAK;QAFhB,iGAAiG;aAEjG;YACI,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;aAED,UAAiB,KAAa;YAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;gBACvB,OAAO;aACV;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAcD,sBAAW,uCAAkB;QAH7B;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;aAED,UAA8B,KAAa;YACvC,IAAI,IAAI,CAAC,mBAAmB,KAAK,KAAK,EAAE;gBACpC,OAAO;aACV;YAED,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAcD,sBAAW,kCAAa;QAHxB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;aAED,UAAyB,KAAc;YACnC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;gBAC/B,OAAO;aACV;YAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAcD,sBAAW,mCAAc;QAHzB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,eAAe,CAAC;QAChC,CAAC;aAED,UAA0B,KAAa;YACnC,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE;gBAChC,OAAO;aACV;YAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAeD,sBAAW,2BAAM;QAJjB;;WAEG;aAEH;YACI,OAAO,IAAI,CAAC,OAAO,CAAC;QACxB,CAAC;aAED,UAAkB,KAAa;YAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE;gBACxB,OAAO;aACV;YAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;;;OAVA;IAgBD,sBAAW,2BAAM;QAJjB;;WAEG;aAEH;YACI,OAAO,IAAI,CAAC,OAAO,CAAC;QACxB,CAAC;aAED,UAAkB,KAAa;YAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE;gBACxB,OAAO;aACV;YAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;;;OAVA;IAgBD,sBAAW,6BAAQ;QAJnB;;WAEG;aAEH;YACI,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;aAED,UAAoB,KAAa;YAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;gBAC1B,OAAO;aACV;YAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;;;OAVA;IAgBD,sBAAW,qCAAgB;QAJ3B;;WAEG;aAEH;YACI,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAClC,CAAC;aAED,UAA4B,KAAa;YACrC,IAAI,IAAI,CAAC,iBAAiB,KAAK,KAAK,EAAE;gBAClC,OAAO;aACV;YAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;;;OAVA;IAgBD,sBAAW,qCAAgB;QAJ3B;;WAEG;aAEH;YACI,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAClC,CAAC;aAED,UAA4B,KAAa;YACrC,IAAI,IAAI,CAAC,iBAAiB,KAAK,KAAK,EAAE;gBAClC,OAAO;aACV;YAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;;;OAVA;IAiBD,sBAAW,wCAAmB;QAL9B;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,oBAAoB,CAAC;QACrC,CAAC;aAED,UAA+B,KAAa;YACxC,IAAI,IAAI,CAAC,oBAAoB,KAAK,KAAK,EAAE;gBACrC,OAAO;aACV;YAED,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAgBD,sBAAW,sCAAiB;QAL5B;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACnC,CAAC;aAED,UAA6B,KAAa;YACtC,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE;gBACnC,OAAO;aACV;YAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IA2BD,sBAAW,0BAAK;QALhB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;aAED,UAAiB,KAAsB;YACnC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;YAErC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;gBAC5C,OAAO;aACV;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OAZA;IAkBD,sBAAW,kCAAa;QAJxB;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACpF,CAAC;aAED,UAAyB,KAAa;YAClC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;YACrC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;QAC9B,CAAC;;;OARA;IAeD,sBAAW,2BAAM;QALjB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;aAED,UAAkB,KAAsB;YACpC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;YAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;gBAC7C,OAAO;aACV;YAED,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAChC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OAZA;IAkBD,sBAAW,mCAAc;QAJzB;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtF,CAAC;aAED,UAA0B,KAAa;YACnC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;QAC/B,CAAC;;;OARA;IAWD,sBAAW,+BAAU;QADrB,8BAA8B;aAC9B;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAED,UAAsB,KAAa;YAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;;;OATA;IAYD,sBAAW,8BAAS;QADpB,8BAA8B;aAC9B;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;aAED,UAAqB,KAAa;YAC9B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;gBAC3B,OAAO;aACV;YAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;;;OATA;IAYD,sBAAW,+BAAU;QADrB,+BAA+B;aAC/B;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAED,UAAsB,KAAa;YAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;;;OATA;IAgBD,sBAAW,0BAAK;QALhB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;aAED,UAAiB,KAAsB;YAAvC,iBAiBC;YAhBG,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;aAC9B;YAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC;oBACtD,KAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,KAAI,CAAC,eAAe,EAAE,CAAC;gBAC3B,CAAC,CAAC,CAAC;aACN;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;;;OAnBA;IAsBD,sBAAW,4CAAuB;QADlC,cAAc;aACd;YACI,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;QACvC,CAAC;;;OAAA;IAGD,sBAAW,qCAAgB;QAD3B,uCAAuC;aACvC;YACI,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YAEzE,IAAI,aAAa,CAAC,OAAO,EAAE;gBACvB,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC7C;YAED,OAAO,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzH,CAAC;aAED,UAA4B,KAAa;YACrC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;QACjC,CAAC;;;OAPA;IAUD,sBAAW,6BAAQ;QADnB,6BAA6B;aAC7B;YACI,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;aAED,UAAoB,KAAsB;YACtC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;gBAC/C,OAAO;aACV;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAClC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;QACL,CAAC;;;OAXA;IAeD,sBAAW,0BAAK;QAFhB,oCAAoC;aAEpC;YACI,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;aAED,UAAiB,KAAa;YAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;gBACvB,OAAO;aACV;YAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAaD,sBAAW,2BAAM;QAFjB,2EAA2E;aAE3E;YACI,OAAO,IAAI,CAAC,OAAO,CAAC;QACxB,CAAC;aAED,UAAkB,KAAa;YAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;gBACvB,OAAO;aACV;YAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAErB,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;aACrC;QACL,CAAC;;;OAZA;IAgBD,sBAAW,kCAAa;QAFxB,uEAAuE;aAEvE;YACI,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;aAED,UAAyB,KAAc;YACnC,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE;gBAC7B,OAAO;aACV;YAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAaD,sBAAW,8BAAS;QAFpB,kEAAkE;aAElE;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;aAED,UAAqB,KAAc;YAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;gBAC3B,OAAO;aACV;YAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;;;OATA;IAYD,sBAAW,4BAAO;QADlB,+EAA+E;aAC/E;YACI,OAAO,IAAI,CAAC,QAAQ,CAAC;QACzB,CAAC;;;OAAA;IAKD,sBAAW,+BAAU;QAHrB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;;;OAAA;IAOD,sBAAW,2CAAsB;QALjC;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,uBAAuB,CAAC;QACxC,CAAC;aAED,UAAkC,KAAc;YAC5C,IAAI,IAAI,CAAC,uBAAuB,KAAK,KAAK,EAAE;gBACxC,OAAO;aACV;YAED,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAgBD,sBAAW,gCAAW;QALtB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;aAED,UAAuB,KAAsB;YACzC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACrC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,wCAAmB;QAJ9B;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC1F,CAAC;aAED,UAA+B,KAAa;YACxC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;QACpC,CAAC;;;OAPA;IAUD,sBAAW,yCAAoB;QAD/B,cAAc;aACd;YACI,IAAI,IAAI,CAAC,uBAAuB,EAAE;gBAC9B,OAAO,CAAC,CAAC;aACZ;YAED,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;;;OAAA;IAOD,sBAAW,iCAAY;QALvB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC;aAED,UAAwB,KAAsB;YAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACtC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,yCAAoB;QAJ/B;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3F,CAAC;aAED,UAAgC,KAAa;YACzC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,IAAI,CAAC;QACrC,CAAC;;;OAPA;IAUD,sBAAW,0CAAqB;QADhC,cAAc;aACd;YACI,IAAI,IAAI,CAAC,uBAAuB,EAAE;gBAC9B,OAAO,CAAC,CAAC;aACZ;YAED,OAAO,IAAI,CAAC,oBAAoB,CAAC;QACrC,CAAC;;;OAAA;IAOD,sBAAW,+BAAU;QALrB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;aAED,UAAsB,KAAsB;YACxC,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACpC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,uCAAkB;QAJ7B;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC1F,CAAC;aAED,UAA8B,KAAa;YACvC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;QACnC,CAAC;;;OAPA;IAUD,sBAAW,wCAAmB;QAD9B,cAAc;aACd;YACI,IAAI,IAAI,CAAC,uBAAuB,EAAE;gBAC9B,OAAO,CAAC,CAAC;aACZ;YAED,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACnC,CAAC;;;OAAA;IAOD,sBAAW,kCAAa;QALxB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;aAED,UAAyB,KAAsB;YAC3C,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACvC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,0CAAqB;QAJhC;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7F,CAAC;aAED,UAAiC,KAAa;YAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,aAAa,GAAG,KAAK,GAAG,IAAI,CAAC;QACtC,CAAC;;;OAPA;IAUD,sBAAW,2CAAsB;QADjC,cAAc;aACd;YACI,IAAI,IAAI,CAAC,uBAAuB,EAAE;gBAC9B,OAAO,CAAC,CAAC;aACZ;YAED,OAAO,IAAI,CAAC,qBAAqB,CAAC;QACtC,CAAC;;;OAAA;IAOD,sBAAW,yBAAI;QALf;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;aAED,UAAgB,KAAsB;YAClC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,iCAAY;QAJvB;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACnF,CAAC;aAED,UAAwB,KAAa;YACjC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;QAC7B,CAAC;;;OAPA;IAcD,sBAAW,wBAAG;QALd;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAED,UAAe,KAAsB;YACjC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,gCAAW;QAJtB;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnF,CAAC;aAED,UAAuB,KAAa;YAChC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;QAC5B,CAAC;;;OAPA;IAcD,sBAAW,gCAAW;QALtB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;aAED,UAAuB,KAAsB;YACzC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACrC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,wCAAmB;QAJ9B;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC1F,CAAC;aAED,UAA+B,KAAa;YACxC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;QACpC,CAAC;;;OAPA;IAcD,sBAAW,gCAAW;QALtB;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;aAED,UAAuB,KAAsB;YACzC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACrC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;QACL,CAAC;;;OANA;IAYD,sBAAW,wCAAmB;QAJ9B;;;WAGG;aACH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC3F,CAAC;aAED,UAA+B,KAAa;YACxC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACd,OAAO;aACV;YACD,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;QACpC,CAAC;;;OAPA;IAUD,sBAAW,4BAAO;QADlB,2CAA2C;aAC3C;YACI,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;QACtE,CAAC;;;OAAA;IAGD,sBAAW,4BAAO;QADlB,2CAA2C;aAC3C;YACI,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QACtE,CAAC;;;OAAA;IAID,sBAAW,8BAAS;QAFpB,yCAAyC;aAEzC;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;aAED,UAAqB,KAAc;YAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;gBAC3B,OAAO;aACV;YAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAYD,sBAAW,kCAAa;QAFxB,gEAAgE;aAEhE;YACI,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;aAED,UAAyB,KAAa;YAClC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;gBAC/B,OAAO;aACV;YAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAYD,sBAAW,sCAAiB;QAF5B,2DAA2D;aAE3D;YACI,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACnC,CAAC;aAED,UAA6B,KAAa;YACtC,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE;gBACnC,OAAO;aACV;YAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;;;OATA;IAoCD,cAAc;IACJ,8BAAY,GAAtB;QACI,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACI,qCAAmB,GAA1B,UAA2B,SAAiB;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,SAAS,EAAE;YAC1C,OAAO,IAAI,CAAC,MAAM,CAAC;SACtB;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,cAAc;IACP,iCAAe,GAAtB;QACI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,6BAAW,GAAlB,UAAmB,SAAkB;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE;YAC3B,OAAO,IAAI,CAAC;SACf;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,qCAAmB,GAA1B,UAA2B,iBAA0B;QACjD,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAEzD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,0CAAwB,GAA/B,UAAgC,iBAA0B,EAAE,MAAe;QACvE,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3D,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,2CAAyB,GAAhC,UAAiC,iBAA0B;QACvD,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5B,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAChE,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAE/D,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,+BAAa,GAApB,UAAqB,QAAiB,EAAE,KAAY;QAChD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC1D,KAAK,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;YACtF,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QAC7D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAExD,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACrD,IAAI,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,kBAAkB,EAAE,EAAE,cAAc,CAAC,CAAC;QAEjH,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;QAEjD,IAAI,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE;YACpD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,OAAO;SACV;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACI,qCAAmB,GAA1B,UAA2B,OAAkB,EAAE,qBAAsC,EAAE,SAAyC;QAAjF,sCAAA,EAAA,6BAAsC;QACjF,wBAAwB;IAC5B,CAAC;IAED;;;;;OAKG;IACI,gCAAc,GAArB,UAAsB,qBAA+B,EAAE,SAAyC;QAC5F,IAAI,OAAO,GAAG,IAAI,KAAK,EAAW,CAAC;QAEnC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;QAEpE,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,8BAAY,GAAnB,UAAoB,IAA6B;QAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE;YAC3E,IAAI,IAAI,EAAE;gBACN,KAAK,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;aACtF;YACD,OAAO;SACV;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YACd,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE;gBACP,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC/C;YACD,OAAO;SACV;aAAM,IAAI,CAAC,IAAI,EAAE;YACd,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QAC7D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;OAOG;IACI,4BAAU,GAAjB,UAAkB,UAA2B,EAAE,YAA8B,EAAE,aAA+B,EAAE,WAA6B;QACzI,IAAM,GAAG,GAAG,UAAU,CAAC;QACvB,IAAM,KAAK,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,GAAG,CAAC;QAClC,IAAM,MAAM,GAAG,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,GAAG,CAAC;QACpC,IAAM,IAAI,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,KAAK,CAAC;QAElC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;;;;;;OAOG;IACI,oCAAkB,GAAzB,UAA0B,UAAkB,EAAE,YAAqB,EAAE,aAAsB,EAAE,WAAoB;QAC7G,IAAM,GAAG,GAAG,UAAU,CAAC;QACvB,IAAM,KAAK,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,GAAG,CAAC;QAClC,IAAM,MAAM,GAAG,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,GAAG,CAAC;QACpC,IAAM,IAAI,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,KAAK,CAAC;QAElC,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;QACpC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,cAAc;IACP,0CAAwB,GAA/B,UAAgC,iBAA0B;;QACtD,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YACvE,IAAI,aAAa,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,eAAe,CAAC;YACjD,IAAI,aAAa,EAAE;gBACf,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;aACjE;SACJ;QAED,IAAI,OAAO,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5G,IAAI,MAAM,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAE5G,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YACrE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,EAAE;gBACnC,OAAO,GAAG,OAAO,CAAC;aACrB;YAED,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE;gBACjC,MAAM,GAAG,MAAM,CAAC;aACnB;SACJ;QAED,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;QAEzB,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,cAAc;IACP,6BAAW,GAAlB,UAAmB,MAAc;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,MAAM,CAAC;IACxC,CAAC;IAED,cAAc;IACP,4BAAU,GAAjB,UAAkB,MAAc;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,MAAM,CAAC;IACvC,CAAC;IAED,cAAc;IACP,oCAAkB,GAAzB;QACI,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,6BAA6B,EAAE,CAAC;IACzC,CAAC;IAED,cAAc;IACP,+CAA6B,GAApC;QACI,WAAW;IACf,CAAC;IAED,cAAc;IACP,iCAAe,GAAtB,UAAuB,IAAa;QAChC,2GAA2G;QAC3G,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;YAClD,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;YACjD,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;YAC/D,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YAC9D,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;IACJ,4CAA0B,GAApC;QACI,OAAO,CAAC,CAAC;IACb,CAAC;IAED,cAAc;IACJ,4CAA0B,GAApC;QACI,OAAO,CAAC,CAAC;IACb,CAAC;IAED,cAAc;IACJ,gCAAc,GAAxB;QACI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACtD,qEAAqE;YACrE,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9E,wGAAwG;YACxG,+EAA+E;YAC/E,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,6CAA6C,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAE/G,+BAA+B;YAC/B,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACvC,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACvC,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAErE,IAAI,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChF,IAAI,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,IAAI,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAElF,IAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAClD,IAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAElD,IAAI,CAAC,IAAI,CAAC,cAAc,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,gBAAgB,GAAG,OAAO,CAAC,EAC/D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,eAAe,GAAG,OAAO,CAAC,EAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,iBAAiB,GAAG,OAAO,CAAC,EACzF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,kBAAkB,GAAG,OAAO,CAAC,CAC7F,CAAC;SACL;IACL,CAAC;IAED,cAAc;IACP,8BAAY,GAAnB,UAAoB,KAAa;QAAb,sBAAA,EAAA,aAAa;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE;YAC5B,OAAO;SACV;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,6BAA6B;QAC7B,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SAC5B;IACL,CAAC;IAED,cAAc;IACP,iCAAe,GAAtB;QACI,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED,cAAc;IACP,uBAAK,GAAZ,UAAa,IAA4B;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAG,CAAC,WAAW,EAAE,CAAC;SACxD;IACL,CAAC;IAED,cAAc;IACJ,4BAAU,GAApB,UAAqB,OAAiC;QAClD,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE;YAC1F,OAAO;SACV;QAED,gBAAgB;QAChB,IAAI,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC9F,IAAI,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC9F,IAAI,OAAO,EAAE;YACT,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEpC,SAAS;YACT,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE/B,QAAQ;YACR,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1C,eAAe;YACf,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;SACzC;QACD,2BAA2B;QAC3B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,EAAE;YAC3F,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,6BAA6B,EAAE,CAAC;YAErC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEhK,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;SAClE;IACL,CAAC;IAED,cAAc;IACP,kCAAgB,GAAvB,UAAwB,OAAgC;QACpD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,OAAO;SACV;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC;QAC3C,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAE7C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAED,cAAc;IACP,0CAAwB,GAA/B,UAAgC,OAAgC;QAC5D,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACrI,CAAC;IAED,cAAc;IACJ,8BAAY,GAAtB,UAAuB,OAAgC;QACnD,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACxB;QAED,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACxB;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;SACzB;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;SAC7B;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;SACnC;QAED,IAAI,OAAO,CAAC,qBAAqB,EAAE;YAC/B,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;SACtC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE;YACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;SACjI;IACL,CAAC;IAED,cAAc;IACP,yBAAO,GAAd,UAAe,aAAsB,EAAE,OAAgC;QACnE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE;YAC1D,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YACvE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAE5B,IAAI,CAAC,eAAe,CAAC,oBAAoB,CACrC,IAAI,CAAC,gBAAgB,EACrB,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,EAC9B,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,EAC7B,IAAI,CAAC,qBAAqB,GAAG,CAAC,EAC9B,IAAI,CAAC,sBAAsB,GAAG,CAAC,EAC/B,IAAI,CAAC,6CAA6C,CACrD,CAAC;YAEF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAE3B,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,GAAG;gBACC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBAC9C,YAAY,EAAE,CAAC;aAClB,QAAQ,IAAI,CAAC,cAAc,IAAI,YAAY,GAAG,CAAC,EAAE;YAElD,IAAI,YAAY,IAAI,CAAC,EAAE;gBACnB,MAAM,CAAC,KAAK,CAAC,gDAA8C,IAAI,CAAC,IAAI,mBAAc,IAAI,CAAC,QAAQ,MAAG,CAAC,CAAC;aACvG;YAED,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;SAC9C;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;IACJ,kCAAgB,GAA1B,UAA2B,aAAsB,EAAE,OAAgC;QAC/E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAEjD,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;YACnD,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACjE,IAAI,CAAC,mBAAmB,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC/D,IAAI,CAAC,mBAAmB,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YACrG,IAAI,CAAC,mBAAmB,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;SACzG;QAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAExD,iDAAiD;QACjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAE1D,wBAAwB;QACxB,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAE9D,iCAAiC;QACjC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAE9D,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE;YACvC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAChD;IACL,CAAC;IAES,wCAAsB,GAAhC,UAAiC,aAAsB;QACnD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YACzC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACzF,aAAa;YACb,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE;gBACtG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;gBAChG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE;gBACrG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE;gBAC/F,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;SACJ;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,cAAc;IACP,0BAAQ,GAAf;QACI,iBAAiB;QACjB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACrB,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACjE;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAClE;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnE;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACpE;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YACvB,IAAI,IAAI,CAAC,wBAAwB,EAAE;gBAC/B,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;aAC9E;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;aAC9E;SACJ;IACL,CAAC;IAED,cAAc;IACJ,mCAAiB,GAA3B,UAA4B,aAAsB,EAAE,OAAgC;QAChF,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QACvC,IAAI,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAEzC,IAAI,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC;QACtC,IAAI,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC;QAExC,aAAa;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;YAC9B,KAAK,OAAO,CAAC,yBAAyB;gBAClC,CAAC,GAAG,CAAC,CAAC;gBACN,MAAM;YACV,KAAK,OAAO,CAAC,0BAA0B;gBACnC,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC;gBACxB,MAAM;YACV,KAAK,OAAO,CAAC,2BAA2B;gBACpC,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,MAAM;SACb;QAED,QAAQ,IAAI,CAAC,iBAAiB,EAAE;YAC5B,KAAK,OAAO,CAAC,sBAAsB;gBAC/B,CAAC,GAAG,CAAC,CAAC;gBACN,MAAM;YACV,KAAK,OAAO,CAAC,yBAAyB;gBAClC,CAAC,GAAG,YAAY,GAAG,MAAM,CAAC;gBAC1B,MAAM;YACV,KAAK,OAAO,CAAC,yBAAyB;gBAClC,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM;SACb;QAED,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC9B,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;gBAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACxE;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClF,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACtF;YAED,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACzE;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACvF;YAED,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;gBAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClE,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACxE;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjF,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACvF;YAED,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;gBAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC3E;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1F;SACJ;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;YACpB,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAChE;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9E;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACnB,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9D;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7E;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,cAAc;IACJ,6BAAW,GAArB,UAAsB,aAAsB,EAAE,OAAgC;QAC1E,aAAa;IACjB,CAAC;IAED,cAAc;IACJ,uCAAqB,GAA/B,UAAgC,aAAsB,EAAE,OAAgC;QACpF,aAAa;IACjB,CAAC;IAED,cAAc;IACJ,kCAAgB,GAA1B,UAA2B,OAAgC;QACvD,aAAa;IACjB,CAAC;IAIO,uBAAK,GAAb,UAAc,OAAgC,EAAE,oBAAwC;QACpF,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,oBAAoB,EAAE;YACtB,uDAAuD;YACvD,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAEpF,4EAA4E;YAC5E,IAAI,YAAY,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAChF,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC7E,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC;YAC5J,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC;YAC5J,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;SAC/C;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;YAC7D,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACvC,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACvC,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAEjC,IAAI,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChF,IAAI,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,IAAI,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAElF,OAAO,CAAC,IAAI,CACR,OAAO,CAAC,YAAY,CAAC,IAAI,GAAG,gBAAgB,EAC5C,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,eAAe,EAC1C,OAAO,CAAC,YAAY,CAAC,KAAK,GAAG,iBAAiB,GAAG,gBAAgB,EACjE,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,kBAAkB,GAAG,eAAe,CACrE,CAAC;SACL;aAAM;YACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;SAC9H;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,cAAc;IACP,yBAAO,GAAd,UAAe,OAAgC,EAAE,oBAAwC;QACrF,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,EAAE;YAC1D,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5B,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE3B,YAAY;QACZ,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzB,OAAO;QACP,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;SAC7C;QAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,EAAE;YAC5C,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACrD;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;YAC3D,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;SAC9F;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;SAC7C;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE;YACvC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SACxJ;QAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,EAAE;YAC3C,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACpD;QAED,OAAO,CAAC,OAAO,EAAE,CAAC;QAElB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;IACP,uBAAK,GAAZ,UAAa,OAAgC,EAAE,oBAAwC;QACnF,aAAa;IACjB,CAAC;IAED;;;;;OAKG;IACI,0BAAQ,GAAf,UAAgB,CAAS,EAAE,CAAS;QAChC,mBAAmB;QACnB,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAElF,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAChC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEhC,QAAQ;QACR,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;YAC/B,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;YAC5D,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE;YAC9B,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YAC5D,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;SACzC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;IACP,iCAAe,GAAtB,UAAuB,CAAS,EAAE,CAAS,EAAE,EAAmB,EAAE,IAAY,EAAE,SAAiB,EAAE,WAAmB,EAAE,MAAe,EAAE,MAAe;QACpJ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE;YAChE,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACtB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEjF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;IACP,gCAAc,GAArB,UAAsB,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,EAAmB;QAC/F,IAAI,SAAS,GAAY,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAEzG,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;SAClE;IACL,CAAC;IAED,cAAc;IACP,iCAAe,GAAtB,UAAuB,MAAe,EAAE,EAAmB;QACvD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACtB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE;YACzB,uEAAuE;YACvE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SACxB;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,SAAS,GAAY,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnG,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC3C;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;IACP,+BAAa,GAApB,UAAqB,MAAe,EAAE,EAA6B,EAAE,KAAa;QAAb,sBAAA,EAAA,aAAa;QAC9E,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,MAAM,KAAK,IAAI,CAAC,EAAE;YACjD,OAAO;SACV;QACD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAErB,IAAI,SAAS,GAAY,IAAI,CAAC;QAE9B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YAC3B,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SACvF;QAED,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SAChD;IACL,CAAC;IAED,cAAc;IACP,gCAAc,GAArB,UAAsB,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,WAAmB,EAAE,EAAmB;QACpH,8CAA8C;QAC9C,mDAAmD;QACnD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YACvB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAEvC,IAAI,SAAS,GAAY,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAE3I,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;SAC/E;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;IACP,8BAAY,GAAnB,UAAoB,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,WAAmB,EAAE,WAAoB,EAAE,EAAoB;QACzI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;SACV;QACD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,cAAc,GAAY,WAAW,CAAC;QAC1C,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE;YAClE,cAAc,GAAG,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SACvI;QACD,IAAI,SAAS,GAAY,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAEzI,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;SAC7F;IACL,CAAC;IAED,cAAc;IACP,iCAAe,GAAtB,UAAuB,SAAkC;QAAlC,0BAAA,EAAA,gBAAkC;QACrD,IAAI,SAAS,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SAC/D;aAAM;YACH,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,eAAe,EAAE;gBAClC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAa,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;aACpE;SACJ;IACL,CAAC;IAED,cAAc;IACP,gCAAc,GAArB,UAAsB,MAAe,EAAE,MAAe;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;SACV;QACD,IAAI,SAAS,GAAY,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAE7F,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC9C;IACL,CAAC;IAED,cAAc;IACP,+BAAa,GAApB,cAA+B,CAAC;IAEhC,cAAc;IACP,qCAAmB,GAA1B,UAA2B,IAAY,EAAE,CAAS,EAAE,CAAS,EAAE,EAAmB,EAAE,SAAiB,EAAE,WAAmB,EAAE,MAAe,EAAE,MAAe;QACxJ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,iBAAiB,CAAC,WAAW,EAAE;YACxC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAE7D,IAAI,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,mBAAmB,IAAI,mBAAmB,KAAK,IAAI,EAAE;gBACrD,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aAC/C;YAED,IAAI,mBAAmB,KAAK,IAAI,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aAClC;YAED,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YAC9C,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,KAAK,iBAAiB,CAAC,WAAW,EAAE;YACxC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACrC,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,KAAK,iBAAiB,CAAC,SAAS,EAAE;YACtC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE;gBACxC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;aACnH;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,KAAK,iBAAiB,CAAC,YAAY,EAAE;YACzC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE;gBACxC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACtE,OAAO,IAAI,CAAC;aACf;SACJ;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,8BAAY,GAApB;QACI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;SACpI;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;SAClH;QAED,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtD,+BAA+B;QAC/B,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,eAAe,EAAE,EAAvB,CAAuB,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,2BAAS,GAAhB,UAAiB,mBAAwB;QACrC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACzD,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpD,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;YAClD,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7C,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACjD,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;SAClD;IACL,CAAC;IAED,cAAc;IACP,mCAAiB,GAAxB,UAAyB,gBAAqB,EAAE,IAA4B;QACxE,IAAI,gBAAgB,CAAC,UAAU,EAAE;YAC7B,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;SACjD;QAED,IAAI,gBAAgB,CAAC,QAAQ,EAAE;YAC3B,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;SAC7C;QAED,IAAI,gBAAgB,CAAC,UAAU,EAAE;YAC7B,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;SACjD;QAED,IAAI,gBAAgB,CAAC,SAAS,EAAE;YAC5B,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC;SAC/C;IACL,CAAC;IAED,oCAAoC;IAC7B,yBAAO,GAAd;QACI,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC9B;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACtB;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACZ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aAC3B;SACJ;QAED,WAAW;QACX,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAYD,sBAAkB,oCAAyB;QAD3C,gCAAgC;aAChC;YACI,OAAO,OAAO,CAAC,0BAA0B,CAAC;QAC9C,CAAC;;;OAAA;IAGD,sBAAkB,qCAA0B;QAD5C,iCAAiC;aACjC;YACI,OAAO,OAAO,CAAC,2BAA2B,CAAC;QAC/C,CAAC;;;OAAA;IAGD,sBAAkB,sCAA2B;QAD7C,kCAAkC;aAClC;YACI,OAAO,OAAO,CAAC,4BAA4B,CAAC;QAChD,CAAC;;;OAAA;IAGD,sBAAkB,iCAAsB;QADxC,6BAA6B;aAC7B;YACI,OAAO,OAAO,CAAC,uBAAuB,CAAC;QAC3C,CAAC;;;OAAA;IAGD,sBAAkB,oCAAyB;QAD3C,gCAAgC;aAChC;YACI,OAAO,OAAO,CAAC,0BAA0B,CAAC;QAC9C,CAAC;;;OAAA;IAGD,sBAAkB,oCAAyB;QAD3C,gCAAgC;aAChC;YACI,OAAO,OAAO,CAAC,0BAA0B,CAAC;QAC9C,CAAC;;;OAAA;IAID,cAAc;IACA,sBAAc,GAA5B,UAA6B,IAAY;QACrC,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE;YAChC,OAAO,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;SACzC;QAED,IAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;SACjE;QAED,IAAI,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAExC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACW,aAAK,GAAnB,UAAoB,gBAAqB,EAAE,IAA4B;QACnE,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjF,IAAI,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,cAAM,OAAA,IAAI,WAAW,EAAE,EAAjB,CAAiB,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAEzF,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAErC,OAAO,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAElD,OAAO,OAAO,CAAC;IACnB,CAAC;IAcD,cAAc;IACG,mBAAW,GAA5B,UAA6B,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAc,EAAE,OAAgC;QAC9G,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE7B,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,SAAS,EAAE,CAAC;QAEpB,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAlxED;;OAEG;IACW,6BAAqB,GAAG,KAAK,CAAC;IA4xD7B,oBAAY,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAiZtD,UAAU;IACK,kCAA0B,GAAG,CAAC,CAAC;IAC/B,mCAA2B,GAAG,CAAC,CAAC;IAChC,oCAA4B,GAAG,CAAC,CAAC;IAEjC,+BAAuB,GAAG,CAAC,CAAC;IAC5B,kCAA0B,GAAG,CAAC,CAAC;IAC/B,kCAA0B,GAAG,CAAC,CAAC;IAgC/B,wBAAgB,GAA2E,EAAE,CAAC;IAoC7G;;;;;;;;;OASG;IACW,iBAAS,GAA8H,cAAQ,CAAC,CAAC;IAroE/J;QADC,SAAS,EAAE;6CACgB;IAI5B;QADC,SAAS,EAAE;qDACmB;IAG/B;QADC,SAAS,EAAE;qDACoB;IAGhC;QADC,SAAS,EAAE;qDACoB;IAOhC;QADC,SAAS,EAAE;iDACe;IAO3B;QADC,SAAS,EAAE;gDACc;IAM1B;QADC,SAAS,EAAE;mDACkB;IAO9B;QADC,SAAS,EAAE;gDAGX;IAcD;QADC,SAAS,EAAE;gDAGX;IAeD;QADC,SAAS,EAAE;6CAGX;IAgBD;QADC,SAAS,EAAE;8CAGX;IAaD;QADC,SAAS,EAAE;gDACY;IAqFxB;QADC,SAAS,EAAE;6CAGX;IAQD;QADC,SAAS,EAAE;wCAGX;IA+DD;QADC,SAAS,EAAE;yCAGX;IAgBD;QADC,SAAS,EAAE;yCAGX;IAgBD;QADC,SAAS,EAAE;2CAGX;IAgBD;QADC,SAAS,EAAE;mDAGX;IAgBD;QADC,SAAS,EAAE;mDAGX;IAiBD;QADC,SAAS,EAAE;sDAGX;IAgBD;QADC,SAAS,EAAE;oDAGX;IAkBD;QADC,SAAS,EAAE;+CACU;IAStB;QADC,SAAS,EAAE;wCAGX;IAmCD;QADC,SAAS,EAAE;yCAGX;IA6ED;QADC,SAAS,EAAE;wCAGX;IA8DD;QADC,SAAS,EAAE;wCAGX;IAaD;QADC,SAAS,EAAE;yCAGX;IAgBD;QADC,SAAS,EAAE;gDAGX;IAaD;QADC,SAAS,EAAE;4CAGX;IA4BD;QADC,SAAS,EAAE;yDAGX;IAgBD;QADC,SAAS,EAAE;8CAGX;IAqCD;QADC,SAAS,EAAE;+CAGX;IAqCD;QADC,SAAS,EAAE;6CAGX;IAqCD;QADC,SAAS,EAAE;gDAGX;IAqCD;QADC,SAAS,EAAE;uCAGX;IA4BD;QADC,SAAS,EAAE;sCAGX;IA4BD;QADC,SAAS,EAAE;8CAGX;IA4BD;QADC,SAAS,EAAE;8CAGX;IAmCD;QADC,SAAS,EAAE;4CAGX;IAYD;QADC,SAAS,EAAE;gDAGX;IAYD;QADC,SAAS,EAAE;oDAGX;IAkBD;QADC,SAAS,EAAE;iDACiB;IAK7B;QADC,SAAS,EAAE;2DAC2B;IA8pC3C,cAAC;CAAA,AApxED,IAoxEC;SApxEY,OAAO;AAqxEpB,aAAa,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC","sourcesContent":["import { Nullable } from \"@babylonjs/core/types\";\nimport { Observable, Observer } from \"@babylonjs/core/Misc/observable\";\nimport { Vector2, Vector3, Matrix } from \"@babylonjs/core/Maths/math.vector\";\nimport { PointerEventTypes, PointerInfoBase } from \"@babylonjs/core/Events/pointerEvents\";\nimport { Logger } from \"@babylonjs/core/Misc/logger\";\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\nimport { Scene } from \"@babylonjs/core/scene\";\n\nimport { Container } from \"./container\";\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\nimport { ValueAndUnit } from \"../valueAndUnit\";\nimport { Measure } from \"../measure\";\nimport { Style } from \"../style\";\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\nimport { RegisterClass } from \"@babylonjs/core/Misc/typeStore\";\nimport { SerializationHelper, serialize } from \"@babylonjs/core/Misc/decorators\";\nimport { ICanvasRenderingContext } from \"@babylonjs/core/Engines/ICanvas\";\nimport { Engine } from \"@babylonjs/core/Engines/engine\";\n\n/**\n * Root class used for all 2D controls\n * @see https://doc.babylonjs.com/how_to/gui#controls\n */\nexport class Control {\n /**\n * Gets or sets a boolean indicating if alpha must be an inherited value (false by default)\n */\n public static AllowAlphaInheritance = false;\n\n private _alpha = 1;\n private _alphaSet = false;\n private _zIndex = 0;\n /** @hidden */\n public _host: AdvancedDynamicTexture;\n /** Gets or sets the control parent */\n public parent: Nullable<Container>;\n /** @hidden */\n public _currentMeasure = Measure.Empty();\n /** @hidden */\n public _tempPaddingMeasure = Measure.Empty();\n private _fontFamily = \"Arial\";\n private _fontStyle = \"\";\n private _fontWeight = \"\";\n private _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\n private _font: string;\n /** @hidden */\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\n /** @hidden */\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\n /** @hidden */\n protected _fontOffset: { ascent: number; height: number; descent: number };\n private _color = \"\";\n private _style: Nullable<Style> = null;\n private _styleObserver: Nullable<Observer<Style>>;\n /** @hidden */\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\n /** @hidden */\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\n /** @hidden */\n protected _isDirty = true;\n /** @hidden */\n protected _wasDirty = false;\n /** @hidden */\n public _tempParentMeasure = Measure.Empty();\n /** @hidden */\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\n /** @hidden */\n protected _cachedParentMeasure = Measure.Empty();\n private _descendantsOnlyPadding = false;\n private _paddingLeft = new ValueAndUnit(0);\n private _paddingRight = new ValueAndUnit(0);\n private _paddingTop = new ValueAndUnit(0);\n private _paddingBottom = new ValueAndUnit(0);\n /** @hidden */\n public _left = new ValueAndUnit(0);\n /** @hidden */\n public _top = new ValueAndUnit(0);\n private _scaleX = 1.0;\n private _scaleY = 1.0;\n private _rotation = 0;\n private _transformCenterX = 0.5;\n private _transformCenterY = 0.5;\n /** @hidden */\n public _transformMatrix = Matrix2D.Identity();\n /** @hidden */\n protected _invertTransformMatrix = Matrix2D.Identity();\n /** @hidden */\n protected _transformedPosition = Vector2.Zero();\n private _isMatrixDirty = true;\n private _cachedOffsetX: number;\n private _cachedOffsetY: number;\n private _isVisible = true;\n private _isHighlighted = false;\n private _highlightColor = \"#4affff\";\n protected _highlightLineWidth = 2;\n /** @hidden */\n public _linkedMesh: Nullable<TransformNode>;\n private _fontSet = false;\n private _dummyVector2 = Vector2.Zero();\n private _downCount = 0;\n private _enterCount = -1;\n private _doNotRender = false;\n private _downPointerIds: { [id: number]: boolean } = {};\n private _evaluatedMeasure = new Measure(0, 0, 0, 0);\n private _evaluatedParentMeasure = new Measure(0, 0, 0, 0);\n protected _isEnabled = true;\n protected _disabledColor = \"#9a9a9a\";\n protected _disabledColorItem = \"#6a6a6a\";\n protected _isReadOnly = false;\n /** @hidden */\n protected _rebuildLayout = false;\n\n /** @hidden */\n public _customData: any = {};\n\n /** @hidden */\n public _isClipped = false;\n\n /** @hidden */\n public _automaticSize = false;\n\n /** @hidden */\n public _tag: any;\n\n /**\n * Gets or sets the unique id of the node. Please note that this number will be updated when the control is added to a container\n */\n public uniqueId: number;\n\n /**\n * Gets or sets a boolean indicating if the control is readonly (default: false).\n * A readonly control will still raise pointer events but will not react to them\n */\n public get isReadOnly() {\n return this._isReadOnly;\n }\n\n public set isReadOnly(value: boolean) {\n this._isReadOnly = value;\n }\n\n /**\n * Gets the transformed measure, that is the bounding box of the control after applying all transformations\n */\n public get transformedMeasure(): Measure {\n return this._evaluatedMeasure;\n }\n\n /**\n * Gets or sets an object used to store user defined information for the node\n */\n @serialize()\n public metadata: any = null;\n\n /** Gets or sets a boolean indicating if the control can be hit with pointer events */\n @serialize()\n public isHitTestVisible = true;\n /** Gets or sets a boolean indicating if the control can block pointer events */\n @serialize()\n public isPointerBlocker = false;\n /** Gets or sets a boolean indicating if the control can be focusable */\n @serialize()\n public isFocusInvisible = false;\n\n /**\n * Gets or sets a boolean indicating if the children are clipped to the current control bounds.\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\n */\n @serialize()\n public clipChildren = true;\n\n /**\n * Gets or sets a boolean indicating that control content must be clipped\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\n */\n @serialize()\n public clipContent = true;\n\n /**\n * Gets or sets a boolean indicating that the current control should cache its rendering (useful when the control does not change often)\n */\n @serialize()\n public useBitmapCache = false;\n\n private _cacheData: Nullable<ImageData>;\n\n private _shadowOffsetX = 0;\n /** Gets or sets a value indicating the offset to apply on X axis to render the shadow */\n @serialize()\n public get shadowOffsetX() {\n return this._shadowOffsetX;\n }\n\n public set shadowOffsetX(value: number) {\n if (this._shadowOffsetX === value) {\n return;\n }\n\n this._shadowOffsetX = value;\n this._markAsDirty();\n }\n\n private _shadowOffsetY = 0;\n /** Gets or sets a value indicating the offset to apply on Y axis to render the shadow */\n @serialize()\n public get shadowOffsetY() {\n return this._shadowOffsetY;\n }\n\n public set shadowOffsetY(value: number) {\n if (this._shadowOffsetY === value) {\n return;\n }\n\n this._shadowOffsetY = value;\n this._markAsDirty();\n }\n\n private _shadowBlur = 0;\n private _previousShadowBlur = 0;\n /** Gets or sets a value indicating the amount of blur to use to render the shadow */\n @serialize()\n public get shadowBlur() {\n return this._shadowBlur;\n }\n\n public set shadowBlur(value: number) {\n if (this._shadowBlur === value) {\n return;\n }\n\n this._previousShadowBlur = this._shadowBlur;\n\n this._shadowBlur = value;\n this._markAsDirty();\n }\n\n private _shadowColor = \"black\";\n /** Gets or sets a value indicating the color of the shadow (black by default ie. \"#000\") */\n @serialize()\n public get shadowColor() {\n return this._shadowColor;\n }\n\n public set shadowColor(value: string) {\n if (this._shadowColor === value) {\n return;\n }\n\n this._shadowColor = value;\n this._markAsDirty();\n }\n\n /** Gets or sets the cursor to use when the control is hovered */\n @serialize()\n public hoverCursor = \"\";\n\n /** @hidden */\n protected _linkOffsetX = new ValueAndUnit(0);\n /** @hidden */\n protected _linkOffsetY = new ValueAndUnit(0);\n\n // Properties\n\n /** Gets the control type name */\n public get typeName(): string {\n return this._getTypeName();\n }\n\n /**\n * Get the current class name of the control.\n * @returns current class name\n */\n public getClassName(): string {\n return this._getTypeName();\n }\n\n /**\n * An event triggered when pointer wheel is scrolled\n */\n public onWheelObservable = new Observable<Vector2>();\n /**\n * An event triggered when the pointer moves over the control.\n */\n public onPointerMoveObservable = new Observable<Vector2>();\n\n /**\n * An event triggered when the pointer moves out of the control.\n */\n public onPointerOutObservable = new Observable<Control>();\n\n /**\n * An event triggered when the pointer taps the control\n */\n public onPointerDownObservable = new Observable<Vector2WithInfo>();\n\n /**\n * An event triggered when pointer up\n */\n public onPointerUpObservable = new Observable<Vector2WithInfo>();\n\n /**\n * An event triggered when a control is clicked on\n */\n public onPointerClickObservable = new Observable<Vector2WithInfo>();\n\n /**\n * An event triggered when pointer enters the control\n */\n public onPointerEnterObservable = new Observable<Control>();\n\n /**\n * An event triggered when the control is marked as dirty\n */\n public onDirtyObservable = new Observable<Control>();\n\n /**\n * An event triggered before drawing the control\n */\n public onBeforeDrawObservable = new Observable<Control>();\n\n /**\n * An event triggered after the control was drawn\n */\n public onAfterDrawObservable = new Observable<Control>();\n\n /**\n * An event triggered when the control has been disposed\n */\n public onDisposeObservable = new Observable<Control>();\n\n /**\n * Get the hosting AdvancedDynamicTexture\n */\n public get host(): AdvancedDynamicTexture {\n return this._host;\n }\n\n /** Gets or set information about font offsets (used to render and align text) */\n @serialize()\n public get fontOffset(): { ascent: number; height: number; descent: number } {\n return this._fontOffset;\n }\n\n public set fontOffset(offset: { ascent: number; height: number; descent: number }) {\n this._fontOffset = offset;\n }\n\n /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */\n @serialize()\n public get alpha(): number {\n return this._alpha;\n }\n\n public set alpha(value: number) {\n if (this._alpha === value) {\n return;\n }\n this._alphaSet = true;\n this._alpha = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)\n */\n public get highlightLineWidth(): number {\n return this._highlightLineWidth;\n }\n\n public set highlightLineWidth(value: number) {\n if (this._highlightLineWidth === value) {\n return;\n }\n\n this._highlightLineWidth = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)\n */\n public get isHighlighted(): boolean {\n return this._isHighlighted;\n }\n\n public set isHighlighted(value: boolean) {\n if (this._isHighlighted === value) {\n return;\n }\n\n this._isHighlighted = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a string defining the color to use for highlighting this control\n */\n public get highlightColor(): string {\n return this._highlightColor;\n }\n\n public set highlightColor(value: string) {\n if (this._highlightColor === value) {\n return;\n }\n\n this._highlightColor = value;\n this._markAsDirty();\n }\n\n /** Gets or sets a value indicating the scale factor on X axis (1 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get scaleX(): number {\n return this._scaleX;\n }\n\n public set scaleX(value: number) {\n if (this._scaleX === value) {\n return;\n }\n\n this._scaleX = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets a value indicating the scale factor on Y axis (1 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get scaleY(): number {\n return this._scaleY;\n }\n\n public set scaleY(value: number) {\n if (this._scaleY === value) {\n return;\n }\n\n this._scaleY = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets the rotation angle (0 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get rotation(): number {\n return this._rotation;\n }\n\n public set rotation(value: number) {\n if (this._rotation === value) {\n return;\n }\n\n this._rotation = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets the transformation center on Y axis (0 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get transformCenterY(): number {\n return this._transformCenterY;\n }\n\n public set transformCenterY(value: number) {\n if (this._transformCenterY === value) {\n return;\n }\n\n this._transformCenterY = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets the transformation center on X axis (0 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get transformCenterX(): number {\n return this._transformCenterX;\n }\n\n public set transformCenterX(value: number) {\n if (this._transformCenterX === value) {\n return;\n }\n\n this._transformCenterX = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /**\n * Gets or sets the horizontal alignment\n * @see https://doc.babylonjs.com/how_to/gui#alignments\n */\n @serialize()\n public get horizontalAlignment(): number {\n return this._horizontalAlignment;\n }\n\n public set horizontalAlignment(value: number) {\n if (this._horizontalAlignment === value) {\n return;\n }\n\n this._horizontalAlignment = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets the vertical alignment\n * @see https://doc.babylonjs.com/how_to/gui#alignments\n */\n @serialize()\n public get verticalAlignment(): number {\n return this._verticalAlignment;\n }\n\n public set verticalAlignment(value: number) {\n if (this._verticalAlignment === value) {\n return;\n }\n\n this._verticalAlignment = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a fixed ratio for this control.\n * When different from 0, the ratio is used to compute the \"second\" dimension.\n * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the\n * second dimension is computed as first dimension * fixedRatio\n */\n @serialize()\n public fixedRatio = 0;\n\n private _fixedRatioMasterIsWidth = true;\n\n /**\n * Gets or sets control width\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get width(): string | number {\n return this._width.toString(this._host);\n }\n\n public set width(value: string | number) {\n this._fixedRatioMasterIsWidth = true;\n\n if (this._width.toString(this._host) === value) {\n return;\n }\n\n if (this._width.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets the control width in pixel\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get widthInPixels(): number {\n return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set widthInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this._fixedRatioMasterIsWidth = true;\n this.width = value + \"px\";\n }\n\n /**\n * Gets or sets control height\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get height(): string | number {\n return this._height.toString(this._host);\n }\n\n public set height(value: string | number) {\n this._fixedRatioMasterIsWidth = false;\n\n if (this._height.toString(this._host) === value) {\n return;\n }\n\n if (this._height.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets control height in pixel\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get heightInPixels(): number {\n return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set heightInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this._fixedRatioMasterIsWidth = false;\n this.height = value + \"px\";\n }\n\n /** Gets or set font family */\n public get fontFamily(): string {\n return this._fontFamily;\n }\n\n public set fontFamily(value: string) {\n if (this._fontFamily === value) {\n return;\n }\n\n this._fontFamily = value;\n this._resetFontCache();\n }\n\n /** Gets or sets font style */\n public get fontStyle(): string {\n return this._fontStyle;\n }\n\n public set fontStyle(value: string) {\n if (this._fontStyle === value) {\n return;\n }\n\n this._fontStyle = value;\n this._resetFontCache();\n }\n\n /** Gets or sets font weight */\n public get fontWeight(): string {\n return this._fontWeight;\n }\n\n public set fontWeight(value: string) {\n if (this._fontWeight === value) {\n return;\n }\n\n this._fontWeight = value;\n this._resetFontCache();\n }\n\n /**\n * Gets or sets style\n * @see https://doc.babylonjs.com/how_to/gui#styles\n */\n @serialize()\n public get style(): Nullable<Style> {\n return this._style;\n }\n\n public set style(value: Nullable<Style>) {\n if (this._style) {\n this._style.onChangedObservable.remove(this._styleObserver);\n this._styleObserver = null;\n }\n\n this._style = value;\n\n if (this._style) {\n this._styleObserver = this._style.onChangedObservable.add(() => {\n this._markAsDirty();\n this._resetFontCache();\n });\n }\n\n this._markAsDirty();\n this._resetFontCache();\n }\n\n /** @hidden */\n public get _isFontSizeInPercentage(): boolean {\n return this._fontSize.isPercentage;\n }\n\n /** Gets or sets font size in pixels */\n public get fontSizeInPixels(): number {\n let fontSizeToUse = this._style ? this._style._fontSize : this._fontSize;\n\n if (fontSizeToUse.isPixel) {\n return fontSizeToUse.getValue(this._host);\n }\n\n return fontSizeToUse.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);\n }\n\n public set fontSizeInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.fontSize = value + \"px\";\n }\n\n /** Gets or sets font size */\n public get fontSize(): string | number {\n return this._fontSize.toString(this._host);\n }\n\n public set fontSize(value: string | number) {\n if (this._fontSize.toString(this._host) === value) {\n return;\n }\n\n if (this._fontSize.fromString(value)) {\n this._markAsDirty();\n this._resetFontCache();\n }\n }\n\n /** Gets or sets foreground color */\n @serialize()\n public get color(): string {\n return this._color;\n }\n\n public set color(value: string) {\n if (this._color === value) {\n return;\n }\n\n this._color = value;\n this._markAsDirty();\n }\n\n /** Gets or sets z index which is used to reorder controls on the z axis */\n @serialize()\n public get zIndex(): number {\n return this._zIndex;\n }\n\n public set zIndex(value: number) {\n if (this.zIndex === value) {\n return;\n }\n\n this._zIndex = value;\n\n if (this.parent) {\n this.parent._reOrderControl(this);\n }\n }\n\n /** Gets or sets a boolean indicating if the control can be rendered */\n @serialize()\n public get notRenderable(): boolean {\n return this._doNotRender;\n }\n\n public set notRenderable(value: boolean) {\n if (this._doNotRender === value) {\n return;\n }\n\n this._doNotRender = value;\n this._markAsDirty();\n }\n\n /** Gets or sets a boolean indicating if the control is visible */\n @serialize()\n public get isVisible(): boolean {\n return this._isVisible;\n }\n\n public set isVisible(value: boolean) {\n if (this._isVisible === value) {\n return;\n }\n\n this._isVisible = value;\n this._markAsDirty(true);\n }\n\n /** Gets a boolean indicating that the control needs to update its rendering */\n public get isDirty(): boolean {\n return this._isDirty;\n }\n\n /**\n * Gets the current linked mesh (or null if none)\n */\n public get linkedMesh(): Nullable<TransformNode> {\n return this._linkedMesh;\n }\n\n /**\n * Gets or sets a value indicating the padding should work like in CSS.\n * Basically, it will add the padding amount on each side of the parent control for its children.\n */\n @serialize()\n public get descendantsOnlyPadding(): boolean {\n return this._descendantsOnlyPadding;\n }\n\n public set descendantsOnlyPadding(value: boolean) {\n if (this._descendantsOnlyPadding === value) {\n return;\n }\n\n this._descendantsOnlyPadding = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the left of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingLeft(): string | number {\n return this._paddingLeft.toString(this._host);\n }\n\n public set paddingLeft(value: string | number) {\n if (this._paddingLeft.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the left of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingLeftInPixels(): number {\n return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set paddingLeftInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingLeft = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingLeftInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingLeftInPixels;\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the right of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingRight(): string | number {\n return this._paddingRight.toString(this._host);\n }\n\n public set paddingRight(value: string | number) {\n if (this._paddingRight.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the right of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingRightInPixels(): number {\n return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set paddingRightInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingRight = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingRightInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingRightInPixels;\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the top of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingTop(): string | number {\n return this._paddingTop.toString(this._host);\n }\n\n public set paddingTop(value: string | number) {\n if (this._paddingTop.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the top of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingTopInPixels(): number {\n return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set paddingTopInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingTop = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingTopInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingTopInPixels;\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the bottom of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingBottom(): string | number {\n return this._paddingBottom.toString(this._host);\n }\n\n public set paddingBottom(value: string | number) {\n if (this._paddingBottom.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the bottom of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingBottomInPixels(): number {\n return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set paddingBottomInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingBottom = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingBottomInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingBottomInPixels;\n }\n\n /**\n * Gets or sets a value indicating the left coordinate of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get left(): string | number {\n return this._left.toString(this._host);\n }\n\n public set left(value: string | number) {\n if (this._left.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the left coordinate in pixels of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get leftInPixels(): number {\n return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set leftInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.left = value + \"px\";\n }\n\n /**\n * Gets or sets a value indicating the top coordinate of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get top(): string | number {\n return this._top.toString(this._host);\n }\n\n public set top(value: string | number) {\n if (this._top.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the top coordinate in pixels of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get topInPixels(): number {\n return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set topInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.top = value + \"px\";\n }\n\n /**\n * Gets or sets a value indicating the offset on X axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n @serialize()\n public get linkOffsetX(): string | number {\n return this._linkOffsetX.toString(this._host);\n }\n\n public set linkOffsetX(value: string | number) {\n if (this._linkOffsetX.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n public get linkOffsetXInPixels(): number {\n return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set linkOffsetXInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.linkOffsetX = value + \"px\";\n }\n\n /**\n * Gets or sets a value indicating the offset on Y axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n @serialize()\n public get linkOffsetY(): string | number {\n return this._linkOffsetY.toString(this._host);\n }\n\n public set linkOffsetY(value: string | number) {\n if (this._linkOffsetY.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n public get linkOffsetYInPixels(): number {\n return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set linkOffsetYInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.linkOffsetY = value + \"px\";\n }\n\n /** Gets the center coordinate on X axis */\n public get centerX(): number {\n return this._currentMeasure.left + this._currentMeasure.width / 2;\n }\n\n /** Gets the center coordinate on Y axis */\n public get centerY(): number {\n return this._currentMeasure.top + this._currentMeasure.height / 2;\n }\n\n /** Gets or sets if control is Enabled */\n @serialize()\n public get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n public set isEnabled(value: boolean) {\n if (this._isEnabled === value) {\n return;\n }\n\n this._isEnabled = value;\n this._markAsDirty();\n }\n /** Gets or sets background color of control if it's disabled */\n @serialize()\n public get disabledColor(): string {\n return this._disabledColor;\n }\n\n public set disabledColor(value: string) {\n if (this._disabledColor === value) {\n return;\n }\n\n this._disabledColor = value;\n this._markAsDirty();\n }\n /** Gets or sets front color of control if it's disabled */\n @serialize()\n public get disabledColorItem(): string {\n return this._disabledColorItem;\n }\n\n public set disabledColorItem(value: string) {\n if (this._disabledColorItem === value) {\n return;\n }\n\n this._disabledColorItem = value;\n this._markAsDirty();\n }\n\n /**\n * Gets/sets the overlap group of the control.\n * Controls with overlapGroup set to a number can be deoverlapped.\n * Controls with overlapGroup set to undefined are not deoverlapped.\n * @see https://doc.babylonjs.com/how_to/gui#deoverlapping\n */\n @serialize()\n public overlapGroup?: number;\n /**\n * Gets/sets the deoverlap movement multiplier\n */\n @serialize()\n public overlapDeltaMultiplier?: number;\n\n // Functions\n\n /**\n * Creates a new control\n * @param name defines the name of the control\n */\n constructor(\n /** defines the name of the control */\n public name?: string\n ) { }\n\n /** @hidden */\n protected _getTypeName(): string {\n return \"Control\";\n }\n\n /**\n * Gets the first ascendant in the hierarchy of the given type\n * @param className defines the required type\n * @returns the ascendant or null if not found\n */\n public getAscendantOfClass(className: string): Nullable<Control> {\n if (!this.parent) {\n return null;\n }\n\n if (this.parent.getClassName() === className) {\n return this.parent;\n }\n\n return this.parent.getAscendantOfClass(className);\n }\n\n /** @hidden */\n public _resetFontCache(): void {\n this._fontSet = true;\n this._markAsDirty();\n }\n\n /**\n * Determines if a container is an ascendant of the current control\n * @param container defines the container to look for\n * @returns true if the container is one of the ascendant of the control\n */\n public isAscendant(container: Control): boolean {\n if (!this.parent) {\n return false;\n }\n\n if (this.parent === container) {\n return true;\n }\n\n return this.parent.isAscendant(container);\n }\n\n /**\n * Gets coordinates in local control space\n * @param globalCoordinates defines the coordinates to transform\n * @returns the new coordinates in local space\n */\n public getLocalCoordinates(globalCoordinates: Vector2): Vector2 {\n var result = Vector2.Zero();\n\n this.getLocalCoordinatesToRef(globalCoordinates, result);\n\n return result;\n }\n\n /**\n * Gets coordinates in local control space\n * @param globalCoordinates defines the coordinates to transform\n * @param result defines the target vector2 where to store the result\n * @returns the current control\n */\n public getLocalCoordinatesToRef(globalCoordinates: Vector2, result: Vector2): Control {\n result.x = globalCoordinates.x - this._currentMeasure.left;\n result.y = globalCoordinates.y - this._currentMeasure.top;\n return this;\n }\n\n /**\n * Gets coordinates in parent local control space\n * @param globalCoordinates defines the coordinates to transform\n * @returns the new coordinates in parent local space\n */\n public getParentLocalCoordinates(globalCoordinates: Vector2): Vector2 {\n var result = Vector2.Zero();\n\n result.x = globalCoordinates.x - this._cachedParentMeasure.left;\n result.y = globalCoordinates.y - this._cachedParentMeasure.top;\n\n return result;\n }\n\n /**\n * Move the current control to a vector3 position projected onto the screen.\n * @param position defines the target position\n * @param scene defines the hosting scene\n */\n public moveToVector3(position: Vector3, scene: Scene): void {\n if (!this._host || this.parent !== this._host._rootContainer) {\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\n return;\n }\n\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\n\n var globalViewport = this._host._getGlobalViewport();\n var projectedPosition = Vector3.Project(position, Matrix.Identity(), scene.getTransformMatrix(), globalViewport);\n\n this._moveToProjectedPosition(projectedPosition);\n\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\n this.notRenderable = true;\n return;\n }\n this.notRenderable = false;\n }\n\n /**\n * Will store all controls that have this control as ascendant in a given array\n * @param results defines the array where to store the descendants\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\n */\n public getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\n // Do nothing by default\n }\n\n /**\n * Will return all controls that have this control as ascendant\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\n * @return all child controls\n */\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\n var results = new Array<Control>();\n\n this.getDescendantsToRef(results, directDescendantsOnly, predicate);\n\n return results;\n }\n\n /**\n * Link current control with a target mesh\n * @param mesh defines the mesh to link with\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n public linkWithMesh(mesh: Nullable<TransformNode>): void {\n if (!this._host || (this.parent && this.parent !== this._host._rootContainer)) {\n if (mesh) {\n Tools.Error(\"Cannot link a control to a mesh if the control is not at root level\");\n }\n return;\n }\n\n var index = this._host._linkedControls.indexOf(this);\n if (index !== -1) {\n this._linkedMesh = mesh;\n if (!mesh) {\n this._host._linkedControls.splice(index, 1);\n }\n return;\n } else if (!mesh) {\n return;\n }\n\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\n this._linkedMesh = mesh;\n this._host._linkedControls.push(this);\n }\n\n /**\n * Shorthand funtion to set the top, right, bottom, and left padding values on the control.\n * @param { string | number} paddingTop - The value of the top padding.\n * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.\n * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.\n * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public setPadding(paddingTop: string | number, paddingRight?: string | number, paddingBottom?: string | number, paddingLeft?: string | number) {\n const top = paddingTop;\n const right = paddingRight ?? top;\n const bottom = paddingBottom ?? top;\n const left = paddingLeft ?? right;\n\n this.paddingTop = top;\n this.paddingRight = right;\n this.paddingBottom = bottom;\n this.paddingLeft = left;\n }\n\n /**\n * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.\n * @param { number} paddingTop - The value in pixels of the top padding.\n * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.\n * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.\n * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public setPaddingInPixels(paddingTop: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number) {\n const top = paddingTop;\n const right = paddingRight ?? top;\n const bottom = paddingBottom ?? top;\n const left = paddingLeft ?? right;\n\n this.paddingTopInPixels = top;\n this.paddingRightInPixels = right;\n this.paddingBottomInPixels = bottom;\n this.paddingLeftInPixels = left;\n }\n\n /** @hidden */\n public _moveToProjectedPosition(projectedPosition: Vector3): void {\n let oldLeft = this._left.getValue(this._host);\n let oldTop = this._top.getValue(this._host);\n\n if (this._currentMeasure.width === 0 && this._currentMeasure.height === 0) {\n let parentMeasure = this.parent?._currentMeasure;\n if (parentMeasure) {\n this._processMeasures(parentMeasure, this._host.getContext());\n }\n }\n\n var newLeft = projectedPosition.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2;\n var newTop = projectedPosition.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;\n\n if (this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling) {\n if (Math.abs(newLeft - oldLeft) < 0.5) {\n newLeft = oldLeft;\n }\n\n if (Math.abs(newTop - oldTop) < 0.5) {\n newTop = oldTop;\n }\n }\n\n this.left = newLeft + \"px\";\n this.top = newTop + \"px\";\n\n this._left.ignoreAdaptiveScaling = true;\n this._top.ignoreAdaptiveScaling = true;\n this._markAsDirty();\n }\n\n /** @hidden */\n public _offsetLeft(offset: number) {\n this._isDirty = true;\n this._currentMeasure.left += offset;\n }\n\n /** @hidden */\n public _offsetTop(offset: number) {\n this._isDirty = true;\n this._currentMeasure.top += offset;\n }\n\n /** @hidden */\n public _markMatrixAsDirty(): void {\n this._isMatrixDirty = true;\n this._flagDescendantsAsMatrixDirty();\n }\n\n /** @hidden */\n public _flagDescendantsAsMatrixDirty(): void {\n // No child\n }\n\n /** @hidden */\n public _intersectsRect(rect: Measure) {\n // Rotate the control's current measure into local space and check if it intersects the passed in rectangle\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\n if (this._tmpMeasureA.left >= rect.left + rect.width) {\n return false;\n }\n\n if (this._tmpMeasureA.top >= rect.top + rect.height) {\n return false;\n }\n\n if (this._tmpMeasureA.left + this._tmpMeasureA.width <= rect.left) {\n return false;\n }\n\n if (this._tmpMeasureA.top + this._tmpMeasureA.height <= rect.top) {\n return false;\n }\n\n return true;\n }\n\n /** @hidden */\n protected _computeAdditionnalOffsetX() {\n return 0;\n }\n\n /** @hidden */\n protected _computeAdditionnalOffsetY() {\n return 0;\n }\n\n /** @hidden */\n protected invalidateRect() {\n this._transform();\n if (this.host && this.host.useInvalidateRectOptimization) {\n // Rotate by transform to get the measure transformed to global space\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\n // get the boudning box of the current measure and last frames measure in global space and invalidate it\n // the previous measure is used to properly clear a control that is scaled down\n Measure.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);\n\n // Expand rect based on shadows\n var shadowOffsetX = this.shadowOffsetX;\n var shadowOffsetY = this.shadowOffsetY;\n var shadowBlur = Math.max(this._previousShadowBlur, this.shadowBlur);\n\n var leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\n var rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\n var topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\n var bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\n\n const offsetX = this._computeAdditionnalOffsetX();\n const offsetY = this._computeAdditionnalOffsetY();\n\n this.host.invalidateRect(\n Math.floor(this._tmpMeasureA.left + leftShadowOffset - offsetX),\n Math.floor(this._tmpMeasureA.top + topShadowOffset - offsetY),\n Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + rightShadowOffset + offsetX),\n Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + bottomShadowOffset + offsetY)\n );\n }\n }\n\n /** @hidden */\n public _markAsDirty(force = false): void {\n if (!this._isVisible && !force) {\n return;\n }\n\n this._isDirty = true;\n\n // Redraw only this rectangle\n if (this._host) {\n this._host.markAsDirty();\n }\n }\n\n /** @hidden */\n public _markAllAsDirty(): void {\n this._markAsDirty();\n\n if (this._font) {\n this._prepareFont();\n }\n }\n\n /** @hidden */\n public _link(host: AdvancedDynamicTexture): void {\n this._host = host;\n if (this._host) {\n this.uniqueId = this._host.getScene()!.getUniqueId();\n }\n }\n\n /** @hidden */\n protected _transform(context?: ICanvasRenderingContext): void {\n if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0) {\n return;\n }\n\n // postTranslate\n var offsetX = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left;\n var offsetY = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;\n if (context) {\n context.translate(offsetX, offsetY);\n\n // rotate\n context.rotate(this._rotation);\n\n // scale\n context.scale(this._scaleX, this._scaleY);\n\n // preTranslate\n context.translate(-offsetX, -offsetY);\n }\n // Need to update matrices?\n if (this._isMatrixDirty || this._cachedOffsetX !== offsetX || this._cachedOffsetY !== offsetY) {\n this._cachedOffsetX = offsetX;\n this._cachedOffsetY = offsetY;\n this._isMatrixDirty = false;\n this._flagDescendantsAsMatrixDirty();\n\n Matrix2D.ComposeToRef(-offsetX, -offsetY, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix);\n\n this._transformMatrix.invertToRef(this._invertTransformMatrix);\n }\n }\n\n /** @hidden */\n public _renderHighlight(context: ICanvasRenderingContext): void {\n if (!this.isHighlighted) {\n return;\n }\n\n context.save();\n context.strokeStyle = this._highlightColor;\n context.lineWidth = this._highlightLineWidth;\n\n this._renderHighlightSpecific(context);\n context.restore();\n }\n\n /** @hidden */\n public _renderHighlightSpecific(context: ICanvasRenderingContext): void {\n context.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\n }\n\n /** @hidden */\n protected _applyStates(context: ICanvasRenderingContext): void {\n if (this._isFontSizeInPercentage) {\n this._fontSet = true;\n }\n\n if (this._host && this._host.useSmallestIdeal && !this._font) {\n this._fontSet = true;\n }\n\n if (this._fontSet) {\n this._prepareFont();\n this._fontSet = false;\n }\n\n if (this._font) {\n context.font = this._font;\n }\n\n if (this._color) {\n context.fillStyle = this._color;\n }\n\n if (Control.AllowAlphaInheritance) {\n context.globalAlpha *= this._alpha;\n } else if (this._alphaSet) {\n context.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha;\n }\n }\n\n /** @hidden */\n public _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\n return false;\n }\n\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\n this.host._numLayoutCalls++;\n\n this._currentMeasure.addAndTransformToRef(\n this._transformMatrix,\n -this._paddingLeftInPixels | 0,\n -this._paddingTopInPixels | 0,\n this._paddingRightInPixels | 0,\n this._paddingBottomInPixels | 0,\n this._prevCurrentMeasureTransformedIntoGlobalSpace\n );\n\n context.save();\n\n this._applyStates(context);\n\n let rebuildCount = 0;\n do {\n this._rebuildLayout = false;\n this._processMeasures(parentMeasure, context);\n rebuildCount++;\n } while (this._rebuildLayout && rebuildCount < 3);\n\n if (rebuildCount >= 3) {\n Logger.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`);\n }\n\n context.restore();\n this.invalidateRect();\n this._evaluateClippingState(parentMeasure);\n }\n\n this._wasDirty = this._isDirty;\n this._isDirty = false;\n\n return true;\n }\n\n /** @hidden */\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n this._tempPaddingMeasure.copyFrom(parentMeasure);\n\n // Apply padding if in correct mode\n if (this.parent && this.parent.descendantsOnlyPadding) {\n this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels;\n this._tempPaddingMeasure.top += this.parent.paddingTopInPixels;\n this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels;\n this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels;\n }\n\n this._currentMeasure.copyFrom(this._tempPaddingMeasure);\n\n // Let children take some pre-measurement actions\n this._preMeasure(this._tempPaddingMeasure, context);\n\n this._measure();\n this._computeAlignment(this._tempPaddingMeasure, context);\n\n // Convert to int values\n this._currentMeasure.left = this._currentMeasure.left | 0;\n this._currentMeasure.top = this._currentMeasure.top | 0;\n this._currentMeasure.width = this._currentMeasure.width | 0;\n this._currentMeasure.height = this._currentMeasure.height | 0;\n\n // Let children add more features\n this._additionalProcessing(this._tempPaddingMeasure, context);\n\n this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure);\n\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\n if (this.onDirtyObservable.hasObservers()) {\n this.onDirtyObservable.notifyObservers(this);\n }\n }\n\n protected _evaluateClippingState(parentMeasure: Measure) {\n if (this.parent && this.parent.clipChildren) {\n parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);\n // Early clip\n if (this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {\n this._isClipped = true;\n return;\n }\n\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {\n this._isClipped = true;\n return;\n }\n\n if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {\n this._isClipped = true;\n return;\n }\n\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {\n this._isClipped = true;\n return;\n }\n }\n\n this._isClipped = false;\n }\n\n /** @hidden */\n public _measure(): void {\n // Width / Height\n if (this._width.isPixel) {\n this._currentMeasure.width = this._width.getValue(this._host);\n } else {\n this._currentMeasure.width *= this._width.getValue(this._host);\n }\n\n if (this._height.isPixel) {\n this._currentMeasure.height = this._height.getValue(this._host);\n } else {\n this._currentMeasure.height *= this._height.getValue(this._host);\n }\n\n if (this.fixedRatio !== 0) {\n if (this._fixedRatioMasterIsWidth) {\n this._currentMeasure.height = this._currentMeasure.width * this.fixedRatio;\n } else {\n this._currentMeasure.width = this._currentMeasure.height * this.fixedRatio;\n }\n }\n }\n\n /** @hidden */\n protected _computeAlignment(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n var width = this._currentMeasure.width;\n var height = this._currentMeasure.height;\n\n var parentWidth = parentMeasure.width;\n var parentHeight = parentMeasure.height;\n\n // Left / top\n var x = 0;\n var y = 0;\n\n switch (this.horizontalAlignment) {\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\n x = 0;\n break;\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\n x = parentWidth - width;\n break;\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\n x = (parentWidth - width) / 2;\n break;\n }\n\n switch (this.verticalAlignment) {\n case Control.VERTICAL_ALIGNMENT_TOP:\n y = 0;\n break;\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\n y = parentHeight - height;\n break;\n case Control.VERTICAL_ALIGNMENT_CENTER:\n y = (parentHeight - height) / 2;\n break;\n }\n\n if (!this.descendantsOnlyPadding) {\n if (this._paddingLeft.isPixel) {\n this._currentMeasure.left += this._paddingLeft.getValue(this._host);\n this._currentMeasure.width -= this._paddingLeft.getValue(this._host);\n } else {\n this._currentMeasure.left += parentWidth * this._paddingLeft.getValue(this._host);\n this._currentMeasure.width -= parentWidth * this._paddingLeft.getValue(this._host);\n }\n\n if (this._paddingRight.isPixel) {\n this._currentMeasure.width -= this._paddingRight.getValue(this._host);\n } else {\n this._currentMeasure.width -= parentWidth * this._paddingRight.getValue(this._host);\n }\n\n if (this._paddingTop.isPixel) {\n this._currentMeasure.top += this._paddingTop.getValue(this._host);\n this._currentMeasure.height -= this._paddingTop.getValue(this._host);\n } else {\n this._currentMeasure.top += parentHeight * this._paddingTop.getValue(this._host);\n this._currentMeasure.height -= parentHeight * this._paddingTop.getValue(this._host);\n }\n\n if (this._paddingBottom.isPixel) {\n this._currentMeasure.height -= this._paddingBottom.getValue(this._host);\n } else {\n this._currentMeasure.height -= parentHeight * this._paddingBottom.getValue(this._host);\n }\n }\n\n if (this._left.isPixel) {\n this._currentMeasure.left += this._left.getValue(this._host);\n } else {\n this._currentMeasure.left += parentWidth * this._left.getValue(this._host);\n }\n\n if (this._top.isPixel) {\n this._currentMeasure.top += this._top.getValue(this._host);\n } else {\n this._currentMeasure.top += parentHeight * this._top.getValue(this._host);\n }\n\n this._currentMeasure.left += x;\n this._currentMeasure.top += y;\n }\n\n /** @hidden */\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n // Do nothing\n }\n\n /** @hidden */\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n // Do nothing\n }\n\n /** @hidden */\n protected _clipForChildren(context: ICanvasRenderingContext): void {\n // DO nothing\n }\n\n private static _ClipMeasure = new Measure(0, 0, 0, 0);\n private _tmpMeasureA = new Measure(0, 0, 0, 0);\n private _clip(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>) {\n context.beginPath();\n Control._ClipMeasure.copyFrom(this._currentMeasure);\n if (invalidatedRectangle) {\n // Rotate the invalidated rect into the control's space\n invalidatedRectangle.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);\n\n // Get the intersection of the rect in context space and the current context\n var intersection = new Measure(0, 0, 0, 0);\n intersection.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left);\n intersection.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top);\n intersection.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - intersection.left;\n intersection.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - intersection.top;\n Control._ClipMeasure.copyFrom(intersection);\n }\n\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\n var shadowOffsetX = this.shadowOffsetX;\n var shadowOffsetY = this.shadowOffsetY;\n var shadowBlur = this.shadowBlur;\n\n var leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\n var rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\n var topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\n var bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\n\n context.rect(\n Control._ClipMeasure.left + leftShadowOffset,\n Control._ClipMeasure.top + topShadowOffset,\n Control._ClipMeasure.width + rightShadowOffset - leftShadowOffset,\n Control._ClipMeasure.height + bottomShadowOffset - topShadowOffset\n );\n } else {\n context.rect(Control._ClipMeasure.left, Control._ClipMeasure.top, Control._ClipMeasure.width, Control._ClipMeasure.height);\n }\n\n context.clip();\n }\n\n /** @hidden */\n public _render(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): boolean {\n if (!this.isVisible || this.notRenderable || this._isClipped) {\n this._isDirty = false;\n return false;\n }\n\n this.host._numRenderCalls++;\n\n context.save();\n\n this._applyStates(context);\n\n // Transform\n this._transform(context);\n\n // Clip\n if (this.clipContent) {\n this._clip(context, invalidatedRectangle);\n }\n\n if (this.onBeforeDrawObservable.hasObservers()) {\n this.onBeforeDrawObservable.notifyObservers(this);\n }\n\n if (this.useBitmapCache && !this._wasDirty && this._cacheData) {\n context.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top);\n } else {\n this._draw(context, invalidatedRectangle);\n }\n\n if (this.useBitmapCache && this._wasDirty) {\n this._cacheData = context.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\n }\n\n this._renderHighlight(context);\n\n if (this.onAfterDrawObservable.hasObservers()) {\n this.onAfterDrawObservable.notifyObservers(this);\n }\n\n context.restore();\n\n return true;\n }\n\n /** @hidden */\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\n // Do nothing\n }\n\n /**\n * Tests if a given coordinates belong to the current control\n * @param x defines x coordinate to test\n * @param y defines y coordinate to test\n * @returns true if the coordinates are inside the control\n */\n public contains(x: number, y: number): boolean {\n // Invert transform\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\n\n x = this._transformedPosition.x;\n y = this._transformedPosition.y;\n\n // Check\n if (x < this._currentMeasure.left) {\n return false;\n }\n\n if (x > this._currentMeasure.left + this._currentMeasure.width) {\n return false;\n }\n\n if (y < this._currentMeasure.top) {\n return false;\n }\n\n if (y > this._currentMeasure.top + this._currentMeasure.height) {\n return false;\n }\n\n if (this.isPointerBlocker) {\n this._host._shouldBlockPointer = true;\n }\n return true;\n }\n\n /** @hidden */\n public _processPicking(x: number, y: number, pi: PointerInfoBase, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\n if (!this._isEnabled) {\n return false;\n }\n if (!this.isHitTestVisible || !this.isVisible || this._doNotRender) {\n return false;\n }\n\n if (!this.contains(x, y)) {\n return false;\n }\n\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\n\n return true;\n }\n\n /** @hidden */\n public _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\n var canNotify: boolean = this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\n }\n }\n\n /** @hidden */\n public _onPointerEnter(target: Control, pi: PointerInfoBase): boolean {\n if (!this._isEnabled) {\n return false;\n }\n if (this._enterCount > 0) {\n return false;\n }\n\n if (this._enterCount === -1) {\n // -1 is for touch input, we are now sure we are with a mouse or pencil\n this._enterCount = 0;\n }\n this._enterCount++;\n\n var canNotify: boolean = this.onPointerEnterObservable.notifyObservers(this, -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerEnter(target, pi);\n }\n\n return true;\n }\n\n /** @hidden */\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\n if (!force && (!this._isEnabled || target === this)) {\n return;\n }\n this._enterCount = 0;\n\n var canNotify: boolean = true;\n\n if (!target.isAscendant(this)) {\n canNotify = this.onPointerOutObservable.notifyObservers(this, -1, target, this, pi);\n }\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerOut(target, pi, force);\n }\n }\n\n /** @hidden */\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\n // Prevent pointerout to lose control context.\n // Event redundancy is checked inside the function.\n this._onPointerEnter(this, pi);\n\n if (this._downCount !== 0) {\n return false;\n }\n\n this._downCount++;\n\n this._downPointerIds[pointerId] = true;\n\n var canNotify: boolean = this.onPointerDownObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\n }\n\n return true;\n }\n\n /** @hidden */\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi?: PointerInfoBase): void {\n if (!this._isEnabled) {\n return;\n }\n this._downCount = 0;\n\n delete this._downPointerIds[pointerId];\n\n var canNotifyClick: boolean = notifyClick;\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\n }\n var canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\n }\n }\n\n /** @hidden */\n public _forcePointerUp(pointerId: Nullable<number> = null) {\n if (pointerId !== null) {\n this._onPointerUp(this, Vector2.Zero(), pointerId, 0, true);\n } else {\n for (var key in this._downPointerIds) {\n this._onPointerUp(this, Vector2.Zero(), +key as number, 0, true);\n }\n }\n }\n\n /** @hidden */\n public _onWheelScroll(deltaX?: number, deltaY?: number): void {\n if (!this._isEnabled) {\n return;\n }\n var canNotify: boolean = this.onWheelObservable.notifyObservers(new Vector2(deltaX, deltaY));\n\n if (canNotify && this.parent != null) {\n this.parent._onWheelScroll(deltaX, deltaY);\n }\n }\n\n /** @hidden */\n public _onCanvasBlur(): void { }\n\n /** @hidden */\n public _processObservables(type: number, x: number, y: number, pi: PointerInfoBase, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\n if (!this._isEnabled) {\n return false;\n }\n this._dummyVector2.copyFromFloats(x, y);\n if (type === PointerEventTypes.POINTERMOVE) {\n this._onPointerMove(this, this._dummyVector2, pointerId, pi);\n\n var previousControlOver = this._host._lastControlOver[pointerId];\n if (previousControlOver && previousControlOver !== this) {\n previousControlOver._onPointerOut(this, pi);\n }\n\n if (previousControlOver !== this) {\n this._onPointerEnter(this, pi);\n }\n\n this._host._lastControlOver[pointerId] = this;\n return true;\n }\n\n if (type === PointerEventTypes.POINTERDOWN) {\n this._onPointerDown(this, this._dummyVector2, pointerId, buttonIndex, pi);\n this._host._registerLastControlDown(this, pointerId);\n this._host._lastPickedControl = this;\n return true;\n }\n\n if (type === PointerEventTypes.POINTERUP) {\n if (this._host._lastControlDown[pointerId]) {\n this._host._lastControlDown[pointerId]._onPointerUp(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\n }\n delete this._host._lastControlDown[pointerId];\n return true;\n }\n\n if (type === PointerEventTypes.POINTERWHEEL) {\n if (this._host._lastControlOver[pointerId]) {\n this._host._lastControlOver[pointerId]._onWheelScroll(deltaX, deltaY);\n return true;\n }\n }\n\n return false;\n }\n\n private _prepareFont() {\n if (!this._font && !this._fontSet) {\n return;\n }\n\n if (this._style) {\n this._font = this._style.fontStyle + \" \" + this._style.fontWeight + \" \" + this.fontSizeInPixels + \"px \" + this._style.fontFamily;\n } else {\n this._font = this._fontStyle + \" \" + this._fontWeight + \" \" + this.fontSizeInPixels + \"px \" + this._fontFamily;\n }\n\n this._fontOffset = Control._GetFontOffset(this._font);\n\n //children need to be refreshed\n this.getDescendants().forEach((child) => child._markAllAsDirty());\n }\n\n /**\n * Serializes the current control\n * @param serializationObject defined the JSON serialized object\n */\n public serialize(serializationObject: any) {\n SerializationHelper.Serialize(this, serializationObject);\n serializationObject.name = this.name;\n serializationObject.className = this.getClassName();\n\n if (this._font) {\n serializationObject.fontFamily = this._fontFamily;\n serializationObject.fontSize = this.fontSize;\n serializationObject.fontWeight = this.fontWeight;\n serializationObject.fontStyle = this.fontStyle;\n }\n }\n\n /** @hidden */\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\n if (serializedObject.fontFamily) {\n this.fontFamily = serializedObject.fontFamily;\n }\n\n if (serializedObject.fontSize) {\n this.fontSize = serializedObject.fontSize;\n }\n\n if (serializedObject.fontWeight) {\n this.fontWeight = serializedObject.fontWeight;\n }\n\n if (serializedObject.fontStyle) {\n this.fontStyle = serializedObject.fontStyle;\n }\n }\n\n /** Releases associated resources */\n public dispose() {\n this.onDirtyObservable.clear();\n this.onBeforeDrawObservable.clear();\n this.onAfterDrawObservable.clear();\n this.onPointerDownObservable.clear();\n this.onPointerEnterObservable.clear();\n this.onPointerMoveObservable.clear();\n this.onPointerOutObservable.clear();\n this.onPointerUpObservable.clear();\n this.onPointerClickObservable.clear();\n this.onWheelObservable.clear();\n\n if (this._styleObserver && this._style) {\n this._style.onChangedObservable.remove(this._styleObserver);\n this._styleObserver = null;\n }\n\n if (this.parent) {\n this.parent.removeControl(this);\n this.parent = null;\n }\n\n if (this._host) {\n var index = this._host._linkedControls.indexOf(this);\n if (index > -1) {\n this.linkWithMesh(null);\n }\n }\n\n // Callback\n this.onDisposeObservable.notifyObservers(this);\n this.onDisposeObservable.clear();\n }\n\n // Statics\n private static _HORIZONTAL_ALIGNMENT_LEFT = 0;\n private static _HORIZONTAL_ALIGNMENT_RIGHT = 1;\n private static _HORIZONTAL_ALIGNMENT_CENTER = 2;\n\n private static _VERTICAL_ALIGNMENT_TOP = 0;\n private static _VERTICAL_ALIGNMENT_BOTTOM = 1;\n private static _VERTICAL_ALIGNMENT_CENTER = 2;\n\n /** HORIZONTAL_ALIGNMENT_LEFT */\n public static get HORIZONTAL_ALIGNMENT_LEFT(): number {\n return Control._HORIZONTAL_ALIGNMENT_LEFT;\n }\n\n /** HORIZONTAL_ALIGNMENT_RIGHT */\n public static get HORIZONTAL_ALIGNMENT_RIGHT(): number {\n return Control._HORIZONTAL_ALIGNMENT_RIGHT;\n }\n\n /** HORIZONTAL_ALIGNMENT_CENTER */\n public static get HORIZONTAL_ALIGNMENT_CENTER(): number {\n return Control._HORIZONTAL_ALIGNMENT_CENTER;\n }\n\n /** VERTICAL_ALIGNMENT_TOP */\n public static get VERTICAL_ALIGNMENT_TOP(): number {\n return Control._VERTICAL_ALIGNMENT_TOP;\n }\n\n /** VERTICAL_ALIGNMENT_BOTTOM */\n public static get VERTICAL_ALIGNMENT_BOTTOM(): number {\n return Control._VERTICAL_ALIGNMENT_BOTTOM;\n }\n\n /** VERTICAL_ALIGNMENT_CENTER */\n public static get VERTICAL_ALIGNMENT_CENTER(): number {\n return Control._VERTICAL_ALIGNMENT_CENTER;\n }\n\n private static _FontHeightSizes: { [key: string]: { ascent: number; height: number; descent: number } } = {};\n\n /** @hidden */\n public static _GetFontOffset(font: string): { ascent: number; height: number; descent: number } {\n if (Control._FontHeightSizes[font]) {\n return Control._FontHeightSizes[font];\n }\n\n const engine = Engine.LastCreatedEngine;\n if (!engine) {\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\n }\n\n var result = engine.getFontOffset(font);\n Control._FontHeightSizes[font] = result;\n\n return result;\n }\n\n /**\n * Creates a Control from parsed data\n * @param serializedObject defines parsed data\n * @param host defines the hosting AdvancedDynamicTexture\n * @returns a new Control\n */\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture): Control {\n let controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\n let control = SerializationHelper.Parse(() => new controlType(), serializedObject, null);\n\n control.name = serializedObject.name;\n\n control._parseFromContent(serializedObject, host);\n\n return control;\n }\n\n /**\n * Creates a stack panel that can be used to render headers\n * @param control defines the control to associate with the header\n * @param text defines the text of the header\n * @param size defines the size of the header\n * @param options defines options used to configure the header\n * @returns a new StackPanel\n * @ignore\n * @hidden\n */\n public static AddHeader: (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }) => any = () => { };\n\n /** @hidden */\n protected static drawEllipse(x: number, y: number, width: number, height: number, context: ICanvasRenderingContext): void {\n context.translate(x, y);\n context.scale(width, height);\n\n context.beginPath();\n context.arc(0, 0, 1, 0, 2 * Math.PI);\n context.closePath();\n\n context.scale(1 / width, 1 / height);\n context.translate(-x, -y);\n }\n}\nRegisterClass(\"BABYLON.GUI.Control\", Control);\n"]}
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/2D/controls/control.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"@babylonjs/core/types\";\nimport { Observable, Observer } from \"@babylonjs/core/Misc/observable\";\nimport { Vector2, Vector3, Matrix } from \"@babylonjs/core/Maths/math.vector\";\nimport { PointerEventTypes, PointerInfoBase } from \"@babylonjs/core/Events/pointerEvents\";\nimport { Logger } from \"@babylonjs/core/Misc/logger\";\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\nimport { Scene } from \"@babylonjs/core/scene\";\n\nimport { Container } from \"./container\";\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\nimport { ValueAndUnit } from \"../valueAndUnit\";\nimport { Measure } from \"../measure\";\nimport { Style } from \"../style\";\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\nimport { RegisterClass } from \"@babylonjs/core/Misc/typeStore\";\nimport { SerializationHelper, serialize } from \"@babylonjs/core/Misc/decorators\";\nimport { ICanvasRenderingContext } from \"@babylonjs/core/Engines/ICanvas\";\nimport { Engine } from \"@babylonjs/core/Engines/engine\";\n\n/**\n * Root class used for all 2D controls\n * @see https://doc.babylonjs.com/how_to/gui#controls\n */\nexport class Control {\n /**\n * Gets or sets a boolean indicating if alpha must be an inherited value (false by default)\n */\n public static AllowAlphaInheritance = false;\n\n private _alpha = 1;\n private _alphaSet = false;\n private _zIndex = 0;\n /** @hidden */\n public _host: AdvancedDynamicTexture;\n /** Gets or sets the control parent */\n public parent: Nullable<Container>;\n /** @hidden */\n public _currentMeasure = Measure.Empty();\n /** @hidden */\n public _tempPaddingMeasure = Measure.Empty();\n private _fontFamily = \"Arial\";\n private _fontStyle = \"\";\n private _fontWeight = \"\";\n private _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\n private _font: string;\n /** @hidden */\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\n /** @hidden */\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\n /** @hidden */\n protected _fontOffset: { ascent: number; height: number; descent: number };\n private _color = \"\";\n private _style: Nullable<Style> = null;\n private _styleObserver: Nullable<Observer<Style>>;\n /** @hidden */\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\n /** @hidden */\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\n /** @hidden */\n protected _isDirty = true;\n /** @hidden */\n protected _wasDirty = false;\n /** @hidden */\n public _tempParentMeasure = Measure.Empty();\n /** @hidden */\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\n /** @hidden */\n protected _cachedParentMeasure = Measure.Empty();\n private _descendantsOnlyPadding = false;\n private _paddingLeft = new ValueAndUnit(0);\n private _paddingRight = new ValueAndUnit(0);\n private _paddingTop = new ValueAndUnit(0);\n private _paddingBottom = new ValueAndUnit(0);\n /** @hidden */\n public _left = new ValueAndUnit(0);\n /** @hidden */\n public _top = new ValueAndUnit(0);\n private _scaleX = 1.0;\n private _scaleY = 1.0;\n private _rotation = 0;\n private _transformCenterX = 0.5;\n private _transformCenterY = 0.5;\n /** @hidden */\n public _transformMatrix = Matrix2D.Identity();\n /** @hidden */\n protected _invertTransformMatrix = Matrix2D.Identity();\n /** @hidden */\n protected _transformedPosition = Vector2.Zero();\n private _isMatrixDirty = true;\n private _cachedOffsetX: number;\n private _cachedOffsetY: number;\n private _isVisible = true;\n private _isHighlighted = false;\n private _highlightColor = \"#4affff\";\n protected _highlightLineWidth = 2;\n /** @hidden */\n public _linkedMesh: Nullable<TransformNode>;\n private _fontSet = false;\n private _dummyVector2 = Vector2.Zero();\n private _downCount = 0;\n private _enterCount = -1;\n private _doNotRender = false;\n private _downPointerIds: { [id: number]: boolean } = {};\n private _evaluatedMeasure = new Measure(0, 0, 0, 0);\n private _evaluatedParentMeasure = new Measure(0, 0, 0, 0);\n protected _isEnabled = true;\n protected _disabledColor = \"#9a9a9a\";\n protected _disabledColorItem = \"#6a6a6a\";\n protected _isReadOnly = false;\n /** @hidden */\n protected _rebuildLayout = false;\n\n /** @hidden */\n public _customData: any = {};\n\n /** @hidden */\n public _isClipped = false;\n\n /** @hidden */\n public _automaticSize = false;\n\n /** @hidden */\n public _tag: any;\n\n /**\n * Gets or sets the unique id of the node. Please note that this number will be updated when the control is added to a container\n */\n public uniqueId: number;\n\n /**\n * Gets or sets a boolean indicating if the control is readonly (default: false).\n * A readonly control will still raise pointer events but will not react to them\n */\n public get isReadOnly() {\n return this._isReadOnly;\n }\n\n public set isReadOnly(value: boolean) {\n this._isReadOnly = value;\n }\n\n /**\n * Gets the transformed measure, that is the bounding box of the control after applying all transformations\n */\n public get transformedMeasure(): Measure {\n return this._evaluatedMeasure;\n }\n\n /**\n * Gets or sets an object used to store user defined information for the node\n */\n @serialize()\n public metadata: any = null;\n\n /** Gets or sets a boolean indicating if the control can be hit with pointer events */\n @serialize()\n public isHitTestVisible = true;\n /** Gets or sets a boolean indicating if the control can block pointer events */\n @serialize()\n public isPointerBlocker = false;\n /** Gets or sets a boolean indicating if the control can be focusable */\n @serialize()\n public isFocusInvisible = false;\n\n /**\n * Gets or sets a boolean indicating if the children are clipped to the current control bounds.\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\n */\n @serialize()\n public clipChildren = true;\n\n /**\n * Gets or sets a boolean indicating that control content must be clipped\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\n */\n @serialize()\n public clipContent = true;\n\n /**\n * Gets or sets a boolean indicating that the current control should cache its rendering (useful when the control does not change often)\n */\n @serialize()\n public useBitmapCache = false;\n\n private _cacheData: Nullable<ImageData>;\n\n private _shadowOffsetX = 0;\n /** Gets or sets a value indicating the offset to apply on X axis to render the shadow */\n @serialize()\n public get shadowOffsetX() {\n return this._shadowOffsetX;\n }\n\n public set shadowOffsetX(value: number) {\n if (this._shadowOffsetX === value) {\n return;\n }\n\n this._shadowOffsetX = value;\n this._markAsDirty();\n }\n\n private _shadowOffsetY = 0;\n /** Gets or sets a value indicating the offset to apply on Y axis to render the shadow */\n @serialize()\n public get shadowOffsetY() {\n return this._shadowOffsetY;\n }\n\n public set shadowOffsetY(value: number) {\n if (this._shadowOffsetY === value) {\n return;\n }\n\n this._shadowOffsetY = value;\n this._markAsDirty();\n }\n\n private _shadowBlur = 0;\n private _previousShadowBlur = 0;\n /** Gets or sets a value indicating the amount of blur to use to render the shadow */\n @serialize()\n public get shadowBlur() {\n return this._shadowBlur;\n }\n\n public set shadowBlur(value: number) {\n if (this._shadowBlur === value) {\n return;\n }\n\n this._previousShadowBlur = this._shadowBlur;\n\n this._shadowBlur = value;\n this._markAsDirty();\n }\n\n private _shadowColor = \"black\";\n /** Gets or sets a value indicating the color of the shadow (black by default ie. \"#000\") */\n @serialize()\n public get shadowColor() {\n return this._shadowColor;\n }\n\n public set shadowColor(value: string) {\n if (this._shadowColor === value) {\n return;\n }\n\n this._shadowColor = value;\n this._markAsDirty();\n }\n\n /** Gets or sets the cursor to use when the control is hovered */\n @serialize()\n public hoverCursor = \"\";\n\n /** @hidden */\n protected _linkOffsetX = new ValueAndUnit(0);\n /** @hidden */\n protected _linkOffsetY = new ValueAndUnit(0);\n\n // Properties\n\n /** Gets the control type name */\n public get typeName(): string {\n return this._getTypeName();\n }\n\n /**\n * Get the current class name of the control.\n * @returns current class name\n */\n public getClassName(): string {\n return this._getTypeName();\n }\n\n /**\n * An event triggered when pointer wheel is scrolled\n */\n public onWheelObservable = new Observable<Vector2>();\n /**\n * An event triggered when the pointer moves over the control.\n */\n public onPointerMoveObservable = new Observable<Vector2>();\n\n /**\n * An event triggered when the pointer moves out of the control.\n */\n public onPointerOutObservable = new Observable<Control>();\n\n /**\n * An event triggered when the pointer taps the control\n */\n public onPointerDownObservable = new Observable<Vector2WithInfo>();\n\n /**\n * An event triggered when pointer up\n */\n public onPointerUpObservable = new Observable<Vector2WithInfo>();\n\n /**\n * An event triggered when a control is clicked on\n */\n public onPointerClickObservable = new Observable<Vector2WithInfo>();\n\n /**\n * An event triggered when pointer enters the control\n */\n public onPointerEnterObservable = new Observable<Control>();\n\n /**\n * An event triggered when the control is marked as dirty\n */\n public onDirtyObservable = new Observable<Control>();\n\n /**\n * An event triggered before drawing the control\n */\n public onBeforeDrawObservable = new Observable<Control>();\n\n /**\n * An event triggered after the control was drawn\n */\n public onAfterDrawObservable = new Observable<Control>();\n\n /**\n * An event triggered when the control has been disposed\n */\n public onDisposeObservable = new Observable<Control>();\n\n /**\n * Get the hosting AdvancedDynamicTexture\n */\n public get host(): AdvancedDynamicTexture {\n return this._host;\n }\n\n /** Gets or set information about font offsets (used to render and align text) */\n @serialize()\n public get fontOffset(): { ascent: number; height: number; descent: number } {\n return this._fontOffset;\n }\n\n public set fontOffset(offset: { ascent: number; height: number; descent: number }) {\n this._fontOffset = offset;\n }\n\n /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */\n @serialize()\n public get alpha(): number {\n return this._alpha;\n }\n\n public set alpha(value: number) {\n if (this._alpha === value) {\n return;\n }\n this._alphaSet = true;\n this._alpha = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)\n */\n public get highlightLineWidth(): number {\n return this._highlightLineWidth;\n }\n\n public set highlightLineWidth(value: number) {\n if (this._highlightLineWidth === value) {\n return;\n }\n\n this._highlightLineWidth = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)\n */\n public get isHighlighted(): boolean {\n return this._isHighlighted;\n }\n\n public set isHighlighted(value: boolean) {\n if (this._isHighlighted === value) {\n return;\n }\n\n this._isHighlighted = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a string defining the color to use for highlighting this control\n */\n public get highlightColor(): string {\n return this._highlightColor;\n }\n\n public set highlightColor(value: string) {\n if (this._highlightColor === value) {\n return;\n }\n\n this._highlightColor = value;\n this._markAsDirty();\n }\n\n /** Gets or sets a value indicating the scale factor on X axis (1 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get scaleX(): number {\n return this._scaleX;\n }\n\n public set scaleX(value: number) {\n if (this._scaleX === value) {\n return;\n }\n\n this._scaleX = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets a value indicating the scale factor on Y axis (1 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get scaleY(): number {\n return this._scaleY;\n }\n\n public set scaleY(value: number) {\n if (this._scaleY === value) {\n return;\n }\n\n this._scaleY = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets the rotation angle (0 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get rotation(): number {\n return this._rotation;\n }\n\n public set rotation(value: number) {\n if (this._rotation === value) {\n return;\n }\n\n this._rotation = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets the transformation center on Y axis (0 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get transformCenterY(): number {\n return this._transformCenterY;\n }\n\n public set transformCenterY(value: number) {\n if (this._transformCenterY === value) {\n return;\n }\n\n this._transformCenterY = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /** Gets or sets the transformation center on X axis (0 by default)\n * @see https://doc.babylonjs.com/how_to/gui#rotation-and-scaling\n */\n @serialize()\n public get transformCenterX(): number {\n return this._transformCenterX;\n }\n\n public set transformCenterX(value: number) {\n if (this._transformCenterX === value) {\n return;\n }\n\n this._transformCenterX = value;\n this._markAsDirty();\n this._markMatrixAsDirty();\n }\n\n /**\n * Gets or sets the horizontal alignment\n * @see https://doc.babylonjs.com/how_to/gui#alignments\n */\n @serialize()\n public get horizontalAlignment(): number {\n return this._horizontalAlignment;\n }\n\n public set horizontalAlignment(value: number) {\n if (this._horizontalAlignment === value) {\n return;\n }\n\n this._horizontalAlignment = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets the vertical alignment\n * @see https://doc.babylonjs.com/how_to/gui#alignments\n */\n @serialize()\n public get verticalAlignment(): number {\n return this._verticalAlignment;\n }\n\n public set verticalAlignment(value: number) {\n if (this._verticalAlignment === value) {\n return;\n }\n\n this._verticalAlignment = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a fixed ratio for this control.\n * When different from 0, the ratio is used to compute the \"second\" dimension.\n * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the\n * second dimension is computed as first dimension * fixedRatio\n */\n @serialize()\n public fixedRatio = 0;\n\n private _fixedRatioMasterIsWidth = true;\n\n /**\n * Gets or sets control width\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get width(): string | number {\n return this._width.toString(this._host);\n }\n\n public set width(value: string | number) {\n this._fixedRatioMasterIsWidth = true;\n\n if (this._width.toString(this._host) === value) {\n return;\n }\n\n if (this._width.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets the control width in pixel\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get widthInPixels(): number {\n return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set widthInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this._fixedRatioMasterIsWidth = true;\n this.width = value + \"px\";\n }\n\n /**\n * Gets or sets control height\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get height(): string | number {\n return this._height.toString(this._host);\n }\n\n public set height(value: string | number) {\n this._fixedRatioMasterIsWidth = false;\n\n if (this._height.toString(this._host) === value) {\n return;\n }\n\n if (this._height.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets control height in pixel\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get heightInPixels(): number {\n return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set heightInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this._fixedRatioMasterIsWidth = false;\n this.height = value + \"px\";\n }\n\n /** Gets or set font family */\n public get fontFamily(): string {\n return this._fontFamily;\n }\n\n public set fontFamily(value: string) {\n if (this._fontFamily === value) {\n return;\n }\n\n this._fontFamily = value;\n this._resetFontCache();\n }\n\n /** Gets or sets font style */\n public get fontStyle(): string {\n return this._fontStyle;\n }\n\n public set fontStyle(value: string) {\n if (this._fontStyle === value) {\n return;\n }\n\n this._fontStyle = value;\n this._resetFontCache();\n }\n\n /** Gets or sets font weight */\n public get fontWeight(): string {\n return this._fontWeight;\n }\n\n public set fontWeight(value: string) {\n if (this._fontWeight === value) {\n return;\n }\n\n this._fontWeight = value;\n this._resetFontCache();\n }\n\n /**\n * Gets or sets style\n * @see https://doc.babylonjs.com/how_to/gui#styles\n */\n @serialize()\n public get style(): Nullable<Style> {\n return this._style;\n }\n\n public set style(value: Nullable<Style>) {\n if (this._style) {\n this._style.onChangedObservable.remove(this._styleObserver);\n this._styleObserver = null;\n }\n\n this._style = value;\n\n if (this._style) {\n this._styleObserver = this._style.onChangedObservable.add(() => {\n this._markAsDirty();\n this._resetFontCache();\n });\n }\n\n this._markAsDirty();\n this._resetFontCache();\n }\n\n /** @hidden */\n public get _isFontSizeInPercentage(): boolean {\n return this._fontSize.isPercentage;\n }\n\n /** Gets or sets font size in pixels */\n public get fontSizeInPixels(): number {\n let fontSizeToUse = this._style ? this._style._fontSize : this._fontSize;\n\n if (fontSizeToUse.isPixel) {\n return fontSizeToUse.getValue(this._host);\n }\n\n return fontSizeToUse.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);\n }\n\n public set fontSizeInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.fontSize = value + \"px\";\n }\n\n /** Gets or sets font size */\n public get fontSize(): string | number {\n return this._fontSize.toString(this._host);\n }\n\n public set fontSize(value: string | number) {\n if (this._fontSize.toString(this._host) === value) {\n return;\n }\n\n if (this._fontSize.fromString(value)) {\n this._markAsDirty();\n this._resetFontCache();\n }\n }\n\n /** Gets or sets foreground color */\n @serialize()\n public get color(): string {\n return this._color;\n }\n\n public set color(value: string) {\n if (this._color === value) {\n return;\n }\n\n this._color = value;\n this._markAsDirty();\n }\n\n /** Gets or sets z index which is used to reorder controls on the z axis */\n @serialize()\n public get zIndex(): number {\n return this._zIndex;\n }\n\n public set zIndex(value: number) {\n if (this.zIndex === value) {\n return;\n }\n\n this._zIndex = value;\n\n if (this.parent) {\n this.parent._reOrderControl(this);\n }\n }\n\n /** Gets or sets a boolean indicating if the control can be rendered */\n @serialize()\n public get notRenderable(): boolean {\n return this._doNotRender;\n }\n\n public set notRenderable(value: boolean) {\n if (this._doNotRender === value) {\n return;\n }\n\n this._doNotRender = value;\n this._markAsDirty();\n }\n\n /** Gets or sets a boolean indicating if the control is visible */\n @serialize()\n public get isVisible(): boolean {\n return this._isVisible;\n }\n\n public set isVisible(value: boolean) {\n if (this._isVisible === value) {\n return;\n }\n\n this._isVisible = value;\n this._markAsDirty(true);\n }\n\n /** Gets a boolean indicating that the control needs to update its rendering */\n public get isDirty(): boolean {\n return this._isDirty;\n }\n\n /**\n * Gets the current linked mesh (or null if none)\n */\n public get linkedMesh(): Nullable<TransformNode> {\n return this._linkedMesh;\n }\n\n /**\n * Gets or sets a value indicating the padding should work like in CSS.\n * Basically, it will add the padding amount on each side of the parent control for its children.\n */\n @serialize()\n public get descendantsOnlyPadding(): boolean {\n return this._descendantsOnlyPadding;\n }\n\n public set descendantsOnlyPadding(value: boolean) {\n if (this._descendantsOnlyPadding === value) {\n return;\n }\n\n this._descendantsOnlyPadding = value;\n this._markAsDirty();\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the left of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingLeft(): string | number {\n return this._paddingLeft.toString(this._host);\n }\n\n public set paddingLeft(value: string | number) {\n if (this._paddingLeft.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the left of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingLeftInPixels(): number {\n return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set paddingLeftInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingLeft = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingLeftInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingLeftInPixels;\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the right of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingRight(): string | number {\n return this._paddingRight.toString(this._host);\n }\n\n public set paddingRight(value: string | number) {\n if (this._paddingRight.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the right of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingRightInPixels(): number {\n return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set paddingRightInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingRight = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingRightInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingRightInPixels;\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the top of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingTop(): string | number {\n return this._paddingTop.toString(this._host);\n }\n\n public set paddingTop(value: string | number) {\n if (this._paddingTop.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the top of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingTopInPixels(): number {\n return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set paddingTopInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingTop = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingTopInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingTopInPixels;\n }\n\n /**\n * Gets or sets a value indicating the padding to use on the bottom of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get paddingBottom(): string | number {\n return this._paddingBottom.toString(this._host);\n }\n\n public set paddingBottom(value: string | number) {\n if (this._paddingBottom.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the padding in pixels to use on the bottom of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get paddingBottomInPixels(): number {\n return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set paddingBottomInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.paddingBottom = value + \"px\";\n }\n\n /** @hidden */\n public get _paddingBottomInPixels(): number {\n if (this._descendantsOnlyPadding) {\n return 0;\n }\n\n return this.paddingBottomInPixels;\n }\n\n /**\n * Gets or sets a value indicating the left coordinate of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get left(): string | number {\n return this._left.toString(this._host);\n }\n\n public set left(value: string | number) {\n if (this._left.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the left coordinate in pixels of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get leftInPixels(): number {\n return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set leftInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.left = value + \"px\";\n }\n\n /**\n * Gets or sets a value indicating the top coordinate of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n @serialize()\n public get top(): string | number {\n return this._top.toString(this._host);\n }\n\n public set top(value: string | number) {\n if (this._top.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the top coordinate in pixels of the control\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public get topInPixels(): number {\n return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set topInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.top = value + \"px\";\n }\n\n /**\n * Gets or sets a value indicating the offset on X axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n @serialize()\n public get linkOffsetX(): string | number {\n return this._linkOffsetX.toString(this._host);\n }\n\n public set linkOffsetX(value: string | number) {\n if (this._linkOffsetX.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n public get linkOffsetXInPixels(): number {\n return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);\n }\n\n public set linkOffsetXInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.linkOffsetX = value + \"px\";\n }\n\n /**\n * Gets or sets a value indicating the offset on Y axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n @serialize()\n public get linkOffsetY(): string | number {\n return this._linkOffsetY.toString(this._host);\n }\n\n public set linkOffsetY(value: string | number) {\n if (this._linkOffsetY.fromString(value)) {\n this._markAsDirty();\n }\n }\n\n /**\n * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n public get linkOffsetYInPixels(): number {\n return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);\n }\n\n public set linkOffsetYInPixels(value: number) {\n if (isNaN(value)) {\n return;\n }\n this.linkOffsetY = value + \"px\";\n }\n\n /** Gets the center coordinate on X axis */\n public get centerX(): number {\n return this._currentMeasure.left + this._currentMeasure.width / 2;\n }\n\n /** Gets the center coordinate on Y axis */\n public get centerY(): number {\n return this._currentMeasure.top + this._currentMeasure.height / 2;\n }\n\n /** Gets or sets if control is Enabled */\n @serialize()\n public get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n public set isEnabled(value: boolean) {\n if (this._isEnabled === value) {\n return;\n }\n\n this._isEnabled = value;\n this._markAsDirty();\n }\n /** Gets or sets background color of control if it's disabled */\n @serialize()\n public get disabledColor(): string {\n return this._disabledColor;\n }\n\n public set disabledColor(value: string) {\n if (this._disabledColor === value) {\n return;\n }\n\n this._disabledColor = value;\n this._markAsDirty();\n }\n /** Gets or sets front color of control if it's disabled */\n @serialize()\n public get disabledColorItem(): string {\n return this._disabledColorItem;\n }\n\n public set disabledColorItem(value: string) {\n if (this._disabledColorItem === value) {\n return;\n }\n\n this._disabledColorItem = value;\n this._markAsDirty();\n }\n\n /**\n * Gets/sets the overlap group of the control.\n * Controls with overlapGroup set to a number can be deoverlapped.\n * Controls with overlapGroup set to undefined are not deoverlapped.\n * @see https://doc.babylonjs.com/how_to/gui#deoverlapping\n */\n @serialize()\n public overlapGroup?: number;\n /**\n * Gets/sets the deoverlap movement multiplier\n */\n @serialize()\n public overlapDeltaMultiplier?: number;\n\n // Functions\n\n /**\n * Creates a new control\n * @param name defines the name of the control\n */\n constructor(\n /** defines the name of the control */\n public name?: string\n ) { }\n\n /** @hidden */\n protected _getTypeName(): string {\n return \"Control\";\n }\n\n /**\n * Gets the first ascendant in the hierarchy of the given type\n * @param className defines the required type\n * @returns the ascendant or null if not found\n */\n public getAscendantOfClass(className: string): Nullable<Control> {\n if (!this.parent) {\n return null;\n }\n\n if (this.parent.getClassName() === className) {\n return this.parent;\n }\n\n return this.parent.getAscendantOfClass(className);\n }\n\n /** @hidden */\n public _resetFontCache(): void {\n this._fontSet = true;\n this._markAsDirty();\n }\n\n /**\n * Determines if a container is an ascendant of the current control\n * @param container defines the container to look for\n * @returns true if the container is one of the ascendant of the control\n */\n public isAscendant(container: Control): boolean {\n if (!this.parent) {\n return false;\n }\n\n if (this.parent === container) {\n return true;\n }\n\n return this.parent.isAscendant(container);\n }\n\n /**\n * Gets coordinates in local control space\n * @param globalCoordinates defines the coordinates to transform\n * @returns the new coordinates in local space\n */\n public getLocalCoordinates(globalCoordinates: Vector2): Vector2 {\n var result = Vector2.Zero();\n\n this.getLocalCoordinatesToRef(globalCoordinates, result);\n\n return result;\n }\n\n /**\n * Gets coordinates in local control space\n * @param globalCoordinates defines the coordinates to transform\n * @param result defines the target vector2 where to store the result\n * @returns the current control\n */\n public getLocalCoordinatesToRef(globalCoordinates: Vector2, result: Vector2): Control {\n result.x = globalCoordinates.x - this._currentMeasure.left;\n result.y = globalCoordinates.y - this._currentMeasure.top;\n return this;\n }\n\n /**\n * Gets coordinates in parent local control space\n * @param globalCoordinates defines the coordinates to transform\n * @returns the new coordinates in parent local space\n */\n public getParentLocalCoordinates(globalCoordinates: Vector2): Vector2 {\n var result = Vector2.Zero();\n\n result.x = globalCoordinates.x - this._cachedParentMeasure.left;\n result.y = globalCoordinates.y - this._cachedParentMeasure.top;\n\n return result;\n }\n\n /**\n * Move the current control to a vector3 position projected onto the screen.\n * @param position defines the target position\n * @param scene defines the hosting scene\n */\n public moveToVector3(position: Vector3, scene: Scene): void {\n if (!this._host || this.parent !== this._host._rootContainer) {\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\n return;\n }\n\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\n\n var globalViewport = this._host._getGlobalViewport();\n var projectedPosition = Vector3.Project(position, Matrix.Identity(), scene.getTransformMatrix(), globalViewport);\n\n this._moveToProjectedPosition(projectedPosition);\n\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\n this.notRenderable = true;\n return;\n }\n this.notRenderable = false;\n }\n\n /**\n * Will store all controls that have this control as ascendant in a given array\n * @param results defines the array where to store the descendants\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\n */\n public getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\n // Do nothing by default\n }\n\n /**\n * Will return all controls that have this control as ascendant\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\n * @return all child controls\n */\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\n var results = new Array<Control>();\n\n this.getDescendantsToRef(results, directDescendantsOnly, predicate);\n\n return results;\n }\n\n /**\n * Link current control with a target mesh\n * @param mesh defines the mesh to link with\n * @see https://doc.babylonjs.com/how_to/gui#tracking-positions\n */\n public linkWithMesh(mesh: Nullable<TransformNode>): void {\n if (!this._host || (this.parent && this.parent !== this._host._rootContainer)) {\n if (mesh) {\n Tools.Error(\"Cannot link a control to a mesh if the control is not at root level\");\n }\n return;\n }\n\n var index = this._host._linkedControls.indexOf(this);\n if (index !== -1) {\n this._linkedMesh = mesh;\n if (!mesh) {\n this._host._linkedControls.splice(index, 1);\n }\n return;\n } else if (!mesh) {\n return;\n }\n\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\n this._linkedMesh = mesh;\n this._host._linkedControls.push(this);\n }\n\n /**\n * Shorthand funtion to set the top, right, bottom, and left padding values on the control.\n * @param { string | number} paddingTop - The value of the top padding.\n * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.\n * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.\n * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public setPadding(paddingTop: string | number, paddingRight?: string | number, paddingBottom?: string | number, paddingLeft?: string | number) {\n const top = paddingTop;\n const right = paddingRight ?? top;\n const bottom = paddingBottom ?? top;\n const left = paddingLeft ?? right;\n\n this.paddingTop = top;\n this.paddingRight = right;\n this.paddingBottom = bottom;\n this.paddingLeft = left;\n }\n\n /**\n * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.\n * @param { number} paddingTop - The value in pixels of the top padding.\n * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.\n * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.\n * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.\n * @see https://doc.babylonjs.com/how_to/gui#position-and-size\n */\n public setPaddingInPixels(paddingTop: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number) {\n const top = paddingTop;\n const right = paddingRight ?? top;\n const bottom = paddingBottom ?? top;\n const left = paddingLeft ?? right;\n\n this.paddingTopInPixels = top;\n this.paddingRightInPixels = right;\n this.paddingBottomInPixels = bottom;\n this.paddingLeftInPixels = left;\n }\n\n /** @hidden */\n public _moveToProjectedPosition(projectedPosition: Vector3): void {\n let oldLeft = this._left.getValue(this._host);\n let oldTop = this._top.getValue(this._host);\n\n if (this._currentMeasure.width === 0 && this._currentMeasure.height === 0) {\n let parentMeasure = this.parent?._currentMeasure;\n if (parentMeasure) {\n this._processMeasures(parentMeasure, this._host.getContext());\n }\n }\n\n var newLeft = projectedPosition.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2;\n var newTop = projectedPosition.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;\n\n if (this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling) {\n if (Math.abs(newLeft - oldLeft) < 0.5) {\n newLeft = oldLeft;\n }\n\n if (Math.abs(newTop - oldTop) < 0.5) {\n newTop = oldTop;\n }\n }\n\n this.left = newLeft + \"px\";\n this.top = newTop + \"px\";\n\n this._left.ignoreAdaptiveScaling = true;\n this._top.ignoreAdaptiveScaling = true;\n this._markAsDirty();\n }\n\n /** @hidden */\n public _offsetLeft(offset: number) {\n this._isDirty = true;\n this._currentMeasure.left += offset;\n }\n\n /** @hidden */\n public _offsetTop(offset: number) {\n this._isDirty = true;\n this._currentMeasure.top += offset;\n }\n\n /** @hidden */\n public _markMatrixAsDirty(): void {\n this._isMatrixDirty = true;\n this._flagDescendantsAsMatrixDirty();\n }\n\n /** @hidden */\n public _flagDescendantsAsMatrixDirty(): void {\n // No child\n }\n\n /** @hidden */\n public _intersectsRect(rect: Measure) {\n // Rotate the control's current measure into local space and check if it intersects the passed in rectangle\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\n if (this._tmpMeasureA.left >= rect.left + rect.width) {\n return false;\n }\n\n if (this._tmpMeasureA.top >= rect.top + rect.height) {\n return false;\n }\n\n if (this._tmpMeasureA.left + this._tmpMeasureA.width <= rect.left) {\n return false;\n }\n\n if (this._tmpMeasureA.top + this._tmpMeasureA.height <= rect.top) {\n return false;\n }\n\n return true;\n }\n\n /** @hidden */\n protected _computeAdditionnalOffsetX() {\n return 0;\n }\n\n /** @hidden */\n protected _computeAdditionnalOffsetY() {\n return 0;\n }\n\n /** @hidden */\n protected invalidateRect() {\n this._transform();\n if (this.host && this.host.useInvalidateRectOptimization) {\n // Rotate by transform to get the measure transformed to global space\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\n // get the boudning box of the current measure and last frames measure in global space and invalidate it\n // the previous measure is used to properly clear a control that is scaled down\n Measure.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);\n\n // Expand rect based on shadows\n var shadowOffsetX = this.shadowOffsetX;\n var shadowOffsetY = this.shadowOffsetY;\n var shadowBlur = Math.max(this._previousShadowBlur, this.shadowBlur);\n\n var leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\n var rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\n var topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\n var bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\n\n const offsetX = this._computeAdditionnalOffsetX();\n const offsetY = this._computeAdditionnalOffsetY();\n\n this.host.invalidateRect(\n Math.floor(this._tmpMeasureA.left + leftShadowOffset - offsetX),\n Math.floor(this._tmpMeasureA.top + topShadowOffset - offsetY),\n Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + rightShadowOffset + offsetX),\n Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + bottomShadowOffset + offsetY)\n );\n }\n }\n\n /** @hidden */\n public _markAsDirty(force = false): void {\n if (!this._isVisible && !force) {\n return;\n }\n\n this._isDirty = true;\n\n // Redraw only this rectangle\n if (this._host) {\n this._host.markAsDirty();\n }\n }\n\n /** @hidden */\n public _markAllAsDirty(): void {\n this._markAsDirty();\n\n if (this._font) {\n this._prepareFont();\n }\n }\n\n /** @hidden */\n public _link(host: AdvancedDynamicTexture): void {\n this._host = host;\n if (this._host) {\n this.uniqueId = this._host.getScene()!.getUniqueId();\n }\n }\n\n /** @hidden */\n protected _transform(context?: ICanvasRenderingContext): void {\n if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0) {\n return;\n }\n\n // postTranslate\n var offsetX = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left;\n var offsetY = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;\n if (context) {\n context.translate(offsetX, offsetY);\n\n // rotate\n context.rotate(this._rotation);\n\n // scale\n context.scale(this._scaleX, this._scaleY);\n\n // preTranslate\n context.translate(-offsetX, -offsetY);\n }\n // Need to update matrices?\n if (this._isMatrixDirty || this._cachedOffsetX !== offsetX || this._cachedOffsetY !== offsetY) {\n this._cachedOffsetX = offsetX;\n this._cachedOffsetY = offsetY;\n this._isMatrixDirty = false;\n this._flagDescendantsAsMatrixDirty();\n\n Matrix2D.ComposeToRef(-offsetX, -offsetY, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix);\n\n this._transformMatrix.invertToRef(this._invertTransformMatrix);\n }\n }\n\n /** @hidden */\n public _renderHighlight(context: ICanvasRenderingContext): void {\n if (!this.isHighlighted) {\n return;\n }\n\n context.save();\n context.strokeStyle = this._highlightColor;\n context.lineWidth = this._highlightLineWidth;\n\n this._renderHighlightSpecific(context);\n context.restore();\n }\n\n /** @hidden */\n public _renderHighlightSpecific(context: ICanvasRenderingContext): void {\n context.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\n }\n\n /** @hidden */\n protected _applyStates(context: ICanvasRenderingContext): void {\n if (this._isFontSizeInPercentage) {\n this._fontSet = true;\n }\n\n if (this._host && this._host.useSmallestIdeal && !this._font) {\n this._fontSet = true;\n }\n\n if (this._fontSet) {\n this._prepareFont();\n this._fontSet = false;\n }\n\n if (this._font) {\n context.font = this._font;\n }\n\n if (this._color) {\n context.fillStyle = this._color;\n }\n\n if (Control.AllowAlphaInheritance) {\n context.globalAlpha *= this._alpha;\n } else if (this._alphaSet) {\n context.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha;\n }\n }\n\n /** @hidden */\n public _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\n return false;\n }\n\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\n this.host._numLayoutCalls++;\n\n this._currentMeasure.addAndTransformToRef(\n this._transformMatrix,\n -this._paddingLeftInPixels | 0,\n -this._paddingTopInPixels | 0,\n this._paddingRightInPixels | 0,\n this._paddingBottomInPixels | 0,\n this._prevCurrentMeasureTransformedIntoGlobalSpace\n );\n\n context.save();\n\n this._applyStates(context);\n\n let rebuildCount = 0;\n do {\n this._rebuildLayout = false;\n this._processMeasures(parentMeasure, context);\n rebuildCount++;\n } while (this._rebuildLayout && rebuildCount < 3);\n\n if (rebuildCount >= 3) {\n Logger.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`);\n }\n\n context.restore();\n this.invalidateRect();\n this._evaluateClippingState(parentMeasure);\n }\n\n this._wasDirty = this._isDirty;\n this._isDirty = false;\n\n return true;\n }\n\n /** @hidden */\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n this._tempPaddingMeasure.copyFrom(parentMeasure);\n\n // Apply padding if in correct mode\n if (this.parent && this.parent.descendantsOnlyPadding) {\n this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels;\n this._tempPaddingMeasure.top += this.parent.paddingTopInPixels;\n this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels;\n this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels;\n }\n\n this._currentMeasure.copyFrom(this._tempPaddingMeasure);\n\n // Let children take some pre-measurement actions\n this._preMeasure(this._tempPaddingMeasure, context);\n\n this._measure();\n this._computeAlignment(this._tempPaddingMeasure, context);\n\n // Convert to int values\n this._currentMeasure.left = this._currentMeasure.left | 0;\n this._currentMeasure.top = this._currentMeasure.top | 0;\n this._currentMeasure.width = this._currentMeasure.width | 0;\n this._currentMeasure.height = this._currentMeasure.height | 0;\n\n // Let children add more features\n this._additionalProcessing(this._tempPaddingMeasure, context);\n\n this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure);\n\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\n if (this.onDirtyObservable.hasObservers()) {\n this.onDirtyObservable.notifyObservers(this);\n }\n }\n\n protected _evaluateClippingState(parentMeasure: Measure) {\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\n if (this.parent && this.parent.clipChildren) {\n parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);\n // Early clip\n if (this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {\n this._isClipped = true;\n return;\n }\n\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {\n this._isClipped = true;\n return;\n }\n\n if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {\n this._isClipped = true;\n return;\n }\n\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {\n this._isClipped = true;\n return;\n }\n }\n\n this._isClipped = false;\n }\n\n /** @hidden */\n public _measure(): void {\n // Width / Height\n if (this._width.isPixel) {\n this._currentMeasure.width = this._width.getValue(this._host);\n } else {\n this._currentMeasure.width *= this._width.getValue(this._host);\n }\n\n if (this._height.isPixel) {\n this._currentMeasure.height = this._height.getValue(this._host);\n } else {\n this._currentMeasure.height *= this._height.getValue(this._host);\n }\n\n if (this.fixedRatio !== 0) {\n if (this._fixedRatioMasterIsWidth) {\n this._currentMeasure.height = this._currentMeasure.width * this.fixedRatio;\n } else {\n this._currentMeasure.width = this._currentMeasure.height * this.fixedRatio;\n }\n }\n }\n\n /** @hidden */\n protected _computeAlignment(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n var width = this._currentMeasure.width;\n var height = this._currentMeasure.height;\n\n var parentWidth = parentMeasure.width;\n var parentHeight = parentMeasure.height;\n\n // Left / top\n var x = 0;\n var y = 0;\n\n switch (this.horizontalAlignment) {\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\n x = 0;\n break;\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\n x = parentWidth - width;\n break;\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\n x = (parentWidth - width) / 2;\n break;\n }\n\n switch (this.verticalAlignment) {\n case Control.VERTICAL_ALIGNMENT_TOP:\n y = 0;\n break;\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\n y = parentHeight - height;\n break;\n case Control.VERTICAL_ALIGNMENT_CENTER:\n y = (parentHeight - height) / 2;\n break;\n }\n\n if (!this.descendantsOnlyPadding) {\n if (this._paddingLeft.isPixel) {\n this._currentMeasure.left += this._paddingLeft.getValue(this._host);\n this._currentMeasure.width -= this._paddingLeft.getValue(this._host);\n } else {\n this._currentMeasure.left += parentWidth * this._paddingLeft.getValue(this._host);\n this._currentMeasure.width -= parentWidth * this._paddingLeft.getValue(this._host);\n }\n\n if (this._paddingRight.isPixel) {\n this._currentMeasure.width -= this._paddingRight.getValue(this._host);\n } else {\n this._currentMeasure.width -= parentWidth * this._paddingRight.getValue(this._host);\n }\n\n if (this._paddingTop.isPixel) {\n this._currentMeasure.top += this._paddingTop.getValue(this._host);\n this._currentMeasure.height -= this._paddingTop.getValue(this._host);\n } else {\n this._currentMeasure.top += parentHeight * this._paddingTop.getValue(this._host);\n this._currentMeasure.height -= parentHeight * this._paddingTop.getValue(this._host);\n }\n\n if (this._paddingBottom.isPixel) {\n this._currentMeasure.height -= this._paddingBottom.getValue(this._host);\n } else {\n this._currentMeasure.height -= parentHeight * this._paddingBottom.getValue(this._host);\n }\n }\n\n if (this._left.isPixel) {\n this._currentMeasure.left += this._left.getValue(this._host);\n } else {\n this._currentMeasure.left += parentWidth * this._left.getValue(this._host);\n }\n\n if (this._top.isPixel) {\n this._currentMeasure.top += this._top.getValue(this._host);\n } else {\n this._currentMeasure.top += parentHeight * this._top.getValue(this._host);\n }\n\n this._currentMeasure.left += x;\n this._currentMeasure.top += y;\n }\n\n /** @hidden */\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n // Do nothing\n }\n\n /** @hidden */\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\n // Do nothing\n }\n\n /** @hidden */\n protected _clipForChildren(context: ICanvasRenderingContext): void {\n // DO nothing\n }\n\n private static _ClipMeasure = new Measure(0, 0, 0, 0);\n private _tmpMeasureA = new Measure(0, 0, 0, 0);\n private _clip(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>) {\n context.beginPath();\n Control._ClipMeasure.copyFrom(this._currentMeasure);\n if (invalidatedRectangle) {\n // Rotate the invalidated rect into the control's space\n invalidatedRectangle.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);\n\n // Get the intersection of the rect in context space and the current context\n var intersection = new Measure(0, 0, 0, 0);\n intersection.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left);\n intersection.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top);\n intersection.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - intersection.left;\n intersection.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - intersection.top;\n Control._ClipMeasure.copyFrom(intersection);\n }\n\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\n var shadowOffsetX = this.shadowOffsetX;\n var shadowOffsetY = this.shadowOffsetY;\n var shadowBlur = this.shadowBlur;\n\n var leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\n var rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\n var topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\n var bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\n\n context.rect(\n Control._ClipMeasure.left + leftShadowOffset,\n Control._ClipMeasure.top + topShadowOffset,\n Control._ClipMeasure.width + rightShadowOffset - leftShadowOffset,\n Control._ClipMeasure.height + bottomShadowOffset - topShadowOffset\n );\n } else {\n context.rect(Control._ClipMeasure.left, Control._ClipMeasure.top, Control._ClipMeasure.width, Control._ClipMeasure.height);\n }\n\n context.clip();\n }\n\n /** @hidden */\n public _render(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): boolean {\n if (!this.isVisible || this.notRenderable || this._isClipped) {\n this._isDirty = false;\n return false;\n }\n\n this.host._numRenderCalls++;\n\n context.save();\n\n this._applyStates(context);\n\n // Transform\n this._transform(context);\n\n // Clip\n if (this.clipContent) {\n this._clip(context, invalidatedRectangle);\n }\n\n if (this.onBeforeDrawObservable.hasObservers()) {\n this.onBeforeDrawObservable.notifyObservers(this);\n }\n\n if (this.useBitmapCache && !this._wasDirty && this._cacheData) {\n context.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top);\n } else {\n this._draw(context, invalidatedRectangle);\n }\n\n if (this.useBitmapCache && this._wasDirty) {\n this._cacheData = context.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\n }\n\n this._renderHighlight(context);\n\n if (this.onAfterDrawObservable.hasObservers()) {\n this.onAfterDrawObservable.notifyObservers(this);\n }\n\n context.restore();\n\n return true;\n }\n\n /** @hidden */\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\n // Do nothing\n }\n\n /**\n * Tests if a given coordinates belong to the current control\n * @param x defines x coordinate to test\n * @param y defines y coordinate to test\n * @returns true if the coordinates are inside the control\n */\n public contains(x: number, y: number): boolean {\n // Invert transform\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\n\n x = this._transformedPosition.x;\n y = this._transformedPosition.y;\n\n // Check\n if (x < this._currentMeasure.left) {\n return false;\n }\n\n if (x > this._currentMeasure.left + this._currentMeasure.width) {\n return false;\n }\n\n if (y < this._currentMeasure.top) {\n return false;\n }\n\n if (y > this._currentMeasure.top + this._currentMeasure.height) {\n return false;\n }\n\n if (this.isPointerBlocker) {\n this._host._shouldBlockPointer = true;\n }\n return true;\n }\n\n /** @hidden */\n public _processPicking(x: number, y: number, pi: PointerInfoBase, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\n if (!this._isEnabled) {\n return false;\n }\n if (!this.isHitTestVisible || !this.isVisible || this._doNotRender) {\n return false;\n }\n\n if (!this.contains(x, y)) {\n return false;\n }\n\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\n\n return true;\n }\n\n /** @hidden */\n public _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\n var canNotify: boolean = this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\n }\n }\n\n /** @hidden */\n public _onPointerEnter(target: Control, pi: PointerInfoBase): boolean {\n if (!this._isEnabled) {\n return false;\n }\n if (this._enterCount > 0) {\n return false;\n }\n\n if (this._enterCount === -1) {\n // -1 is for touch input, we are now sure we are with a mouse or pencil\n this._enterCount = 0;\n }\n this._enterCount++;\n\n var canNotify: boolean = this.onPointerEnterObservable.notifyObservers(this, -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerEnter(target, pi);\n }\n\n return true;\n }\n\n /** @hidden */\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\n if (!force && (!this._isEnabled || target === this)) {\n return;\n }\n this._enterCount = 0;\n\n var canNotify: boolean = true;\n\n if (!target.isAscendant(this)) {\n canNotify = this.onPointerOutObservable.notifyObservers(this, -1, target, this, pi);\n }\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerOut(target, pi, force);\n }\n }\n\n /** @hidden */\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\n // Prevent pointerout to lose control context.\n // Event redundancy is checked inside the function.\n this._onPointerEnter(this, pi);\n\n if (this._downCount !== 0) {\n return false;\n }\n\n this._downCount++;\n\n this._downPointerIds[pointerId] = true;\n\n var canNotify: boolean = this.onPointerDownObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\n }\n\n return true;\n }\n\n /** @hidden */\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi?: PointerInfoBase): void {\n if (!this._isEnabled) {\n return;\n }\n this._downCount = 0;\n\n delete this._downPointerIds[pointerId];\n\n var canNotifyClick: boolean = notifyClick;\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\n }\n var canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\n\n if (canNotify && this.parent != null) {\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\n }\n }\n\n /** @hidden */\n public _forcePointerUp(pointerId: Nullable<number> = null) {\n if (pointerId !== null) {\n this._onPointerUp(this, Vector2.Zero(), pointerId, 0, true);\n } else {\n for (var key in this._downPointerIds) {\n this._onPointerUp(this, Vector2.Zero(), +key as number, 0, true);\n }\n }\n }\n\n /** @hidden */\n public _onWheelScroll(deltaX?: number, deltaY?: number): void {\n if (!this._isEnabled) {\n return;\n }\n var canNotify: boolean = this.onWheelObservable.notifyObservers(new Vector2(deltaX, deltaY));\n\n if (canNotify && this.parent != null) {\n this.parent._onWheelScroll(deltaX, deltaY);\n }\n }\n\n /** @hidden */\n public _onCanvasBlur(): void { }\n\n /** @hidden */\n public _processObservables(type: number, x: number, y: number, pi: PointerInfoBase, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\n if (!this._isEnabled) {\n return false;\n }\n this._dummyVector2.copyFromFloats(x, y);\n if (type === PointerEventTypes.POINTERMOVE) {\n this._onPointerMove(this, this._dummyVector2, pointerId, pi);\n\n var previousControlOver = this._host._lastControlOver[pointerId];\n if (previousControlOver && previousControlOver !== this) {\n previousControlOver._onPointerOut(this, pi);\n }\n\n if (previousControlOver !== this) {\n this._onPointerEnter(this, pi);\n }\n\n this._host._lastControlOver[pointerId] = this;\n return true;\n }\n\n if (type === PointerEventTypes.POINTERDOWN) {\n this._onPointerDown(this, this._dummyVector2, pointerId, buttonIndex, pi);\n this._host._registerLastControlDown(this, pointerId);\n this._host._lastPickedControl = this;\n return true;\n }\n\n if (type === PointerEventTypes.POINTERUP) {\n if (this._host._lastControlDown[pointerId]) {\n this._host._lastControlDown[pointerId]._onPointerUp(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\n }\n delete this._host._lastControlDown[pointerId];\n return true;\n }\n\n if (type === PointerEventTypes.POINTERWHEEL) {\n if (this._host._lastControlOver[pointerId]) {\n this._host._lastControlOver[pointerId]._onWheelScroll(deltaX, deltaY);\n return true;\n }\n }\n\n return false;\n }\n\n private _prepareFont() {\n if (!this._font && !this._fontSet) {\n return;\n }\n\n if (this._style) {\n this._font = this._style.fontStyle + \" \" + this._style.fontWeight + \" \" + this.fontSizeInPixels + \"px \" + this._style.fontFamily;\n } else {\n this._font = this._fontStyle + \" \" + this._fontWeight + \" \" + this.fontSizeInPixels + \"px \" + this._fontFamily;\n }\n\n this._fontOffset = Control._GetFontOffset(this._font);\n\n //children need to be refreshed\n this.getDescendants().forEach((child) => child._markAllAsDirty());\n }\n\n /**\n * Serializes the current control\n * @param serializationObject defined the JSON serialized object\n */\n public serialize(serializationObject: any) {\n SerializationHelper.Serialize(this, serializationObject);\n serializationObject.name = this.name;\n serializationObject.className = this.getClassName();\n\n if (this._font) {\n serializationObject.fontFamily = this._fontFamily;\n serializationObject.fontSize = this.fontSize;\n serializationObject.fontWeight = this.fontWeight;\n serializationObject.fontStyle = this.fontStyle;\n }\n }\n\n /** @hidden */\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\n if (serializedObject.fontFamily) {\n this.fontFamily = serializedObject.fontFamily;\n }\n\n if (serializedObject.fontSize) {\n this.fontSize = serializedObject.fontSize;\n }\n\n if (serializedObject.fontWeight) {\n this.fontWeight = serializedObject.fontWeight;\n }\n\n if (serializedObject.fontStyle) {\n this.fontStyle = serializedObject.fontStyle;\n }\n }\n\n /** Releases associated resources */\n public dispose() {\n this.onDirtyObservable.clear();\n this.onBeforeDrawObservable.clear();\n this.onAfterDrawObservable.clear();\n this.onPointerDownObservable.clear();\n this.onPointerEnterObservable.clear();\n this.onPointerMoveObservable.clear();\n this.onPointerOutObservable.clear();\n this.onPointerUpObservable.clear();\n this.onPointerClickObservable.clear();\n this.onWheelObservable.clear();\n\n if (this._styleObserver && this._style) {\n this._style.onChangedObservable.remove(this._styleObserver);\n this._styleObserver = null;\n }\n\n if (this.parent) {\n this.parent.removeControl(this);\n this.parent = null;\n }\n\n if (this._host) {\n var index = this._host._linkedControls.indexOf(this);\n if (index > -1) {\n this.linkWithMesh(null);\n }\n }\n\n // Callback\n this.onDisposeObservable.notifyObservers(this);\n this.onDisposeObservable.clear();\n }\n\n // Statics\n private static _HORIZONTAL_ALIGNMENT_LEFT = 0;\n private static _HORIZONTAL_ALIGNMENT_RIGHT = 1;\n private static _HORIZONTAL_ALIGNMENT_CENTER = 2;\n\n private static _VERTICAL_ALIGNMENT_TOP = 0;\n private static _VERTICAL_ALIGNMENT_BOTTOM = 1;\n private static _VERTICAL_ALIGNMENT_CENTER = 2;\n\n /** HORIZONTAL_ALIGNMENT_LEFT */\n public static get HORIZONTAL_ALIGNMENT_LEFT(): number {\n return Control._HORIZONTAL_ALIGNMENT_LEFT;\n }\n\n /** HORIZONTAL_ALIGNMENT_RIGHT */\n public static get HORIZONTAL_ALIGNMENT_RIGHT(): number {\n return Control._HORIZONTAL_ALIGNMENT_RIGHT;\n }\n\n /** HORIZONTAL_ALIGNMENT_CENTER */\n public static get HORIZONTAL_ALIGNMENT_CENTER(): number {\n return Control._HORIZONTAL_ALIGNMENT_CENTER;\n }\n\n /** VERTICAL_ALIGNMENT_TOP */\n public static get VERTICAL_ALIGNMENT_TOP(): number {\n return Control._VERTICAL_ALIGNMENT_TOP;\n }\n\n /** VERTICAL_ALIGNMENT_BOTTOM */\n public static get VERTICAL_ALIGNMENT_BOTTOM(): number {\n return Control._VERTICAL_ALIGNMENT_BOTTOM;\n }\n\n /** VERTICAL_ALIGNMENT_CENTER */\n public static get VERTICAL_ALIGNMENT_CENTER(): number {\n return Control._VERTICAL_ALIGNMENT_CENTER;\n }\n\n private static _FontHeightSizes: { [key: string]: { ascent: number; height: number; descent: number } } = {};\n\n /** @hidden */\n public static _GetFontOffset(font: string): { ascent: number; height: number; descent: number } {\n if (Control._FontHeightSizes[font]) {\n return Control._FontHeightSizes[font];\n }\n\n const engine = Engine.LastCreatedEngine;\n if (!engine) {\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\n }\n\n var result = engine.getFontOffset(font);\n Control._FontHeightSizes[font] = result;\n\n return result;\n }\n\n /**\n * Creates a Control from parsed data\n * @param serializedObject defines parsed data\n * @param host defines the hosting AdvancedDynamicTexture\n * @returns a new Control\n */\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture): Control {\n let controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\n let control = SerializationHelper.Parse(() => new controlType(), serializedObject, null);\n\n control.name = serializedObject.name;\n\n control._parseFromContent(serializedObject, host);\n\n return control;\n }\n\n /**\n * Creates a stack panel that can be used to render headers\n * @param control defines the control to associate with the header\n * @param text defines the text of the header\n * @param size defines the size of the header\n * @param options defines options used to configure the header\n * @returns a new StackPanel\n * @ignore\n * @hidden\n */\n public static AddHeader: (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }) => any = () => { };\n\n /** @hidden */\n protected static drawEllipse(x: number, y: number, width: number, height: number, context: ICanvasRenderingContext): void {\n context.translate(x, y);\n context.scale(width, height);\n\n context.beginPath();\n context.arc(0, 0, 1, 0, 2 * Math.PI);\n context.closePath();\n\n context.scale(1 / width, 1 / height);\n context.translate(-x, -y);\n }\n}\nRegisterClass(\"BABYLON.GUI.Control\", Control);\n"]}
@@ -18,7 +18,11 @@ export declare enum TextWrapping {
18
18
  /**
19
19
  * Ellipsize the text, i.e. shrink with trailing … when text is larger than Control.width.
20
20
  */
21
- Ellipsis = 2
21
+ Ellipsis = 2,
22
+ /**
23
+ * Wrap the text word-wise and clip the text when the text's height is larger than the Control.height, and shrink the last line with trailing … .
24
+ */
25
+ WordWrapEllipsis = 3
22
26
  }
23
27
  /**
24
28
  * Class used to create text block control
@@ -151,11 +155,13 @@ export declare class TextBlock extends Control {
151
155
  /** @hidden */
152
156
  _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void;
153
157
  protected _applyStates(context: ICanvasRenderingContext): void;
154
- protected _breakLines(refWidth: number, context: ICanvasRenderingContext): object[];
158
+ protected _breakLines(refWidth: number, refHeight: number, context: ICanvasRenderingContext): object[];
155
159
  protected _parseLine(line: string | undefined, context: ICanvasRenderingContext): object;
156
160
  protected _parseLineEllipsis(line: string | undefined, width: number, context: ICanvasRenderingContext): object;
157
161
  protected _parseLineWordWrap(line: string | undefined, width: number, context: ICanvasRenderingContext): object[];
162
+ protected _parseLineWordWrapEllipsis(line: string | undefined, width: number, height: number, context: ICanvasRenderingContext): object[];
158
163
  protected _renderLines(context: ICanvasRenderingContext): void;
164
+ private _computeHeightForLinesOf;
159
165
  /**
160
166
  * Given a width constraint applied on the text block, find the expected height
161
167
  * @returns expected height
@@ -22,6 +22,10 @@ export var TextWrapping;
22
22
  * Ellipsize the text, i.e. shrink with trailing … when text is larger than Control.width.
23
23
  */
24
24
  TextWrapping[TextWrapping["Ellipsis"] = 2] = "Ellipsis";
25
+ /**
26
+ * Wrap the text word-wise and clip the text when the text's height is larger than the Control.height, and shrink the last line with trailing … .
27
+ */
28
+ TextWrapping[TextWrapping["WordWrapEllipsis"] = 3] = "WordWrapEllipsis";
25
29
  })(TextWrapping || (TextWrapping = {}));
26
30
  /**
27
31
  * Class used to create text block control
@@ -284,7 +288,7 @@ var TextBlock = /** @class */ (function (_super) {
284
288
  }
285
289
  _super.prototype._processMeasures.call(this, parentMeasure, context);
286
290
  // Prepare lines
287
- this._lines = this._breakLines(this._currentMeasure.width, context);
291
+ this._lines = this._breakLines(this._currentMeasure.width, this._currentMeasure.height, context);
288
292
  this.onLinesReadyObservable.notifyObservers(this);
289
293
  var maxLineWidth = 0;
290
294
  for (var i = 0; i < this._lines.length; i++) {
@@ -376,7 +380,7 @@ var TextBlock = /** @class */ (function (_super) {
376
380
  context.miterLimit = 2;
377
381
  }
378
382
  };
379
- TextBlock.prototype._breakLines = function (refWidth, context) {
383
+ TextBlock.prototype._breakLines = function (refWidth, refHeight, context) {
380
384
  var lines = [];
381
385
  var _lines = this.text.split("\n");
382
386
  if (this._textWrapping === TextWrapping.Ellipsis) {
@@ -391,9 +395,15 @@ var TextBlock = /** @class */ (function (_super) {
391
395
  lines.push.apply(lines, this._parseLineWordWrap(_line, refWidth, context));
392
396
  }
393
397
  }
394
- else {
398
+ else if (this._textWrapping === TextWrapping.WordWrapEllipsis) {
395
399
  for (var _b = 0, _lines_3 = _lines; _b < _lines_3.length; _b++) {
396
400
  var _line = _lines_3[_b];
401
+ lines.push.apply(lines, this._parseLineWordWrapEllipsis(_line, refWidth, refHeight, context));
402
+ }
403
+ }
404
+ else {
405
+ for (var _c = 0, _lines_4 = _lines; _c < _lines_4.length; _c++) {
406
+ var _line = _lines_4[_c];
397
407
  lines.push(this._parseLine(_line, context));
398
408
  }
399
409
  }
@@ -457,6 +467,24 @@ var TextBlock = /** @class */ (function (_super) {
457
467
  lines.push({ text: line, width: lineWidth });
458
468
  return lines;
459
469
  };
470
+ TextBlock.prototype._parseLineWordWrapEllipsis = function (line, width, height, context) {
471
+ if (line === void 0) { line = ""; }
472
+ var lines = this._parseLineWordWrap(line, width, context);
473
+ for (var n = 1; n <= lines.length; n++) {
474
+ var currentHeight = this._computeHeightForLinesOf(n);
475
+ if (currentHeight > height && n > 1) {
476
+ var lastLine = lines[n - 2];
477
+ var currentLine = lines[n - 1];
478
+ lines[n - 2] = this._parseLineEllipsis("" + (lastLine.text + currentLine.text), width, context);
479
+ var linesToRemove = lines.length - n + 1;
480
+ for (var i = 0; i < linesToRemove; i++) {
481
+ lines.pop();
482
+ }
483
+ return lines;
484
+ }
485
+ }
486
+ return lines;
487
+ };
460
488
  TextBlock.prototype._renderLines = function (context) {
461
489
  var height = this._currentMeasure.height;
462
490
  var rootY = 0;
@@ -486,6 +514,20 @@ var TextBlock = /** @class */ (function (_super) {
486
514
  rootY += this._fontOffset.height;
487
515
  }
488
516
  };
517
+ TextBlock.prototype._computeHeightForLinesOf = function (lineCount) {
518
+ var newHeight = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * lineCount;
519
+ if (lineCount > 0 && this._lineSpacing.internalValue !== 0) {
520
+ var lineSpacing = 0;
521
+ if (this._lineSpacing.isPixel) {
522
+ lineSpacing = this._lineSpacing.getValue(this._host);
523
+ }
524
+ else {
525
+ lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
526
+ }
527
+ newHeight += (lineCount - 1) * lineSpacing;
528
+ }
529
+ return newHeight;
530
+ };
489
531
  /**
490
532
  * Given a width constraint applied on the text block, find the expected height
491
533
  * @returns expected height
@@ -493,26 +535,15 @@ var TextBlock = /** @class */ (function (_super) {
493
535
  TextBlock.prototype.computeExpectedHeight = function () {
494
536
  var _a;
495
537
  if (this.text && this.widthInPixels) {
496
- // Shoudl abstract platform instead of using LastCreatedEngine
538
+ // Should abstract platform instead of using LastCreatedEngine
497
539
  var context_1 = (_a = Engine.LastCreatedEngine) === null || _a === void 0 ? void 0 : _a.createCanvas(0, 0).getContext("2d");
498
540
  if (context_1) {
499
541
  this._applyStates(context_1);
500
542
  if (!this._fontOffset) {
501
543
  this._fontOffset = Control._GetFontOffset(context_1.font);
502
544
  }
503
- var lines = this._lines ? this._lines : this._breakLines(this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels, context_1);
504
- var newHeight = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * lines.length;
505
- if (lines.length > 0 && this._lineSpacing.internalValue !== 0) {
506
- var lineSpacing = 0;
507
- if (this._lineSpacing.isPixel) {
508
- lineSpacing = this._lineSpacing.getValue(this._host);
509
- }
510
- else {
511
- lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
512
- }
513
- newHeight += (lines.length - 1) * lineSpacing;
514
- }
515
- return newHeight;
545
+ var lines = this._lines ? this._lines : this._breakLines(this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels, this.heightInPixels - this._paddingTopInPixels - this._paddingBottomInPixels, context_1);
546
+ return this._computeHeightForLinesOf(lines.length);
516
547
  }
517
548
  }
518
549
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"textBlock.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/2D/controls/textBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from \"@babylonjs/core/Misc/observable\";\r\nimport { Measure } from \"../measure\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"@babylonjs/core/Misc/typeStore\";\r\nimport { Nullable } from \"@babylonjs/core/types\";\r\nimport { serialize } from '@babylonjs/core/Misc/decorators';\r\nimport { ICanvasRenderingContext } from '@babylonjs/core/Engines/ICanvas';\r\nimport { Engine } from '@babylonjs/core/Engines/engine';\r\n\r\n/**\r\n * Enum that determines the text-wrapping mode to use.\r\n */\r\nexport enum TextWrapping {\r\n /**\r\n * Clip the text when it's larger than Control.width; this is the default mode.\r\n */\r\n Clip = 0,\r\n\r\n /**\r\n * Wrap the text word-wise, i.e. try to add line-breaks at word boundary to fit within Control.width.\r\n */\r\n WordWrap = 1,\r\n\r\n /**\r\n * Ellipsize the text, i.e. shrink with trailing … when text is larger than Control.width.\r\n */\r\n Ellipsis,\r\n}\r\n\r\n/**\r\n * Class used to create text block control\r\n */\r\nexport class TextBlock extends Control {\r\n private _text = \"\";\r\n private _textWrapping = TextWrapping.Clip;\r\n private _textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n private _textVerticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n\r\n private _lines: any[];\r\n private _resizeToFit: boolean = false;\r\n private _lineSpacing: ValueAndUnit = new ValueAndUnit(0);\r\n private _outlineWidth: number = 0;\r\n private _outlineColor: string = \"white\";\r\n private _underline: boolean = false;\r\n private _lineThrough: boolean = false;\r\n /**\r\n * An event triggered after the text is changed\r\n */\r\n public onTextChangedObservable = new Observable<TextBlock>();\r\n\r\n /**\r\n * An event triggered after the text was broken up into lines\r\n */\r\n public onLinesReadyObservable = new Observable<TextBlock>();\r\n\r\n /**\r\n * Function used to split a string into words. By default, a string is split at each space character found\r\n */\r\n public wordSplittingFunction: Nullable<(line: string) => string[]>;\r\n\r\n /**\r\n * Return the line list (you may need to use the onLinesReadyObservable to make sure the list is ready)\r\n */\r\n public get lines(): any[] {\r\n return this._lines;\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that the TextBlock will be resized to fit container\r\n */\r\n @serialize()\r\n public get resizeToFit(): boolean {\r\n return this._resizeToFit;\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that the TextBlock will be resized to fit container\r\n */\r\n public set resizeToFit(value: boolean) {\r\n if (this._resizeToFit === value) {\r\n return;\r\n }\r\n this._resizeToFit = value;\r\n\r\n if (this._resizeToFit) {\r\n this._width.ignoreAdaptiveScaling = true;\r\n this._height.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if text must be wrapped\r\n */\r\n @serialize()\r\n public get textWrapping(): TextWrapping | boolean {\r\n return this._textWrapping;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if text must be wrapped\r\n */\r\n public set textWrapping(value: TextWrapping | boolean) {\r\n if (this._textWrapping === value) {\r\n return;\r\n }\r\n this._textWrapping = +value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets text to display\r\n */\r\n @serialize()\r\n public get text(): string {\r\n return this._text;\r\n }\r\n\r\n /**\r\n * Gets or sets text to display\r\n */\r\n public set text(value: string) {\r\n if (this._text === value) {\r\n return;\r\n }\r\n this._text = value + \"\"; // Making sure it is a text\r\n this._markAsDirty();\r\n\r\n this.onTextChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)\r\n */\r\n @serialize()\r\n public get textHorizontalAlignment(): number {\r\n return this._textHorizontalAlignment;\r\n }\r\n\r\n /**\r\n * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)\r\n */\r\n public set textHorizontalAlignment(value: number) {\r\n if (this._textHorizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._textHorizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)\r\n */\r\n @serialize()\r\n public get textVerticalAlignment(): number {\r\n return this._textVerticalAlignment;\r\n }\r\n\r\n /**\r\n * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)\r\n */\r\n public set textVerticalAlignment(value: number) {\r\n if (this._textVerticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._textVerticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets line spacing value\r\n */\r\n @serialize()\r\n public set lineSpacing(value: string | number) {\r\n if (this._lineSpacing.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets line spacing value\r\n */\r\n public get lineSpacing(): string | number {\r\n return this._lineSpacing.toString(this._host);\r\n }\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n @serialize()\r\n public get outlineWidth(): number {\r\n return this._outlineWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n public set outlineWidth(value: number) {\r\n if (this._outlineWidth === value) {\r\n return;\r\n }\r\n this._outlineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that text must have underline\r\n */\r\n @serialize()\r\n\r\n public get underline(): boolean {\r\n return this._underline;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that text must have underline\r\n */\r\n public set underline(value: boolean) {\r\n if (this._underline === value) {\r\n return;\r\n }\r\n this._underline = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that text must be crossed out\r\n */\r\n @serialize()\r\n public get lineThrough(): boolean {\r\n return this._lineThrough;\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that text must be crossed out\r\n */\r\n public set lineThrough(value: boolean) {\r\n if (this._lineThrough === value) {\r\n return;\r\n }\r\n this._lineThrough = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n @serialize()\r\n public get outlineColor(): string {\r\n return this._outlineColor;\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n public set outlineColor(value: string) {\r\n if (this._outlineColor === value) {\r\n return;\r\n }\r\n this._outlineColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new TextBlock object\r\n * @param name defines the name of the control\r\n * @param text defines the text to display (emptry string by default)\r\n */\r\n constructor(\r\n /**\r\n * Defines the name of the control\r\n */\r\n public name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"TextBlock\";\r\n }\r\n\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (!this._fontOffset || this.isDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font);\r\n }\r\n super._processMeasures(parentMeasure, context);\r\n\r\n // Prepare lines\r\n this._lines = this._breakLines(this._currentMeasure.width, context);\r\n this.onLinesReadyObservable.notifyObservers(this);\r\n\r\n let maxLineWidth: number = 0;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (line.width > maxLineWidth) {\r\n maxLineWidth = line.width;\r\n }\r\n }\r\n\r\n if (this._resizeToFit) {\r\n if (this._textWrapping === TextWrapping.Clip) {\r\n let newWidth = (this._paddingLeftInPixels + this._paddingRightInPixels + maxLineWidth) | 0;\r\n if (newWidth !== this._width.internalValue) {\r\n this._width.updateInPlace(newWidth, ValueAndUnit.UNITMODE_PIXEL);\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n let newHeight = (this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * this._lines.length) | 0;\r\n\r\n if (this._lines.length > 0 && this._lineSpacing.internalValue !== 0) {\r\n let lineSpacing = 0;\r\n if (this._lineSpacing.isPixel) {\r\n lineSpacing = this._lineSpacing.getValue(this._host);\r\n } else {\r\n lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n newHeight += (this._lines.length - 1) * lineSpacing;\r\n }\r\n\r\n if (newHeight !== this._height.internalValue) {\r\n this._height.updateInPlace(newHeight, ValueAndUnit.UNITMODE_PIXEL);\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n }\r\n\r\n private _drawText(text: string, textWidth: number, y: number, context: ICanvasRenderingContext): void {\r\n var width = this._currentMeasure.width;\r\n var x = 0;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = width - textWidth;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (width - textWidth) / 2;\r\n break;\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text, this._currentMeasure.left + x, y);\r\n }\r\n context.fillText(text, this._currentMeasure.left + x, y);\r\n\r\n if (this._underline) {\r\n context.beginPath();\r\n context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);\r\n context.moveTo(this._currentMeasure.left + x, y + 3);\r\n context.lineTo(this._currentMeasure.left + x + textWidth, y + 3);\r\n context.stroke();\r\n context.closePath();\r\n }\r\n\r\n if (this._lineThrough) {\r\n context.beginPath();\r\n context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);\r\n context.moveTo(this._currentMeasure.left + x, y - this.fontSizeInPixels / 3);\r\n context.lineTo(this._currentMeasure.left + x + textWidth, y - this.fontSizeInPixels / 3);\r\n context.stroke();\r\n context.closePath();\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Render lines\r\n this._renderLines(context);\r\n\r\n context.restore();\r\n }\r\n\r\n protected _applyStates(context: ICanvasRenderingContext): void {\r\n super._applyStates(context);\r\n if (this.outlineWidth) {\r\n context.lineWidth = this.outlineWidth;\r\n context.strokeStyle = this.outlineColor;\r\n context.lineJoin = 'miter';\r\n context.miterLimit = 2;\r\n }\r\n }\r\n\r\n protected _breakLines(refWidth: number, context: ICanvasRenderingContext): object[] {\r\n var lines = [];\r\n var _lines = this.text.split(\"\\n\");\r\n\r\n if (this._textWrapping === TextWrapping.Ellipsis) {\r\n for (var _line of _lines) {\r\n lines.push(this._parseLineEllipsis(_line, refWidth, context));\r\n }\r\n } else if (this._textWrapping === TextWrapping.WordWrap) {\r\n for (var _line of _lines) {\r\n lines.push(...this._parseLineWordWrap(_line, refWidth, context));\r\n }\r\n } else {\r\n for (var _line of _lines) {\r\n lines.push(this._parseLine(_line, context));\r\n }\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLine(line: string = \"\", context: ICanvasRenderingContext): object {\r\n var textMetrics = context.measureText(line);\r\n var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n return { text: line, width: lineWidth };\r\n }\r\n\r\n protected _parseLineEllipsis(line: string = \"\", width: number, context: ICanvasRenderingContext): object {\r\n var textMetrics = context.measureText(line);\r\n var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n\r\n if (lineWidth > width) {\r\n line += \"…\";\r\n }\r\n // unicode support. split('') does not work with unicode!\r\n // make sure Array.from is available\r\n const characters = Array.from && Array.from(line);\r\n if (!characters) {\r\n // no array.from, use the old method\r\n while (line.length > 2 && lineWidth > width) {\r\n line = line.slice(0, -2) + \"…\";\r\n textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n }\r\n } else {\r\n while (characters.length && lineWidth > width) {\r\n characters.pop();\r\n line = `${characters.join(\"\")}...`;\r\n textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n }\r\n }\r\n\r\n return { text: line, width: lineWidth };\r\n }\r\n\r\n protected _parseLineWordWrap(line: string = \"\", width: number, context: ICanvasRenderingContext): object[] {\r\n var lines = [];\r\n var words = this.wordSplittingFunction ? this.wordSplittingFunction(line) : line.split(\" \");\r\n var textMetrics = context.measureText(line);\r\n var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n\r\n for (var n = 0; n < words.length; n++) {\r\n var testLine = n > 0 ? line + \" \" + words[n] : words[0];\r\n var metrics = context.measureText(testLine);\r\n var testWidth = Math.abs(metrics.actualBoundingBoxLeft) + Math.abs(metrics.actualBoundingBoxRight);\r\n if (testWidth > width && n > 0) {\r\n lines.push({ text: line, width: lineWidth });\r\n line = words[n];\r\n textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n } else {\r\n lineWidth = testWidth;\r\n line = testLine;\r\n }\r\n }\r\n lines.push({ text: line, width: lineWidth });\r\n\r\n return lines;\r\n }\r\n\r\n protected _renderLines(context: ICanvasRenderingContext): void {\r\n var height = this._currentMeasure.height;\r\n var rootY = 0;\r\n switch (this._textVerticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n rootY = this._fontOffset.ascent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;\r\n break;\r\n }\r\n\r\n rootY += this._currentMeasure.top;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (i !== 0 && this._lineSpacing.internalValue !== 0) {\r\n if (this._lineSpacing.isPixel) {\r\n rootY += this._lineSpacing.getValue(this._host);\r\n } else {\r\n rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n }\r\n\r\n this._drawText(line.text, line.width, rootY, context);\r\n rootY += this._fontOffset.height;\r\n }\r\n }\r\n\r\n /**\r\n * Given a width constraint applied on the text block, find the expected height\r\n * @returns expected height\r\n */\r\n public computeExpectedHeight(): number {\r\n if (this.text && this.widthInPixels) {\r\n // Shoudl abstract platform instead of using LastCreatedEngine\r\n const context = Engine.LastCreatedEngine?.createCanvas(0, 0).getContext(\"2d\");\r\n if (context) {\r\n this._applyStates(context);\r\n if (!this._fontOffset) {\r\n this._fontOffset = Control._GetFontOffset(context.font);\r\n }\r\n const lines = this._lines ? this._lines : this._breakLines(this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels, context);\r\n\r\n let newHeight = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * lines.length;\r\n\r\n if (lines.length > 0 && this._lineSpacing.internalValue !== 0) {\r\n let lineSpacing = 0;\r\n if (this._lineSpacing.isPixel) {\r\n lineSpacing = this._lineSpacing.getValue(this._host);\r\n } else {\r\n lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n newHeight += (lines.length - 1) * lineSpacing;\r\n }\r\n\r\n return newHeight;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n dispose(): void {\r\n super.dispose();\r\n\r\n this.onTextChangedObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.TextBlock\", TextBlock);\r\n"]}
1
+ {"version":3,"file":"textBlock.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/2D/controls/textBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from \"@babylonjs/core/Misc/observable\";\r\nimport { Measure } from \"../measure\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"@babylonjs/core/Misc/typeStore\";\r\nimport { Nullable } from \"@babylonjs/core/types\";\r\nimport { serialize } from '@babylonjs/core/Misc/decorators';\r\nimport { ICanvasRenderingContext } from '@babylonjs/core/Engines/ICanvas';\r\nimport { Engine } from '@babylonjs/core/Engines/engine';\r\n\r\n/**\r\n * Enum that determines the text-wrapping mode to use.\r\n */\r\nexport enum TextWrapping {\r\n /**\r\n * Clip the text when it's larger than Control.width; this is the default mode.\r\n */\r\n Clip = 0,\r\n\r\n /**\r\n * Wrap the text word-wise, i.e. try to add line-breaks at word boundary to fit within Control.width.\r\n */\r\n WordWrap = 1,\r\n\r\n /**\r\n * Ellipsize the text, i.e. shrink with trailing … when text is larger than Control.width.\r\n */\r\n Ellipsis = 2,\r\n\r\n /**\r\n * Wrap the text word-wise and clip the text when the text's height is larger than the Control.height, and shrink the last line with trailing … .\r\n */\r\n WordWrapEllipsis\r\n}\r\n\r\n/**\r\n * Class used to create text block control\r\n */\r\nexport class TextBlock extends Control {\r\n private _text = \"\";\r\n private _textWrapping = TextWrapping.Clip;\r\n private _textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n private _textVerticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n\r\n private _lines: any[];\r\n private _resizeToFit: boolean = false;\r\n private _lineSpacing: ValueAndUnit = new ValueAndUnit(0);\r\n private _outlineWidth: number = 0;\r\n private _outlineColor: string = \"white\";\r\n private _underline: boolean = false;\r\n private _lineThrough: boolean = false;\r\n /**\r\n * An event triggered after the text is changed\r\n */\r\n public onTextChangedObservable = new Observable<TextBlock>();\r\n\r\n /**\r\n * An event triggered after the text was broken up into lines\r\n */\r\n public onLinesReadyObservable = new Observable<TextBlock>();\r\n\r\n /**\r\n * Function used to split a string into words. By default, a string is split at each space character found\r\n */\r\n public wordSplittingFunction: Nullable<(line: string) => string[]>;\r\n\r\n /**\r\n * Return the line list (you may need to use the onLinesReadyObservable to make sure the list is ready)\r\n */\r\n public get lines(): any[] {\r\n return this._lines;\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that the TextBlock will be resized to fit container\r\n */\r\n @serialize()\r\n public get resizeToFit(): boolean {\r\n return this._resizeToFit;\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that the TextBlock will be resized to fit container\r\n */\r\n public set resizeToFit(value: boolean) {\r\n if (this._resizeToFit === value) {\r\n return;\r\n }\r\n this._resizeToFit = value;\r\n\r\n if (this._resizeToFit) {\r\n this._width.ignoreAdaptiveScaling = true;\r\n this._height.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if text must be wrapped\r\n */\r\n @serialize()\r\n public get textWrapping(): TextWrapping | boolean {\r\n return this._textWrapping;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if text must be wrapped\r\n */\r\n public set textWrapping(value: TextWrapping | boolean) {\r\n if (this._textWrapping === value) {\r\n return;\r\n }\r\n this._textWrapping = +value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets text to display\r\n */\r\n @serialize()\r\n public get text(): string {\r\n return this._text;\r\n }\r\n\r\n /**\r\n * Gets or sets text to display\r\n */\r\n public set text(value: string) {\r\n if (this._text === value) {\r\n return;\r\n }\r\n this._text = value + \"\"; // Making sure it is a text\r\n this._markAsDirty();\r\n\r\n this.onTextChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)\r\n */\r\n @serialize()\r\n public get textHorizontalAlignment(): number {\r\n return this._textHorizontalAlignment;\r\n }\r\n\r\n /**\r\n * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)\r\n */\r\n public set textHorizontalAlignment(value: number) {\r\n if (this._textHorizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._textHorizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)\r\n */\r\n @serialize()\r\n public get textVerticalAlignment(): number {\r\n return this._textVerticalAlignment;\r\n }\r\n\r\n /**\r\n * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)\r\n */\r\n public set textVerticalAlignment(value: number) {\r\n if (this._textVerticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._textVerticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets line spacing value\r\n */\r\n @serialize()\r\n public set lineSpacing(value: string | number) {\r\n if (this._lineSpacing.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets line spacing value\r\n */\r\n public get lineSpacing(): string | number {\r\n return this._lineSpacing.toString(this._host);\r\n }\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n @serialize()\r\n public get outlineWidth(): number {\r\n return this._outlineWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n public set outlineWidth(value: number) {\r\n if (this._outlineWidth === value) {\r\n return;\r\n }\r\n this._outlineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that text must have underline\r\n */\r\n @serialize()\r\n\r\n public get underline(): boolean {\r\n return this._underline;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that text must have underline\r\n */\r\n public set underline(value: boolean) {\r\n if (this._underline === value) {\r\n return;\r\n }\r\n this._underline = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that text must be crossed out\r\n */\r\n @serialize()\r\n public get lineThrough(): boolean {\r\n return this._lineThrough;\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that text must be crossed out\r\n */\r\n public set lineThrough(value: boolean) {\r\n if (this._lineThrough === value) {\r\n return;\r\n }\r\n this._lineThrough = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n @serialize()\r\n public get outlineColor(): string {\r\n return this._outlineColor;\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n public set outlineColor(value: string) {\r\n if (this._outlineColor === value) {\r\n return;\r\n }\r\n this._outlineColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new TextBlock object\r\n * @param name defines the name of the control\r\n * @param text defines the text to display (emptry string by default)\r\n */\r\n constructor(\r\n /**\r\n * Defines the name of the control\r\n */\r\n public name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"TextBlock\";\r\n }\r\n\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (!this._fontOffset || this.isDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font);\r\n }\r\n super._processMeasures(parentMeasure, context);\r\n\r\n // Prepare lines\r\n this._lines = this._breakLines(this._currentMeasure.width, this._currentMeasure.height, context);\r\n this.onLinesReadyObservable.notifyObservers(this);\r\n\r\n let maxLineWidth: number = 0;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (line.width > maxLineWidth) {\r\n maxLineWidth = line.width;\r\n }\r\n }\r\n\r\n if (this._resizeToFit) {\r\n if (this._textWrapping === TextWrapping.Clip) {\r\n let newWidth = (this._paddingLeftInPixels + this._paddingRightInPixels + maxLineWidth) | 0;\r\n if (newWidth !== this._width.internalValue) {\r\n this._width.updateInPlace(newWidth, ValueAndUnit.UNITMODE_PIXEL);\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n let newHeight = (this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * this._lines.length) | 0;\r\n\r\n if (this._lines.length > 0 && this._lineSpacing.internalValue !== 0) {\r\n let lineSpacing = 0;\r\n if (this._lineSpacing.isPixel) {\r\n lineSpacing = this._lineSpacing.getValue(this._host);\r\n } else {\r\n lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n newHeight += (this._lines.length - 1) * lineSpacing;\r\n }\r\n\r\n if (newHeight !== this._height.internalValue) {\r\n this._height.updateInPlace(newHeight, ValueAndUnit.UNITMODE_PIXEL);\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n }\r\n\r\n private _drawText(text: string, textWidth: number, y: number, context: ICanvasRenderingContext): void {\r\n var width = this._currentMeasure.width;\r\n var x = 0;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = width - textWidth;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (width - textWidth) / 2;\r\n break;\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text, this._currentMeasure.left + x, y);\r\n }\r\n context.fillText(text, this._currentMeasure.left + x, y);\r\n\r\n if (this._underline) {\r\n context.beginPath();\r\n context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);\r\n context.moveTo(this._currentMeasure.left + x, y + 3);\r\n context.lineTo(this._currentMeasure.left + x + textWidth, y + 3);\r\n context.stroke();\r\n context.closePath();\r\n }\r\n\r\n if (this._lineThrough) {\r\n context.beginPath();\r\n context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);\r\n context.moveTo(this._currentMeasure.left + x, y - this.fontSizeInPixels / 3);\r\n context.lineTo(this._currentMeasure.left + x + textWidth, y - this.fontSizeInPixels / 3);\r\n context.stroke();\r\n context.closePath();\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Render lines\r\n this._renderLines(context);\r\n\r\n context.restore();\r\n }\r\n\r\n protected _applyStates(context: ICanvasRenderingContext): void {\r\n super._applyStates(context);\r\n if (this.outlineWidth) {\r\n context.lineWidth = this.outlineWidth;\r\n context.strokeStyle = this.outlineColor;\r\n context.lineJoin = 'miter';\r\n context.miterLimit = 2;\r\n }\r\n }\r\n\r\n protected _breakLines(refWidth: number, refHeight: number, context: ICanvasRenderingContext): object[] {\r\n var lines = [];\r\n var _lines = this.text.split(\"\\n\");\r\n\r\n if (this._textWrapping === TextWrapping.Ellipsis) {\r\n for (var _line of _lines) {\r\n lines.push(this._parseLineEllipsis(_line, refWidth, context));\r\n }\r\n } else if (this._textWrapping === TextWrapping.WordWrap) {\r\n for (var _line of _lines) {\r\n lines.push(...this._parseLineWordWrap(_line, refWidth, context));\r\n }\r\n } else if (this._textWrapping === TextWrapping.WordWrapEllipsis) {\r\n for (var _line of _lines) {\r\n lines.push(...this._parseLineWordWrapEllipsis(_line, refWidth, refHeight!, context));\r\n }\r\n } else {\r\n for (var _line of _lines) {\r\n lines.push(this._parseLine(_line, context));\r\n }\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLine(line: string = \"\", context: ICanvasRenderingContext): object {\r\n var textMetrics = context.measureText(line);\r\n var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n return { text: line, width: lineWidth };\r\n }\r\n\r\n protected _parseLineEllipsis(line: string = \"\", width: number, context: ICanvasRenderingContext): object {\r\n var textMetrics = context.measureText(line);\r\n var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n\r\n if (lineWidth > width) {\r\n line += \"…\";\r\n }\r\n // unicode support. split('') does not work with unicode!\r\n // make sure Array.from is available\r\n const characters = Array.from && Array.from(line);\r\n if (!characters) {\r\n // no array.from, use the old method\r\n while (line.length > 2 && lineWidth > width) {\r\n line = line.slice(0, -2) + \"…\";\r\n textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n }\r\n } else {\r\n while (characters.length && lineWidth > width) {\r\n characters.pop();\r\n line = `${characters.join(\"\")}...`;\r\n textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n }\r\n }\r\n\r\n return { text: line, width: lineWidth };\r\n }\r\n\r\n protected _parseLineWordWrap(line: string = \"\", width: number, context: ICanvasRenderingContext): object[] {\r\n var lines = [];\r\n var words = this.wordSplittingFunction ? this.wordSplittingFunction(line) : line.split(\" \");\r\n var textMetrics = context.measureText(line);\r\n var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n\r\n for (var n = 0; n < words.length; n++) {\r\n var testLine = n > 0 ? line + \" \" + words[n] : words[0];\r\n var metrics = context.measureText(testLine);\r\n var testWidth = Math.abs(metrics.actualBoundingBoxLeft) + Math.abs(metrics.actualBoundingBoxRight);\r\n if (testWidth > width && n > 0) {\r\n lines.push({ text: line, width: lineWidth });\r\n line = words[n];\r\n textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n } else {\r\n lineWidth = testWidth;\r\n line = testLine;\r\n }\r\n }\r\n lines.push({ text: line, width: lineWidth });\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLineWordWrapEllipsis(line: string = \"\", width: number, height: number, context: ICanvasRenderingContext): object[] {\r\n var lines = this._parseLineWordWrap(line, width, context);\r\n for (var n = 1; n <= lines.length; n++) {\r\n const currentHeight = this._computeHeightForLinesOf(n);\r\n if (currentHeight > height && n > 1) {\r\n var lastLine = lines[n - 2] as {text: string; width: number};\r\n var currentLine = lines[n - 1] as {text: string; width: number};\r\n lines[n - 2] = this._parseLineEllipsis(`${lastLine.text + currentLine.text}`, width, context);\r\n var linesToRemove = lines.length - n + 1;\r\n for (var i = 0; i < linesToRemove; i++) {\r\n lines.pop();\r\n }\r\n return lines;\r\n }\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n protected _renderLines(context: ICanvasRenderingContext): void {\r\n var height = this._currentMeasure.height;\r\n var rootY = 0;\r\n switch (this._textVerticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n rootY = this._fontOffset.ascent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;\r\n break;\r\n }\r\n\r\n rootY += this._currentMeasure.top;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (i !== 0 && this._lineSpacing.internalValue !== 0) {\r\n if (this._lineSpacing.isPixel) {\r\n rootY += this._lineSpacing.getValue(this._host);\r\n } else {\r\n rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n }\r\n\r\n this._drawText(line.text, line.width, rootY, context);\r\n rootY += this._fontOffset.height;\r\n }\r\n }\r\n\r\n private _computeHeightForLinesOf(lineCount: number): number {\r\n let newHeight = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * lineCount;\r\n\r\n if (lineCount > 0 && this._lineSpacing.internalValue !== 0) {\r\n let lineSpacing = 0;\r\n if (this._lineSpacing.isPixel) {\r\n lineSpacing = this._lineSpacing.getValue(this._host);\r\n } else {\r\n lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n newHeight += (lineCount - 1) * lineSpacing;\r\n }\r\n\r\n return newHeight;\r\n }\r\n\r\n /**\r\n * Given a width constraint applied on the text block, find the expected height\r\n * @returns expected height\r\n */\r\n public computeExpectedHeight(): number {\r\n if (this.text && this.widthInPixels) {\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const context = Engine.LastCreatedEngine?.createCanvas(0, 0).getContext(\"2d\");\r\n if (context) {\r\n this._applyStates(context);\r\n if (!this._fontOffset) {\r\n this._fontOffset = Control._GetFontOffset(context.font);\r\n }\r\n const lines = this._lines ? this._lines : this._breakLines(this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels, this.heightInPixels - this._paddingTopInPixels - this._paddingBottomInPixels, context);\r\n return this._computeHeightForLinesOf(lines.length);\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n dispose(): void {\r\n super.dispose();\r\n\r\n this.onTextChangedObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.TextBlock\", TextBlock);\r\n"]}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  },
5
5
  "name": "@babylonjs/gui",
6
6
  "description": "The Babylon.js GUI library is an extension you can use to generate interactive user interface. It is build on top of the DynamicTexture.",
7
- "version": "5.0.0-alpha.65",
7
+ "version": "5.0.0-beta.1",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -329,7 +329,7 @@
329
329
  ],
330
330
  "license": "Apache-2.0",
331
331
  "dependencies": {
332
- "@babylonjs/core": "5.0.0-alpha.65",
332
+ "@babylonjs/core": "5.0.0-beta.1",
333
333
  "tslib": "^2.3.1"
334
334
  },
335
335
  "engines": {