Subversion Repository Public Repository

Nextrek

Diff Revisions 1085 vs 1086 for /s2s/data/87BE6898K0E78A48FCSB889E1DAAB10BF84B.json

Diff revisions: vs.
  @@ -6,10 +6,10 @@
6 6 "name": "Component_HotspotBehavior",
7 7 "type": "game_script",
8 8 "order": 1,
9 - "content": "# ===================================================================\n#\n# Script: Component_HotspotBehavior\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\n\nclass HotspotShape\n @RECTANGLE = \"rect\"\n @PIXEL = \"pixel\"\ngs.HotspotShape = HotspotShape\n\nclass Component_HotspotBehavior extends gs.Component\n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n @setupEventHandlers()\n \n ###*\n * Adds a hotspot-behavior to a game object. That allows a game object\n * to respond to mouse/touch actions by firing an action-event or changing\n * the game object's image.\n *\n * @module gs\n * @class Component_HotspotBehavior\n * @extends gs.Component\n * @memberof gs\n * @constructor\n ###\n constructor: (params) ->\n ###*\n * The shape used to detect if a hotspot is clicked, hovered, etc.\n * @property shape\n * @type boolean\n ###\n @shape = gs.HotspotShape.RECTANGLE\n \n ###*\n * Indicates if the hotspot is selected.\n * @property selected\n * @type boolean\n ###\n @selected = no\n \n ###*\n * Indicates if the hotspot is enabled.\n * @property enabled\n * @type boolean\n ###\n @enabled = yes\n \n ###*\n * @property imageHandling\n * @type number\n * @protected\n ###\n @imageHandling = 0\n \n ###*\n * Indicates if the mouse/touch pointer is inside the hotspot bounds.\n * @property contains\n * @type boolean\n * @protected\n ###\n @containsPointer = no\n \n ###*\n * Indicates if the action-button was pressed before.\n * @property buttonUp\n * @type boolean\n * @protected\n ###\n @buttonUp = no\n \n ###*\n * Indicates if the action-button is pressed.\n * @property buttonDown\n * @type boolean\n * @protected\n ###\n @buttonDown = no\n \n ###*\n * @property actionButtons\n * @type Object\n * @protected\n ###\n @actionButtons = { \"left\": Input.Mouse.BUTTON_LEFT, \"right\": Input.Mouse.BUTTON_RIGHT, \"middle\": Input.Mouse.BUTTON_MIDDLE }\n \n ###*\n * The default action-button. By default the left-button is used.\n *\n * @property actionButton\n * @type number\n ###\n @actionButton = @actionButtons[params?.actionButton ? \"left\"]\n \n ###*\n * The sound played if the hotspot action is executed.\n * @property sound\n * @type Object\n ###\n @sound = params?.sound\n\n ###*\n * <p>The sounds played depending on the hotspot state.</p>\n * <ul>\n * <li>0 = Select Sound</li>\n * <li>1 = Unselect Sound</li>\n * </ul>\n * @property sounds\n * @type Object[]\n ###\n @sounds = params?.sounds || []\n \n ###*\n * Sets up event handlers.\n *\n * @method setupEventHandlers\n ### \n setupEventHandlers: ->\n gs.GlobalEventManager.offByOwner(\"mouseUp\", @object)\n gs.GlobalEventManager.offByOwner(\"mouseMoved\", @object)\n \n gs.GlobalEventManager.on \"mouseUp\", ((e) => \n return if not @object.visible\n mx = Input.Mouse.x - @object.origin.x\n my = Input.Mouse.y - @object.origin.y\n contains = Rect.contains(@object.dstRect.x, @object.dstRect.y, \n @object.dstRect.width, @object.dstRect.height,\n mx, my)\n if contains\n contains = @checkShape(mx - @object.dstRect.x, my - @object.dstRect.y)\n if contains\n @containsPointer = contains\n @updateInput()\n @updateEvents()\n @object.needsUpdate = yes\n e.breakChain = yes\n ),\n null, @object\n \n if @object.images or yes\n gs.GlobalEventManager.on \"mouseMoved\", ((e) =>\n return if not @object.visible\n contains = Rect.contains(@object.dstRect.x, @object.dstRect.y, \n @object.dstRect.width, @object.dstRect.height,\n Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y)\n \n if contains\n mx = Input.Mouse.x - @object.origin.x\n my = Input.Mouse.y - @object.origin.y\n contains = @checkShape(mx - @object.dstRect.x, my - @object.dstRect.y)\n \n if @containsPointer != contains\n @containsPointer = contains\n @object.needsUpdate = yes\n \n if contains\n @object.events.emit(\"enter\", this)\n else\n @object.events.emit(\"leave\", this)\n \n @updateInput()\n ),\n null, @object\n \n ###*\n * Initializes the hotspot component.\n *\n * @method setup\n ###\n setup: ->\n super\n \n @sound = ui.Component_FormulaHandler.fieldValue(@object, @sound)\n \n if @sounds?\n for sound, i in @sounds\n @sounds[i] = ui.Component_FormulaHandler.fieldValue(@object, sound)\n else\n @sounds = []\n \n \n @setupEventHandlers()\n \n \n \n ###*\n * Disposes the component.\n *\n * @method dispose\n ###\n dispose: ->\n super\n \n gs.GlobalEventManager.offByOwner(\"mouseUp\", @object)\n gs.GlobalEventManager.offByOwner(\"mouseMoved\", @object)\n \n \n ###*\n * Checks if the specified point is inside of the hotspot's shape.\n *\n * @method checkShape\n * @param x - The x-coordinate of the point.\n * @param y - The y-coordinate of the point.\n * @return If <b>true</b> the point is inside of the hotspot's shape. Otherwise <b>false</b>.\n ### \n checkShape: (x, y) ->\n result = yes\n \n switch @shape\n when gs.HotspotShape.PIXEL\n if @object.bitmap\n result = @object.bitmap.isPixelSet(x, y)\n else\n result = @object.target?.bitmap.isPixelSet(x, y)\n \n return result\n \n ###*\n * Updates the image depending on the hotspot state.\n *\n * @method updateImage\n * @protected\n ### \n updateImage: ->\n object = @object.target || @object\n if @object.images?\n baseImage = if @enabled then @object.images[4] || @object.images[0] else @object.images[0]\n if @containsPointer\n if @object.selected or @selected\n object.image = @object.images[3] || @object.images[2] || baseImage\n else\n object.image = @object.images[1] || baseImage\n else\n if @object.selected or @selected\n object.image = @object.images[2] || @object.images[4] || baseImage\n else\n object.image = baseImage\n \n if !object.image\n object.bitmap = null\n\n \n ###*\n * Updates the hotspot position and size from an other target game object. For example, \n * that is useful for adding a hotspot to an other moving game object.\n *\n * @method updateFromTarget\n * @protected\n ### \n updateFromTarget: ->\n if @object.target?\n @object.dstRect.x = @object.target.dstRect.x\n @object.dstRect.y = @object.target.dstRect.y\n @object.dstRect.width = @object.target.dstRect.width\n @object.dstRect.height = @object.target.dstRect.height\n @object.offset.x = @object.target.offset.x\n @object.offset.y = @object.target.offset.y\n @object.origin.x = @object.target.origin.x\n @object.origin.y = @object.target.origin.y \n \n ###*\n * Updates the event-handling and fires necessary events.\n *\n * @method updateEvents\n * @protected\n ### \n updateEvents: ->\n if @buttonUp and @object.enabled and @enabled and @object.visible\n if @object.selectable\n group = gs.ObjectManager.current.objectsByGroup(@object.group)\n for object in group\n if object != @object\n object.selected = no\n if @object.group\n @selected = yes\n else\n @selected = !@selected\n \n if @selected\n AudioManager.playSound(@sounds[0] || @sound)\n else\n AudioManager.playSound(@sounds[1] || @sound)\n @object.events.emit(\"click\", this)\n @object.events.emit(\"stateChanged\", @object)\n else\n AudioManager.playSound(@sounds[0] || @sound)\n @object.events.emit(\"click\", this)\n @object.events.emit(\"action\", this)\n \n ###*\n * Updates the game object's color depending on the state of the hotspot.\n *\n * @method updateColor\n * @protected\n ### \n updateColor: ->\n if !@object.enabled\n @object.color.set(0, 0, 0, 100)\n else\n @object.color.set(0, 0, 0, 0)\n \n ###*\n * Stores current states of mouse/touch pointer and buttons.\n *\n * @method updateInput\n * @protected\n ### \n updateInput: ->\n @buttonUp = Input.Mouse.buttons[@actionButton] == 2 and @containsPointer\n @buttonDown = Input.Mouse.buttons[@actionButton] == 1 and @containsPointer\n \n ###*\n * Updates the hotspot component.\n *\n * @method update\n ###\n update: ->\n if not @object.visible then return\n\n @updateColor()\n @updateFromTarget()\n @updateImage()\n \ngs.Component_HotspotBehavior = Component_HotspotBehavior",
9 + "content": "# ===================================================================\n#\n# Script: Component_HotspotBehavior\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\n\nclass HotspotShape\n @RECTANGLE = \"rect\"\n @PIXEL = \"pixel\"\ngs.HotspotShape = HotspotShape\n\nclass Component_HotspotBehavior extends gs.Component\n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n @setupEventHandlers()\n \n ###*\n * Adds a hotspot-behavior to a game object. That allows a game object\n * to respond to mouse/touch actions by firing an action-event or changing\n * the game object's image.\n *\n * @module gs\n * @class Component_HotspotBehavior\n * @extends gs.Component\n * @memberof gs\n * @constructor\n ###\n constructor: (params) ->\n ###*\n * The shape used to detect if a hotspot is clicked, hovered, etc.\n * @property shape\n * @type boolean\n ###\n @shape = gs.HotspotShape.RECTANGLE\n \n ###*\n * Indicates if the hotspot is selected.\n * @property selected\n * @type boolean\n ###\n @selected = no\n \n ###*\n * Indicates if the hotspot is enabled.\n * @property enabled\n * @type boolean\n ###\n @enabled = yes\n \n ###*\n * @property imageHandling\n * @type number\n * @protected\n ###\n @imageHandling = 0\n \n ###*\n * Indicates if the mouse/touch pointer is inside the hotspot bounds.\n * @property contains\n * @type boolean\n * @protected\n ###\n @containsPointer = no\n \n ###*\n * Indicates if the action-button was pressed before.\n * @property buttonUp\n * @type boolean\n * @protected\n ###\n @buttonUp = no\n \n ###*\n * Indicates if the action-button is pressed.\n * @property buttonDown\n * @type boolean\n * @protected\n ###\n @buttonDown = no\n \n ###*\n * @property actionButtons\n * @type Object\n * @protected\n ###\n @actionButtons = { \"left\": Input.Mouse.BUTTON_LEFT, \"right\": Input.Mouse.BUTTON_RIGHT, \"middle\": Input.Mouse.BUTTON_MIDDLE }\n \n ###*\n * The default action-button. By default the left-button is used.\n *\n * @property actionButton\n * @type number\n ###\n @actionButton = @actionButtons[params?.actionButton ? \"left\"]\n \n ###*\n * The sound played if the hotspot action is executed.\n * @property sound\n * @type Object\n ###\n @sound = params?.sound\n\n ###*\n * <p>The sounds played depending on the hotspot state.</p>\n * <ul>\n * <li>0 = Select Sound</li>\n * <li>1 = Unselect Sound</li>\n * </ul>\n * @property sounds\n * @type Object[]\n ###\n @sounds = params?.sounds || []\n \n \n ###*\n * Gets the render-index of the object associated with the hotspot component. This \n * implementation is necessary to be able to act as an owner for gs.EventEmitter.on \n * event registration. \n *\n * @property rIndex\n * @type number\n ###\n @accessors \"rIndex\", \n get: -> @object.rIndex\n \n ###*\n * Sets up event handlers.\n *\n * @method setupEventHandlers\n ### \n setupEventHandlers: ->\n gs.GlobalEventManager.offByOwner(\"mouseUp\", this)\n gs.GlobalEventManager.offByOwner(\"mouseMoved\", this)\n \n gs.GlobalEventManager.on \"mouseUp\", ((e) => \n return if not @object.visible\n mx = Input.Mouse.x - @object.origin.x\n my = Input.Mouse.y - @object.origin.y\n contains = Rect.contains(@object.dstRect.x, @object.dstRect.y, \n @object.dstRect.width, @object.dstRect.height,\n mx, my)\n if contains\n contains = @checkShape(mx - @object.dstRect.x, my - @object.dstRect.y)\n if contains\n @containsPointer = contains\n @updateInput()\n @updateEvents()\n @object.needsUpdate = yes\n e.breakChain = yes\n ),\n null, this\n \n if @object.images or yes\n gs.GlobalEventManager.on \"mouseMoved\", ((e) =>\n return if not @object.visible\n \n contains = Rect.contains(@object.dstRect.x, @object.dstRect.y, \n @object.dstRect.width, @object.dstRect.height,\n Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y)\n \n if contains\n mx = Input.Mouse.x - @object.origin.x\n my = Input.Mouse.y - @object.origin.y\n contains = @checkShape(mx - @object.dstRect.x, my - @object.dstRect.y)\n \n if @containsPointer != contains\n @containsPointer = contains\n @object.needsUpdate = yes\n \n if contains\n @object.events.emit(\"enter\", this)\n else\n @object.events.emit(\"leave\", this)\n \n @updateInput()\n ),\n null, this\n \n ###*\n * Initializes the hotspot component.\n *\n * @method setup\n ###\n setup: ->\n super\n \n @sound = ui.Component_FormulaHandler.fieldValue(@object, @sound)\n \n if @sounds?\n for sound, i in @sounds\n @sounds[i] = ui.Component_FormulaHandler.fieldValue(@object, sound)\n else\n @sounds = []\n \n \n @setupEventHandlers()\n \n \n \n ###*\n * Disposes the component.\n *\n * @method dispose\n ###\n dispose: ->\n super\n \n gs.GlobalEventManager.offByOwner(\"mouseUp\", this)\n gs.GlobalEventManager.offByOwner(\"mouseMoved\", this)\n \n \n ###*\n * Checks if the specified point is inside of the hotspot's shape.\n *\n * @method checkShape\n * @param x - The x-coordinate of the point.\n * @param y - The y-coordinate of the point.\n * @return If <b>true</b> the point is inside of the hotspot's shape. Otherwise <b>false</b>.\n ### \n checkShape: (x, y) ->\n result = yes\n \n switch @shape\n when gs.HotspotShape.PIXEL\n if @object.bitmap\n result = @object.bitmap.isPixelSet(x, y)\n else\n result = @object.target?.bitmap.isPixelSet(x, y)\n \n return result\n \n ###*\n * Updates the image depending on the hotspot state.\n *\n * @method updateImage\n * @protected\n ### \n updateImage: ->\n object = @object.target || @object\n if @object.images?\n baseImage = if @enabled then @object.images[4] || @object.images[0] else @object.images[0]\n if @containsPointer\n if @object.selected or @selected\n object.image = @object.images[3] || @object.images[2] || baseImage\n else\n object.image = @object.images[1] || baseImage\n else\n if @object.selected or @selected\n object.image = @object.images[2] || @object.images[4] || baseImage\n else\n object.image = baseImage\n \n if !object.image\n object.bitmap = null\n\n \n ###*\n * Updates the hotspot position and size from an other target game object. For example, \n * that is useful for adding a hotspot to an other moving game object.\n *\n * @method updateFromTarget\n * @protected\n ### \n updateFromTarget: ->\n if @object.target?\n @object.dstRect.x = @object.target.dstRect.x\n @object.dstRect.y = @object.target.dstRect.y\n @object.dstRect.width = @object.target.dstRect.width\n @object.dstRect.height = @object.target.dstRect.height\n @object.offset.x = @object.target.offset.x\n @object.offset.y = @object.target.offset.y\n @object.origin.x = @object.target.origin.x\n @object.origin.y = @object.target.origin.y \n \n ###*\n * Updates the event-handling and fires necessary events.\n *\n * @method updateEvents\n * @protected\n ### \n updateEvents: ->\n if @buttonUp and @object.enabled and @enabled and @object.visible\n if @object.selectable\n group = gs.ObjectManager.current.objectsByGroup(@object.group)\n for object in group\n if object != @object\n object.selected = no\n if @object.group\n @selected = yes\n else\n @selected = !@selected\n \n if @selected\n AudioManager.playSound(@sounds[0] || @sound)\n else\n AudioManager.playSound(@sounds[1] || @sound)\n @object.events.emit(\"click\", this)\n @object.events.emit(\"stateChanged\", @object)\n else\n AudioManager.playSound(@sounds[0] || @sound)\n @object.events.emit(\"click\", this)\n @object.events.emit(\"action\", this)\n \n ###*\n * Updates the game object's color depending on the state of the hotspot.\n *\n * @method updateColor\n * @protected\n ### \n updateColor: ->\n if !@object.enabled\n @object.color.set(0, 0, 0, 100)\n else\n @object.color.set(0, 0, 0, 0)\n \n ###*\n * Stores current states of mouse/touch pointer and buttons.\n *\n * @method updateInput\n * @protected\n ### \n updateInput: ->\n @buttonUp = Input.Mouse.buttons[@actionButton] == 2 and @containsPointer\n @buttonDown = Input.Mouse.buttons[@actionButton] == 1 and @containsPointer\n \n ###*\n * Updates the hotspot component.\n *\n * @method update\n ###\n update: ->\n if not @object.visible then return\n\n @updateColor()\n @updateFromTarget()\n @updateImage()\n \ngs.Component_HotspotBehavior = Component_HotspotBehavior",
10 10 "parentId": "01A95DA3K01E8A4CB4SBE17E790BCE1FC035",
11 11 "folder": false,
12 - "compiledContent": "var Component_HotspotBehavior, HotspotShape,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nHotspotShape = (function() {\n function HotspotShape() {}\n\n HotspotShape.RECTANGLE = \"rect\";\n\n HotspotShape.PIXEL = \"pixel\";\n\n return HotspotShape;\n\n})();\n\ngs.HotspotShape = HotspotShape;\n\nComponent_HotspotBehavior = (function(superClass) {\n extend(Component_HotspotBehavior, superClass);\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n Component_HotspotBehavior.prototype.onDataBundleRestore = function(data, context) {\n return this.setupEventHandlers();\n };\n\n\n /**\n * Adds a hotspot-behavior to a game object. That allows a game object\n * to respond to mouse/touch actions by firing an action-event or changing\n * the game object's image.\n *\n * @module gs\n * @class Component_HotspotBehavior\n * @extends gs.Component\n * @memberof gs\n * @constructor\n */\n\n function Component_HotspotBehavior(params) {\n\n /**\n * The shape used to detect if a hotspot is clicked, hovered, etc.\n * @property shape\n * @type boolean\n */\n var ref;\n this.shape = gs.HotspotShape.RECTANGLE;\n\n /**\n * Indicates if the hotspot is selected.\n * @property selected\n * @type boolean\n */\n this.selected = false;\n\n /**\n * Indicates if the hotspot is enabled.\n * @property enabled\n * @type boolean\n */\n this.enabled = true;\n\n /**\n * @property imageHandling\n * @type number\n * @protected\n */\n this.imageHandling = 0;\n\n /**\n * Indicates if the mouse/touch pointer is inside the hotspot bounds.\n * @property contains\n * @type boolean\n * @protected\n */\n this.containsPointer = false;\n\n /**\n * Indicates if the action-button was pressed before.\n * @property buttonUp\n * @type boolean\n * @protected\n */\n this.buttonUp = false;\n\n /**\n * Indicates if the action-button is pressed.\n * @property buttonDown\n * @type boolean\n * @protected\n */\n this.buttonDown = false;\n\n /**\n * @property actionButtons\n * @type Object\n * @protected\n */\n this.actionButtons = {\n \"left\": Input.Mouse.BUTTON_LEFT,\n \"right\": Input.Mouse.BUTTON_RIGHT,\n \"middle\": Input.Mouse.BUTTON_MIDDLE\n };\n\n /**\n * The default action-button. By default the left-button is used.\n *\n * @property actionButton\n * @type number\n */\n this.actionButton = this.actionButtons[(ref = params != null ? params.actionButton : void 0) != null ? ref : \"left\"];\n\n /**\n * The sound played if the hotspot action is executed.\n * @property sound\n * @type Object\n */\n this.sound = params != null ? params.sound : void 0;\n\n /**\n * <p>The sounds played depending on the hotspot state.</p>\n * <ul>\n * <li>0 = Select Sound</li>\n * <li>1 = Unselect Sound</li>\n * </ul>\n * @property sounds\n * @type Object[]\n */\n this.sounds = (params != null ? params.sounds : void 0) || [];\n }\n\n\n /**\n * Sets up event handlers.\n *\n * @method setupEventHandlers\n */\n\n Component_HotspotBehavior.prototype.setupEventHandlers = function() {\n gs.GlobalEventManager.offByOwner(\"mouseUp\", this.object);\n gs.GlobalEventManager.offByOwner(\"mouseMoved\", this.object);\n gs.GlobalEventManager.on(\"mouseUp\", ((function(_this) {\n return function(e) {\n var contains, mx, my;\n if (!_this.object.visible) {\n return;\n }\n mx = Input.Mouse.x - _this.object.origin.x;\n my = Input.Mouse.y - _this.object.origin.y;\n contains = Rect.contains(_this.object.dstRect.x, _this.object.dstRect.y, _this.object.dstRect.width, _this.object.dstRect.height, mx, my);\n if (contains) {\n contains = _this.checkShape(mx - _this.object.dstRect.x, my - _this.object.dstRect.y);\n if (contains) {\n _this.containsPointer = contains;\n _this.updateInput();\n _this.updateEvents();\n _this.object.needsUpdate = true;\n return e.breakChain = true;\n }\n }\n };\n })(this)), null, this.object);\n if (this.object.images || true) {\n return gs.GlobalEventManager.on(\"mouseMoved\", ((function(_this) {\n return function(e) {\n var contains, mx, my;\n if (!_this.object.visible) {\n return;\n }\n contains = Rect.contains(_this.object.dstRect.x, _this.object.dstRect.y, _this.object.dstRect.width, _this.object.dstRect.height, Input.Mouse.x - _this.object.origin.x, Input.Mouse.y - _this.object.origin.y);\n if (contains) {\n mx = Input.Mouse.x - _this.object.origin.x;\n my = Input.Mouse.y - _this.object.origin.y;\n contains = _this.checkShape(mx - _this.object.dstRect.x, my - _this.object.dstRect.y);\n }\n if (_this.containsPointer !== contains) {\n _this.containsPointer = contains;\n _this.object.needsUpdate = true;\n if (contains) {\n _this.object.events.emit(\"enter\", _this);\n } else {\n _this.object.events.emit(\"leave\", _this);\n }\n }\n return _this.updateInput();\n };\n })(this)), null, this.object);\n }\n };\n\n\n /**\n * Initializes the hotspot component.\n *\n * @method setup\n */\n\n Component_HotspotBehavior.prototype.setup = function() {\n var i, j, len, ref, sound;\n Component_HotspotBehavior.__super__.setup.apply(this, arguments);\n this.sound = ui.Component_FormulaHandler.fieldValue(this.object, this.sound);\n if (this.sounds != null) {\n ref = this.sounds;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n sound = ref[i];\n this.sounds[i] = ui.Component_FormulaHandler.fieldValue(this.object, sound);\n }\n } else {\n this.sounds = [];\n }\n return this.setupEventHandlers();\n };\n\n\n /**\n * Disposes the component.\n *\n * @method dispose\n */\n\n Component_HotspotBehavior.prototype.dispose = function() {\n Component_HotspotBehavior.__super__.dispose.apply(this, arguments);\n gs.GlobalEventManager.offByOwner(\"mouseUp\", this.object);\n return gs.GlobalEventManager.offByOwner(\"mouseMoved\", this.object);\n };\n\n\n /**\n * Checks if the specified point is inside of the hotspot's shape.\n *\n * @method checkShape\n * @param x - The x-coordinate of the point.\n * @param y - The y-coordinate of the point.\n * @return If <b>true</b> the point is inside of the hotspot's shape. Otherwise <b>false</b>.\n */\n\n Component_HotspotBehavior.prototype.checkShape = function(x, y) {\n var ref, result;\n result = true;\n switch (this.shape) {\n case gs.HotspotShape.PIXEL:\n if (this.object.bitmap) {\n result = this.object.bitmap.isPixelSet(x, y);\n } else {\n result = (ref = this.object.target) != null ? ref.bitmap.isPixelSet(x, y) : void 0;\n }\n }\n return result;\n };\n\n\n /**\n * Updates the image depending on the hotspot state.\n *\n * @method updateImage\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateImage = function() {\n var baseImage, object;\n object = this.object.target || this.object;\n if (this.object.images != null) {\n baseImage = this.enabled ? this.object.images[4] || this.object.images[0] : this.object.images[0];\n if (this.containsPointer) {\n if (this.object.selected || this.selected) {\n object.image = this.object.images[3] || this.object.images[2] || baseImage;\n } else {\n object.image = this.object.images[1] || baseImage;\n }\n } else {\n if (this.object.selected || this.selected) {\n object.image = this.object.images[2] || this.object.images[4] || baseImage;\n } else {\n object.image = baseImage;\n }\n }\n if (!object.image) {\n return object.bitmap = null;\n }\n }\n };\n\n\n /**\n * Updates the hotspot position and size from an other target game object. For example, \n * that is useful for adding a hotspot to an other moving game object.\n *\n * @method updateFromTarget\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateFromTarget = function() {\n if (this.object.target != null) {\n this.object.dstRect.x = this.object.target.dstRect.x;\n this.object.dstRect.y = this.object.target.dstRect.y;\n this.object.dstRect.width = this.object.target.dstRect.width;\n this.object.dstRect.height = this.object.target.dstRect.height;\n this.object.offset.x = this.object.target.offset.x;\n this.object.offset.y = this.object.target.offset.y;\n this.object.origin.x = this.object.target.origin.x;\n return this.object.origin.y = this.object.target.origin.y;\n }\n };\n\n\n /**\n * Updates the event-handling and fires necessary events.\n *\n * @method updateEvents\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateEvents = function() {\n var group, j, len, object;\n if (this.buttonUp && this.object.enabled && this.enabled && this.object.visible) {\n if (this.object.selectable) {\n group = gs.ObjectManager.current.objectsByGroup(this.object.group);\n for (j = 0, len = group.length; j < len; j++) {\n object = group[j];\n if (object !== this.object) {\n object.selected = false;\n }\n }\n if (this.object.group) {\n this.selected = true;\n } else {\n this.selected = !this.selected;\n }\n if (this.selected) {\n AudioManager.playSound(this.sounds[0] || this.sound);\n } else {\n AudioManager.playSound(this.sounds[1] || this.sound);\n }\n this.object.events.emit(\"click\", this);\n return this.object.events.emit(\"stateChanged\", this.object);\n } else {\n AudioManager.playSound(this.sounds[0] || this.sound);\n this.object.events.emit(\"click\", this);\n return this.object.events.emit(\"action\", this);\n }\n }\n };\n\n\n /**\n * Updates the game object's color depending on the state of the hotspot.\n *\n * @method updateColor\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateColor = function() {\n if (!this.object.enabled) {\n return this.object.color.set(0, 0, 0, 100);\n } else {\n return this.object.color.set(0, 0, 0, 0);\n }\n };\n\n\n /**\n * Stores current states of mouse/touch pointer and buttons.\n *\n * @method updateInput\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateInput = function() {\n this.buttonUp = Input.Mouse.buttons[this.actionButton] === 2 && this.containsPointer;\n return this.buttonDown = Input.Mouse.buttons[this.actionButton] === 1 && this.containsPointer;\n };\n\n\n /**\n * Updates the hotspot component.\n *\n * @method update\n */\n\n Component_HotspotBehavior.prototype.update = function() {\n if (!this.object.visible) {\n return;\n }\n this.updateColor();\n this.updateFromTarget();\n return this.updateImage();\n };\n\n return Component_HotspotBehavior;\n\n})(gs.Component);\n\ngs.Component_HotspotBehavior = Component_HotspotBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLElBQUEsdUNBQUE7RUFBQTs7O0FBQU07OztFQUNGLFlBQUMsQ0FBQSxTQUFELEdBQWE7O0VBQ2IsWUFBQyxDQUFBLEtBQUQsR0FBUzs7Ozs7O0FBQ2IsRUFBRSxDQUFDLFlBQUgsR0FBa0I7O0FBRVo7Ozs7QUFDRjs7Ozs7Ozs7O3NDQVFBLG1CQUFBLEdBQXFCLFNBQUMsSUFBRCxFQUFPLE9BQVA7V0FDakIsSUFBQyxDQUFBLGtCQUFELENBQUE7RUFEaUI7OztBQUdyQjs7Ozs7Ozs7Ozs7O0VBV2EsbUNBQUMsTUFBRDs7QUFDVDs7Ozs7QUFBQSxRQUFBO0lBS0EsSUFBQyxDQUFBLEtBQUQsR0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDOztBQUV6Qjs7Ozs7SUFLQSxJQUFDLENBQUEsUUFBRCxHQUFZOztBQUVaOzs7OztJQUtBLElBQUMsQ0FBQSxPQUFELEdBQVc7O0FBRVg7Ozs7O0lBS0EsSUFBQyxDQUFBLGFBQUQsR0FBaUI7O0FBRWpCOzs7Ozs7SUFNQSxJQUFDLENBQUEsZUFBRCxHQUFtQjs7QUFFbkI7Ozs7OztJQU1BLElBQUMsQ0FBQSxRQUFELEdBQVk7O0FBRVo7Ozs7OztJQU1BLElBQUMsQ0FBQSxVQUFELEdBQWM7O0FBRWQ7Ozs7O0lBS0EsSUFBQyxDQUFBLGFBQUQsR0FBaUI7TUFBRSxNQUFBLEVBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUF0QjtNQUFtQyxPQUFBLEVBQVMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUF4RDtNQUFzRSxRQUFBLEVBQVUsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUE1Rjs7O0FBRWpCOzs7Ozs7SUFNQSxJQUFDLENBQUEsWUFBRCxHQUFnQixJQUFDLENBQUEsYUFBYyx1RUFBdUIsTUFBdkI7O0FBRS9COzs7OztJQUtBLElBQUMsQ0FBQSxLQUFELG9CQUFTLE1BQU0sQ0FBRTs7QUFFakI7Ozs7Ozs7OztJQVNBLElBQUMs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YSxTQUFBO0lBQ1QsSUFBQyxDQUFBLFFBQUQsR0FBWSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQSxJQUFDLENBQUEsWUFBRCxDQUFwQixLQUFzQyxDQUF0QyxJQUE0QyxJQUFDLENBQUE7V0FDekQsSUFBQyxDQUFBLFVBQUQsR0FBYyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQSxJQUFDLENBQUEsWUFBRCxDQUFwQixLQUFzQyxDQUF0QyxJQUE0QyxJQUFDLENBQUE7RUFGbEQ7OztBQUliOzs7Ozs7c0NBS0EsTUFBQSxHQUFRLFNBQUE7SUFDSixJQUFHLENBQUksSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFmO0FBQTRCLGFBQTVCOztJQUVBLElBQUMsQ0FBQSxXQUFELENBQUE7SUFDQSxJQUFDLENBQUEsZ0JBQUQsQ0FBQTtXQUNBLElBQUMsQ0FBQSxXQUFELENBQUE7RUFMSTs7OztHQXpUNEIsRUFBRSxDQUFDOztBQWdVM0MsRUFBRSxDQUFDLHlCQUFILEdBQStCIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jXG4jICAgU2NyaXB0OiBDb21wb25lbnRfSG90c3BvdEJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNsYXNzIEhvdHNwb3RTaGFwZVxuICAgIEBSRUNUQU5HTEUgPSBcInJlY3RcIlxuICAgIEBQSVhFTCA9IFwicGl4ZWxcIlxuZ3MuSG90c3BvdFNoYXBlID0gSG90c3BvdFNoYXBlXG5cbmNsYXNzIENvbXBvbmVudF9Ib3RzcG90QmVoYXZpb3IgZXh0ZW5kcyBncy5Db21wb25lbnRcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFkZHMgYSBob3RzcG90LWJlaGF2aW9yIHRvIGEgZ2FtZSBvYmplY3QuIFRoYXQgYWxsb3dzIGEgZ2FtZSBvYmplY3RcbiAgICAqIHRvIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggYWN0aW9ucyBieSBmaXJpbmcgYW4gYWN0aW9uLWV2ZW50IG9yIGNoYW5naW5nXG4gICAgKiB0aGUgZ2FtZSBvYmplY3QncyBpbWFnZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0hvdHNwb3RCZWhhdmlvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAocGFyYW1zKSAtPlxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHNoYXBlIHVzZWQgdG8gZGV0ZWN0IGlmIGEgaG90c3BvdCBpcyBjbGlja2VkLCBob3ZlcmVkLCBldGMuXG4gICAgICAgICogQHByb3BlcnR5IHNoYXBlXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyNcbiAgICAgICAgQHNoYXBlID0gZ3MuSG90c3BvdFNoYXBlLlJFQ1RBTkdMRVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgaG90c3BvdCBpcyBzZWxlY3RlZC5cbiAgICAgICAgKiBAcHJvcGVydHkgc2VsZWN0ZWRcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICMjI1xuICAgICAgICBAc2VsZWN0ZWQgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgaG90c3BvdCBpcyBlbmFibGVkLlxuICAgICAgICAqIEBwcm9wZXJ0eSBlbmFibGVkXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyNcbiAgICAgICAgQGVuYWJsZWQgPSB5ZXNcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgaW1hZ2VIYW5kbGluZ1xuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBpbWFnZUhhbmRsaW5nID0gMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgbW91c2UvdG91Y2ggcG9pbnRlciBpcyBpbnNpZGUgdGhlIGhvdHNwb3QgYm91bmRzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjb250YWluc1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAY29udGFpbnNQb2ludGVyID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbi1idXR0b24gd2FzIHByZXNzZWQgYmVmb3JlLlxuICAgICAgICAqIEBwcm9wZXJ0eSBidXR0b25VcFxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAYnV0dG9uVXAgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWN0aW9uLWJ1dHRvbiBpcyBwcmVzc2VkLlxuICAgICAgICAqIEBwcm9wZXJ0eSBidXR0b25Eb3duXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBidXR0b25Eb3duID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgYWN0aW9uQnV0dG9uc1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBhY3Rpb25CdXR0b25zID0geyBcImxlZnRcIjogSW5wdXQuTW91c2UuQlVUVE9OX0xFRlQsIFwicmlnaHRcIjogSW5wdXQuTW91c2UuQlVUVE9OX1JJR0hULCBcIm1pZGRsZVwiOiBJbnB1dC5Nb3VzZS5CVVRUT05fTUlERExFIH1cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24tYnV0dG9uLiBCeSBkZWZhdWx0IHRoZSBsZWZ0LWJ1dHRvbiBpcyB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQHByb3BlcnR5IGFjdGlvbkJ1dHRvblxuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAjIyNcbiAgICAgICAgQGFjdGlvbkJ1dHRvbiA9IEBhY3Rpb25CdXR0b25zW3BhcmFtcz8uYWN0aW9uQnV0dG9uID8gXCJsZWZ0XCJdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHNvdW5kIHBsYXllZCBpZiB0aGUgaG90c3BvdCBhY3Rpb24gaXMgZXhlY3V0ZWQuXG4gICAgICAgICogQHByb3BlcnR5IHNvdW5kXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjI1xuICAgICAgICBAc291bmQgPSBwYXJhbXM/LnNvdW5kXG5cbiAgICAgICAgIyMjKlxuICAgICAgICAqIDxwPlRoZSBzb3VuZHMgcGxheWVkIGRlcGVuZGluZyBvbiB0aGUgaG90c3BvdCBzdGF0ZS48L3A+XG4gICAgICAgICogPHVsPlxuICAgICAgICAqIDxsaT4wID0gU2VsZWN0IFNvdW5kPC9saT5cbiAgICAgICAgKiA8bGk+MSA9IFVuc2VsZWN0IFNvdW5kPC9saT5cbiAgICAgICAgKiA8L3VsPlxuICAgICAgICAqIEBwcm9wZXJ0eSBzb3VuZHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyNcbiAgICAgICAgQHNvdW5kcyA9IHBhcmFtcz8uc291bmRzIHx8IFtdXG4gICAgXG4gICAgIyMjKlxuICAgICogU2V0cyB1cCBldmVudCBoYW5kbGVycy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwRXZlbnRIYW5kbGVyc1xuICAgICMjIyAgIFxuICAgIHNldHVwRXZlbnRIYW5kbGVyczogLT5cbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9mZkJ5T3duZXIoXCJtb3VzZVVwXCIsIEBvYmplY3QpXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwibW91c2VNb3ZlZFwiLCBAb2JqZWN0KVxuICAgICAgICBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwibW91c2VVcFwiLCAoKGUpID0+IFxuICAgICAgICAgICAgcmV0dXJuIGlmIG5vdCBAb2JqZWN0LnZpc2libGVcbiAgICAgICAgICAgIG14ID0gSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLnhcbiAgICAgICAgICAgIG15ID0gSW5wdXQuTW91c2UueSAtIEBvYmplY3Qub3JpZ2luLnlcbiAgICAgICAgICAgIGNvbnRhaW5zID0gUmVjdC5jb250YWlucyhAb2JqZWN0LmRzdFJlY3QueCwgQG9iamVjdC5kc3RSZWN0LnksIFxuICAgICAgICAgICAgICAgICAgICAgICAgIEBvYmplY3QuZHN0UmVjdC53aWR0aCwgQG9iamVjdC5kc3RSZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBteCwgbXkpXG4gICAgICAgICAgICBpZiBjb250YWluc1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gQGNoZWNrU2hhcGUobXggLSBAb2JqZWN0LmRzdFJlY3QueCwgbXkgLSBAb2JqZWN0LmRzdFJlY3QueSlcbiAgICAgICAgICAgICAgICBpZiBjb250YWluc1xuICAgICAgICAgICAgICAgICAgICBAY29udGFpbnNQb2ludGVyID0gY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZUlucHV0KClcbiAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZUV2ZW50cygpXG4gICAgICAgICAgICAgICAgICAgIEBvYmplY3QubmVlZHNVcGRhdGUgPSB5ZXNcbiAgICAgICAgICAgICAgICAgICAgZS5icmVha0NoYWluID0geWVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbnVsbCwgQG9iamVjdFxuICAgICAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QuaW1hZ2VzIG9yIHllc1xuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwibW91c2VNb3ZlZFwiLCAoKGUpID0+XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlmIG5vdCBAb2JqZWN0LnZpc2libGVcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IFJlY3QuY29udGFpbnMoQG9iamVjdC5kc3RSZWN0LngsIEBvYmplY3QuZHN0UmVjdC55LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLngsIElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55KVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgbXggPSBJbnB1dC5Nb3VzZS54IC0gQG9iamVjdC5vcmlnaW4ueFxuICAgICAgICAgICAgICAgICAgICBteSA9IElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gQGNoZWNrU2hhcGUobXggLSBAb2JqZWN0LmRzdFJlY3QueCwgbXkgLSBAb2JqZWN0LmRzdFJlY3QueSlcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgQGNvbnRhaW5zUG9pbnRlciAhPSBjb250YWluc1xuICAgICAgICAgICAgICAgICAgICBAY29udGFpbnNQb2ludGVyID0gY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIEBvYmplY3QuZXZlbnRzLmVtaXQoXCJlbnRlclwiLCB0aGlzKVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwibGVhdmVcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBAdXBkYXRlSW5wdXQoKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG51bGwsIEBvYmplY3RcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIEluaXRpYWxpemVzIHRoZSBob3RzcG90IGNvbXBvbmVudC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwXG4gICAgIyMjXG4gICAgc2V0dXA6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICBAc291bmQgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShAb2JqZWN0LCBAc291bmQpXG4gICAgICAgIFxuICAgICAgICBpZiBAc291bmRzP1xuICAgICAgICAgICAgZm9yIHNvdW5kLCBpIGluIEBzb3VuZHNcbiAgICAgICAgICAgICAgICBAc291bmRzW2ldID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoQG9iamVjdCwgc291bmQpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgQHNvdW5kcyA9IFtdXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgICAgICAgICAgICAgXG4gXG4gICAgXG4gICAgIyMjKlxuICAgICogRGlzcG9zZXMgdGhlIGNvbXBvbmVudC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICAjIyNcbiAgICBkaXNwb3NlOiAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9mZkJ5T3duZXIoXCJtb3VzZVVwXCIsIEBvYmplY3QpXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwibW91c2VNb3ZlZFwiLCBAb2JqZWN0KVxuICAgICAgICBcbiAgICBcbiAgICAjIyMqXG4gICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwb2ludCBpcyBpbnNpZGUgb2YgdGhlIGhvdHNwb3QncyBzaGFwZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNoZWNrU2hhcGVcbiAgICAqIEBwYXJhbSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuXG4gICAgKiBAcGFyYW0geSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgICogQHJldHVybiBJZiA8Yj50cnVlPC9iPiB0aGUgcG9pbnQgaXMgaW5zaWRlIG9mIHRoZSBob3RzcG90J3Mgc2hhcGUuIE90aGVyd2lzZSA8Yj5mYWxzZTwvYj4uXG4gICAgIyMjICBcbiAgICBjaGVja1NoYXBlOiAoeCwgeSkgLT5cbiAgICAgICAgcmVzdWx0ID0geWVzXG4gICAgICAgIFxuICAgICAgICBzd2l0Y2ggQHNoYXBlXG4gICAgICAgICAgICB3aGVuIGdzLkhvdHNwb3RTaGFwZS5QSVhFTFxuICAgICAgICAgICAgICAgIGlmIEBvYmplY3QuYml0bWFwXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBvYmplY3QuYml0bWFwLmlzUGl4ZWxTZXQoeCwgeSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBvYmplY3QudGFyZ2V0Py5iaXRtYXAuaXNQaXhlbFNldCh4LCB5KVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBpbWFnZSBkZXBlbmRpbmcgb24gdGhlIGhvdHNwb3Qgc3RhdGUuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVJbWFnZVxuICAgICogQHByb3RlY3RlZFxuICAgICMjIyAgICAgICAgICAgICAgICBcbiAgICB1cGRhdGVJbWFnZTogLT5cbiAgICAgICAgb2JqZWN0ID0gQG9iamVjdC50YXJnZXQgfHwgQG9iamVjdFxuICAgICAgICBpZiBAb2JqZWN0LmltYWdlcz9cbiAgICAgICAgICAgIGJhc2VJbWFnZSA9IGlmIEBlbmFibGVkIHRoZW4gQG9iamVjdC5pbWFnZXNbNF0gfHwgQG9iamVjdC5pbWFnZXNbMF0gZWxzZSBAb2JqZWN0LmltYWdlc1swXVxuICAgICAgICAgICAgaWYgQGNvbnRhaW5zUG9pbnRlclxuICAgICAgICAgICAgICAgIGlmIEBvYmplY3Quc2VsZWN0ZWQgb3IgQHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbWFnZSA9IEBvYmplY3QuaW1hZ2VzWzNdIHx8IEBvYmplY3QuaW1hZ2VzWzJdIHx8IGJhc2VJbWFnZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmltYWdlID0gQG9iamVjdC5pbWFnZXNbMV0gfHwgYmFzZUltYWdlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaWYgQG9iamVjdC5zZWxlY3RlZCBvciBAc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmltYWdlID0gQG9iamVjdC5pbWFnZXNbMl0gfHwgQG9iamVjdC5pbWFnZXNbNF0gfHwgYmFzZUltYWdlXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBvYmplY3QuaW1hZ2UgPSBiYXNlSW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAhb2JqZWN0LmltYWdlXG4gICAgICAgICAgICAgICAgb2JqZWN0LmJpdG1hcCA9IG51bGxcblxuICAgIFxuICAgICMjIypcbiAgICAqIFVwZGF0ZXMgdGhlIGhvdHNwb3QgcG9zaXRpb24gYW5kIHNpemUgZnJvbSBhbiBvdGhlciB0YXJnZXQgZ2FtZSBvYmplY3QuIEZvciBleGFtcGxlLCBcbiAgICAqIHRoYXQgaXMgdXNlZnVsIGZvciBhZGRpbmcgYSBob3RzcG90IHRvIGFuIG90aGVyIG1vdmluZyBnYW1lIG9iamVjdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZUZyb21UYXJnZXRcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgXG4gICAgdXBkYXRlRnJvbVRhcmdldDogLT5cbiAgICAgICAgaWYgQG9iamVjdC50YXJnZXQ/XG4gICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3QueCA9IEBvYmplY3QudGFyZ2V0LmRzdFJlY3QueFxuICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LnkgPSBAb2JqZWN0LnRhcmdldC5kc3RSZWN0LnlcbiAgICAgICAgICAgIEBvYmplY3QuZHN0UmVjdC53aWR0aCA9IEBvYmplY3QudGFyZ2V0LmRzdFJlY3Qud2lkdGhcbiAgICAgICAgICAgIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQgPSBAb2JqZWN0LnRhcmdldC5kc3RSZWN0LmhlaWdodFxuICAgICAgICAgICAgQG9iamVjdC5vZmZzZXQueCA9IEBvYmplY3QudGFyZ2V0Lm9mZnNldC54XG4gICAgICAgICAgICBAb2JqZWN0Lm9mZnNldC55ID0gQG9iamVjdC50YXJnZXQub2Zmc2V0LnlcbiAgICAgICAgICAgIEBvYmplY3Qub3JpZ2luLnggPSBAb2JqZWN0LnRhcmdldC5vcmlnaW4ueFxuICAgICAgICAgICAgQG9iamVjdC5vcmlnaW4ueSA9IEBvYmplY3QudGFyZ2V0Lm9yaWdpbi55IFxuICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBldmVudC1oYW5kbGluZyBhbmQgZmlyZXMgbmVjZXNzYXJ5IGV2ZW50cy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZUV2ZW50c1xuICAgICogQHByb3RlY3RlZFxuICAgICMjIyAgICAgICAgXG4gICAgdXBkYXRlRXZlbnRzOiAtPlxuICAgICAgICBpZiBAYnV0dG9uVXAgYW5kIEBvYmplY3QuZW5hYmxlZCBhbmQgQGVuYWJsZWQgYW5kIEBvYmplY3QudmlzaWJsZVxuICAgICAgICAgICAgaWYgQG9iamVjdC5zZWxlY3RhYmxlXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBncy5PYmplY3RNYW5hZ2VyLmN1cnJlbnQub2JqZWN0c0J5R3JvdXAoQG9iamVjdC5ncm91cClcbiAgICAgICAgICAgICAgICBmb3Igb2JqZWN0IGluIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgIGlmIG9iamVjdCAhPSBAb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2VsZWN0ZWQgPSBub1xuICAgICAgICAgICAgICAgIGlmIEBvYmplY3QuZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgQHNlbGVjdGVkID0geWVzXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBAc2VsZWN0ZWQgPSAhQHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgQHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5wbGF5U291bmQoQHNvdW5kc1swXSB8fCBAc291bmQpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIucGxheVNvdW5kKEBzb3VuZHNbMV0gfHwgQHNvdW5kKVxuICAgICAgICAgICAgICAgIEBvYmplY3QuZXZlbnRzLmVtaXQoXCJjbGlja1wiLCB0aGlzKVxuICAgICAgICAgICAgICAgIEBvYmplY3QuZXZlbnRzLmVtaXQoXCJzdGF0ZUNoYW5nZWRcIiwgQG9iamVjdClcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIucGxheVNvdW5kKEBzb3VuZHNbMF0gfHwgQHNvdW5kKVxuICAgICAgICAgICAgICAgIEBvYmplY3QuZXZlbnRzLmVtaXQoXCJjbGlja1wiLCB0aGlzKVxuICAgICAgICAgICAgICAgIEBvYmplY3QuZXZlbnRzLmVtaXQoXCJhY3Rpb25cIiwgdGhpcylcbiAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBnYW1lIG9iamVjdCdzIGNvbG9yIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGhvdHNwb3QuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVDb2xvclxuICAgICogQHByb3RlY3RlZFxuICAgICMjIyAgXG4gICAgdXBkYXRlQ29sb3I6IC0+XG4gICAgICAgIGlmICFAb2JqZWN0LmVuYWJsZWRcbiAgICAgICAgICAgIEBvYmplY3QuY29sb3Iuc2V0KDAsIDAsIDAsIDEwMClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQG9iamVjdC5jb2xvci5zZXQoMCwgMCwgMCwgMClcbiAgICAgXG4gICAgIyMjKlxuICAgICogU3RvcmVzIGN1cnJlbnQgc3RhdGVzIG9mIG1vdXNlL3RvdWNoIHBvaW50ZXIgYW5kIGJ1dHRvbnMuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVJbnB1dFxuICAgICogQHByb3RlY3RlZFxuICAgICMjIyAgICAgICAgXG4gICAgdXBkYXRlSW5wdXQ6IC0+XG4gICAgICAgIEBidXR0b25VcCA9IElucHV0Lk1vdXNlLmJ1dHRvbnNbQGFjdGlvbkJ1dHRvbl0gPT0gMiBhbmQgQGNvbnRhaW5zUG9pbnRlclxuICAgICAgICBAYnV0dG9uRG93biA9IElucHV0Lk1vdXNlLmJ1dHRvbnNbQGFjdGlvbkJ1dHRvbl0gPT0gMSBhbmQgQGNvbnRhaW5zUG9pbnRlclxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBob3RzcG90IGNvbXBvbmVudC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICMjI1xuICAgIHVwZGF0ZTogLT5cbiAgICAgICAgaWYgbm90IEBvYmplY3QudmlzaWJsZSB0aGVuIHJldHVyblxuXG4gICAgICAgIEB1cGRhdGVDb2xvcigpXG4gICAgICAgIEB1cGRhdGVGcm9tVGFyZ2V0KClcbiAgICAgICAgQHVwZGF0ZUltYWdlKClcbiAgICAgICAgXG5ncy5Db21wb25lbnRfSG90c3BvdEJlaGF2aW9yID0gQ29tcG9uZW50X0hvdHNwb3RCZWhhdmlvciJdfQ==\n//# sourceURL=Component_HotspotBehavior_19.js"
12 + "compiledContent": "var Component_HotspotBehavior, HotspotShape,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nHotspotShape = (function() {\n function HotspotShape() {}\n\n HotspotShape.RECTANGLE = \"rect\";\n\n HotspotShape.PIXEL = \"pixel\";\n\n return HotspotShape;\n\n})();\n\ngs.HotspotShape = HotspotShape;\n\nComponent_HotspotBehavior = (function(superClass) {\n extend(Component_HotspotBehavior, superClass);\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n Component_HotspotBehavior.prototype.onDataBundleRestore = function(data, context) {\n return this.setupEventHandlers();\n };\n\n\n /**\n * Adds a hotspot-behavior to a game object. That allows a game object\n * to respond to mouse/touch actions by firing an action-event or changing\n * the game object's image.\n *\n * @module gs\n * @class Component_HotspotBehavior\n * @extends gs.Component\n * @memberof gs\n * @constructor\n */\n\n function Component_HotspotBehavior(params) {\n\n /**\n * The shape used to detect if a hotspot is clicked, hovered, etc.\n * @property shape\n * @type boolean\n */\n var ref;\n this.shape = gs.HotspotShape.RECTANGLE;\n\n /**\n * Indicates if the hotspot is selected.\n * @property selected\n * @type boolean\n */\n this.selected = false;\n\n /**\n * Indicates if the hotspot is enabled.\n * @property enabled\n * @type boolean\n */\n this.enabled = true;\n\n /**\n * @property imageHandling\n * @type number\n * @protected\n */\n this.imageHandling = 0;\n\n /**\n * Indicates if the mouse/touch pointer is inside the hotspot bounds.\n * @property contains\n * @type boolean\n * @protected\n */\n this.containsPointer = false;\n\n /**\n * Indicates if the action-button was pressed before.\n * @property buttonUp\n * @type boolean\n * @protected\n */\n this.buttonUp = false;\n\n /**\n * Indicates if the action-button is pressed.\n * @property buttonDown\n * @type boolean\n * @protected\n */\n this.buttonDown = false;\n\n /**\n * @property actionButtons\n * @type Object\n * @protected\n */\n this.actionButtons = {\n \"left\": Input.Mouse.BUTTON_LEFT,\n \"right\": Input.Mouse.BUTTON_RIGHT,\n \"middle\": Input.Mouse.BUTTON_MIDDLE\n };\n\n /**\n * The default action-button. By default the left-button is used.\n *\n * @property actionButton\n * @type number\n */\n this.actionButton = this.actionButtons[(ref = params != null ? params.actionButton : void 0) != null ? ref : \"left\"];\n\n /**\n * The sound played if the hotspot action is executed.\n * @property sound\n * @type Object\n */\n this.sound = params != null ? params.sound : void 0;\n\n /**\n * <p>The sounds played depending on the hotspot state.</p>\n * <ul>\n * <li>0 = Select Sound</li>\n * <li>1 = Unselect Sound</li>\n * </ul>\n * @property sounds\n * @type Object[]\n */\n this.sounds = (params != null ? params.sounds : void 0) || [];\n }\n\n\n /**\n * Gets the render-index of the object associated with the hotspot component. This \n * implementation is necessary to be able to act as an owner for gs.EventEmitter.on \n * event registration. \n *\n * @property rIndex\n * @type number\n */\n\n Component_HotspotBehavior.accessors(\"rIndex\", {\n get: function() {\n return this.object.rIndex;\n }\n });\n\n\n /**\n * Sets up event handlers.\n *\n * @method setupEventHandlers\n */\n\n Component_HotspotBehavior.prototype.setupEventHandlers = function() {\n gs.GlobalEventManager.offByOwner(\"mouseUp\", this);\n gs.GlobalEventManager.offByOwner(\"mouseMoved\", this);\n gs.GlobalEventManager.on(\"mouseUp\", ((function(_this) {\n return function(e) {\n var contains, mx, my;\n if (!_this.object.visible) {\n return;\n }\n mx = Input.Mouse.x - _this.object.origin.x;\n my = Input.Mouse.y - _this.object.origin.y;\n contains = Rect.contains(_this.object.dstRect.x, _this.object.dstRect.y, _this.object.dstRect.width, _this.object.dstRect.height, mx, my);\n if (contains) {\n contains = _this.checkShape(mx - _this.object.dstRect.x, my - _this.object.dstRect.y);\n if (contains) {\n _this.containsPointer = contains;\n _this.updateInput();\n _this.updateEvents();\n _this.object.needsUpdate = true;\n return e.breakChain = true;\n }\n }\n };\n })(this)), null, this);\n if (this.object.images || true) {\n return gs.GlobalEventManager.on(\"mouseMoved\", ((function(_this) {\n return function(e) {\n var contains, mx, my;\n if (!_this.object.visible) {\n return;\n }\n contains = Rect.contains(_this.object.dstRect.x, _this.object.dstRect.y, _this.object.dstRect.width, _this.object.dstRect.height, Input.Mouse.x - _this.object.origin.x, Input.Mouse.y - _this.object.origin.y);\n if (contains) {\n mx = Input.Mouse.x - _this.object.origin.x;\n my = Input.Mouse.y - _this.object.origin.y;\n contains = _this.checkShape(mx - _this.object.dstRect.x, my - _this.object.dstRect.y);\n }\n if (_this.containsPointer !== contains) {\n _this.containsPointer = contains;\n _this.object.needsUpdate = true;\n if (contains) {\n _this.object.events.emit(\"enter\", _this);\n } else {\n _this.object.events.emit(\"leave\", _this);\n }\n }\n return _this.updateInput();\n };\n })(this)), null, this);\n }\n };\n\n\n /**\n * Initializes the hotspot component.\n *\n * @method setup\n */\n\n Component_HotspotBehavior.prototype.setup = function() {\n var i, j, len, ref, sound;\n Component_HotspotBehavior.__super__.setup.apply(this, arguments);\n this.sound = ui.Component_FormulaHandler.fieldValue(this.object, this.sound);\n if (this.sounds != null) {\n ref = this.sounds;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n sound = ref[i];\n this.sounds[i] = ui.Component_FormulaHandler.fieldValue(this.object, sound);\n }\n } else {\n this.sounds = [];\n }\n return this.setupEventHandlers();\n };\n\n\n /**\n * Disposes the component.\n *\n * @method dispose\n */\n\n Component_HotspotBehavior.prototype.dispose = function() {\n Component_HotspotBehavior.__super__.dispose.apply(this, arguments);\n gs.GlobalEventManager.offByOwner(\"mouseUp\", this);\n return gs.GlobalEventManager.offByOwner(\"mouseMoved\", this);\n };\n\n\n /**\n * Checks if the specified point is inside of the hotspot's shape.\n *\n * @method checkShape\n * @param x - The x-coordinate of the point.\n * @param y - The y-coordinate of the point.\n * @return If <b>true</b> the point is inside of the hotspot's shape. Otherwise <b>false</b>.\n */\n\n Component_HotspotBehavior.prototype.checkShape = function(x, y) {\n var ref, result;\n result = true;\n switch (this.shape) {\n case gs.HotspotShape.PIXEL:\n if (this.object.bitmap) {\n result = this.object.bitmap.isPixelSet(x, y);\n } else {\n result = (ref = this.object.target) != null ? ref.bitmap.isPixelSet(x, y) : void 0;\n }\n }\n return result;\n };\n\n\n /**\n * Updates the image depending on the hotspot state.\n *\n * @method updateImage\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateImage = function() {\n var baseImage, object;\n object = this.object.target || this.object;\n if (this.object.images != null) {\n baseImage = this.enabled ? this.object.images[4] || this.object.images[0] : this.object.images[0];\n if (this.containsPointer) {\n if (this.object.selected || this.selected) {\n object.image = this.object.images[3] || this.object.images[2] || baseImage;\n } else {\n object.image = this.object.images[1] || baseImage;\n }\n } else {\n if (this.object.selected || this.selected) {\n object.image = this.object.images[2] || this.object.images[4] || baseImage;\n } else {\n object.image = baseImage;\n }\n }\n if (!object.image) {\n return object.bitmap = null;\n }\n }\n };\n\n\n /**\n * Updates the hotspot position and size from an other target game object. For example, \n * that is useful for adding a hotspot to an other moving game object.\n *\n * @method updateFromTarget\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateFromTarget = function() {\n if (this.object.target != null) {\n this.object.dstRect.x = this.object.target.dstRect.x;\n this.object.dstRect.y = this.object.target.dstRect.y;\n this.object.dstRect.width = this.object.target.dstRect.width;\n this.object.dstRect.height = this.object.target.dstRect.height;\n this.object.offset.x = this.object.target.offset.x;\n this.object.offset.y = this.object.target.offset.y;\n this.object.origin.x = this.object.target.origin.x;\n return this.object.origin.y = this.object.target.origin.y;\n }\n };\n\n\n /**\n * Updates the event-handling and fires necessary events.\n *\n * @method updateEvents\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateEvents = function() {\n var group, j, len, object;\n if (this.buttonUp && this.object.enabled && this.enabled && this.object.visible) {\n if (this.object.selectable) {\n group = gs.ObjectManager.current.objectsByGroup(this.object.group);\n for (j = 0, len = group.length; j < len; j++) {\n object = group[j];\n if (object !== this.object) {\n object.selected = false;\n }\n }\n if (this.object.group) {\n this.selected = true;\n } else {\n this.selected = !this.selected;\n }\n if (this.selected) {\n AudioManager.playSound(this.sounds[0] || this.sound);\n } else {\n AudioManager.playSound(this.sounds[1] || this.sound);\n }\n this.object.events.emit(\"click\", this);\n return this.object.events.emit(\"stateChanged\", this.object);\n } else {\n AudioManager.playSound(this.sounds[0] || this.sound);\n this.object.events.emit(\"click\", this);\n return this.object.events.emit(\"action\", this);\n }\n }\n };\n\n\n /**\n * Updates the game object's color depending on the state of the hotspot.\n *\n * @method updateColor\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateColor = function() {\n if (!this.object.enabled) {\n return this.object.color.set(0, 0, 0, 100);\n } else {\n return this.object.color.set(0, 0, 0, 0);\n }\n };\n\n\n /**\n * Stores current states of mouse/touch pointer and buttons.\n *\n * @method updateInput\n * @protected\n */\n\n Component_HotspotBehavior.prototype.updateInput = function() {\n this.buttonUp = Input.Mouse.buttons[this.actionButton] === 2 && this.containsPointer;\n return this.buttonDown = Input.Mouse.buttons[this.actionButton] === 1 && this.containsPointer;\n };\n\n\n /**\n * Updates the hotspot component.\n *\n * @method update\n */\n\n Component_HotspotBehavior.prototype.update = function() {\n if (!this.object.visible) {\n return;\n }\n this.updateColor();\n this.updateFromTarget();\n return this.updateImage();\n };\n\n return Component_HotspotBehavior;\n\n})(gs.Component);\n\ngs.Component_HotspotBehavior = Component_HotspotBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLElBQUEsdUNBQUE7RUFBQTs7O0FBQU07OztFQUNGLFlBQUMsQ0FBQSxTQUFELEdBQWE7O0VBQ2IsWUFBQyxDQUFBLEtBQUQsR0FBUzs7Ozs7O0FBQ2IsRUFBRSxDQUFDLFlBQUgsR0FBa0I7O0FBRVo7Ozs7QUFDRjs7Ozs7Ozs7O3NDQVFBLG1CQUFBLEdBQXFCLFNBQUMsSUFBRCxFQUFPLE9BQVA7V0FDakIsSUFBQyxDQUFBLGtCQUFELENBQUE7RUFEaUI7OztBQUdyQjs7Ozs7Ozs7Ozs7O0VBV2EsbUNBQUMsTUFBRDs7QUFDVDs7Ozs7QUFBQSxRQUFBO0lBS0EsSUFBQyxDQUFBLEtBQUQsR0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDOztBQUV6Qjs7Ozs7SUFLQSxJQUFDLENBQUEsUUFBRCxHQUFZOztBQUVaOzs7OztJQUtBLElBQUMsQ0FBQSxPQUFELEdBQVc7O0FBRVg7Ozs7O0lBS0EsSUFBQyxDQUFBLGFBQUQsR0FBaUI7O0FBRWpCOzs7Ozs7SUFNQSxJQUFDLENBQUEsZUFBRCxHQUFtQjs7QUFFbkI7Ozs7OztJQU1BLElBQUMsQ0FBQSxRQUFELEdBQVk7O0FBRVo7Ozs7OztJQU1BLElBQUMsQ0FBQSxVQUFELEdBQWM7O0FBRWQ7Ozs7O0lBS0EsSUFBQyxDQUFBLGFBQUQsR0FBaUI7TUFBRSxNQUFBLEVBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUF0QjtNQUFtQyxPQUFBLEVBQVMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUF4RDtNQUFzRSxRQUFBLEVBQVUsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUE1Rjs7O0FBRWpCOzs7Ozs7SUFNQSxJQUFDLENBQUEsWUFBRCxHQUFnQixJQUFDLENBQUEsYUFBYyx1RUFBdUIsTUFBdkI7O0FBRS9COzs7OztJQUtBLElBQUMsQ0FBQSxLQUFELG9CQUFTLE1BQU0sQ0FBRTs7QUFFakI7Ozs7Ozs7OztJQVNBLElBQUMs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LEVBQTJCLENBQTNCLEVBSEo7O0VBRFM7OztBQU1iOzs7Ozs7O3NDQU1BLFdBQUEsR0FBYSxTQUFBO0lBQ1QsSUFBQyxDQUFBLFFBQUQsR0FBWSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQSxJQUFDLENBQUEsWUFBRCxDQUFwQixLQUFzQyxDQUF0QyxJQUE0QyxJQUFDLENBQUE7V0FDekQsSUFBQyxDQUFBLFVBQUQsR0FBYyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQSxJQUFDLENBQUEsWUFBRCxDQUFwQixLQUFzQyxDQUF0QyxJQUE0QyxJQUFDLENBQUE7RUFGbEQ7OztBQUliOzs7Ozs7c0NBS0EsTUFBQSxHQUFRLFNBQUE7SUFDSixJQUFHLENBQUksSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFmO0FBQTRCLGFBQTVCOztJQUVBLElBQUMsQ0FBQSxXQUFELENBQUE7SUFDQSxJQUFDLENBQUEsZ0JBQUQsQ0FBQTtXQUNBLElBQUMsQ0FBQSxXQUFELENBQUE7RUFMSTs7OztHQXRVNEIsRUFBRSxDQUFDOztBQTZVM0MsRUFBRSxDQUFDLHlCQUFILEdBQStCIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jXG4jICAgU2NyaXB0OiBDb21wb25lbnRfSG90c3BvdEJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNsYXNzIEhvdHNwb3RTaGFwZVxuICAgIEBSRUNUQU5HTEUgPSBcInJlY3RcIlxuICAgIEBQSVhFTCA9IFwicGl4ZWxcIlxuZ3MuSG90c3BvdFNoYXBlID0gSG90c3BvdFNoYXBlXG5cbmNsYXNzIENvbXBvbmVudF9Ib3RzcG90QmVoYXZpb3IgZXh0ZW5kcyBncy5Db21wb25lbnRcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFkZHMgYSBob3RzcG90LWJlaGF2aW9yIHRvIGEgZ2FtZSBvYmplY3QuIFRoYXQgYWxsb3dzIGEgZ2FtZSBvYmplY3RcbiAgICAqIHRvIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggYWN0aW9ucyBieSBmaXJpbmcgYW4gYWN0aW9uLWV2ZW50IG9yIGNoYW5naW5nXG4gICAgKiB0aGUgZ2FtZSBvYmplY3QncyBpbWFnZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0hvdHNwb3RCZWhhdmlvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAocGFyYW1zKSAtPlxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHNoYXBlIHVzZWQgdG8gZGV0ZWN0IGlmIGEgaG90c3BvdCBpcyBjbGlja2VkLCBob3ZlcmVkLCBldGMuXG4gICAgICAgICogQHByb3BlcnR5IHNoYXBlXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyNcbiAgICAgICAgQHNoYXBlID0gZ3MuSG90c3BvdFNoYXBlLlJFQ1RBTkdMRVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgaG90c3BvdCBpcyBzZWxlY3RlZC5cbiAgICAgICAgKiBAcHJvcGVydHkgc2VsZWN0ZWRcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICMjI1xuICAgICAgICBAc2VsZWN0ZWQgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgaG90c3BvdCBpcyBlbmFibGVkLlxuICAgICAgICAqIEBwcm9wZXJ0eSBlbmFibGVkXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyNcbiAgICAgICAgQGVuYWJsZWQgPSB5ZXNcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgaW1hZ2VIYW5kbGluZ1xuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBpbWFnZUhhbmRsaW5nID0gMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgbW91c2UvdG91Y2ggcG9pbnRlciBpcyBpbnNpZGUgdGhlIGhvdHNwb3QgYm91bmRzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjb250YWluc1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAY29udGFpbnNQb2ludGVyID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbi1idXR0b24gd2FzIHByZXNzZWQgYmVmb3JlLlxuICAgICAgICAqIEBwcm9wZXJ0eSBidXR0b25VcFxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAYnV0dG9uVXAgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWN0aW9uLWJ1dHRvbiBpcyBwcmVzc2VkLlxuICAgICAgICAqIEBwcm9wZXJ0eSBidXR0b25Eb3duXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBidXR0b25Eb3duID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgYWN0aW9uQnV0dG9uc1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBhY3Rpb25CdXR0b25zID0geyBcImxlZnRcIjogSW5wdXQuTW91c2UuQlVUVE9OX0xFRlQsIFwicmlnaHRcIjogSW5wdXQuTW91c2UuQlVUVE9OX1JJR0hULCBcIm1pZGRsZVwiOiBJbnB1dC5Nb3VzZS5CVVRUT05fTUlERExFIH1cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24tYnV0dG9uLiBCeSBkZWZhdWx0IHRoZSBsZWZ0LWJ1dHRvbiBpcyB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQHByb3BlcnR5IGFjdGlvbkJ1dHRvblxuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAjIyNcbiAgICAgICAgQGFjdGlvbkJ1dHRvbiA9IEBhY3Rpb25CdXR0b25zW3BhcmFtcz8uYWN0aW9uQnV0dG9uID8gXCJsZWZ0XCJdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHNvdW5kIHBsYXllZCBpZiB0aGUgaG90c3BvdCBhY3Rpb24gaXMgZXhlY3V0ZWQuXG4gICAgICAgICogQHByb3BlcnR5IHNvdW5kXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjI1xuICAgICAgICBAc291bmQgPSBwYXJhbXM/LnNvdW5kXG5cbiAgICAgICAgIyMjKlxuICAgICAgICAqIDxwPlRoZSBzb3VuZHMgcGxheWVkIGRlcGVuZGluZyBvbiB0aGUgaG90c3BvdCBzdGF0ZS48L3A+XG4gICAgICAgICogPHVsPlxuICAgICAgICAqIDxsaT4wID0gU2VsZWN0IFNvdW5kPC9saT5cbiAgICAgICAgKiA8bGk+MSA9IFVuc2VsZWN0IFNvdW5kPC9saT5cbiAgICAgICAgKiA8L3VsPlxuICAgICAgICAqIEBwcm9wZXJ0eSBzb3VuZHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyNcbiAgICAgICAgQHNvdW5kcyA9IHBhcmFtcz8uc291bmRzIHx8IFtdXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgcmVuZGVyLWluZGV4IG9mIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBob3RzcG90IGNvbXBvbmVudC4gVGhpcyBcbiAgICAqIGltcGxlbWVudGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIGFjdCBhcyBhbiBvd25lciBmb3IgZ3MuRXZlbnRFbWl0dGVyLm9uIFxuICAgICogZXZlbnQgcmVnaXN0cmF0aW9uLiBcbiAgICAqXG4gICAgKiBAcHJvcGVydHkgckluZGV4XG4gICAgKiBAdHlwZSBudW1iZXJcbiAgICAjIyNcbiAgICBAYWNjZXNzb3JzIFwickluZGV4XCIsIFxuICAgICAgICBnZXQ6IC0+IEBvYmplY3QuckluZGV4XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdXAgZXZlbnQgaGFuZGxlcnMuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cEV2ZW50SGFuZGxlcnNcbiAgICAjIyMgICBcbiAgICBzZXR1cEV2ZW50SGFuZGxlcnM6IC0+XG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwibW91c2VVcFwiLCB0aGlzKVxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcIm1vdXNlTW92ZWRcIiwgdGhpcylcbiAgICAgICAgXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcIm1vdXNlVXBcIiwgKChlKSA9PiBcbiAgICAgICAgICAgIHJldHVybiBpZiBub3QgQG9iamVjdC52aXNpYmxlXG4gICAgICAgICAgICBteCA9IElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54XG4gICAgICAgICAgICBteSA9IElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55XG4gICAgICAgICAgICBjb250YWlucyA9IFJlY3QuY29udGFpbnMoQG9iamVjdC5kc3RSZWN0LngsIEBvYmplY3QuZHN0UmVjdC55LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgbXgsIG15KVxuICAgICAgICAgICAgaWYgY29udGFpbnNcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IEBjaGVja1NoYXBlKG14IC0gQG9iamVjdC5kc3RSZWN0LngsIG15IC0gQG9iamVjdC5kc3RSZWN0LnkpXG4gICAgICAgICAgICAgICAgaWYgY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgQGNvbnRhaW5zUG9pbnRlciA9IGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgIEB1cGRhdGVJbnB1dCgpXG4gICAgICAgICAgICAgICAgICAgIEB1cGRhdGVFdmVudHMoKVxuICAgICAgICAgICAgICAgICAgICBAb2JqZWN0Lm5lZWRzVXBkYXRlID0geWVzXG4gICAgICAgICAgICAgICAgICAgIGUuYnJlYWtDaGFpbiA9IHllc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG51bGwsIHRoaXNcbiAgICAgICAgICAgIFxuICAgICAgICBpZiBAb2JqZWN0LmltYWdlcyBvciB5ZXNcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcIm1vdXNlTW92ZWRcIiwgKChlKSA9PlxuICAgICAgICAgICAgICAgIHJldHVybiBpZiBub3QgQG9iamVjdC52aXNpYmxlXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSBSZWN0LmNvbnRhaW5zKEBvYmplY3QuZHN0UmVjdC54LCBAb2JqZWN0LmRzdFJlY3QueSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54LCBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgIG14ID0gSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLnhcbiAgICAgICAgICAgICAgICAgICAgbXkgPSBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueVxuICAgICAgICAgICAgICAgICAgICBjb250YWlucyA9IEBjaGVja1NoYXBlKG14IC0gQG9iamVjdC5kc3RSZWN0LngsIG15IC0gQG9iamVjdC5kc3RSZWN0LnkpXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIEBjb250YWluc1BvaW50ZXIgIT0gY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgQGNvbnRhaW5zUG9pbnRlciA9IGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgIEBvYmplY3QubmVlZHNVcGRhdGUgPSB5ZXNcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiZW50ZXJcIiwgdGhpcylcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5ldmVudHMuZW1pdChcImxlYXZlXCIsIHRoaXMpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQHVwZGF0ZUlucHV0KClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBudWxsLCB0aGlzXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBJbml0aWFsaXplcyB0aGUgaG90c3BvdCBjb21wb25lbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cFxuICAgICMjI1xuICAgIHNldHVwOiAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgQHNvdW5kID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoQG9iamVjdCwgQHNvdW5kKVxuICAgICAgICBcbiAgICAgICAgaWYgQHNvdW5kcz9cbiAgICAgICAgICAgIGZvciBzb3VuZCwgaSBpbiBAc291bmRzXG4gICAgICAgICAgICAgICAgQHNvdW5kc1tpXSA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKEBvYmplY3QsIHNvdW5kKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgIEBzb3VuZHMgPSBbXVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIEBzZXR1cEV2ZW50SGFuZGxlcnMoKVxuICAgICAgICAgICAgICAgIFxuIFxuICAgIFxuICAgICMjIypcbiAgICAqIERpc3Bvc2VzIHRoZSBjb21wb25lbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAgIyMjXG4gICAgZGlzcG9zZTogLT5cbiAgICAgICAgc3VwZXJcbiAgICAgICAgXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwibW91c2VVcFwiLCB0aGlzKVxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcIm1vdXNlTW92ZWRcIiwgdGhpcylcbiAgICAgICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnQgaXMgaW5zaWRlIG9mIHRoZSBob3RzcG90J3Mgc2hhcGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBjaGVja1NoYXBlXG4gICAgKiBAcGFyYW0geCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgICogQHBhcmFtIHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICAqIEByZXR1cm4gSWYgPGI+dHJ1ZTwvYj4gdGhlIHBvaW50IGlzIGluc2lkZSBvZiB0aGUgaG90c3BvdCdzIHNoYXBlLiBPdGhlcndpc2UgPGI+ZmFsc2U8L2I+LlxuICAgICMjIyAgXG4gICAgY2hlY2tTaGFwZTogKHgsIHkpIC0+XG4gICAgICAgIHJlc3VsdCA9IHllc1xuICAgICAgICBcbiAgICAgICAgc3dpdGNoIEBzaGFwZVxuICAgICAgICAgICAgd2hlbiBncy5Ib3RzcG90U2hhcGUuUElYRUxcbiAgICAgICAgICAgICAgICBpZiBAb2JqZWN0LmJpdG1hcFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBAb2JqZWN0LmJpdG1hcC5pc1BpeGVsU2V0KHgsIHkpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBAb2JqZWN0LnRhcmdldD8uYml0bWFwLmlzUGl4ZWxTZXQoeCwgeSlcbiAgICAgICAgXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgaW1hZ2UgZGVwZW5kaW5nIG9uIHRoZSBob3RzcG90IHN0YXRlLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlSW1hZ2VcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgICAgICAgICAgICAgICAgXG4gICAgdXBkYXRlSW1hZ2U6IC0+XG4gICAgICAgIG9iamVjdCA9IEBvYmplY3QudGFyZ2V0IHx8IEBvYmplY3RcbiAgICAgICAgaWYgQG9iamVjdC5pbWFnZXM/XG4gICAgICAgICAgICBiYXNlSW1hZ2UgPSBpZiBAZW5hYmxlZCB0aGVuIEBvYmplY3QuaW1hZ2VzWzRdIHx8IEBvYmplY3QuaW1hZ2VzWzBdIGVsc2UgQG9iamVjdC5pbWFnZXNbMF1cbiAgICAgICAgICAgIGlmIEBjb250YWluc1BvaW50ZXJcbiAgICAgICAgICAgICAgICBpZiBAb2JqZWN0LnNlbGVjdGVkIG9yIEBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBvYmplY3QuaW1hZ2UgPSBAb2JqZWN0LmltYWdlc1szXSB8fCBAb2JqZWN0LmltYWdlc1syXSB8fCBiYXNlSW1hZ2VcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbWFnZSA9IEBvYmplY3QuaW1hZ2VzWzFdIHx8IGJhc2VJbWFnZVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGlmIEBvYmplY3Quc2VsZWN0ZWQgb3IgQHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbWFnZSA9IEBvYmplY3QuaW1hZ2VzWzJdIHx8IEBvYmplY3QuaW1hZ2VzWzRdIHx8IGJhc2VJbWFnZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmltYWdlID0gYmFzZUltYWdlXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgIW9iamVjdC5pbWFnZVxuICAgICAgICAgICAgICAgIG9iamVjdC5iaXRtYXAgPSBudWxsXG5cbiAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBob3RzcG90IHBvc2l0aW9uIGFuZCBzaXplIGZyb20gYW4gb3RoZXIgdGFyZ2V0IGdhbWUgb2JqZWN0LiBGb3IgZXhhbXBsZSwgXG4gICAgKiB0aGF0IGlzIHVzZWZ1bCBmb3IgYWRkaW5nIGEgaG90c3BvdCB0byBhbiBvdGhlciBtb3ZpbmcgZ2FtZSBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVGcm9tVGFyZ2V0XG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjIFxuICAgIHVwZGF0ZUZyb21UYXJnZXQ6IC0+XG4gICAgICAgIGlmIEBvYmplY3QudGFyZ2V0P1xuICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LnggPSBAb2JqZWN0LnRhcmdldC5kc3RSZWN0LnhcbiAgICAgICAgICAgIEBvYmplY3QuZHN0UmVjdC55ID0gQG9iamVjdC50YXJnZXQuZHN0UmVjdC55XG4gICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3Qud2lkdGggPSBAb2JqZWN0LnRhcmdldC5kc3RSZWN0LndpZHRoXG4gICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0ID0gQG9iamVjdC50YXJnZXQuZHN0UmVjdC5oZWlnaHRcbiAgICAgICAgICAgIEBvYmplY3Qub2Zmc2V0LnggPSBAb2JqZWN0LnRhcmdldC5vZmZzZXQueFxuICAgICAgICAgICAgQG9iamVjdC5vZmZzZXQueSA9IEBvYmplY3QudGFyZ2V0Lm9mZnNldC55XG4gICAgICAgICAgICBAb2JqZWN0Lm9yaWdpbi54ID0gQG9iamVjdC50YXJnZXQub3JpZ2luLnhcbiAgICAgICAgICAgIEBvYmplY3Qub3JpZ2luLnkgPSBAb2JqZWN0LnRhcmdldC5vcmlnaW4ueSBcbiAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgZXZlbnQtaGFuZGxpbmcgYW5kIGZpcmVzIG5lY2Vzc2FyeSBldmVudHMuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVFdmVudHNcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgICAgICAgIFxuICAgIHVwZGF0ZUV2ZW50czogLT5cbiAgICAgICAgaWYgQGJ1dHRvblVwIGFuZCBAb2JqZWN0LmVuYWJsZWQgYW5kIEBlbmFibGVkIGFuZCBAb2JqZWN0LnZpc2libGVcbiAgICAgICAgICAgIGlmIEBvYmplY3Quc2VsZWN0YWJsZVxuICAgICAgICAgICAgICAgIGdyb3VwID0gZ3MuT2JqZWN0TWFuYWdlci5jdXJyZW50Lm9iamVjdHNCeUdyb3VwKEBvYmplY3QuZ3JvdXApXG4gICAgICAgICAgICAgICAgZm9yIG9iamVjdCBpbiBncm91cFxuICAgICAgICAgICAgICAgICAgICBpZiBvYmplY3QgIT0gQG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNlbGVjdGVkID0gbm9cbiAgICAgICAgICAgICAgICBpZiBAb2JqZWN0Lmdyb3VwXG4gICAgICAgICAgICAgICAgICAgIEBzZWxlY3RlZCA9IHllc1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgQHNlbGVjdGVkID0gIUBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIEBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIucGxheVNvdW5kKEBzb3VuZHNbMF0gfHwgQHNvdW5kKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLnBsYXlTb3VuZChAc291bmRzWzFdIHx8IEBzb3VuZClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiY2xpY2tcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwic3RhdGVDaGFuZ2VkXCIsIEBvYmplY3QpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLnBsYXlTb3VuZChAc291bmRzWzBdIHx8IEBzb3VuZClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiY2xpY2tcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiYWN0aW9uXCIsIHRoaXMpXG4gICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgZ2FtZSBvYmplY3QncyBjb2xvciBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBob3RzcG90LlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQ29sb3JcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgIFxuICAgIHVwZGF0ZUNvbG9yOiAtPlxuICAgICAgICBpZiAhQG9iamVjdC5lbmFibGVkXG4gICAgICAgICAgICBAb2JqZWN0LmNvbG9yLnNldCgwLCAwLCAwLCAxMDApXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBvYmplY3QuY29sb3Iuc2V0KDAsIDAsIDAsIDApXG4gICAgIFxuICAgICMjIypcbiAgICAqIFN0b3JlcyBjdXJyZW50IHN0YXRlcyBvZiBtb3VzZS90b3VjaCBwb2ludGVyIGFuZCBidXR0b25zLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlSW5wdXRcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgICAgICAgIFxuICAgIHVwZGF0ZUlucHV0OiAtPlxuICAgICAgICBAYnV0dG9uVXAgPSBJbnB1dC5Nb3VzZS5idXR0b25zW0BhY3Rpb25CdXR0b25dID09IDIgYW5kIEBjb250YWluc1BvaW50ZXJcbiAgICAgICAgQGJ1dHRvbkRvd24gPSBJbnB1dC5Nb3VzZS5idXR0b25zW0BhY3Rpb25CdXR0b25dID09IDEgYW5kIEBjb250YWluc1BvaW50ZXJcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgaG90c3BvdCBjb21wb25lbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyNcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIGlmIG5vdCBAb2JqZWN0LnZpc2libGUgdGhlbiByZXR1cm5cblxuICAgICAgICBAdXBkYXRlQ29sb3IoKVxuICAgICAgICBAdXBkYXRlRnJvbVRhcmdldCgpXG4gICAgICAgIEB1cGRhdGVJbWFnZSgpXG4gICAgICAgIFxuZ3MuQ29tcG9uZW50X0hvdHNwb3RCZWhhdmlvciA9IENvbXBvbmVudF9Ib3RzcG90QmVoYXZpb3IiXX0=\n//# sourceURL=Component_HotspotBehavior_19.js"
13 13 },
14 14 "summary": [
15 15 "name",