diff --git a/Gruntfile.js b/Gruntfile.js index 5deef80..7f2bdc9 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -16,28 +16,35 @@ module.exports = function(grunt) { }, js: { src: [ - 'js_src/Shape.js', - 'js_src/Svg.js', - 'js_src/Keyboard.js', - 'js_src/SettingsWindow.js', - 'js_src/UpdatePanel.js', - 'js_src/PrinterPanel.js', - 'js_src/Help.js', - 'js_src/d3dServerInterfacing.js', - 'js_src/verticalShapes.js', - 'js_src/buttonbehaviors.js', - 'js_src/canvasDrawing.js', - 'js_src/previewRendering.js', - 'js_src/gcodeGenerating.js', - 'js_src/init_layout.js', - 'js_src/Printer.js', - 'js_src/Progressbar.js', - 'js_src/Thermometer.js', - 'js_src/utils.js', - 'js_src/sidebar.js', - 'js_src/Message.js', - 'js_src/main.js', - 'js_src/sketches.js' + 'js/Events.js', + 'js/Class.js', + 'js/Button.js', + 'js/Popup.js', + 'js/btnMove.js', + 'js/WordArt.js', + 'js/Shape.js', + 'js/AddShapeDialog.js', + 'js/Svg.js', + 'js/Keyboard.js', + 'js/SettingsWindow.js', + 'js/UpdatePanel.js', + 'js/PrinterPanel.js', + 'js/Help.js', + 'js/d3dServerInterfacing.js', + 'js/verticalShapes.js', + 'js/buttonbehaviors.js', + 'js/canvasDrawing.js', + 'js/previewRendering.js', + 'js/gcodeGenerating.js', + 'js/init_layout.js', + 'js/Printer.js', + 'js/Progressbar.js', + 'js/Thermometer.js', + 'js/utils.js', + 'js/sidebar.js', + 'js/Message.js', + 'js/main.js', + 'js/sketches.js' ], dest: 'www/js/<%= pkg.name %>.js' } @@ -57,8 +64,8 @@ module.exports = function(grunt) { } }, jslibs: { - cwd: "js_src/libs/", -// src: ['js_src/libs/*.js', '!js_src/libs/*.min.js'], // source files mask + cwd: "js/libs/", +// src: ['js/libs/*.js', '!js/libs/*.min.js'], // source files mask src: ['*.js', '!*.min.js'], // source files mask dest: 'www/js/libs/', // destination folder expand: true, // allow dynamic building @@ -106,12 +113,12 @@ module.exports = function(grunt) { }, watch: { javascript: { - files: ["js_src/*", '!www/js/<%= pkg.name %>.min.js', '!www/js/<%= pkg.name %>.js'], + files: ["js/*", '!www/js/<%= pkg.name %>.min.js', '!www/js/<%= pkg.name %>.js'], tasks: ["concat:js", "uglify:js"] // tasks: ["jshint", "concat", "uglify"] }, javascriptLibs: { - files: ["js_src/libs/*"], + files: ["js/libs/*"], tasks: ["uglify:jslibs"] // tasks: ["jshint", "concat", "uglify"] }, diff --git a/Makefile b/Makefile index 10f9761..75d8177 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,6 @@ define Build/Prepare $(CP) www $(PKG_BUILD_DIR)/ $(CP) Gruntfile.js $(PKG_BUILD_DIR)/ $(CP) README.md $(PKG_BUILD_DIR)/ - $(CP) ___settings.html $(PKG_BUILD_DIR)/ $(CP) lesstocss.sh $(PKG_BUILD_DIR)/ $(CP) package.json $(PKG_BUILD_DIR)/ endef diff --git a/NOTICE.txt b/NOTICE.txt index 885d7d2..4688bd0 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,6 +1,7 @@ Doodle3D uses the following external projects: Garden font - Copyright (c) 2012 So-ghislaine - "Garden is a free font for commercial and personal use." +Copse font - Copyright (c) 2010 Dan Rhatigan - SIL Open Font License v1.10 jQuery - Copyright (c) 2005, 2012 jQuery Foundation, Inc. and other contributors - MIT License jQuery-cookie - Copyright (c) 2011, Klaus Hartl - MIT or GPLv2 jQuery-coolfieldset - Copyright (c) 2010 Lucky - GPL diff --git a/README.md b/README.md index d86cc3a..3c85697 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ Doodle3D client app ## Prerequisites - get `npm`, the Node.js package manager, for instance using macports on OSX. -- (prerequisite) install Grunt: `npm install -g grunt-cli`. -- run npm install in the project root to install project dependencies +- (prerequisite) install Grunt: `sudo pm install -g grunt-cli`. +- run `npm install` in the project root to install project dependencies Finally run grunt to build minified css and js files. By default, it will keep running to automatically rebuild when source files are changed. diff --git a/___settings.html b/___settings.html deleted file mode 100644 index 601ea2d..0000000 --- a/___settings.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - settings - - - - - - - -
-
- - -
- Print settings - mm
- mm
- mm
- degrees C
-
- mm/s
- mm/s
-
-
-
- * Continuously move platform while printing instead of once per layer -
-
- mm
- mm
- mm/s
-
-
-
-
- -
- Doodle3D settings - px
- mm
-
-
- -
- Network settings - -
- - -
- -
- Access point settings -
-
-
- * The text %%MAC_ADDR_TAIL%% will be replaced by the last 6 digits of your Doodle3D Wi-Fi box's MAC address. - - -
- -
- Client mode settings - - -
-
- - -
-
- -
- GCODE settings -
-
- - -
-
-
- -
- -
-

-
- - \ No newline at end of file diff --git a/css_old/_backup20131010/d3d_btns.css b/css_old/_backup20131010/d3d_btns.css deleted file mode 100644 index 1e60daa..0000000 --- a/css_old/_backup20131010/d3d_btns.css +++ /dev/null @@ -1,179 +0,0 @@ -/*.logo { - background: #f5f5f5 url('../img/logo_full.png') no-repeat left top; -} - -@media screen and (max-width: 500px) { - .logo { - background: #f5f5f5 url('../img/logo_small.png') no-repeat left top; - } -}*/ - -/*body {*/ - /*-moz-user-select: none; *//* disable cut copy paste */ - /*-webkit-user-select: none; *//* disable cut copy paste */ - /*overflow:hidden; *//* This chops off any overhanging divs */ -/*}*/ - -/*img {*/ - /*z-index: 5;*/ - /*pointer-events:none;*/ - /*-webkit-touch-callout: none; *//**//*disable callout, image save panel */ - /*-webkit-tap-highlight-color: transparent; *//**//* "turn off" link highlight */ -/*}*/ - -/* http://stackoverflow.com/questions/5348092/prevent-default-press-but-not-default-drag-in-ios-mobilesafari */ -/*.btn {*/ - /*background-repeat: no-repeat;*/ -/* -webkit-user-select: none;*/ - /*cursor: pointer*/ -/*}*/ - -/* - - INTERFACE BUTTONS - -*/ -/* -#btnNew { - left: 10px; - top: 10px; - width: 194px; - height: 170px; - background: url('../img/buttons/btnNew.png') no-repeat; -} - -#btnPrevious { - left: 20px; - top: 180px; - z-index: 10; -} - -#btnNext { - left: 126px; - top: 186px; - z-index: 10; -} - -#btnSave { - left: 20px; - top: 240px; -} - -#btnOops { - left: 20px; - top: 450px; - width: 146px; - height: 144px; - background: url('../img/buttons/btnOops.png') no-repeat; -} -*/ - -/* -#btnPrint { - right: 15px; - top: 15px; -} - -#btnStop { - right: 20px; - top: 200px; -} - -#btnInfo { - right: 25px; - bottom: 90px; -} - -#btnSettings { - right: 25px; - bottom: 20px; -} -*/ - - - -/* - - DRAW AREA - -*/ - - -/*#drawAreaContainer > .manipulationBtns {*/ -/* -.drawareacontainer > .manipulationBtns { - margin: 5px; -} - -.manipulationBtn { - cursor: pointer; -} - -#btnsUpDown { - position: absolute; - right: 200px; - bottom: -75px; -} -#btnsUpDown > div { - float: left; - padding-right: 8px; - background-repeat: no-repeat; -} - -#btnsTurnLeftRight { - position: absolute; - right: 20px; - bottom: -75px; -} -#btnsTurnLeftRight >div { - float: left; - padding-right: 8px; - background-repeat: no-repeat; -} - -#btnMoveUp { - width: 65px; - height: 61px; - background: url('../img/buttons/btnUp.png'); -} - -#btnMoveDown { - width: 64px; - height: 63px; - background: url('../img/buttons/btnDown.png'); -} - -#btnTwistLeft { - width: 59px; - height: 61px; - background: url('../img/buttons/btnTurnLeft.png'); -} - -#btnTwistRight { - width: 64px; - height: 56px; - background: url('../img/buttons/btnTurnRight.png'); -} -*/ - -/* -#displayTemp { - position: absolute; - right: 55px; - top: 334px; - font-weight: bold; - background: white; - display:none; -} -*/ - -/* -.disabled { - opacity: 0.3; - cursor: default; -} - -#btnStop.disabled { - display: none; -} -*/ \ No newline at end of file diff --git a/css_old/_backup20131010/fixedPosInterface.css b/css_old/_backup20131010/fixedPosInterface.css deleted file mode 100644 index 881dd30..0000000 --- a/css_old/_backup20131010/fixedPosInterface.css +++ /dev/null @@ -1,93 +0,0 @@ -/* -#drawAreaContainer { - position: absolute; - top: 50%; - left: 50%; - background-color: #fff; - width: 65%; - min-width: 500px; - max-width: 650px; - height: 60%; - min-height: 150px; - max-height: 450px; - border: 4px solid #000; - border-radius: 15px; - overflow: hidden; - z-index: 15; - display: none; -} - -#canvasContainers { - display:table; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - padding: 0; - margin: 0; -} - -#mycanvasContainer { - display:table-cell; - width: auto; - height: 100%; -} -#mycanvas { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - border-right: 2px solid #333; -} - -#previewContainer { - display:table-cell; - width: 150px; - height: 100%; -} -#preview { - width: 150px; - height: 100%; - float: right; - margin: 0; - padding: 0; -} -*/ - -/* DEBUG THING */ -/* -#preview_tmp { - position: absolute; - top: 0px; - left: 0px; - z-index: 500; - border: 1px solid #f80; - display: none; -} -*/ - -/* - - Buttons and logo's - -*/ -/* -.button { - display: table; -} -*/ - -/*#d3dlogo {*/ - /*position: absolute;*/ - /*top: 15px;*/ - /*left: 31%;*/ - /*width: 399px;*/ - /*height: 139px;*/ - /*background-image: url('../img/logo_full.png');*/ - /*cursor: pointer;*/ -/*}*/ - - diff --git a/css_old/_backup20131010/settingsPopup.css b/css_old/_backup20131010/settingsPopup.css deleted file mode 100644 index 95b407b..0000000 --- a/css_old/_backup20131010/settingsPopup.css +++ /dev/null @@ -1,74 +0,0 @@ -#contentOverlay { - background-color: rgba(255, 255, 255, 0.65); - z-index: 20; - position: absolute; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - display:none; -} -#settings { - background-color: #fff; - z-index: 15; - - position: absolute; - top: 50%; - left: 50%; - width: 835px; - height: 500px; - margin: -250px 0 0 -417.5px; - /*padding: 25px;*/ - - /*overflow: scroll;*/ - /*overflow-y: hidden;*/ - -moz-box-shadow: 0px 2px 6px 0px rgba(16, 16, 16, 0.65); - -webkit-box-shadow: 0px 2px 6px 0px rgba(16, 16, 16, 0.65); - box-shadow: 0px 2px 6px 0px rgba(16, 16, 16, 0.65); - border: 2px solid #222; - border-radius: 15px; - -moz-border-radius: 15px; - -webkit-border-radius: 15px; - overflow: hidden; -} -#settings header { - margin: 25px 25px 0 25px; - height: 44px; -} - -div.content { - margin: 15px 25px 25px 25px; - height: 388px; - display: table; -} - -div.content > div { - height: 100%; -} - -div.content > div.settings { - border: 1px solid rgb(187, 187, 187); - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - - width: 660px; - overflow: scroll; - max-height: 368px; - overflow-x: hidden; - padding: 10px 10px 10px 10px; -} -div.content > div.manipulationBtns { - display: table-cell; - vertical-align: bottom; - width: 125px; - -} - -div.content .btnOK { - width: 85px; - height: 86px; - background: url('../img/buttons/btnOk_settings.png') no-repeat; - margin: 0 0 0 10px; - cursor: pointer; -} diff --git a/css_old/_backup20131011/fixedPosInterface.css b/css_old/_backup20131011/fixedPosInterface.css deleted file mode 100644 index eb071f2..0000000 --- a/css_old/_backup20131011/fixedPosInterface.css +++ /dev/null @@ -1,329 +0,0 @@ -body { -/* This chops off any overhanging divs */ - overflow:hidden; -} - -.button { - display: table; -} - -/*#landscape {*/ - /*position:relative;*/ - /*width: 1024px;*/ - /*max-height: 768px;*/ - /*background-color: #808;*/ - /*border: 10px solid #ff0;*/ - /*margin: 0px auto;*/ -/*}*/ - - -#verticalShapes { - position:absolute; - right: -56px; - bottom: 15px; - /*background-color: #fff;*/ -} - -.verticalshape { - width: 50px; - height: 50px; - border: 2px solid #333; - border-radius: 0px 5px 5px 0px; - margin-top: 4px; - /*background-color: #f0f;*/ - cursor: pointer; -} - -.straight { - background: url('../img/vertical_shape_icons/straight.png') no-repeat; -} -.diverging { - background: url('../img/vertical_shape_icons/diverging.png') no-repeat; -} -.converging { - background: url('../img/vertical_shape_icons/converging.png') no-repeat; -} -.sinus { - background: url('../img/vertical_shape_icons/sinus.png') no-repeat; -} - - -/* Portrait */ -@media screen and (orientation:portrait) { - body { -/* background-color: #08F;*/ - } - - #landscape { - display: none; - } - #portrait { - display: block; - } -} - /* Landscape */ -@media screen and (orientation:landscape) { - body { -/* background-color: #8F0;*/ - } - - #landscape { - display: block; - } - #portrait { - display: none; - } -} - -.uiButtonsContainer { - position: fixed; - top: 0px; - left: 0px; - width: 1024px; - min-height: 500px; - max-height: 768px; - height: 100%; - /* height: 768px;*/ -} -.uiButtonsContainer:before { - content:' '; - display:block; - position:absolute; - left:0; - top:0; - right:0; - bottom:0; - border: 2px solid #333; -} - -#d3dlogo { - position: absolute; - top: 15px; - left: 31%; - width: 399px; - height: 139px; - background-image: url('../img/logo_full.png'); - cursor: pointer; -} - -#drawAreaContainer { - position: absolute; - top: 193px; - left: 193px; - width: 650px; - height: 450px; - background-color: #fff; - border: 4px solid #000; - border-radius: 15px; -} - -#preview_tmp { - position: absolute; - top: 0px; - left: 0px; - z-index: 500; - border: 1px solid #f80; - display: none; -} - -#mycanvas, #preview { - /*border: 1px solid #08c;*/ - float: left; -} - -#mycanvas { - width: 500px; - height: 450px; - border: 0px solid #333; - border-right: 2px solid #333; -} - -#preview { - /*border: 1px solid #f8c;*/ - position: absolute; - right: 0px; - top: 0px; - width: 150px; - height: 450px; -} - -.vertImage { - margin: 0px; - padding: 0px; - /*border: 2px solid #f0f;*/ - max-width: 100%; - height: auto; - width: auto; /* for ie9 */ -} - - -.bgTop { - position: absolute; - top: 0px; - left: 0px; - z-index: -5; -} -.bgMiddle { - display: block; - position: absolute; - top: 30%; - left: 0px; - z-index: -5; -} -.bgBottom { - position: absolute; - bottom: 0px; - left: 0px; - z-index: -5; -} - -/* PRINT PROGRESS DISPLAY */ -#printProgressContainer { - position: absolute; - right: 30px; - top: 370px; - width: 110px; - margin: 5px 0px; - font-weight: bold; - display:none; -} -#progressbarContainer { - margin: 3px 0px; - width: inherit; - height: 20px; - background-color: #fff; - border: 2px solid #333; - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} -.progressAmount { - margin: 0px 5px; -} -#progressbar { - position: relative; - /*margin-bottom: -20px;*/ - width: 0%; - height: 100%; - background-color: #4c4; - border: 0px solid #f0f; - border-radius: 3px; - -o-border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -/* THERMOMETER */ -#thermometerContainer { - position: absolute; - right: 5px; - top: 360px; -} -#thermometerCanvas { - /*background: #59b2b8;*/ - /*zoom: 2;*/ -} - - -/* The code below is for resizing UI elements as the viewport becomes less high (suitable for tablets & smartphones) */ - -@media screen and (max-height: 675px) { - .bgMiddle { - display: none; - } - - #d3dlogo { - width: 399px; - height: 74px; - background-image: url('../img/logo_small.png'); - margin-top: 9px; - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.94; - -moz-transform: translate(0px,-5px) scale(.94); - } - - #btnNew { - zoom: 0.94; - -moz-transform: translate(-5px,-5px) scale(.94); - /*-moz-transform: translate(-3px,-3px);*/ - } - #btnOops { - zoom: 0.94; - -moz-transform: translate(-5px,-10px) scale(0.94); - } - - #btnPrint { - right: 10px; - top: 10px; - -moz-transform: translate(5px,-5px); - } - - - .btn { - zoom: 0.94; - -moz-transform: scale(.94); - } - - #drawAreaContainer { - top: 128px; - height: 350px; - } -} - -@media screen and (max-height: 560px) { - #d3dlogo { - width: 399px; - height: 57px; - background-image: url('../img/logo_smaller_wide.png'); - margin-top: 14px; - /*zoom: 0.8;*/ - /*-moz-transform: translate(-20px,-15px) scale(.8);*/ - /*-moz-transform: ;*/ - /*left: 34%;*/ - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.86; - -moz-transform: translate(0px,-7px) scale(0.86); - } - - #btnPrint { - right: 6px; - -moz-transform: translate(10px,-10px); - } - - #btnNew { - zoom: 0.86; - -moz-transform: translate(-10px,-10px) scale(.86); - } - - .btn { - zoom: 0.86; - -moz-transform: scale(.86); - } - - #btnOops { - top: 350px; - zoom: 0.86; - -moz-transform: translate(-10px,-25px) scale(.86); - } - #btnSave { - -moz-transform: translate(-5px,-13px); - } - - #btnPrevious, #btnNext { - /*top: 200px;*/ - -moz-transform: translate(-5px,-10px); - } - - #drawAreaContainer { - top: 110px; - height: 350px; - } -} - - - diff --git a/css_old/_backup20131011/fixedPosInterface.css.BACKUP.99789.css b/css_old/_backup20131011/fixedPosInterface.css.BACKUP.99789.css deleted file mode 100644 index eb071f2..0000000 --- a/css_old/_backup20131011/fixedPosInterface.css.BACKUP.99789.css +++ /dev/null @@ -1,329 +0,0 @@ -body { -/* This chops off any overhanging divs */ - overflow:hidden; -} - -.button { - display: table; -} - -/*#landscape {*/ - /*position:relative;*/ - /*width: 1024px;*/ - /*max-height: 768px;*/ - /*background-color: #808;*/ - /*border: 10px solid #ff0;*/ - /*margin: 0px auto;*/ -/*}*/ - - -#verticalShapes { - position:absolute; - right: -56px; - bottom: 15px; - /*background-color: #fff;*/ -} - -.verticalshape { - width: 50px; - height: 50px; - border: 2px solid #333; - border-radius: 0px 5px 5px 0px; - margin-top: 4px; - /*background-color: #f0f;*/ - cursor: pointer; -} - -.straight { - background: url('../img/vertical_shape_icons/straight.png') no-repeat; -} -.diverging { - background: url('../img/vertical_shape_icons/diverging.png') no-repeat; -} -.converging { - background: url('../img/vertical_shape_icons/converging.png') no-repeat; -} -.sinus { - background: url('../img/vertical_shape_icons/sinus.png') no-repeat; -} - - -/* Portrait */ -@media screen and (orientation:portrait) { - body { -/* background-color: #08F;*/ - } - - #landscape { - display: none; - } - #portrait { - display: block; - } -} - /* Landscape */ -@media screen and (orientation:landscape) { - body { -/* background-color: #8F0;*/ - } - - #landscape { - display: block; - } - #portrait { - display: none; - } -} - -.uiButtonsContainer { - position: fixed; - top: 0px; - left: 0px; - width: 1024px; - min-height: 500px; - max-height: 768px; - height: 100%; - /* height: 768px;*/ -} -.uiButtonsContainer:before { - content:' '; - display:block; - position:absolute; - left:0; - top:0; - right:0; - bottom:0; - border: 2px solid #333; -} - -#d3dlogo { - position: absolute; - top: 15px; - left: 31%; - width: 399px; - height: 139px; - background-image: url('../img/logo_full.png'); - cursor: pointer; -} - -#drawAreaContainer { - position: absolute; - top: 193px; - left: 193px; - width: 650px; - height: 450px; - background-color: #fff; - border: 4px solid #000; - border-radius: 15px; -} - -#preview_tmp { - position: absolute; - top: 0px; - left: 0px; - z-index: 500; - border: 1px solid #f80; - display: none; -} - -#mycanvas, #preview { - /*border: 1px solid #08c;*/ - float: left; -} - -#mycanvas { - width: 500px; - height: 450px; - border: 0px solid #333; - border-right: 2px solid #333; -} - -#preview { - /*border: 1px solid #f8c;*/ - position: absolute; - right: 0px; - top: 0px; - width: 150px; - height: 450px; -} - -.vertImage { - margin: 0px; - padding: 0px; - /*border: 2px solid #f0f;*/ - max-width: 100%; - height: auto; - width: auto; /* for ie9 */ -} - - -.bgTop { - position: absolute; - top: 0px; - left: 0px; - z-index: -5; -} -.bgMiddle { - display: block; - position: absolute; - top: 30%; - left: 0px; - z-index: -5; -} -.bgBottom { - position: absolute; - bottom: 0px; - left: 0px; - z-index: -5; -} - -/* PRINT PROGRESS DISPLAY */ -#printProgressContainer { - position: absolute; - right: 30px; - top: 370px; - width: 110px; - margin: 5px 0px; - font-weight: bold; - display:none; -} -#progressbarContainer { - margin: 3px 0px; - width: inherit; - height: 20px; - background-color: #fff; - border: 2px solid #333; - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} -.progressAmount { - margin: 0px 5px; -} -#progressbar { - position: relative; - /*margin-bottom: -20px;*/ - width: 0%; - height: 100%; - background-color: #4c4; - border: 0px solid #f0f; - border-radius: 3px; - -o-border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -/* THERMOMETER */ -#thermometerContainer { - position: absolute; - right: 5px; - top: 360px; -} -#thermometerCanvas { - /*background: #59b2b8;*/ - /*zoom: 2;*/ -} - - -/* The code below is for resizing UI elements as the viewport becomes less high (suitable for tablets & smartphones) */ - -@media screen and (max-height: 675px) { - .bgMiddle { - display: none; - } - - #d3dlogo { - width: 399px; - height: 74px; - background-image: url('../img/logo_small.png'); - margin-top: 9px; - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.94; - -moz-transform: translate(0px,-5px) scale(.94); - } - - #btnNew { - zoom: 0.94; - -moz-transform: translate(-5px,-5px) scale(.94); - /*-moz-transform: translate(-3px,-3px);*/ - } - #btnOops { - zoom: 0.94; - -moz-transform: translate(-5px,-10px) scale(0.94); - } - - #btnPrint { - right: 10px; - top: 10px; - -moz-transform: translate(5px,-5px); - } - - - .btn { - zoom: 0.94; - -moz-transform: scale(.94); - } - - #drawAreaContainer { - top: 128px; - height: 350px; - } -} - -@media screen and (max-height: 560px) { - #d3dlogo { - width: 399px; - height: 57px; - background-image: url('../img/logo_smaller_wide.png'); - margin-top: 14px; - /*zoom: 0.8;*/ - /*-moz-transform: translate(-20px,-15px) scale(.8);*/ - /*-moz-transform: ;*/ - /*left: 34%;*/ - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.86; - -moz-transform: translate(0px,-7px) scale(0.86); - } - - #btnPrint { - right: 6px; - -moz-transform: translate(10px,-10px); - } - - #btnNew { - zoom: 0.86; - -moz-transform: translate(-10px,-10px) scale(.86); - } - - .btn { - zoom: 0.86; - -moz-transform: scale(.86); - } - - #btnOops { - top: 350px; - zoom: 0.86; - -moz-transform: translate(-10px,-25px) scale(.86); - } - #btnSave { - -moz-transform: translate(-5px,-13px); - } - - #btnPrevious, #btnNext { - /*top: 200px;*/ - -moz-transform: translate(-5px,-10px); - } - - #drawAreaContainer { - top: 110px; - height: 350px; - } -} - - - diff --git a/css_old/_backup20131011/fixedPosInterface.css.BASE.99789.css b/css_old/_backup20131011/fixedPosInterface.css.BASE.99789.css deleted file mode 100644 index 426497d..0000000 --- a/css_old/_backup20131011/fixedPosInterface.css.BASE.99789.css +++ /dev/null @@ -1,323 +0,0 @@ -body { -/* This chops off any overhanging divs */ - overflow:hidden; -} - - -.button { - display: table; -} - -/*.big {*/ - /*background: #a6e19c;*/ - /*border: 1px solid #222;*/ - /*height: 64px;*/ - /*width: 64px;*/ - /*display: table-cell;*/ - /*vertical-align: middle;*/ - /*text-align: center;*/ - /*border-radius: 32px;*/ - /*-moz-border-radius: 32px;*/ - /*-webkit-border-radius: 32px;*/ -/*}*/ -/*.small {*/ - /*background: #a3d5f7;*/ - /*border: 1px solid #222;*/ - /*height: 40px;*/ - /*width: 40px;*/ - /*display: table-cell;*/ - /*vertical-align: middle;*/ - /*text-align: center;*/ - /*border-radius: 20px;*/ - /*-moz-border-radius: 20px;*/ - /*-webkit-border-radius: 20px;*/ -/*}*/ - -#logo { - position: absolute; - /*left: 50%;*/ - /*margin-left: -220px;*/ - top: 20px; - left: 315px; - width: 400px; - height: 140px; -} - -/*ha {*/ - /*background: #f5f5f5 url('../images/bg.jpg') no-repeat;*/ -/*}*/ - - /* Portrait */ -@media screen and (orientation:portrait) { - body { -/* background-color: #08F;*/ - } - - #landscape { - display: none; - } - #portrait { - display: block; - } -} - /* Landscape */ -@media screen and (orientation:landscape) { - body { -/* background-color: #8F0;*/ - } - - #landscape { - display: block; - } - #portrait { - display: none; - } -} - -.container { - position: fixed; - top: 0px; - left: 0px; - border: 2px solid #333; - width: 1024px; - min-height: 500px; - max-height: 768px; - height: 100%; -/* height: 768px;*/ -} - -#d3dlogo { - position: absolute; - top: 15px; - left: 31%; - width: 399px; - height: 139px; - background-image: url('../img/logo_full.png'); - cursor: pointer; -} - -#svg { - cursor: pointer; -} - -#drawAreaContainer { - position: absolute; - top: 193px; - left: 193px; - width: 650px; - height: 450px; - background-color: #fff; - border: 4px solid #000; - border-radius: 15px; -} - -#preview_tmp { - position: absolute; - top: 0px; - left: 0px; - z-index: 500; - border: 1px solid #f80; - display: none; -} - -#mycanvas, #preview { - /*border: 1px solid #08c;*/ - float: left; -} - -#mycanvas { - width: 500px; - height: 450px; - border: 0px solid #333; - border-right: 2px solid #333; -} - -#preview { - /*border: 1px solid #f8c;*/ - position: absolute; - right: 0px; - top: 0px; - width: 150px; - height: 450px; -} - -.vertImage { - margin: 0px; - padding: 0px; - /*border: 2px solid #f0f;*/ - max-width: 100%; - height: auto; - width: auto; /* for ie9 */ -} - - -.bgTop { - position: absolute; - top: 0px; - left: 0px; - z-index: -5; -} -.bgMiddle { - display: block; - position: absolute; - top: 30%; - left: 0px; - z-index: -5; -} -.bgBottom { - position: absolute; - bottom: 0px; - left: 0px; - z-index: -5; -} - -/* PRINT PROGRESS DISPLAY */ -#printProgressContainer { - position: absolute; - right: 30px; - top: 370px; - width: 110px; - margin: 5px 0px; - font-weight: bold; - display:none; -} -#progressbarContainer { - margin: 3px 0px; - width: inherit; - height: 20px; - background-color: #fff; - border: 2px solid #333; - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} -.progressAmount { - margin: 0px 5px; -} -#progressbar { - position: relative; - /*margin-bottom: -20px;*/ - width: 0%; - height: 100%; - background-color: #4c4; - border: 0px solid #f0f; - border-radius: 3px; - -o-border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -/* THERMOMETER */ -#thermometerContainer { - position: absolute; - right: 25px; - top: 370px; -} -#thermometerCanvas { - /*background: #59b2b8;*/ - /*zoom: 2;*/ -} - - -/* The code below is for resizing UI elements as the viewport becomes less high (suitable for tablets & smartphones) */ - -@media screen and (max-height: 675px) { - .bgMiddle { - display: none; - } - - #d3dlogo { - width: 399px; - height: 74px; - background-image: url('../img/logo_small.png'); - margin-top: 9px; - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.94; - -moz-transform: translate(0px,-5px) scale(.94); - } - - #btnNew { - zoom: 0.94; - -moz-transform: translate(-5px,-5px) scale(.94); - /*-moz-transform: translate(-3px,-3px);*/ - } - #btnOops { - zoom: 0.94; - -moz-transform: translate(-5px,-10px) scale(0.94); - } - - #btnPrint { - right: 10px; - top: 10px; - -moz-transform: translate(5px,-5px); - } - - - .btn { - zoom: 0.94; - -moz-transform: scale(.94); - } - - #drawAreaContainer { - top: 128px; - height: 350px; - } -} - -@media screen and (max-height: 560px) { - #d3dlogo { - width: 399px; - height: 57px; - background-image: url('../img/logo_smaller_wide.png'); - margin-top: 14px; - /*zoom: 0.8;*/ - /*-moz-transform: translate(-20px,-15px) scale(.8);*/ - /*-moz-transform: ;*/ - /*left: 34%;*/ - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.86; - -moz-transform: translate(0px,-7px) scale(0.86); - } - - #btnPrint { - right: 6px; - -moz-transform: translate(10px,-10px); - } - - #btnNew { - zoom: 0.86; - -moz-transform: translate(-10px,-10px) scale(.86); - } - - .btn { - zoom: 0.86; - -moz-transform: scale(.86); - } - - #btnOops { - top: 350px; - zoom: 0.86; - -moz-transform: translate(-10px,-25px) scale(.86); - } - #btnSave { - -moz-transform: translate(-5px,-13px); - } - - #btnPrevious, #btnNext { - /*top: 200px;*/ - -moz-transform: translate(-5px,-10px); - } - - #drawAreaContainer { - top: 110px; - height: 350px; - } -} - - - diff --git a/css_old/_backup20131011/fixedPosInterface.css.LOCAL.99789.css b/css_old/_backup20131011/fixedPosInterface.css.LOCAL.99789.css deleted file mode 100644 index eb071f2..0000000 --- a/css_old/_backup20131011/fixedPosInterface.css.LOCAL.99789.css +++ /dev/null @@ -1,329 +0,0 @@ -body { -/* This chops off any overhanging divs */ - overflow:hidden; -} - -.button { - display: table; -} - -/*#landscape {*/ - /*position:relative;*/ - /*width: 1024px;*/ - /*max-height: 768px;*/ - /*background-color: #808;*/ - /*border: 10px solid #ff0;*/ - /*margin: 0px auto;*/ -/*}*/ - - -#verticalShapes { - position:absolute; - right: -56px; - bottom: 15px; - /*background-color: #fff;*/ -} - -.verticalshape { - width: 50px; - height: 50px; - border: 2px solid #333; - border-radius: 0px 5px 5px 0px; - margin-top: 4px; - /*background-color: #f0f;*/ - cursor: pointer; -} - -.straight { - background: url('../img/vertical_shape_icons/straight.png') no-repeat; -} -.diverging { - background: url('../img/vertical_shape_icons/diverging.png') no-repeat; -} -.converging { - background: url('../img/vertical_shape_icons/converging.png') no-repeat; -} -.sinus { - background: url('../img/vertical_shape_icons/sinus.png') no-repeat; -} - - -/* Portrait */ -@media screen and (orientation:portrait) { - body { -/* background-color: #08F;*/ - } - - #landscape { - display: none; - } - #portrait { - display: block; - } -} - /* Landscape */ -@media screen and (orientation:landscape) { - body { -/* background-color: #8F0;*/ - } - - #landscape { - display: block; - } - #portrait { - display: none; - } -} - -.uiButtonsContainer { - position: fixed; - top: 0px; - left: 0px; - width: 1024px; - min-height: 500px; - max-height: 768px; - height: 100%; - /* height: 768px;*/ -} -.uiButtonsContainer:before { - content:' '; - display:block; - position:absolute; - left:0; - top:0; - right:0; - bottom:0; - border: 2px solid #333; -} - -#d3dlogo { - position: absolute; - top: 15px; - left: 31%; - width: 399px; - height: 139px; - background-image: url('../img/logo_full.png'); - cursor: pointer; -} - -#drawAreaContainer { - position: absolute; - top: 193px; - left: 193px; - width: 650px; - height: 450px; - background-color: #fff; - border: 4px solid #000; - border-radius: 15px; -} - -#preview_tmp { - position: absolute; - top: 0px; - left: 0px; - z-index: 500; - border: 1px solid #f80; - display: none; -} - -#mycanvas, #preview { - /*border: 1px solid #08c;*/ - float: left; -} - -#mycanvas { - width: 500px; - height: 450px; - border: 0px solid #333; - border-right: 2px solid #333; -} - -#preview { - /*border: 1px solid #f8c;*/ - position: absolute; - right: 0px; - top: 0px; - width: 150px; - height: 450px; -} - -.vertImage { - margin: 0px; - padding: 0px; - /*border: 2px solid #f0f;*/ - max-width: 100%; - height: auto; - width: auto; /* for ie9 */ -} - - -.bgTop { - position: absolute; - top: 0px; - left: 0px; - z-index: -5; -} -.bgMiddle { - display: block; - position: absolute; - top: 30%; - left: 0px; - z-index: -5; -} -.bgBottom { - position: absolute; - bottom: 0px; - left: 0px; - z-index: -5; -} - -/* PRINT PROGRESS DISPLAY */ -#printProgressContainer { - position: absolute; - right: 30px; - top: 370px; - width: 110px; - margin: 5px 0px; - font-weight: bold; - display:none; -} -#progressbarContainer { - margin: 3px 0px; - width: inherit; - height: 20px; - background-color: #fff; - border: 2px solid #333; - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} -.progressAmount { - margin: 0px 5px; -} -#progressbar { - position: relative; - /*margin-bottom: -20px;*/ - width: 0%; - height: 100%; - background-color: #4c4; - border: 0px solid #f0f; - border-radius: 3px; - -o-border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -/* THERMOMETER */ -#thermometerContainer { - position: absolute; - right: 5px; - top: 360px; -} -#thermometerCanvas { - /*background: #59b2b8;*/ - /*zoom: 2;*/ -} - - -/* The code below is for resizing UI elements as the viewport becomes less high (suitable for tablets & smartphones) */ - -@media screen and (max-height: 675px) { - .bgMiddle { - display: none; - } - - #d3dlogo { - width: 399px; - height: 74px; - background-image: url('../img/logo_small.png'); - margin-top: 9px; - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.94; - -moz-transform: translate(0px,-5px) scale(.94); - } - - #btnNew { - zoom: 0.94; - -moz-transform: translate(-5px,-5px) scale(.94); - /*-moz-transform: translate(-3px,-3px);*/ - } - #btnOops { - zoom: 0.94; - -moz-transform: translate(-5px,-10px) scale(0.94); - } - - #btnPrint { - right: 10px; - top: 10px; - -moz-transform: translate(5px,-5px); - } - - - .btn { - zoom: 0.94; - -moz-transform: scale(.94); - } - - #drawAreaContainer { - top: 128px; - height: 350px; - } -} - -@media screen and (max-height: 560px) { - #d3dlogo { - width: 399px; - height: 57px; - background-image: url('../img/logo_smaller_wide.png'); - margin-top: 14px; - /*zoom: 0.8;*/ - /*-moz-transform: translate(-20px,-15px) scale(.8);*/ - /*-moz-transform: ;*/ - /*left: 34%;*/ - } - - #btnsUpDown, #btnsTurnLeftRight { - zoom: 0.86; - -moz-transform: translate(0px,-7px) scale(0.86); - } - - #btnPrint { - right: 6px; - -moz-transform: translate(10px,-10px); - } - - #btnNew { - zoom: 0.86; - -moz-transform: translate(-10px,-10px) scale(.86); - } - - .btn { - zoom: 0.86; - -moz-transform: scale(.86); - } - - #btnOops { - top: 350px; - zoom: 0.86; - -moz-transform: translate(-10px,-25px) scale(.86); - } - #btnSave { - -moz-transform: translate(-5px,-13px); - } - - #btnPrevious, #btnNext { - /*top: 200px;*/ - -moz-transform: translate(-5px,-10px); - } - - #drawAreaContainer { - top: 110px; - height: 350px; - } -} - - - diff --git a/css_old/_backup20131011/fixedPosInterface.css.REMOTE.99789.css b/css_old/_backup20131011/fixedPosInterface.css.REMOTE.99789.css deleted file mode 100644 index e69de29..0000000 diff --git a/css_old/_backup20131011/popups.css b/css_old/_backup20131011/popups.css deleted file mode 100644 index ce17655..0000000 --- a/css_old/_backup20131011/popups.css +++ /dev/null @@ -1,74 +0,0 @@ -#contentOverlay { - background-color: rgba(255, 255, 255, 0.65); - z-index: 10; - position: absolute; - top: 0px; - left: 0px; - width: 1024px; - height: 100%; - display:none; -} - -.popup { - background-color: #fff; - z-index: 15; - - position: absolute; - top: 50%; - left: 50%; - width: 835px; - height: 500px; - margin: -250px 0 0 -417.5px; - /*padding: 25px;*/ - - /*overflow: scroll;*/ - /*overflow-y: hidden;*/ - -moz-box-shadow: 0px 2px 6px 0px rgba(16, 16, 16, 0.65); - -webkit-box-shadow: 0px 2px 6px 0px rgba(16, 16, 16, 0.65); - box-shadow: 0px 2px 6px 0px rgba(16, 16, 16, 0.65); - border: 2px solid #222; - border-radius: 15px; - -moz-border-radius: 15px; - -webkit-border-radius: 15px; - overflow: hidden; - display:none; -} - - -#settings header { - margin: 25px 25px 0 25px; - height: 44px; -} -#settings div.content { - margin: 15px 25px 25px 25px; - height: 388px; - display: table; -} -#settings div.content > div { - height: 100%; -} -#settings div.content > div.settings { - border: 1px solid rgb(187, 187, 187); - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - - width: 660px; - overflow: scroll; - max-height: 368px; - overflow-x: hidden; - padding: 10px 10px 10px 10px; -} -#settings div.content > div.manipulationBtns { - display: table-cell; - vertical-align: bottom; - width: 125px; - -} -#settings div.content .btnOK { - width: 85px; - height: 86px; - background: url('../img/buttons/btnOk_settings.png') no-repeat; - margin: 0 0 0 10px; - cursor: pointer; -} \ No newline at end of file diff --git a/css_old/_settings.css b/css_old/_settings.css deleted file mode 100644 index 7c6112c..0000000 --- a/css_old/_settings.css +++ /dev/null @@ -1,96 +0,0 @@ -form { - margin: 10px; -} -form input { - margin: 1px; -} - -body,th,td { - font-family: Helvetica, Arial, "Nimbus Sans L", sans-serif; - font-size: 13px; -} -.settingsContainer { - position:relative; - max-width: 600px; - /*min-width: 370px;*/ - width: 100%; - height: 100%; -} -/*form#settingsForm {*/ - /*width: 100% auto;*/ -/*}*/ -form fieldset { - max-width: 600px; - border: 1px solid rgb(187, 187, 187); - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - margin-bottom: 20px; - padding: 8px; - /*padding-right: 8px;*/ -} -form fieldset fieldset{ - max-width: 580px; - margin: 15px 0 5px 0; - clear: left; - float: left; -} -form fieldset legend { - margin-left: 10px; - font-weight: bold; -} -form label { - min-width: 150px; - display: block; - float: left; - margin: 1px 0 0 0; - clear: left; -} -form div { - float: left; -} -form input[type="text"], form input[type="number"], form input[type="password"] { - border: 1px solid rgb(144, 192, 255); - margin-right: 5px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -form input[type="text"].small, form input[type="number"].small, form input[type="password"].small { - width: 50px; -} -form input[type="text"].large, form input[type="number"].large, form input[type="password"].large { - width: 250px; -} -form input[type="radio"] { - margin: 4px 4px 0 0; -} - -form textarea { - border: 1px solid rgb(144, 192, 255); - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -form .startgcode_left { - float:left; - margin-right: 20px; -} -form textarea.gcode { - width: 252px; - /*max-width: 262px;*/ - /*min-width: 200px;*/ - height: 150px; -} -form small { - margin: 3px 0 0 0; - display: block; - clear: left; -} -form .button { - display: inline-block; -} - -form #passwordLabel, form #password { - display: none; -} \ No newline at end of file diff --git a/img/WordArt/WordArt Copse.svg b/img/WordArt/WordArt Copse.svg new file mode 100644 index 0000000..3007150 --- /dev/null +++ b/img/WordArt/WordArt Copse.svg @@ -0,0 +1,102 @@ + + + + + + + + + + image/svg+xml + + + + + + + !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + + + diff --git a/img/buttons/btnArrow.xcf b/img/buttons/btnArrow.xcf new file mode 100644 index 0000000..d521847 Binary files /dev/null and b/img/buttons/btnArrow.xcf differ diff --git a/img/buttons/btnEditOpen.xcf b/img/buttons/btnEditOpen.xcf new file mode 100644 index 0000000..47d67cc Binary files /dev/null and b/img/buttons/btnEditOpen.xcf differ diff --git a/img/buttons/btnHeight.xcf b/img/buttons/btnHeight.xcf new file mode 100644 index 0000000..c83e23f Binary files /dev/null and b/img/buttons/btnHeight.xcf differ diff --git a/img/buttons/btnMove.xcf b/img/buttons/btnMove.xcf new file mode 100644 index 0000000..832a19c Binary files /dev/null and b/img/buttons/btnMove.xcf differ diff --git a/img/buttons/btnRotate.xcf b/img/buttons/btnRotate.xcf new file mode 100644 index 0000000..8b3eebb Binary files /dev/null and b/img/buttons/btnRotate.xcf differ diff --git a/img/buttons/btnTwist.xcf b/img/buttons/btnTwist.xcf new file mode 100644 index 0000000..98bd0c8 Binary files /dev/null and b/img/buttons/btnTwist.xcf differ diff --git a/img/buttons/btnZoom.xcf b/img/buttons/btnZoom.xcf new file mode 100644 index 0000000..1b88ad3 Binary files /dev/null and b/img/buttons/btnZoom.xcf differ diff --git a/img/shapeIcons.ai b/img/shapeIcons.ai new file mode 100644 index 0000000..921c538 --- /dev/null +++ b/img/shapeIcons.ai @@ -0,0 +1,864 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + shapeIcons + + + + + Adobe Illustrator CS5.1 + 2014-01-16T17:07:56+01:00 + 2014-01-16T17:07:56+01:00 + 2014-01-16T17:07:56+01:00 + + + + 256 + 104 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAaAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FUg0T z35Z1rzHrXl3TrtZtV0Bo01GHbYyrX4DX4uJ+F/5W2OKp/irsVdirsVdirsVdirsVdirsVdirsVd irsVdir5Q/5yR/5yR9f615K8lXX7n4odZ1mFvt9nt7dx+z2dx16DapKr5axV2KuxV2KuxV6p+Rf5 6av+W2r/AFe453vlW9cHUNPBq0bHb6xb12EgHUdHGx7EKvvHQtd0jX9ItdY0e6S9029QSW9xGaqy n8QQdiDuDsd8VR+KuxV2KuxV2KuxV2KsE/On8yrf8vfId7rdVbU5f9F0iBt+d1IDwJHdYwC7ewp1 IxV8N/lj+ZmreTPzCtfNbSyXPqSsNYQtVrmCdqzhierE/GK/tAYq/RbTdSsdT0611GwmW4sryJJ7 adDVXjkUMjD5g4qicVdirsVdirsVdirsVdirsVdirsVdirsVfKH/ADkj/wA5I+v9a8leSrr9z8UO s6zC32+z29u4/Z7O469BtUlV8yaZpmoapqFvp2nW8l3fXcixW1tEpZ3djQKoGKvsj8s/+cR/JFh5 bjbz1Z/pfX7mkkyJcXEMNsCP7lDbyRcyP2mNd/s7dVWW/wDQrn5E/wDUs/8AT9qH/ZRirv8AoVz8 if8AqWf+n7UP+yjFXf8AQrn5E/8AUs/9P2of9lGKoPWP+cUPyXvNLubWw0eTTL2WMrb6hFdXkrwv +y4jmmeNvcMOnh1xV8afmL+XXmTyD5km0PXIeLrV7W6QH0biGtFliY9Qe46g7HFWWfkX+emr/ltq /wBXuOd75VvXB1DTwatGx2+sW9dhIB1HRxsexCr7x0LXdI1/SLXWNHukvdNvUElvcRmqsp/EEHYg 7g7HfFUfirsVdirsVdirsVfAv/OSf5pnz158khsZufl7Qy9ppnE1WRqj17gf8ZGWin+VVxV5ZNY3 kNvb3M0EkdvdBjbTMpCSBG4PwY7NxbY0xV9Yf84dfmp9asZ/y+1Sb9/Zh7rQ2c7tCTyngFe8bHmo 8C3ZcVfTuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV8of85I/wDOSPr/AFryV5Kuv3PxQ6zrMLfb7Pb2 7j9ns7jr0G1SVXzJpmmahqmoW+nadbyXd9dyLFbW0Slnd2NAqgYq+5/yA/IDT/y909dX1dY7vzfd x0mmFGS0RhvDCf5v5379Bt1Vex4q7FXYq7FXYqxL8zPyz8t/mF5bk0bWY+LrV7C/QD1raalA6E9Q f2l6MPoIVfAH5i/l15k8g+ZJtD1yHi61e1ukB9G4hrRZYmPUHuOoOxxVln5F/npq/wCW2r/V7jne +Vb1wdQ08GrRsdvrFvXYSAdR0cbHsQq+8dC13SNf0i11jR7pL3Tb1BJb3EZqrKfxBB2IO4Ox3xVH 4q7FXYq7FXiv/OUv5qf4P8kHRdPm4a95hV4ISv2obUbTy1HQkNwT3JI+zir4z8i+TtU85ebNN8t6 YP8ASdQlCGQiqxRj4pJWp+zGgLHFX2f+cf5E6VrH5Q2ugeXrYLqPlaH1ND2q8gRf38RPdrgDkfF6 HFXxL5c8wat5a8wWOt6XKbfUdNmWaB/8pDurDurCqsO4JGKv0i8hec9M85+UtN8yaaaW9/EHeKtW ilX4ZYm90cFffriqf4q7FXYq7FXYq7FXYq7FXYq7FXy5/wA5T/nzqmnX15+Xfl0yWcyxoNc1EfC5 SeJZVghI6K0cg5t134jvVV8saZpmoapqFvp2nW8l3fXcixW1tEpZ3djQKoGKvuf8gPyA0/8AL3T1 1fV1ju/N93HSaYUZLRGG8MJ/m/nfv0G3VV7HirsVdirsVdirsVdirEvzM/LPy3+YXluTRtZj4utX sL9APWtpqUDoT1B/aXow+ghV8AfmL+XXmTyD5km0PXIeLrV7W6QH0biGtFliY9Qe46g7HFWWfkX+ emr/AJbav9XuOd75VvXB1DTwatGx2+sW9dhIB1HRxsexCr9AMVdirsVQ2p6lY6Xp11qV/MtvY2UT 3F1O/wBlIo1LOx+QGKvzj/Nb8wb7z9541DzFc8kglb0tPtmNfRtYyRFH89+TU/aJOKvp/wD5xD/K z9B+WZPOupw8dU11OOnK4+KKwBqGFenrsOX+qFPc4q+hsVfDn/OVf5V/4T86f4h06HjoXmJnmooA SG9HxTR7dA9fUX5sB9nFUx/5xG/NQeX/ADQ/k7U5uGk684NkzmixX4HFQP8AjOoCf6wXFX2lirsV dirsVdirsVdirsVdirsVfAH/ADlH/wCT28zf9GP/AHT7fFXoP/OEemafP5j8yX81vHJe2VtbLaXD KC8QmaQScCfs8ggBI7Yq+vsVdirsVdirsVdirsVdirsVePf85X6Ppd5+S+sX91bRy3umSWsun3DD 44XlvIYZCjf5UblSOn3DFXwZir9VMVdirsVfMH/OYv5qfVrOD8vdLm/fXQS611l6rCDyggJ/y2Hq MPAL2bFXhn5GfllN+YXn200uRG/Q9rS61mUVFLdCP3YYdGlaiD5k9sVfofDDFBDHDCixwxKEjjUA KqqKBQB0AGKr8VYr+Z/kLT/PfkrUfLl5xR7lOdlcMK+jdR7wyjvs2zU6qSO+Kvzk1LTtW0HWriwv Eez1XTZ2imQHi8c0LUNGHgw2I+YxV+gP5EfmfF+YXkG11GZ1/TVlS01mIUH79AKSgfyzLRx2rUds VeiYq7FXYq7FXYq7FXYq7FXYq+AP+co//J7eZv8Aox/7p9vir0v/AJwc/wCOr5u/4wWX/E5sVfWm KuxV2KuxV2KuxV2KuxV2KvKv+co//JE+Zv8Aox/7qFvir4AxV+qmKuxVj3n/AM6aZ5K8o6l5k1E1 gsYi0cNaNLM3wxRL7u5A9uuKvzf8xa9qvmPX77WtTkM+o6lM087b/ac7Ko7KooqjsNsVfeH/ADjv +Vi+QfIUCXkXDzBq/G71YkUZCR+6tz/xhU0P+UWxV6jirsVdir5R/wCcxvyrKSwfmHpcPwScLTXl QdGFFt7g/MfumP8Aqe+KvKP+ce/zSbyB5+gnu5Smgarxs9YUk8VQn93PTxhY1/1Sw74q/QRWVlDK QysKqw3BB7jFW8VdirsVdirsVdirsVdir4A/5yj/APJ7eZv+jH/un2+KvS/+cHP+Or5u/wCMFl/x ObFX1pirsVdirsVdirsVdirsVdiryr/nKP8A8kT5m/6Mf+6hb4q+AMVfqpirsVfFf/OXH5qf4h81 J5P02XlpHl+Q/XGU/DLf04v9ECkp/rF/bFUF/wA4o/lX/irzn/iPUoeeh+XWWVQw+Ca9PxQx+4j/ ALxv9iDs2KvuHFXYq7FXYqgNe0PTde0W90bU4hPp+oQvb3MR7o4oaHsR1B7HFX5v/mN5H1LyP5y1 Ly3f1Z7OT/R56UE1u/xQyj/WQio7Go7Yq+uP+cT/AM1P8UeTz5Y1Kbnrfl5FSMuatNY14xN7mL+7 b24+OKvd8VdirsVdirsVdirsVdir4A/5yj/8nt5m/wCjH/un2+KvS/8AnBz/AI6vm7/jBZf8TmxV 9aYq7FXYq7FXYq7FXYq7FXYq8q/5yj/8kT5m/wCjH/uoW+KvgDFX6qYq85/Pn8z4/wAvvIN1qEDq Nbvq2mjRmhPruN5Sp/ZhX4ulK0B64q+ANL0zVdf1q206yR7zVNSnWKFKlnkllalST4k1JPzxV+jn 5ZeQ9P8AInkvTvLdnxdrZOV5cAU9a5feaU13+Jvs16LQdsVZTirsVdirsVdirwb/AJyz/Kz/ABN5 QXzVpsPPWvLqM04QVaawJ5Sr4n0T+8X259zir5L/AC289al5G85ad5ksaubSSlzb1oJrd/hliP8A rL0r0ah7Yq/SDQ9a03XNHstY0yYXGn38KXFtMP2kkXkKjsfEHodsVRuKuxV2KuxV2KuxV2KvgD/n KP8A8nt5m/6Mf+6fb4qn3/OKH5meXPJ3m2/sNek+q2+vpBBDfsQIopYmYqJa/ZV/Upz6Keu24Vfc IIIqNwehxV2KuxV2KuxV2KuxV2KuxV8+/wDOXH5meW7DyReeRVk+s6/q/wBXd4YyCLaGG4juA83g X9Kir135dOqr4txV+qbuiIzuwVFBLMTQADckk4q/Pn/nIL80X/MDz7PcWspbQdM5Wmjp+y0YP7ye njMwr/q8R2xV63/zhz+VfJp/zD1SHZedpoKuOp3W4uB/yaU/6/tir6sxV2KuxV2KuxV2KtOiOjI6 hkYEMpFQQdiCDir8+P8AnIH8rn/L/wA/XFtbRldB1PleaO3ULGx+OD5wueP+rxPfFXrv/OHH5qEN P+XmqTbHnd6AzHvu9xbj8ZV/2ftir6rxV2KuxV2KuxV2KuxV45+f/wCQGn/mFp7avpCx2nm+0jpD MaKl2ijaGY/zfyP26Hboq+GNT0zUNL1C407UbeS0vrSRorm2lUq6OpoVYHFX0j/zjd/zkidNNr5L 86XVdNPGHR9Ymb/efssE7H/dXZHP2Oh+H7Kr65BBFRuD0OKuxV2KuxV2KuxV2KvHPz//AD/0/wDL 3T20jSGju/N93HWGE0ZLRGG00w/m/kTv1O3VV8ManqeoapqFxqOo3El3fXcjS3NzKxZ3djUsxOKv pv8A5xu/5xu9f6r51862v7n4ZtG0aZft90uLhD+z3RD16nagKrN/+csvzU/wx5QHlbTZuOt+YkZJ ihHKGwrxlY9/3xrGvtz7jFXxPB6PrR+uWEHIeqUoX4V+LjXatOlcVfV2h/8AOYnkPQ9HstH0zyne 2+n2EKW9tCs0PwogoKmm5PUk9TviqO/6He8rf9S1ff8AI6HFXf8AQ73lb/qWr7/kdDirv+h3vK3/ AFLV9/yOhxV3/Q73lb/qWr7/AJHQ4q7/AKHe8rf9S1ff8jocVd/0O95W/wCpavv+R0OKu/6He8rf 9S1ff8jocVYB+dP/ADkP5J/MnyidIby/eWmp20q3GmXzyRMIpOjqwG5R0qCPGh7Yq8L0XWNQ0XVr PVtNmMF/YTJcW0y9VeNgy/RtuMVfo/8Aln5807z35L07zHZUU3Kcbu3BqYblNpYjXfZvs16rQ98V ZRirsVdirsVdirsVdirxz8//AMgNP/MLT21fSFjtPN9pHSGY0VLtFG0Mx/m/kft0O3RV8Manpmoa XqFxp2o28lpfWkjRXNtKpV0dTQqwOKvpH/nG7/nJE6abXyX50uq6aeMOj6xM3+8/ZYJ2P+6uyOfs dD8P2VX1yCCKjcHocVdirsVdirsVeOfn/wDn/p/5e6e2kaQ0d35vu46wwmjJaIw2mmH838id+p26 qvhjU9T1DVNQuNR1G4ku767kaW5uZWLO7salmJxV9N/843f843ev9V86+dbX9z8M2jaNMv2+6XFw h/Z7oh69TtQFV9X4q+O/zH/5x8/Pfzx5y1HzJf21krXklLeD64pENunwxRDb9lBv4mp74qxn/oUP 85f+Wax/6S1/pirv+hQ/zl/5ZrH/AKS1/pirv+hQ/wA5f+Wax/6S1/pirv8AoUP85f8Almsf+ktf 6Yq7/oUP85f+Wax/6S1/pirv+hQ/zl/5ZrH/AKS1/pirv+hQ/wA5f+Wax/6S1/pirv8AoUP85f8A lmsf+ktf6Yq7/oUP85f+Wax/6S1/pirv+hQ/zl/5ZrH/AKS1/pirv+hQ/wA5f+Wax/6S1/pir2X/ AJxv/LD83Py61m9stcgtm8s6mnOURXKyNDdRj4JVSnR1+Bqf5J/ZxV9C4q7FXYq7FXYq7FXYq7FX jn5//kBp/wCYWntq+kLHaeb7SOkMxoqXaKNoZj/N/I/boduir4Y1PTNQ0vULjTtRt5LS+tJGiuba VSro6mhVgcVe0/ln/wA5X+bfJ3lyPQb+wTX7e1othNPO0UsUQFPSLBZOar+xXdRt0pRVlv8A0PHq v/Uowf8ASa//AFRxV3/Q8eq/9SjB/wBJr/8AVHFXf9Dx6r/1KMH/AEmv/wBUcVQup/8AObnmOfT7 iGw8t21leyRstvdtctMInIoH9MxoG49QCaYq+c9T1PUNU1C41HUbiS7vruRpbm5lYs7uxqWYnFX0 3/zjd/zjd6/1Xzr51tf3PwzaNo0y/b7pcXCH9nuiHr1O1AVX1firsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVeOfn/8AkBp/5hae2r6Qsdp5vtI6QzGipdoo2hmP838j 9uh26KvmP/oVz89v+pZ/6ftP/wCyjFXf9Cufnt/1LP8A0/af/wBlGKu/6Fc/Pb/qWf8Ap+0//sox V3/Qrn57f9Sz/wBP2n/9lGKu/wChXPz2/wCpZ/6ftP8A+yjFXrn5Df8AOLF9p2qDzF+YlnGs1nJX TtDLxToXXcTTtE0kbKP2Uqd928Cq+o8VdirsVf/Z + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:F77F1174072068118C14C9642E852E9F + uuid:dca83221-7373-7c49-92cf-03ba2fda54d2 + + uuid:495d734b-595f-ed44-baa4-f7b96906a5ee + xmp.did:F87F11740720681186239FE77607E6FE + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:F77F1174072068118C14C9642E852E9F + 2014-01-16T17:07:50+01:00 + Adobe Illustrator CS5.1 + / + + + + + + Web + Document + + + 1 + False + False + + 18.000000 + 18.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 9.90 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/TrimBox[0.0 0.0 18.0 18.0]/Type/Page>> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/TrimBox[0.0 0.0 18.0 18.0]/Type/Page>> endobj 13 0 obj <>stream +H‰LQËnÄ ¼óþ›‡I®›®öUU?!R›C¶Ò*ÿ/ÕÈ"$ð c{ Ãç Ã2Ü>f0ÃüM°ÀeÁ±þ™á¡Ôïa^J.A¢ä1¥8Áú4™~Ðy†¼;ØdBÇI±f aÔ0â4†7¬’KYƒVèT“F›ù1_¥Þޞءgõ”:?‚âRI´ÌåZ=É(=QϽ©-KñzžYž:QÅ­Êf,¡„\ctÚÓ#û6¢w“ +*Ô$v©Ûäöœ­#&LÂ]FÅ­à•Púµ¹/úuÿ ÆYn endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 12 0 obj <> endobj 11 0 obj [/ICCBased 16 0 R] endobj 16 0 obj <>stream +H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 10 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 15.0 %%AI8_CreatorVersion: 15.1.0 %%For: (Peter Uithoven) () %%Title: (Untitled-1) %%CreationDate: 1/16/14 17:07 %%Canvassize: 16383 %%BoundingBox: 55 -17 96 -1 %%HiResBoundingBox: 55 -17 95.2305 -1 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 11.0 %AI12_BuildNumber: 39 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 78.2305 -18 96.2305 0 %AI3_TemplateBox: 400.5 -300.5 400.5 -300.5 %AI3_TileBox: -192.2695 -389 366.7305 394 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: 39 3 12 886 225 26 0 0 43 134 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 -600 %AI7_GridSettings: 28.3465 5 28.3465 5 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 19 0 obj <>stream +%%BoundingBox: 55 -17 96 -1 %%HiResBoundingBox: 55 -17 95.2305 -1 %AI7_Thumbnail: 128 52 8 %%BeginData: 4560 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD5BFF52FD15F852FD68FF52FD17F827FD26FFA8FD3FFF52FD19F8 %52FD24FF7DF8A8FD3DFF52FD1BF827FD23FF52F852FD3CFF52FD06F827F8 %27F827F827F827F827F827F827F827FD06F827FD21FF7DF8F8F8A8FD3AFF %52FD06F852FFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFF52FD06F827FD20FF %FD04F827FD39FF52FD06F87DFD13FF7DFD06F827FD1EFF52FD05F852FD37 %FF52FD06F852FD15FF52FD06F827FD1CFFA8FD06F827FD36FF52FD06F87D %FD17FF7DFD06F852FD1BFF52FD07F852FD34FF52FD06F852FD19FF52FD06 %F827FD19FFA8FD09F8FD33FF52FD06F852FD1BFF52FD06F852FD18FF27FD %04F827FD04F827FD31FF52FD06F852FD1DFF52FD06F827FD16FF7DFD04F8 %52FF27FD04F87DFD2FFF52FD06F87DFD1FFF7DFD06F827FD14FFA827FD04 %F8A8FF7DFD04F827FD2EFF52FD06F852FD21FF52FD06F827FD13FF7DFD04 %F852FFFFFF27FD04F87DFD2CFF52FD06F87DFD23FF7DFD06F827FD11FFA8 %FD05F8FD04FFA8FD05F8FD2BFFA8FD06F852FD25FF52FD06F8FD11FF27FD %04F87DFD05FF7DFD04F852FD2BFFFD05F87DFD27FF7DFD05F8FD10FF7DFD %04F827FD06FFA827FD04F8A8FD29FFA8FD05F8A8FD28FFFD05F8FD10FF27 %FD04F87DFD07FF7DFD04F852FD2AFFFD05F8FD29FFFD05F8FD0FFF7DFD04 %F827FD09FF27FD04F87DFD28FFA8FD05F8A8FD27FFA8FD05F8FD0FFFFD05 %F8FD0AFFA8FD04F827FD29FFFD05F8FD29FFFD05F8FD0EFF52FD04F852FD %0BFF52FD04F852FD27FFA8FD05F8A8FD27FFA8FD05F8FD0DFFA8FD04F827 %A8FD0BFFA8FD05F8A8FD27FFFD05F8A8FD28FFFD05F8FD0DFF52FD04F87D %FD0DFF52FD04F852FD26FFA8FD05F8A8FD27FFA8FD05F8FD0CFFA8FD04F8 %27FD0FFF27FD04F8A8FD26FFFD05F8FD29FFFD05F8FD0CFFFD05F8A8FD0F %FF7DFD04F827FD25FFA8FD05F8A8FD27FFA8FD05F8FD0BFF7DFD04F852FD %11FF52FD04F87DFD25FFFD05F8FD29FFFD05F8FD0AFFA8FD05F8A8FD11FF %A8FD04F827A8FD23FFA8FD05F8A8FD27FFA8FD05F8FD0AFF52FD04F852FD %13FF52FD04F87DFD24FFFD05F8FD29FFFD05F8FD09FFA8FD05F8FD15FFFD %05F8A8FD22FFA8FD05F8A8FD27FFA8FD05F8FD09FF27FD04F87DFD15FF7D %FD04F827FD23FFFD05F8A8FD28FFFD05F8FD08FF7DFD04F827FD17FF27FD %04F87DFD21FFA8FD05F8A8FD27FFA8FD05F8FD08FF27FD04F8A8FD17FF7D %FD04F827FD22FFFD05F8FD29FFFD05F8FD07FF7DFD04F827FD19FF27FD04 %F87DFD20FFA8FD05F8A8FD28FFFD05F8FD07FFFD05F8FD1BFFFD05F8FD21 %FFFD05F852FD27FF7DFD05F8FD06FF27FD04F87DFD1BFF52FD04F852FD1F %FFA8FD06F852FD25FF52FD06F8FD05FFA8FD04F827FD1DFF27FD04F8A8FD %1FFF52FD06F852FD23FF7DFD06F852FD05FF27FD04F87DFD1DFF7DFD04F8 %27FD20FF52FD06F852FD21FF52FD06F852FD05FF7DFD04F827FD1FFF27FD %04F8A8FD20FF52FD06F852FD1FFF52FD06F852FD06FFFD05F8A8FD1FFFA8 %FD05F8FD21FF52FD06F852FD1DFF52FD06F852FD06FF52FD04F87DFD21FF %52FD04F87DFD21FF52FD06F852FD1BFF7DFD06F852FD06FFA8FD04F827A8 %FD21FFA8FD05F8A8FD21FF52FD06F852FD19FF52FD06F852FD07FF52FD05 %F85227522752275227522752275227522752275227522752275227522752 %275227522752FD05F852FD22FF52FD06F852FD17FF7DFD06F852FD07FFA8 %FD2FF8A8FD22FF52FD06F852FD15FF52FD06F852FD08FF27FD2FF827FD23 %FF52FD06F852FD13FF7DFD06F852FD08FF52FD31F87DFD23FF52FD06F852 %FD11A852FD06F852FD09FF52275227522752275227522752275227522752 %275227522752275227522752275227522752275227522752275227522752 %2752FD24FF52FD1DF852FD62FF52FD1BF852FD64FF52FD19F852FD66FF52 %FD17F852FD68FF52F8F827F827F827F827F827F827F827F827F827F8F852 %FD6AFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD0EFFFF %%EndData endstream endobj 20 0 obj <>stream +%AI12_CompressedDataxœì½ùrÜÆ’/üõ}ÿp„=qºZì7¢WϹŸ¼„eÏøÆÄ„¢E¶,ŽI¶.EÚGçé¿Ì¬¬hôB-¶(¢Ø]jÍÊÊåWY_ü¯Ÿ^Ççë׫¡eñÅÓ›Õòv}óÍ€Rÿ¸¼¼{{ƒI_þüÕ@æ£ ÿþâÿcuóþb}ý Þ’tsoùÓêvu3øõâöíúÏÕõWƒ/¿‚[¿\Ü^®àæ¯×·øé|(¿òEB³å-Ü”_Ëâki²ü&+©FËë?—ïß_ü oÚjH›¬ï®Ï/®Ÿ¬ÿùÍ ÏCYªþÀ½¿øyõ¾õ|¤t–»§fë³»«ÕõíO7ë³Õû÷Óõåúæý7ƒé‡åõàûåïpg9ø¿«ËËõ_ƒÉåòìÎ_-..Wо«åí@RkÇÿêÕäîâòü‡»«×+h¹®0U¿¢}YA®ø“ËWÿ¸‚”—«Û[¨”‡öów“´H×—ÿõóê÷ ê|èœÿþŠ³½Y¿»ZÞüï–Ö·ÇBãÝçÌ=õËêêÝ%t'5ßdÙžÒô'ýÂÏB›è¹¡¬ÔHÞ¶Õ@ŨÄòv_ëwiûó{y†Ôw3˜Üܽ;øe½¾ ÙÖo…Ü9™RñùÓ(ã'záúÇk×A›%ñÍ’€ùœ\)ðôöàæ)ç>]^^^ü~³|÷ö⬭€–û¡$wï>„õáêõúòâýU¤§$å§åÍíÅÙåêå‡÷·««]¹ao¼¹¸>B$îk»¾z‡ÒÄàåÛå»åyûvAO¾ 毀§›Ïfà³ølœÍ@A£ŠAk0ˆ#,z¯:ÌqòþÑõ“.·¼³êÅ ;¨·µë¾£ºMfÌ=µ¶ð«õõàg”\ÿqñû5H1+ à¶T¸Ê@ÃyU"6›We‰äWÉRã‡*“ÒcV¢ÂÌ”YŽÄ—A53å©ïïbªàÒS3ͧÅt+fv6žMg³Ùb¶˜gs9WtiºòyAWÉ—[ÿÍ+ºÆáozM’ÏÍ{15¼/è£Ýyùò ú-¨^9_†/Wc¨»€ÿ$\™¿°itÍùr?S¸&téªè²t•Ð1xåp=¥éRÐoxe³lº€kŽyLÝÏ®1]]–®®®.—ÆË Š„+›,à‚.£ŠL'ø3†«‚ËNJ¸ŠI—™hñ¿q41GüÍiL1í²áÌæéÿ傲ÅOÈrBYOù/ü/¨W–åÒ +*ÊœHøU“ ~åxC›Áÿ3hã~'ô;Wô[Òo!Æù¸€_=6ð«Æ’~³j¿Ð¿søBë¦Õ¸ªè·¬ +øÍ+C¿ª…«Êì†}#1ðßÄŽm—µ%\…Í­¶~¥UV–‹r´1ƒÎ‚ +ÀøS”æ‰.e™•Y±€¡„fãƒ.Ê"‡o +Ud@@ cìã*/süѹÌUžIÁ°ÃACŒ50Íà2Fi¤^±MõDWz,@ýÆ +m4þ€Î©¥Î€gð;U5¦_«*ø¾‚¿4šÔ؉ÕØRŸ)šOØC´{FÓ•áEý=1¦)éÊé2ÐJà6³õ‰»&Ô/•{ú¥ ¾ñ½ƒöÎ*¤S쥊®²€¿úJÒ]Ð[x͡ϤÇtUP’{»IÑ•™]؇S3^¬pU, äH] Ý…i2“QwΨC'z ýéz4§•Ô› èÍô&Ðôc}㧌PÐßJ©LerΪ‰¬¤¥¶Ñ`“f™-pÒÂ5v™ÁàÃeðE¼íDö€MèCäB’Í”J ìC#¿N¢â™«`~ºYéÁ4ƒ 5ƒidaîhaT049r~zvP×i 3 ÷)Œi ½£Èô]1aK&i$肆ÃóDÀXè|CŸc—À<ñz²R'[èà\׿зÐ4èÝ1ô.¬BH ‚ºWaC÷.ÕROB'Óô ]MCM—¢KÖ®‡vþÎyÐK8šR'—ÚrmûÉ6/ÁDØ~Í·\³Ö ûx*ÜŸÚ5Ùr·\Uz‰ä‹Ýr•[®¢í4ìm—Ùré-—#%ü‡pµõtm:óhBß`ÇͳÝ—4zȘ=Pr üÂUÃRÜcJ‹üù ”!þh˜fCŒ§TVÀô_Ç¥ùüB-ˆïKàGYp/äœ%ð2äácàl¸öψ×- µÈqAB±Å槅Y:~9®9#ÑfA†«ä  +˜ÜÈø+âÀàÅ(«ÀjF=/ %€=â"OG¶k¬€càÈégÀñÅOb‹€àªÃƒøc»T°nLP~¡õu.ÊP€¤E—_ÅCž°ªXZœÇ°LO€MÍHd[áZŽ­Çµ½ uÅu‚ümJ"×…¸PTP$8ä$D”´Î¡t1&Y…´¹M7Ž2Œ¡Á*ŒÞ<Œœ£fiÈ&~¸h°ÜPå"Œ“¥Y!åF‡‡Æ Œ–E†£òC!x$d„" ÀÄw>w½ÝnC—c‡»Þv}‹ÐÑãÐÉ‹ÐÁ®{ËеÓЫ2ô¨ëÏÊ÷¥€g¬A‚h§IÜ+H¬@2œ€„8™q,E&ÚJžë3XѬGhÔ$HË%È' Ó„ŠyP(4PqN»%©äSÃçóŒfPT&ºq©ä’µËñ´ErEå‚…ùñTdå.÷S‘œ…JŠ…^Æ$àA'i’WQZ•ÄpÍYC‰l*Hp`.UÅZId“èjˆÔ‰°’ÖìM'´MjR,NTCb, +m’Ŷ9‰²8éœØæ7hsÛTÙf$°¡Ö‹k9‰k(IXt¤!¡¨6 bZABšÊ•$¢ÍI@›Ð¼"ÁMó%iþ8.;çkBòUE3­ä9çCâf¼*j^nÍs+Ù‚Y0ö-Ÿþ0¦5¥ŽåVäs-9±ýœÿÈëAËyƒ½?îç4~õ xÙ[FíÕÔØ7®¯&Ôƒ`}bï{ë»xßCXŸØÅûÂúÄ.Þ·›õÑL VÂÌ……(Çzö?';À"Hr4ÏÈJ œÉ€˜°!FŒW!ȪP}¡d[CÅ—³Bp)l kðlw¡íbÁÒ¤³hH1#‹ †/’*ØâUJg!©ørìÖ5…KqæÁÆ6¾°D뉪Y™œýÆÛs€>œ:µ¨_ÛDçpÉÝ—X¨—Þs™æ% ùΫØsïøßÖË¶K$_Æ{®IýJWæÃd=?óãÜo™ý"™þQöi9‰8N°SæD’$v2k´;ÑÓÐúìÄOÇ(*ZÃ'Ä.¦A +ÅkádQAR€G51Ãb©c&%Ë‹§ã iLYP%a5\À­ìD6ØJd-ároÇ?'’¡_Ë*gÒE_°šèl^Ëtšé˜þzÅÖiĬC;-›Õp¯¸“p"XRñ¶!gÇpö"Ï–œV©è-/åd¬s+s0z[©!9U’4:'˨³ˆZ0½4#aÒ™>ÇÁ¸— ‹‹sÇAHÌY>”,΂\ešD("¡—½4x,H¦:K–:ÐKÑZ¤Ø^äth3²d5r&:Å&:g;š°õ¨LìGÒ[uø˜‡¡ &µ!9 Ò„G¸¤Ñ7dÑÊÖ´ýË?]2ÿ†ÿhöOLÿ"±ýGë¿»¢ +¢w¨à l”Y8—€à5vÖð 4ý©‡ äÕ¼àåÝD_÷(– ¼¥g<ó I¸RüÏ8xª Žp"XRñr‹“bêJW›¢5gõ»¹Vì][Z§t™Ú½¶íZñÚXLE#a÷ʼ±°7. {±S2Ø-WlFâ—=rMSjè̆EÏ’eØ*HšÓ ].X•—‰<éeI/D1Š 2Jó 3:¢OEÅTHLÅCž]Q:t?óVÑЋ‡›¢a" +öI–u¯äŽ«ª9+7\’¢ÅS9©?Òðvn:%Kb6$˜ 9î3#O€%6bˆex_À˜f»!o€òê·ó9Oј=GSçIr^%RÛPq+ÈCb‰£â權ΦhÈYU +`â(¸L‰sÍaEF¯É~X€”3Ãe„6E E‹.cb3RÔPVÓ$«‚mƒcÓœ×má¼pì‘sÊZ*žÍHe[°ÒæÜ{†Ý}¥ ¡¬b_à4èo3ç/d%Î+rš}‹;+v>NØ9G£Ï %,Òð${.Ó°W³úž›/øÿ˜\1ÎðUñ· Í©`*YÃÒÿas“JÓ´ÂqÌÙ7k»Ù$Ù ÛD¬3ω÷Ï‚[“hã-1Î:ã¬ÖÐPõ³bƒõ”V.² 'gp”dÉàs²Ècþ:ÐPS’•S|2çòäýsÔUÛô˜–42 ÄbyMQ°ŠàœŽ6NÏ‘@°‡R³ªà¼—–•…1-f~±vª‚âË°[Ô=\±Ë”…{9œoÕ[å͉Ör’푦€˜NL¯;:œÈJò²f'Š£gS³ÔRg;bëQ‹ýÈô¢õˆlG‚ŒGÎr4 ȳ´!¡8[HAV¢Ià4†ÄÊñoÁìÅ1Õ¸I‹ÏœFÎï°8J4@ù ˆ$ƒA10í-LvP«h>ç(ÇÐ4…–)ž}U‚oÑÀqK2PLÉ-i9)6Gs›©ékR±³›—`3eûµÍ Öê4sªŽhñ±móÉU[®š«O$_¶y 7ý‰S&›–KlõYn3Ïlëhþ^Ôm^×Ä3ëu³ {ÙÈï ü&˜õ³ …Í‚%¿"‡”·â³_ >ÆÙ|›ñ>ØîeÐÎ6-÷Š’‹`º÷ªš7ß;mÍëkNc«ÙðƒÞæ57ÒÝDPßœÇ*+q^óŠœm€.”ƒ]0Š5º©`¥Î«uN±óªSî¼zç<¯ây%Ï©y^Ñ[B ÌXÙsêžWø¼Ê§2Ã9º§Þî7ápJRXErVAªžb՜Ī ém«•“fæÄ+Ër"V…2m™HZ2 £¬Ê‹v]þ᪼h×å®Ê‹v]þ᪼h×åw«òQQé +ÉH#WGÍÌ~ª 쌡ɞ‚fNÊ épêâ7aFjåÌ!Ë&$XÆ–å„°qø2å'7ámÊlJˆª)ÉÑ9W’\Ó¼ {¦‡W¹éî!hd5 ÓÞM|7ùqŒ=ð,ÀàŠéù€ç æSÞ7¨HÔ)l2ÿ‰ˆ-Ä0c,›­!rå€kù%yg4æ–|~Z ›¦¯ƒU• ¨j“w½X±d‚%i‘ˆ*ÂJ=£ÉíÖk·b;jÔú)£Š6›Ï¯Xí_%ª¸7Ø«`¸wxo‡wætÿÉ# ¼·¦»Ä²fƒˆ–öMûDjƒOî‰`¾¨3Ò—·[*Z¬b§Ý¡aTHÌñÇkßl¦Äi' Ônªá²Á‹ÀgìYG=­ãýf$?O»8!}®äYçÝ㨄d8û€E¢¹~Šù˜m’Ñ-qËŠôÇ‚fc:#ý¯!g€ÿ•a–Ò/¡Thº6§lœ¶cþ­H(i +[òB©+è׸ΘĆœè²ÈZ§óŒÔ–1aðât.x:Bå…™,ÐIBÖŒi@žVŒŸ,ȵBèIíÍIÍÂÎ+Š,xA3vFÊô€ õWk ÜyAÓvNV<ìñ‚l +9Iôl?uvÓÍÅtL–l“ ¶ +·˜N»hÉX¤qì0ÅAvElòŠEhu0`ÅÀßiûjøâ +YÑHç4–µ:4.õ¾¢®žRÇZ⌊àsb€Èøåyóµ_ðZ—°º¸Ð‰ÀÜp#|.õ‘9–Ô?†d—tY G‚5xëôÜ!ï&ÁDíÔyÀ¯5¡i]*ƒ™Øæ)úýE7˜§èýÝ`ž¢ß_tƒyŠ~Ñ æ)BžÄ¡˜'FlÓ¬v*RíJST¶ªHl$J¯¼vµ‹$!ÙòBR{zUµk\»>M9—`Pe¼æ«fo¨ÜõÆÑPñG×.S»òÆUÔ®2^‚¦Kýªj×Ø]8£âuUßÕ¾SË€+­BÿLºt +¯ŠÐ_i_=_‡6õxÓÉæÔ£N½e'w.|ê {€êÍ{SZ=È`LSÞCQ=Õ™¹Ï#R+A¦äI°ü145€S%õ¯¨zˆjÁ†@KKœªNØHI² 2bÕÃ4ɾy”´˜V¼êá«3g% 6j)Çêa9Iåe \@6ÃÔƒr(ç=˜Cï¼+ïfSRjN2Á.”“¹‡L>‚,<6±ê8{Þ¸Æ@<Ãð¿ô?©×Þ”âÿW"™K,Á‰Þµª½+ƒs¦¼kªbý»d?©I6Ieq{”ðª8{:ÛtñýÚ¸+H­žõݺø8Ȧ¦…“.º¢ Nÿ&íÛùfœ„ ‰?áôÒ„®hŠa£‰Â§­&N'šðØ•´áÄ°~¤3)˜>áu!!"€R6f{®é®KПÉÞ«mSá¦Ã.l.l»v; Sÿ^íÉ—¢y9Jéh‰œUt ´DF(ºZ¢¼%v \Ô'uPWm#f_÷ZöÖLÈ!½‰ê"L—H ]~GÁ˜á\³È%YŒ› +6·^K8¸'㲃;=¨³d(ç˜EïYOýêѧNuÁˆÌ1ËŽ5zº1,òâú#•0pÉì%°xþM¶ + Þä6á•"îèñ»zÜÒ’³Ú’׶ݨ°0…¥ê£3–¿ ¦bOÃ’T𺾯#]G8­d+ݶi %ù<1ìÞAj‚hÑêšBÔ‹ª’¡rÞ¹éŒIí7ùmFÂí1 +Û‹R·dpLnl,šò(9á6n‡Á´¶F÷dÍA¹WrSµdȉÓ%pZʽ3ËJ‚ÇŒU +°° Mšít&¬J6÷8zy§tÎÎýñÞªcPE»þØP Ûë*$’ü”ÖŸ©ƒ?!xAyF1 +ÊÐ0x‰fÌ@uŸÀâä0P††zL+Ó” zè• Àƒ¡:{$Ê<÷€¶*õµÈú<ì­É6Kü©í²µÍ»vJ´Á%[¶=xg*%º“üëwèÍy“Pt2MÈRfÃöNX’JŒÔ¢aሖo ‰Ö‘²ÕJ’‡·è¯ >f·\ú1IM=·öM;×BÕ…`#1.]^Ñx£Îr2ˆ$ÌÈ”í ó†aáì ´É8Z$SG4r8C†‰uðÅ#oXBâKYø¥,© W‰`nl{™PåKŠ^HMÌ ò ê‚1yMgO< 'ÂÁifì«/(ÄUê©7¼Ÿ•‘,_%-_Up-º%LÑfBdâ1¯b3†}{©ÆÐL·"j¢wÞ»óàw~xö#’QÑg8¶Ã˜‚SŒ8<'#¶æP–f.pÎk„K L3˜bšÄ òÇÝÏ—îõ÷.¶9ÁÅM˜c S§}å€p‚ÁœÁHÎ¥V1B²8€ÂÀŒišÜhèšuqhÝè:£ÞÁ~A¨Ûœ#"Xjý‚š]P“gÔ`CžÉ yÈ\4ôÍ(Ή™‚˜LÉ2ªiÒZšN@O Á¤'}Ôb!ï÷ÜßóÿfÀÙ¶]ëUºÓºaÓº_üŠPß³®6¶¨NƒéÜ›ÍÉd.j[ֽɫSõ뺶c}ŒbÞ£DAÉ›ÂÆõàYªïW/ƒÉ{˜¶ZúÛmýÖ~ÆMs¿HìýíÿV›ÿ¦ÕßýÅ»«å‹í‹õ¿Ýþ_óxŽ×ú]ò{—|<5hàsø\œË€sø\>>Þ¨ÌGE&óA©G  ¨ä䤮svç;=*בu2Ùrd¶ºªl3[WÓLc­³‘4 àX>(2¶ +è3vÇFá#UÎØ‘ÌMډȄj¡*X%dx¯ôGUA«ª›SY£¥‰iÁÛ0÷ÊX…çðð^¨FªÌÌ#{3é„jbž…Q¶;²iäÛI]ñX²Êå[Á×ÊÝÕ·%o¬3Þª€ç¹!ÊTáŽk­h)Â4 )sã,§JŽ”Õq°»È‹ú1³ºØ“•¥bŽT K€*±+¬Ì <ÙÖ“/á+ˤӛѣ{HáQsy7=ÄyuAiU†1v9_==¢;†Ú–w'uV8V.[3Ò (tWåͬ©Æ !ØÒ`¶ee0[-!¤ÄsŒu–[ÊKUõÑ2P—"!ÅòzÜÜ€%“ægô°ò™#ÿÑ=Œº’0äâ!ækñ.ÅŒfÞ¯³ï„ +H¸ê¨®õ<ïsúåO× ~†¯Ë˯Dídªø°K¯µû–v¸P—MÕ{Z³i$yÞÏ6yÁR'‰Y^‘>n‚E#î?HÏWrþð1a¥ç㪇¬ôû +¢1½y’RNÈçzœÊf@{rtnLuîšhRÏjÁì 2ê×ÃØ'!ìEmãcÝ/Óæ›I=3áÈ‹è—‰žÃT£w¦H騂¦é¥‰s!¶žsáÿ6O¼H-“Þ«“~!jg`ø«ù½~BFË•Úd€\û0͈šá,–ZLÍ&x¡Œ[ð!6fÁ{í示Mm2 CLðâÛV˜x¨‚`ëÝŒ¢“€ +ŽêåçÕÕy¥,#»Ç²ÓM·¦„ ÃDí(²>RXBˆ"LÖ¿9‡°”SØí3@ݺ4}bä‡æ®}ALmïŽÅ­cöOÙl6 ${w$CCMØ€`6Z&AcyëAŶ.¦œC–7ÐÄàšGáÃ:¹\HãÎq*8䬿\œÈæµã‡¼Yã«/óÅl1¥ÈêÇËi_J܉2ã­òÛÑêÁ&‚¬é«;ÂRWXp†µÅh‰KÌÔv¿ÍƒÃj²±ó­mßÇâ‚=X]oI<Α³eß´¨ªå÷¾ùðœ‡aŒk(cѧü|À/û+9¦±G;èsgLËD@z²!{ ²#{@ò8À’«NöU]¸?d‹O¯¶³ýrþ·Qà& z +l£Áà‡숭»bU=LÈF—lÜ?Á^Y³ít¸‰¢mÆ„mP¢ð§¼íÙ©-Ö÷`nP£¨d-šä!Y§IƒÐY&ð÷&]¦”ÙF›D¢A M•1&qƒNSZMèUÔˆv“xÇ­„¼qE‹è 6 á©è$+¢ªåHW ›jP$JôÞGYoGqK¢œkY¡23@‘W+Ð*P&×u‰WfYª¨ßÿåûÈÊ¿^_/¯Vçƒß9i AdnI„üµ“œÿ.Zâ‹Ìê('Üø𛿚‚@ÿ˜ÛªïóÄÚoÞÏyï} ¤¢¨pbÒÅfñ±UüÎIf9õ³<š!0ñŽôHª‡…§sqç=Ê*àXqKð,Z¥€˜‰™6V±jm%AKüöÂ(¹×¢•Ô@åh%n4üäAõ¢Šä×ò|ìIˆ5q'ë¤È[¾eÖ¡pý§ÁÇdH[C +™qg@—ž[’“# u6!÷‡‹Ý0G‡cs%csýñJŠÄÇRôMõiE1=Êãçú“¥h<šfž†dßv×pχO"‰ðè'Gó=}Ép˜'’ã}ñÄérS ÊPâ'۽Δw±¹©ïOgòç2Õ‰Å]“p“­ËÑK¤óˆ°Ëczh?Ô† +ø!ŽOjCµã‡è!Ǽšy[N÷i Æ›ÆËŠûó“¨!-1­ZCTÅø'q6áÒ‚O§IÊRÉĸ7oÑ84+œU[–G²²º@ÃQ–U §âPaÑ‹„F-´Å2 æHY ãªÔGgä\b@ôYNïŠ?XX œ{˽CÎ g5¬0WsA1A¦vãŽòs¦Pc‰M£5‘”•æfE£*)¿í²Çãszœ Ò.‰€(’yQ™[«yɘjàßš¡I†ƒãyªla‰‰)=CuÒ''¨¦V¥ +ö §ã¡=À&×ã›T Ô×!¥PÄr1M”;¶=€{ùØ“Øëa½Ô;‡*©púÉØmÊÿaÊ@}lËFØ ŸŠD H7Ãnn‡­oˆÝØë©Er[0Dg1…"ŒªY;ý§ qXüÏ8¹&É5K®4I&’sUÒ½å:¹L"áÀÏþ*Ãå$?úáÒIbÀç†ÓHÃñ­ñü¬»É%ÂY¥u“¯©™Ãù¥nyŽKrÙsœDõÜ495}3M8Ü íÿ+i`]„AªAšÉé„IÔ2åm:H'q“΄Á.¦‡$ºp»sJÏéB‚) ¸ {'´ƒ§KÚG9©íœB¯Xô +‘w *Új3¥ rÞ ‰áó0@ž“’‡8út×}rèN-„MY,¥­©HŒÒ)¦„Y%WúI:±+ŠšéÑ$Wj¯Là ¤Q’Ä|œŒþš%×4¹&R÷ïâá!ÈÛ÷¡‰‡‡ o߇&‚¼}¸_ò†e% ™ògÚ­ΔठøPBûåvCÄýßfûG‘ëL:I«*ù=ã7yÃk…áÜK ~Èë\2L¸ÊßD;ôëÒ˹«*6?µÉ‰y÷q⎮ZåHN½–î’tmµZ!ô ÄA]ŒH&Ûb°j<åz¬þÄȪ6RØñÐãúÀèÖ>€äØì5“ì/+8j\¯\H¢ú–Õ&Ÿ¨q Âù8rA4¶©îâ ž3¸ ªÌöoNõa“'$ñjÅÆ)ä‘9xöào<î7CÕâÔŠ`ü1ÉN‘v?í,Ù5’xjƒøL´Ú²á¡õÂó®=tÑùê®t4,o…lìƒä]Ñ*L£Uy‚˜Õö2×w3§û™ÃB"ØNtŸµdç®fA35³ÃV“Öõ¤æúþ°ÊÖCíãÞ÷¶èÇ­‡Ú×·Õm¢êÚÇèÇ $@Ü )êfÅZä*Ð+fùÖǾM7bV¼o&Â.ƒ’vLh—AF‘FèÌÅ}¤P'†tk{}s{º½=;‹Yظïwì{’¨ 5¢[öºÏ›[ê„Q Óð"ìݵµÓ +š†eñÆåÈnBÇtDkœì6ÀÈ&±´’‹`z‰|h“^šÄãeO„Q%3w +Òˆ¥”SÚàåŽÃuÄQÝo;Î?O’aË™«[[‹V +÷¦ñÆÎbÃ$=®™’£VEØMdØäàBò¹óœkç¬&ǬÎÃA«n[ÑœwS•¸tjçáœUŒ?º Tþ”ÕíFäP£tÄ*Žè˜WõSÝm)šã®7´öt6Û”e“£mŽqõb±Û³¼Í¯¼'Ÿ¸ÿæÞÝ&÷>|r[ ¾ûík|¤gb§àHóq¨'…žzRèIaƒv?H¥¡Çcä#>DÞ[d™ó‡ v¶"üF•;ðÛŸRü:b£»åþ¯>NÙÎÛ•mHŽ–^Ùî•í^Ùî•í^Ùî•í^Ùî•í^ÙîÅê^ÃêI¡'…žªlÿ]ÐO}ý VãÛCiMP[ZÃñ¡Ì:eÍÇÃic8¾: vRÛr†Z¯ŽÏ0E4ŽRó›Ê6ö”9¡<"ÙÈ“’ŠI{jIOPK)&Æ +fŠ[IÆ¥cÄ`›Ä n£¦Á„ÉÄÅr²IMê¨ÓFŽG{4#ŸGŠ @ç.6cE!é0]F!Þ=ÚˇxŸñ¬»¯â9x*|ñ<‡·‚—†QŒcçwaµìÃ<Í·mÄÚE“î¾jž„WŽEƒ„!e6ЈXÜ +‚¯q±•à0ïg±¦Ä†²„”)ÔÙBsª…1$¬IY7ÎyECïbMWá?§áÎÂ@OYaÙ¶ÕN¡jÜ6Ìq’Ö·ÛÅQÞºáN„¡öƒÝ˜´¹ßô“ +ßTü&ø£ÿ{ÿ‡®muá}$€ÌÕ"~&YÎÖ|ⵋP2øXOfÌñ¬g|üuÆ!Ý î@áÔ.l©©Qt´¯1˜E¶ÆÔ¸ º°5ÞÇ´À†·]p‚NM’=éqzèÁ»þkûþ;ÿgxÂ4lý¯oþßÜþ_;ã±±ÿ?D-!6ƒÔ¬–u»e#ÀXl$²ã(‘Æa"‰õ’#q‰Ä~Y?P¤f s:·ÛÐPV“•ïÄdu‰ÚÛˆ"±±|I¿Á5O³)HƒMsµ8R6kM‰¦)ÓԤф‹$}Ô îyÊH$0£úÑjc¼ÁLgä‰(«x¤gk5 X«mh+·ŸÄ;‘Àhš@švÄU]ÒÛèQÃò• ˆÆkO >S¬à&#¸Æ%ȉ‹©âÇz,äŒǺ ±ÅzXpÐË‚"\ú³\LQ +óàOnóA&|\›IŽt‘͵Â#] !x¤KIGº Ôq>|ž‹ ôç2áÃ\ò‹r‡¹äÀO+ êha°tíâñgdÔe ±S¸8à„Œ¦d!9!cÓYᎳë´iVÜÞ´©7OvH³ynä:8ß$m èâ|“´yâÐóMêÍkX°D\›@A© +ŠòmÊJÑ y®4í1ç%4s¾ñC}‡ym ì,GZ–óJKÊÔ.à¸Í=—YîBðd.B=@Rh~«úWêö`G]eø¨åºuµ®/Ö¬¬ö ódΤЃÌ{ùRèAæ=Èü1?=ȼ™÷pÒONÚ“BO +=)ô¤°mG÷=<äuþ^¯ml˜Ö‘ZÝ®W×C¥Ø&¸öAhíƒ@¿[Œh-0ÏC€£ÈmÙ‘‡öt aKBrvill”û ù^rMç„‘ªp>!ç}ÙüP;ÙO׫ò$JvgY¶…ÜS°#O‘i›"f»é)ZfÁôä¢5G•rNb×›†'µAòÞ…Û‚k3&ˆ%…R.v bêGÓ£ ŠCÏ”(2™è©É€Õ?±á3j7lCÂl¸ÓØôÔ®ùÉä·-U2Z%€ê|á ŽU0'¤GBl?ƒþ­a¤ÇaLˆ{MáûÂÈr ­rµ£0d8Ã1†£0øÿ2AÅTtbaŠŠÙExPŒãü#1 Ø^YÒZ1æ3à<2fJ®p:ü ¸’ €1½ðu²Â—Ž­˜Ñ(MÐ#‚;<œÃ8"jƒq 2c&Àœˆ¹hƒå¨–³qá#Dëy›'rÈrL"G4NäØ<“ÃCq"§y$G ‰#¶q g¾ÃñûÐÒ]„ŒÁ‚Çg0\B£5 cÖ„èlè47jÅçlç´ž$"vbs¦-Àœ=爈CÙ ÈI 9bûA"[á8ãp…hø1fºpÈ°º¤’réÄ¢ªä3CþÅŠEí=h¶áA«ãf‘É“iy›$•×$©þŒ¬þŒ¬þŒ¬þŒ¬þŒ¬':#ë´N~zô©V)Îõ±9=jí+ÚÖ¾¢fgë×¾~íë×¾~íë×¾'ZûNk­9µµøák_Ù¶ö•=x³oöàͼك7{ðfÞìÁ›=xóÓ÷öˆ½žzRèI¡o~wjkD%Û0­®T³²$KÛÆŠ ¬&ËC°"֊Š˱j¿¡y+@, oäjäÍž2 “éÓ"ŒŠ‰MU³þí¬¦fSM-®œÆ6ÕÎXš ”]ŠÇ1´ý0 Û¥ j‚€ÞN(ZA@Ñú×5,®úrð¥Îƒ´´9þF™)ÙA^fÊÙÞJèÄ–YnÉhò¬²[Sy=·j=™¼ÚÏ­¦ nU7z+OT~%6¬;›üjkðÅšY‡õwA:Òt{øÅí n;‹“ÙÔÜdpžª$%ev1ÒZž0º:Ë+œ)u¬ÙÖj”ùÈ@hbŸHµiíc[Œ+âEâÛØ_Ü`^»ÃŠUm>£”ÏÕy]×Ûä~m|pÒ®k“5n²Èö@^Ì8‹–+°Ï:k4H¸ä1 +$M±>Ä…õ ¶ª@\Ûžø˜L>3üÏåíêøŸû /çžå…¸LÎnÈ&’3rµ$ëˆ%ëxEò1Q y‰"‚õÆÅôqÜɼ£ÂÙ§dEô6D]ºX;Î9\&~ˆÑ»F'z®È–M¼bÝÔžÕ´h•Ì\¢¹–ÍY,à4<¸»™†*CåïQ¢v¨PéA"!¾Vðe4¼ªáÍ(B¨­fkLÞZúäá˜wXp8*„æ +ßÉÛO0cY[Ñêåâ9yã"Q;§E Õ©)y®Üå‚ xØÉm„Òœ»G.T)~?D²T!†¥/oZs†HŽ$•‹`üÆ5sò1¬°LõÓ8Út:Öq´S¥9su4gÒÝ>*{?ýþžÚ}J`[¬MÒpb5MŠ­©Ž…š‰†ç¯\-ºÿêÛfÆlyÀ¹ãõ¢á¬{§TÖ‡•õNÁèä”ÞGxP¬Ù.Hç¸zÍŸ‘µ5w•|U,OÌvPãž¹I*Ý™ •V†9’·=ÆKóVHÍ(%‡Pr—&?dz5tÔƒ›÷Îýå,xäæ÷wÅÞ×óàgk©OøîÿjÁ ãžâ]˜EK•¸·©jO1ñ8CUK±›e€ýxèO ë @qWŠ‡90ň± É^ìUýૈJCÉú,1¤¬Mã¡X“0»«dcK< ˇš-·ðÜC'»]”` ƒ¢jùÓÄÿ4Q@M,Pm£‡hAmîúhc­¡„X!±±¤¹d3Hk}oHc‡ˆ¨oI f7-:pÍX’ ‘:·£ ð[IÓ‚ƒìÑ 3ÒS-¸$ßõ¸Ó¾™tRNE‰“ Ì$öëUf¬o~;¦JtàhJó€NÉðI ¥N<µÌ¹-ón§ ûËŸ˜£;=™ØºH‘OÙ®:c)×&Ÿ:Í‘a©~«æœ扠TúÖòù"NUvm ü”Ýue~žè¸u…¾ª©§Q5-Û¥¨ëö¾XWïÇ5œbÝ>Ùˆ.§‰\e^ƒ‡Nk "r‚²eÛ" ØÜ»Øn÷l·|Ötþ-*>õ—¸_pî­VЄçnG‹n‰Ï-Ä(EÓãc4…0(  …TƒleÈ>z—‹=¢U6‚JWvdˤŽ rs§sßÎ0'Ù’B{‚–•A1A1”Un¤,1­ À×1¯²å0’šu“ò.Œ¡7Ó[ +7ZjXh¼)¥Âè£ä +³¼Š™äj¤L©Ò`ÞËÈÅ/!ÊÒ+Ðǹ*­ëäÊfšì92/°ãGÀ”m–Øsr9n‘ Þc3:–q^ý°¾þéæâúöâú÷á0±¥7ÄïðŽvw~ZÞÞ®n®¿|9»X^­¯Ïӻ׫÷_‰Æ÷A1ÊaÉH9ÒÐêÍD¤”Õ(}*}G÷®Ìß>Ð×ÿÿÿ˜Á÷ƒÿúïlpNé¿ý Y^Å$Îuð’%ÕÒü«/6säë–ׯýÀÊ\S‹~ä ÷’(dwaçGÊZͳÆú ó„—âÜ‚ƒàíß–ð®ÉGw#\–¨žº‚ÊTr÷L‘UTš*¨ëiZ,NRÿî‹–ü0íM’®Í(« i9JÁ\ƒ§å¤i¾ÿî‹–ü|9E>Bù-¼åäLa]Ö:Ù¿Ÿ¦ÁÄ…å[ÕÊnæ×,Ç÷GZÕ©l©'§ùrÒ¾læçËiö–#+˜Ò¦ØGGR¤Ò{{÷MË覥¤5çRÒ$.e­¤4@Tl‹ ˆW™Úûiš§ÿî‹–üšcCïkS›}´êÇ&-»™Ÿ/ÇÏÊtî”vTšlÿØ–j$Aq¨•Ý̯YN:w|9ûhÕ—“Γf~ÍrÒññålíNóå¤cÑ̯Imþý”ÚÒ¶3µ¥ILmû¨å_2•Dg‰¶­Ô +Å’)2­£ŒÝ™ °¨¯$Îxh-åŒÛê¹wîñʷ;C9‰.«•ÐöD“‹Êãå½Ûxü¡kÖ¡¼wÛš•r;nNVŸp1ÝF6ÜÓFdu¶q³m™$éhWxò¶µÑNç㡼¶™ß}yú¡¼ö ž®¶óôCym;h]ç<”×n[וSüsY­„¶'š³ñÐU£M*­$)‹­Ïm[5ö­‚µ÷™ž}9mÏmÌFngJѾÇRj9tujæwßU°­ž¾=mÏmPt"æ—ÏÿÚ2{Ðò×ÈÆçþ«˜;u ô3V¶¤¯Ywgrs÷þ­Ï'Ÿ(uÉ_n9†ßßþw¢¦µëb¤‰ ˘Di+¤™aYÐC.åE=%ÏQqÉî­Ízë*€UøQzŒÖOMZ1(ÅXV•~‡(hÎ +WéTfXõ³ÁÏdAÈ$¡-J4_’ÁAVç´ÙUe¤LI Ù`J8ÜKR¶¿Qéü…ÕWŽ\•-FYi];K F¨yšü¢‘lG Ÿå®’L¶$‡L^׳±Ú¯*×¹ñyŸÜÈI\fU³.[’c&¯fèÅÖÆ\mÏwK-¶4½µ£^‹_E5øò«Áoÿù ‡Òr‰Ñ§ˆüà¨Rà5“$;Ò4#£*…]aGº²Æ%ãòU¹J“7óv£•ä^ÀDF;Mc´|r£C€eU†ºh…\°‘¼‘÷–ÑjÉ Y‹4ß-¤´¥é[:J™zXpÈ+˜:eµ½)¯8¢e…p*Y5F´„Á0†µ>¢%Ì£"·e£¢ðm¤”͛ɛyïœ +µ^¼â|5Ú^ë é£LJÕè—mµØRçXd:B-5yDç&™%”›ôKJ¹[[ÛR£Ö¼™¹mÝÕ¶ö¾ôËÀãØyƒ5Ôxj’ ²Õ…£arUTÍù±™ÉÃ{¿¥èFjÌjËŒÝ_ÑЬ×íݼs>…ä´wÊ¢„®­ÌvÚ¬õÎ㯥À«ÕK’ÓêµÕ:]sÒO$5˜U“™¥ÆÔ¤)9¿;D¤’,RY` 1V?;¢pä¿Ø™…g-á…-ÉA®Ê\U¸œ +h4SnԵι[!¢*t’ü¢ž ½Š—ò˜É–ä˜Éµï‰¦tè«X+`¶U¥šm°•2™gy‘ÔÉ%Zøœ$žqý ,egc[“\ÓDªÁÙF¿ä%hµ\}gÕjàÏD­¶é³é „\7úàL¼é”žË†vpOzA!+Ì=è9¼°%9¡g.ÂŽ*ô16I9΀)ÇùR£ÙÉ–ä#“r¬U”Óä@tÀÌÊ\7ȳÙL« R¶#£¥Ú {ßÖÚ‰‰ )§ýˆ.äZ'O®A”CmÓgÓA¹nôAפlDÊmÚniA•7‘¿ÖR¬åÎÄ(|#%¡âÈHl¡a¿gNæV%Å^1S*¬ôÉÖäÌ””5œXN§ $LÓ0Îe˜šÊ+í’+i<9„$XýeF‰X©-'¢>pÆõÊQPrÉL‹h¾±NZ\ ŸTU¾|<´Á½.A´VÊ%gH•îY_¾BáóltÒ¯¾ßÜÎ.În/Ö×Ë›ƒo éË¡úÃM_ ¾~y{sqýûàËÉd|vvwõóúv‰Ï~5ø<ù-üúÞå¡v(¸-:É:Òù]ÄœûÐJkã –®iœÙ" ¢¤ŽÍA2!±pYŽˆ ™Œ¢[/ +hdåGQsb®ó"Œ¢›ùh amé“ ™‡Q4çÊ5 q,¥«tDƬâÊ*Qù¶j3hm×c¨¹dS?æ(*í³ÌU2Š¹OÖF…ig9ÑÈ,$/’ð[&£¨+V mÃ(zVößYéKc’Q4Ì€GË0Š^Bñ5 Q$•jPiU$ÃXX®mH”•ŠÛ•ÛÀ ê}ÐñH†+¬òGÒ¸‚˜=Æ‘T¼j*ÜèêG2çDbO~$UéVb`:I—˜ÛÊøqT%Ë0ö0Ž†×›8„Ò¥ g,ýh•Ö+s\4 ¡ˆ3Æ!TÜ$Xâ–¾AV"ª7¾ë!ôÍ%Öz¤!DE1×¼Ô€¤µ…²àe­ÈµfYF•/UÐG!_£Ä‰ß 8~..åÅ1˜‹•ã0®@f 'V& +ûd$¡d“¹ñF¹Ë*N 5€ÄÊøä*r?¡¶e®øYÏ 4¶Ð nõ.èp1o.*‡5>â825æ# ™ ¤òÉÐ)a ^­HZòé$Õ$//`Ð@JÖ¤•µýl(ƒxAØósd0‰Ã¨|²’rUV>O_>£,¹ü²ÔÉ0j^Du–ù | òQ•)Oèx•_àK¬ò1DZô&äTè½¢âµxžGʼnÆf!±ÈØ|Z•Re5Âh2÷Š”Ê7¬>ј2$‹íœ—& ¤›ü+®’~’Z뉗Ɣ^»Q… éW\² ·vA×éK¬,y©3èÂRÌ-AñRNŽÂ7˪0¢n µr&ïÜ9¾8Ñ:Õ Þɵ×=!¹tÜ +JЙægó<ãD£lɪc¦J`‘~Fƒ„šåLÊ&gR(F•3qS½sŸ©4®7òT@w,YóäCi¸bn[ªÂgÚè‚.2Ï3Wsçˆ<Ú@÷-ÒKRùdXìÂ@z´×h5‹«HÉ@zÉTåeHã%Ó"7: ¤áy^6ORùgËÊ™­*N 5À” Ì*WÉ@j_[ÃzŽdÁ”PåN`Þ샎GÒøõÄb•5’ hÍ„ +£ +V ®ÈÉEåØ ¡ âåØÑ°fÍ(ë<óFíûÔý‚ŸÍeæ5—Êr°FNË¥ô¼Õ€Îì©&W,,†‡È>—©¯$–ÆW R$ÛÂW¶Ê|[Æ5«2>±Ñ]$dÎM.¼ƒ¼ëÜnïº7 DfîÖËÿønqq Ùˆ¯ÃG¨ä׿}ÿâ‡õù +?Žon–¶¤};øòŸW—×:<{{qy~³¢š]kñƒ_L‚¦Þ\¼¾»Å-_Þ~x·‚Îûõúâ îú>ôãhêsÞݼ¾»\]ŸíyáÏå彡_ÿãú¶~Ó•÷7¬‘ÿx„V½¿½¸={ûËÅ%~?¨q×ë—ôN7M«•”^ß]ýxv»üóàªnZ––{”†½^¾_-nVÿïíÃmÃHÝ4¯QúQZx³zwy{I×MÓ|±ÛQµ7«_ÒI¾«fíwCeäÎÊ<¢_0 ×ÆËõÝÍÙ껛廷gÝŒÊÅõ‘¨ìâzÏŒ?‰Q™GiÍúÝêfy»¾9°IûFôÐÅbwÏšéúêÝúýÅí‘'ÍSMʇ¿è¦Ûÿy$*:x=é¨ÇZAþº8¿Ý#©„¶È¬«Öp©GiÑÛÕÅïo]»k’/ö8ø|7ørüWãËwo—¯dGü÷üHMyCê ÔðöPqsýúVg·“õÝõ9<4Yïa!‡¶°V‘<™<&;þz¶z3øöÙj{on– ç_þ°¾xßë{Ÿ ¾gžµ¾×ÃìÕ½^ÝëÕ½^ÝëÕ½^ÝëÕ½u¯î}u¯#Ù¬W÷zuoZt>[ýyÁ~Щ6ÔK>’Äs/1ŽfÞ‰ q÷R^_Þ푺U¾[Þ½±¼ž¸r?eáüPa¨£‰s~,aèüPi¨«†K:xÞw7ANc¯߼y¿º|äiÿ#•úñ'ü)1CyÀ0ϲìyèDC +Ã}ÚzÑ¿m‹ê®-ÿÚ7_~Z_\ß¾`õæÞß~¸<Ô‡p‰Ý€º³õåú替Þ:“I'ò%Õâ8΄»›7˳Õ˳åÁ í}T/ù8{·:»»\ÞÌÿùn}½º>\洞ŵ•ÓõõûÛåá­ì¶‘±ô^êRÂþýñnÏÓÝJA/yH_0Gû| ƒ©¬ÓQ9?ÉÌÏØ]òò„ä:%fðÇž2ºTº,ï(´õÇ¡\ #‘àcMý?ôGnˆ>VCöØ:'-óÔbÙó„t,œÈ’¹¼¹¸}{µºíj Nié¼¼¸ýiy±OIz6kç)­§óŠ®m¿ŽQì¡ïW7¿¯°¹Ÿtsðht;cNf,‹põ<:>¥ @=TTw-9 \”y~¸¨Îšôô¸¨ÉêÏÕåË·Ëóõ_Ýn†é!C÷”—çw‡¢¾ä¨£]å¾ÔãàABþ‰Ãòž!âéžjØùÅå²+â)©` Óaº×÷ë›wo×—ëß?|>¢ýçÌÖºÚíñäl­gfŸ3û¨Ø>Gfv0”sxòX΃yØ©ï?ŒqâLì~S½£a9m(êSÍóçº[ÿðYß‘v³¾+þu¬ißGPØh`G Î ÐÑÔ:¹ +]ñŒ>~ÂVVq`ôtÊÁÜለèÓ·ËëëÕåËÕåêìpímÜ‘od£ô£4òŸkäϹ²>N#—+:"Ë^®è8Ô™°w4ÌÐýÖ¡Žhì°uhvñþÝåòluµº¾ý~ùîóYŒî¡#]-ánG Ž¨Q•Qý±ÊÙ`°ñQÖ>vÓn_¹'æߧ@ãpþÝÕJtæ ŽÆåP áåúæ{?©?cᛋË˃íD«Õ¿:²¹bBuonÖW×îJJÛΖ—g߯ÏmÙåÅõjÙˆ?½KPZ^_\-Ÿk¨ÊD8ëj“ÿGˆpv°>Ô8}¨+Íî4ô¡ŽÆ¥ÐÖÆ>0ÌY†9ÅÙÞÕ°ô`˜VaøsÃœ=0Lgü«Ã<´…÷ÃtìDÑ0ÏöüÈ®¸F‡ÙÊ,î‡éHíá0=¦KÉâÙÀaN^²8Ó™¸wp˜®h¬‡Ãt¥%}pù9ÀaΞ ¦³•è4 BŸ¦÷ÿ<)x6þŸÎXÙi0€ÏÈÿsJ\áprëjâ\ïœ>œÞGp_÷£ðˆQè4ºÆ Â#û­fˆ>óü‹ŽL^GZŽ„ñ¬‚Ê>˜áÖ&=}0Ãéz}9éhߟóÚmÜ­”Ü'ºYW†Ø£Æ6;Thù”bèŸHx°"ÏGŠ¦õdÂð!ì{FÿªS§XÏÑŽÈÑŠž£õ­çh{9ZGó¤çh½ŒÖs4z|u³Þ·ó«ghG`hsì÷^BûdøY/¡õü¬çgûøY/Ÿ=!?{’¤#¬BIr>þ“ž/i7¼êýÖO›£O›²Ÿ6§0m:†~Ú9d×Íêj½/xÔ „ìºN[ä·*ÈþÏðû-|†¿ßÂÁ'ÍîCzÕÚçæøÏû†¿çu +ñ¼dWÍézõq°ëý;Œ„ÕMÛÒ8XG¡Æw«åíìà vq}¾zsq}Ñ•«+)ÿÉã|’ u:ªÇ“ÆþêîLø'ßýñéœ[z¿0` ѧ°äÉ4àƒ·t7cž~›øQœÇÚ1~Ooľ}ˆ+â©yÁÙúêÝú=È?Þíy¥ëÝ¡\îçÃþسÓ3êwÝ –wûãPfÐÑÖÖ?Ž5ÿÿØã±ï¼!úX Ùãs蜴ÌS‹fÝó­“Y<;•7Odé\Þ\ܾ½ZÝv%œêúQCn>ázJëêƒxF§™vâIúÝ¥÷ªãѶ•íuÄã ²AÞÑB™ýtûÿ~ºøçêò§Ëå‡W§¨¹ß¸Y—Þüɹ“‰ CYeßvÈLzrïBî]ÈmêyïBî]ÈOîB>ÖQJ½ ù³1÷.äAïBî]ȧæB>%ñ™«VV——뿾ýýfµºþ¨põ-¬M¿¯¿ýób}¹ºýöfuþíúfyý{Gíîu®§s]b ,¸=<ÃÐÁ½âõ (^ýa¼½âÕ+^½âõ©+^«K¨÷=´®¢#“nRîq¸Ä¿.®îãi;jV(v·T?»y}û‚ãr>C×ãû»›7 ²½¼Ç™\Ÿ®—|9áâÍ›»÷«éúš†ñãb©6 +?¢R|ŸáërÌÑ»´ÝP¿ºib³Oktbzz.v§OT~/ƒS§Ãsè¡]Tä &ÓÞìô›ØÈäÌNlƒ"ëSovêÍNmÍìÍN½Ù©7;õf§ÞìÔ›z³ÓÇ7;=¥*y¹ÿœ™Î¢Yõ6´vá“1¢½·:ƒEífþÏw°RnE명ŵ•÷µvÄ6‹?“¨ŽŸ’=ís5@yúÈûä_r±Og…z*¶0¥u>2ýNàû4ª¢ñT¼¡¡qt7ÜÓÇÐè*bÓÇÐèª!} ÏñàˆÃ—În¹§²l>ç—·?-/ö)…ýÚù±ÖÎ>þÔ©­}ü©S[;»åY'°lA‹î—ζtöq§>þzzo^ÑÇœj«ç Ô±9u/º¿_Ì©= ГCjû˜S›uùcN= vBG¤ù1b'ôñ>£xO5…Î÷p²0qˆåJúá#7äÃSÏûçæn_¿yó~u‹ÓïfuÞ!;;lúÿH¥÷êÍ“ÕÉè9Ÿä¨͹sÒ+žÔÎ^¾]ž¯ÿêÃ÷ªÙ©ªf=ß«f½jö,ÖýƒU3û\T³®Ò«f½jÖ«f½jv:£Ò«fŸ§jvè>”ùÝűñC×ðîZr¬Uü¯‹óÃ÷©š¬£Öp©GiÑÛÕþí§±Iº«&ùbŸÎåÌFÞßüy5NIx~Q’Þܬ¯ÅvŽ:Ú“ìÊæQóèÓëtb=•<äêpP÷¿¹YžÝ./X_tµwÏ|ÊP@g§®~xr§èõ£8/nÏÞþrqy0æúzý’ÞéÊÕ˜””^ß]ýsäσØUøœ´à£´ìrh÷êF£ð§w°tÅ4s¨ürwóúîÚÞ›êÈ¿Ÿ~ƒ_Ræ>ûv͘´ÿíÉ&ÇAÆÖÛeg*{Së'bjýÔˆÛt5;m%¢X7ØæçDåÕì¹ +¬8éz‘õDDÖî£Z{¡õSZÅÖtwxjdMWí8 \Möüp55ééq5qµ}µ'^U¯ðõ +_ï7êU¾û¨|íÀ?Q•¯£Öõ_¯ñõ_¯ñõ_¯ñõ_¯ñ}<¯#“u¯ñõßÍèÞ!":’­?FˆˆCá‚nrÀà§tºDðâä´Ÿ>áCr´€‡r±µÑð,øX¾ã9„ïx:¹æÃÁ§Ö¾¹\¯ÏÝéß¼¾\žýñíÀ%­ß-Ï.n?|Ó™=‘kõÄ{#ö’úä\â~¸íîtØdZ u|>sé`ÊzO‘¦Ÿ}Dï°1Ooä=^\¢glë}jöö´‚Cè uÄêÚrŸ8šmKÊ= +%.ÿuquw¸ýXwd— Å>­(DG·wºUt×Tš]¼¿]^ß¾`ëö3ô ½¿»y³<[½<[,|wDPõ’cPpœN××4Œ‡N™Ž¬ ͸.Ýgø:=혣GSê7<@¢ ­ûëmga šå?-ãëö°Þ'—ÒŸ›­¨Óá9LΛ¹"_0™öÒ^/í=Ki¯özaïÆñ±¼ó¾[_¯—ö:b›Åµ•O#Ón–ÞK~½¨tOQ©óó³—^r±O'/=™7àPJ;ÂÉæG›<=Jú9ZΟˆ7<¡Éü©˜Â{D‚®E,ï(ôõÇ¡œ #AïcMÿ?öìí¼!úX Ùƒ½è¼!æ©E´O ÁyøÒÙ­ÉñT–ÍåÍÅíÛ«Ug1¹Niù¼¼¸ýiy±O+ì×εvvÅàž|íìJxòµ³«†ôkgWkg·<ë–Í#hÑýÒÙ/Ï×w×ÒxŠBΓ2ð‹GvßG9Ÿñ”èå¹F"z†§–÷Á•6ø¬€x¾ñté8ˆuc©ö~µ„»‹8"c§*Ì_mŸBJ7ö5{Úõ¬ë¹uèƒï È÷ûP]+z—ë›ïý´øL8ÆóTòü¤Â{M£§ÚÜÖ‡øØ9,ÃgãcØ‘Èz¼ ‡r€cÙ«žšü؇Ç8Es\ÇÎ 8TŽEh'ãWyŽH>ômàýò‘ã†p„Ú²«#AOIÔîžäNc¡MÛõQ<}Zaû”¦Ø=¬_·Ë×]­½G4~Q-ÿã>05èÈD^+zOئ»ë³Ÿ?FÞSÙ—£r ž„ξëéìs¢3ùDìlr¨…^==‚„öÛ›ÕÍââæ#û®Ünã_n–×ïß7Xúiñ°{iÝŽÍ ˜DŽ²á¤·†•A¸1{ÑcLïÅ.º©O ÓøÔs…úb|yù1gÉGÀj>Ußì:”Ïåü§îZr'@åÏï¨Îšôô'@ýçz}þûͲ+¡¥?þ©Qãc2e>þé‹ñ?döj~}ŽÂ¤S^ý°¾þ ò§h@C—ÓÐF.7é_µøHÙÈ£¬•2Ýh/öÁ¿ýŠ£Y:«j”c4öƒU|ÊQQ•ªÄ*V£"¯¤¾62¦‚l@e%0F“ç™MR°9ºÒTOŸ–ò +¦ä æTŒŠLf倊£¾*G:7Àï ²ÀÕd% Þ,´…Ç‘^²úWèò,“1mˆå”£R[Å_ +¾ƒô-)mAï*lo&+¤^ÎGóm,Ç&ÂÕÖ{ÒÉÛ#›[œ†*Ó…ÄöªJVØ…LåÁF—N‘û$•ΫFÒº¶ûöd£ªÊ¥,é­BW”T¨¼*Kʸ„Å+ºÐ:¯¨h%g0Ú…Nj7Ií_׶"¤$íN:^J:ë…HûÑçjš6ÆË.¼`p‘¤Ì,-“PMSB3!­xq *`ФLHd@몊 ÙÈHX·òðÖÊ +úÄ-³š& v©4<€Œô &À°@µñ¥Þ çž1 C"„VéL#eËjT)Cô2Ê,.иœÚá`-M|gš´5UÚVDÖr›Ç”…„å7¦½ möÑ”×f蘚f…¶šf¡Ä9oŠ“™,ÊâbŸY›& (¬ ̹˜tS–9rŸ—$*CùÄèSÎp¸ŒÁ¡ˆO™‘Q¶”IN!%)0¤…z…œ|Ý›í;sÜçWñÅ+Âokrö¯²Áדõúr:€Ô?躺¹ž_£/è»»‹s'Â~ñ +ˆÎÀðh`?À4+ãòÜ×?¯–—nKþE¡Š>ÀœIn§ïñÓ0Ï(ÿ")3yÆUoêëùBL^ ¿Égò¸É—¿^£ +r>Ýïüb}]|…w¨`ªÜ œQŠ{Äÿ?ù]ÀäÏKë†þË°,+9(m Ó?"ž\Ñ´›L ¬ñ5r0T4¾6Òª”Ö¸ÚŒ2+ ³QŽñ60m ´ê …¼ÜÃ’’¾ÑÂÈßé3õ†âÞP/y;AùÞ ™f¼3t㨩0jIyÃôÁ!WoêëùB,\k%©ÈJ‰BÜ',µåô™~ã7.Ò ¸Dø@÷è~€eî“ïù†Ò½ŠLœkò…p-¦"Tç  ²"ùsQøéô +n½#.1ÃÙH¯_ñ§­K&aé‹W\ÇKúèëZâ¥ç¸Ž—áslª¿7ä<ù#>î‡WøÙ³P?|ìÚU‡àËñõúzÚ µ(ÃöàWé-AP( ¬¿W¸êÀÚë¢OB¹QW9.”(`}œHPYíM:‘$Ú¼ª’|ÿr×K§Ÿ…Ûé{ü4 dRÊ A•0¡XIë0ÅiÞ6·Ë¯p¦•(àÂœ­hrë´Ln\Ùð…΄F’½ŠAL-Kša®Ã4.¡¿]…W$ɹ.óöW4 8w&g÷.erp) ãƒôÂÏä¬Æ€jœ¹¹ÀQ‚5ÅÁ+¢SfÐÝÕ€nì’<õb[ï*MÝ[ã’Ü¿J<&SÔ­˜DE +TÚJXM•ënxcóAl\ø¤P!Aq8k5*K6 uÐ[.èvcAOÓ ¹7Të» ^šå:yzæ¡ÅN,¶,-Ð$Š +µby@Zå‘špðõëÛŸWgë›sèè¿#ÚÖMAd:þÇw<2¿¼Yß\ùm‹$3W8_¿^½ÿ£zux‰§c¾Š%»§¾á,™º*ãÝd2>;»»úy}°Â,ƒú +¢îI!SúÈsb‰â‰_2®„òÌ[ñJ0L?¸[×í,/ÿé⟫˟V7oVg·N@ú÷åõùåªÙ¬-£´ØÉ¡Å–È‚y·Fέ=ÙÛ9OVÌüLíœ/Von{³·söçg&q½³·sn‘:ÑFèKü‹fËâ`ýÿdÅÌ*š¹ÒYê2º1ŒwøÍû7‡¾Ãe¡Îkmd ¼±Å1 +cûKø–Ú !¹‡€î•P)ÈPA²±fÛ‹øf“Õ0Uõ€B'÷* )¦z¤àÙÞsG8$p~ffMõyš5¦½r½ÀÙ œ½Àùy œ¶8{s›™“%Ρ9‡,sß([¦Bç°&u,vîè{/øµˆolMØLÞÊG¶vû[¹YÜ¢TƒËšÜ§¬CÌHvŸ´ö™z–}×Ë_½üÕË_Ÿ™ü•w%aúÓy˜óP‡^úêJú"ÂAÇøLä?ÊCéÓ0ƒÙiT©ˆhº!ª(ÝŽmYdUŽ¬°äÁ ÉȦUù'âI>ªœ™FD2Ëk~¡DjÞxÕj˜KFéüÀdÄÑyH±“ËÅ%e³Ró«t=ïèÆ#õ: ÖÌÞØK¡‡K¡··° ŒŽT—Cï+‰"ŒOKŒ„CK,†¹F“û`h wÇŽ¬RÈR}B†ûðý—a¸íßâË>[ü2ô-£ &@6ô rR6ä0àl|â?û{þExÏçHÙ§ØÊ:­P+“Ë",[XJ±e0,°®–#SÈʯyH¨ª¨P=ÖW(SƒIáÛ%†ÕØû2²Så ÀÔ}‹ž< h[æ£ÏŒv.Qup2·ÍQ îd•%4QYªÜ`Î,j…D1;5†¹Se©éŒ¦â¡†N·6$@†0ˆþ[Åwý«»{HYí)VáŸEHp%„¯¡ám¬_B³ø4º©d^—ÃS:¾5"wU±.ÌÖ¥ eÒ¨$ÅW¦ô•-Üç_'-È·±LfáÒ’§(ê1—ƒÿÎýY†îvH«—6¤9=wŠòN†OÆ`”“,k)Iã¤k\h<Oǯ/Ò¯C|ž:+©ì¨645.©‚KÂl’fø”Z.¡G|)¡Ã(ÇøíEòÍ· Ö¾H\›Z‹jOÙÐ/ªÊAX=ϼ3r@S+i2ÚbsQCÇM(Øã7›(nÆ¢Ò8ãÃW’æ¡ŒÍül˦…a„2Lj™xJ™U:Š6t&’,AëŽs'J:ñ§¢6™’iJ-™‡ ¦ƒÈ—LT•óêâç +(3š§2¢%L]™¹W(¬‘¤ú¹)…íF…ÖŒÂDa¯˜ÌõX­û¦žÌ[h<}pdªR…'Ýí‰Àb¯»ÄÐõ%É`:v½£±ÐíE̵J{Y“Õ#$2šôxŽ±°Ò‡«´×é{cj¸ÄÄþìïù·›øïÓ÷l Î]9=*/+ÞÅên¥ZD%]Ð6·wƒ¿Àʯp4 ´Í†Puc]‹&á6 +4[y“ _ wšF&ÿúÏþžÛ¿:¿OqÔsŠÉ)¹…–Ѩ»üwÌÝEû—‡Íü‡±€dáOi‚›W(è>Ú§ÈIyÊpÓ|U ô•s÷üÛþå„&¸tè«`|ŠU¾ƒ\þ;už +=ënú—‡Íü‡±€¤ûXñbéWÉ·fñÛZ‡ì¥ÙÍŠ½‡OotîF÷o4_Û臞Š 9k_’MX’Ùè‡ÁÕru%•çºîà Ui÷%<ö í-ê:Fg‘%©š‹MpP7Dàªl+êQ0O”dÅ9Æö¬ö¼ Ùéܺw‰“”haÕÈm&[µ›—¼VœÜ–è-a´Ý +³*,¨´Á*cŠôŒI¦e ¨0šF ªiÓÑÊŠŠÌ¢ôX]ØwoVºÈÑ°GOW:Ïñ)P©T’Mx¬ù-OíÞÂûí<Ø"Ž(ïH•V—H¿²Ê‹Øþ‘؆–×¼PÚí†ر±![” Ù¿¬eÍŽ?¼ÀÒí J>¸[ÁøuXhÂ1G©ŽìQrD’¥4Þ¥¡ãIøÌ—A|$¥Î'8{†Ûþ]ò™ølK„¾•»[èAöÁmd“Ò¬•œ£ó¾%ØÊú+çFQÀË¢=*Ëó8Š¡‚" òV+#Hlͬ£Yç T­îPÑÒ¥î{[—PŠÉ¾•û–=yHÙ?Yµ›¤JU°–X[ä,—Jg|•Ac¸`4G‘ +ÍQÉH;s}æ‘Ö<Ò†VŸ@ö÷ü‹»Gšt¬<¯<¹Ö²¦ù7J﶑«÷§¦¨Ð0 +'_ðê¶UYT·]YÈÍ`(_Ÿ’±UŒ¾àÝ,w5¡—É&æÛ—'Ó†ÊHžjæf¿QxZµ´ÓZ“4C…Þi¾0ÑEãÄͦõsz.}‘~Ý«ì³LÆÇ¥LÓê„T2D +L›9nZ¯c½ŠÍ5[I4V®™ö¢­ÿ¶&6åb^>Ë»66´’ò¶Û’©“?¼ÀŽ>ÓîÖÉø’Œr+ݹôÿán¥'_žË?×7xnX}aþ7^™;=¾h¦ÀÓ†:›Ó˜%ö"&¡ýJÐ…;Ø¡BCg„ %xT‹ •‹´¡Á%%è!4Ævêã'| +›"Ç:¾„n|Ph((7¼ 7è Y)ïKÆ ç¾n¸r&·ðåR–!Šöî qÑÞC-8T¼¤S9¸¦Cj ¥pc(<>›´˜LÔÅþænRÏé<öܺµ×¤¾¥‰ž‚rË +µ.EAîó¤è‹/ÐœÇ6p”mÿf„{ßã@5Ó™Dfq”¡e~”1Q1É"»±9•¨$4Aå"èIJpãŒl-Ô!{€4ÆÒwhb# ¤i}C*„¶éf‡ø”)“ -ZâSÅH"P@Q¨pM î€=BË&½¶zcx\°õHáÖᯠ·OQ×—§áá¿/þ÷Õå»æBÙQŽÂ)®héNN´zZLU¢?Ýz€¬+£ÿQJ‡Í7†ÍL1‚îè)O ð á»'¾â³õ¹ú2©T$¥ñðFnâšÕÙ¬ñ„:f8ñý_è±ÑM;£"3Wé$iØ||ØÌáN'½ ËñN†zš˜]|Íg= yû‚‡T™!ÕÓ L9ØxÃç–d»Qv³v›   Êp0Ç*Öh)G™Ã[ÁêUi<a4ë­äÊÜ’¤Ðy ÒUÒ§áq+ÃMQT’,'&ZÑyRäš* +×j”íL‡tž~p"2ŒpGWaJ)q}@ã0*’S:bFçCW¨•È™ ýQ¸¦þÁÓ€°œ!âÕú«€Mj#ÝÁ2tê$p䜌K:v¢ O‘ùI“& +«œŠ)gBÒ"%c’™J*—àîáºÍ5Rº¤2 ÛÐÝ‚5t,®Ð1xT'ÁÈätÚ—o'ðO‡@) +Ýéf„PíNì(³ +õeh_^X:ÅLK'và©aÔ Tçt@ +ž¥QæîÈ›•ê×yi”¤ƒ@<Šå‹.b*L‚aÌ*êÄê†/á"C 2q<—Íã7˜ë9¶e*’$kMIrŒ)|¨%оHU‰@‹‡á`x$¨W9 ÜåÈÐð€ãÑ"8\ÐA$4á*\:‹ž–‚$¬Ùyà ßth‰)UAž¨²rŽÀ^»1ÇHBØ •5tz˜FJ¤Ve¤I$Z‰fî +Ÿ`¹Óé%—„%híq''ø.d\ ¡1q’¢€`IdšJºCpPFP! Ū2‡¥ãg"ð)&àÀdÖ 'A/ 9…L`^'µø’8ø +¥F-ŽS  Çy„¯¡” øšn4ÙÅ™-ˆÙøDe†õÕêã;¨é)GÒZTÚA”Ün/h6ˆeÖÉ”b³Â› W£d5ú…hì²0.[•ÑIZhDTxŽ>T¹$ÇyÈêç¾ÒñMÉ_w?Wˆ4WÉÛ5–#”®-ÛWÐéÊb@†?~íbؽჶ^~btIŠú-ÿF´QÅ\ÎöAjNIþð?¸S©ÒîÖɸ`ö‚æi9,¾¸DœÍÀOQ —Eu³è¸Ö’o^·92¤÷þÊCg)^$½O¿ +)Z»µ|¢"r'bêÃ$iHçññàsÄÙ'á<#ñ3€‰IgRfáÓ™hÞ 5ä—›5>;–¢õW¥Š«²l“WyFÆE;×@þCÅ–<T–rlå\“e´ Â“é—Zà)^•NÐ)ñKX§î”ì®õHý¤Û@ûµnÜtû'(ý»ˆDhî@ÉP¶¯”¶¼¯Pf¹ Ix‰LtÞ#’ŠOÀãÖHFz +i±„lP·ÃµÆ j’‡(Þ,â›ñ{ÈÝ'ùø|cýDɺ³LC5¹µ g "zÙâFƒ¥BJÞ!0ô_(œ-p;úAv¯Š&$ꎡªÄÎA%3.èvn-sÅŒN:$/T “ RiõÅÞ¡ÓoAe*¬æïй¥ÎLÑT¸·ð”D—DT^|¨¿•¾·è“;n³*J’†ôvß I IW#äãªé«_CBabÁ¦Jcèk`D8üÒCR’9 -M.²ç¡QÖ¦FùOSÇ®òxϳ'ÿ²ÿžöYHâZø<†ÎŪ gvÔ{`ÎûÀOE_%‰¾~ÍúǶ¹Ž¦ovÎFÒ{›=„kmwLš¾Ñ/ pاˆð¡tq‹#訑ӠÇ•BEà–ÓBHQåM#¾4Np-®Rx(Ô:dÔlÛã»–‰W‡|å/ÅjHÀWÜ8˜—ISÜ_´ ú –~“*& O„æ´Ž_¶•³Vi›‡×S¨%Ï !^Ú$Nð%ýÿì½Gv#I0¦ ðA€A€å -<Hè-LÁ–03ßôBï?†–zOO+íuC-µÑYU(X‚ÝÍ™îo8óºU•622\FD—ìW íËf¼kE›w«Z=Y/pi4Ã2æx‡­ŒÍéÇ!‹f ­^Yë!‹f räÃ+sGrÂëèúŒþðF£gšý7­€.D“̯Ñ^hÌÐh¾@›šh‡vÐ+اºÆ3cªÙŽã•ÙY»ìwYQìxJh¡vwÖ ´²šC²^ §a¶2>¯®ô•$àZ ë'p _Æ®œ„Â!ÂŽV™ÿyxÓ•óæݼ_hnCäj¢!‚1Õý!À‡¯xTÝÑÏjÅ~avD«c¿AãËn„GaŒ ‚fGÖ ´ ™ƒ±^9'@­ŒÏè'Pb@U²h±ù€0= @p9ZGNtº>[â0¢®éx‡7¢“ÇÇuŽÌÎ<¡5ò_‡oŠx³¹Ä,jv)Í^(Ú-Ùo¬þŠKÃw ߉äÏl·„&d¢4vÖ:º0Ge—²Gn·41¿ŸA‘‡*fìEb­ª¿$Ng3=”T…'1 GjÚ¯ð<@`£Š¬“­“8žgJèNÀYœD5Ϭ7,ðD6a¿°»Ád•Ö; ±hE¶ZA1Y˜ud¿(.Yc±_Ùã7™˜ÏO@f` +¼ÉæÌߘ S†*¢­+xñ·““â8F40ë^8 ¼dÞOWm£}š,òžMèL° ƒA3%P+ª ñ%”mxB/¨Vàºi%…ªE"ȇ²ˆ>LâÀ3e•®x’è˜D7P´KãAE¶`)W‘BH½ržè`Šº‹ˆn‹WTÌM/ ¿¥ƒMIÇ 7x%Ò'ÌŒqçU…CªT€ Ðq–“Ug‡ŽÖ¶f—ËóDÈ\ãp+ÎòòäeæáÏé伎PDÛ'QUäDŒâ\@ž4òŽ·S8XÞ§ë õc×ÉêšlÞ¬@ÎæS*j"BbΟT<¶ð€U]bÑVÀ(e¨üÃ)`?¶(Ÿs啪ÂH †ÌË1ýæ[šè0lH)ð<| aH†Ž“œ~tIcîÌeìôdÖs¸µtb!»\äéqhÈŒwÆWÈËËGÄóK|ÖÙa">£N‰Ï<¡@ÂÓYº#ŽIÊt¾„Çâ +‰€ÕEäùùâƒ#°ƒŽÙÍtÐÂÑñÀ&.â -jÍîwÅNpŠD<4&À(X_ð,ìË¢L(˜>6–8„ƨ2 ¹ï£˜½@Ñ %u]¡IKàðtȧ +ÌH^_Çá^€ZšË¾vD%ñK!úL§ +9I°`‚.˜‚¦Î“ I×®˜Îã i˨ơ·—>i8YŸu]¾v°1evÈc²‹*ѱ)€hë)HÁ*Ó“] +Ú›VUWë%MZǵ}`ئ&®0ãÌü`éïY¥Ï A V…žŠ¨N[l'U0¸ufªÆ èfž¨t3'GJžüî`ùPe“L!™œïšΓkeT¢Rº‚iEDò†f™ènŸHÒ/%´eà@¬ E’W˜G$ztRÄ2÷ši„l"à; ä$GUŠÄRx£Â$n4z,»ˆ‘&‚¼Òi^ð¬2Á…<ðG‚=âˆPr˜BÑÐüGÕDaS•™Âä¾›ˆÈx¢‡h)ªÄØx^dÞ†’肉sh>ǹBgaR˜z*…MË´’Ó'jókgÞhÄCETô‹a÷a꘼ł˒ˆ>±ú”Ú¬…Âœ`1€Ì ÐqµtVN_¬ã9½qåe’'êáÝì :PÚyÌBDgÁñÆ*x6ŒB‹&R@ýÓ/̧ä¥M‰ã»nó©?B3Øa?ÊІ.ñR4É£*^ +…6aƒ pñЋûIЙíŒ,Él‹ñ2s3cŽYwJ ËLÇÁ’Ä*é¨p“f'×ú:áÍ5ôº#ß1:,WXr=d–VÓä Ò†¨1ë’iDE‘™1ôF®f¨R0z‘Èy1„Pª•‰ˆ¡_£JxŽÂ¬;ÔAÌFµ‹‘CRPÈMìC•Ýi6 ÇïÕZ4‘DbYf>ôô¯ùðT +‹"ù±óºÊ&Ä™G’™,“‰PóùçS˜0©¯ +zŠð"Ë·«¢ó/ +!*ë°ÒP ÅH€‰Ú e§|'’†6^‘¢ÈHUŠâÀO«:­ããM‚¨¨Ìç‹…©Uu…AšÈÌ D~3Кt‰h2’ymÞé/]žÏ‘>DÿY:B·Fk,·Å´£[f5“úÀfÙ30ö‚1xÚöè5/PL£}vŒžŸð,£ÕŠépKcæÔ‹ÑSªˆ—¦ª¨› p 13™DX¤‡H.:Ûª"û‚îŸGž¦(ðæù•LŽ˜ètɱ=kœÕ°é7ˆïL*¨2Â7ºÌ³R"‹9á0l…]¹BÄ)N¾µÌÂÌ•S`ðÌc$’¸žkpß-mHä:fIrÂx,Ô³ Š&›v4ô+JÚÐÆ¡c<P î¿ÄöÐu] DÒúao)ô~䔨è*ê븲º™Pd¢2,,šJú°åTI±l:’%•}Y\¬×;)džô=C»ÕdEåèbV9²¯Å.PôõCC$žp:§ý¸¨ñ±Uù NÑœ*þÂxÊ_Âà1´2¢¯`À©²l-eÕŒ“™Ë/¨:s¬Ð{Š\Ïeæc‹ïtrTÙÉ’(04zCSiVDÑM›ƒŽ 7#EC·Ì%O¶t¢˜JˆLÒPÔôã¦ð…i2!†c÷! ?y`6DÕô³×M—vP³Ñû †NçÞ˜ÉI¥äË,F¤x¾ÇS –-O tbæY/:Ž#%#ª3Äï,(<—cþ£ø¥Ru¤D’¦€L„FP‹ÌX9óP””ÑŽmf–X›1?Qg1 +°a $º* +eF]`Ê š‰ÑH ‹"蟜2£¶N'Dè © + +šXÎD›‚Nj̸Aâûb}ÓõV¢ªršiÝÄYU1ˆ@'G«Ä«LIYpÜX]àÈÏ@ј ûÃÒÅ×èˆeÂÉêŸVRFLº)Ä£‚[-ØÈ]aŸ ZÁ’Má>,™€çQêNòS¢H‡H‘ÇJžJÈhÅøv¤ +‚_ðºe í&^Àu—Ì  Tñ_Í^"ÅDã§ÃQFù“34…b@uÊV<Î5x:þ@z#šaU@)_ ˆ‹ R²4Úëž@Nè,ì†âqɾ Ô ‰¥P>O€.лqx}·„¡Ë…Kʧ’sžÊ"ux×g@°ÇÀ]L«43hà¡ G ¨Q.¼íM˜œHäŸds€‚ÎÒ¤ŠŠÂˆF@¢MÓ…î@|åOV$:ŠC5‹GêA #8Jx‚'e˜òu±nqÏK(q`è +ŽÓ*b +msÙQJ%3@Ç/i@ +drˆüÑLÚßµ4ŸbÒÐ1Ñb¶?ZØ.äãn»°U悆^äÝe¿B7+:ÐÖÍ 3`o”'ÌúÉìëºéFA¯BT[²kŸ­˜æ`¾S-+Ù Foàù7üI±P,nÎ|3³Y}b3w³ÊN´ÍôË [Q"/Í„ +èHX`m¦"bµ€Q…ÖýéÃôƤfáQ“’¹’;R‹a.8¤nÄoiÄvžÎ ½Y¤9µU P …±8ýѼÌì:öÑ®5É<½7¯70÷àå¨YlÒEu‘/@%ôJýdbwt|`XßPß›l!üú¤€¡K­4–rlF ÎGãU.²Ù‘@;MáÏ c.0 =ÝEóž1ó•¶PD”$’:tg¶X =ý­EJ’€ÁØÃ"êhö³Ù ;±¡WNF +Öv?Òõ 4—(‰‹YÆ«ÝÈø|p›MÇ®›“ôåa0Ë_¬u‹°ÐÂsÀµEáG®>|t,¸fê|¤Pñì€ ˜­Ê3z…7~€x%ã±2žÇŠ*;ÅÂL‘¨RIÌ‘EWX¬¾NÙrÍqŒÓ)q¦i‡¬ -0¯}ì€ã‰#)ŠÆŽÉÌW! êA-M^4fFr<·)óc¨tÕ >ŽN!>1)ôž§eQDÇDÉÔ­:K¡#+Š/è,¡qL»”4–B,¬i*3T™o0°YSÍA³wš¤—+—ŠŠ!ßÔ«Ê㱘@ðbHçN|b€éŽ'EÈ‹.‰Çü*<ý‹+D¯eæ»öÇ}”|d|·XÈÙ÷¹ÈÂ'ê¥0'ú‰ÄÑ*Ë‘O_ÑIƒL,Ž. ¤&Ð&Ç}€F3óqòðîjÐÖˆœŸÍlÓffP´dEf/è‚Cô)@ÏuŠ`YÌ©,,`56I”d"%ªB÷(âù,GVê“ÂL1iúË«&˜3<©HÀÌ¢Àa:x…·$Q.Î|¦“l<ÃAR©‡i'¡Ó tˆLÑgǨ Ì?¸t¤©/°xQ2±,ì准îí_|ù‹Õ&—^~ÏáÝ`K„/?¼HS …-!ç¸$ÀÓŠxŸ‰ê>¶h~Û ð¬N3ÚQîb ?Ôá–¥M4Sûc$‡ ©ì%ºT¢ˆŠª·ª™Çšœù²LaNÖÀ/‡¢‹Ê™̧¤ ÓQýæ ŸÌ‹Ó(&D–‡¯x‰Kñ…€HˆvØCTL!ha$V< ”õƒ¥~½–Öž¾È^(óŒCÐÙò"4ïbŠ<3F7!tÅ¡¡-ÃzŽcYVû„¾#­‚ âva~hxú_B_ +"¢ëJ"d•VM'uk!¬gJ^E¿¬7xþ†¦zXº€ƒš9–ÉDÊw%(æ]bþ£YÎŒ=â™=3¶17f9,+Uȇ¬n,f•ù&¢1KB ɼ̀¼™åÈ2Lð•J×q¥á5&ºŠ…ŒO…á’Œ¯Z|bíL[3I£n#ò‚þ=‰¤4[—ªƒ&©HßUÌÖ¥#& åçþ-å¢~¾;=¡±´kÑ”Æ"‰¤X÷w†yÍž"/I0·¿bòÌ4;Š¤&8d–ÒQ§ˆFÊAD * ÊÇ–^šü<¥‘É®&Ç3î‚×¾rè¾7€¼*ðìZ + ¦]úJÒ‚d†Yf”“ÎËæÍè~÷S®¥`ÀfG:¨Ðm²t9‰HÖî4¼Ré”+4Ì-¤b–<E¿d’–P²>žôý8Ìû³aª@(Èî&™€Yð4nS@w@ž,ËeZ$: c&ACi Òä{Œë YðÇÐSUfYU&¾‡& MvšMhrÈ¡) M™h +˜BS é€vz,fa¶@×¢J< + ˜b›Œ0æ•‚˜¶C7ØÅ劌%M{FCg ³ ‘ÌNCG?ŽÔmwJÏŽ¡=,xd^Þç)ÍÓu²Žµto¥>åÒ·gÇDêñ¡±FBãLƒñÈpYNßá%ŠãÞ©Ú 9–]Ë ½¢³e´Õ*äõba¹kꦔ@yÖòrÀ\_xâƒÓ$òiYüþ¨šyF‰G_q²vSd6FÌxò: ¡ã¯Fáú +E¬óÌŸìèàGÙÎÈížäbG¢S^cGî”ZT(ZÀQp²9ŒÀ(ÐiØ)610Ð16 +iBo`X™ž„Ø̤ïìî\HTvßÞB7¢´‚÷.ŽÓK%!ôÆPRC!QÂÃ!…¢:5Uffc¼gCÂ{WtTÏP ¹Á@[t§Æ±S"ãé55‰VTC4æ}ö½ÆìOšT²rk@¦0Óiåž%ŠX,žsÛÍN{Ð*¹zÕ|Çp5Û%'—Ÿo%Ÿ‚ÝÌî=†ßì冓ú=8Î ñcXŽcÏAyœ@M…&qØ&±ç |‡·Óš†ó¦9 ë8Æð~ +4ç\!ò%´UOYùqùô¤Ã\~j’¨‰…¨E’TÂcXÒìIf! +cF†^ž.³â8 +…!³®ó©™£dÈÙDÈÙ:†*Q§é%ëßdJ&2…—QÎyvXlj˜sÅ7Úb W™y6ÚÇZøËœ×L¢±Rµ0‰oÓë(Š) ?ÞOlñ~4UÀ`JeüÒ‰Ò˜õ†žTë +…·Óa¸–š‚²vǤŠ~Tñ%E6—@¥f¹6(ôë+,_ªkز6ºÀLã™!CÎ&BÎÖq]§Ù£5*jDÖØpGæõÎUï"ºŒÉÃC[Y×ç_õΓ‚Z5ò:8ö’1ƒ!>ÑËÐDÛ¡‰!Pk£eÍOj®M»ìQVG.>uFX=±dOšfŽŠ“’[ï$3éMO3·‹s+Å—F7–s_Q3Š£™á ³/ÜËö`†Dô¡à¡‘¡ÌØ¿s¶`W ‘­{ùñøÎ5FQÅ@ò8Jµ1ÈuZ9‘¥Ôó›Œ-ФŽÙ`…‘è*sOò£ #&wå@„âMû…>Š½œ$¡AÂ@(ßÉ®Ñm$˜BÝÄKk·Û{ _Ž 6?‚XŠ¹QdžK-)¬Ü”W„s¾œÄ»!aP4ûyŒ0 ›× M´š# “c_iÉ€î)ïÛù”NÊ‘œ;.äüÁ>ý2÷Ç`()&Õtý@ºÔ< *¸Sïsû —rÖ˜ô‘øÍ>š}4Kþ$ Ctí–.ví&óq˜G!Ñ1_žEϪ ‘IŽ\ÓgÐJ<±ÐÆèåûÄí@çèBÔ)"-¹¤2fê$„¶\9¤€ª“…ÒbØ,Ô|2Y¨j±P'‘sÒ7ÖçÂ<ósp"dâ‹]Î`—ª6É.Õ©ìR`—ê»d82Æ./mv©Ž³KKµÙ¥%‰Ž°Ky’]N5É.ÍÙq”²K†gcìÒñrÈ.5Cm‡&†0d—£c_¹ì’¥ætbLÌI·!Á•¬.9º:%íx#…ÉÎPg—ñªcºêè.SMÕÓ.šh'4Ú5À†‘^²þ«\bpƒnê–˜òÝÄæé–¢ˆ±Û”XK`Žä£j("tÉ qñÚø˜NjÉüÚz¹(Ú˜ÂùѾcßÓ·¦áÍ'êÄv¬‹m‰0ŸˆS6¦aºè®^•ØoŽÅiA(“µ:xÁVûnl6²—t ¨g…ÙÛƒ +9G;2­w ÅŠ_Ùz[fám·ÎºµV† +±×$@;?,vð‹Æ¾œ5ðw¦ð +/1ÿqW¬;èU]'ùV¾bt]™nÉèæs±ñ|£QƒÝÑ©ÖŠfÉLqÃ%¸:ý°+óG~O…]M8ËËsËO)JM¤ùþ»åE*VþѲÔÄ” +ê¬ +“eÙDxy² c¦ˆPi:–oµŒ®U¦„Ÿ¨‰ÑRÎi™¸4¥­h·ÛþÓåh"Nná=T˜­7 ÈÈjÿd¬)±Ñ Ç`+ÿp.r„@ ôCÇò®¡XÀ›O´ñ²3!L:#ÿwMkíDÞfO›nΚ§K’{KóœSA›úVÝ üD“Ÿ¸ˆ~:€øø ³/VÜXoiã¸Õþ³E =™÷koœÂ€A Ùˆ‚dõ‡a}݈›ç©Z`ŒåãÕ|­åbØ[fÆØ0‹¬ƒ¨¶qUëÕ@ÊÁ'[ÈöóÅúZˆå{µâ°:[ôl¿Û®®L¹Ü3€…ð³ë›ùr¶»á|§Sf …J†9yÿH£®4•,£è¥sµ>5'P?L×, œè?lõjèm`»É&j½N#ÿ{ °Ñ2‘µÈz·ªAóìµ¹$0Ï tM‘îÀtISLî„·(²KaNÄ2.¬s˜ÝÔu]ØAžg¦š„Qvm¹–¬QQ÷8œ-Í×µµÌwûSV(Þn•µþ"‹;§„ò°dÞ"Њ ø1oÚ9Ú:»}ZûÀš“å)ž¨¤U jAj;–\öŒäF+S*Í€ôpÅF«ô³àE ¶ °†ÓÖŸ9‘¥äŒâÇ@¨î4â„–Ç/õ»¨÷cvf‘¤°,cÖ$zýK(ÓP àç6Í U_4æûhŒúEcþE4F”0‘Ôù¢1Qðž»/ó{јÆ€Í 8—žµ¨že§w×*4º°„YÃÙõ«Š€!F_ +×Ï$TÒ¡ú"T_„ê‹Pýê„Jþ"T_„ê‹Pý¡âYÔ•&É:]#Ȧ„£<^œ–Uá‹býÅú²eQ¬/ŠõE±~Šõeÿ¢X_ë‹bý>Kû¢X_ë‹b}Q¬ß„bQâ¡_™býø¾hÞ(Í[x¿þ0õúݶÍÏ&Ã?w1B>z8ñßÏ!Þÿ5¨÷ÌIøǹÐ/®éq¡/.ôÅ…~;.´P>¿/ôÅ€4…ÿµÐûø§ØÇï`‚áLjöåTý·ÒŒ_Ü©úKhý”ÐAA‚.ù•TL>ÁámÃ,± fî1ã`ñâTx;Ë\Œ¹+>Ã`ü»m·/a÷cÂî{¶s<€¢äK¼$áñÞ &2'P‰×ÔO3žÿ×àáÑœ>ÂÊ~q·û/Vöû +п۶ùbIcI3ì/؆iwÁ g¾øÎ/Èwþy³Ë/n÷ÿâS YÅ›Bñ6VMåUÊùÃáÝJðCSé"Ì0§ ¢L7¢Zî3¼"©œò·ëC¿ƒõæ§P\A¤DïŠÆ±sW–é]$î+ð맒,¼$úóHÖT‚Ciü\ñv·et{?‹àŒ5j™¹k!°Üµ.?¢Ý 7kþtÂk¼…ëR~™—g¨ï…ÄMYœ¦èú/nIþƒ&Å ™¡‡.¦P9žìÀ‡©øÐL™¹0æ8—tÊ…HVá¯\ˆŸ"ú0“§¨Kxǽ­tªäuö%ùüD*õ‹ ¿¨Ôg7|¨Ÿ™›à7ÎÒEª.q,¶Ótá‹`ý\‚õ•£ã·"X_Z×O—¸éí7¦0üø]oÿùÅ㧾hÌ—PôS¦÷¼VH(Òyï(Å«ÓžÉD’ }Å{þ4zÕíæÿr´»µoíV?ßp=øU¼è!ð[Q°/Sð?µõS0cJ¹n¾Õ+·»ÍŸÅÁ .vbO¦oÕ4oꙬ‰–ôŠù†qõœÊ¡wúÂqcßÎŒnHᄺF¹ìófZƒ±æ©L»ŸïÏ £Ò5Ø僒yk`§Ö:kצwp;9ØÇ`Ç[¿ªg3´?5Ûà$ú½Ñöó­R»YûF ¯ +ÎÂVaÝ`kÐŒ·;5c´LºÖ2f5ý(÷!Þ’åÚo´ÿ¤» ¿Èõ¹þ Éõ‹çÓëD·ÝÉVó¥öŸá|m:¡v6µðÁ5‘™B£E-bTh º&ý£•þ_Àt±—3%ÐŽ²©Œ²â¥•æ8Ú|ñßLã2À,*†+füa4þÅòßå`ñI4µ¼ñgÁq¤ÉÅ (Ù¢F£Ö$áÃÞfåÉ@=xmõ; n»ÏÕ©¹°,º„7çiš(«ÛŒaYU$•èxüõ„÷ýî©3'ò%œŒÁçßè«Î'}xQÆ+dETùoKÀˆajðíÛ_®“|¯þ³HgÊ¢‰0_Œlò¶>w1û|*Â|±‘_cGÀÿ!I6ïSþL°ÿ6y—i8_ªü·ü×d‰˜NêQÝwY»áí#m-ÈóL +^ìu‹Óõþ°éÄ)hŠH7>Š,žê?Äžim¦[Êwëø&$„yÅzYmw¿œsvò5ªç,ô‡Ñí;–•C KÚ¸¡cA£Ã¿š4݈ +Ñn± +#;¨Uª øó{Ù]’Æ6y<ßvój­èŠu½ª+Ø<óJT ÏÜõ“ÿ€ÇØîT#Ë}ÙªÛ%c¦óÁ4ït÷æu‘9ð +ˆOL‘çyQðÊX^Bñ9‘p†Âñó,°‰H´UiWùn-s4?Q /Ì P7×v~JÔ”° £[¨—©Gv¬–ÑëeZuGúÔGÇ3bqµ*Œ´bw21â‘^7ö3…× €Á¦kd¥ÞC3k ²$hC“i#™È?lŽåÂògø7ý2ôÆQd™GÇý° *’íŽ#H*GivEP%Ü7º‚þ8?yß,f\ýoÖiC|Xø jí¿Î;Åé1¾ˆùÇMÛ\XÒ?•˜ÿfúèOw#õ“¯?EY×PüªúÚˆ CÓD^øS‘è»\ð‹!ÂÔÕç’üÙæÊ…"|oóƒFÿÑ¡ùfkÍNÃÖ|g–(Mf‘É`¢+:¢¬ªé²¤ §3ǯz|n¼i=9rÖw Ø=ÔŸ“­R´Û§!õðŒožOÛ­3àß}`á¡{3€mœåF¿oÐ°Ï +‹ ÔIp=h®7ß–Æß/'á¿®Öúû¶LòˆJ ø[…uI‘E亨ò¢h£–¼Ø¹.Œ’Ù8§‹ºÎ"uQXÖ?*m•½5è2Ê+2»¡a¸W¬bû]Ãh™¥d•Ó%•åEI${vVéø_y«0T]¥¸gŽç,úÄ9ÊÆ "ü‡^ÞNÔ{ÃÂ'ù +ìë¼YžW•ÁAâu`(Ëì§(Eb«²Âltì3ìôœšÜ­Üµ¿#ê®ØŽ$; Š9µ§iœ€kÂqœ$¨”>>bŸ¼ÑÍKx o¶'ˆ*´'hО¨Øí© +J§ödÉZ¦òìí4¯öw@ÌiHæežÆ£ó¼¤k¬!˜ mŠ[5„#âáoh‰³[AR±{×–ª4¬£“²øPp:©_ÑjIÆ!ác;²na˜*ˆˆ&«²$˜-a²Â:üÇÄàfµ$ ”D“h¶ípl%E1Ûd@ÒTÓÆ:ÚOÐ t´# *'ò¬¶¢h8’ŽfÀCH¦2i¢ÄáÔtb5Øe¢, ИHpÁ°% -Ö’LÐÖ€Ã쨒µDEØØE‚Š¦ó‚"Zé¢Ù…l%€áËšf6GÃ’âŠqM5ŽpTa™`sÑjqÄB‰h)NÞñ¸œ­q-Y¶&))¢.SE•áÉÜ×æ²Ù“4 TÔ kŽŽ’ÀƒXMÊfCCM’ (¤dNÀ[Â`ÛH²-gÃÀ$DkœšßdçXxÇ¢if :üÔDÚo°T–‚7ÉS˜×¼êpṉ̃(Ð’D“’¬¡è +Ï DÓ1õ&²Ú¢ÂÑDqFø†³°\d ›XNHŽ”aITD$¼@T‘å˜À‰ ÉŒ‰ÑÁ9Üq°8(ÙÞ)°öÔ†,s²ÙÆŠXtI6,æNQ-‚ÉKÖN¡'vBPP¦ÆÁ$Ù‚Áæ0q\4~±–@\ÝßÁiéV;<Va4²ˆ]UF‘ZàV"‚ä¦E VúÖé¼.1ˆÌT“ÖÙtœKè ð“!ã"Á\à-¥¥hŽGøÌ•“ +l–´á›Åè„›a¹5UIZ 2*@BIrÅx—Äœ¾²I$D{däZ˜Äw µqdQ ô2ÒÂ{U¢Í ”Vˆ··1®˜I E'ÓÝŒLW³Z…Å—Hu\¥ýËn*l{+ÄkE›p™K"0bËÚÔp¨´1 ïY(=ŠÄ)@q  ”Ѫò€3š“L+8<ìE냔 +´),Ê(Ê<#z2Èfî9U¥ &2LWÌéKŒvàØYJnÖª‚;—'v¢ V£º"Óæ„r2µ®ê* A¤iX¼E´ø§É#œ¼…X‹Mã &[Ü7šÂŒ¢J¬H¯¹âÈ_LŒâG× +Q”˜±% À’¨ ;ŠŽsÌYÐzxň¥h‹ÂÂP@…J4¦°h”SL6«Z<\`-Z˜ÂD â¸êPs\Ô“œÔ3yšÊ¸Ø¶£g#Ç €|Â3.6ª/YYa§øÅ –ª6'¶ÄdØÐË$ øjZ"TÆMÌrª­¼¦Ñ‹gÅl£eûZƒœf¢¥Ó3(Ñˤ”®õúNS˜íº7³2¦77äzŽ›É„U‹†ð®akÊTxŽ}ÊþÕ,´ØÌÿ´ä?h7ëùŒFþ‰å{uÇš5ò02à?`ÀÈýÙ,4l®pNÞðE¢ýgËùœ6Ê#ß/;Χðò?óÝ’ó]ªÝ5_eº,C"øÞï«{†/rùÂȃãS¶ŸïÚO 6'fƒÒ\ûD»8h­~"ßÏ/yŸ7¬g×&=9l·ø|s’>m— öÀ–üïx¿åòÿ§ÙhÁ—P±Zk”ºrMÐQ0ßïwk…AŸÅÓzŸýàùX¡ÏvŽ «0þ…FvVtú÷?òf*`9Ÿ9?÷ÿê˜_·ØÐ~t.Ÿ + üð> ü¾Vï¹8èõÛÍ­…PÞŠÕéOλ“Ûüc±éZô~Úä°Óõ÷ðp³—ǃÜqY£ÿ7¡ã¯vv±n”Þ_˜V»eü„5±ºûtŒ$‚¥<¥ ¼7·B­U‚ïüO˜Ÿ³ÛwÑÎ$YLƒôïÁ¸ºŸJ >´ ÿ0KúÔè5jÅ/žK¨ø.dÛsô»qïo v½;¯þèDþú&òg­DÞ„ó'#Ñ Ô¯ŒÙÙ§Oªj˜üóg5Œ¨øÞ Y}úŒ +mЈš¨peº5PYÞŸ›åæò½S›ìñ=bNT.Ût‹F ýÒ~QŠþiàS ÖKþ'_|§¹]w»£÷–»ˆö±rïß„±½/”“ÉïwáÓï®M¶Z+÷“-øôwÉ¿ÆV¡ìl<Ô-¾Ï¦x¿Œööé+[kƒ’Ïw˜›ó§“ƒ±þþ† ön#_\@Eþ “öõékµO0[ јϟÚhoŸ>¹æâSó{RôßOÐ2›çóƒ~ûÂ( Šïó»^=g_Ÿ>±n»ÑhÿatOò=Øæ¡ÉçÏqF·Ÿ¯ñâŒvFÍ÷':1‘)=ãý}>¥Áäš I2‚¬üàì}ý BZ¯·Gÿ¡™½|úlJ5LÖmTðø­Ú|Ÿn–jåò 7›ëd’ÿMÓ]tÓQÜZƱþ>ŸŠ"¹ÆÂXÑŽ®Ó Ñ/é´¼§Ãí¦Rín3ÿ¯2‡—k cÁY¿  ,³ßOGÇ~¾[1úYà©èÿv˜øt²9Ùá{È7ZãÃÀyoƒ.Ô¬}£8 _tø¿ÊyR¯üçßxœ½ýbë0Wg2úùR¾Ÿÿ†ì)™®1?>fý½5wô…oÄaJüè¡îÊ úAßuAʃ¹]F¯Ý ¼Ë‚$hV¼;´Ÿïö í|·ä"ó›K€âã+4Yltàw§EÉUéÖJ®ž™Td|º«“>6¼Ã:ã0i-­ÿÉìÓsUp…x3Ýpa4rí fþÇ%õŸµ{5l¾ +f-M’]ª¦óŽŠTøbÐ0ºÎ³ƒaÆÊ·pbæ¿"à°E:‹^ŒMó°5¡ezä ‡KÑ‹–wn… °X}¸„yðÑvö]@RtVùgCŠ_RªÆúþNpÁ^´š&ÔbßYåÙÈÏ»º–UíÝ’Š@]¬ìpK½»ûì¼[Ò1^² °=Í:®t¾Uä+†ë¬ÝtÆ€*œužÑýÃpåŒÿô]IPBò…Z£Ö7Æ+¢&ÚX­Çó­?ò½ì´Mî$BõV»XoÑ«0Ÿd¢È÷'F©6h:Ù£ƒ6O›fÝèè»Jƒí»†ˆbQ©x·Ý‰v<Ë{61ÏlêÚoÔ:·aaÆ(â‚ÚÕëT{ØsªÑnwÏù–AAñ‘,^/2¿šcc¶JÆRµnÏdûH“¤‰Í4Þž`RÏ1:д¯EØñR˜ spÕ£‡©A£aì +šB¯ß\jÎU¶áXDXÛèÐöÀº +ÔéͯѱÐ `ôIíY›cOÄô+>p9Ûec Ã(åÚ+‡L Ïj(n4ñöÀÖŠÇEÇi1k4ò}€È!ÚÊ= ˜Q2Ý.æˆTβÎthˆ½N›[&ÇD$ÌÀ\Û k—‹3!‡î.YÃÛXg7³{žÙ ¡³uõ-¨Š:÷íQÎ^_:jïä‹6±Á¦FÓ +ï©Ö»ý'%Éš:«U*êhvö`œ£•µ™…É‘<ùŸ¾-ËÍ)‹sE€K¿SÂÞøSI[½C9²x‘ÉAU £Dr 6WùV­W‚â 5ê©‚.I£¡? ¼~ÉUÈÃx‹cJ¥³|—å]ê]WkÅêY·¶„cã/›ÊL–L6 Fi¼$7ƒWiÔZ†«\Ëa€cK4ÒlvP¬Oµb] Ðékz¤8æ(Z׊äS‹%RXá–Gy´LÊ)9¼É⦟òØ +Ín!ì³&¶ßhÄ/ŒÎ ÑsjjD¨{5©©Ž¯{ÎÖ\ÆÉ©5.5ºc‹Ð¤Üï#¯z¶…1VW¥N-lîrÛ_©“/•ÆjÂ4‡rôÐôÛ¶²3NÐhn Wí©Mðaüÿ w’vYÆW(@dú2n“u.{F<›ÝÃSÛ¦L/NÃÙ¼Ò‡MÏNòá‚ ”F–5Ô ˜)ˆýZÑš'?ož‡æ z»‰2EoÈì·ñ:UkC4Œ`ÄF•lvú!·ë†iUr‰kôÆsŠïaÀØ )G¥ë„ež[æºÖ*µÿœ”ŒÆËiÿ“Ç>Pˆñê#Îæÿ@€I‡-´[¸ +®¡<À/XÇ…(åâL¤â>T‹Ÿ†ŠïU2uG~ÑI±Z¢)5}¨’dŽOúP-ù»j)ßUK5k} „ÚÍÁˆé5Fôp|Ÿ¸Åª°N_âùu8ÎÂ'íƒõ„é°·žøõfàÕ»õäñu› øéÊi»óÅ¢¦Ü甬ŒI–]7'gSÛöÄ؃ Džr»Q2Löí¯áÛÞˆ–M Žž¢V³r‰AfƒÖÄá|bF0Ó2ÚÓ¦&ÎFŠŒõé8<× gíM@j +Û1㢢´¢ªªÀËï×båÇ7^”‹e¹œ«£à 8íŽï3 Èg+ +³u ª8¢Ííb¨‚Q·&Zîç³µ‰áЩ;Õ¢y +ÕÚŸnS›ZÖVNµÃdbÛBÒŠTý†˜\»ãÐŒ6äàšXöISDÖåÅàhw=FMQÓëL=`R±“fšY°ÓˆevÝÌu¸ðV«…á=lcà³GL5Ɔ,ÍVÕ¯jÆŸŒD­×j­œ+$[ªãœ±™©ŒÉŒ0 ¬c4+ùŸN»ÛG{£­2lavÍ1ª7žcsT—\ ‘3ní.œF»÷mªÔÀvT«hfÌÊ7r–ÅŠà­ÇhLuå°‘ñxîa«´oeCÅJìtk¬’Óî@U˜F¸qÅ 1§ÁQÆÔ³sC«À¬"Y§*þaº³gyXá¬ö£¨S6ŠÓ4”ÉE¶è×Æðàr£Ø [ÖÖ6»͹B3J›ÕGEö±‚è9<4$ÇÛÀ.J®Tfÿ"*¨®ÿa6ãÂ<€jHØ@ zL,MtM¦š¹ÃkBõqê,Ò-u{a«nŽl~·T>ßjµ‡ËËl¢e|é1ÓÉ‚ƒVñ"F í¿¥¹›mΠÿÓ Oz­ŒhwJƒw +ôÞk¡Øž½Pþó ´[xQ3RÍíË,é0¾É3JVºcû[äf”쎗´)ÁXÁ›ãTè°åŸ¿øPhàh9™/Z̓ˆlÌo¯ÁIãŸ[`ק@ù¹eÆŒ3ʵŒJ~äÀkZ¡B ©9ÁÚ§õTnõýA¡7gbX¤ÔètËm§Š3£Ø*(SÁ]iÖÃÍ|·Þk—ËaÖ·pñîÐ:´@é~»³pÙ&µJN. ™r|Ô ïN9"›]ÚõeGF=¹öX–• ùî<äÆr]G6éwŠv€_ÖZåö{=w3™^„&b–ÁË*fM¸d”‘¯;v§5ùÚ.À~è7óqjóã¡> v¯óX¼cmC69sš=+úœ2#lhêÒ»¥0Ð6òð –›-,ÖõÒršÊä¡L¯XlÍ#¬L§aÅ›ñÓÉ,+–oÖØß-W}oŽÝÊûp€2f;Ó阞&ógø×±nÃÃÓYåÚ]”€ßÙEÅF7lµXbÊye-ÞÝi÷çlc,9$¾ï 0î•ùr – æ{lS-PÔ!3N“Tír3 {^ƒ%£W«´Þƒd§Ó “‡ÚnÑcLÔ¶öð1à +çøX¤Ç¨v.và‡ÛÞŽjg¯eøØÁÇÜ’w5]‡ßkXhùbß[?á×ú)ÖNÆk½Ü>Ò@åDø"Ôƒ!ž¾¦âF÷ /ñ1”|Ù}óã<ü¥Ë1¡ZèÒ#ÍE‡‘)rsø=/?î|Sî”N5YÈqË©íÄ Ó{kbl#tͽõ¼©dlMXû“…•ÍûDyõÀ›8ˆO2¦¸ä%à£wUHŠ'Bbå~“{¹â/¾}óuVºE9ªU”\èöNHºC±js7h­Ç’ÿ¦%ÆÅ»,›‹·V¿c/_WºÏ2Â9øL/¡6¼>‚i®?ÁëzÍ*»¼‰«“y†/‡ÃѪ„-±óìž&>œ†ùýØíÝEô¢´ç‹%7<ŽÇ®¼=»õ¤¯}³¶{P^bõÍÒzäí¶s Ò°Õ à¶ë˜~ÉW‹6Û•Aj;u˜Q”ãâU¼¶s°Lž¤ùÈÛ^Q &Ó©SE\¿}Û¨»ƒ»ý®jB¨u´Í®GZñZ¥Ô_òªÍ‡ÝpÂèí©É»r*Ù<}­o—ƒ’Ú¼ç/ÇFs²uØ;È$ Üú z|ë)ÃJ¾c!ýü>qX:\]òÆ‘†kÈÞ‚ªnôÊb´[<äƒuý·ÇòùôœnG³w5K +åý(ß #ñÕBT …—åЃ˜ˆœìŽ/)[Ëo„ÃßÜžr{6ŠM÷réàÕíN\K€³Ý¸Û½wÔÇq.›kX{\vNoÞÜk›úá8­+”0w¬ÿŸ<)[ã¾)סF0Ò T4üBÜvûÜ˾ÇM·g=qê^‚·W…­ëÛÉÈ€û«›Ü¾Û¿×¸w’Ù¶{íx+ìž/ÇÜëWOWîÐCòÕ.„îJmÇÍ5ÏÎÝ|O5Ü¢§¿â—Š[öm¹•uÏ“[埻n-r"ºõ”tàÞ¼t?¹·ŠEX!÷ŽïZuïîeÜ{W;w¤Åݱ͵„;~ïyv'}Ýwêì-â>ðv܇™ŽÇ}DÝé¼÷Ù}º ¸Ï|Ê¡û¼­¹³‡'’û’»¹t_ ^—Ý7íõ¤ûîy§ +½<Ü\ªî§óƃû%'¯» WYw馳â.—vÓîj;ßw×}Ü»¹yûængÂûî·âõ›»¿.,»óƒeO'v²ì‹y|ËþêÍår0¾Ç-‡zÞ—eî$¿µ,ò'Í%ï²üºy´¬®ú—·6[Ë»«ùíåH÷öm9^½È.§žŽ¥åÃÇÃÆrúá ³œ)HËóÖòeÿ*·|ËA;ÑÆòòsÖý¼\hBÏå­Ca¹v 4=ÇåΙv½ôW/Ïr¶»âñI{UO V¸ö„²Ê‡o5샭™ïy¶_¶ÊžÈÅë'qz”ñd¹”'}]ßñœ=œKžÜëNÈsë ¬zõβ'–ïzŒJ¶éyŽ_—¼žÖE¼êéù¢••åÌ^yeu=^Y >íWW¸­ã×Ù}Ù\ÑžßVv;î•x‚_]9£¡•“ർr±ÞÛY¹oî¯w)/ùVë¥s_Ø×ìø$uyË·yÆßû"µ¨ÉëÛW®Ž}'7õ–/ç[ßñÝï|y®&ù*†|ïk%®Ã¾A(p½êë]‡VCÆÆͪtõ^Ý:ßzX·¥ÕÃL¶´zö°»·z]ówVŸÕ“Õ²r\m¦ŸWûõÈпÕÝ·?\ÖoüŠ®lúw^µ¾?™ÚºñŸUôçZYŸÿá!_ô—Ž:i#Æ)þ~ìx9°3Šxð, ¦Ó»½§^8°ÿ–èÎÂõRàæ(~xi»µÝôxkhòš7ñ\ ûî=kÊcâmmï@ª¯ˆ+ÆÚ¹¯_»mOk ¬<¬Õk÷kýöó}0¨<­ýÜ:X./\9xºžh¯OnºÁürÏ|=ÑÂÁþò…ºä]÷?{bëBêðt};Ô¾_OöRµõL±çY¿}<׋/br½Y¨_‡–[¹z(äÝ †ÔÍP4=}»7ÊíЕü †^®OBõðE54¨Üqá`ìþ$¬ø +p¤Ú^ÂÇWþëðUz{%œ?¾<7ŽZå#q{#tqQØÐJy#>8xÚÈlöŻˣ§ @Dyãíì©ÀùýÑmN¼ôÔ¹=9ŸâŽúg¸æ +ç¢Ìµ _Þ{èO/yyþ4°ÁïdUþ0Ïð—mUà |¼Í·ήï[-*;«Aa·lÇñ§[áf-¼/€Ðª +oiϪHd[¢"^ĸür)ž©±#ñQ_‰ˆ¯éŠ&-_g¸%¯´Ñ¥mÕ'Ý—¥›µ•¾dÜ®ô¤ž¸Ò“ƒõµ¾¬_«Ëò~<î•/72¹ªpòÛúšª¬­Åö9PR±¬’»È>+…†¿¡¼é·>uíART=PJ?Û:¾Q¯v…ºZê¶×Ô^ yËIæZÛ>8èhÇñ˜¤ÝínjµãÈ«îÉD]0ŽÏô˜ïª£Ÿ'«Ûú‹±û]Û^ß\«Ýžon¦–Ý@³öö7ojg³–ÛI,y·VŽí-)¾ŸÚJ$V{[¹Äcz«t}´ºÕÏs×Ûœß#oG⯵í³jñp;¯=¶ßÊw/;¡½ÛøÎîZ)°sš¯wž¯VŽw:G²¸»¾ÜÝÝIwO×wŸïN`õw;µŽo/Š×÷vO»{™Núl/ŸZOìu;y=²‘Ù߈DUq5’õ{Ý‘R³Þ‰ºŸëQ1_‹&K·•èuåº}]ÍWc«Ûõט~>hÆŽ;\7öÛ÷Ä:ÝbpÉŸ®‰ñ¨Þgûý£x¹°•X¹”jæ´—8ʄÉÇëj4Ñy9É&7|»µdL[ $/ÜÑdm­y›Z½~í¥¶6ªzêÔ¨_¦ +™~oß½ØÙ—CÚÓþaàzÙôOöß‚î§ÇgÝúÁM5¹{Ð\kT×sÇ»‡Ñ@àõðò¾?|Õ÷»Gpz´kx‚GÙ\õñ¨zeìû3÷½ã»§«cPdu —µ~Ú¯uoÓ;ÏBlɛήF×ÒÕ«ûדï¾:Ù­Åâ'¹ËšpòÛrŸÕJõ4ª$ïO¯eÏéisû!‘ Ÿ¤¶2‰'NÈÜ/Ö3oÉúê™PÍ{Î÷gÏý§þ¹û±<8×RíåóŒî÷.yÏËA%páß8ã.öÄWõâJÛØ»hž^e7 ßevã¢}Ê:9÷òC0§åö¶sg›þL®Ò/.׊WžËØýñæå]6r~ÙÍmÕ¯ä§þꤺ{rUö%_¯±¬´ä½ŽVÊ—×wšwùº[ÞMÞ(¯7™ ë¦R?)Þ_VÔÛÄãeáöñ^ÐîÜùZùn³šÞ»Ë­o¶ïšÉ@úž/÷ÖîÅÊÓ}é©°ûØ)ºâÞÚÝÃC¡³ûè~ û–¼[§›…ÇËólú±k¨OR^ñúyõ¹xS ¾¤ÃÁK¼Å×_žîûÅüÊaá!¿¹ºÎßEβùÁáÙyaëâì¬pUº:+t× +Eí´µä-f{ü}±}|˜/)ë•×Òy‘ë–šW÷C:âdãlç.f4â[eñà­XÎ\ß ÊõrD¬ˆ‚xXÉd}Ï•z¯í®Šç­­êÙFóªÚ¨w»5é!°U;¿Ü¼¯µNÓ }¾*gÅÃ×ìC°ùÚ©îÔu_£T¿JDÕzﵓol'ϵÆí€7šË7ÍÝfd;Ûl> ©£Öª__m%Wù‡VqƒÛi¯«á~ûè@¼nW »ÛËx:gÙç—N;è>Zò¾i/»òÛõa~¹ëÃF7~¼ê>¯©û½€·¬ÿÏ»¶²:ň (r2«¨£ Ñº2”ºmºË³>îžÑÉ·¬³Ëïp¶¨µê^?\F—ùÿŸÿåÿøÿ÷ÿíÿûÿãÿþ?ÿ¯ÿu¾]¬Ý+vËÝ·Qýü°UwámÕܶ—L8Šµòã~%Eªí?j¥­)÷‡Æ€ŽêÚ]—ã’ÜZõÞ±Êàz%RÏ,²=Þn•è”ä°‹S+×æÙI¬ª&>kk|å5ë”èC½CЫÙÜ|»¤U‘<ãtn2ÞõŒjï†ôÌënÆ8?ØíìÈÍ©î‹oÍè›Ç¡ã]Ž¸(3BÉ<Äfôk×ÄKXØå ä'-´m‡…©^#ÓëÎq.­¼PÖ„y³5ñbút•T<®µìHÏ™ƒ](-Ä| S¿ß å±Êã=Ks+Ÿ´[íÙKïÔ,V»í¦1` Tž=ð©V,6-D»ý?ÛÝzÚ>›úX½ Ç9Ùœ[AöÑb·]È÷Óù¿ ËÛâcýåæú«Ì¬sœý}ÜÍjv¤ÈN Þ%³3k¸Ð3–™(f®›ïtl·»\út廆«_5\扖«gE‡ýY5Z®‹<È·\NHG¾‡¯£¥vÁpAãv’‚0Eô©ñÑÆþj\ .ز6h»fÍUòµžs8:ZwAgvÕ–ܸßÆ&Š†«F‡"yW#ÿ&D€‰QHnöÞ XÅá¶tž=l†õÖ‚eÀèÚåa÷µžkЪ· áŸ$4]ìÖ: û»XõÌäÿZŒ¥B/&Óë}È׆IgÑùLj(í}ŸÜ1¡æÇÏÃB@:kɽãc•Ïöó­’_bÁ©87„ô{@›J9çÚ¨ý(°ßcüÓví»ìó[‘`×Fô®b¾o䪃f¡•¯5æyvX•ìb“ÁÌÁ´Àî™ÅY˵V}ÑQØD|–C›U:×­51•Îµ±›±¨þû…íSñE‡}1âÏ2³]kÐs]­¢@\FK¾3'ãçJàŠù(„µ±¹>cl07‘F}^¥3ç:DerÒ@À CÂg,¤D´Ãt«X\ qð¬$clñ|‡¥ý©Cï ¨Â}ÜÖ '¼²ù?Œ`Ä5ØêÑÑãöy'ÑÒ^ÆwܾÞYÝÊ߬‰¾L(éî7«›•–û(å^÷¯ÆkùpoE¹Æ¤»Ðz´ÙN÷`ºýjpWñ R iå:öÚX½^ò&ÊÜQajc+ª^V¯Îxøjv§Îr›‘ízê1²Ù 7ƒ‰uï åß/•—¼¬Ô 0½DùñZÅÆ›Ír¬ÚWÕ;~/¾D‘O¿E¶÷V¯Y;0ä^ü©òÔ†_¾7<£tÇBÚëJ4ò´Ønò¥Á’Wõ‹É¢|îW¥ç­í¨Wôc§ë/x8y™ŠƒµÝ«#Ou«XÌ×ñW-˜,§«¬gžÛÈ«ÝÚÊËfíé¨kx÷VCÝàà šÎúÞpüÈÖQU\ò*[W‘h«¸Ú îœlm¨Í‡ÚÈ9é&o·XLõ®lꪡ^‹\i³ßÈÃúò';þкk¨gM6ƒÛ´7?Üö\'×u¹ërx¯xvÕxû)¸}Uºß +žGjv·å… í*k\’{åZ9o!œvcõ€2Qóª”æøGÏIb#¿íK¹ƒw]ìEÁOÔ +Yòr…åC‰~wSÛæ¯íëä1+_O¾°Æ„[áP÷† îî&×…Ä^eÇlçzg{«ôzúD+iÚËÄd³(;²ð8ïß¹ÀB†Dïdw,ñL Æ£lI¹S^‹Ñ\â5˜(o¿%óùÕ•˜R¸<×ϼ7—ÑL²•ë/GsGýÁäÔÆ ë€ƒµ7]·ÕTvN&Þ_ò&ïJÞŠð²½—àR‘P`ûe;•ìX[ÆÚúÓøZBÖ¹°ÖB0ÌÙ«ö%˜‹NGéýèóO³ìl½¤üåãp”ÛÎÝ •§m6Qp(ƒ ÝHù}@¼ª\Ô“Át85ÄTØ·m¤0Ùd 14›ªéƒ©yñJ5ÙS·Š—QõN¸_ƒ³ƒÆÕHÛËûÉÐzAŸ¶$zÝ8Ž/y£¹“R(Ì®žˆ¥oëÓFK%åöoÕ2lš¤À ûÒÉ$æôÏR³ÆV*!ß ÁÝý—Ð’w8/˜U±œJ&d5¦„2WDpÂüÁÕ:ušØxé¬Å^û¥f¬ÑºjGsÕ›hâ8h7ÐI®·O…”/¤ÞG/ÊÕU¨öè‹)Át•QËúÒ(0Úv•QÁäÕÍE¡ƒãÇœ˜ŠTvnÀ¿$ +Rõ:zé-öFËù¢¹û†öÚmE2èeø½}ÄmÇêþN-µ½Ïû´ýîb-ï„ ð±æ¹Â éßy»rš±¯€Éþ¾ZáÙ‰ïÚKpë°WŠ]ôÈ1~иf_ŽâæW=úÙ>ˆ‡¡ÈËP´/Æß ž£ÙAN~¥Â@ÇàE3Ò-núØj9÷çÆíö^&ÞRÕ㼇;êßG¸c3 •bÜ1_Š²_G·;:üºÙ…wùˆó_‰Q èÅY2oV<öWâVÅWøÐÏX³¶Õk‡5ÖIA¹½ øõš`EÌÂÖ‹=<,äl‡zi&Æ›p Þ®qT/%ÌÑ°!áà¨ö¦I-â ±,{g6F³¢^°ö8ˆì!wšÞ6aíÑ\î÷µú™m(t¹ÝG ¤îýO ŠÛç0xÞ­žZ­2|!ÌÁž'Ç0c.‹, Í€ý²Z4¿Ž<"ZàºÌ@Œ9hqçN;g5D•I`Ñìe°Ø\ 8sÆÂSJ¸á˜³ @b㳆:fv££qlR6ÝûÝ‘N±=ÖéÍ.í—áj®*ƒ¶ÈŠ$¦msCb5ÜN$¥®^Ùºà÷‚ú]|!ß°© qÌ^øa¶ +ñïBCZsº1ÚÉØw@ÉX¿hB8 6SôˆrŠ~kÑÜÕq+Y5r é—'ÃУ-à••têåäv3å^ ãŒÂ¦fqûÐ +H.‰zäÚsY‰×žž#ÉbýÍÇX™Cœûg³Õ§Ø¼&ut±Q…†š¨„{Lô;; < y܈¶Åy"W«~=^\Ü%ŽßbÎ ÅžèE+‘‰dŸºò»lò£½IwØ<åÏÛ¡—T{üëÆrà”ЫN²¸žÛˆ)ëBÈ¡7ò±B%a¬%†²JJG}S +{Ð2ÕÍ)D€jŠº­ÞHµËL<›hàF‚j¡öÆÉÅCÇ’HëòÝ(' ¨&()ý r²€jbJ}6††pjLeÑ}ŸêC Ek„»æ\zë¦|ts#1v§aSÿ]š)Ò–>uð8Ž)«ÐA ;ܯÅν}‡¹£}^'§.Bh¿«‡‡¯j~6Ð,p&ø£­õª‘ÎE3—Ç€î°;r2K©`ðÜU”5{ìÇJ垤ÿ%ïPþŸ¨‘Iì×½l¯óm4já×z¿³\Ðõà–t:Úlz†’²½Ê(Ì~4Ûˆ¡vå/^ìe„È¥[75ÕÜšÀªKï(ýÂ]ݯ>¸7aÀÏÏÖê?†aºaØû±úI‘³²doMT žbuaÇ=ü`#;·Yj68\¦£Y‰¥¶“a»5õô¸æI%[Ø•‚Woj ³ÖW6î5µ˜>ŠŸE΄ÀmóÔèàÖ=?Í^¡®m}¸~M·}œZθt'ÜØïeŒîXÏæ®ëûg÷¼äµQ2év«—ÒæÉõu°Åím½ vçÊzüÐÑv¦;ˆIƒǯ_öÜ#kpÿÕ·ŽCö‡œô®EIK®GºËG©µÀºäêô›õR ¸ÓE*õpWq¦bd»ðÔŠ\Ÿ}›Õ`¶ÌO%y܉rö¥¯-¯È€ØR&ÚÚ=lOÃ!\DºL»ØÑOÊ|4³™<ŽlÅ:NÉÛÙ¶?Ò é¤É‘¨úX:M”õ—äÑ÷ÁSí®æ€ï?ÝFÛÕÌ@lYlq‰†ƒ‡Aí:°dwG§!ˆ^&sQU¿ ±ñ9Q>ïGf¤Âí'>VRñHåâ`e‡?Œêõèô"ѵ×ÈUî0ŸÚNô£JìYŽl^•ˆÖé>“]r²—¤X£µ,:«.:S&液½ß8iwÕýà/ow[·öB‰@(“=4ÓŸv¼ú"WåÜÀÑö®r4H„/J!ŠVsçðWNYNµâæÑ‹½]ߢBV¿ Üoü«ªñôbÚœà8È O½^b½JnV¼—€‹·o±ffWžÄ—óe`_õ;””¶x?Ð9É ¢Zn#QÎuAÙãÊMÇ<ì=¾ì{SîãH×óÔO”ÛÝð„ÕkVx¶s“Š—÷Äáö1õT4Ä2+µróZã¹^Mìïz 1t…Ù`‹Ww=»Ù­”ÿ°tÊåÒˆ›„±ý„ªÂ 8T­SqÍÐäîÖ5HEû¯Ñ AÍÞ«G¶w;ç^´Ä øUÚp@‘ë­ß)»—R2*‡ŽÏ‘Pð“½P!èSJÈMåIË©t+Y”[Ðs(˜¬Õ¨š=IÁÜžEÛѲz/ùcmV~ž¸ÊæIPNšó¹Ú©#hÏÖeâÛÆw®›8׊rÂ^êê…Ko»r"rÐy³ +¯·Q S"íßFtphJÁ£»#t€ë<Æjd…T ó SÁÃum€ôâb3TÞîÚ3uš N\¬Ñ輌)ðCs°íB²Àm¯:%x³E…}ˆ6òžJx𰆋^´ÓýÄzæ­dIJõ=j'¡^|Éâ²òšŒ»›JjãÂÆÛÁEšå­rÓçµýUÊBS$€ ØÉ0-6ô2G¦ØºN3«AàSh^¹Ý؆Ç+Ðs*<­ç%¯Ý÷ud»‘ +8eðñƲ³÷ná·øiR!†ÜíÝéCâÔ§´ã?Ü¢†rºQóln›­U(õÜØP€F*ˆzSIFµý^¾C)ÿQè*Î_6{[Ʀ¯ s¾8{Þ}k’‰4y¯hŒRËAT+t*–@÷î<²^›Û*Œî8ém¯%65ìƒaBš%¯òÆëY·³©T¤HžäJïã¯BJ/Áõ€@Ÿkä‘í+¶y­åì…3Y,?³@c•1ôvÔ2bR½TR®.¯4u/~¯Þ—–QÃZŽlŸ‹O‰ããíeû°x¼Èc©¼/Ùz¼±S=rÂú[¨ü]xn¹½hÈ×#D8én–ÇG" ½'Ö™FP­Sû³;5÷ˆyèàÁi«W6= ¹Éús0yÔa××aåzÉâî4uéë¬è—Éû½r :2Œìíòá§h®ZìãGÂÚœ±jÈ6ÿÐÉœ¹ÏaÞÀ6+6ž•ÙÙÂÐñwk2¤ 4è¡þœl•¬ð7ì_òüs̨ÔZ˜XÈú¶D.Î7S½ð‚»ò‹Ü»*lpÁ“õà^µ/â/AÚ>ßíçö/ú°%îåú1)öëž‹<*»öW!¸s¡TÝñ`ÇÚX½Xòºƒ»õmwàôNw¯Wkðé¥v›Y÷úÉMÂâNncçÖOÝËîxà\ê =`er¢.íe^vŘ&j€¸Í;²„† ¿rÏF|ÉÛíîî¢ëӣȱÞÛÕ¶¯Ã©öt•ì>Üq‰»Ôm.µÝ)ò s´Ì^Ä•ó`<´vý¥•YÓe +‹i} 6Q(Ýëv·z9èdýÛ²lÑõ´TÿJxj×}\ÉÇSÏ™a³ÝG®· mkƒàî¾ÛG§uIÔÃ=m_ÒÞ¶^áq¿µo£>tOΧwº¯>É›‡Oá©>­œ‚„>Öí°S¥v¼ïÞé¶ÛßíñÞîôNÏøiYØ\vºävÛ[]? ÍèT®úó«·ÉéJ‡à¶P™>ÓåÔ“´äõ\véisåR±ãÈŒNÏJ«Ø™Ñéí—*Ÿf‡’תÝí¾{ÛÇ=ç¦vº äf‚W¸ÛͽP§€‹…äèš^&? vÿÿÚ®{-•žÛ_÷ M: ½¨ t»(Ø7lÝ¢ ÅóïŸsí'É´ÌL’ÉŸý¼¾ÀÀJ²’¬¬öËêÃf#ÆY ²Ÿéh4·4,¥¾P—½…tæó_ãoµQu%‹ÍŽ×Oï‹J£‡“B±H}®½\Ñíz‚lxï‘<Ö}ïÓÆÿ>»"7zÙˆTW¯>©ÑØÞg¥ª6 +æE»”¢µûÃsr£¹ÑHh—…3b£¾ö[1põ•9'5 +ìæöÓS›2Ö‚?8_œ6hN„Nüå–ÜhG8 +ÍÂÅjÔÔ3xëפFG‰°ŽÁµ³ÜÄÞÖã¼­iô~_èiØhTר'¸ñugËÂÕ$‘Í¿õë·ÿp?¡4ZðçÓö3­Ñ¦p}*£FáÓõxU9üXŸ]½Þ e©žÌ®³©Q(ùs ázñ‘ƺñtgg÷‘0±ÑÛÐâÚèõûåË+jÔ4Žõ¡#Üž|ï“ígƒƒöáþ¹ÑïžÔ(É°ÙÛqÇ·¥0øá\¸«4ÉžV[ãç˧'b£OçócÔ(<_Œcýå§mJ£%áió™ 7zöñýu^.euBß lv|œXP¼^Ǽ”FG¡õï«Gl´t–ðyŸ0×oº[Yé7Íϸ8–}ÍFt›&rߟDQ£™P5ÜÕŽ´/¼D+G°Ñ¸Ú(h6 È~¬d¡°Ö7ºYîHnk1ÝH½“‡ˆØh}”>Ö +Âøz3¨zA+ Ù¤Q*'ÐXA£­Av}±ÑZú$¡„ñïÜ™xÒd•Æ j¶"5X¯'¯ ب kt½>š-åõÛóêÝä?*ÒIS«\&uìõ-g/7I˜MÆm§ºƒÝçe…útt™þº¥=}º/Áõ©AòÑÛÜ¥üÌÁn¬!÷ëcVÔ=-”Òãééf^2ìÊÂâÝ7$=…âÅqå‘ú´”‰^½ÐŸ¾OžC +ÇŒÏ2»÷¨Oû±E-CúzþwO}ªãXÁîûóÚ¥üºÔÝíî6âÓ¿¡UY÷ÛA쟬œþMû*Ž ^{× ÒsQÊ5có5õé]ð5å¥?}lVdŽž¿Ÿ‹êÓíÅw—út~›©_ªO ûš·«Ï´_ƒ.]îå©O{™\uHçXðÏâõºOûõ®w÷ø1J}Ú::}QŸö25_šÎ±#o&©Pžæ»Bë *¹ÞÓ=Ý\njÒÓFr_¿+»7/è‘ú<·Éů´XC˜†’üy ~§ߒ9ÚçEÑS_nÎÄW9–Ù …Ùð&zå°0?nàŸ$ü¬í7¯ðϲßëM”R{“«º,ùÖ¾Lèà"!És`çhô±ª??ì}¡½-lG¤NK‹°c‡?@´úvA{÷•öü©¯ |­õÏK2¡·kŸ'¨6‹,J£?´sÈæF÷ÔFÁ!ò‘ÖécøX‘¥CmyhNñFs×ÀFÆš-Õ¯±F§»»~µQ¤ý+fuì…Ú¿2ÒΧ¦ÑÈY¯x³d¨"íŸÒ(°öÿ¬6 +Æ¢ëµQÀàMŽÞ(Ôþ©z‚Pÿ'uß›d5ÚQE:…Ú(Üûšf¡Nq£™ÕYYn½’&"Ò¸Ÿ~ñ|ïùçkï}Ê7 þÕskxnú½ü»´î$iQc~<’¤¥a뾄¿ w®0Mµý³–„Ëîõ¡nÇÃXQ\ýSýOo$cÊ$ÑÞ¯~Gö¿ŠaD¢Zî>P/ªåÎC®I ¶œUE“Ô|µ”þÄO—RH–PtKÐ0¸ƒoñK:ï{õÔû¬Tþ\á³ä3;W¾Ü„­tðá¾ôj’O typ>Ø… +íOT推·KâÁÅ®–ŠÇ tXèåƒAô.È;­•DêÔ¼|¬ëÞ¥ñO,ÝÓx&T0?šÎˆX¤åÓOýÄŒéðÔyј'Œ/䥎ÏTGˆþPgPž¿kŸùüù•ñE¥5F!T^ fñÏß­OѲàdƒX:ZÿhSIyx–»Ì¬½„¥•¥®+͉,®¬ÎãÊ:ç‰|Êͽ´’s>S¿/÷Ø|÷Й¥=£èyniEO–*zëCÃO14¸líöæԌՓ])š@ìH3¦~Ša£š]$w¥Ù7ˆÑhåvii@$ Ö0ç†o•mˆ¯ó—È.èÜ°I™¦øwzuQD?¿MÆôSú};W¶’‘S‡L,ÍKŒD +ñ‹òDûnÒæÝwì]ÎʉoøÃœK:>HÇះ¤0, íÒtŽá +ÿ€ UÑƵƧHAãÚ8¿Tº„õ eÛ!ö¬ÚyÝÐy(̶ƒ”A 3N‰jñÆŒS2í˜ia¼¢g^Úx‚Ôƒ‰CgT¿ ´™‡-õXò­Ìoò¤k]{"íýiG+§ Ì:]ª/£KÛZzVž_IýáQé@—è +Ñ«ÒVx'êc¨?Avxý Ùڠҭ̳tžè4a{û¥raÍ|Ÿ¨‡Ÿr¾ØðFŸèÏ=ڀƌMœôÝQGÓewtÙ9„ë²âX°£«BxþøŒg1Pw¶’ ?Ik>o㘇פÓNåAb4+ÉÛ*Z4+$faó‘í%°iõÍ·!Çq‰e’–c|%ærF¹X‰©Ÿ••æÓK´Í€Ç!ш’`ÌáÊ©D¨M¶^­hðzbæÍÃA‚ÄìK4eWvn—.H40k$‰fyï:Ö%šÁw!Òq.Ñ ç±WD‡ Š×ÃJ'å ’´Í!t»dYÐx謣äâWÚ|K`ó|ãð3§Xù|ùZÑŧfÖûü|KÚÌ¢Þš˜Än½–„¬'H³6³´›ùÙÒKÜŽ‚fM—ÔD“0ætøT{*ä‡tœ§@ *ƒZy7§£ ºsº— ÑDÌ _µx‚ñÅ v¡= Á§ 'ú=¶H'¾«c‹oxÇëÍÂ|ÔÓðÎ’~ÏöÁBbÎõûÇé,´zŠÁY³îÒ2žbŽý£¢œ…öO1D‡ ß“¨(Ö+…ïiÈ> ‘„y\9> 5gáX'F­€O]IG‚ò‡˜‡%•šä)5 ƒª Œ×Œ)ÁY爾 ‡N|Õ:?? ætwcý"ìmv®5ƒc\ê®<“°šEæ2ɵÏÑÓàçmŠá¹âH§Óu‰º"PnéöÒLdÂp,5’).»’ã`ÊÔ‡Sjz=sbeøXɱ¹^7îeÛbÔØâíáM¨IJ½“¾À±¢5ƒ’ƒgrœäòÁŠÄ(›}ÄL¾W„GößsuŠsE6—t"‹[W=ϪùÓѲæ¡å6oÞÄârìß>·¼‰£ì3Ä͵H:ñæç:ü3"ètˆ!Û:6‚Éd0tÔF‚ŽŠ´ˆ¡c#èp´  A§Ñú`èØ: ZІŽ c -aèØ:„tCÇþž„­vŒ¡3l\ ‚N±,bèØ:¤™cè4 É „ÙE¨MÒ¶é9ðt$.Ù…£KDOoÓaÃ6Ÿö¢šåªÅŠ*g|˜ 6û˜Ýš9Q´1>1vßø¯Ï 9Ç=>çʸ_ø™ž²Þ% +òÑÄsÅê 2Çb 4Ç%kZºT5·Ç€jk)DÌ#&ƒXwÓœÆèf0ÇþªQÂÏš‡ì¦Í„´êD+̹S±v£…m´V’ØnŸ²˜´l1“A4¦©™ÒÒ¡4Ha>bÚ¬´1bóšY™!ùdÖ¤mÉèE»’fö¾fé)”– ¦ûvʉ:4·í³H±lE3ºÎ̇óÒ·ÎM~; &ÍÚˆXu¨j†iJz˜©ÚÅãû1Ë·€ã{5ÿø5N+:4‚a«ÒÆøÐÁ»ŸÖ©CD“>¦9ðÜYÓŽÖƒIœ?^_im†‰a-mv:$æBt­F>hÈ+ÄÌWöqlͽC‡Ùé3ˆlóéÝÄÓàÑ™ô%`Ñ#£é’ :•±âþ`tI»™ÍO1Ÿr¼]bg§›ƒâX]ÒßÝ‘ÔùEH’™òÈ8ÌRšp€Ã##ÅøLà9Jr׉G³÷{Î=2€@˜‘Ýa†fÇ#c@ :÷È@šÎ#CC¤šáór–<2D?žÃÎ=°áÌW2_ú,Õ!h•åUY¦çó(ËÙÚ æçX lLâ÷‰;™ p^*—!wœ:`h•°IN/ Íf;~¾@Ý»d>fH] ¢Ípu–“fªWÇ™¯ÇÄÕaÐQRØÜ z¼¤ +Û½˜nÉLÕ»0ÞE +?ã<èdÌ;-1É<lÅœ:6Îúýcvðp¤,è‹/·ñppðp¬ U÷ðpÐkípràá7‚RA\öñpšl(ù7!·ñpú{GEDœÛx8Ó[\ÁÃi"V©–öðpz[ŒÖH6çÈzxÀ¹– His"iº%ONäí’+'ÒlïoæY§j@%H8G£#:q³Ùç¤Ãƒ#¡Rõ1DÇ$—!“‘o.Ñ ¸Žî3æ;cµl(Ï¡UÔñZ™L„nR½=Ã['ÛPa^§Ûc^+C’cÔm8úæ݆ mòÛš½H\hîÜŒèXÛ><2 ã +²™â;ÅLéЯ¦Ü¦EK³6^ lzšÖ+­»­17ú° øŒ}±“©A­ RÓ>» "ؘi ÛB¤N|c)'"uâ{åq˜@ý\A¤>®ÜA¤B:n R!^Ì9"Rq‘ +éð]­3‰Iy}hƒÐ/MµœdIH³¯Ý†CÇÛP…#Ë1·¡p(ŸŸ™ÑãŽ8/®Cáìû-µcÛîìJP8ü"†û(Á«ð P8²ŒÓ>±C\à÷'³€OïÔ\UžáµúX#ibñ&zARy."‡£ßlgQ‡1\2l5¸€¡ÑGœ!Öí¼@”“Ž<µsp³W÷H½G8ÈÞQÂñ î_X5.NjOšTâ²zþÞù¼Œ›þéO«]>·oª­ÃÔ6$û¦V¡²áÍûÖúð¨[¸é5êÉ?F=u‹\ËÇQðSÛeÉã¤Åb‘PgÐJ’0JtÜYé²r//-ØmïÏù)î|ÆÍ¿GƒûÞ% a— Y`·iŠÚ¨Ð¾©³vÁó§Z£/ŒF;‰2Ö¨‹U‰m0/œì–¾÷•Ê„:˜/Ì»¥“ºFµõøö¾h»‚ß¿*ü<ÒÀn,ÔÙa·¼¹¡6ºÛŸ½OiÎØõø.‡ôF[g*{‹ìÞ˜Öè¥a‡flXiÔè•´Î+œßÛ#}Oô*h¾™{ìsQÌE.ÄïIGg¿@PDÏd+©ÚþùÔ¨,ß1GÊ­Vƒ-ıhbD»Kw =æªz¯ ½ŽÕŠ£KX\ŒÑ)³äT³<Ñzu³’©ìáNï«’œ%/ÜC“;EÒ ‰î„´×gVDŽ™×Ç¿žLŠÈQÇGªûfVl„w|浸™nVgDw—šƒúqüû¥3£"¢¦»ò c{zí éìùa¬¢éHv€\‹Ó=4çý0Ñt$Ÿ ~¿8GÓ‘°tv‘t4ÉOδw‚¦Ó°EÚ³ÄûÇ¡éH¤Ln±¦³y"[DÓ‘â4ÊY階„¥Ãí}wÐt$,gn4É×.W`wMGš]äéuMGRnðÜQwÐt$,å¶yh:c—ÞýtMÉ.šŽ¤œz‚n£éHóGȆrˆ¦Ó“2­)l MGÓ-ÝEÓñsÌ šNGJw Mg‹c–ÑtLŒ•kh:2¶Úm4‰hÅe4)Z¢ËwMGZëÕ 4IdÄ%4ùùâšŽÄ Uw Mg†ärMGÂÒQëñ97ª¨©/féê&z/c‘J}mNàÓÊd³k˜Ÿ[ÒjÙدWgèÒFyÜ®WG×.øø´…,ñIå’&b2M Î% (PPÏ´NéºÄ+ +8ªËiS¶º9:e©ì2«KäD +ª„að‰Qv™"2á)¦µˆjéÞFgeåo“ÂælÏœR-‹UèÎq™;ìž+N•ÜN™;ju¹.¬g™;’‹HÇ• ÁÎOV Ý9›«Îè›§Ê ÓKÅUæÎÔ£ã¸Ì¤Ã° Ý9.s'bßL +Ýñ¾O\¸ç*[¤Ù“ȳ8q-EéûDU¹mcyÀÐ"¼ë“åêLsÍÖ'„ÑAã™éçÒñd4{̆ô$n|!h…‘vh!‰ r‡êúÓ®d¾ +[ eH'‚—¦RÇLºŠïé\|Ùvi²¡À¢2ÉçΆ¤LóǸ³¡1¾Œnvb3’}® ‡B`EAÆuàÒìsÒáªíJ¢‚ev]»±’ˆ6Dz#b\ÀZZ =°özaÖ^/Ü»s¥1Zc ·< ?»¨¬¼!±Ò´Þ++‡:j éB$ž1ƒši‰Ór¨g›¹+Èåæcëš„‘TÿÇ­ +†àÁ=D̽÷– +UÓ¢o°ðšcuB¤ÂÊê´@Ç…[D:N«U‹TäMHºáÐZ®ê€È`)‰¶á-Ëï¸ÂŒ¯¤Õ¸³± ÉvëV[«pÇB>:؆òB“*ܹR)ÏOÄW)Ï)žH©”ç|2*ÜiqI<ø;îXõ^a;ëîxo5‡è'çÀÚÇ•ªæЬWn`- f®æxx±6=`­ù˜wê?‚øÂS"ÚÚ=WˆŽ ¹i¸#ÒqÏy*ðÙb¦tèXXˆÉcvÍ*—gßN1áQQ( â†mX ›L‡_K®ûÆ câ1…žõ–(vŠñÀ˜´ƒ4ñª¤”y¡Â˜*a.„:ÓlWve%̳+y@L¡ƒ…^ù¶kW-˜hD°v"㤵¦% ¯ƒ[ùuŠ!á²ÄáH¬áƵ‘¤ß*í«é,•{D¬¤ëc#÷®¦¡è›K×õj*ë:ÌëÆR¹G“Jy)›Wl*i¨gsŒ+è7ê™…q•<@p"úEr{²êo݃›æ<ݨ§zwMÿ¬wí 6k±ë›ƒåK¬^u.º¯=|lO3¡ª¯)<ȵ‹ùŽ¥WÞYí +oTƒ‡ó7þÛÑîªÒÖa«4F<\„Â[ÿ¼TÒZ™¬ƒá Qö¯à¯"O4Þ#µQ0_û;K«Ðñߨ†Ž_“o´:lµQÉ¥2ø"ŸÁÕBÓ6¡â®ZG0«C9Fµ‡OR£ž d°¾æœ†7Ñcÿpöžì_P-øƒ¹³æ‹êƒÕ#âÆŒF;½ÑÎ¥ÿžÔ(ªûVêj •úF¯XuOné¶Zƒ¶&³ 4€ÏãÊ+ „ù=HigŸò½lC ~ÇW +/ÑÊÅXe¹m©Ç$ó(§W:•`äíÑž †ŸX9è8Ó&Só ÒT13Oœä8›í=°ÉÔCB‡$S«¨]‚+™Þ©´ÉØ´q«2 rèšTfáõ$5Ù©UÔ©3Tf \[IAc¡ît7O:@¥™dhŠ\òð­']ÐËêø¯5ÄÝY®²Hé’!KK¿_¸™n)KËduŠî'¶Ö% -éyZR ¹±:qÕz¬FµÁë–±fŠ=SÐ>æ¸úÚÄûÜrëòÆQÂËwÃ!‰é^æò<·œÜD«b WÆÙ»‘CÖ–îµ~nÙô,koÑ„(@§—ВâÅ̬ã]q ˆìÓ&B¬“¶¥zt ÓvÍFž´õÆnÔ[ÜÑö1ŠX™—¯ÓôLïç7wÙ¡z|T¯JneH ˜—ÖÖõJí§ÐÁ´$3Ô³pP–d²„±*[ºçë’ÿ2í°|Ǧڸ¦KXª¾­Æv­E(à<ÀåÄï¹b@ÍJ›ÌŸyŸvÌ:Ü‹AWטXeÆ1³*:!=º–ALwª8ã˜)–‡ÚÈ¥CŽ™Öӱı~î‘BÌ&i‡Çl¢y1€Ü÷Ðb\@Fv: +hô'[Aòbñ­£y1€Èkm¨Y* SŸk È‹„³TùÉ–ZŒ•U /P±‘m¡)]2`ñx¥Ø㨜åã¯Èæ¤(6–_,Êgð*üJQ>³Šlîå1#lÅyQ>O º^”ÏXù7ŠòÑë#»Y”«~¥“¢|¸Wvª@í”Ä"3h0½ªŸó»¡znÜ ÅY×ën(Çuý°¡¹p7­®Ÿµ<%»uýØUýlÝ E¨ëÇö +‘-qëuýÈ‹y7”º~æ+Ùº~ìÌÅså°®Ÿ’Ë%‡.³ªŸ'hÉ¡K­ëÇšÎwa»®Ÿ¦#†ª~6*€ëú±DÊPµS×GdÝjÎÏn¤,ñ.huýØ7)1q‡uý˜]b.Ôõc»…-Ý@ŨëÇ6u‰YÐ6êú‘`’êÖsVÏÌ»¥º~l*ÐÏïF]?v@ÅÃMÇ ð]Hµ[× jbUýðê ‚ƒº~ºm(h«úiîì² O”º~¦¸WWêú±«ú)+Ùa]?vÂ5†HuT×OÅo‘Ö¢îž+ÛuýØ D¬ uý{m3ϺT/ʦÂ]Ϥœw=>Guý*ÄícÍa¨ëÇÀ=˜fÛάÖõckòðÆ7êúÑÎð[c$Ñ~‹C—#‰fÛЬ®;Þ¬Í"°_×OËm½µh·Ÿµ$ z=>¶RÕÏy=>“Ùí Æ\ k¥øôˆTguý4ŽmCU?1ä¼®Ÿ•bÕu\×­æPÖ˜åº~ìª~Žom’êú9ôõqÖõãÀ½ºP×]ÕÏr=>[(\´4Öõ³†Çªúa­8ªëgt%ãUýh·œY­ëÇNïÒb¶ëú±t>%Ûuýó‚Uõcß Ç_×ϾßRË1ë˜'Š]é ®Ÿ*¸HUýlgêêú1WVÄY]?¶b(Z¯Îëú±±Ò‰ì¸®Ÿvúª~}Œû&+m]?º$ê0&7YqÖõãÒa×õÃgÒÀa k)û“\×}80Qœ®bÅs?E8îY:Úù€œñ¡¿Wê]¼QQwV‚Oé®]v⽶¨YMòS£7Õƒo/ú¦¤¦Âš2¹T#¤Îg…ŸgK´¿Ø·ÌæÝ Ž•ž7öpRÃyQüÄSy§Õã¤^xS¾sÙõ{¯]ý|*_¢áÄW$T_Õ…îÛÙ‘õS/x'Ó,xõrÌ—öº»§ç««üj>zð‹ùdîOé´=Lž$×Þ|¿“{©_͵éõiáîýfv–_݆gwG‘\óÃwsu2¯|î—³Zx±WÁõá¢pæ½;«…Ùp§üûp|ùy÷?ä–³Š´÷¶³:¸¹¾õ&cχÞÌÛê6¶Ÿ  +íúI]hÿýÓ:…Ý«õú¥^oJwÇÿsáu“}¸P–7±ƒTâ.™í—}2ìí#µÞ<.a±¹²_ÄVeˆ_ºwß—þ\~CƒZ) ëIþ¼¤ƒÑ£Ã~Ä,Ä 0Üí.œ—lÀK+B4†'¡Ù…ÿöþ¦X¬SíÝLîíÇÿ9õN!’´'ƒC½?ñïÜÌW;] L¢÷¨}s³)²÷/–Z•ý[·}ÀÐ.hNõ·bCbćj!Øøñ›÷íÙÐl“´Íúj~´F–“Ú†a6Âx+JâT>’_¥ÃÈw 8R\€·Å(Býsü ÞÄ‘„ñ‡À)ö°4’òÛ©v+sZd»B¬þ´ÃÝããt<ôþÕú3_•…TµA…{JGé½Æ¿I* Ä°“@ãÀ”5ê£Lý~P“+íàí%Çï2cÎ"@d,çéNß7Q>‹©_öÓçäåQ£Óù®𳔤åψ2úJw ý,`G'‘­ ¼@^F•Ž‘ |ÖŽC.Eõ=«Kž^(KPΕÀ¯Ïï.ÎS¬\©s1H£ßdå¯-xûM^ϳà·7±XÕ¿ï‡Oc ä—õU¶¼¨­¼vîÍÔd·ò¶ Úû­Ü‡ï OƒK\µ•õ[E—A =OÐ&EEŽ(Fz¥Ër©Ó> ÍnšÇÓ¯$§GÃ4šS4–›Œ:™ÈçØ/­¢Ñ$§ }ZÙ–¥ñzž@‹]Zº¯ƒ”´Ø_‡Búµ¯ÒÒr}}Î@»ò8fëu’•_Msˆ„4µó+D1ÔOðv˜’~=äWÏi¥7¯àŒëW¥Þ̧YlW¾fž½Ùq{y8ɼœ®‚ÒXæ_´»³õR¶´7{Žüm¼ÚçõÏ’¿„ÙˆJ™Mq@ê1¢úÇÀÆ&•þü‘ËöYHwÒ‡aðj’–_M3ê÷€ª}Æ·ýÈz“ßÞ¶£‘ê^ñ6á;³ÿr,ãZ…¤SZ:Ùë@y‹µ$=C¨Øi°®C•Ýe&׺«¯nHŒB?L9ŸÛ—Åãw <:í5&çàÁA­]\MO=·º +|õõ÷HÛµ÷%Í`:Tè`M÷"h)1> \¡°KBño7ðyJ‘ àmq„"2#ıF(^çmhÓ¬¤9Í&žæœß#ùv-OYq_Ô‰ÿ*DîßçÃGIX+à(F¡VwÁEky oÅ;º%öi?Ý' QöÅßRÍÞþR"³­®' fæŸõOߢ­™po£©ƒr3™i&bBªs“, Yn¡Et—$ì[(gIñm7p(7Ú9 ³"ÙÀÞÛ‘´7:ƒŒt¦O\IZŠÏUG4Á#¿ k³ ú¨ÐU¥ô#jp»ùeScÅ›(¼¾Æ‘üðj ¿~«¹çA$ÁIÄÿµt$b@­¥¨"ÝL¸<ʪÊ)úÌôùªµŽ0 .šëõÁ2Š«K`õo|ívP%!Ì|ù”ŽÄpxq¤øÖèOÈÙ0ädzëq/‘ÝÝ{HƒÉiÆáÉ&ÚÐè3pÈÜ&ÅÏž6ã,Zìòù9Þjt°‡Ä‚Ι·KE'|B•‹%…Ó†jµ>iïÈ©êYôð.:‘µ°ƒŒ¬€‰7Q€ƒÞ—ëèÊJ#í"¶çåÇ õŠsÛ<ìÂíì•o)û¥Þ|Îp3e_H«GNbòõݧ¤ïc¸kÝòç%™@ªŸñfŒæï1‰ Í͵„Gœ?ç + tw“Ä0mü=ú°Î¾b÷”¨LhÜOŸe&€Þàª4”:&,ˆdmõ§ÖX-1&ÔÂ͵È©Q¹Ò9šÈ6  xH‰f‹çs¥{æ'͹RêÂz—©–È‚u}ô ² ü¸zT×6?Y¾zW©ÐþBZJ:Z1ÒZD³ÏµÕˆ‡õ>¨YÐ’·ÖÁ0’Ô-…¤%Ï0볡ەqœ™vÖtts§˜H`]Ígu'rÆ鉓ú}}¬^hIp/*]Ti™I:ÜŸºrƒKKÖI”áÙâli™Ik)jO•LVµÎ•{¸mºèÑãn-wîÂÈŠÀ,ÈÖseYjPë;Ÿ-$Ãv8OdÆÝi\HMV döBXòˆf_¶6ð!cHvùC(½ Źˆh2·—àm%&z¡ã¶Œfñƒ§Í ¹ÎBÙÀþþ r˜@£øM¶O.[çOÂ4®ÈîÀJs!*#ã˜æ wÑhìaÕA“Ž7ÔöÒ¸O°¾‚çËYÿl~UŒç¸ÆFñTy”D^h ¢;¢›hà y–³ $£ØÅ]ZÀF.BÉ¥uqœPfÆ‘E—ÏE?)úá­à핸øš¦ðíP$›­Ý€5…f-HF$×Øèq;†{cGçI©kn)=ÀD&ŠW)ª›KSÁŸâ@P)•ÆÑ`wï¥ñ^<ù>º9Z܉NÇúCôÍ©'˜‰üþ“gã&«zɳµÛïºìBìÇ1ߢè={½}è0“*"¾šønEW#`ùuT|U¿ÏvňÕ(óô³Œ^I¾Ü×·¼èGøóAZ˜i0k%T/)h…ÅWÐû-»'Ì·¨ø¾!Çæo9Ùz¿Ï+cy;°Ýµê†©0âÜk‹ò.úûøjÜ>¤Ðfý>ŠŠ¯Z½˜ø +ë÷ö-‹>“]xo +÷_ÝÏæßàææp¿6ÌÁ]9üÒ¬¶ÇyÙ…¸„á½Ô®(š$—ÞéBréÏ¢âJVØVGp+’8ºkM¤Ù‡©NPèwÃȉ÷ð$êFŦ`â™äèÊÄ•8F…/Q”I‡ŠS."¡òí”.çJIÉ £Õ\^#‘ÔI/4RàBŸIÎÙêqJÈ¿žˆõ^O’¸Ãï»!ȾsÕý,zÊDÎv¢@ô|Tc("®ƒÎU¼‚b¯’`î´ÑÂŽ ›'a³¾ØlL € ç^¡¯º ewo6pùUO±XNïKàOêêçs¶>_ÿ{û·Ø‰{ö<©£ãtz°˜.ÛëÙìfö¿ÛæòÏÏ×l±Ý©ì¤Ž®ÇÇ¥|sög9íÄÅXFQY¯qi’œÀãËšlª=÷«7ÿ–;ó®ÿê`Òü+Œª˜xAîŒÐ÷ÍÊÿ»Õû“ zããéƒ7ži_{ÃÝM¾‰.edÆ('ZÒQs¶®ÿ´b§ý»æɱ÷Zû+¿Üt<ÁÖ]}vu˜Ú¼í§ºG÷'Íûöíõaj+,E/µÎ*ŽT A"Öëuf»ëìŸå¼‰TèF®›`,f)åGá§=oìÒwÇwÔ¼‰£ìÔ?v½Ñ• ð.rw31ñTÂÎöx,OóÅRË\§ãooUÑ{.ž"sŸx²ˆâN'S¢Wlº°ôêcOÎnDÚo¡Ô$»1ém%œöx 3½û9‰ÄßAe+;Öõ¸Æå’…¸¢U’‡WÄäªÓZ¿· $ÛJý o¹ÓÀµŽg¼íÎq¢@<"ÙrëãGÜÈSÎWŒ)QEQVÿN\Q•ßžàïÅUz¢>ð;qŘUô/®¨FÕ£ûqE5ªÆòkqE5ªˆí×ãŠjTÇ’¸WT£ŠžàïÅcJTåÉüR\Q*"4Á/Å5™¿W„³vŠ”t‹#®†XWBÌWŽ¤Ùæõ‰ØòÛݘ6û屃ëÖTÃýÙÕÅñÖëý“;Õ#iܼæð¼eô©Uø9•I¼õ$~^/VxÀñ>Óӽރї± h‹š‰õ‚Üè‚öôfT×bÀFJ¦Aœ¥\{ÊD¾êE¨l‡QžÌ›Õ’ˆôéd•>›ûbÐÞT­©†óP‘ç CɾYm JD²Š±¸½¯+5 ‰‡¡>g´0”ê[=5²ßŒßõ–\ZGjn©¾‚3@bÂacrûHLÈ¥bJ,öf®²@¼æŽÔÆdI¢×7l‚ìt¥d‚õâSb“­¥{g1Yñ&% i9B’VŽ–jcÛÜ$ÐõÐækQô›‘I`¡e[}P‹MèCÎ-%ֆГЅ‡-φxî©kZ‰/óÙÃølàۂδ_p*3éèUæ ™DTO@åƒÚµš—|R¶Ðm^¿*E*ÚïEÔÌ ¡}S¿T96zÒM5‡ƒw¨2×þGB’·”5æpLJq>Ø\cøé× bXc´d’' ý0ðí*³’°ÆXœ°4*,Ï?ÂÅ F"øŽ·—Y¡íxžéíʈ:öU?Œ¬”Ï6 lBí¤Aïœ2¡6‡A\º>€±0{Á±?½¡æã¥D ³yÖåD¶Ã‰¨º*Ù}PNdc/t'‘õ>¨«Ò®´Œò¬JåB{_EÙë’£À N«oáÛVzêÙ@¥q"Z“³YJò (Õ…¬øU/¢œ…û~DÕ‹=Š¿åGTŽýšQõ"*Ȉ_ð#ª^D¸_~Ë蚀èÒï(ø?¢êEôϨzEôÍïøU/¢çýˆªwݶñK~DO¨žû¢SGâÉÁH”&JÔ5*{¥¯LVP ¸T.¬Â¥”È`Þ9½‚âÉhW¢¸"&Fˤ”ãpè}’(%û"Ž"Ä©ÃmR¼îá_¼CN+ (Z=ÒUÙÚíÙ‰tsˆú>HÎDôBkL'¸† È,1®Tˆ¹è¨‹?gJƒÇR¼í6^æGS<8Þ©DTW˜ºRZäbg†±¤·ó˜<€'HAlþ¯êÙóa¸pÜZLñP¡'Ÿ\϶?ßð ùq}ööoÑŸüw¶ö¤wÄøÿË;éLi'“σ7yøiÿÕFßÝIGvú Opœ:Zo›ÿþlÿ-“õw*ð£áipÜÜ©ìˆßƒïîí„Ao„1ø6xñÉqz'U_.?á“ëöÝNë¿—ëíŽHþf¹Ó¸¾6ÿÞí¿Í¿×Ï™æû`äc°sþþÇóþwîviXðßpâ¤q‚ïü¼éà£ÿ줅Ӈ'ag +åÉ’éB.½“Hç’åR±´óå)dwÙd:WÌvúžB9YÊæËêúÆßô==QГd© EÀÎd)W.”ËàE±TÎçJjo&ˆ|.™+§‹°­R²PÌä©l4¨“ÙL±€„ý¤ïiƒ‰l¢ÒÉ’-¦0…‰t>YÈ—á7ŠiüþMý;Ðíg€Ø7œz +;áÈÎððW-Ç8Õ/ð^ûÛàXÛŽöûðýô4|´X.vÒÙ"¢L™­R.™É>&Ò…d&“ƒ#* IA@ ¦“eqàÊGðÿb6?R~˜,ó%8eÈd4ÞåÁdb?T>RÉ«?”:Ñ7öËÒD—Êɲ €•“Iæói0£_žrLw©{’Í”!=åБBQÈÁVåß^ær%iœù|¹ ù6‰º«þPþH¡®üNîBßØ+yEñçsY8…ýÙd9]@oÀz*6à ˜[0ðþQ:iÒU~!1S"†ÞåõßV>QIbíëÞ°W)Þ0\¥Æ®aŸ©Íá?Do5M‚·Æbb´µCÕöG¿ +¨çýº(›¤Fb.‘bûbò6»YOþ}Iý¶™üÏlg²X,·“íì<Ùy[Ï6Ûåz¶³y_þ~~"Èüó¶çÿ`q_ endstream endobj 9 0 obj <>stream +H‰\Á +Â@ DïùŠùÍn²mÜ^]ÅSñ +ÚC+HÿŒí¡"s 3“¯±¯ ÇSÅzOÈ*,ËâÅ­çBo7’K ,Ö2'QÅ0Óמɸdƒ—If;¨ô ÛZJrGucé,ï˜P|¹´æ«¿óè… l¥x«]éA”[Qÿ±=÷þÔG€¾- endstream endobj 6 0 obj [5 0 R] endobj 21 0 obj <> endobj xref 0 22 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000040616 00000 n +0000000000 00000 f +0000041629 00000 n +0000114677 00000 n +0000040673 00000 n +0000041008 00000 n +0000114457 00000 n +0000044611 00000 n +0000041928 00000 n +0000041815 00000 n +0000041337 00000 n +0000041699 00000 n +0000041730 00000 n +0000041963 00000 n +0000044685 00000 n +0000044859 00000 n +0000045862 00000 n +0000050602 00000 n +0000114700 00000 n +trailer <<541FB325E3D04902BB3E4F40DCFE1B05>]>> startxref 114876 %%EOF \ No newline at end of file diff --git a/img_old/bg_vertical.jpg b/img_old/bg_vertical.jpg deleted file mode 100755 index e71bc82..0000000 Binary files a/img_old/bg_vertical.jpg and /dev/null differ diff --git a/img_old/icon.png b/img_old/icon.png deleted file mode 100755 index 434f30f..0000000 Binary files a/img_old/icon.png and /dev/null differ diff --git a/img_old/logo/logo_full.png b/img_old/logo/logo_full.png deleted file mode 100755 index 47415d8..0000000 Binary files a/img_old/logo/logo_full.png and /dev/null differ diff --git a/img_old/logo/logo_full_8bit.png b/img_old/logo/logo_full_8bit.png deleted file mode 100644 index adba35c..0000000 Binary files a/img_old/logo/logo_full_8bit.png and /dev/null differ diff --git a/img_old/logo/logo_small BACKUP.png b/img_old/logo/logo_small BACKUP.png deleted file mode 100644 index 372b5ee..0000000 Binary files a/img_old/logo/logo_small BACKUP.png and /dev/null differ diff --git a/img_old/logo/logo_small.png b/img_old/logo/logo_small.png deleted file mode 100644 index 1ea8163..0000000 Binary files a/img_old/logo/logo_small.png and /dev/null differ diff --git a/img_old/logo/logo_small_8bit.png b/img_old/logo/logo_small_8bit.png deleted file mode 100644 index a2c0189..0000000 Binary files a/img_old/logo/logo_small_8bit.png and /dev/null differ diff --git a/img_old/logo/logo_smaller.png b/img_old/logo/logo_smaller.png deleted file mode 100644 index f000e5c..0000000 Binary files a/img_old/logo/logo_smaller.png and /dev/null differ diff --git a/img_old/logo/logo_smaller_8bit.png b/img_old/logo/logo_smaller_8bit.png deleted file mode 100644 index bd85479..0000000 Binary files a/img_old/logo/logo_smaller_8bit.png and /dev/null differ diff --git a/img_old/logo/logo_smaller_wide.png b/img_old/logo/logo_smaller_wide.png deleted file mode 100644 index 25ae4c8..0000000 Binary files a/img_old/logo/logo_smaller_wide.png and /dev/null differ diff --git a/img_old/logo/logo_smaller_wide_8bit.png b/img_old/logo/logo_smaller_wide_8bit.png deleted file mode 100644 index ef193ab..0000000 Binary files a/img_old/logo/logo_smaller_wide_8bit.png and /dev/null differ diff --git a/img_old/logo/logo_smallest.png b/img_old/logo/logo_smallest.png deleted file mode 100644 index 17f2799..0000000 Binary files a/img_old/logo/logo_smallest.png and /dev/null differ diff --git a/img_old/logo/logo_smallest_wide.png b/img_old/logo/logo_smallest_wide.png deleted file mode 100644 index c3f2fa1..0000000 Binary files a/img_old/logo/logo_smallest_wide.png and /dev/null differ diff --git a/img_old/thermo_bg_2.png b/img_old/thermo_bg_2.png deleted file mode 100644 index 8e3a979..0000000 Binary files a/img_old/thermo_bg_2.png and /dev/null differ diff --git a/img_old/thermo_fg_2.png b/img_old/thermo_fg_2.png deleted file mode 100644 index fc14ec4..0000000 Binary files a/img_old/thermo_fg_2.png and /dev/null differ diff --git a/img_old/webpage_icons/apple-touch-icon-114x114-precomposed.png b/img_old/webpage_icons/apple-touch-icon-114x114-precomposed.png deleted file mode 100644 index 50e1053..0000000 Binary files a/img_old/webpage_icons/apple-touch-icon-114x114-precomposed.png and /dev/null differ diff --git a/img_old/webpage_icons/apple-touch-icon-144x144-precomposed.png b/img_old/webpage_icons/apple-touch-icon-144x144-precomposed.png deleted file mode 100644 index 585036f..0000000 Binary files a/img_old/webpage_icons/apple-touch-icon-144x144-precomposed.png and /dev/null differ diff --git a/img_old/webpage_icons/apple-touch-icon-72x72-precomposed.png b/img_old/webpage_icons/apple-touch-icon-72x72-precomposed.png deleted file mode 100644 index f422615..0000000 Binary files a/img_old/webpage_icons/apple-touch-icon-72x72-precomposed.png and /dev/null differ diff --git a/img_old/webpage_icons/apple-touch-icon-precomposed.png b/img_old/webpage_icons/apple-touch-icon-precomposed.png deleted file mode 100644 index 333520f..0000000 Binary files a/img_old/webpage_icons/apple-touch-icon-precomposed.png and /dev/null differ diff --git a/js/AddShapeDialog.js b/js/AddShapeDialog.js new file mode 100644 index 0000000..5a1ebce --- /dev/null +++ b/js/AddShapeDialog.js @@ -0,0 +1,78 @@ +var shapeResolution=3; +var shapePopup; + +function initShapeDialog() { + shapePopup = new Popup($("#popupShape"), $("#popupMask")); + $("#btnShapeOk").on("onButtonClick", shapePopup.commit); + $("#btnShapeCancel").on("onButtonClick", shapePopup.cancel); + $("#popupShape").bind("onPopupCancel", onShapeCancel); + $("#popupShape").bind("onPopupCommit", onShapeOk); + + $("#btnShapePlus").on("onButtonHold",onShapePlus); + $("#btnShapeMin").on("onButtonHold",onShapeMin); + updateShapePreview(); +} + +function showShapeDialog() { + shapePopup.open(); +} + +function onShapeCancel() { +} + +function onShapeOk() { + var res = shapeResolution; + + if (res!=undefined) { + if (isNaN(res)) res=3; + if (res<2) res=2; + if (res>100) res=100; + drawCircle(canvasWidth/2,canvasHeight/2,80,res); + } +} + +function onShapePlus() { + shapeResolution++; + if (shapeResolution>50) shapeResolution=50; + updateShapePreview(); +} + +function onShapeMin() { + shapeResolution--; + if (shapeResolution<2) shapeResolution=2; + updateShapePreview(); +} + +function updateShapePreview() { + $(".lblShapeResolution").text(shapeResolution + " sides"); + + var canvas = $("#shapePreview")[0]; + var c = canvas.getContext('2d'); + var w = canvas.width; + var h = canvas.height; + console.log(w,h); + var r = w/2 - 20; + var x0 = w/2; + var y0 = h/2; + var res = shapeResolution; + var step = Math.PI * 2.0 / res; + + c.save(); + c.clearRect(0,0,canvas.width, canvas.height); + c.restore(); + c.beginPath(); + for (var a=0; a> f:postStepCallback() >> index: " + index); - - var dataset = $(this)[0].$li[0].dataset; - if (dataset.action != undefined) { - console.log(" THERE *WAS* AN ACTION!"); - switch (dataset.action) { - case "sayHello": -// console.log(" action: sayHello"); - break; - case "showMessage": -// console.log(" action: showMessage"); -// message.hide(); - break; - case "showProgressBar": -// console.log(" action: showProgressBar"); -// progressbar.hide(); - break; - case "showThermometer": -// console.log(" action: showThermometer"); -// thermometer.hide(); - break; - } - } + //console.log("GrandTour >> f:postStepCallback() >> index: " + index); + // var dataset = $(this)[0].$li[0].dataset; }; this.postRideCallback = function(index, tip) { // console.log("GrandTour >> f:postRideCallback() >> index: " + index + ", self.active: " + self.active); diff --git a/js/Keyboard.js b/js/Keyboard.js new file mode 100644 index 0000000..825e514 --- /dev/null +++ b/js/Keyboard.js @@ -0,0 +1,104 @@ +var keyboardShortcutsEnabled = true; +var keyboardEscapeEnterEnabled = false; +var wordBuffer = ""; + +var wordFuncs = { + "idbeholdl": function() { + alert("Light!"); + }, + "idspispopd": function() { + drawTextOnCanvas("Im in ur kanvas drawin' ur stuffz."); + }, + "dia": function() { + var cx = canvasWidth / 2; + var cy = canvasHeight /2; + drawCircle(cx, cy, 50, 4); + shapeMoveTo(cx - 20, cy); + shapeLineTo(cx + 20, cy); + shapeMoveTo(cx, cy - 20); + shapeLineTo(cx, cy + 20); + }, + "stats": function() { + var text = "Shape statistics:\nNumber of points: " + _points.length; + alert(text); + }, + "pdump": function() { + console.log("points array: " + _points); + } +}; + +function initKeyboard() { + + $(document).keypress(function(event) { + + if (keyboardEscapeEnterEnabled) { + switch (event.keyCode) { + case 13: + $(document).trigger("onEnterKey"); + break; + case 27: + $(document).trigger("onEscapeKey"); + break; + } + } + + if (!keyboardShortcutsEnabled) return; + if (event.ctrlKey && event.altKey && ! event.metaKey) processWords(event); + if (event.altKey || event.ctrlKey || event.metaKey) return; //ignore key presses with modifier keys except shift + + var ch = String.fromCharCode(event.which); + + switch (ch) { + case 'c': clearDoodle(); break; + case 'n': clearDoodle(); break; + case 'p': print(); break; + case 'u': oopsUndo(); break; + case 'g': settingsWindow.downloadGcode(); break; + case 'q': stopPrint(); break; + case ',': openSettingsWindow(); break; + case 'h': previewUp(true); break; + case 'H': previewDown(true); break; + case 's': saveSketch(); break; + case 'L': nextDoodle(); break; + case 'l': prevDoodle(); break; + case '[': previewTwistLeft(); break; + case ']': previewTwistRight(); break; + case '|': resetTwist(); break; + case 't': showWordArtDialog(); break; + case 'i': showShapeDialog(); break; + + case ';': moveShape(-5,0); break; + case '\'': moveShape(5,0); break; + case '-': zoomShape(.95); break; + case '+': zoomShape(1.05); break; + case 'r': rotateShape(.1); break; + case 'R': rotateShape(-.1); break; + + //default: console.log("Key: '" + ch + "' (" + event.which + ")"); + } + if(event.which != 13) { // don't prevent enter usage, it's used in tour + event.preventDefault(); //prevents the character to end up in a focussed textfield + } + }) + +} + +function processWords(e) { + wordBuffer += String.fromCharCode(e.which); + + var match = false; + for (var k in wordFuncs) { + if (k.indexOf(wordBuffer) == 0) { + if (k.length == wordBuffer.length) match = wordFuncs[k]; + else match = true; + break; + } + } + + if (typeof(match) == 'function') { + match(); + wordBuffer = ""; + } else if (!match) { + wordBuffer = ""; + } +} diff --git a/js_src/Message.js b/js/Message.js similarity index 100% rename from js_src/Message.js rename to js/Message.js diff --git a/js/Popup.js b/js/Popup.js new file mode 100644 index 0000000..82d3993 --- /dev/null +++ b/js/Popup.js @@ -0,0 +1,45 @@ +function Popup(element, mask) { + var autoCloseEnabled = true; + var enterEnabled = true; + var self = this; + + this.open = function(complete, disableMaskClick) { + mask.fadeIn(POPUP_SHOW_DURATION); + element.fadeIn(POPUP_SHOW_DURATION, complete); + + keyboardShortcutsEnabled = false; + keyboardEscapeEnterEnabled = true; + + document.body.removeEventListener('touchmove', prevent, false); + mask.bind("onButtonClick", self.cancel); + $(document).bind("onEscapeKey", self.cancel); + if (enterEnabled) $(document).bind("onEnterKey", self.commit); + } + + this.close = function(complete) { + mask.fadeOut(POPUP_SHOW_DURATION); + element.fadeOut(POPUP_SHOW_DURATION, complete); + + keyboardShortcutsEnabled = true; + keyboardEscapeEnterEnabled = false; + + document.body.addEventListener('touchmove', prevent, false); + mask.unbind("onButtonClick", self.cancel); + $(document).unbind("onEscapeKey", self.cancel); + if (enterEnabled) $(document).unbind("onEnterKey", self.commit); + } + + this.setEnterEnabled = function(enabled) { enterEnabled = enabled; } + + this.setAutoCloseEnabled = function(enabled) { autoCloseEnabled = enabled; } + + this.cancel = function() { + $(element).trigger('onPopupCancel'); + if (autoCloseEnabled) self.close(); + } + + this.commit = function() { + $(element).trigger('onPopupCommit'); + if (autoCloseEnabled) self.close(); + } +} \ No newline at end of file diff --git a/js_src/Printer.js b/js/Printer.js similarity index 97% rename from js_src/Printer.js rename to js/Printer.js index 75e8362..910456b 100644 --- a/js_src/Printer.js +++ b/js/Printer.js @@ -158,7 +158,7 @@ function Printer() { var firstOne = (sendIndex == 0)? true : false; var start = firstOne; // start printing right away - + var completed = false; if (this.gcode.length < (sendIndex + sendLength)) { console.log(" sending less than max sendLength (and last)"); @@ -191,9 +191,9 @@ function Printer() { } else { // only if the state hasn't bin changed (by for example pressing stop) we send more gcode - console.log("Printer:sendPrintPart:gcode part received (state: ",self.state,")"); + //console.log("Printer:sendPrintPart:gcode part received (state: ",self.state,")"); if(self.state == Printer.PRINTING_STATE || self.state == Printer.BUFFERING_STATE) { - console.log("Printer:sendPrintPart:sending next part"); + //console.log("Printer:sendPrintPart:sending next part"); self.sendPrintPart(sendIndex + sendLength, sendLength); } } @@ -271,7 +271,7 @@ function Printer() { clearTimeout(self.retryCheckStatusDelay); } this.checkStatus = function() { - console.log("Printer:checkStatus"); + //console.log("Printer:checkStatus"); this.stateOverruled = false; //console.log(" stateOverruled: ",this.stateOverruled); var self = this; @@ -302,7 +302,7 @@ function Printer() { } } this.handleStatusUpdate = function(response) { - console.log("Printer:handleStatusUpdate response: ",response); + //console.log("Printer:handleStatusUpdate response: ",response); var data = response.data; if(response.status != "success") { self.state = Printer.UNKNOWN_STATE; diff --git a/js_src/PrinterPanel.js b/js/PrinterPanel.js similarity index 100% rename from js_src/PrinterPanel.js rename to js/PrinterPanel.js diff --git a/js_src/Progressbar.js b/js/Progressbar.js similarity index 100% rename from js_src/Progressbar.js rename to js/Progressbar.js diff --git a/js/SettingsWindow.js b/js/SettingsWindow.js new file mode 100644 index 0000000..4214c09 --- /dev/null +++ b/js/SettingsWindow.js @@ -0,0 +1,792 @@ +/* + * This file is part of the Doodle3D project (http://doodle3d.com). + * + * Copyright (c) 2013, Doodle3D + * This software is licensed under the terms of the GNU GPL v2 or later. + * See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details. + */ + +//these settings are defined in the firmware (conf_defaults.lua) and will be initialized in loadSettings() +var settings = {}; +var settingsPopup; +//wrapper to prevent scoping issues in showSettings() +function openSettingsWindow() { + settingsWindow.loadSettings(function() { // reload settings + settingsPopup.open(); + }); +} + +function SettingsWindow() { + this.wifiboxURL; + this.wifiboxCGIBinURL; + this.window; + this.btnOK; + this.form; + this.timeoutTime = 3000; + this.saveSettingsTimeoutTime = 8000; + this.retryDelay = 2000; // retry setTimout delay + this.retryRetrieveNetworkStatusDelayTime = 1000;// retry setTimout delay + + this.retryLoadSettingsDelay; // retry setTimout instance + this.retrySaveSettingsDelay; // retry setTimout instance + this.retryResetSettingsDelay; // retry setTimout instance + this.retryRetrieveNetworkStatusDelay;// retry setTimout instance + + this.apFieldSet; + this.clientFieldSet; + this.restoreStateField; + this.networks; + this.currentNetwork; // the ssid of the network the box is on + this.selectedNetwork; // the ssid of the selected network in the client mode settings + this.currentLocalIP = ""; + this.clientModeState = SettingsWindow.NOT_CONNECTED; + this.currentAP; + this.apModeState = SettingsWindow.NO_AP; + + // after switching wifi network or creating a access point we delay the status retrieval + // because the webserver needs time to switch + this.retrieveNetworkStatusDelay; // setTimout delay + this.retrieveNetworkStatusDelayTime = 1000; + + this.restoredStateHideDelayTime = 3000; + this.restoredStateHideDelay; // setTimout instance + + // Events + SettingsWindow.SETTINGS_LOADED = "settingsLoaded"; + + // network client mode states + SettingsWindow.NOT_CONNECTED = "not connected"; // also used as first item in networks list + SettingsWindow.CONNECTED = "connected"; + SettingsWindow.CONNECTING = "connecting"; + SettingsWindow.CONNECTING_FAILED = "connecting failed"; + + // network access point mode states + SettingsWindow.NO_AP = "no ap"; + SettingsWindow.AP = "ap"; + SettingsWindow.CREATING_AP = "creating ap"; + + SettingsWindow.API_CONNECTING_FAILED = -1; + SettingsWindow.API_NOT_CONNECTED = 0; + SettingsWindow.API_CONNECTING = 1; + SettingsWindow.API_CONNECTED = 2; + SettingsWindow.API_CREATING = 3; + SettingsWindow.API_CREATED = 4; + + // network mode + SettingsWindow.NETWORK_MODE_NEITHER = "neither"; + SettingsWindow.NETWORK_MODE_CLIENT = "clientMode"; + SettingsWindow.NETWORK_MODE_ACCESS_POINT = "accessPointMode"; + + this.networkMode = SettingsWindow.NETWORK_MODE_NEITHER; + + this.updatePanel = new UpdatePanel(); + this.printerPanel = new PrinterPanel(); + + var self = this; + + this.init = function(wifiboxURL,wifiboxCGIBinURL) { + this.wifiboxURL = wifiboxURL; + this.wifiboxCGIBinURL = wifiboxCGIBinURL; + + this.window = $("#popupSettings"); + this.btnOK = this.window.find(".btnOK"); + settingsPopup = new Popup($("#popupSettings"), $("#popupMask")); + settingsPopup.setEnterEnabled(false); + settingsPopup.setAutoCloseEnabled(false); + + enableButton(this.btnOK,settingsPopup.commit); + $("#popupSettings").bind("onPopupCancel", function() { settingsPopup.close(); } ); + $("#popupSettings").bind("onPopupCommit", self.submitwindow); + + this.window.find("#settingsContainer").load("settings.html", function() { + console.log("Settings:finished loading settings.html, now loading settings..."); + + self.form = self.window.find("form"); + self.form.submit(function (e) { self.submitwindow(e); }); + + $.ajax({ + url: self.wifiboxURL + "/printer/listall", + dataType: 'json', + timeout: self.timeoutTime, + success: function(response) { + console.log("Settings:printer/listall response: ",response.data.printers); + + $.each(response.data.printers, function(key, value) { + // console.log(key,value); + $('#printerType').append($('").val(SettingsWindow.NOT_CONNECTED).html("not connected") + ); + $.each(networks, function(index,element) { + if(element.ssid == self.currentNetwork) { + foundCurrentNetwork = true; + } + networkSelector.append( + $("").val(element.ssid).html(element.ssid) + ); + self.networks[element.ssid] = element; + }); + if(foundCurrentNetwork) { + networkSelector.val(self.currentNetwork); + self.selectNetwork(self.currentNetwork); + } + } + } + }).fail(function() { + + }); + } + }; + + this.retrieveNetworkStatus = function(connecting) { + //console.log("Settings:retrieveNetworkStatus"); + if (communicateWithWifibox) { + $.ajax({ + url: self.wifiboxURL + "/network/status", + type: "GET", + dataType: 'json', + timeout: self.timeoutTime, + success: function(response){ + console.log("Settings:retrieveNetworkStatus response: ",response); + if(response.status == "error") { + + } else { + var data = response.data; + + if(typeof data.status === 'string') { + data.status = parseInt(data.status); + } + //console.log(" data.status: ",data.status,data.statusMessage); + + // Determine which network settings to show + switch(data.status) { + case SettingsWindow.API_NOT_CONNECTED: + //console.log(" not connected & not a access point"); + self.apFieldSet.show(); + self.clientFieldSet.show(); + + self.networkMode = SettingsWindow.NETWORK_MODE_NEITHER; + break; + case SettingsWindow.API_CONNECTING_FAILED: + case SettingsWindow.API_CONNECTING: + case SettingsWindow.API_CONNECTED: + //console.log(" client mode"); + self.form.find("#client").prop('checked',true); + + self.apFieldSet.hide(); + self.clientFieldSet.show(); + + if(data.status == SettingsWindow.API_CONNECTED) { + var networkSelector = self.form.find("#network"); + networkSelector.val(data.ssid); + + self.currentNetwork = data.ssid; + self.currentLocalIP = data.localip; + self.selectNetwork(data.ssid); + } else { + self.currentLocalIP = ""; + } + self.networkMode = SettingsWindow.NETWORK_MODE_CLIENT; + break; + case SettingsWindow.API_CREATING: + case SettingsWindow.API_CREATED: + //console.log(" access point mode"); + self.form.find("#ap").prop('checked',true); + + self.apFieldSet.show(); + self.clientFieldSet.hide(); + + self.currentNetwork = undefined; + self.selectNetwork(SettingsWindow.NOT_CONNECTED); + var networkSelector = self.form.find("#network"); + networkSelector.val(SettingsWindow.NOT_CONNECTED); + + if(data.ssid && data.status == SettingsWindow.API_CREATED) { + self.currentAP = data.ssid; + } + self.networkMode = SettingsWindow.NETWORK_MODE_ACCESS_POINT; + break; + } + self.updatePanel.setNetworkMode(self.networkMode); + + // update status message + switch(data.status) { + case SettingsWindow.API_CONNECTING_FAILED: + self.setClientModeState(SettingsWindow.CONNECTING_FAILED,data.statusMessage); + self.setAPModeState(SettingsWindow.NO_AP,""); + break; + case SettingsWindow.API_NOT_CONNECTED: + self.setClientModeState(SettingsWindow.NOT_CONNECTED,""); + self.setAPModeState(SettingsWindow.NO_AP,""); + break; + case SettingsWindow.API_CONNECTING: + self.setClientModeState(SettingsWindow.CONNECTING,""); + self.setAPModeState(SettingsWindow.NO_AP,""); + break; + case SettingsWindow.API_CONNECTED: + self.setClientModeState(SettingsWindow.CONNECTED,""); + self.setAPModeState(SettingsWindow.NO_AP,""); + break; + case SettingsWindow.API_CREATING: + self.setClientModeState(SettingsWindow.NOT_CONNECTED,""); + self.setAPModeState(SettingsWindow.CREATING_AP,""); + break; + case SettingsWindow.API_CREATED: + self.setClientModeState(SettingsWindow.NOT_CONNECTED,""); + self.setAPModeState(SettingsWindow.AP,""); + break; + } + + // Keep checking for updates? + if(connecting) { + switch(data.status) { + case SettingsWindow.API_CONNECTING: + case SettingsWindow.API_CREATING: + clearTimeout(self.retryRetrieveNetworkStatusDelay); + self.retryRetrieveNetworkStatusDelay = setTimeout(function() { self.retrieveNetworkStatus(connecting); },self.retryRetrieveNetworkStatusDelayTime); // retry after delay + break; + } + } + } + } + }).fail(function() { + console.log("Settings:retrieveNetworkStatus: failed"); + clearTimeout(self.retryRetrieveNetworkStatusDelay); + self.retryRetrieveNetworkStatusDelay = setTimeout(function() { self.retrieveNetworkStatus(connecting); },self.retryDelay); // retry after delay + }); + } + }; + + this.networkSelectorChanged = function(e) { + var selectedOption = $(this).find("option:selected"); + self.selectNetwork(selectedOption.val()); + }; + + this.selectNetwork = function(ssid) { + console.log("select network: ",ssid); + if(ssid == "") return; + console.log(" checked"); + this.selectedNetwork = ssid; + if(this.networks == undefined || ssid == SettingsWindow.NOT_CONNECTED) { + this.hideWiFiPassword(); + } else { + var network = this.networks[ssid]; + if(network.encryption == "none") { + this.hideWiFiPassword(); + } else { + this.showWiFiPassword(); + } + this.form.find("#password").val(""); + } + }; + + this.showWiFiPassword = function() { + this.form.find("#passwordLabel").show(); + this.form.find("#password").show(); + }; + + this.hideWiFiPassword = function() { + this.form.find("#passwordLabel").hide(); + this.form.find("#password").hide(); + }; + + this.setClientModeState = function(state,msg) { + var field = this.form.find("#clientModeState"); + var btnConnect = self.form.find("#connectToNetwork"); + switch(state) { + case SettingsWindow.NOT_CONNECTED: + btnConnect.removeAttr("disabled"); + field.html("Not connected"); + break; + case SettingsWindow.CONNECTED: + btnConnect.removeAttr("disabled"); + + var fieldText = "Connected to: "+this.currentNetwork+"."; + if(this.currentLocalIP != undefined && this.currentLocalIP != "") { + var a = ""+this.currentLocalIP+""; + fieldText += " (IP: "+a+")"; + } + field.html(fieldText); + break; + case SettingsWindow.CONNECTING: + btnConnect.attr("disabled", true); + field.html("Connecting... Reconnect by connecting your device to "+this.selectedNetwork+" and going to connect.doodle3d.com"); + break; + case SettingsWindow.CONNECTING_FAILED: + btnConnect.removeAttr("disabled"); + field.html(msg); + break; + } + this.clientModeState = state; + }; + + this.setAPModeState = function(state,msg) { + var field = this.form.find("#apModeState"); + var btnCreate = this.form.find("#createAP"); + switch(state) { + case SettingsWindow.NO_AP: + btnCreate.removeAttr("disabled"); + field.html("Not currently a access point"); + break; + case SettingsWindow.AP: + btnCreate.removeAttr("disabled"); + field.html("Is access point: "+this.currentAP+""); + break; + case SettingsWindow.CREATING_AP: + btnCreate.attr("disabled", true); + field.html("Creating access point... Reconnect by connecting your device to "+settings.substituted_ssid+" and going to draw.doodle3d.com"); + break; + } + this.apModeState = state; + }; + + this.connectToNetwork = function() { + console.log("connectToNetwork"); + if(self.selectedNetwork == undefined) return; + var postData = { + ssid:self.selectedNetwork, + phrase:self.form.find("#password").val(), + recreate:true + }; + + console.log(" postData: ",postData); + if (communicateWithWifibox) { + + // save network related settings and on complete, connect to network + self.saveSettings(self.readForm(),function(success) { + if(!success) return; + $.ajax({ + url: self.wifiboxCGIBinURL + "/network/associate", + type: "POST", + data: postData, + dataType: 'json', + timeout: self.timeoutTime, + success: function(response){ + console.log("Settings:connectToNetwork response: ",response); + } + }).fail(function() { + console.log("Settings:connectToNetwork: timeout (normal behavior)"); + //clearTimeout(self.retrySaveSettingsDelay); + //self.retrySaveSettingsDelay = setTimeout(function() { self.saveSettings() },self.retryDelay); // retry after delay + }); + }); + } + self.setClientModeState(SettingsWindow.CONNECTING,""); + + // after switching wifi network or creating a access point we delay the status retrieval + // because the webserver needs time to switch + clearTimeout(self.retrieveNetworkStatusDelay); + self.retrieveNetworkStatusDelay = setTimeout(function() { self.retrieveNetworkStatus(true); },self.retrieveNetworkStatusDelayTime); + }; + + this.createAP = function() { + console.log("createAP"); + if (communicateWithWifibox) { + + // save network related settings and on complete, create access point + self.saveSettings(self.readForm(),function(success) { + if(!success) return; + self.setAPModeState(SettingsWindow.CREATING_AP); // get latest substituted ssid + $.ajax({ + url: self.wifiboxCGIBinURL + "/network/openap", + type: "POST", + dataType: 'json', + timeout: self.timeoutTime, + success: function(response){ + console.log("Settings:createAP response: ",response); + } + }).fail(function() { + console.log("Settings:createAP: timeout (normal behavior)"); + //clearTimeout(self.retrySaveSettingsDelay); + //self.retrySaveSettingsDelay = setTimeout(function() { self.saveSettings() },self.retryDelay); // retry after delay + }); + + self.setAPModeState(SettingsWindow.CREATING_AP,""); + + // after switching wifi network or creating a access point we delay the status retrieval + // because the webserver needs time to switch + clearTimeout(self.retrieveNetworkStatusDelay); + self.retrieveNetworkStatusDelay = setTimeout(function() { self.retrieveNetworkStatus(true); },self.retrieveNetworkStatusDelayTime); + }); + } + }; +} + +/************************* + * + * + * FROM DOODLE3D.INI + * + */ +//TODO: find all references to these variables, replace them and finally remove these. +var objectHeight = 20; +var layerHeight = .2; +//var wallThickness = .5; +//var hop = 0; +//var speed = 70; +//var travelSpeed = 200; +var enableTraveling = true; +//var filamentThickness = 2.89; +var minScale = .3; +var maxScale = 1; +var shape = "%"; +var twists = 0; +//var useSubLayers = true; +//var debug = false; // debug moved to main.js +var loglevel = 2; +//var zOffset = 0; +var serverport = 8888; +var autoLoadImage = "hand.txt"; +var loadOffset = [0, 0]; // x en y ? +var showWarmUp = true; +var loopAlways = false; +var firstLayerSlow = true; +var useSubpathColors = false; +var autoWarmUp = true; +//var maxObjectHeight = 150; +var maxScaleDifference = .1; +var frameRate = 60; +var quitOnEscape = true; +var screenToMillimeterScale = .3; // 0.3 +//var targetTemperature = 220; +//var simplifyiterations = 10; +//var simplifyminNumPoints = 15; +//var simplifyminDistance = 3; +//var retractionspeed = 50; +//var retractionminDistance = 5; +//var retractionamount = 3; +var sideis3D = true; +var sidevisible = true; +var sidebounds = [900, 210, 131, 390]; +var sideborder = [880, 169, 2, 471]; +var windowbounds = [0, 0, 800, 500]; +var windowcenter = true; +var windowfullscreen = false; +var autoWarmUpCommand = "M104 S230"; +//var checkTemperatureInterval = 3; +var autoWarmUpDelay = 3; diff --git a/js/Shape.js b/js/Shape.js new file mode 100644 index 0000000..722370b --- /dev/null +++ b/js/Shape.js @@ -0,0 +1,183 @@ +function drawCircle(x0,y0,r,res) { + if (res==undefined) res = 50; //circle resolution + beginShape(); + var step = Math.PI * 2.0 / res; + for (var a=0; a= 1.0 ? 1 : 0; + zf = Math.min(zxMax, zyMax); +// if (dir == 1 && zf < 1.0) zf = 1; +// console.log("orgZF, zxMax, zyMax, finZF: " + oldZF + ", " + zxMax + ", " + zyMax + ", " + zf); + + return { x: delta.x, y: delta.y, zf: zf }; + } +} + +function nearestZero(v1, v2) { return Math.abs(v1) < Math.abs(v2) ? v1 : v2; } + +//*draws* a circle (i.e. it is not added as points to shape) +function drawCircleTemp(x, y, r, color) { + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.fillStyle = color; + ctx.arc(x, y, r, 0, 2 * Math.PI, false); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = 'black'; +} diff --git a/js/Svg.js b/js/Svg.js new file mode 100644 index 0000000..b93c90f --- /dev/null +++ b/js/Svg.js @@ -0,0 +1,140 @@ +/* + * This file is part of the Doodle3D project (http://doodle3d.com). + * + * Copyright (c) 2013, Doodle3D + * This software is licensed under the terms of the GNU GPL v2 or later. + * See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details. + */ + +//SVG validator: http://validator.w3.org/ +//SVG viewer: http://svg-edit.googlecode.com/svn/branches/2.6/editor/svg-editor.html +function saveToSvg() { + var lastX = 0, lastY = 0, lastIsMove = false; + var svg = ''; + + var boundsWidth = doodleBounds[2] - doodleBounds[0]; + var boundsHeight = doodleBounds[3] - doodleBounds[1]; + + svg += '\n'; + svg += '\n'; + svg += '\n'; + svg += '\tDoodle 3D sketch\n'; + + var data = ''; + for (var i = 0; i < _points.length; ++i) { + var x = _points[i][0], y = _points[i][1], isMove = _points[i][2]; + var dx = x - lastX, dy = y - lastY; + + if (i == 0) + data += 'M'; //emit absolute move on first pair of coordinates + else if (isMove != lastIsMove) + data += isMove ? 'm' : 'l'; + + data += dx + ',' + dy + ' '; + + lastX = x; + lastY = y; + lastIsMove = isMove; + } + + svg += '\t\n'; + + var fields = JSON.stringify({'height': numLayers, 'outlineShape': VERTICALSHAPE, 'twist': rStep}); + svg += '\t\n'; + + svg += '\n'; + + return svg; +} + + +//TODO: use local variables instead of _points,numLayers,VERTICALSHAPE and rStep so we can leave a current doodle in tact if an error occurs while parsing +function loadFromSvg(svgData) { + var mode = '', x = 0, y = 0; + + console.log("loading " + svgData.length + " bytes of data..."); + + clearDoodle(); + + var p = svgData.indexOf("-->", p); + if (endP == -1) { console.log("loadFromSvg: could not find metadata end-marker"); return false; } + var metaFields = JSON.parse(svgData.substr(p, endP - p)); + //TODO: log error and return false if parsing failed + for (var k in metaFields) { + var v = metaFields[k]; + switch (k) { + case "height": numLayers = v; break; + case "outlineShape": VERTICALSHAPE = v; break; + case "twist": rStep = v; break; + } + } + + renderToImageDataPreview(); + + return true; +} diff --git a/js_src/Thermometer.js b/js/Thermometer.js similarity index 100% rename from js_src/Thermometer.js rename to js/Thermometer.js diff --git a/js_src/UpdatePanel.js b/js/UpdatePanel.js similarity index 93% rename from js_src/UpdatePanel.js rename to js/UpdatePanel.js index 39a5978..a756e88 100644 --- a/js_src/UpdatePanel.js +++ b/js/UpdatePanel.js @@ -45,18 +45,18 @@ function UpdatePanel() { this.wifiboxURL = wifiboxURL; this.element = updatePanelElement; - this.noRetainCheckbox = this.element.find("#noRetain"); + this.retainCheckbox = this.element.find("#retainConfiguration"); this.btnUpdate = this.element.find("#update"); this.statusDisplay = this.element.find("#updateState"); this.infoDisplay = this.element.find("#updateInfo"); - this.noRetainCheckbox.change(this.noRetainChanged); + this.retainCheckbox.change(this.retainChanged); this.btnUpdate.click(this.update); this.checkStatus(false); } - this.noRetainChanged = function(e) { - console.log("UpdatePanel:noRetainChanged"); + this.retainChanged = function(e) { + console.log("UpdatePanel:retainChanged"); self.setState(self.state,true); } @@ -82,10 +82,12 @@ function UpdatePanel() { this.installUpdate = function() { console.log("UpdatePanel:installUpdate"); - var noRetain = self.noRetainCheckbox.prop('checked'); + // should personal sketches and settings be retained over update? + var retain = self.retainCheckbox.prop('checked'); + console.log(" retain: ",retain); self.stopCheckingStatus(); - postData = {no_retain:noRetain} + postData = {no_retain:!retain} $.ajax({ url: self.wifiboxURL + "/update/install", type: "POST", @@ -175,8 +177,9 @@ function UpdatePanel() { console.log("UpdatePanel:setState: ",this.state," > ",newState,"(",this.stateText,") (networkMode: ",self.networkMode,") (newestVersion: ",self.newestVersion,") (refresh: ",refresh,")"); this.state = newState; - var noRetain = self.noRetainCheckbox.prop('checked'); - console.log(" noRetain", noRetain); + // should personal sketches and settings be retained over update? + var retain = self.retainCheckbox.prop('checked'); + console.log(" retain", retain); // download button // if there isn't newestVersion data something went wrong, @@ -189,7 +192,7 @@ function UpdatePanel() { case UpdatePanel.DOWNLOAD_FAILED: case UpdatePanel.INSTALL_FAILED: console.log(" self.canUpdate: ",self.canUpdate); - if(self.canUpdate || noRetain) { + if(self.canUpdate || !retain) { self.btnUpdate.removeAttr("disabled"); } else { self.btnUpdate.attr("disabled", true); diff --git a/js/WordArt.js b/js/WordArt.js new file mode 100644 index 0000000..8cb49ef --- /dev/null +++ b/js/WordArt.js @@ -0,0 +1,132 @@ +var wordArtPopup; + +function initWordArt() { + $("body").append(''); + $("#svgfont").load("img/font.svg?"); + + wordArtPopup = new Popup($("#popupWordArt"),$("#popupMask")); + $("#btnWordArtOk").on("onButtonClick",wordArtPopup.commit); + $("#btnWordArtCancel").on("onButtonClick",wordArtPopup.cancel); + $("#popupWordArt").bind("onPopupCancel", onWordArtCancel); + $("#popupWordArt").bind("onPopupCommit", onWordArtOk); +} + +function showWordArtDialog() { + buttonGroupAdd.hide(); + wordArtPopup.open(); + $("#txtWordArt").focus(); + $("#txtWordArt").val(""); //clear textbox +} + +function onWordArtCancel() { + $("#txtWordArt").blur(); +} + +function onWordArtOk() { + $("#txtWordArt").blur(); + var s = $("#txtWordArt").val(); + drawTextOnCanvas(s); +} + +function drawTextOnCanvas(text) { + if (typeof(text) == 'string') { + var points = getStringAsPoints(text); + + var bounds = getBounds(points); + var scaleX = (canvasWidth-50) / bounds.width; + var scaleY = (canvasHeight-50) / bounds.height; + + var scale = Math.min(scaleX,scaleY); + + scalePoints(points,scale); + var bounds = getBounds(points); + translatePoints(points,-bounds.x,-bounds.y); //left top of text is (0,0) + translatePoints(points,-bounds.width/2,-bounds.height/2); //anchor point center + translatePoints(points,canvasWidth/2,canvasHeight/2); //center in canvas + + canvasDrawPoints(canvas,points); + } +} + +function getStringAsPoints(text) { + var allPoints = []; + var xPos = 0; + + for (var i=0; i 1) { - previewUp(true); - clearInterval(btnMoveUpInterval); - btnMoveUpInterval = setInterval( function() { - previewUp(true); - }, 1000/30); - } + function onBtnStraight() { + setVerticalShape(verticalShapes.NONE); } - function stopMoveUp(e) { - e.preventDefault(); -// console.log("btnMoveUp mouse up"); - clearInterval(btnMoveUpInterval); - if (_points.length > 1) previewUp(); + function onBtnDiv() { + setVerticalShape(verticalShapes.DIVERGING); + } + function onBtnConv() { + setVerticalShape(verticalShapes.CONVERGING); + } + function onBtnSine() { + setVerticalShape(verticalShapes.SINUS); } - btnMoveUp.mousedown(function(e) { startMoveUp(e) }); - btnMoveUp.mouseup(function(e) { stopMoveUp(e) }); - btnMoveUp.on('touchstart', function(e) { startMoveUp(e) }); - btnMoveUp.on('touchend', function(e) { stopMoveUp(e) }); - function startMoveDown(e) { - e.preventDefault(); - // console.log("btnMoveDown mouse down"); - if (_points.length > 1) { - previewDown(true); - clearInterval(btnMoveDownInterval); - btnMoveDownInterval = setInterval( function() { - previewDown(true); - }, 1000/30); - } + function hitTest(cursor,button,radius) { + return distance(cursor.x,cursor.y,button.x,button.y) 1) previewDown(); + + + function onBtnToggleEdit() { + var btnImg; + if(buttonGroupEdit.is(":hidden")) { + btnImg = "img/buttons/btnArrowClose.png"; + } else { + btnImg = "img/buttons/btnArrowOpen.png"; + } + btnToggleEdit.attr("src",btnImg); + + buttonGroupEdit.fadeToggle(BUTTON_GROUP_SHOW_DURATION); + } + function onBtnMove(e,cursor) { + var w = btnMove.width(); + var h = btnMove.height(); + var speedX = (cursor.x-w/2)*0.3; + var speedY = (cursor.y-h/2)*0.3; + //console.log("move speed: ",speedX,speedY); + moveShape(speedX,speedY); + } + function onBtnZoom(e,cursor) { + var h = btnZoom.height(); + var multiplier = (h/2-cursor.y)*0.003 + 1; + zoomShape(multiplier); + } + function onBtnRotate(e,cursor) { + var h = btnZoom.height(); + var multiplier = (h/2-cursor.y)*0.003; + rotateShape(-multiplier); + } + + function onBtnHeight(e,cursor) { + var h = btnHeight.height(); + if(cursor.y < h/2) { + previewUp(true); + } else { + previewDown(true); + } + } + function onBtnTwist(e,cursor) { + var h = btnTwist.height(); + var multiplier = (cursor.y-h/2)*0.0005; + previewTwist(multiplier,true); } - btnMoveDown.mousedown(function(e) { startMoveDown(e) }); - btnMoveDown.mouseup(function(e) { stopMoveDown(e) }); - btnMoveDown.on('touchstart', function(e) { startMoveDown(e) }); - btnMoveDown.on('touchend', function(e) { stopMoveDown(e) }); - function startTwistLeft(e) { - e.preventDefault(); - // console.log("btnTwistLeft mouse down"); - if (_points.length > 1) { - previewTwistLeft(true); - clearInterval(btnTwistLeftInterval); - btnTwistLeftInterval = setInterval( function() { - previewTwistLeft(true); - }, 1000/30); - } + function onBtnOops(e) { + oopsUndo(); } - function stopTwistLeft(e) { - e.preventDefault(); - // console.log("btnTwistLeft mouse up"); - clearInterval(btnTwistLeftInterval); - if (_points.length > 1) previewTwistLeft(); - } - btnTwistLeft.mousedown(function(e) { startTwistLeft(e) }); - btnTwistLeft.mouseup(function(e) { stopTwistLeft(e) }); - btnTwistLeft.on('touchstart', function(e) { startTwistLeft(e) }); - btnTwistLeft.on('touchend', function(e) { stopTwistLeft(e) }); - function startTwistRight(e) { - e.preventDefault(); - // console.log("btnTwistRight mouse down"); - if (_points.length > 1) { - previewTwistRight(true); - clearInterval(btnTwistRightInterval); - btnTwistRightInterval = setInterval( function() { - previewTwistRight(true); - }, 1000/30); - } + function onBtnNew(e) { + clearDoodle(); } - function stopTwistRight(e) { - e.preventDefault(); - // console.log("btnTwistRight mouse up"); - clearInterval(btnTwistRightInterval); - if (_points.length > 1) previewTwistRight(); + + function onBtnWordArt(e) { + showWordArtDialog(); + } + + function onBtnShape(e) { + showShapeDialog(); + buttonGroupAdd.fadeOut(); } - btnTwistRight.mousedown(function(e) { startTwistRight(e) }); - btnTwistRight.mouseup(function(e) { stopTwistRight(e) }); - btnTwistRight.on('touchstart', function(e) { startTwistRight(e) }); - btnTwistRight.on('touchend', function(e) { stopTwistRight(e) }); - /*function openSettings() { - console.log("f:openSettings()"); - $("#contentOverlay").fadeIn(1000, function() { - loadSettings(); - }); - }*/ enableButton(btnSettings, openSettingsWindow); -// btnSettings.on('touchend', function(e) { -// e.preventDefault(); -// console.log("btnSettings touchend"); -// }); - + // 29-okt-2013 - we're not doing help for smartphones at the moment if (clientInfo.isSmartphone) { btnInfo.addClass("disabled"); } else { - btnInfo.mouseup(function(e) { - e.preventDefault(); - console.log("btnInfo mouse up"); - helpTours.startTour(helpTours.WELCOMETOUR); - }); + function onBtnInfo(e) { + helpTours.startTour(helpTours.WELCOMETOUR); + } + enableButton(btnInfo, onBtnInfo); } - - // DEBUG - /* - // $(".agentInfo").css("display", "none"); - btnDebug.click(function(e) { - console.log("debugClick"); - $(".agentInfo").toggleClass("agentInfoToggle"); - e.preventDefault(); - }) - //*/ - - //btnStop.on('touchstart mousedown',stopPrint); } + function stopPrint() { console.log("f:stopPrint() >> sendPrintCommands = " + sendPrintCommands); //if (!confirm("Weet je zeker dat je huidige print wilt stoppen?")) return; @@ -217,14 +202,6 @@ function stopPrint() { } -// function prevDoodle(e) { -// console.log("f:prevDoodle()"); -// console.log("f:prevDoodle()"); -// } -// function nextDoodle(e) { -// console.log("f:nextDoodle()"); -// } - function print(e) { console.log("f:print() >> sendPrintCommands = " + sendPrintCommands); @@ -309,6 +286,7 @@ function oopsUndo() { } redrawPreview(); } + function previewUp(redrawLess) { // console.log("f:previewUp()"); if (numLayers < maxNumLayers) { @@ -329,17 +307,19 @@ function previewDown(redrawLess) { redrawRenderedPreview(redrawLess); } function previewTwistLeft(redrawLess) { - if (redrawLess == undefined) redrawLess = false; - // console.log("f:previewTwistLeft()"); - if (rStep > -previewRotationLimit) rStep -= twistIncrement; - // redrawPreview(redrawLess); - redrawRenderedPreview(redrawLess); - setSketchModified(true); + previewTwist(-twistIncrement,true) } function previewTwistRight(redrawLess) { - // console.log("f:previewTwistRight()"); - if (rStep < previewRotationLimit) rStep += twistIncrement; - // redrawPreview(redrawLess); + previewTwist(twistIncrement,true) +} +function previewTwist(increment,redrawLess) { + console.log("previewTwist: ",increment); + if (redrawLess == undefined) redrawLess = false; + + rStep += increment; + if(rStep < -previewRotationLimit) rStep = -previewRotationLimit; + else if(rStep > previewRotationLimit) rStep = previewRotationLimit; + redrawRenderedPreview(redrawLess); setSketchModified(true); } @@ -368,23 +348,17 @@ function setState(newState,newHasControl) { // print button var printEnabled = (newState == Printer.IDLE_STATE && newHasControl); if(printEnabled) { - btnPrint.removeClass("disabled"); // enable print button - btnPrint.unbind('touchstart mousedown'); - btnPrint.bind('touchstart mousedown',print); + enableButton(btnPrint,print); } else { - btnPrint.addClass("disabled"); // disable print button - btnPrint.unbind('touchstart mousedown'); + disableButton(btnPrint); } // stop button var stopEnabled = ((newState == Printer.PRINTING_STATE || newState == Printer.BUFFERING_STATE) && newHasControl); if(stopEnabled) { - btnStop.removeClass("disabled"); - btnStop.unbind('touchstart mousedown'); - btnStop.bind('touchstart mousedown',stopPrint); + enableButton(btnStop,stopPrint); } else { - btnStop.addClass("disabled"); - btnStop.unbind('touchstart mousedown'); + disableButton(btnStop); } // thermometer diff --git a/js_src/canvasDrawing.js b/js/canvasDrawing.js similarity index 91% rename from js_src/canvasDrawing.js rename to js/canvasDrawing.js index b9fa09c..eabec19 100644 --- a/js_src/canvasDrawing.js +++ b/js/canvasDrawing.js @@ -45,7 +45,7 @@ var isModified = false; * * * * * * * * * * */ function initDoodleDrawing() { - console.log("f:initDoodleDrawing()"); + //console.log("f:initDoodleDrawing()"); $canvas = $("#mycanvas"); canvas = $canvas[0]; @@ -79,7 +79,7 @@ function initDoodleDrawing() { // drawCanvas = $(".drawareacontainer"); drawCanvas = $("#mycanvasContainer"); // $("#drawAreaContainer") - console.log("drawCanvasTopLeftCoords: " + drawCanvasTopLeftCoords); + //console.log("drawCanvasTopLeftCoords: " + drawCanvasTopLeftCoords); // drawCanvasTopLeftCoords[0] = drawCanvas.css("left").match(/[0-9]/g).join(""); // drawCanvasTopLeftCoords[1] = drawCanvas.css("top").match(/[0-9]/g).join(""); drawCanvasTopLeftCoords[0] = drawCanvas.offset().left; @@ -87,8 +87,8 @@ function initDoodleDrawing() { // drawCanvasTopLeftCoords[0] = drawCanvas[0].offsetParent.offsetLeft; // drawCanvasTopLeftCoords[1] = drawCanvas[0].offsetParent.offsetTop; - console.log("f:initDoodleDrawing() >> canvasWidth: " + canvasWidth); - console.log("f:initDoodleDrawing() >> canvasHeight: " + canvasHeight); + //console.log("f:initDoodleDrawing() >> canvasWidth: " + canvasWidth); + //console.log("f:initDoodleDrawing() >> canvasHeight: " + canvasHeight); } @@ -98,6 +98,7 @@ function initDoodleDrawing() { * * * * * * * * * * */ function draw(_x, _y, _width) { + //console.log("canvasDrawing:draw"); // console.log("f:draw() >> _width: " + _width); if (prevX == 0 && prevY ==0) { @@ -154,7 +155,7 @@ function draw(_x, _y, _width) { * * * * * * * * * * */ function clearDoodle() { - console.log("f:clearDoodle"); + //console.log("f:clearDoodle"); updatePrevNextButtonStateOnClear(); @@ -179,6 +180,7 @@ function clearDoodle() { } function redrawDoodle(recalcBoundsAndTransforms) { + //console.log("canvasDrawing:redrawDoodle"); if (recalcBoundsAndTransforms == undefined) recalcBoundsAndTransforms = false; // console.log("f:redrawDoodle() >> recalcBoundsAndTransforms = " + recalcBoundsAndTransforms); @@ -205,8 +207,9 @@ function redrawDoodle(recalcBoundsAndTransforms) { } } } - +// checks if x,y is outside doodleBounds, if so update function adjustBounds(x, y) { + //console.log("canvasDrawing:adjustBounds"); var newPointsOutsideOfCurrentBounds = false; // console.log("f:adjustBounds("+x+","+y+")"); @@ -242,7 +245,7 @@ function redrawDoodle(recalcBoundsAndTransforms) { // does what exactly? function adjustPreviewTransformation() { - // console.log("f:adjustPreviewTransformation()"); + //console.log("canvasDrawing:adjustPreviewTransformation"); doodleTransform[0] = doodleBounds[0]; doodleTransform[1] = doodleBounds[1]; @@ -272,6 +275,7 @@ function adjustPreviewTransformation() { * * * * * * * * * * */ function onCanvasMouseDown(e) { + //console.log("canvasDrawing:onCanvasMouseDown"); setSketchModified(true); // console.log("f:onCanvasMouseDown()"); @@ -301,7 +305,7 @@ function onCanvasMouseDown(e) { var prevPoint = {x:-1, y:-1}; function onCanvasMouseMove(e) { - + //console.log("canvasDrawing:onCanvasMouseMove"); // console.log("f:onCanvasMouseMove()"); if (!dragging) return; @@ -363,11 +367,11 @@ function onCanvasMouseUp(e) { // console.log("f:onCanvasMouseUp()"); // console.log("onmouseup"); dragging = false; - console.log("doodleBounds: " + doodleBounds); - console.log("doodleTransform: " + doodleTransform); + //console.log("doodleBounds: " + doodleBounds); + //console.log("doodleTransform: " + doodleTransform); // ctx.stroke(); - console.log("_points.length :" + _points.length); + //console.log("_points.length :" + _points.length); // console.log(_points); // DEBUG @@ -383,7 +387,7 @@ function onCanvasTouchDown(e) { setSketchModified(true); e.preventDefault(); - console.log("f:onCanvasTouchDown >> e: " , e); + //console.log("f:onCanvasTouchDown >> e: " , e); // var x = e.touches[0].pageX - e.touches[0].target.offsetLeft; // var y = e.touches[0].pageY - e.touches[0].target.offsetTop; var x = e.touches[0].pageX - drawCanvasTopLeftCoords[0]; @@ -404,6 +408,7 @@ function onCanvasTouchDown(e) { } function onCanvasTouchMove(e) { + //console.log("canvasDrawing:onCanvasTouchMove"); setSketchModified(true); e.preventDefault(); @@ -416,7 +421,7 @@ function onCanvasTouchMove(e) { // var x = e.touches[0].layerX; // var y = e.touches[0].layerY; - console.log("f:onCanvasTouchMove >> x,y = "+x+","+y+" , e: " , e); + //console.log("f:onCanvasTouchMove >> x,y = "+x+","+y+" , e: " , e); if (prevPoint.x != -1 || prevPoint.y != -1) { var dist = Math.sqrt(Math.pow((prevPoint.x - x), 2) + Math.pow((prevPoint.y - y), 2)); @@ -469,12 +474,12 @@ function onCanvasTouchMove(e) { } function onCanvasTouchEnd(e) { - console.log("f:onCanvasTouchEnd()"); - console.log("doodleBounds: " + doodleBounds); - console.log("doodleTransform: " + doodleTransform); + //console.log("f:onCanvasTouchEnd()"); + //console.log("doodleBounds: " + doodleBounds); + //console.log("doodleTransform: " + doodleTransform); // ctx.stroke(); - console.log("_points.length :" + _points.length); + //console.log("_points.length :" + _points.length); // redrawPreview(); renderToImageDataPreview(); diff --git a/js_src/d3dServerInterfacing.js b/js/d3dServerInterfacing.js similarity index 100% rename from js_src/d3dServerInterfacing.js rename to js/d3dServerInterfacing.js diff --git a/js_src/gcodeGenerating.js b/js/gcodeGenerating.js similarity index 91% rename from js_src/gcodeGenerating.js rename to js/gcodeGenerating.js index b0684d2..93f4cba 100644 --- a/js_src/gcodeGenerating.js +++ b/js/gcodeGenerating.js @@ -15,9 +15,11 @@ function generate_gcode() { gcode = []; console.log("settings: ",settings); - var speed = settings["printer.speed"] + var speed = settings["printer.speed"]; var normalSpeed = speed; - var bottomSpeed = speed*0.5; + var bottomSpeed = settings["printer.bottomLayerSpeed"]; + var firstLayerSlow = settings["printer.firstLayerSlow"]; + var bottomFlowRate = settings["printer.bottomFlowRate"]; var travelSpeed = settings["printer.travelSpeed"] var filamentThickness = settings["printer.filamentThickness"]; var wallThickness = settings["printer.wallThickness"]; @@ -157,12 +159,14 @@ function generate_gcode() { var isTraveling = !isLoop && i==0; var doRetract = retractionEnabled && prev.distance(to) > retractionminDistance; - if (enableTraveling && isTraveling) { - if (doRetract) gcode.push("G0 E" + (extruder - retractionamount).toFixed(3) + " F" + (retractionspeed * 60).toFixed(3)); //retract + var firstPointEver = (layer == 0 && i == 0 && j == 0); + if (firstPointEver || layer > 2 && enableTraveling && isTraveling) { //always travel to first point, then disable traveling for first two layers and use settings for remainder of print + if (!firstPointEver && doRetract) gcode.push("G0 E" + (extruder - retractionamount).toFixed(3) + " F" + (retractionspeed * 60).toFixed(3)); //retract gcode.push("G0 X" + to.x.toFixed(3) + " Y" + to.y.toFixed(3) + " Z" + z.toFixed(3) + " F" + (travelSpeed * 60).toFixed(3)); - if (doRetract) gcode.push("G0 E" + extruder.toFixed(3) + " F" + (retractionspeed * 60).toFixed(3)); // return to normal + if (!firstPointEver && doRetract) gcode.push("G0 E" + extruder.toFixed(3) + " F" + (retractionspeed * 60).toFixed(3)); // return to normal } else { - extruder += prev.distance(to) * wallThickness * layerHeight / (Math.pow((filamentThickness/2), 2) * Math.PI); + var f = (layer < 2) ? bottomFlowRate : 1; + extruder += prev.distance(to) * wallThickness * layerHeight / (Math.pow((filamentThickness/2), 2) * Math.PI) * f; gcode.push("G1 X" + to.x.toFixed(3) + " Y" + to.y.toFixed(3) + " Z" + z.toFixed(3) + " F" + (speed * 60).toFixed(3) + " E" + extruder.toFixed(3)); } diff --git a/js_src/init_layout.js b/js/init_layout.js similarity index 97% rename from js_src/init_layout.js rename to js/init_layout.js index 15a1475..0e6273e 100644 --- a/js_src/init_layout.js +++ b/js/init_layout.js @@ -35,7 +35,7 @@ function doOnResize() { function initLayouting() { console.log("f:initLayouting()"); - $drawAreaContainer = $(".drawareacontainer"); + $drawAreaContainer = $("#drawareacontainer"); canvas.width = $canvas.width(); canvas.height = $canvas.height(); // canvas.clientHeight; diff --git a/js_src/libs/FileSaver.js b/js/libs/FileSaver.js similarity index 100% rename from js_src/libs/FileSaver.js rename to js/libs/FileSaver.js diff --git a/js_src/libs/jquery-1-9-1.js b/js/libs/jquery-1-9-1.js similarity index 100% rename from js_src/libs/jquery-1-9-1.js rename to js/libs/jquery-1-9-1.js diff --git a/js_src/libs/jquery-cookie.js b/js/libs/jquery-cookie.js similarity index 100% rename from js_src/libs/jquery-cookie.js rename to js/libs/jquery-cookie.js diff --git a/js_src/libs/jquery-coolfieldset.js b/js/libs/jquery-coolfieldset.js similarity index 100% rename from js_src/libs/jquery-coolfieldset.js rename to js/libs/jquery-coolfieldset.js diff --git a/js/libs/jquery-fastclick.js b/js/libs/jquery-fastclick.js new file mode 100644 index 0000000..19fac02 --- /dev/null +++ b/js/libs/jquery-fastclick.js @@ -0,0 +1,101 @@ +/** + * jQuery.fastClick.js + * + * Work around the 300ms delay for the click event in some mobile browsers. + * + * Code based on + * + * @usage + * $('button').fastClick(function() {alert('clicked!');}); + * + * @license MIT + * @author Dave Hulbert (dave1010) + * @version 1.0.0 2013-01-17 + */ + +/*global document, window, jQuery, Math */ + +(function($) { + +$.fn.fastClick = function(handler) { + return $(this).each(function(){ + $.FastButton($(this)[0], handler); + }); +}; + +$.FastButton = function(element, handler) { + var startX, startY; + + var reset = function() { + $(element).unbind('touchend'); + $("body").unbind('touchmove.fastClick'); + }; + + var onClick = function(event) { + event.stopPropagation(); + reset(); + handler.call(this, event); + + if (event.type === 'touchend') { + $.clickbuster.preventGhostClick(startX, startY); + } + }; + + var onTouchMove = function(event) { + if (Math.abs(event.originalEvent.touches[0].clientX - startX) > 10 || + Math.abs(event.originalEvent.touches[0].clientY - startY) > 10) { + reset(); + } + }; + + var onTouchStart = function(event) { + event.stopPropagation(); + + $(element).bind('touchend', onClick); + $("body").bind('touchmove.fastClick', onTouchMove); + + startX = event.originalEvent.touches[0].clientX; + startY = event.originalEvent.touches[0].clientY; + }; + + $(element).bind({ + touchstart: onTouchStart, + click: onClick + }); +}; + +$.clickbuster = { + coordinates: [], + + preventGhostClick: function(x, y) { + $.clickbuster.coordinates.push(x, y); + window.setTimeout($.clickbuster.pop, 2500); + }, + + pop: function() { + $.clickbuster.coordinates.splice(0, 2); + }, + + onClick: function(event) { + var x, y, i; + for (i = 0; i < $.clickbuster.coordinates.length; i += 2) { + x = $.clickbuster.coordinates[i]; + y = $.clickbuster.coordinates[i + 1]; + if (Math.abs(event.clientX - x) < 25 && Math.abs(event.clientY - y) < 25) { + event.stopPropagation(); + event.preventDefault(); + } + } + } +}; + +$(function(){ + if (document.addEventListener){ + document.addEventListener('click', $.clickbuster.onClick, true); + } else if (document.attachEvent){ + // for IE 7/8 + document.attachEvent('onclick', $.clickbuster.onClick); + } +}); + +}(jQuery)); diff --git a/js_src/libs/jquery-joyride-2-1.js b/js/libs/jquery-joyride-2-1.js similarity index 100% rename from js_src/libs/jquery-joyride-2-1.js rename to js/libs/jquery-joyride-2-1.js diff --git a/js_src/main.js b/js/main.js similarity index 92% rename from js_src/main.js rename to js/main.js index 01a0264..2880d7d 100644 --- a/js_src/main.js +++ b/js/main.js @@ -30,6 +30,9 @@ var showOrHide = false; var clientInfo = {}; +var POPUP_SHOW_DURATION = 175; +var BUTTON_GROUP_SHOW_DURATION = 80; + $(function() { console.log("ready"); @@ -65,10 +68,16 @@ $(function() { initDoodleDrawing(); initPreviewRendering(); initLayouting(); - initSidebars(); + // initSidebars(); initButtonBehavior(); initKeyboard(); - initVerticalShapes(); + // initVerticalShapes(); + initWordArt(); + initShapeDialog(); + + disableDragging(); + + if (!clientInfo.isSmartphone) initHelp(); thermometer.init($("#thermometerCanvas"), $("#thermometerContainer")); progressbar.init($("#progressbarCanvas"), $("#progressbarCanvasContainer")); @@ -80,7 +89,7 @@ $(function() { settingsWindow.init(wifiboxURL,wifiboxCGIBinURL); $(document).on(SettingsWindow.SETTINGS_LOADED, settingsLoaded); - + if(debugMode) { console.log("debug mode is true"); $("body").css("overflow", "auto"); @@ -120,17 +129,24 @@ $(function() { } }); +function disableDragging() { + $(document).bind("dragstart", function(event) { + console.log("dragstart"); + event.preventDefault(); + }); +} + function enableButton(elem, handler) { //var elem = $('#'+domId); elem.removeClass("disabled"); - elem.unbind('click'); - elem.bind('click', handler); + elem.unbind('onButtonClick'); + elem.bind('onButtonClick', handler); } function disableButton(elem) { //var elem = $('#'+domId); elem.addClass("disabled"); - elem.unbind('click'); + elem.unbind('onButtonClick'); } function showOrHideThermo() { diff --git a/js_src/previewRendering.js b/js/previewRendering.js similarity index 96% rename from js_src/previewRendering.js rename to js/previewRendering.js index 462bc72..aba2d6a 100644 --- a/js_src/previewRendering.js +++ b/js/previewRendering.js @@ -26,7 +26,7 @@ var prevRedrawTime = new Date().getTime(); var redrawInterval = 1000 / 30; // ms function initPreviewRendering() { - console.log("f:initPreviewRendering()"); + //console.log("f:initPreviewRendering()"); $preview = $("#preview"); preview = $preview[0]; @@ -89,6 +89,7 @@ var highlight = true; //highlight bottom, middle and top layers var linesRaw = ""; var debug_redrawSimplification = 6; function redrawPreview(redrawLess) { + //console.log("PreviewRendering:redrawPreview"); if (redrawLess == undefined) redrawLess = false; if (_points.length < 2) { @@ -168,8 +169,7 @@ function redrawPreview(redrawLess) { } function renderToImageDataPreview() { - console.log("f:renderToImageDataPreview()"); - + //console.log("PreviewRendering:renderToImageDataPreview"); if (_points.length < 2) return; //* @@ -238,9 +238,10 @@ function renderToImageDataPreview() { previewCtx.globalAlpha = globalAlpha; } -// called by the move up/down or twist left/right buttons +// called by the move up/down, twist left/right or new buttons // it is assumed that the preview has been rendered to an Image object, which will be used to draw the preview with (much better performance) function redrawRenderedPreview(redrawLess) { + //console.log("PreviewRendering:redrawRenderedPreview"); if (redrawLess == undefined) redrawLess = false; // console.log("f:redrawRenderedPreview()"); @@ -250,7 +251,10 @@ function redrawRenderedPreview(redrawLess) { var y = 0; var r = 0; - + + // check if there is preview image data that we can use for the layers + if(!doodleImageCapture.src || doodleImageCapture.src == "") return; + for(var i = 0; i < numLayers; i++) { var verticalScaleFactor = scaleFunction(i / maxNumLayers); @@ -273,7 +277,7 @@ function redrawRenderedPreview(redrawLess) { previewCtx.scale(verticalScaleFactor, scaleY * verticalScaleFactor); previewCtx.rotate(r); previewCtx.translate(-layerCX,-layerCY); - + previewCtx.drawImage(doodleImageCapture, 0, 0); y -= yStep; @@ -299,6 +303,7 @@ function centeredAndScaledDoodlePoint(p) { var updatePrevX = -1; var updatePrevY = -1; function updatePreview(_x, _y, redrawLess) { + //console.log("PreviewRendering:updatePreview"); if (redrawLess == undefined) redrawLess = false; redrawLess = false; diff --git a/js_src/sidebar.js b/js/sidebar.js similarity index 90% rename from js_src/sidebar.js rename to js/sidebar.js index 747f272..c6b9911 100644 --- a/js_src/sidebar.js +++ b/js/sidebar.js @@ -13,13 +13,13 @@ function initSidebars() { console.log("f:initSidebars()"); sidebarLeft = new SideBar(); - sidebarLeft.init(".leftpanel", "hideleft", function() { - $(".leftpanel").show(); + sidebarLeft.init("#leftpanel", "hideleft", function() { + $("#leftpanel").show(); }); sidebarRight = new SideBar(); - sidebarRight.init(".rightpanel", "hideright", function() { - $(".rightpanel").show(); + sidebarRight.init("#rightpanel", "hideright", function() { + $("#rightpanel").show(); }); } diff --git a/js_src/sketches.js b/js/sketches.js similarity index 98% rename from js_src/sketches.js rename to js/sketches.js index fba97b9..38cdcfe 100644 --- a/js_src/sketches.js +++ b/js/sketches.js @@ -25,7 +25,7 @@ function getSavedSketchStatus() { } } }).fail(function() { - console.log("getSavedSketchStatus failed: ", response); + console.log("getSavedSketchStatus failed"); }); } diff --git a/js_src/utils.js b/js/utils.js similarity index 93% rename from js_src/utils.js rename to js/utils.js index ea45588..8ef7849 100644 --- a/js_src/utils.js +++ b/js/utils.js @@ -33,3 +33,7 @@ function isSmartphone() { return returnBool; } + +function distance(x1, y1, x2, y2) { + return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); +} diff --git a/js/verticalShapes.js b/js/verticalShapes.js new file mode 100644 index 0000000..77f1165 --- /dev/null +++ b/js/verticalShapes.js @@ -0,0 +1,21 @@ +var VERTICALSHAPE; + +var verticalShapes = { + "NONE": 'none', + "DIVERGING": 'diverging', + "CONVERGING": 'converging', + "SINUS": 'sinus' +}; + +function setVerticalShape(s) { + VERTICALSHAPE = s; + redrawRenderedPreview(); +} + +function initVerticalShapes() { + resetVerticalShapes(); +} + +function resetVerticalShapes() { + setVerticalShape(verticalShapes.NONE); +} \ No newline at end of file diff --git a/js_old/Thermometer.js.orig b/js_old/Thermometer.js.orig deleted file mode 100644 index 54a708e..0000000 --- a/js_old/Thermometer.js.orig +++ /dev/null @@ -1,136 +0,0 @@ -<<<<<<< HEAD -======= -var $displayThermometer = $("#thermometerContainer"); - - -//TODO 2013-09-18 allow displaying temperatures HIGHER than the targTemp (it's now being capped at targTemp). ->>>>>>> new_layouting_approach -function Thermometer() { - this.currentTemperature = 0; // default val - this.targetTemperature = 180; // default val - - this.thermoOverlayImg = new Image(); - this.thermoOverlayImgSrc = "img/thermometer_fg_overlay.png"; // ../img/thermometer_fg_overlay.png - - this.thermoWidth= 40; - this.thermoHeight = 100; - - this.$canvas; - this.canvas; - this.context; - this.$container; - - this.isInitted = false; - - this.enabled = true; - - this.thermoColors = [ - [50, 200, 244], // 'cold' - [244, 190, 10], // 'warming up' - [244, 50, 50] // 'ready / hot' - ]; - - this.init = function(targCanvas, targCanvasContainer) { - console.log("Thermometer.init()"); - - this.$container = targCanvasContainer; - - this.$canvas = targCanvas; - this.canvas = this.$canvas[0]; - this.context = this.canvas.getContext('2d'); - - - var self = this; - this.thermoOverlayImg.onload = function() { - console.log("canvasThermoOverlay img loaded"); - self.isInitted = true; - self.update(self.currentTemperature, self.targetTemperature); - }; - this.thermoOverlayImg.src = this.thermoOverlayImgSrc; - } - - this.update = function(curr, targ) { - // console.log("Thermometer.update(" + curr + "," + targ + ")"); - - if (this.isInitted) { - if(!this.enabled) return; - if (curr == undefined) curr = 0; - if (targ== undefined) targ = 180; // prevent divide by zero - - var progress = curr / targ; - - progress = Math.min(progress, 1.0); - progress = Math.max(progress, 0); - - var h = this.thermoHeight; // 94 // px - var paddingUnder = 15; // how far is beginpoint from bottom of thermometer - var paddingAbove = 25; // how far is endpoint from top of thermometer - var endPoint = h * .8; - var p = Math.floor((h - paddingUnder - paddingAbove) * progress); // % - // var tempHeight = - - var currColor = this.thermoColors[0]; - if (progress > 0.98) { - currColor = this.thermoColors[2]; - } else if (progress > 0.25) { - currColor = this.thermoColors[1]; - } - - // clear - this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); - this.context.font = "10pt sans-serif"; - - // draw the thermometer clipping path - this.context.save(); - this.context.beginPath(); - this.context.arc(40, 80, 16, 0, 2 * Math.PI, false); // circle bottom of thermometer - this.context.arc(40, 10, 4, 0, 2 * Math.PI, false); // circle at top of thermometer tube - this.context.rect(36, 11, 8, 70); // thermometer tube - this.context.fillStyle = '#fff'; - this.context.fill(); - this.context.clip(); - - // draw rectangle which represents temperature - // rect will be clipped by the thermometer outlines - this.context.beginPath(); - this.context.rect(20, h - paddingUnder - p, 60, p + paddingUnder); - //console.log(" currColor: " + currColor); - //todo Math.floor?? - this.context.fillStyle = "rgb(" + currColor[0] + "," + currColor[1] + "," + currColor[2] + ")"; - this.context.fill(); - this.context.restore(); - - // additional text labels - this.context.save(); - this.context.beginPath(); - this.context.moveTo(32, paddingAbove); - this.context.lineTo(52, paddingAbove); - this.context.lineWidth = 2; - this.context.strokeStyle = '#000'; - this.context.stroke(); - this.context.fillStyle = '#000'; - this.context.textAlign = "left"; - this.context.textBaseline = "middle"; - this.context.fillText(targ + "°", 55, paddingAbove); - this.context.restore(); - - // the thermometer outline png - this.context.drawImage(this.thermoOverlayImg, 20, 0); - - // text - this.context.fillStyle = '#000'; - this.context.textAlign="center"; - this.context.fillText(curr + "°", 40, h + paddingUnder); - } else { - console.log("Thermometer.setTemperature() -> thermometer not initialized!"); - } - } - this.show = function() { - this.$container.show(); - this.enabled = true; - } - this.hide = function() { - this.$container.hide(); - this.enabled = false; - } -} diff --git a/js_old/init_layout backup20130918.js b/js_old/init_layout backup20130918.js deleted file mode 100644 index a535412..0000000 --- a/js_old/init_layout backup20130918.js +++ /dev/null @@ -1,260 +0,0 @@ -var imgDims = [320, 320]; // width and height of image - -function doClientAndOrientationStuff() { - console.log("f:doClientAndOrientationStuff()"); - - $(".agentInfo").text(""); - - /* - if( /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ) { - if (window.orientation == -90 || window.orientation == 90) { - // landscape -// $('#Viewport').attr('content', 'width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=yes'); - } else { - // portrait - $('#Viewport').attr('content', 'width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=yes'); - } - } - return; - //*/ - - if( /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ) { - console.log("PHONE OR TABLET! --> window.orientation = " + window.orientation); - if (window.orientation == -90 || window.orientation == 90) { - console.log(" landscape"); - // landscape - - // var ww = ( $(window).width() < window.screen.width ) ? $(window).width() : window.screen.width; //get proper width - var ww = 0; //get proper width - if (window.innerWidth) { - ww = window.innerWidth; - // if (window.screen.availWidth) { -// ww = window.screen.availWidth; - -// if( /iPhone|iPad|iPod/i.test(navigator.userAgent) ) { -// ww = window.innerWidth; -// } - } else if($(window).width()) { - ww = $(window).width(); - } else { - - } - - // ww = 480; - - var mw = imgDims[0]; // min width of site - //* - if( /iPhone|iPad|iPod/i.test(navigator.userAgent) ) { - var mw = imgDims[1]; // in landscape: min-width is image width - } - //*/ - var ratio = ww / mw; //calculate ratio - $('#Viewport').attr('content', 'initial-scale='+ratio+',maximum-scale='+ratio+',minimum-scale='+ratio+',user-scalable=no,width='+mw); - if( ww < mw){ //smaller than minimum size -// $(".colmask").css("background-color", "#ff0"); - // $('#Viewport').attr('content', 'initial-scale=' + ratio + ', maximum-scale=' + ratio + ', minimum-scale=' + ratio + ', user-scalable=yes, width=' + ww); - // $('#Viewport').attr('content', 'initial-scale=1.0, maximum-scale=2, minimum-scale=1.0, user-scalable=yes, width=' + ww); - }else{ //regular size -// $(".colmask").css("background-color", "#0ff"); - // $('#Viewport').attr('content', 'initial-scale=1.0, maximum-scale=2, minimum-scale=1.0, user-scalable=yes, width=' + ww); - } - - console.log(" ww: " + ww + ", mw: " + mw + ", ratio: " + ratio); - - $(".agentInfo").append("ww: " + ww + ", mw: " + mw + "
"); - $(".agentInfo").append("ratio: " + ratio + "
"); - $(".agentInfo").append("
"); - } else { - console.log(" portrait"); - // portrait -// $('#Viewport').attr('content', 'initial-scale='+1+',maximum-scale='+1+',minimum-scale='+1+',user-scalable=no'); - $('#Viewport').attr('content', 'width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no'); - } - - } else { - // console.log("else"); - $(".colmask").css("background-color", "#f80"); - - } - - - $(".agentInfo").append("$(window).width(): " + $(window).width() + "
"); - $(".agentInfo").append("window.screen.width: " + window.screen.width+ "
"); - $(".agentInfo").append("window.screen.availWidth: " + window.screen.availWidth+ "
"); - $(".agentInfo").append("
"); - $(".agentInfo").append("window.innerWidth: " + window.innerWidth + "
"); - $(".agentInfo").append("window.innerHeight: " + window.innerHeight + "
"); - $(".agentInfo").append("
"); - $(".agentInfo").append("$(window).height(): " + $(window).height() + "
"); - $(".agentInfo").append("window.screen.height: " + window.screen.height+ "
"); - $(".agentInfo").append("window.screen.availHeight: " + window.screen.availHeight+ "
"); - $(".agentInfo").append("
"); - $(".agentInfo").append("user agent: " + navigator.userAgent + "
"); -}; - -function doOnOrientationChange() { - console.log("doOnOrientationChange"); - doClientAndOrientationStuff(); - - // switch(window.orientation) { - // case -90: - // case 90: - // alert('landscape'); - // break; - // default: - // alert('portrait'); - // break; - // } -} - -var drawAreaContainerMinHeight = 300; -var drawAreaContainerMaxHeight = 450; -function doOnResize() { - // console.log("doOnResize() >> " + new Date().getTime()); -// $(".container").css("height", window.innerHeight); - - // code from new layouting approach... //TODO give this a more logical spot - $drawAreaContainer.css("marginTop", -parseInt($drawAreaContainer.css("height"))/2); - - canvas.width = $drawAreaContainer.width() - 150; // canvas.clientWidth; - canvas.height = $drawAreaContainer.height(); // canvas.clientHeight; - // canvas.width = canvas.clientWidth; - // canvas.height = canvas.clientHeight; - - // $("#drawAreaContainer").attr("width", parseInt($("#drawAreaContainer").css("width"), 10)); - // $("#drawAreaContainer").attr("height", parseInt($("#drawAreaContainer").css("height"), 10)); - // canvas.width = parseInt($canvas.css("width"), 10); - // canvas.height = parseInt($canvas.css("height"), 10); - - preview.width = 150; - preview.height = $drawAreaContainer.height(); -// preview.width = parseInt($preview.css("width"), 10); -// preview.height = parseInt($preview.css("height"), 10); - - canvasWidth = canvas.width; - canvasHeight = canvas.height; - - redrawDoodle(); - redrawPreview(); - - return; - -// doClientAndOrientationStuff() // <-- is this necessary in this method? - -// console.log("f:doOnResize() >> $('#canvascontainer').innerHeight: " + window.innerHeight); - if (window.innerHeight < 768) { -// $('#drawAreaContainer').innerHeight(window.innerHeight - $("#drawAreaContainer").offset().top - 70); - var newVal = window.innerHeight - $("#drawAreaContainer").offset().top - 100; // what's the 70 ?? - newVal = Math.max(newVal, drawAreaContainerMinHeight); - newVal = Math.min(newVal, drawAreaContainerMaxHeight); - - $('#drawAreaContainer').innerHeight(newVal); - - // canvas drawing area - $canvas.css("height", newVal); - canvas.height = newVal; - canvasWidth = canvas.width; - canvasHeight = canvas.height; - - // preview area - $preview.css("height", newVal); - preview.height = newVal; - layerOffsetY = preview.height - 1.75 * layerCY; - yStep = preview.height / 150; - - redrawDoodle(); - redrawPreview(); - } -} - -function initLayouting() { - console.log("f:initLayouting()"); - - // first set the css width/height and actual width/height of the drawing area - - - - -// $doodleCanvas = $("#mycanvas"); -// doodleCanvas = $("#mycanvas")[0]; -// doodleCanvasContext = doodleCanvas.getContext('2d'); - - $drawAreaContainer = $("#drawAreaContainer"); - $drawAreaContainer.css("margin", 0); - $drawAreaContainer.css("marginLeft", -parseInt($drawAreaContainer.css("width"))/2); - $drawAreaContainer.css("marginTop", -parseInt($drawAreaContainer.css("height"))/2); - - canvas.width = $drawAreaContainer.width() - 150; // canvas.clientWidth; - canvas.height = $drawAreaContainer.height(); // canvas.clientHeight; -// canvas.width = canvas.clientWidth; -// canvas.height = canvas.clientHeight; - - preview.width = 150; - preview.height = $drawAreaContainer.height(); - - // code from new layouting approach... //TODO give this a more logical spot -// $("#drawAreaContainer").attr("width", parseInt($("#drawAreaContainer").css("width"), 10)); -// $("#drawAreaContainer").attr("height", parseInt($("#drawAreaContainer").css("height"), 10)); -// canvas.width = parseInt($canvas.css("width"), 10); -// canvas.height = parseInt($canvas.css("height"), 10); -// preview.width = parseInt($preview.css("width"), 10); -// preview.height = parseInt($preview.css("height"), 10); - canvasWidth = canvas.width; - canvasHeight = canvas.height; - -// console.log("f:initLayouting() >> canvas height: " + canvas.height); - - - - // imgDims[0] = parseInt($(".container").css("width").match(/[0-9]+/).join("")); - // imgDims[1] = parseInt($(".container").css("height").match(/[0-9]+/).join("")); - -// imgDims = [1024, 768]; - - /* - if( /Android|webOS|BlackBerry/i.test(navigator.userAgent) ) { - imgDims[1] = parseInt($(".container").css("height").match(/[0-9]+/).join("")); - } else if ( /iPhone|iPad|iPod/i.test(navigator.userAgent) ) { - imgDims[1] = parseInt($(".container").css("width").match(/[0-9]+/).join("")); - } else { - imgDims[1] = parseInt($(".container").css("height").match(/[0-9]+/).join("")); - } - //*/ - - // $(".container").css("height", window.innerHeight); - - // window.innerHeight - console.log("window.innerHeight: " + window.innerHeight); - console.log("window.innerWidth: " + window.innerWidth); - console.log("$('#drawAreaContainer').innerHeight(): " + $("#drawAreaContainer").innerHeight()); - console.log("$('#drawAreaContainer').offset().top: " + $("#drawAreaContainer").offset().top); - - - /* 2013-07-26 not doing this resizing stuff now, it's not working well yet - if (window.innerHeight < 768) { - $('#drawAreaContainer').innerHeight(window.innerHeight - $("#drawAreaContainer").offset().top - 70); - } - //*/ - - // timeout because it SEEMS to be beneficial for initting the layout - // 2013-09-18 seems beneficial since when? - setTimeout(_startOrientationAndChangeEventListening, 1000); -} - -function _startOrientationAndChangeEventListening() { - // Initial execution if needed - - $(window).on('resize', doOnResize); - -// if (!window.addEventListener) { -// window.attachEvent('orientationchange', doOnOrientationChange, false); -// window.attachEvent('resize', doOnResize, false); -// } else { -// window.addEventListener('orientationchange', doOnOrientationChange, false); -// window.addEventListener('resize', doOnResize, false); -// } - - // is it necessary to call these? Aren't they called by the above eventhandlers? -// doClientAndOrientationStuff(); - doOnResize(); -} diff --git a/js_old/libs/bootstrap.js b/js_old/libs/bootstrap.js deleted file mode 100644 index 643e71c..0000000 --- a/js_old/libs/bootstrap.js +++ /dev/null @@ -1,2280 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $(function () { - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - /* ALERT DATA-API - * ============== */ - - $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - if (this.interval) clearInterval(this.interval); - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , getActiveIndex: function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - return this.$items.index(this.$active) - } - - , to: function (pos) { - var activeIndex = this.getActiveIndex() - , that = this - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('