InteractionData Class
+ + + + +Constructor
+InteractionData
+
+
+ ()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
- Index + + + +
- Properties + + + +
From f5cc0629220d6f19bf9df102874e88bf79eee961 Mon Sep 17 00:00:00 2001
From: Mat Groves the canvas to use as a view, optional The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.
+This manager also supports multitouch. This method will disable rollover/rollout for ALL interactive items
+You may wish to use this an optimization if your app does not require rollover/rollout funcitonality This method will enable rollover/rollout for ALL interactive items
+It is enabled by default an object that stores current touches (InteractionData) by id reference A callback that is used when the users clicks on the sprite with thier mouse A callback that is used when the user clicks the mouse down over the sprite A callback that is used when the users mouse leaves the sprite A callback that is used when the users mouse rolls over the sprite A callback that is used when the user releases the mouse that was over the sprite
+for this callback to be fired the mouse must have been pressed down over the sprite Indicates if the sprite will have touch and mouse interactivity. It is false by default A callback that is used when the users taps on the sprite with thier finger
+basically a touch version of click A callback that is used when the user releases the touch that was over the sprite
+for this callback to be fired. The touch must have started over the sprite A callback that is used when the user touch's over the sprite A callback that is used when the users clicks on the sprite with thier mouse Helper function that creates a sprite that will contain a texture from the TextureCache based on tjhe frameId
+ Helper function that creates a sprite that will contain a texture from the TextureCache based on the frameId
The frame ids are created when a Texture packer file has been loaded A callback that is used when the user clicks the mouse down over the sprite A callback that is used when the users mouse leaves the sprite A callback that is used when the users mouse rolls over the sprite A callback that is used when the user releases the mouse that was over the sprite
+for this callback to be fired the mouse must have been pressed down over the sprite Indicates if the sprite will have touch and mouse interactivity. It is false by default
+
+
+ pixi/renderers/CanvasRenderer.js:56
+ pixi/renderers/CanvasRenderer.js:57
@@ -341,7 +345,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- pixi/renderers/CanvasRenderer.js:45
+ pixi/renderers/CanvasRenderer.js:46
@@ -385,7 +389,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- pixi/renderers/CanvasRenderer.js:21
+ pixi/renderers/CanvasRenderer.js:22
@@ -431,7 +435,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- pixi/renderers/CanvasRenderer.js:31
+ pixi/renderers/CanvasRenderer.js:32
@@ -475,7 +479,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- pixi/renderers/CanvasRenderer.js:14
+ pixi/renderers/CanvasRenderer.js:15
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html
index 2474970..151abad 100644
--- a/docs/classes/DisplayObject.html
+++ b/docs/classes/DisplayObject.html
@@ -15,11 +15,11 @@
+ view
+
+ view
+ Canvas
+
+
+
+
+
+
+
+ InteractionData Class
+
+
+
+
+Constructor
+
+
+
+ ()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ InteractionData
+
+
+
+
+ InteractionManager Class
+
+
+
+
+Constructor
+
+
+
+ InteractionManager
+
+
)
+ stage
+
+ Parameters:
+
+
+
+
+ stage
+ Stage
+
+
+
+
+
+
+
+ Item Index
+
+
+ Methods
+
+
+
+
+ Methods
+
+
+
+
+
+ ()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ disableMouseOver
+
+
+ ()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ enableMouseOver
Properties
+
+
+
+
+
+
+
+
+
+ Object
+
+
+
+
+
+
+
+
+
+
+
+ touchs
+
+
+
+ click
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ mousedown
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ mouseout
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ mouseover
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ mouseup
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ setInteractive
+
+
)
+ interactive
+
+ Parameters:
+
+
+
+
+ interactive
+ Boolean
+
+
+
+
+ pixi/Sprite.js:79
+ pixi/Sprite.js:146
@@ -1092,6 +1664,260 @@
+
+
+
+ tap
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ touchend
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ touchstart
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+
+
+
+ click
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+ pixi/Sprite.js:111
+ pixi/Sprite.js:189
@@ -666,7 +820,7 @@
pixi/Sprite.js:127
+ pixi/Sprite.js:205
@@ -818,6 +972,355 @@
+
+
+
+ mousedown
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ mouseout
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ mouseover
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ mouseup
+
+
)
+ interactionData
+
+ Parameters:
+
+
+
+
+ interactionData
+ InteractionData
+
+
+
+
+
+
+
+ setInteractive
+
+
)
+ interactive
+
+ Parameters:
+
+
+
+
+ interactive
+ Boolean
+
+
+
+
+ pixi/Sprite.js:79
+ pixi/Sprite.js:146
tap
interactionData
+
+ A callback that is used when the users taps on the sprite with thier finger +basically a touch version of click
+interactionData
+ InteractionData
+
+
+
+
+ touchend
interactionData
+
+ A callback that is used when the user releases the touch that was over the sprite +for this callback to be fired. The touch must have started over the sprite
+interactionData
+ InteractionData
+
+
+
+
+ touchstart
interactionData
+
+ A callback that is used when the user touch's over the sprite
+interactionData
+ InteractionData
+
+
+
+
+ interactive
+
+ interactive
+ Boolean
+
+
+
+
+ enable / disable interaction (default is false)
+pixi/Stage.js:44
+ pixi/Stage.js:59
@@ -764,7 +789,7 @@
- pixi/Stage.js:30
+ pixi/Stage.js:35
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html
index 48980dc..94ae696 100644
--- a/docs/classes/Texture.html
+++ b/docs/classes/Texture.html
@@ -15,11 +15,11 @@
view
+
+ view
+ Canvas
+
+
+
+
+ the canvas to use as a view, optional
+pixi/renderers/WebGLRenderer.js:157
+ pixi/renderers/WebGLRenderer.js:158
@@ -438,7 +463,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- pixi/renderers/WebGLRenderer.js:526
+ pixi/renderers/WebGLRenderer.js:538
diff --git a/docs/data.json b/docs/data.json
index 246ea87..5e94f50 100644
--- a/docs/data.json
+++ b/docs/data.json
@@ -1,9 +1,9 @@
{
"project": {
"name": "Pixi.js API",
- "logo": "../logo_small.png",
- "description": "The Foo API: a library for doing X, Y, and Z",
- "version": "0.9",
+ "logo": "http://www.goodboydigital.com/pixijs/logo_small.png",
+ "description": "Pixi.js is a fast lightweight 2D library that works across all devices.",
+ "version": "1.0",
"url": "http://goodboydigital.com/"
},
"files": {
@@ -130,6 +130,16 @@
"fors": {},
"namespaces": {}
},
+ "pixi/InteractionManager.js": {
+ "name": "pixi/InteractionManager.js",
+ "modules": {},
+ "classes": {
+ "InteractionManager": 1,
+ "InteractionData": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
"pixi/MovieClip.js": {
"name": "pixi/MovieClip.js",
"modules": {},
@@ -199,6 +209,8 @@
"Texture": 1,
"DisplayObject": 1,
"DisplayObjectContainer": 1,
+ "InteractionManager": 1,
+ "InteractionData": 1,
"MovieClip": 1,
"Point": 1,
"Rectangle": 1,
@@ -279,6 +291,11 @@
"name": "height",
"description": "the height of the canvas view",
"type": "Number"
+ },
+ {
+ "name": "view",
+ "description": "the canvas to use as a view, optional",
+ "type": "Canvas"
}
]
},
@@ -328,6 +345,11 @@
"name": "height",
"description": "the height of the canvas view",
"type": "Number"
+ },
+ {
+ "name": "view",
+ "description": "the canvas to use as a view, optional",
+ "type": "Canvas"
}
],
"default": "0"
@@ -410,6 +432,41 @@
"extends": "DisplayObject",
"is_constructor": 1
},
+ "InteractionManager": {
+ "name": "InteractionManager",
+ "shortname": "InteractionManager",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "pixi/InteractionManager.js",
+ "line": 7,
+ "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.",
+ "is_constructor": 1,
+ "params": [
+ {
+ "name": "stage",
+ "description": "",
+ "type": "Stage"
+ }
+ ],
+ "type": "Stage"
+ },
+ "InteractionData": {
+ "name": "InteractionData",
+ "shortname": "InteractionData",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "pixi/InteractionManager.js",
+ "line": 319,
+ "is_constructor": 1
+ },
"MovieClip": {
"name": "MovieClip",
"shortname": "MovieClip",
@@ -539,6 +596,11 @@
"name": "backgroundColor",
"description": "the background color of the stage",
"type": "Number"
+ },
+ {
+ "name": "interactive",
+ "description": "enable / disable interaction (default is false)",
+ "type": "Boolean"
}
]
}
@@ -613,7 +675,7 @@
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 14,
+ "line": 15,
"description": "The width of the canvas view",
"itemtype": "property",
"name": "width",
@@ -623,7 +685,7 @@
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 21,
+ "line": 22,
"description": "The height of the canvas view",
"itemtype": "property",
"name": "height",
@@ -633,7 +695,7 @@
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 31,
+ "line": 32,
"description": "The canvas element that the everything is drawn to",
"itemtype": "property",
"name": "view",
@@ -642,7 +704,7 @@
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 45,
+ "line": 46,
"description": "The canvas context that the everything is drawn to",
"itemtype": "property",
"name": "context",
@@ -651,7 +713,7 @@
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 56,
+ "line": 57,
"description": "Renders the stage to its canvas view",
"itemtype": "method",
"name": "render",
@@ -666,7 +728,7 @@
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 83,
+ "line": 96,
"description": "resizes the canvas view to the specified width and height",
"params": [
{
@@ -682,21 +744,21 @@
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 97,
+ "line": 110,
"access": "private",
"tagname": "",
"class": "CanvasRenderer"
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 167,
+ "line": 180,
"access": "private",
"tagname": "",
"class": "CanvasRenderer"
},
{
"file": "pixi/renderers/CanvasRenderer.js",
- "line": 202,
+ "line": 215,
"access": "private",
"tagname": "",
"class": "CanvasRenderer"
@@ -877,21 +939,21 @@
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 64,
+ "line": 65,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 103,
+ "line": 104,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 157,
+ "line": 158,
"description": "Renders the stage to its webGL view",
"itemtype": "method",
"name": "render",
@@ -906,28 +968,28 @@
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 223,
+ "line": 235,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 252,
+ "line": 264,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 448,
+ "line": 460,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 526,
+ "line": 538,
"description": "resizes the webGL view to the specified width and height",
"itemtype": "method",
"name": "resize",
@@ -947,28 +1009,28 @@
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 547,
+ "line": 559,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 575,
+ "line": 587,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 653,
+ "line": 665,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
"file": "pixi/renderers/WebGLRenderer.js",
- "line": 662,
+ "line": 674,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
@@ -1140,6 +1202,10 @@
"type": "String"
}
],
+ "return": {
+ "description": "the texture that was removed",
+ "type": "Texture"
+ },
"class": "Texture"
},
{
@@ -1165,6 +1231,11 @@
"name": "height",
"description": "the height of the renderers view",
"type": "Number"
+ },
+ {
+ "name": "view",
+ "description": "the canvas to use as a view, optional",
+ "type": "Canvas"
}
],
"class": "DisplayObject"
@@ -1258,7 +1329,7 @@
},
{
"file": "pixi/DisplayObject.js",
- "line": 79,
+ "line": 82,
"access": "private",
"tagname": "",
"class": "DisplayObject"
@@ -1335,6 +1406,73 @@
"tagname": "",
"class": "DisplayObjectContainer"
},
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "InteractionManager"
+ },
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 17,
+ "description": "a refference to the stage",
+ "itemtype": "property",
+ "name": "stage",
+ "type": "Stage",
+ "class": "InteractionManager"
+ },
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 30,
+ "description": "the mouse data",
+ "itemtype": "property",
+ "name": "mouse",
+ "type": "InteractionData",
+ "class": "InteractionManager"
+ },
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 37,
+ "description": "an object that stores current touches (InteractionData) by id reference",
+ "itemtype": "property",
+ "name": "touchs",
+ "type": "Object",
+ "class": "InteractionManager"
+ },
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 53,
+ "description": "This method will disable rollover/rollout for ALL interactive items\nYou may wish to use this an optimization if your app does not require rollover/rollout funcitonality",
+ "itemtype": "method",
+ "name": "disableMouseOver",
+ "class": "InteractionManager"
+ },
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 66,
+ "description": "This method will enable rollover/rollout for ALL interactive items\nIt is enabled by default",
+ "itemtype": "method",
+ "name": "enableMouseOver",
+ "class": "InteractionManager"
+ },
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 325,
+ "description": "This point stores the global coords of where the touch/mouse event happened",
+ "itemtype": "property",
+ "name": "global",
+ "type": "Point",
+ "class": "InteractionData"
+ },
+ {
+ "file": "pixi/InteractionManager.js",
+ "line": 332,
+ "description": "This point stores the local coords of where the touch/mouse event happened",
+ "itemtype": "property",
+ "name": "local",
+ "type": "Point",
+ "class": "InteractionData"
+ },
{
"file": "pixi/MovieClip.js",
"line": 1,
@@ -1584,7 +1722,135 @@
},
{
"file": "pixi/Sprite.js",
- "line": 79,
+ "line": 86,
+ "description": "A callback that is used when the users clicks on the sprite with thier mouse",
+ "itemtype": "method",
+ "name": "click",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 92,
+ "description": "A callback that is used when the user clicks the mouse down over the sprite",
+ "itemtype": "method",
+ "name": "mousedown",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 98,
+ "description": "A callback that is used when the user releases the mouse that was over the sprite\nfor this callback to be fired the mouse must have been pressed down over the sprite",
+ "itemtype": "method",
+ "name": "mouseup",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 105,
+ "description": "A callback that is used when the users mouse rolls over the sprite",
+ "itemtype": "method",
+ "name": "mouseover",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 111,
+ "description": "A callback that is used when the users mouse leaves the sprite",
+ "itemtype": "method",
+ "name": "mouseout",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 121,
+ "description": "A callback that is used when the users taps on the sprite with thier finger\nbasically a touch version of click",
+ "itemtype": "method",
+ "name": "tap",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 128,
+ "description": "A callback that is used when the user touch's over the sprite",
+ "itemtype": "method",
+ "name": "touchstart",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 134,
+ "description": "A callback that is used when the user releases the touch that was over the sprite\nfor this callback to be fired. The touch must have started over the sprite",
+ "itemtype": "method",
+ "name": "touchend",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 146,
"itemtype": "method",
"name": "setTexture",
"params": [
@@ -1599,7 +1865,23 @@
},
{
"file": "pixi/Sprite.js",
- "line": 98,
+ "line": 164,
+ "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default",
+ "itemtype": "method",
+ "name": "setInteractive",
+ "params": [
+ {
+ "name": "interactive",
+ "description": "",
+ "type": "Boolean"
+ }
+ ],
+ "class": "Sprite",
+ "module": "PIXI"
+ },
+ {
+ "file": "pixi/Sprite.js",
+ "line": 177,
"access": "private",
"tagname": "",
"class": "Sprite",
@@ -1607,8 +1889,8 @@
},
{
"file": "pixi/Sprite.js",
- "line": 111,
- "description": "Helper function that creates a sprite that will contain a texture from the TextureCache based on tjhe frameId\n The frame ids are created when a Texture packer file has been loaded",
+ "line": 189,
+ "description": "Helper function that creates a sprite that will contain a texture from the TextureCache based on the frameId\n The frame ids are created when a Texture packer file has been loaded",
"itemtype": "method",
"name": "fromFrame",
"static": 1,
@@ -1628,7 +1910,7 @@
},
{
"file": "pixi/Sprite.js",
- "line": 127,
+ "line": 205,
"description": "Helper function that creates a sprite that will contain a texture based on an image url\n If the image is not in the texture cache it will be loaded",
"itemtype": "method",
"name": "fromImage",
@@ -1655,7 +1937,7 @@
},
{
"file": "pixi/Stage.js",
- "line": 30,
+ "line": 35,
"itemtype": "method",
"name": "updateTransform",
"internal": "",
@@ -1664,7 +1946,7 @@
},
{
"file": "pixi/Stage.js",
- "line": 44,
+ "line": 59,
"itemtype": "method",
"name": "setBackgroundColor",
"params": [
@@ -1685,7 +1967,7 @@
},
{
"message": "unknown tag: internal",
- "line": " pixi/Stage.js:30"
+ "line": " pixi/Stage.js:35"
},
{
"message": "Missing item type",
@@ -1717,19 +1999,19 @@
},
{
"message": "Missing item type\nresizes the canvas view to the specified width and height",
- "line": " pixi/renderers/CanvasRenderer.js:83"
+ "line": " pixi/renderers/CanvasRenderer.js:96"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/CanvasRenderer.js:97"
+ "line": " pixi/renderers/CanvasRenderer.js:110"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/CanvasRenderer.js:167"
+ "line": " pixi/renderers/CanvasRenderer.js:180"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/CanvasRenderer.js:202"
+ "line": " pixi/renderers/CanvasRenderer.js:215"
},
{
"message": "Missing item type",
@@ -1761,39 +2043,39 @@
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:64"
+ "line": " pixi/renderers/WebGLRenderer.js:65"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:103"
+ "line": " pixi/renderers/WebGLRenderer.js:104"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:223"
+ "line": " pixi/renderers/WebGLRenderer.js:235"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:252"
+ "line": " pixi/renderers/WebGLRenderer.js:264"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:448"
+ "line": " pixi/renderers/WebGLRenderer.js:460"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:547"
+ "line": " pixi/renderers/WebGLRenderer.js:559"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:575"
+ "line": " pixi/renderers/WebGLRenderer.js:587"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:653"
+ "line": " pixi/renderers/WebGLRenderer.js:665"
},
{
"message": "Missing item type",
- "line": " pixi/renderers/WebGLRenderer.js:662"
+ "line": " pixi/renderers/WebGLRenderer.js:674"
},
{
"message": "Missing item type",
@@ -1829,7 +2111,7 @@
},
{
"message": "Missing item type",
- "line": " pixi/DisplayObject.js:79"
+ "line": " pixi/DisplayObject.js:82"
},
{
"message": "Missing item type",
@@ -1839,6 +2121,10 @@
"message": "Missing item type",
"line": " pixi/DisplayObjectContainer.js:126"
},
+ {
+ "message": "Missing item type",
+ "line": " pixi/InteractionManager.js:1"
+ },
{
"message": "Missing item type",
"line": " pixi/MovieClip.js:1"
@@ -1861,7 +2147,7 @@
},
{
"message": "Missing item type",
- "line": " pixi/Sprite.js:98"
+ "line": " pixi/Sprite.js:177"
},
{
"message": "Missing item type",
diff --git a/docs/files/pixi_DisplayObject.js.html b/docs/files/pixi_DisplayObject.js.html
index 3314e86..a1d9784 100644
--- a/docs/files/pixi_DisplayObject.js.html
+++ b/docs/files/pixi_DisplayObject.js.html
@@ -15,11 +15,11 @@
+/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + +/** +The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +This manager also supports multitouch. +@class InteractionManager +@constructor +@param stage {Stage} +@type Stage +*/ +PIXI.InteractionManager = function(stage) +{ + /** + * a refference to the stage + * @property stage + * @type Stage + */ + this.stage = stage; + + // helpers + this.tempPoint = new PIXI.Point(); + this.tempMatrix = mat3.create(); + + this.mouseoverEnabled = true; + + /** + * the mouse data + * @property mouse + * @type InteractionData + */ + this.mouse = new PIXI.InteractionData(); + + /** + * an object that stores current touches (InteractionData) by id reference + * @property touchs + * @type Object + */ + this.touchs = {}; + + //tiny little interactiveData pool! + this.pool = []; + + this.interactiveItems = []; +} + +// constructor +PIXI.InteractionManager.constructor = PIXI.InteractionManager; + +/** + * This method will disable rollover/rollout for ALL interactive items + * You may wish to use this an optimization if your app does not require rollover/rollout funcitonality + * @method disableMouseOver + */ +PIXI.InteractionManager.prototype.disableMouseOver = function() +{ + if(!this.mouseoverEnabled)return; + + this.mouseoverEnabled = false; + if(this.target)this.target.view.removeEventListener('mousemove', this.onMouseMove.bind(this)); +} + +/** + * This method will enable rollover/rollout for ALL interactive items + * It is enabled by default + * @method enableMouseOver + */ +PIXI.InteractionManager.prototype.enableMouseOver = function() +{ + if(this.mouseoverEnabled)return; + + this.mouseoverEnabled = false; + if(this.target)this.target.view.addEventListener('mousemove', this.onMouseMove.bind(this)); +} + +PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObject) +{ + var children = displayObject.children; + var length = children.length; + + for (var i = length - 1; i >= 0; i--) + { + var child = children[i]; + + // only sprite's right now... + if(child instanceof PIXI.Sprite) + { + if(child.interactive)this.interactiveItems.push(child); + } + else + { + // use this to optimize.. + if(!child.interactive)continue; + } + + if(child.children.length > 0) + { + this.collectInteractiveSprite(child); + } + } +} + +PIXI.InteractionManager.prototype.setTarget = function(target) +{ + this.target = target; + if(this.mouseoverEnabled)target.view.addEventListener('mousemove', this.onMouseMove.bind(this), true); + target.view.addEventListener('mousedown', this.onMouseDown.bind(this), true); + target.view.addEventListener('mouseup', this.onMouseUp.bind(this), true); + target.view.addEventListener('mouseout', this.onMouseUp.bind(this), true); + + // aint no multi touch just yet! + target.view.addEventListener("touchstart", this.onTouchStart.bind(this), true); + target.view.addEventListener("touchend", this.onTouchEnd.bind(this), true); + target.view.addEventListener("touchmove", this.onTouchMove.bind(this), true); +} + +PIXI.InteractionManager.prototype.hitTest = function(interactionData) +{ + if(this.dirty) + { + this.dirty = false; + this.interactiveItems = []; + // go through and collect all the objects that are interactive.. + this.collectInteractiveSprite(this.stage); + } + + var tempPoint = this.tempPoint; + var tempMatrix = this.tempMatrix; + var global = interactionData.global; + + var length = this.interactiveItems.length; + + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + if(!item.visible)continue; + + // TODO this could do with some optimizing! + // maybe store the inverse? + // or do a lazy check first? + //mat3.inverse(item.worldTransform, tempMatrix); + //tempPoint.x = tempMatrix[0] * global.x + tempMatrix[1] * global.y + tempMatrix[2]; + //tempPoint.y = tempMatrix[4] * global.y + tempMatrix[3] * global.x + tempMatrix[5]; + + // OPTIMIZED! assuming the matrix transform is affine.. which it totally shold be! + + var worldTransform = item.worldTransform; + + var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], + a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], + id = 1 / (a00 * a11 + a01 * -a10); + + tempPoint.x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id; + tempPoint.y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id; + + + var x1 = -item.width * item.anchor.x + + if(tempPoint.x > x1 && tempPoint.x < x1 + item.width) + { + var y1 = -item.height * item.anchor.y; + + if(tempPoint.y > y1 && tempPoint.y < y1 + item.height) + { + interactionData.local.x = tempPoint.x; + interactionData.local.y = tempPoint.y; + + return item; + } + } + } + + return null; +} + +PIXI.InteractionManager.prototype.onMouseMove = function(event) +{ + event.preventDefault(); + + // TODO optimize by not check EVERY TIME! maybe half as often? // + var rect = this.target.view.getBoundingClientRect(); + + this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); + this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height); + + var item = this.hitTest(this.mouse); + + if(this.currentOver != item) + { + if(this.currentOver) + { + if(this.currentOver.mouseout)this.currentOver.mouseout(this.mouse); + this.currentOver = null; + } + + this.target.view.style.cursor = "default"; + } + + if(item) + { + + if(this.currentOver == item)return; + + this.currentOver = item; + this.target.view.style.cursor = "pointer"; + + if(item.mouseover)item.mouseover(this.mouse); + } +} + +PIXI.InteractionManager.prototype.onMouseDown = function(event) +{ + var rect = this.target.view.getBoundingClientRect(); + this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); + this.mouse.global.y = (event.clientY - rect.top) * (this.target.height / rect.height); + + var item = this.hitTest(this.mouse); + if(item) + { + this.currentDown = item; + if(item.mousedown)item.mousedown(this.mouse); + } +} + +PIXI.InteractionManager.prototype.onMouseUp = function(event) +{ + if(this.currentDown) + { + if(this.currentDown.mouseup)this.currentDown.mouseup(this.mouse); + + if(this.currentOver == this.currentDown)if(this.currentDown.click)this.currentDown.click(this.mouse); + this.currentDown = null; + } +} + + +PIXI.InteractionManager.prototype.onTouchMove = function(event) +{ + event.preventDefault(); + + var rect = this.target.view.getBoundingClientRect(); + var changedTouches = event.changedTouches; + + for (var i=0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + + var touchData = this.touchs[touchEvent.identifier]; + + // update the touch position + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + } +} + +PIXI.InteractionManager.prototype.onTouchStart = function(event) +{ + event.preventDefault(); + var rect = this.target.view.getBoundingClientRect(); + var changedTouches = event.changedTouches; + + for (var i=0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + + var touchData = this.pool.pop(); + if(!touchData)touchData = new PIXI.InteractionData(); + + this.touchs[touchEvent.identifier] = touchData; + + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + + var item = this.hitTest(touchData); + if(item) + { + touchData.currentDown = item; + if(item.touchstart)item.touchstart(touchData); + } + } +} + +PIXI.InteractionManager.prototype.onTouchEnd = function(event) +{ + event.preventDefault(); + + var rect = this.target.view.getBoundingClientRect(); + var changedTouches = event.changedTouches; + + for (var i=0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + var touchData = this.touchs[touchEvent.identifier]; + + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + + if(touchData.currentDown) + { + if(touchData.currentDown.touchend)touchData.currentDown.touchend(touchData); + + var item = this.hitTest(touchData); + if(item == touchData.currentDown) + { + if(touchData.currentDown.tap)touchData.currentDown.tap(touchData); + } + touchData.currentDown = null; + } + + // remove the touch.. + this.pool.push(touchData); + this.touchs[touchEvent.identifier] = null; + } +} + +/** +@class InteractionData +@constructor +*/ +PIXI.InteractionData = function() +{ + /** + * This point stores the global coords of where the touch/mouse event happened + * @property global + * @type Point + */ + this.global = new PIXI.Point(); + + /** + * This point stores the local coords of where the touch/mouse event happened + * @property local + * @type Point + */ + this.local = new PIXI.Point(); +} + +// constructor +PIXI.InteractionData.constructor = PIXI.InteractionData; + + + ++
q{lvWpWQSRENno_$!3JY`KkXQIR 8w(=jMku)U@;d4B%Xo;1136oMW4r2?UD=jC z-ty@ qx|FWRR%hjc)21;3T6@)tktHierxdEI2(Lx@lg01Lhtgsf^G`YOv^_+Z z5CnSjdb^|@%`~4AK$CCFO@Oz#zA*uxj_zu8A0 _SwMk$<8=&$FOfNa z-?s#tm?qA4s;p+r$`I|r5t*uxbg>MWZ2Immrz9kP=%l3k&x8CC_yPNozY%7W91g~E zO>^<|+z^Q1UIy)qQLjEvQ0#B``%?cDZ3OY*GGmfO*>weWr~u}(&A=wPLmI&xqL9@B zrFr@8IxO+`{sXpqbzpW>cM0aj-4OSm1CWz|?b6_z>Dc!ApB|+gF$X%!{0!^F0;{M~ zXl-;a)AEPpju(!Ivg0krvHPa*F30T$> tIm*@OV(AtrKX2Vkk25cnq-CFcKSayL66HiZ61GB&z-&wdFiTbH8Yzxl` zI8lcz5t0FKDu9dr2F@^e(XTuWv|aq}7H
Ta`sB9UW0{G2!-$` z+({o{7jO{@h#`Uu;%3{^%%pEwZbF|%da^JN;2m+aKB(nAV5kYK?^cR~-I_^qV6M+@ zXrlGAFbK7aTDd&IIN&pPW0OI-obGH2F4ms9TjD%5VUg6wK|h=;Dxq!&{h@o+#=*!* zwoHXXCc5-^Y=Xk+@($RHu;VO_L` %=gCdXlh!3>EX!GWt=q`G%Kv3!l%iE``7H?6q} zpbsqA`_rZfh)`w_Wa@xU0vTFfHT8SIuH})=@*Z%)veX#+1_RAwq%Tou-w{lMgP2}D zv0Ma)q?0$v@AA~{-MHBZVKHAv=u-Sgt06vy4oD{TGR)&=An$u+0xN$C3~SQ2`Mz=< z%`t`LNZRhkRkK=&d|of?4oNq`u6vnZ5C> X(SMb6738h1kJ3*+NX?~=~ zV4|!&>wBdal>@<{WNS X<@5L UC1NpZBQ&z%p_%#}EY>+-FneX+& zG_ayk-Bp6jK{$bY!KO^O2 )%HWu6EidNrqqWW0LeEO3mOvnBz&8>+G*qO*t$|82K2D6(%gu8O-C^K0$APxmdtL zphQeM3K80@nG&9?6mzsKwzx+?&QTKaBGD){t`pk!e=s@JyT^s!)iGBti)(55TR@tC zE7N9%2bGH9JG!P?*TpZTI`@+nbt#>pa1ugQ0%OhyTmxrvz{G8x<4vcle3GR|*$8(q zjx=2KJ-%KRpP$WoLl&{+5Q1)jygYZa&cp>vKOIBv3F|Dz4}x9o{BFzsn==9)OPdBR z&TFqHJ--G#AwhtYDKJ4ey^%E7p|N~?7%9o-dKYA%(@dHWoBDL_2 OlO{Q`@x0oS(#PVL@7vY!rgaXEjyc0@G_1H# zcmQs!#X%ukj-lgsV)U(|m>H5C?b0v5%~5N9TWI0;4nsI3jSN^)LSi}#O*UWL<@PP% z6}Bs0HD~s-mFT)q7}u `bY^<&N70*Q`{z8k-DwIYtGh}Y2+~}IOB6hV4b^|iTa!?b39>#xe@w;Zt zBa3~Hq-eWYk=NU?8H5513a&v4iJ3tYN{{Br@+JFw7YE|RNfoPbChqHCeQTzLHF$EE z{<+wKm7BC4LWTry952jw8TP3NNwKs?k} fSw()z<&6>g%G>-a+Pi_pnU3#j+PU2V0k^eDh(YjSGOk6VUtp>vI%rLIde>?v zwe4+Ta4uv3=~0im^kU()fYr?djH$F+=p;=6{DI_F?Mz?~Gd0YImVDvcO%g#gC|F3m z8gAJT>PI?gWuQ9X-mr84FLju~B_xGqii) H zi4@1_(R)+NvZ-tq^p^hGo*o8|2y=! 7N#POIb( zuW6o?I!G`d_@_1(i*V=yb05L@J_0(D1k3~{i-hBXYY+eNbcEn2JM@{Ufkx8v(9Hr% zkE{%4hE!4u=)3k;6KK{-5o}_HlFsp9o5B{{!qr+BiR)75ap?I0rpt5G8nc>o*I zVnx~L*OhglcQV!w8@b4_oORl`?<(WbJ+qZ;!BY!FR>&)YFV)KQun8R`o V zziPyu$}Wu;#nxBx4woH|FC#6T=rgO+Vl(jqUWfH$%8`m8j6Gr$TfzdlG@yqvTZ_^$ z#~f(h?)?%+2NH`-|51 x{S`_z}$2Ss<$$Qpk7(Alu%xuvCQWJ&R=m z-<1KnWV*Q*f{OyZO;=vMdWQ|sk5%oa(~vMmiWvv<3tQgHND<*CcGSqor=G!+7G;Gs zif44tbR0fL8@lsI>}HW79z~PqBR-cb!vJl^s`oQ{(&svn4~K%3uc?b4d7gmb{_<+t zM5kxK8vo@{Q8w_j{&F}$#0dQ7u=2L@E6;V@jqPf_T6ovfikmTZ X?Otfiarz?nk6{XQ vImmtK{w?jpaijH{Hgr&}`MJL=?ugk)M3c)p9!m3Y=E*mA(Wqko?atG@uY oq3^qLy`j%m>F)o_*!=}rE^#xR$&KFk&+j9WVsfHY!UjSA0}RTk9smFU diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index 3bdd35a..1f0caeb 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -15,11 +15,11 @@ -+
- API Docs for: 0.9 + API Docs for: 1.0@@ -51,6 +51,10 @@DisplayObjectContainer +InteractionData + +InteractionManager +MovieClip Point @@ -170,6 +174,18 @@ ++ + InteractionData + + + ++ + InteractionManager + + +MovieClip diff --git a/examples/example 6 - Interactivity/button.png b/examples/example 6 - Interactivity/button.png new file mode 100644 index 0000000000000000000000000000000000000000..b0cd012f5afc4b5769aa176dd1df584529444bdb GIT binary patch literal 42648 zcmagF1C-~$+b-C)-TiCZHm7adwr$(fwrykDw(V)#cJKVZ`|aJkclYe(oFtW}Ue%Mz zTd7k?q=K9{JPZyD5D*Z&q=bmlzw`dT-2e*W-x0{777PdojMP$CSV2-)m{7sV-pta* z6bOhDIaKwp{iX^Uf26%qF@^x4hIn|?aGk2M_8$OF%?N~KQpuGRM# NhayWIRq=fhB5F!!z6}akNr<)Ol@{rEc z`y|(2t`nXUy-g85ean_iY}JU=s@j}c(v+k!jO1L|sD-8_Y0#yrGda41$!Qe&e)N}_ zi#@z3sL88@>u zJYVcrIK` sD#BUdWGE%QlFu2i)65b}*1C zkTl I?K5s4fWJt~E1;HbZ?-tg)m$RXacju~|Y>O`@UG>>fkB zV;j>CB7K(Y 1o`+#D>0828fZ z)^@cOf*ZA&nu@Sr%o#j-@nclBohbv!1d|9IZUxwr7*ZqiXXO4hW?tsV8*AX5xtJTj z^R^c*T_CVL*95w_8IB=vH+7ekj9QEO#7{*;NaQf+jFu~;c#0KrnUjaQ#n^etn8!jw z2PX}gh~*bhY_>hQ;txhcVj3~K=?WD~ct-0SddC|y1eDi-KM9PQE*SylsKxahYgw02 z(*4~12;eYIw%q8{i@uak4_)%EDj3{y3iqGCd?_OoXV!0U-lyZg!!qloX&y=B=a^Wv zuTTjgQ7v3K7Wm7otpzR-cqbq_UuUj*tgT%>9Uo%1qisjo>+MEb2VU3e8t6W4l|Xn5 zyrNPICT`sZpgl 1;ScQxlWlr|cQO3vQ`=Sax=1;+TN7XIwbRel$KSJ;*7 zmt!vd<*^FE<|!rhrS_%yqV%QkW%!bba?$J{{vy>)=}Djm=jy!a&Ldm%uG2R}-Hy_= zShmh%qfnNc@IJ&mO8)HnY~%&hqy5pxPbxd?zP*Hgo`(Cv>&9|{X|j@S@us^2!(v4w zgUEqc9Z?w$sdB;4+{{ZVRbn3-S$iZYbJNK_N{#a1&W)mwh`foG9~#|f0cp$adewU+ zuP+6C`c6V+ ?9EK7p>jURPO11?@A@ z&aAsE9*#cEiavWp$?o3XJrG?)+7nD1cPhB^(Ie`%4QG3;EfW4Sz;mHyp S)X}|vQY3K*k)X_7|Mvs$OnQIYrET6L;6-(oLWGBa1Lvof1BXYS z_y=R&^g%!q$kD?FK!f@(Yd||lXgUJ{!Tu}5q5=bDW@7;Xfp}S}Xt-#|%5WRo+tM4F z*c+MBd)PYsC&>WudT{?M+M2o;5_;I$*g121@Dcx)1oyx4e_#e;!v7L+vF0PzkX0ZQ zws$fmWTR)IXC~%{AtWT^buuyIRuU2WZ}opye8d(mE)Lub4DRmk^zJP5_D<#uOk7-C z42;YS%*=HEB nE4KL;}}!~X;Pzj)&PuR3`rOVfW$|Ca*Of6M=` z*#9oC@&D%Fe+B
FwOk>UazY*;hkfey9iU;szw`Z5Brs~O` zYoEWo;$7(^%p}AlED~d2V2LKFl3?I$6;9NO7H3LT+S(QJ)|)vQE2G!7)Egr>{2QFw zrmN!hl)$h6L5U4qqQGooW@6@%7rmjZlaFiO$CtKeE_aUvO0BPoa{;ej_v`h84eOik zl@057ig~M+OYKY%;=A#WYw28FJvqu5JY{A4w@V6v^^V?UtDWSySB|&6`7233f7vjG z)c2nkWq5^_?d8*ydk)pZ;HygizJoS@;*$&(^9{xuYe)#`tz)N(ZGrI*)~oM;jLcj6 z39a$(CY tt6 zjT$p7mHBjHhDqTtPeO@<=kHl<=^GP%%Sc|4Y ;GOY?9=7cc{DD`X+SRTWB zd5XmhqXyo)$D^jS-VWF69mvZ-^jtVb0IzK24f&3wPZjsq;m6;+jvLfGg#k=9Y7hBf z-dBT#>)xMII5&!C7Y}|5MAGYemdGZ17#aN0=!|WPw Er;H1nOpkJR3jFF$D$xCN5Jq$mV_!!!#Y;bBUz zB^>OuIZ~S3qxMwmQWU7EGo(osRxK%FA;nqaT2W5LfJhPUc^R`Tq*gMzRV$4iGVj8S zCNpBp%T#Mtc%e2Q)WWiP=M^iIcn2)fd15^K_-H&6rS?TS>r%sHmjNv*5pX-{U~Q>4 z@n_cWxH^XseOU`eG))ovOQw>RAO=NfGM2I)44ZL+sc`*;zbmMzg_LHP$Ml;l95WfF zECMdZCU;E-p*;;PN)^9?P~=@XSayaYW&-j)O_Z1H7*_}7>wd -cl>o7sWmx)V1TPghuYlfGs0ZTLR<2Y!y)5f1*H8Q+u8A&{t0 z-5h+$%|{i7uX{p;Jxu8~mp0^C!fz&3Ix+|^M~R_QG-;A-56j6%iLR4m9;<*ZB0ngy z)rh~55O4|kWdZF(9wBV2wH~>| zq}F6qQ5vx9?qbR|e?o+Zd{n@Wh)Lc;IqW`fo&1MoHW%KV_OsOUtbrJpCD?yX#hlOb zk_g4yx|C}+V4h`j@y#w73%!~luQ9LV)=>R_2ztBMExwJ&6MPmw7Yb`^s zyifNtV#{paQdnwMN?sP7{Xoclo=5%9mX6iV+UmB_y@%Z#&3RH}QZj4I0
;Y z-|f_wkR~{yAE+OjjqPH(ci4!#@}kL~jMy>O32OTd+Xu!2lmfqKQ{nUKDFMKG4P6lF z6UMpuo850BObD(qKxIV#V%=IT2(qqdKbXY{MPR+)FxOJ1{CYnTRnyj5@o7?M^F$+# zaKf)#mAWv?VDq{Di=3rbxr#2RB)wq-RKp3S5pjU-McnH`{qIkLH{}q6QrwG45)}=b zRZU84?8xW2QlSR*y79>@o4GA)4arY}IAD?h{I~DfhyS&>V!c4BWa-H4v~JVWwCt*K zNO8wkxfe*`HHarn;CW!~Z^nhaQU_p~^$QJakqRYuUfE)C5ceu6agCCJ$}vhNTj0}B z6=qF~f!$Y3gAF{=P4?+lP$Ih|dE~^+bLo %Nbj)1;cc$35YL^5Wr(pHun+cwMDKk995#wr4-}XMS!yNdYn4Yh7!oj1 z1SvMG?zUH;L3IO)u5B0 WtHzol z>%*Fr>aRH!;=6Ty@00kiqR7ua`8stgHOpmywwnBmI&3rAfCd>lNhOF1ke^j@Ypv9w zqV>Rh4V)KhOo{}NkcEIJ%ZNloz{i%T7I?+0kqs4$B_}!fa_Jc4F)SPCUgWFDX(cU( z6Kbz0FT4(r;MZIHCK*p~-e&^}T0OYHD8RqY_2;e;s&= yI!OxTse10m@==3Y%^SyTmMg6tC6ZO3jxz>in%Fm=00iT|@A?UuDU{spUj zSq*JtFtq4 }+i!k_gjMRZWF`J{ zj7N%}+p^a}K1GXC0(1x*oYP4SjBS!EWw~>O rADLfjkOB3#7S*H D;9_|(vD zAB~{SzxlFcfW-!O2uz=}=xDhuZ|rD)%^G#}&Mzl5)t8`+%NWYikh43*?7nIuyK)z@ z$zsKT$TB7=jP)dp2Uvy@BJEjCY&UFED$a?ugmajrURd;EJ@~>}4nSafBvl8zZw!kK zrUjdtfx#F(Q6ZWzm+~D#BA>~riKIz?RJ{Z4vfj+=yfz&2&-islfeQqs)GUcufHb(i zC%Hv1t#cq36buX~@7e8SafSSbbO}1>IAwQ?AGo+2-@Uuo!|ypKEAy5=9X@+#Sn6lV z9QNNGG}?^YL#gF_A~c`jU0~t2>0<}wxpa}i+PyheYMn5U=13**e>h{X)Fg;_h4~wo ztQq-_qE6?|$cli${WZ@^d-L84y>OryEhql?%%rn4a9^(td4|fM7LRYb6|8kMw9AMm zHTU#vp=%u7TNONJ3=17a3!6!AngM1Onxv&)WDyXKR+QDYYg1U%S5uWS(~ht1TP|8B z^n>r*GX=1bC34Ky#2QP)o`(L!UdX1jZ&6ZkRBE^8Y_~26iXCf`LdC-fc6&&fldvW7 zl6Dg9f(>?KR5IIMPDzNU>#HDvwOBE=H 9>eVG8gvOJ zDVY^Ducdd8)Ix&9O}vCXw{?-UmAR(%dEpj%w4<^iAg76GOOg-o*@`m^cj+dcqj*$M z1Th$)p@xK!;{-|FC6|_lmFO*<5)W9lh#d?tQu~D@rT0;A@4u76u>mUJ91TL!qA1L6 z-=CZD(F{C_ch&exB(uhuwnz)0r2RmU4=U3G9C}}C+G`7jGN@3*_U`0$+;>!fTy%`K z&=^Eq+JU`7I)x%==Yoi$6J4{g5MQD}4qoFhfvt?eJ-bDb@pRip|Iox6xHEn-LRyl+ zU$exhj7gj=Lf!Zb*;M`{pJsSfqRL-VOG%e36x2Al4n8^^jPgbsc%oBvsafMzab%4W z?wvRs<9soy&+B|O301VK&|=z7;#90(wG45XGZds^(DgEyE3fnIfSZ3P KclxpqYHoVbKcVzxj(Py_+d z+Q(x<2nAU(%n-Kvi%h|^y;$AFpuB-qsx;Vv({`UkW;dA=$;DwbmR4N{|LrYb-kwPT zVm#6yfl}SrGoI3i#8vz(ncNQ&Y%raqj}&jw>XdPXQmMBOi74b%F{5y0Sz1)CUN4{9 zo*7+S4SDQ$c+}on)zkz}Nb6+jBYX?87@wfQAdtFY)U|!J)A@Y-rg3;zJ&%@cufoIq z%VR?Cs57om4uk{<&hSBvp4fZ|p6EDQ%(ku_qJScHr$bCQ@_;B-xoj|<6h`2jG%MDI z&|S7-_0XKu;J*=*WUb3wtdKl$C{PVt`HENzMR)n){Fj!RphFmY% vsm_WD zBr9ZqPy_Mfgo)Z=4hAZ9hr6?h1__Ne!_^x4NZ=ps51X5{kmbmQsNxn5xD0XEvm2N> zEh-{x9IaS9)U4H ^W$_(?`jXoIq2~pH>rq0k;e5zui+|_j0 zV;~WOxe`f+b|u}rKFXR1YAHP4A{lfH^SV|9$3n_$CCam>ldDiZj|7E55M0G=FWe&% zL)yNC$k4Fx1I&|E2m;Y3^~a*L+XQ5fKgJ^t;aedTmK39b1u9L7pk(KqDFt@rlH_nr zW3N!%K=8k0q19tplg*l}Ql!vJYs$@|KQGk&z2m@XglzGR`R^C@8;m>(_*oGDh7AI} zemqYon>{VCVwcA0OG~e|G5rlw(V=>#tL4%Oa+z{aGDt;ocaf++^eedBPqm`i3^j5` z$o}60C=~}-HuTVqv>-O{8W;KAk!uM5prX_u{iEZn1WUsgukHm#vY^k`vKnbKgzP7U z2_=3egchjEv^8YURp^7RsAjsHBo9XT`~rp|;_;dnFamvuDSkN)I)*P`GKXNaU3%?W zwwpiU)!lNZ!2LskXt3%y*REPzt70&k)=ngs>^_ qg`03V{2^ITau-M9GzrVq?u zc8K@u5(Zt5DAq5SEv&ztY12G*pwO0XZd05Ptdszpu+2X)H$$&m57 yC`g-8#Z#JnNJ!pSDC5A+tE1}*Dv8`-t(wXa@dH+D8)bo9^E^hbsh8lGoM5KWyrv;$bXipNh{33w9GDV`Mj!zSbfWoks*-CfvvK76d z =#;H!|CS`l#oZ^<~ow%t}bV$pG8 zWN=K}S>S|TuPt&@eq(aSF&;iHE)c|8s-$pwN~h)IXCJmTZS5 `8P>kYk^uK=FL&&mhXE7czrBeV3fUT&ph=)k_6l-YAVF;m zi4ciV0?u|i0?3SFcv`qRww;NEF><+=MHjW3s0{ATS1Kcx P-&Nf{8c0&3N7PLt-UhZ@J8uVn`g(4M8P=EmAH3Nc z33SQ{pdt1c@&i*lz?DKm%!B#dsO^501S7hn+698jyvF|w_cpqBKdYuvrd7u;>te*F zpOF(>+Vi_k={bE+ee}lV)z^K^^tJ}7L1&%@^A}(Lwb8-q(g0HQ?s9bLRBh>bVTkOq zWtJnw%0?$M8mccZcN8H`B8sTkC|%;x604M!G|tQV6aC0c&2RFHej9yHP)H;fNrZVi z4CS(9Sd_-zqx{FhV#__^nP5#`PpebC4nVjKc0(QyCFgD#c>uON4gx@40&P(0bo3ie zMQf!n^(BFB_-R93D%4vdgmR!%@*o{+A?cj;T-c5J`B1-pxPFvycF zGEmXgav@D*IZq);AX(B)J6)f=u{X9%u4>jp=LNU&ybIB@kH?lV)Rios&qc)0a0a zM^l9>{C1Eqe`s~KoW~eRdXDpd)!!UPrRc_70UNY3oXqvS=IXrtBhV^&JliBrJ_aL+ zxkoSveZ8Fv15X}OUYx_3NxH;5viv8=_tpQ$^&`-`caXX~P`XLIJPGWerUTtDf_!%G zJGuL!bH~a*VRo}c;2Zt|fcu<@ISpmRaF{EzE!d2|cqL=n*vi>y`S(YF-{7U|5+SSG zVdS2~xW|ONPjti!V8g$@wcdIatIFf)u+aLm6Tc4I`@=vh5aFOiYDySXDARMfk|QWT zqsumjF8&I+sG6u&rDM(B^4nge+iS=pu25C2VY$=PNk*3um;^%Q8-9e=2u}S#V%LMp zG)=Lm!5 4)#8Q8_%mfrL| ~A2y+)ZW92mQvZuZz}VjVA?s>IIDEhZBao%@kD ktVC Ck`JnImS C=0wWjb>iQTH_Y}YZ*<)?S=U;c+k`L*Y~pU9(^7-7&kaNCu@zYXKcwONz+ z!;u3?<^4RXsh2YZANkv^qmrEt&z6(%avFK$`4Y2*tyhFwt1#f&nz}7H)2f|EYrxw6 ziyzgGB|iq^dx{Fb2#txy>~36LLPaH>hL+o%jo07x@0B{gmTcXw|JZ9GkP{TwuoUuz z0c|YJozH5PwA=Fh>6*^*ow#3Dyzsx`seT`x)plY?%+TAuL)tG;hi<=ow>{Zzr4$UlVFZxpPx@wHL4V|J)jo~KGRE4}X7)_Y&zxtfi`ZK}$9 zbp@QKWr}<+^|zTutN@e`@x4^m31LS>R6lla{FZi{K5CHuM(Hxxbp$Lf$OK|vplCxS zL6xcJaoarQy=wA2-1tpGSY<(pEfq&FhDzJ>_ZJuDVWxAP>iaOWbKP nmqo&@HL3G0ud zdH&_I_t~qIHoS&ElPA^o7OWdz2?o?1CRv->t(t4CN``}aZXb#?J}==m56%Q_Ha{Xm z;nd4*jEV{rVK$ZM%lfC9UE%HZ24w=Di*7bv3p2U?BVi*ia{#F~Lmp7$6y{lor-ra0 zy U zBTQe{{+mV^bPk4NieiyH>=D3foqn55tWS7&hM&!bGopai+n(UWx;gBs8PXWEc6$Sm zt=(W()=Wf21?Wn;Cq6El<3r6^eUAGk3Xy26C0r#LY+WAM=GU25HM@#Y-kE-5dP8oT zPs3C$Yssyqa;r=V7Xd^f5`r<`4YKMJb&Qu-o!3@ELcESw$3y(pHKHJCI-Dj+_{Yvq za4K!>M(7b9lu>pA4wxV*U5MR4gtc~7YePpLaC6M|{d?P5$}FvxzbCd%erc{+9MY?s zzS2i4M)gmueKV>ITDHIooDAnkJJM6g@B=kiWmp9Zm+CR@7(`Qg^hsW8LISdO=hd_s zW>3tobg*#yc_hWa11I-682-I9d=Nq963{jGSHh4N5O0%& ci&;+*1l4GCy6VgNs9Ji-9J2}refQJ3KqpcCVeuVR? z10D`u+qA^0$oqM1W+n9{WSwd0Mk;l@9auY569c1G%T3^%J0|@xml6sEUVbUJ;p{LR zF%G|tcpMa8?iq0drVNQ)-P{&;f1?1woxRQGZoxE*+i^hc1k>^-%Jx7#48p2eltzBQ zkKI=k`@M=Ln7+!%$vH{?a9#+@bmXCRe6GyJH>bvoOM7drk-s$?y^YkxomL(XZLBvA zXsJ;Vw7>Yy3$$$o9lWyhQZbd|q!TuhGe<*QD v=Cp@}sLfp-h+4 yZ)&}lV-)u2CJ(Q6m+G|Q6|zcXyqEm5(->wi)wSjZ5)G0s(dw5^9rT#lVJr1 zSqtxyo1JLcjp%pgkt)07)^vKY-RcR(89W6o3zwO+49aD7oiNfGgU;?F{^->2DZnQ9 zW 53M2xL8(u{7y`ytbaXjyfOOPuC|VuZOnLS@8QygG#n*)=m<9b0imuh;rQm2+#< zoPB{O95d; IT5@y9eqJI)1ishLJ%I$iPL#lj$ a#wjY~xo;k(qD8o%(8I`nK`eun_lyuL1bEGadpiF2h@+7aY#EAwH@irz zppr>bX@9E(r =G~QykL|pJh8F7J0w$2Bd>|*xHgTW z&3D@d8{PKwR?!PKBD94~(&}kRmYhXP^4%INEUz!B0HhAI*I2oSxyL_kM_s$>-|PV~ z=E`j0-Zz`7#I6M+8$i$o52a{4OnlG;VQqO1woD$WBQPNTn|q-wN!sLK`A&IjY%Iy- zI|!uZNzSx_j-jD5a+2CZ9Xqe>G=)t-K^ =Wa1*ww2zC(@d3T^pGpQ6wm*+8V4js*y)8vl3=Az8Z zVpmG&{89oN!Gb= wHJz%F2I z*b~aSD%2KH5)K>+8G4=EX&fE&c#Z{LMPCS`Er?~ZYG(6Cgady5NnTFN(RJDzis^T& z7MlTF_eC|xYQ_$xYzHICQZKnZqMF|$7}ZiI@j!8Fvs{yK0Hbc0>mDmhFwc^EE|X(Q zuFz1etC8&(QZRcuqf`r9zC!CQ&1u3}Khg8y_H(>a-?}S>#lRR%(RjXU+^Aw1`VBbp z=WChbIN58~l6#UUDN}UA8EOAi>8 FDnjjP(zi*lLo1&D+h?fFXMGUnn|?^jyaj&HbUq zEs+JWBF;jf zl{^RA*KRsX^(sHjwl%biUkpN@UuMo6+0a8a=p*!0US*ZV#4MrkUZhuU3d5{x0oN#! zLc2FMSO*G`8xp$0FAUc _mhLrADn9Q&Ll@#xL6b%9>{3HzT#Lhchg z4OCL`Rins260)fs k(VUJ1P3I)?Up`H`zf@s#un+ z9O%M~d~Lb{+uuSWIUC2!11 ` zahz49Ak8cb*#olVFxNv$a60$-xHU%oiBo8sr^U;wY5CxCYQO9!^eY?K&v~kZDGCMY zu1H^Gob|yD#LQYyzhss~9zd^nH&O$p>CMNqHIVX!fipiIuQGH-6y)igmwfUw=n-Q{ zt8b1(ydPzskzzaqyn7k5^%$t<4cN0ZXiU;a1-V}=J5{&IEW>uHV-C?Amcw(g0$=Gk z`NU*^1k1yhSK8h;sCmSOJY?oUf1M*O1~T$1N%A2FSj{9S&Pa$piRmtsLq4}%ID{Ai z8C+cA1^`b!Hna H!h;2!kCCyUV#iL^A9=KC_*s@f0F&-=n9michXNz--*J=m7L#_9 z6B&G#rla($7&Z#+&8#&ic!@$oS1635IDc2b8Fs(9+(%3lsiT>y%M9`GZ7!fo$6vMF z_qCI;V_?}gsU)Pj4SFDXA!VZ6N!}tkw?b$tm#Ev&Wg7?m``D!$FQD;)=`ZmOyPVa* zXFl7>%pxrF4uLs_%Tt)O_qyT=WQu@?g;UsI gdW&Z$6PG=O2eWNjoh@|w zBd0fR0H)7pF}g)w#nJ-#xn+;)Q4qm$w_U^qmTUB5NJb7XJoA*(Ad+$70!pX>?&2)% z&Kw~sz?ZuS+$51kfX`{TbQAx>lY}I7xi9g0=Sf-P>`)b|AarP{vm;wi4}QL%3C(xIn09xl2_cA#k`jUSV5o znVGADviJ}${a29uRs0%X{1Q?oof4i&>Zqm>UO%Xm`YDE6{iZ6zlCP5GhKRI1-BRZG ztUCkv$<|$OoWs06ORzb1ZjJM|Q9{>9byI|naXk*70j!vX!Hd#uk)EXMLg5sAs&r!_ zzjf0PtZ7_y7f*bvK 6-nf^|8xn^z=q z3ABW+8e)bKGgJR<`8aRjict#?v4`D8DyFMgLLsJYi4RS(boARN$tjoOVh{qg@lxDh zuw5SO{g9am+@CrLp_fGxxCITmoaD+fn~>pI)&(JJ$Gt i9P!_1ymz9V{Fn 5p@4M6vl|g84Reqqh7>ehEr~n+8dv7cGjD}%g^AwP$Ja+r?z?Qp^~%(>4!bwJ z5nCIz^0dhqWfjav5n_;7SxS}?w*eImVa_>W(iQsrbE5ukd~OF*W#hjlD%WUNt-Qel z39V9L_^mPZN$--M8sN4kWzcYy8Y1a>e+2OefkGi2zap6x)NBPp$FC6Ikn^DtyM=Lq zMWB+|X+7_#E v$WMWR3B~5qf9F!lW@G^#HO`2lU~p#{!Y~IB?7_o) zjBp1&$fbz%r PZN5VR`RnCjaY4vFd z_Ey*%NUmcaN9ts-qY?sM>}V7lWNbk&E>9$jx=+d@;vB_H$it1XPfu;$PKYUTykCHA zaE6*+Ggm t2CbTMh z0h<`2puGiPiM|%l(}9=1$iC{ng?v&9kMVnr+M-knY6N%zIAr-9S8HGTrkmmwpQTf= zHwWJoPKAWR#S={Bo1SQ?RJ#a|BhF-Q(aE|Zw`Y1c@%LShHsw%DismzeBs*7T^qW_< zM7{J^Y|fCHqh+${vy^@+FzZd_L^GwT*+7Kf+|sIG5fP)k1maPLmofNjz{&>&>kR*t zn+QJ*R+C%@1Aojd&M|6g5PNODVm0(%Lc37qgmzN3OePLS+kjd%zG?3(#T1?$8IXQ$ zoaqmtfLr~By(3d+*idNw+o~W>tzDH$Z}(=f?py$=B-&Je0D9r|(+ k0^b~GL*teYJCZjn{n<@MQF*nBVnVg*bQ0j!Zhqi@V`K~)uV-9T;S85CJjJRu){ zM4`OyMAl!@P+&{^`*b@S#V8+v!Odl-0OAprcz}!Vlt;zs$X5DB!0@PoL}rsA2^@|X zi;@3gsuqSKqhF3OWA94JfKcEUl^zA`XwfKMsOzUtP^)&Lw9IdFs?&3H>DVH8Mm3w{ zR)aANKn;hjqiKIBf|-qvc`Osk;pr3JE|d>oMb>lsvVq5rf{BP5f`e&{6fQ~P$aw2y zT do*O`4SbWQ*GgE~0(nWkOfp#ZR#cq>TeZBfPb5mA#0Cd&Zk41K zlw ynOm=(<=$2cU zS}|S6Ur8)B%l? %GmZK4!6_l=mz9h8Q_&1NAl;|4#j z=<5E2$HG^W2t23R&>G%LIU~~}gWz;F-nhD%VrcWEyA&MR5_voZTz29a+B0z=ZUE%s zH_r%q2N4LktulIuw7VSF@qZ?>`5ryp)ca!=a7{LX#;>kjAL2=V$?O;jVRz7)cShbD zqAe(%!tR}8#uWL^cSNBA%!kBM7sFaGVzzMS;vRJfK&>JOCF6&$Y$WJQozIX}CH*j^ zb 2w-C znJhR`M%!c4*#Q$X=_O{Sb$xd|4SHxRhhrs8eb5#ffj^N(@BfOQQY5?n6$=#3e9Ey_ z=ziJvS9TMRE$d)sJ7h?S<}AgKJOQ6j*WhyEUL@4FHdJXl^)wW)m2NI>*QRXqe7$I9 z|Ab__#-|p3bnCVmaU)48k&d*#2HfdvMmKy-c5Ho?K;7D*S${Rbs~rzu*R$Ht12cfp z(Ghm!Z3&p4HX=g3i}WeVgnu4mh(aFNhY}KT3GV21Z=Z_muY|wawrAk;?cDad42hMM zS-7UP>-|dqs?z`9Xyq5Uk-^bdBuZCo0l)3^JE&B2E0}T&;Uv9>3@4X%@-&kvJI6%+ zRsJpOB{(umH)D;T!Ea*k@$_Ni;;_IEO(NHD7t#rbXBGh8g)r9I!XsY?;2omS5-uLA z9ynbgmi<1v(uVvsccNg7zKHB5W}-xZr>H%R4t~GNcOVf=Y+SmW0#DFX+-@;gmyHx` z(B)(_0Henj(SZq7fn)_G%SoCZHfuYhY55Lz9vJ?L4hD{q-qucdLh04vMrd)NDuD&+ zm*B2KrR(afoQSj%Nfeomm0`d;5SQ}~Tni!DFkEdAec8Omv0x7V?2MqR-7JirUhJQ! z7mTm1>F&oZ5~v@5Tb!>`Ag4mlWB}zlMPfY)* h8#D{kJE$ z6~ @xjBEIwoi0& 0_X1*~aK%+}( z(bQRWcFfe5o#x~6((6GXDb@rzhp9)gURaLu-OZM{N{EU;hdZJr@Zw{H A{X~H9#p27y31kOUv!=x7FrCn`_$>_doEN09gAGe*eb&aYnHHs%*ALX@(Svnf zCzJVogcIr9GFa2aW>3}d`d(Ghja=PB_5XN9$nEHs^0b<+Q;)1CL%dX~;Y c64X>?u)6&cD=xL4 zssxBwovl(0R%t-LQmz6Ug#JRgsylTDzb6zIHs0`E6LcutVye%Exbjbm4-oMIkr ziy&ngxb@?Eg?Kn-byVK+_5z-;d_y(tY%QxJqmVVXVcJ(kKNt2JQyJzpc{LvV86@pY z2wk0xw@!P@ObNmZ*q%n3&sq35MhV xQ0{(|Z zZo3%d%?j(=l)YF+?tY4bUJo}Sb|0g9k5jT>f>CFYd{6;jA0t=0d%lN!Gw|k{HgsKJ zplDw@2GO8@Hs(uGQE>U{9b@ETWIZ5nFcG7TM%p>^mJA!!@?zti_*3`#VgVMWGV> (~GFgO~qC4g;tI; zvyIt%n*{-zCNDCHtXl0aRTy2(1$V^Rk~FBQq;WE>hNEF?cZ`WGMIX=WIX2IV42*rH zCe~Y~`fvLozUQj~h6fZx5f<~?f|u`SRHEt{@&1<)zY~-z-O?qqTD~9=H%3 n*G zb$YpBi{!P?_uAT9hmSuhuL!oRy|GDTb+uM49gz@{oc9ClUhV9?hkm0ABrB@Y{^gA7 zbUaOk{7cE`#lVu5y^*KcauE$+XA!Wbh@-fC=Hc8< }tF-SaTqRe<3 z!Oa2Ee~mD8LbSO*XAj)#`U}I^j9e(Y3lS%zZFTda*=?W4=X#K7n$~tX*MqDr$kN&0 zQP8vV_!e%zMk1fx(tw)XQ!yYl$z}{%ikCNcg^=?OM7%sG^fgg>#pO99R`$H!UnEXD zyXNgPtJm9hwqG*&d@8Ij_GH=?w?9}}j3haxfYz}^e-Ja4*0ct+Tz+U-Z#ZHVe3_h^ zXPO3C2K-tZe-u{no9I!8c>#W6qftdCr%c*>O3?roK=`4^funjHda9ZtuVYD6*RJ-P zP@;I^lB+f%{ohK?++@?LZ$7W@Z95*nQ^;UbhyD{Pdn9*BNhl^q_uK&|$D3G5+~AX3 zp;rpb7F!0@W=)&iMxbz#$`0CKxngDHG+cGl(z?wx`rx79R^K*bm(SJI28I{SdMEQ0 z*i|Ls6}cwcRsM$mX|b%#BT>RSXMfnqzzWJ};bR~ E&apy%{!gYL$}gGD#d!ji!ge9U#m&e45?-=^5UcH*^G p5|C zqubt}W31#dI`8|%?J1#dV=VG(CZ_VYUeOd8rUFmK5Wq;s<#wzbkF$RC`RXs^y{5Ky z=L|jmOttMS530pM)8nr^LaQQLP6j(Kp{{BM3`Azz`m?NtU8wWO>#{CKUHx$(KEr2) zbIG2c-{|KyXl>p$ynp&@i!{>%*aXa6jZxEClAYXp8lapC&k$lNB*X!UQ&{oc zPoKCOzotvi$l~zMnv}~*ZC%VKj{ih_eXc;$#4>reJ%q5Ct>3VuHweZp@vw-EdH692 zF$J- @>E@9-iJQ8ywDy0Of-_&xJd_u3&?0VV0i^(rVUELJ(CY zLHn>xktb?S;;&xQJ%@8RP1)o%BKqD2_&!w4Zj64Ho4DiWGYD$;P!X7-CuzwO<}OKs zcx`KLHKujFk-42)OniS9z|)wl)huNacFjVtB(YB&%~dpX<{O`8y;lm|6fQq9K27%@ zm4MeW872v%YVFd{fjQpijZc!eZ- =$BT= z((>~!r6ky`ZAEaen`R?7ja$V=HdVT Zx(d= zozZYjGY%7N7 G`9{tu`f530mo?erHm(;s3$B5PHiCp6@Y4>!>M_p-+r2Ny{ z#r`bZnuOc(u)1cNK(iKjW+*4zeEI&KnUnX&qJ}}YB^;m2cswb%weKwct_6gTlErqE z5;6Gp`uX2aE2AZ`fAKMRpxhrb1ZkY(qhxnXm;ILJuP~vo#fmJn_D0B8LuuC+ZhVog zx(+Smcf11hBCpJ=UAqtXytz0cV4hS6()27fb`=NY)%gd8M$4A|u%^Ha7CzdRQL%(O zbGc?36Ie7Uw7ogQK2yZ&vu3^F8AxEwqdH`*w_K=S@;oDKcH2vCF6u8P&@LI0DwYXRHvl05%wQ%^o7
~cO~hgBzyRV|C9e8Xquh&k5Yw)QS9PLXHB-CsSu@*U=_M9h z*_NwA(1+b*A+6 WgKI>#gA8bXRW8xAi$Cz3 zSD?x0rsKw~^TMUy??t~>!Ol&`h0V=9)h?cQpo#}=P9hrOr8T?VJN>?HljQ=FR?|CV z$8Ce1!xC3EYCatj5#ins-Bfs&h^54-L^H;J`{H^1%{;FyytmOrd?ey8&x-v4z6f|H z7pD!M%om;jo6+pw^ro6)9OECFONV_uteHZoryQ{$b2)sGk`B?NLq-s~Za$OI9cIHi zZ`a8ghb*1I7BSsqe7e|B?!T(6rq_CU9E?QLCXt8#2LLTV(!V&1_owYQ|Lv+uVk7CR zY_QiXB!!a74_Ru!9&RWXt%%t{g7Oy7J}$lhM6S*_!jg(6{lx?w3J@{JNNAQfGL9#% z@bBQ#18F;d{=7ZD{tT*OA7>5O#z @Xl*1WB|eNjF3f$S`buy-a7s z(hJ<8IT7{F#S1U+EvKvvbAm{B(5g4oTi?RacSNtx&e+3`K2Gllz43K4bxkFhF-L8% zq%Y{5;t=MH_>*7%c>NDv{e4vxPSQd5)~Mi`AP8H8DJ+u8_hy2m&T*}A0T7=b_f6py z+ mJ=}=Xt1+re1 }myF1$m4WE(Y>|3oeX#;!ju|v01?ebiU{hr5} zcst; jRg1|$%7@FSkKGQvW(8M^|zgb3AOKU$Yv 2&3 z$z@b@t)=TzcG4UhF!aXk1)Cq8MwQHRs)Aip^n@d buj7ZL{`m4XcngW3$8E7}C3MeLIZ-=kz_+_kY)K#mM zixqAJ<0Ly2RAQUfFo!$EjN=m%cIx%tV^4qnGd3{2m&PbtadX&?z4GmL%XG 3iXiN1QwudDLeKJu*;B7ASB`qQo z6NZD~C&ZB=z}nT|tL*y5?N(p|c%5(a4QPV_qhMEu01|Gx=9Y4w$cmbnavq@P`J+FP z+ScUi!xn8Bt0#eoLLT~6;}I(&W)YL@(jFA5o5Gkfv=aLrf8%#%@ZpPDBiFf8Q{~o4 z3+35h%)(9#CIo0^(n(rt29pbjAiyd;CPxS?z0EAI_6q}8utOQZ00I)>I9F>R-gm;j z@Qtc{;i0P#9~GtEMw2hJY9Ql~XU85yZ>ZF`HW}LyTe7^{z-Ih;Zr)q!@T+!4h2`%! zCOBl~$PSvJJOQp_j6HrUPub%)RyQ2U>r2ofF=xRHcb>Oa&GO9H=QKybILtr01{SjO z^;zrZt5|%p-1m+uUM7l@q6gFDNh&eral-|_8k_P^XKJ{9#)5k|G`^!l0orW@4!-nG zI@!GyK~vk_gsl!)Z*K3{jinWO#6g=aCG6??kc~4NeSLAs#<-I7SAXa&T*tzAlJfJ( zd(Og^?Hd<1?8z56URX}inm!m+X$4XO*F^x$#6b`UXRBUmt-(|rqT$*EX7QN0+Tn_u z^cGV;-0{MP*{!CXAxNtRI&z)NtEi;q66fV8RE~3RI+-t3C(%SlpL&Ho_VpqAOLmcH zOqSP|Z6Gc_0F3n0tfUIZ<0^~n{E28#QO-PvP^cxikFx|Z()dhn2y4}!TcQ`)l1Ax( z#N(UD@oUmV-{;Q&06+jqL_t)`NC&89>h|no&k_3^56C%T@Nxo(2{0y1&w(%zkPK6H zn7QSO-<0i+Z}B6kMn7u<0}uz}1`$Uf2pSKyvjt(^GRmP~%35WKsDxk>vua6*QrRkt z&2vndhq6&f;EW-urw1W4|3V7q* ~2N zFhx(($KeBg=R+!>L!+%VQ%N-Hn%)RCvA~dt1kOmj+%7DlO64tUz(lkrd~>Lkdsx$4 z c7q9@+Q9f5gY0E9HIvL}1((waRHo;9aJFPu_u>0cGYc_%odu%Uz zmMNR+X>n!U&Y`NFSz6;h*KsIH_l!f}!8kJM2kn8x{p8A3Qk>Fj*g8A(bCYSCDCX@f zw=;7eHn$`*8%l$uSkAb{!D05x+pYVi?L6bF3o8XXIyK6A&kon~)oo#R(Vk{LB0*zG zaF_cSdzB #& zW1q32RYcfQlJp6;K6dovQH@VcGc%gpM 8Nv5GmIXd!&T (KtUi%sI($j`ROfU+v1MT{nJx^g^6!yAdXr@;j0_lcAX2LrXXD5?!7+#X{7$d zIK2v+Ky?08l@d-_h$%uo0ubsxlv^T0Mgr7@LYF%TR;3dIunmu!6!I|J(i%exzys3L zInxLa30+!)R%N&sdNtuIIH86@UdqqwUl2STngS`ljLo_McPMe0l(c8Xc19$< MNv z#Ucftfj@4?RgcZ|9rvAa48@3uYFk{|v3uToz<&9^xr-~(Ii*0Cy@#zph4}^h!^h_B ziKn;iBvb#xthKzJ>GZ_ M6|;L z&dySa6kmrvz4AOI)#mjd8bLdS)Q}=v{vD>??icw3(sA^xfsurm6FO4|!G-;+!imO$ z&_mmbbTEP9LL)jw2tw4TQ5b>X$1WpI>@P5uzV)_SZ0`|--V(PNKn-eS#SuJb9@53q zSy==oj4)Fk82tu`?oM}$=@mQAI;BXps)N`fh>*nJ(nVCKlHd|j1E_0)TxMN0U?8T` zQdTjHg}5VBz;#;3!4tcWH8kCIRA<&)u>43974Cm3M_aX5Qo=pGm{4lCFjO2BIlL7M zC-7NDLxAXRnJP@KJC3|I35 UNN;iVinIwa;}g%lU{7C~u}dpk zY wkWwZ`DBGv(5w#pEe@r%VZuBxzl`s^|*tFke)R#j|s|K%QLEf1dDZwDvX zGB34hV$@!^ykP(Ov1L0r-e-H5n5j}ZAA044y@u}vEHJAylBf3(Hvw&VX@JVA+vxb1 z_kBT%1UckH4t1wSnUdz9u & z5{TRV6($n^@(xb_je}I_k$)Vlw>KshhLynxhQ`SnYn6HH1C|jC*#%s<%J^H>C|_qP zFHG n9ISCmF6M&G^k&9u(1qnFBb*m`KA> I7+LAaTrowA_`Ty$OtdbH1>%7l?W4X zz>eCeYXEf K5Jh=r!?oi*GT=S=| z%&N{@^&_%iIgAKTXF?TQ3`#teBrv9<6n@CVnL+tUPLQ^U@Qc6o7s@N#Iz<;+X@tVX znMJNzEWw!ZO$rQLyxU@|$uic=0<-2sR^DC~?3&OM{O|?cC~v|YzRJ**kJk(Foe4co zR7b?~c8=hBy$f^2A-?d_6EqvOq+GcDN19ETU +PaN#P8 ?0nTq|x{e17`kllIm09S_Y z*kjK;pZFTRWjW35Y*xt9b-6TeGh&U?7s{+}Bx3`bp~Id;O<7x5w#T3NhFx24*-=g` zXdpktY>~bu^w^XCkq^e)L3yGBouIBp*5c+YyJj?5ARS&cMY{!JCQdA+HU7|d7uC4! zM@)xXy !f)eO^cppDJGLMM|InyC zF%+K+wKO9ml8B8f0CEsVzRr+x;}HI3gkDoK$B|J!PEZ~{z=@e6q;E%bi~EHX4qy4m zI3^K;1}MQlV4-nn@bxlb6^)`0_DiLoDnsySd?!_kj@A2+&d z|LF$8>#v@A-oA47lHXXMO%50>N=XJ;TFZ&|@gRe%TCB_tvs%Ynm%_5ijzKANIP8E) zB{|`aWZ7Vhq?@t(-u^ZgCz%bs_7KySTy7-Qi9a=n_Hgcy-Wvqiddpvh^><{)i67M# zx!aA>c6$U*7vgypMs9@(BBU0){Vl5=h3qzgH01lYW5{keg6jm@?HSv_CzK^LtdMX# zq9485WmTBtAL6tbFM^?n9-rSRd9W#+=NIyl)yo?^J;VvD%Z*fX|C?$i%3p!9Dkp!- z?)gXUhTDas$LX?rJlv#Hy9UM$u-qNN n>l2<6%nBHeHS`YuuipH3{&r z;HzITs?$T9#w#jNhcm7G<#ZGLV^{okU+N;o_ QL$QNP9>mme^8x!ybD6sx_jkA~}UGsjFkT8mYC?r%#`DG^?nlT$KS` zgS_4_mbx+5%Yi)ApSH V$sWzS1rsJ`f<0zD z$zItdMT1mS!wH4BAw&eIG?80{QE=S2A|?67rp@H4aD}x4VoS$Q;oU|#?)K{rZ`;3} zNS<-XJ;pgsFJH$winBXh@j}XA^D%Lhrd>WFwBbYvJWX6^fX0j`e|djvv?E~3Lv`SQ zdf^Ml?ly?qNI=yFQkm7u%HPL#kv%Sm?xN9HkPgAUL`K3#O9TvmJYC%8g3(=0qInwO zpt!t3S!9Wf)<88OBA9w);`Wp~Nue^T5dH;QW%QntFt-b;hxyC>q%b)9wlfseUZXl0 zVH|%Ol)hTkDmzO b<)k__<0v|c17_2i(1m%#aqSp>_&@DyA%MtC}Q6~G&b_}vX9KN)`!Cvx__ }w*LgRT>j-%4XDx7jt*}M|u&!ZFL%2q~1sqhk;D`byN zo>^xt??l=>VFD2tO>sojAvR_2fcNA|BjQ(@0I~zOT|T@du@z57FoFqnDR+!cu#-0t zbQ#hbv&36ah_+<*v6M8-0;Oij#f&oBsMed5N8ba~cv?5%4Qd^h%nJB#>y!d;B!pw5 zq;Y<+pWcpMm!cDgc}jk?rW&SXLWpQ9HmZjlKSSWAt!y%Z8AA;D#BJfdX2`AmE8-7~ z+kqKjL>#Rpr`a(RhD}- Rb(Brm%T-%vkLFh%ddRA;dp#3BQ>+wRWpUHD z&V@|LS;z@DArV7$Hy)t@B4%^98YsjK@s$QQ3EZt8x%~<0+(T|W-QVN*4;7~MFt&z4 z02K(JBoPyWyiWTV1LqK}eGp2TatVO)l2Kaass@XbctG?Mnl?CeUay;xVq8QFTK`mf zl~r!l?M{Woa_*+lp2zJn6Jg*M=b?9ohyxJ#FcNl gZH~Va*1|=)|l$Vooy1X}1o`HQw65 z7L0&@r@mFc(u`{QKADOt5Bc%uV^Y s;<5V97FxA+vA&X|$Hdvk63ijCk5 zLU>}bZSpBXfR2|U%S8C7>a;6oVwg?w#NP&&<*gbU9Js>-21-i+uv1ArV9Z!v5DK)z z1lBrYQf3&28Ro{Z72E|FEJHe{M&fBQz;#4rOWn+GiAh5-vkW6LdDT~hJ5g0vS`aNl zr0Xn~XzSu}z8@$?SKY_R%O01w0x_Rw$*M?w (S;n~l#?|_$v2}SJzi&R;dOEH|RqpA}#%HZTt9 z^ymQ!?n)E Q0YJ8vKq)$$HZC>1dU(Pm*T zZ4awM#7ug*LAG$>n@Z=co5I#M*w(ksMaVEr1;+JDjz#b>Im#NDCezpYqL_^GNF(7B zj1g2mH&I-bVFSh}z|@19X@&vC+Ij3bXlCbP%{YhRJAkrm`x6;ydzQY+Hw2*#vqsF^ zfbUXSgyE@vR6$OWtZ+N{PT29HD~ZIeA|I(~ 5L7=nk-vT~_dYV*4N2aZ*J>50?!!|zVBM0K7z)gf~Yi?~uh zQ?*Oyw(S$YNm}a9*%Ks(y*CY;51{&stCdxnllWK;hB7l#mt5w rri#{%s^wQ5&5TrK^up7D>SSs1UDY?Q{~)PF4^q7PGEo( zl@yLQA+aDNhMEpYu!2$EG`y(MOBq7qaL=EkB2@@NroTVKWj{#ib6db?-yeRHcS@3K zFbxiT?P}>+8WCV>n1NeF^xBAk^rTf%aBS%!n~d0A4eP@k%1H#yHak)b-XbWt+4Q>g z0{8m(Ht$gVim6A_*TYAZiXI3i)COvGPOBF<{zUlQ-#2P^+;fK=yp;{uId-nF@Y`Zz z{nE3{%011g{il+)a0%wx=NpAMeg;#5_o>%S+ra2mKIJiF)5r4GH$c8{Om(wnPyPi$ zq5$!;srw)N;+yTrZ7Uo-)qDUoAoMisIJ;qA{9MZ}t!Zjqo6eEcEMtYXQ@e#WQyIjZ zJ4o|>wi=fCocQrqowSes;d|}qp}(@<`q*RkzkOuF_TIv=9;!-pd-dX~{nY>T-S!I) zzQU4Qe}LM0%|7~1$Lz>)h6V+M%lM}K;0Ip9g;lo${RtkV4V%-=u0wh3@)B1I0Y{cS z$s7-ZAOgi}hDPUs5ZuqvRSq0IZa@3;_s}Mf5}V7BovPM|bA?X;F4*V)bi`I?nY7{P zlc*vCY;PA;7w$I0L~i-X#K-IuDV`8=e@~^fYSGwqZ1U-LsTiVpovYLk!Ic+aGK^`J zDha+k*W6ewH7}BkdDtLN+o~y<@I@#-0) l_7)%8V znWD!__wdRKFNMn~Qq^0`C(TYw>rqKtVEnR#WY=bDn%hd;Rnpw%>H>G^sHO@VS52Ik z@?|rz#|kLNI56_C;X^Rs5G7zncjFm8`;GfMf9{mM t=Y5Br|p{$bMEbW!bT2LQ82SUp?&N7$-lJ%9Sqp${*Ygio^O2tiThV-RBkNb zj+;0C(#w$OGxXFFQK6Ai8OCxKi}vuR*^&ig=Q&)ugV1TL@7VYL{N47hAHB q(M^OFf!bziGcw?X%zhKg?eC#=8CF&%cs;a3EX=HJmo#r7d%xUb4#bDLZom zm3Nq0CR<7Cc#P%MP8F$#)w-q{u@5HW77zQ#hwrds$4&z1Df{~$F#F2qllH ?YA1rPV z%J6`bwTQUpHKJ3q^a&(`${yf-zjphxL9o#n9mph~ytrX^?oZmicO0;3ZvE1iWtULO z^_H6Is!W_?)YD1gOA5rjVd(vE<1cM9s633VkZS6l6C4Cdvl;f~KXn@?8ZOf#aXMiC zAQviWtRr?0#TR)uxQ}yiVvO6DfzxDnJb%utY4mNbY=7wYn)c)q^m11h?e#zVa(mBD zzQJy}UCgc4WmK|uMvI%YBu=g^7(djs!}qo9ZCoOC>D>wY^rtiS#Gf;TwX$Y!y8jjS zBOiG!z0_lrbr3>SBArQ`=c1(x_P`HL+O;n=?3F*>XFvTb-^Jv^6~dn9VVj@h%r_4o z`G&1u7_)Dl -f9Ofd%+VBGHxEOkF0xRsV@Kiq? t`Jq=C1{#rMip2Fzu=7rmYBIhpnl_s@w*eU+a?-SuPQA| zbsc(Pn39Od7iy?RCHOoI=(WU%u}PHJ($v(+i0u{BDK36J`O23O$n^69y9nrJ^(7}i zWFS0*u}coJbTOmC(_5%u1c^~J=G4{!MpDj iU4nJXiUBN1y%ZFTcb32l;-U z&5~{}DQPGl#47_CWrjGkF`jvzhzPNH>s_wd%)XXAe0AM^;t%h$xBkdmDL5iw{RwMb zevA)fQr@Nn4@R`067$UqooLlK;`qy&_TL__*cb0I`}off+u+Coy$#I5IXaX{9=>8s z&!x*@(-8H*kiOc%Vbweg*L<22=v>^p^$5gq$oI=8*4VPgRUm_-X)7QYUi*W$+duqg zAFzD~4^k{HfqLOn{`oOAMUrbE{CK2VoO+Y`-{ksvKDX{7^1#WK{oFsQvrb#KFMr_> zTkBLe7wJj9Mt)d<;k`*!pD$p^0B1_qU5KjL<)JSPBq(P~g;o}9s3IGmaMYxu+E8P_ zaCJn`V(?{N06)4)O*k!a1KK-&;%+;1 i5gz_wSi#Q!AwLyyd)tWYWNnH}Hw2ka41{AC_ TVa{^J!X)YKD-uG9m1Pw46?Db#Z+Lqt^;5!7Npo=tOYUxwZaG?EaQdLBkP zyw$YbMy c_REkQRq>}vQ*r_ CNxBnJ~ww9KH)~R$}vM$F^2_&j;G+^Z$#k|28t@dw YK|;)Ni} z8F9r2Bn(2(9=U1@%e2_wFo*#C;(z!^TsYf0{p+dz@+0`IN65g*g*aewmUT&C7JdK| zH|)+;w4gojjiw*|5G~KZHTWNiEajsd3UiKPD_|Sp1XMeE0AQ(K37`>}4Ech$o&T^> zaR*CA#*qABZBS;t4C*F!Po_H_*phC#bvt2>@a-okPZ3Z7iRur1pq75?S4Pv@?|(ZN zeQ^@M^`{v(nzt6fedPGQyB5>eKgU|*0Z!mK8;>w`P%25E1(!qcjB+Uv;14EMlUJbC z7;+}+E#;S|9@FU)%;1hfKe_{iLeDBlhmm8lX*ETE_6aJcHSk*{>&4$BBiZ5*Il)nT zg-^!|r`N53r63A&s#^1vzBXedWOsCt3X}Z %u$GLoY+@KNVHRKskMgU&Yz~18w=9_Y%VQykFhVnGZ|ef4d$G`a|K0=Xx*Kod&ZtkP+J1zv zMz@;_q@ Ki$EZjlVH`>RZ9-m&Suce=)M*jlt2V5X>&; zdd}%`j~HEkE?hdtV)j-pd;+X=wJvgqAnYqf5D*;cbw;ny>rp)Z=#CPnoSF(DcHfEc z`oFi||86Q3@AvsuRYo4l1t7oMb}XbH|3@jk Tl&Q16)ne+u2&96M@9rF78R2WWThv4d zqX&UjVKlsw3#8WABD$vMbs4iTGzbAcN>W-N9sM__bmMl%v=66r_|rI2Thyo+^f&Ag z82vn#aM5y4&gF4+A5-lkSL3+_+!zbRunwBknUQR8*m-g61lN@uNzB!d7C-bXf{`T= zAAB0!o4AdQTdDIH7p+iJq7p_%WqCE2RbLs >r4;8#Y zQ$9m&ux|>USjE<~EBm>KjNXp)=ie~(I%{%Ay*~-waiSu)XNgk+nDF>OKg!5S5>Z07 zqaKb5kRP!qpAd|r4!Of!oBq08t_=NZeoLXnP`niZ8=uOI*qia%iW|}ZZMS{-tePLk z^`nGq)Cbn|4=nbyn2~C57i7GLNDJsitN~1DDl}`@j80|OvA7wm<7tGfbn W_Zc)N Xn9!8Va`W9 zNUCk^57R~Fa0?pKVzBhnKK?(LRR9Ke|AatO83fZE20VB@eY7Y2`Aa>#cahr{o`y_! z-n5YJdiNaNLIAQotj5L4zR|UJcQZZqC;jO?|KN(WWte+D7r6kr62_=2$fNooH*@#1 z5bnn3j8q`L^aF~PrCp{TD_s5;;Zj>gEw+S1{4|l&v1dlpy&roEi{)GKdo<$Z8j5kT z`L85t vP`Kkuz`LE=71-#6VlkucI;j2Nr7DfP-N>^O#lEn&k!XjHU?exa?PP0WzG6jwiJ <_Bf+w1WQ<|o4L@jPm`EeB|598K!aC|eGtI<>2`YjU~l@&BfNS< zE6|5<8+D4-;4`c}9-peG53w}RLKt_y(38IXXfr+id0K~alj*)+R4C|{wVvmrB~`dh z6O ;eG23~E;0CzLw2X4MO%d2PUz3;PQwGl_wO~c X(`Dc$I~&>h@D!Ui26L;QQ6%6iD_cS*Z5#*BJN&Vt!p&$U zs`)L&1{Z|z7)C-UNG1GbDMX;`T3~5gf^DY27l$dzXWHJF@ZfuTBXk<{Z}ae6jgfC0 zK@2d>=bz7)M ( z)*NrTm%@?@pCso 4Sl%PR^tqAG#*paNG5` z9wnPcK^7z~SymEndP^aEWJbbUD|F!pa|RW%;(d0kQgRNJcfrb%reB044}TzV{ph z$HUP>a$YX+_)+i|AY2a}VM&PoO4OHVud1A|>Lnk}L3j$p;ZWINE+~sfJ+JMlXHZe3 zVXXK8a~^i7XDo9_&3PWgqV+R?9ShB!F)0?)AE0t``C=kwLxse{#q ~s zQFP&G5gAxAt;vN_+#9%wtKQcDpIwl2Q60=XGwM`ZK`xTTNyvF?8v B&PpAaafk-7qNm?-0ofpXck-*g-a}Kirq@zlDhfnus=gwPFkt)uD;K zf`Z9n{J|tb-i-pV$UI>Khbm6E@l%*mZ@RLs7rc0kmT-Z}VaP!|?E`KM1JimdDAFFL z%l^V+w1Bv+xe6F?jE@1;$wQ_DzXdLO45OH#z3J}hbki?wW3YHH39+tt Avr%8@+e4FRkVhMwKB