From 15d185318697621b3fa05ace8e4432815247f1b7 Mon Sep 17 00:00:00 2001 From: Jake <jake.read@cba.mit.edu> Date: Sat, 11 Aug 2018 10:51:29 -0400 Subject: [PATCH] mud printer --- README.md | 2 + files.html | 9 +- js/atkbridge.js | 2 +- modules/hardware/test | 104 ++++++++ modules/index.js | 6 +- modules/motion/gcodeParser | 2 +- modules/motion/machineController | 10 + modules/motion/moveInstructionQue | 170 +++++++++++++ modules/motion/planner | 11 +- modules/motion/planner-ye-olden | 407 ------------------------------ modules/motion/textBlockIn | 5 +- tinymachine-image.png | Bin 208405 -> 0 bytes tinymachine-planner-02 | 1 - tinymachine-planning | 1 - 14 files changed, 311 insertions(+), 419 deletions(-) create mode 100644 modules/hardware/test create mode 100644 modules/motion/moveInstructionQue delete mode 100644 modules/motion/planner-ye-olden delete mode 100644 tinymachine-image.png delete mode 100644 tinymachine-planner-02 delete mode 100644 tinymachine-planning diff --git a/README.md b/README.md index 5bd31cd..fbf44cd 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ - SVG export - ... +298 + # To install and run mods locally You need to first install [node.js](https://docs.npmjs.com/getting-started/installing-node). diff --git a/files.html b/files.html index 1733a50..ca9bed4 100644 --- a/files.html +++ b/files.html @@ -13,7 +13,7 @@ <a href='./files.html'>files.html</a><br> <a href='./index.html'>index.html</a><br> <i> js</i><br> - <a href='./js/atkserialserver.js'>atkserialserver.js</a><br> + <a href='./js/atkbridge.js'>atkbridge.js</a><br> <a href='./js/deviceserver.js'>deviceserver.js</a><br> <a href='./js/echoserver.js'>echoserver.js</a><br> <a href='./js/files.js'>files.js</a><br> @@ -106,7 +106,10 @@ <a href='./modules/hardware/motors/stepper'>stepper</a><br> <i> network</i><br> <a href='./modules/hardware/network/atkbridge'>atkbridge</a><br> + <a href='./modules/hardware/pot'>pot</a><br> + <a href='./modules/hardware/profile'>profile</a><br> <a href='./modules/hardware/reset'>reset</a><br> + <a href='./modules/hardware/test'>test</a><br> <i> image</i><br> <a href='./modules/image/boundingbox'>boundingbox</a><br> <a href='./modules/image/color%20separation'>color separation</a><br> @@ -148,8 +151,9 @@ <i> motion</i><br> <a href='./modules/motion/gcodeParser'>gcodeParser</a><br> <a href='./modules/motion/machineController'>machineController</a><br> + <a href='./modules/motion/moveInstructionQue'>moveInstructionQue</a><br> + <a href='./modules/motion/neilParser'>neilParser</a><br> <a href='./modules/motion/planner'>planner</a><br> - <a href='./modules/motion/planner-ye-olden'>planner-ye-olden</a><br> <a href='./modules/motion/segments'>segments</a><br> <a href='./modules/motion/textBlockIn'>textBlockIn</a><br> <a href='./modules/motion/textLineIn'>textLineIn</a><br> @@ -1684,7 +1688,6 @@ <a href='./node_modules/xtend/package.json'>package.json</a><br> <a href='./node_modules/xtend/README.md'>README.md</a><br> <a href='./node_modules/xtend/test.js'>test.js</a><br> - <a href='./planner-pre'>planner-pre</a><br> <i> programs</i><br> <i> frep</i><br> <a href='./programs/frep/gears'>gears</a><br> diff --git a/js/atkbridge.js b/js/atkbridge.js index ea24c42..a185cae 100644 --- a/js/atkbridge.js +++ b/js/atkbridge.js @@ -21,7 +21,7 @@ if (process.argv.length < 4 && process.argv[2] != 'default') { } else if (process.argv[2] === 'default' || process.argv.length < 3) { client_address = '::ffff:127.0.0.1' server_port = '6789' - com_port = 'COM8' + com_port = 'COM3' } else { client_address = process.argv[2] server_port = process.argv[3] diff --git a/modules/hardware/test b/modules/hardware/test new file mode 100644 index 0000000..f84934c --- /dev/null +++ b/modules/hardware/test @@ -0,0 +1,104 @@ +// +// hardware reset command +// +// Neil Gershenfeld and Jake Read +// (c) Massachusetts Institute of Technology 2018 +// +// This work may be reproduced, modified, distributed, performed, and +// displayed for any purpose, but must acknowledge the mods +// project. Copyright is retained and must be preserved. The work is +// provided as is; no warranty is provided, and users accept all +// liability. +// +// closure +// +(function() { + // globals + var mod = {} + + // name + var name = 'test' + + var init = function() { + // + } + + var inputs = { + // + } + + var outputs = { + test: { + type: 'packet', + label: 'headless packet out', + event: function() { + var test = [127] + mods.output(mod, 'test', test) + } + } + } + + var interface = function(div) { + mod.div = div + + mod.resetButton = make_button_input(div, 'send') + mod.resetButton.addEventListener('click', function() { + outputs.test.event() + }) + } + + + /* + UI helpers + */ + function make_text_input(div, name, size) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(name + ': ')) + var input = document.createElement('input') + input.type = 'text' + input.size = size + div.appendChild(input) + + return input + } + + function make_button_input(div, text) { + div.appendChild(document.createElement('br')) + var button = document.createElement('button') + button.style.padding = mods.ui.padding + button.style.margin = 1 + button.appendChild(document.createTextNode(text)) + div.appendChild(button) + + return button + } + + function make_checkbox_input(div, prefix) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(prefix + ': ')) + var checkbox = document.createElement('input') + checkbox.type = 'checkbox' + div.appendChild(checkbox) + + return checkbox + } + + function make_text_display(div, prefix) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(prefix + ': ')) + var span = document.createElement('span') + span.innerHTML = '' + div.appendChild(span) + + return span + } + + return ({ + mod: mod, + name: name, + init: init, + inputs: inputs, + outputs: outputs, + interface: interface + }) +}()) \ No newline at end of file diff --git a/modules/index.js b/modules/index.js index 2cb8cd9..7ad1ad1 100644 --- a/modules/index.js +++ b/modules/index.js @@ -77,7 +77,10 @@ module_label(' motors') module_menu(' stepper','modules/hardware/motors/stepper') module_label(' network') module_menu(' atkbridge','modules/hardware/network/atkbridge') +module_menu(' pot','modules/hardware/pot') +module_menu(' profile','modules/hardware/profile') module_menu(' reset','modules/hardware/reset') +module_menu(' test','modules/hardware/test') module_label('image') module_menu(' boundingbox','modules/image/boundingbox') module_menu(' color separation','modules/image/color%20separation') @@ -118,8 +121,9 @@ module_menu(' move','modules/module/move') module_label('motion') module_menu(' gcodeParser','modules/motion/gcodeParser') module_menu(' machineController','modules/motion/machineController') +module_menu(' moveInstructionQue','modules/motion/moveInstructionQue') +module_menu(' neilParser','modules/motion/neilParser') module_menu(' planner','modules/motion/planner') -module_menu(' planner-ye-olden','modules/motion/planner-ye-olden') module_menu(' segments','modules/motion/segments') module_menu(' textBlockIn','modules/motion/textBlockIn') module_menu(' textLineIn','modules/motion/textLineIn') diff --git a/modules/motion/gcodeParser b/modules/motion/gcodeParser index f14249c..3af139d 100644 --- a/modules/motion/gcodeParser +++ b/modules/motion/gcodeParser @@ -92,7 +92,7 @@ turns lines of text into objects for machine controller } // loop to find position vals, check for feed update for (key in keyvals) { - if (key.match('[A-CX-Z]')) { + if (key.match('[A-EX-Z]')) { output.position[key] = keyvals[key] } else if (key.match('[F]')){ if(mod.codeMode.value == 'G0'){ diff --git a/modules/motion/machineController b/modules/motion/machineController index 675b09f..3e4ac1f 100644 --- a/modules/motion/machineController +++ b/modules/motion/machineController @@ -107,6 +107,16 @@ dishes gcodes -> planner, spindle codes -> spindle jog('Y', -parseFloat(mod.jogStepSizeIn.value)) }) + mod.jogYPButton = make_button_input(div, 'z+') + mod.jogYPButton.addEventListener('click', function(evt) { + jog('Z', parseFloat(mod.jogStepSizeIn.value)) + }) + + mod.jogYMButton = make_button_input(div, 'z-') + mod.jogYMButton.addEventListener('click', function(evt) { + jog('Z', -parseFloat(mod.jogStepSizeIn.value)) + }) + // sequence begin, stop mod.startSequenceButton = make_button_input(div, 'start sequence') diff --git a/modules/motion/moveInstructionQue b/modules/motion/moveInstructionQue new file mode 100644 index 0000000..b0fc3ec --- /dev/null +++ b/modules/motion/moveInstructionQue @@ -0,0 +1,170 @@ +// +// generic line input +// +// Neil Gershenfeld and Jake Read +// (c) Massachusetts Institute of Technology 2018 +// +// This work may be reproduced, modified, distributed, performed, and +// displayed for any purpose, but must acknowledge the mods +// project. Copyright is retained and must be preserved. The work is +// provided as is; no warranty is provided, and users accept all +// liability. +// +// closure +// +(function() { + // + // module globals + // + var mod = {} + // + // name + // + var name = 'move instruction queue' + // + // initialization + // + var init = function() { + + } + // + // inputs + // + var inputs = { + lineRequest: { + type: 'number', + label: 'line request', + event: function(evt) { + sendLine() + } + }, + instructions: { + type: 'objects', + label: 'move instructions', + event: function(evt){ + newInstructions(evt.detail) + } + } + } + // + // outputs + // + var outputs = { + instruction: { + type: 'object', + label: 'instruction', + event: function(instr) { + mods.output(mod, 'instruction', instr) + } + } + } + // + // interface + // + var interface = function(div) { + mod.div = div + // + // inputs + // + mod.lineCountDisplay = make_text_display(div, 'current line') + mod.resetCurrentLine = make_button_input(div, 'reset lines') + mod.resetCurrentLine.addEventListener('click', function(){ + mod.lineCountDisplay.innerHTML = '0' + currentLine = 0 + }) + mod.sendOneLine = make_button_input(div, 'send a line') + mod.sendOneLine.addEventListener('click', function(){ + sendLine() + }) + } + + var currentLine = 0 + var moveArray = [] + + function newInstructions(instructions){ + moveArray = instructions + } + + function sendLine() { + var moveOut = moveArray[currentLine] + currentLine++ + if (currentLine > moveArray.length) { + currentLine = moveArray.length + } else { + outputs.instruction.event(moveOut) + } + mod.lineCountDisplay.innerHTML = currentLine.toString() + } + + + /* + UI helpers + */ + function make_text_input(div, name, size) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(name + ': ')) + var input = document.createElement('input') + input.type = 'text' + input.size = size + div.appendChild(input) + + return input + } + + function makeTextArea(div, name, width, height) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(name + ': ')) + div.appendChild(document.createElement('br')) + var textArea = document.createElement('textarea') + textArea.setAttribute('cols', width) + textArea.setAttribute('rows', height) + textArea.type = 'textarea' + div.appendChild(textArea) + + return textArea + } + + function make_button_input(div, text) { + div.appendChild(document.createElement('br')) + var button = document.createElement('button') + button.style.padding = mods.ui.padding + button.style.margin = 1 + button.appendChild(document.createTextNode(text)) + div.appendChild(button) + + return button + } + + function make_checkbox_input(div, prefix) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(prefix + ': ')) + var checkbox = document.createElement('input') + checkbox.type = 'checkbox' + div.appendChild(checkbox) + + return checkbox + } + + function make_text_display(div, prefix) { + div.appendChild(document.createElement('br')) + div.appendChild(document.createTextNode(prefix + ': ')) + var span = document.createElement('span') + span.innerHTML = '' + div.appendChild(span) + + return span + } + + + // + // return values + // + return ({ + mod: mod, + name: name, + init: init, + inputs: inputs, + outputs: outputs, + interface: interface + }) +}()) \ No newline at end of file diff --git a/modules/motion/planner b/modules/motion/planner index 891da8d..34a6ef3 100644 --- a/modules/motion/planner +++ b/modules/motion/planner @@ -48,9 +48,9 @@ motors var init = function() { mod.accelIn.value = '500' mod.junctionDeviationIn.value = '1' - mod.minSpeedIn.value = '4' + mod.minSpeedIn.value = '12' - mod.axisIdentifiers.value = 'X,Y' + mod.axisIdentifiers.value = 'X,Y,Z' resetNetwork() mod.netWindowIn.value = '12' @@ -211,13 +211,18 @@ motors */ if(ok){ var opening = packetWindowSize - axisNetCounters[0] + var newrequest = true if(opening > moveQue.length){ opening = moveQue.length + newrequest = false + } for(var i = 0; i < opening; i++){ //console.log('sending', i) sendMove() - outputs.moveComplete.event() + if(newrequest){ + outputs.moveComplete.event() + } } } } diff --git a/modules/motion/planner-ye-olden b/modules/motion/planner-ye-olden deleted file mode 100644 index 506b806..0000000 --- a/modules/motion/planner-ye-olden +++ /dev/null @@ -1,407 +0,0 @@ -// -// converts toolpath objects into segments for accel planning -// -// Neil Gershenfeld and Jake Read -// (c) Massachusetts Institute of Technology 2018 -// -// This work may be reproduced, modified, distributed, performed, and -// displayed for any purpose, but must acknowledge the mods -// project. Copyright is retained and must be preserved. The work is -// provided as is; no warranty is provided, and users accept all -// liability. - - -/* -eats objects like -var move = { - position: { - X: float - Y: float - Z: float - A: float - } - rate: float -} - - -*/ - -// -// closure -// -(function() { - // - // module globals - // - var mod = {} - // - // name - // - var name = 'motion planner' - // - // initialization - // - var init = function() { - mod.accel_in.value = '25' - mod.junction_deviation_in.value = '0.5' - mod.current_block_in.value = '0' - mod.current_window_size_in.value = '0' - mod.window = 0 - mod.packets_awaiting_reply = 0 - } - // - // inputs - var twoCount = 0 - // - var inputs = { - segments: { - type: 'objects', - label: 'segments', - event: function(evt) { - mod.segments = JSON.parse(JSON.stringify(evt.detail)) // dereference pls - // console.log('segments to planner: ', mod.segments) - runQueue() - } - }, - next: { - type: 'event', - label: 'call for next block', - event: function(evt) { - twoCount++ - if (twoCount > 1) { - mod.packets_awaiting_reply--; - if (mod.packets_awaiting_reply < mod.window) { - sendBlock() - } - twoCount = 0 - } - } - } - } - // - // outputs - // - var outputs = { - nextblock: { - type: 'object', - label: 'next block', - event: function() { - //mods.output(mod, 'segments', null) - } - } - } - // - // interface - // - var interface = function(div) { - mod.div = div - // - // inputs - // - // settings - mod.accel_in = make_text_input(div, 'acceleration, mm/s/s', 12) - mod.junction_deviation_in = make_text_input(div, 'junction deviation, mm', 12) - // - // request to do the business - // - mod.parse_button = make_button_input(div, 'parse') - mod.parse_button.addEventListener('click', function() { - runQueue() - }) - - // current block - mod.current_block_in = make_text_input(div, 'next block to send', 12) - - mod.current_window_size_in = make_text_input(div, 'current window size', 12) - - // - // send a block - // - mod.send_button = make_button_input(div, 'send next block') - mod.send_button.addEventListener('click', function() { - sendBlock() - }) - mod.open_window_button = make_button_input(div, 'open transmit window') - mod.open_window_button.addEventListener('click', function() { - console.log('opening window') - if (mod.window < 2) { - mod.window = 3 - } else { - mod.window++ - } - mod.current_window_size_in.value = mod.window.toString() - mod.packets_awaiting_reply = 0 - while (mod.packets_awaiting_reply < mod.window) { - sendBlock() - } - }) - mod.close_window_button = make_button_input(div, 'close transmit window') - mod.close_window_button.addEventListener('click', function() { - mod.window = 0; - mod.current_window_size_in.value = mod.window.toString() - }) - } - - function cartesianDistance(p1, p2) { - // takes p1, p2 to be arrays of same length - // computes cartesian distance - var sum = 0 - for (var i = 0; i < p1.length; i++) { - sum += Math.pow((p1[i] - p2[i]), 2) - } - return Math.sqrt(sum) - } - - function cartesianLength(v) { - // length of vector - var sum = 0 - for (var i = 0; i < v.length; i++) { - sum += Math.pow(v[i], 2) - } - return Math.sqrt(sum) - } - - function addMatrix(a, b, c) { - // c = a + b - a.forEach(function(item, index) { - c[index] = b[index] + a[index] - }) - } - - function subtractMatrix(a, b, c) { - // c = a - b - b.forEach(function(item, index) { - c[index] = a[index] - b[index] - }) - } - - function multiplyMatrix(a, scalar, b) { - // b = a * scalar - a.forEach(function(item, index) { - b[index] = a[index] * scalar - }) - } - - function multiply2dMatrix(a, scalar, b) { - // b = a * scalar - for (var i = 0; i < a.length; i++) { - for (var j = 0; j < a[i].length; j++) { - b[i][j] = a[i][j] * scalar; - } - } - } - - function divideMatrix(a, scalar, b) { - // b = a / scalar - for (var i = 0; i < a.length; i++) { - b[i] = a[i] / scalar - } - } - - function unitVector(p1, p2) { - // returns new array, is unit vector of p2-p1 - var unit = new Array() - subtractMatrix(p2, p1, unit) - var length = cartesianLength(unit) - divideMatrix(unit, length, unit) - - return unit - } - - function dotProduct(a, b) { - // returns a dot b - var sum = 0; - for (var i = 0; i < a.length; i++) { - sum += a[i] * b[i] - } - - return sum - } - - function toFixedMatrix(a, digits) { - var rounded = new Array() - for (var i = 0; i < a.length; i++) { - rounded[i] = a[i].toFixed(digits) - } - - return rounded - } - - /* - now: - - start from segment and find a corner - do planner - - */ - - // - // local functions - // - function runQueue() { - // converting from mm/s or dpi (pixel units) to mm based units - // https://github.com/grbl/grbl/blob/master/grbl/planner.c - // https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/ - /* - first we walk the queue: - going backwards, end at 0 speed exit - - find junction speed (junction deviation) between this and previous block - - this is entry speed, calculate trapezoid to exit speed - next block - - exit speed is recently calculated entry speed - - do junction deviation, this is entry speed - - calculate trapezoid - .. why is this simpler? find entry and exit speed of each block, - find accel limits per axis, do trapezoid with that accel - - */ - - var jdsize = parseFloat(mod.junction_deviation_in.value) - var accel = parseFloat(mod.accel_in.value) - - mod.segments[mod.segments.length - 1].exit = 0 // trailing edge always full stop - - for (var i = mod.segments.length - 1; i > 0; i--) { - // reverse pass - // find junction deviation - /* - - really, could only do this once per segment when a new one is added - - unitize entry and exit vectors - - find cos(theta) = Ventry dot Vexit / (|Ventry| * |Vexit|) -> this is (1*1 bc unit) - - find sin(theta/2) = sqrt((1-cos(theta))/2) - - find r = j(sin(theta/2)/(1-sin(theta/2))) - - find Fj = sqrt(Ac*r) - - junction speed is min(Fj, min(entry,exit)) - */ - - var v_entry = unitVector(mod.segments[i - 1].p1, mod.segments[i - 1].p2) - var v_exit = unitVector(mod.segments[i].p1, mod.segments[i].p2) - //console.log('unit entry, unit exit', toFixedMatrix(v_entry, 3), toFixedMatrix(v_exit, 3)) - var cos_theta = dotProduct(v_entry, v_exit) // dot product / mag * mag where mags are 1 each bc unit - // catch corner cases (get it? - actually they are very straight cases, or very turnaround cases) - if (cos_theta < -0.9999999999999) { - cos_theta = -0.9999999999999 - } else if (cos_theta > 0.9999999999999) { - cos_theta = 0.9999999999999 - } - //console.log('cos_theta', cos_theta, Math.acos(cos_theta) * (180 / Math.PI)) - var sin_theta_overtwo = Math.sqrt((1 - cos_theta) / 2) - //console.log('sin_theta_overtwo', sin_theta_overtwo) - var radius = jdsize * ((1 - sin_theta_overtwo) / sin_theta_overtwo) - //console.log('radius', radius) - var fj = Math.sqrt(accel * radius) - //console.log('fj', fj) - - var feed_junction = Math.min(fj, mod.segments[i].cruise, mod.segments[i - 1].cruise) - //console.log('feed_junction', feed_junction) - - // ok we have the maximum feed at the preceeding junction - // now: find the maximum entry speeds as if we spent the whole block decelerating - - // size of segment - var distance = cartesianDistance(mod.segments[i].p1, mod.segments[i].p2) - //console.log('distance', distance) - var max_entry_speed = Math.sqrt(mod.segments[i].exit * mod.segments[i].exit + 2 * distance * accel) - //console.log('max_entry_speed', max_entry_speed) - var entry_speed = Math.min(max_entry_speed, feed_junction) - //console.log('entry_speed', entry_speed) - mod.segments[i].entry = entry_speed - mod.segments[i - 1].exit = entry_speed - //console.log('segment:', mod.segments[i]) - mod.segments[i].accel = accel - mod.segments[i].distance = distance - } - - // bad bad not very good implementation to start: - mod.segments[0].entry = 0 - mod.segments[0].accel = accel - mod.segments[0].distance = cartesianDistance(mod.segments[0].p1, mod.segments[0].p2) - - // forward pass to make sure we can accelerate to set exit speed in length - for (var i = 0; i < mod.segments.length - 1; i++) { - var distance = mod.segments[i].distance - var max_exit_speed = Math.sqrt(mod.segments[i].entry * mod.segments[i].entry + 2 * distance * accel) - - if (max_exit_speed < mod.segments[i + 1].entry_speed) { - mod.segments[i + 1].entry = max_exit_speed - mod.segments[i].exit = max_exit_speed - } - } - - console.log('segments in planner:', mod.segments) - - } - - function sendBlock() { - var index = parseInt(mod.current_block_in.value) - if (index < 0) { - index = 0 - } else if (index > mod.segments.length - 1) { - index = 0 - } - - mods.output(mod, 'nextblock', mod.segments[index]) - mod.packets_awaiting_reply++; - - index++ - mod.current_block_in.value = index - } - - - /* - UI helpers - */ - function make_text_input(div, name, size) { - div.appendChild(document.createElement('br')) - div.appendChild(document.createTextNode(name + ': ')) - var input = document.createElement('input') - input.type = 'text' - input.size = size - div.appendChild(input) - - return input - } - - function make_button_input(div, text) { - div.appendChild(document.createElement('br')) - var button = document.createElement('button') - button.style.padding = mods.ui.padding - button.style.margin = 1 - button.appendChild(document.createTextNode(text)) - div.appendChild(button) - - return button - } - - function make_checkbox_input(div, prefix) { - div.appendChild(document.createElement('br')) - div.appendChild(document.createTextNode(prefix + ': ')) - var checkbox = document.createElement('input') - checkbox.type = 'checkbox' - div.appendChild(checkbox) - - return checkbox - } - - function make_text_display(div, prefix) { - div.appendChild(document.createElement('br')) - div.appendChild(document.createTextNode(prefix + ': ')) - var span = document.createElement('span') - span.innerHTML = '' - div.appendChild(span) - - return span - } - - // - // return values - // - return ({ - mod: mod, - name: name, - init: init, - inputs: inputs, - outputs: outputs, - interface: interface - }) -}()) \ No newline at end of file diff --git a/modules/motion/textBlockIn b/modules/motion/textBlockIn index f5f39c1..66b6541 100644 --- a/modules/motion/textBlockIn +++ b/modules/motion/textBlockIn @@ -152,7 +152,10 @@ X0 Y0\n\ " mod.lineCountDisplay.innerHTML = '0' currentLine = 0 }) - mod.textAreaIn = makeTextArea(div, 'lines', 24, 48) + mod.textAreaIn = makeTextArea(div, 'lines', 48, 48) + mod.textAreaIn.addEventListener('change', function(){ + linesToArray() + }) } var currentLine = 0 diff --git a/tinymachine-image.png b/tinymachine-image.png deleted file mode 100644 index c0bf09d12c14419ce426769adc3a843bf2da95bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208405 zcmeAS@N?(olHy`uVBq!ia0y~yU~gbxV6os}VqjoM-xwysz`(#+;1OBOz`%C|gc+x5 z^GP!>C@^@sIEGZrd2_ciM!5W!#fNl@LxL<WCLKzQ+ACa}*2>)a`*ypN_SUBCEpoZy zr^2>xy?b=6*Y=1FTci1R9bJ6s?bb_6H*Av&)k)CZw&HCb>%~0Qm0V#R=8i6$ER!6J z_S>s*TBa4Xv((&Mzwg(fnJ3fd&9o`Do%xgJ;ogZXEiy-*|INJj#=+ga@m>68d0&gV zMaM1%F8D37Ouk6xjKh<N8I3148Zb{}PW+{K{1A@|-@`{Q7zCU+6kA{fuYX>7{M+IZ zo)`Z_KkZwr?0_V9llLBDFH9jw%L%;=3^Wk9BO}Y;bZnvu!vq$`il2So`RXRAEPVd# z`lNNQ`}(-=>KiamRGz?a#NxW0LWlI<yesxo4^OQZa$Hxd$5I%at>d(<NwPzR+gQL- zEKQ+E!N>kdOi^4tCxcn;zY7-|7cAs`-{5wxkEKbWK|vwmj?ep#-Mdro-3`+3f3Upf z*bza!ca^i_?@rr)?xNwMhdjmtmMz)>3=>{m-aFwgD}$Z`!vqJd^@cGG3=PX`cFmW( zxbmO6lUWOzg*i^g`gtYouU!mWpveEe!OgE%rBT6yKfnGz=gHc<$wzFJ!kbiLPrQ?B z`ta-QHQCHR>WlAH=ZlwG981>UWO>HniAE8F_@qDf`kwZjM{I-m7+3^Y7#$|DEM#D4 zu<-BXW@K1Ukg_DB;t-EZUn|sZfo1Ye84;Vl%U+nOZIdR#@y15@i9+?aH$T5z_W#;0 zE+!^tU3NxovjWEl`OgUnE>-%1%U-<y^hrU4D}X_9`uF^rRIUFfSA4hoX|{gBq=Yqp zQ)MmpXLBcij&wgKuj9Abb4k^ud$wn9?67^FUEuc8m0kM0eCWUM&w0Bn=Wo3>iB~jq z{*$xY-yF`#-!{GbUiloO{BMtzKf81$>*Jl7oR@WHPv$%0kk&ly*s=6nzoh6RcMo3; z{a#?n@zVU@Ui}+;?WbI|zqq$wfkS-Kf?drEoj41pw(j^|eD}9}!F0pzi4U@kUQ3^` zS`>HqdB5DvlzUAxY>#g#_kUfp@XOB}uVy}<kl%-ROyobyn7_?hb7Iq)z}v=KzHeKw za`9LD@GEovd^!?txu3Z~{r@M=lgHM$%zY^r`RRCTzq?eP_jiqU$&7u9lN#Gz=r*Ok zoVDZ6-0$~(RNsp?-?LMzIy8%i!N#Kc<!1kXWsA<0G$yOF{H(mVy-_m5E;@CAv229- z+pLhenb~uB=h@%Nc)=6%^x>7MtLIfe?DxK0zyHC?pM^0D685HMioY5i=Duuu#228Q z?kE1ybX!<-O|xI+O7HXEtRuX|Kb+iO6SV2;eEEE>iub+y_wUq^W03Q!HT?W?3VZ3Y z*#<Mk1s~<FSn7Df;Yq};>dlS+*^Jxd`|9%!Y8>9c&6i@iF(M`|?%%)Pth1Q8xyr&q zLbhz(8hL-;YH4kQ9KGx}?{}%ZtG%?Yevjz>uU{ipuGt^1^#6CZ@w8=rXZ|0*{(Aer z<JoT>$0er;>iLyf*PmRyF<5-rbPKB<#y^i{Ew*e_S6+TD@L#y8(eWw9#?d#oE2_S1 zePhJnQ9b?HtLsAd?#=V;G@kGMIGgW`NBj(n>Srqg+4yfQJIJ%ew0cfIpI6d%&!<Iq ze|x`~TgUJrI=^%MZ0*};Q`@GqFx-jpU}|6}Q1wtasZzFn|8DNvXI1a5zOJ^}c-ikO z(<~<jKX;iH$NT(t@%4${-n}dp*3Sv7TgZOf-H-8XP1&;7aqWkAw#e2M1|3+r_oteF z{%Vz!jN@U|`B#^T*xITlUJG`&`g4f!!RzmF9;eURvoU<${3$H;Nc26Mv;}Wx%x=v3 zc0+#F&1J0C&n@-$Za4XH?BM>troZ1y-@6s5|4oXQVZY4%-M?SU>oFgA^5f>l;N~9l zX2}feWho1GKK<lq5%jq`yU*;?g2=D$AN91p+I-M=>)l1S4!iw2(H+0#*Tw_4@7I4j zY5!g9|L+M7hd!}3yngO~{mTDad~NmrC6rz+KQ(h@agwoDZcXNc9&xEHI`<CVy7edA zdmjJJpiSTU^`E8udz!y|_l;!62g^V8bMIU6gOy>~`N$bl4w!D;2ucP8%+t58`p;(B zaQ|Fg+qMgT4u3pfZ~a^H^sSOjU7S)u)AZx-T~=PV%8HGl{$H^ggNVo*o3b|*Nsr#7 zo}LzYe_#9!r$g3G*VN03l{pVBUisATSTKKHl=WPe2pj#H<LdYKeg630t++`<<>G6x z$HGE4YL}k*HIpy=rE6xeUY*2D#-pb0k82%OUbS_rPF(s~N_*3_r4|PjZz}!%Cjar< zr&*T8Rtz;^L0k-yFS&(<lCrYSg~{0E)&8E*c<y{-XYTti%ng$3_D-r}o$#T4%{|)( zx81egZ+WlI$T8!c+SD%-9S-P}pA=uRzDZ(@T|$wb+2{0LZ{`iBL)rKL@Za<8lI1J! zS*4oVZwzNAG8kV-lbm6e?e+WQ4aEY{T(P^pFX!6-xw_5x0M8MgEhpa0Y31+mTX*;8 z-cR@A#oujSqj=`PZ#!o1%feoaoBHO=Ut_NI`sI$k_sgb9{rPcNvcFG!e)W5Yxu5Q* z_x-#6rSks%m*!6_ysOlo+X`2{|Iy{UN;=|uzV?=7J3(=v@#^-R(s$)@f0#^GWL=o` zG%b78`GhqLu{#ebw}(%Qv$0<-r?A#%+HDhMqt$W@i$2fxOD|$%V6jeK>Bx|ox+(VL z0!src`}xaryaEKI9evFWB&B{C8HY16gf^>rPFiIb%)Hk8(|=pleOd*RH^kh%<EgMs zeusK<x4w-i=Yvmm7dzk1kLRjO@Y;W;RVDUV8+*%f+h2F3*-q6*x}Q70EB3aayg4I- z%U1bgX)FA^)b>~ZvN<1KoN#OR^6MXK7#SAqEID^armpa;Hz-PH2Xf6WGgZ5LcglyX zjUPX3?wd2ewEFa+FG4qh3QH0#uHL!mv360!wTYjL53OuuHr`uR@T#ly)>{YTmiBU) zIlGeP-b*p*UA;{3>b0%f(hu#;c0S(Sa_P&WW{}x419vTblyRmv=tN_%>E~?>YnT}x zh+p3$@_uz()~~6_1(9iY_4eAdp8w36p*Q#Q(H+f}g?3Wezx|Jf?wS2Qbo1qOmM>m^ zrsrvSSWMj+`B=NU;M*mM`~TuPU5d8<e0__XLBQf+BSZL17p-@1UcFuZ{{EU3KNJ`O z+~b=RRy@`-y-@YNoXtpeo?Dd!XWVkx7fka786LjwGt;w`n#t5W<woZFc`?>k*M?sT z`@27S^6`7Wj?ceuu_x!T`s7=FF}zP$C)!SuUVeY|*BYz5DNdKP-|qSKIov*mv7vL% zOJ#>km$fIB+}&ICT8`oL(XH_d%Z0bZUe>o+psyG8>LN2&xKUq7PEr2*i9)B&{S!Ix zNu^#`jZq<1<OmP{%O#&T9V_EM%p0{``O=2Wq8%?jiC<Z{r!`(?^Onfqn)P+l7uz?T zdOmsa^|PGUPbdY82ipg>vz~F7osv*>>BzTT;al4?-!p9O>vwNlKeOd$)Z62}DK}of zl4nwrvs^#*j8yR+iN&|7U+XH|oj6PE@v<r3@;sM(h_|o)_s;QtT<3Y=)teT-`potF z%ktR<m0io7lqPyq@3zXnFM9bLi}8g#$rBTtqOW|Hdi|dN^H)E)11-hIb0r(gqMps( zaH+vgLe1Z;eN*ez`7irBX8+H5uy@vKmy`wB>suZiJMx43eB6?gKE5*=o2NEfbuN_u znHpR+X;ymMt1Tf*mEJlqr%#pbdCksX=F4YN_4~83V6v_CtNqvH4Gq;A@BV%L_8)_P ztIMe*_6-Z8?|4t{a@PLK;81P8DCuM1v9#&CcyuqPbzHLx*s8#G{^Jb3k8R~WCA))v zX$uC2Uq2)%T$@+>pZ~95|FYD+z143vd7p{+9@qK%io5Xf80)a?l<V#rv)P{Q`6u*N zo8A7`gZx?l_mus;w(P9@t&~2G$#rWhCs^OVuq3j1+ooSUY9$8)=TGJSz0@c(GU{Z_ zwWJ?GT2nnwUwXCq-Z~bB6)}P{k7`f$Txyh=Tz9u-)$ZqwjlUO0?5tm1W8EFDH}%w# zpfz^<<}+um77|Vm50%}V`&E+R#^OCp%Y4gtxu$)YY!o?v`tsw|zpd<a_kIcd*je7C zx1sj<mv35oYWFU)w@ZB`Y#ig(XK-zvf6W8eS0_#H@2HHv!aR9F!mBwabV~)MFMA`J zExUeiiQkhemJ_32G5uukzU*~bxNqC>v$vTd-G3BZSaNIrv{KD0&cg1q52t6^^dHk- zH<Nj3@s#VLuiVdhKisIauZ-EQ@vZ8_E0NRhrBwCuABkrWK0H;|M~1gtpTUQ-g*$X9 zL&3tm(hLk<`CHg~ycaiBW}Z6Azp~vrq}~7T)WchJZe5-p$NOCVY>Uv>Th}at{%U_- zIcxTX+dItNSO4Pa*O_U$>G7FxcD^vVeSD3Ejts(T{mI|Ux5ezO+RPrq`)5sjNX>?2 z&)%Gwc{#WG4(l0*wMQ;<o^<%&^Hyh$;nxh~uLcV~-6;_evVMKSD(-jq=SOLJzr<VG zc-9E5@5r$Db;~+`-dhRNw?|nleuFC7_;*F}vO>HJ4AWoN*+rKxT)A@f`MZ-}zVz<; zdr3dF%3OWo7ru}l8CN!zlRqC<i~sTv`{^zA(^KrH*Ys8oCX1r~flIz?9G#(ZG=I5Q zk6FgwK8?D&7ms~*m#!37p6Z$LQ9OOZi+8LH5--jKem1=KXXmcSlv7EU-kfUVJ>#(2 z*Z@?GY&H?^eI+~P+{Zw5&X>2BpLbsC+)!t<`niR`>~~Cgv&8S$h5Yt7>$6qU_V;;P zQ}z8e3%^RWF-!k1+QzHWlwbBtbl!r$U#@nG&zcprF7EBi^3v}m>2o;K7R)ue@ZhCb ztD)%2{wr0_)1oudmdu`}w#MXE0*_F6EGt8U`@bDohi9+e^ncdI3CrcKfB1WSZPJ8p zmh|&+ds3IkG92KMS;DjAZ=I>q^;@Pd)78$-RJ>bwbIoQiW>KHI!XSpysEn2+?i>sZ zfuF^e{jWP1+-+j*utPQD)hp&!pF4{0Qr|qj{qnN^RO6n%ZPDdZ0ykQ1f2m~t^~~81 zQ+nDfnyuY#-POFiEalp(S7KWk7#uF$`pWu#@5l1BaT~Hum&Lzr`e*&zUuN~*oHYv> zznwntTOfG;>E`>NHwiDwx^OLg{=pVKi$$NmuYbhk@M)6CipNWf9DkPkO=g(1a3kL( zvmn;gcdL3cBY#UXF4(ANRbOw!z+he+92LgL;Gm+vOT~2B@?H5-yumHL^8W+BXvc6U zDden4+4A4^;M#w?%lF#El-1o-6ukTG%a`I}Wi?w7sZSSFE=|^*_=R!8v0Jah%Kk6; z`XuW6%KAM~JPfMq>$ZQ%IFr&~;-|18Pb!GN<<HKgyQR*b&(xc{xHkWj%v)p2w)hhB zw^>j87bNXiD`oc7U;p4y{^Y6lD~gy7s@L4T==SRHSu6d-mtpf<FZwOJTp^_%5E4Ft znIT|K;is3MH&4mk!rk2%FLR^N`RC$*<8Qke4#>OnF3g*H>F>pe{HF#w-S56wiqHPZ zxP9e}Vo<|})t)(F$NZ{!{o*^S&-}Q%h+S2vbIbO*ypAoqWA13NFuZvC=5w0#pB-GD zQohW_cfL!mm|5{l(UA50oxXcq8|#ybnOsY)@3AmgY<RX@ec!xgvr6+XPdxvRn<0Md zy_q)u&OPO3V7OYoTdeoXGbRoOHNVb}jq~C<U6S06_igjte^a>ncce?b2Iu}JZO;>X zPWrVrO%QZwa9XEe<9XfANsslX%8T@!I-M_nJ?F1;i`r7<UXpeCP)Wu2FS|~z+I@QM zk4IBp<Q@AcYstFerMOt|cdMDLX@)P$QV$EJDV&YzNm<Y+{q%~p#;wPTxq^Rhsq`r3 zSTK8W+G8v3h|=&Q^NV-A*mTb~uFY)e-TIhq(*HtYjxuj<X>qTZ2nvJc$B+0Yuw6QH z^bwCq$u8I9FD6F4zvDBrr7b<BWU1uD(kFk`NK1>ayI{ka(!U_;&&T=J^)1K${kZ;d znMn%Q8HZUrZ|E{_RoZ`IOLmft@e*sj=*qB_^OSR^bL;>6{5o^{zmLz&`LcOFe|g5h z;Bfe1Gw+9hPm3nD%`!cvd3pWsD`L%eO`<EO1a8*ao*8ZS_srP`Q_i$kI9t0dxIOn$ zo>$LI|Lp;G`w|%#0=9mAt2JZ()Z?ZbLc})Yvc0;0-RJJ_J)fSM=U9j@e>8zl@11k= zRd$o|tC=sg91rsF_gB4XN}dt;{Ws65eHJVJEm*spfnk!$?_aiiY~B2M-)HUC-dENw z^1W))@jj``@^arB%-b((Pn|3z`OrzjLp%HapTb@5t<ALR--QTU&GfDQZX(a;H+M7N zkE5oq=BL&&?5brp?ce7n@4jeu&%Q#dhm*HE{OkR;r7)90HPZjMZ-ev|&09xH9vg?Q zmARar&Ux|aU3b4#|3$wvbjk;RuV7uZe8P%(8`hN9r!R=i@4m)!Z&R7fq#HcP{Cj16 zxw7?QSnnG?-plKsz5h#bvFhCzM>(EPas_)?<8oSex36|`6H<Bjj59~x@&rev!48(@ z*{eCv-pq0j`IO~&>EIcqe^yUdZd)2Jll=S8w^Cu<_qQ&2Fo@-(p5rsVu#4x3xH@ah zkM_0IsT-ee3@UFuGA)3geNW1h%y@0{r3=`Xv1;U9-@1kAcD~5xzvpK(mYs6=Juh#j zjdF1KEX#fGUes6>g(w{`>~6l+B>7?i&y~JCPePk_t1+jyZ8@I0`kYo~waCJc$?4yd z73=t!|D@DJsX43t<=OZ}V{zJJ?^xMo^LM`V&z$ePM@@O=`iBqR?mq9{TPf7A?7FzH zfS$vp68FsgJT4xW6Uq)I3Ybq~SN*Nc$l$QSc)Ln&p%H`mr11G$HwrO01WZ_5dGGXD zo69rgW3Q`h$Xa${=8DzlXU<%GrM7U-|GGwBspWOYlsOm0uTywht8AhCcbT7*<SY5F zvlqOW!t(vVMcchbP76U}BrJ!1{9V4KW|_)I#wpt^=ALEL5ZrdSMdFp=(k<ok-21Dh zy>jX2XJ0PI%6-quwsML7SBackYc%)0T6kCd-^LFLXDoefn?jUw+Bt9aD_`7eA60Mk z_n3Ff+kJbMn=>*j5kDJrS8jIww#q}vu766a_5CBuw|xBbWHYFp;Vyl>_fKEdq;*f8 zuwG>OoBp>XobT+Wh@bOb@2s!;d~~@y+ltrkSnp3bZj$#rck0)joBmodFvQip^En#( zwQ&229}9kIs?0TKihlF&oCEI{MMJjyL(QcoZ*Qw_Y<;_L&(eHG2Ax~qHn@q)u=OVF zJo&qd;lTabsUH+FuYZaDmU%(^|JQFH6e1=&ymH>bSn*?$gV2(ulwO6{#tFZK)^L3I zP;@i=?cNuY6@G=8`SOX!{#$oMEOSB7oWf0Wt4>_}r0=I&zwVv(mCyTEwEif4_S`a< zfx)EHDkgy~YIbAh=4D&vo0ODG7|6<BO@4W6d3?lY!!;8g^|a2;+Rc1ClW+UiWl!Ed z(|SLh;Q)uf`Lp<NL*}<r8%-|8?bH1vX&bpU;8&ud+)7@fIjfhgF;V{X-0$kXzmi`2 ztobK;$5&o!;g@cewCIpr(X7V%qRiKa+qF7o+sR1P{~J#h{9g3$L;wFDOTN85|KV#U zV~gFkFNMWX*G*V1o!401XQXxQnOW}XUy_Hm@Tb@vH-0MM-(6OIYLDj3ZM*C&Yxow; zi~ryB^C1Jn1=)_bvl>ruTCP$TIJ?OBs(8EU+Q>@wl27Z7{kh>Wjh(@vr0(&|l&plv zS;uR_I2}sr>ZC-N8A9~F&sbj*?lf~s_FbQen>BQFuDtvn`Pc8zfddy$Pt)DJsdf^J z5C@Y7!y<payuXh=Hg-)6KKv^-=4g=R1P9T79txh99^DVxb({IJ)cO4^46DxZetMqw za86wLmWljVn!R5)#K#z`Z}@h&G+<U-wZZadce&F_56v$A5pv1f@_GNWj&)|;TaK;q z{#g)n*1Okqvzh81t8(t=Uv^Dj;j!X+?S+%qXZ!5`_-E(R$<jaFrGF}{TASV0xvEmO z*Yf|R%pV42t3EAjD2-x2dg)6`r~A46OX5U}i(iECecm)<@smqu*KRyDU0~JyjUOKG zo4k4YF`wuy1(RHq-sbKvTl4MH(Y_BH`!{gP1r?@?=h}04i=Dsv@}t*Zvo>ql?`!H= z4bm2L)p@ivr{_G+`Fyd}WPShU_@w9Ob?4T+D{s$!?s03?|8m}pxMhxyomOj<y{Wi2 zrQzK=y-fSdA>aJ$H(vSrbv@I04x4)s1?T&hPnf4@b0a0+nv<pC*94>RL)KDOzhm$J z`hMclX1guAGM4owGQ0e9BLjKFmNUN9{q{5dirkr>mv_HZ{dIZvucMLyb2e_MxV-Mz zXLoTXhK3d24)45me`T52&m*hny%4!tCo$V`_l#eiRx$}}QS%#@-PKrLUvtIBY1cPj z+c2ZILhNc6Vh`*(x$5|w^>TBvp6IE6U1s91_4?)1E#d!-V_&=OObx&F@7IF^-W+$E zL-r<g=EeOvf7AMIU}Lh<p_=MlyQ`jVd7I33%aA#9k*@FhS?*hz&xX$qotUvy>F>l_ z3bQ0Lw`HF45?&SFoo2xHEOMvn_D?&*x$adrU)O&5a_XIIn{Vf>&VCekeZ;cAak{{+ z4L2Bb#5-M-CT8#Fk}xhPFrJWBZz@oE^@PmZ*vWBeujWWzlAC_kcJ&g|!Y%p7BQIz5 zna;0``TXS4{xwy4Yr>uOcJ2yVV7V{$miU=3LQc>9?Jq}^P6^zUnz#C;I`dn*31wcY z!S7p_JMOk#dV31nFFC_~yY@wGf3@0v?fuwIrrX?=CVE&)@jah^N#=jCd$>{h1J#yw zamk0&et1<^tJvOE+UWA#A?H1hi{A;wxh*g5e_Hd?&xu<gNHcl+FAm9V>F4D(M(nBi zSv2=yYiny_Vq#}!r&}}!XYGmEXMe=_9$977#L(KLAo};;y-f!$=H<<k3$kozVhK&Z ztl~I9#d87+XTa97d8XaT*^%z&{Oz(&E_N$3`7kMo!Fzs7k&@=;wCd{Wcem?Z(tk`k zTD(3sd+oZPH#4{)Q#oy!I%y9A5`&WT&-^TEz5d<**{x@cyuX*rGrV*X;1W{no0J<@ zqTYA;dbQWZYfro;9GI!{eTL_slH0bwPalZC9jV9iHJNkQ{sgut-Pazx&$&Oxzdoh$ z_U`4^Zgu7LZ%P@BFR<mzZTv2I#$mOk7IWtBKc+X1Zuorg%jV~;ZN8HdXS`2%JHK&P zTdn+sbImXPo*&eAkk&AXj%k)#W4GX9!I6^w&2^r)jMnL_-?y(Wf7%q`7mwaPzt6s| z_Ai&Xc~ijNcfBkM9tsU13_Es3+-9EEn>$NJZ`beE#fvX&)Jy$w=Px^h&;EC><a>0R zB`rc`OuBLN^YULM*SFrtTlUS*o*`hugI7$`-*1@rPvyl`_4n)M=zQAmdCK#{3?}*i zPkw)2|5wyu$F7DL#t@@hS^F|P4)AP=`geyV+H8BO=K1iD@`KZStxV52tiEZ%{N8*< zW7uJyEi%jIUyje<`TRw$h387)+h4lYTYE|@&c7DmoiamrAF~wqg%g#frt>(sWZ&C2 zy_mkM{EiYQLuxt4sa^66E2=yT%HQwPEJ#=pb?Kh%-oEFn>z?uPM$Tw-mfyeQ+0vKu zYWMD)bno8jc-4P<4_#!O+03Bul<QC{11snI8rg!PuJm&+cIT~o^6I_Y--1S7m6wm4 zPKh45u;-oYIey~{B7Yvun*M0&-nckhi_#nSa-MR)=ItyCe?4qHR-1YG8NaM7lN8?u zZoVfTZMz>RcwRbu+j|{D&_V@{W6Ii`Dvmq8c&nV5tl)C~!(sOsjVIRi*wwBqbamV% zut1@6qg^e_fwOt#;!PnF944^|2`efaFi%WQWK%j0niOn#*)DVXj-G|UCeA&~QkMEn z3MqSqCaZ7D)_G9}n(6W~UdqAB$xyKR_S|3Fol4#9oXVP^lTgqZx0VYAPaa{+EJifA zA<ZT#rifERAg_;);qLV%lk^x4T?}0C`})?^`@eO(x3J<WnSbbuGkkUo>M-yOs3OP8 zkY_I>kY_SEc%5&svLjD~D(*g@XK|snOU2W@y#b<BDv#sPBs;c`pI8*#H|ETC<(PT2 zhp8k!KHlBEJwRiMmuhWotx}*k!;fEm1?A=6KYVynV8O`9`0m}iGHy}D?96#rA4<wW z>^QNGM||6dPb`Y*%||mz>~~atPAe$*pm6@m5~eL4D!XcaZVJ%g;d)eH;TRVer!#H$ z{Q2?>C1qu&Qfl|^-Mc;S?w_B}=Ud90JJKm!TU+~9#>^>gvENIR|NRh$I&E{Eq!M~q ziNooy`P-C+>FOMojKbR^TPB$H>}lDsef#%IOTBY*bNTIlBm@Kqbf>;xOP{%B{no8t zr^nYx8mFCE;yHQGo;^9Tx=vzBo|9Bg_Vx8?hp+Qc5pr*DhS(r=ZqJ@QJMIM3|DVX> z_~QCzuvd~RX1ius6z;NK(CYMXXYq42Kc4w!xw9T#GHyLuG~Yl`MMJ|wA>-%A<MQ%V z8C4DkG;X(cO=!JhE@EOHKhLh#YWCT(92-aqS@>}6>eZ_kE=>IOW#WRudR10^e}N(= zwr!Cu6TV7tUkG0pv$N#or8SYpE7zI%98cQm?&4BlF=w*+YIWaPB2rRWr4u+JyLTO3 zuztO~|9gm&oxYhR9pUJ7@wz%|=DUVtr-fVQv_H%hQ%q46zqJr#VBur8prA=Rucn*Y z+wWhpWQnwSUd+y-qg@{aHc7sT-~~;1b10h3;E8E|@RZZZkHg%j<xR^n23-*@{n%Y5 z#m{_#cilB;I9k--J9o))9d_7SfWnuTmiF~oU)$0=;p+#DCa_~B#K!KgyL(a5Liv`q z;2s;t6PXX6bxyE-A-15py88TFYxC@BTd$^fZQuTVO{DSv@B8OhS68pi=T+nm@ZZiT z=L$AMz^U20R&~)niGv`o%=~B8EwG96F4LE#-qY3mc((6&&RbhoS0}9A7Qd_HWEig! ze2QPOML<euOPrI2Q0J{%x0d<NPP<)Muro0<G*oHgiR;&|Z_~9l-Wai`?r#-C#qYP< zKb{qW#EIhU$)}&nmcK76@7}#@_tT=CUwL=!+ST{r<HwJQ>^(9sU%kqzZ9aTv(q9LL zH?cMq#Wv;d?kx45e(UyaMg;={10^LTEv>8%Y5f9De4DDiW;H2n%f0>Vg@aDv=5623 z{AOh^czk~5!NS5mzT=u1q6_N(e!b2vKPPL;XWoqwb0$w_X0R@MV~{GRGwpXXzu(`l z*W=}@UMLnnUcGJ|Tf>bT5$5LRi-l)<=!k`fgv_xjUA1&6E5o8iiyl3GoOa%C$*Ch| zo`tJ^`E1=^_qS?|BfqY#t?ltXS?lU=Z?<M%XHZa4QBhM<Gc>$-`}XaN3n5Xxq~!a( zz1i3EH|zxgw_m?+E{W5be!5y!XyS_3VXF;N{_L3e@87lUmK?KY&9eLb#(0%ic0@wL zgW~hH;(~&S2V=ZmJuH~~seelbx0J#8xz^?T{{O2!+nSXR23c8No}P&tBg*<26kBB6 z6$EZ<Fs+`x`FB-ys?x+K_x7%vZT|ZI*O&UgzcG3;9nk;%&2~qM=NI{T@`5sNUcNv7 z>1*ltPn#C}wXOa($D%MsBgfc)x7|4H+nXaxy{AX*;3+c;xcc_>>+J08*><(N9`XlV zeg5p(vke;zE~g8Nm~30O?%pN=SEY+DFE7sxZMG|Yb>;Va@sjfHtIkqj@a^5*-_PyS zj~zcAJ^#_GSH{y%vo=hdCbq_rU-9bItG~a!ef+WFyzTcG4-XE8nB8S-SFL*W^?H2# zu9BB$W*W=NDnLrPg57&#Z<JNvxuI}dOer=tw)RGjyjir`<hwg6yF(^0GAifZ*f&>1 zRP^r7;^R{^Z{NOc|NG5m-`Qr72Gf1*HU8iDb2vd{f&Uzf!sqAa3M#vunPXXeWkn!E z!Si!-U%h(u?c2AmuC7*Y@msb`Edo+{U$SdoP1@p{by?nb=AGKtVrMxf{Yia)FaF!R zrT?B9m*p&b(6zJo{msqk>sPTdw;bALTm5Z<%FdjdM#bp|Q@*~s+ID(LVq&7&x?PQv z^4#6s0|F*IyglD^_4(Q6`DVIN3=CqYZ8bDJG(?IlWG>sYGHl$qak>BeZK1rsZfs0u zWo2b>xcf;)US40UTUts=OG`^iO6t?6PxtD6=VsqxfBWk5v0iCL1#@%p><iAWrKMl* z?XAAPF4lYMJWWMKMM+7?>+51~?<&=1NZ^$MCqK(;cdNg*<ZeIC-oG_oUs6XbyXM1< z*XH?xdM%&tv*#v#otbp1_tGz~R}Z6>e|o=qZrOg$Uw3vEhkUKPxXAU@eF?W72|*c| zng<6OzkT~w{QTU_J)eDA1f;%Qd74%lyLGwyooi*g7cM+Fi?5HPX~V-5D=n>4j0vx= zt$q0L;j6|PyZu|XgcNUj_Uzf#?CbL^3h%VBW-RupkA3c78x9JAWFDVY!L?@Fr=5D( zvvC2#+h@<xR!eP((D`?Lza4ACnKNgO9C67~n0>ad9|ZI@ZdAUx@v;2g$<1pDzv`H* zK7U2)){a8uYYW<2=FOW|`}<pF*!-*ZiVO}O9w%;X&EB4O_tfK$KJU7nHz=naezMus ze+7HZWXCgqeSUr~cK68YdFF7p(BX67tchyA4)T{8UW;0D)h{}?>aSefKd)02S38Vd z^JSOSE#jX0J?$8e_i}e|0cNH!{q*|S{f2ot6ZZbjC@U?MJuO-M_80GcLFISP|1DTw za_FkxjX%xT4xF`TxGt~u!*Rv@*tA<$uCOo|r=PpB^YGlGNoVI+etvOr@pQddqqPjW z7E}HP@_tRf(DWu;DCbx5p}n(YT_+?yb`x|uQTOHj^WN_6^($6b)cu)Z%9>$*+3K1> zp^<D-AwNS)d;9($kGOMlw;%73{QL3v{1^UiQ<w9WUrt>2_V)JMt2D*G#tV6_pDvyp zdG^#RV}^>#N^h0DVl5t57u43)u9PaNuiwww%ivI1Sy{f_!p_bww)WbTnLD+#w7fQF z^A%qVo6p#AHZA|oj)|wA2AO7TyzwbgVfU(4t7cgiFMGE4yw!?x3s$dM<&*VpHct~r zbnJ3Vj}6MweG{fkdz=0|t%jL_!Cz#eRG$s|p10B^Tt}K@4U0qNZJCOb%Qz04;goQa zDp<DSgZlr<{Cz*4&CcJq^G{<uclWt~!|TJ}Sn!;B`1!$yzOL8Pd?9U-oJEh{#ctbf z9(-Op+^*ut^i7|lpDxG`&*BU8{cwUk{L1`*|7*LCCT-li*ZSSPtv`cqc;<n?y6N9U z_f4NJZhB|UvQyFzJL{bb?0jnF=V>&qo*R|CzU+{&s=?P<j&tqm|9GGFUOT?7b=Puh z3yX+)k*l)pncoY!`BLjuA|}k84hC~CRDGP+``CqJ;X*xCRaS<q?CiCfM_fxcznQ(t zy6L{kNmf_a^>_E~Ua;cC{L@!wo-vZI|KpjNshRur=1*Rc1;2m)p84zk1P_%kP{<xF z+P<SKXR_3nmBGsy5>5);y|*KLecajSpMTcWIXgF}K5YCJ&2GB-yvQmx-c|n=Y-D>o z=hdrMCA+R)u=n@%@>;bzdBuY)p*I~ftIMiSPkg?mtteh{$JZIZz3vsyfBVzzfAh`x zw$s0Jg;&2Ymkv8F6IlDDllOMw*S7pKvl}#3w!U8b{f}IoPv!PcKW4E1dABu=ox$Ss zUH^ZdL&^=$SG-C5@p8BEG#_Z-FJ8U+_U+j(#a88SPw}@_5bAV!{^?xqj|W@~HM@&0 z?%Y#+WrC~r{=a3X-=&}LbXin<{@p#NtBdEay#L|x>4iO;KY#o7>eZ`liGO^3eJ#P@ zitj!(K112BPZsTBd;9e1(#wbEb(;NU_`j2BZjkciQm=>h;SXw8bBRwgSo!{a^;#y6 zhy}asZ`MEXZxJZ6s;rE@wkFa!+EBRrX!f-=Cr{r_>i=0}A)`0__FY}OvNto1_6q3f z{bGJvTid!h?d0!Ya(6czJdm=i`r}dYA2t8F_4g(CD)$)$REc-)`t#?7ynNN$t=Csv z%JTL;ec9hWcgN8WA3n%hm%ZTs{`s?T=dKxcp|P>LLY+RHGgdi9U*Oj-oxL}$UDIdB zs`+X@(`V0Ky{~uvHiz|c9#<E<{r=21Wn=dBbuZ`4$SOPN$jQmMv+V7xkK1;vpQ9Sj z_(QF^Qt05(&3k6>S~2gxxj|~%_7~s!7aD7pJF=~Rv4~;bgIP9=!5-JO%S8VDI`Anx z=vaS$B?H%f>&cT0nHkR2d>6LaP-7EN`s{$h*DsHg<v#r0^wp~2=4Ipc9N<=2N?+ba zi-aX7OONF9*Ze!v*6+lqP;zhc<+Av!%dfUNM%I~KX_&tJ`P(w%st7Z$zlR*Yo@Vfs zOj?wCd)wN`&2D$A<ro64KF_|sZe}&-x8)TPk$JC<)b|;$&VB6GD^>dZ+}zpb`LE*V z1ZArk7+k2({^uBDQL^G$;9ff;wqH*@B4%!HSZ(ZcH}p8D0NbFj@Y!PLwWm1WUww1J z`U=;oe!EqFPc|MCa5@o_RLGzEe(Ni1ySLYu<|aLQ<8S{rJol~UEj?kMhfdc6L%(jz zeJidPl7D;KpC_KolV|3Acwf8iv^PiY(J%j&&uv+2W%96S=dAl(zq~K~G};mKZbG!{ zciqWZXT^S{9nLzD@i2>babCUNqgQ^_A9G^Q80}s7%qOAgqvm>@^*26Vi*9$^?EU=O zH^2WHw_a`Bd0818bh9U%etO2%$o}8Oo!<RFe(5n)JZpHdIABN7k2_mllwR3!!SnJt zS&7d-H_Q8cKFc;^TKT)r{PQdmmi*y)@amP;^wYT#_5S|+U)z6eIx$7DZDqdj%a<=N zu5n!Lo_l+n@7-mc<<7zHB}|sG{SDMw;x_Bj5=kW`rB$mzpt-r(G{0=x$&{;CuU=tM zGdUbPVQ+$aT--OsvzI>Xoh2*JDVFkF^#?NtU+Vi6C+k!X%CoF>yjfZKk3qp=N^FR6 zWaO4S+Y*i`hgZHbE?51!=h@y_v#PJKRHlbNd#bzO)rIz?4J^F^n|#X3wmp-+vZ8U; z-n(h(>9;elb#{8ruluz=czM>*q>ZVm?<NYXZ!<MvIPmuK^W!eAj15~h7eAY2diD0U zvoV{OeO$f%%H&8%t<v9{KYuxtc+#7rw${C*tnAV~7Es|hckbOwmxScx_GMmHJH4;x z+&RDa`+`2nz4tEOxqsh(Z`XzE*Uin$t~D{NU@9yw-mGcvIJ<jQ(&wKwUj<4HXYHzt zN%wlvvZ6Tn@bkrP>IR(&?mjnO%}`$A=P%vl?7HEvz~$S_Z<A_HY3B#k$F9HO`1Pet z^RMI4)^ZnW)-RANhE~km979`PW?u-mt9T;$BSwX*Ra@TX(QYA^*I(2)Yk#_5Jbfy2 zd(Mx-d+hx`(&jVIm{#7mPnoazYo7O>Kc7y!y1Ft<m^d-<m%w2qC8aCh`!cRAV02ji zi)Y!iJVu|@j`dSk%{jAeneXgtSFV&iKR1_|o$t&nQ*8wW1_moDE5CU*H?Ll0U1q=S z_52TBaZL{bzPaBtJtaMxRh{o(Q_fS{i+5(UTyqwGud4E+SXgL^{KI1^TjuR$ckng5 zkl+5`$iizaQ&(k6{BL2Y-*KJGk$clr)%16ZxtqG8-ZP5-{^`IG+3;#_SZwn$woCi6 z&&qA?>+iQNUG?q8##L9Y{1n?FAS3P`I@3Sr#)m8S_Odw2)IaXs$Zxyl&y$nK*6*`g z_^L_S;@qw0scbvH<Q$fI=D>LC>{(y6*Nf+#IDI<%^Ru(-_y4OZE-v=->q|Awn7QWs z*-PiPm99EJZL6@nyuJX(x3{-v&s|$D)h6(vV$Z8rS%<$qUA0O}u0Q>3Ovusnp!FAY zEJ9c$+jp4EpDA<LdiCwaZI!|jrGMY7pS$pLT;SK2b3R=;Yz;2O1VvtakKd(da%Qd^ zxN&;3gMap2?TJ4w#7>O0+#@~juZ;+U!k4GK=YPok__o;f@;TWICJxpH?dfdq+QLfr zeSCY0_xwEJy)so#o87n7{Ql(L|9bmL6a8*i7nhuSdv4xQY*STL&D^II6Wh$jF!z<Q z>Bg73%UuuefBj&8_{-z}(wbsdou6{$%9T%_K3SK)3keH*)xUPd3J*_D!<Fh84DXuu z>~YU7d-7D4>r^xY!`k*woA_5AXVYb1xbP~LStuz)x!L6O$y@)OI23PRTH_e(%(n2C zPiJ?xed(%iKRyai6J5|O7dFlP-240Wb^q%YPrlpER<-}zmoKm0zD=CfcQ!5m-X2RG zot{;W(I2GtzI&(V@4u`(RU&EfD`SQw%a(1rd2hMj)k|gCadB~J{qN3P_2*T1K7GoR zl21=O&*qssIXRiUzIc6ItabIbHIeFTtXQm*4xM{8F-7of?ztvs*9ngQ_ehl&`P{wP z&9=<Msxffw+qqi~A7}qrzHR%e|CN8=tpDI}rs6X+tC$%jwfOt{>%UzAD%jrI)vz)= zIK?h)H(yMaQSjnrJNpm14V$cN`*)rEd5Zn~mHY+T=C5DBd?{;q=(yR!+h<n<E-pED zsk*AlEbq>a!pClZUwvK?xcE%gp5Q|kUMX)xTdyT-jOZ5Aon=|9CTh@ql#7qA?#o4Y zV<RKCUa711?!^TLDo#G>lY6ed$Vq@B>OCU^i|&bY(jUB<>^b;SpKsL*;ER}<u*R@O zV3Y7FwzYL9k_%RyXP7W!#)-7*?OV2Rv^sIy$;n7df13S2y<*k`_d4O6z<$2NhaDJa z9e&8sn#-oPbraj&dv)!HAI^}TzjoDmh68Dv=hxR+GKh$XJb9X%nU}Y$&D`Al`P1Bm zRn;4H&hrG=n>Ngu4;j+ho_BZEI>+bFo~^p?;9<Lad&$e7{QP|H=O50tT{U!n(RH3d z!6GC?+<4|{(+qbW!OhML4E{RR?>6t0yuTtkaN6{<Ga3$l?UK!ZyJ82QfwGp!x<A_= z?aKNv-M+NV?JPrsWZ=SZKJmE=+vfj#r=Dti^Ug~_P&ao%FH4V%=DU{**W1|rySOvG z-2d~}uV3d*vweG@U%%by#c6xF2G@Q2_U*e|X8+sr>d9l<wU@6vb-sW7;$`!<{k~ah z@-<_okJ`JJoD!Co)_JE0dr#9bycHhj;c;S;s`r`PpE93Ai}v>F%V+w`Hp{)Z$W?#O z2PZc-H!m+Q7Z;Z9qh7wgrYqTM*FO`u8feULXLrP9sVN3G=f5gl>|q<@TU!2k?<{B2 zEo(FDKg9X=9$2O7%%NEIO6tpk(D|AlKYnBg2n<X-m>y|o$6fZn`i(Qcp|8M^$GSK6 z&VHJFl7CmuHgkp*r)T)A;5^nNnR`%Y#+tajv+@PLZkVXa_G%|1BcuKQKbw879Z%Y6 z?CX1V!PVNrH#asOK63L!O6}UUYYhzzkEvfxTm8zowQBCu<@3enS%p@=3R(M1!|b-T zaq(1E)uP%hcYUONMV|1i*mq)k-d(HOUtf+KaVgzic)U;c_s{3^r|ZRLZP{Gp%p!jN zQ2Knq`I$Ub?>b)Pz35JVJumv$jsKs8U3G6KAL3wQXxP5@=^DTH7u9?c&h+${FMP4~ z(Du4T|0J#6pY4%6C3rfzT;$choC|NDk(Rq-*RHl6`SQol)_y#g{Ixngto)<RgOB|# zi~390Z1NJSM0dv2dEXE-s+*JhyJ6e>J9qAYx~boeF4WZ2JlXW>v*@qq|F)=cEUoOH zR2yje;?t+1RcvQ(h_}}ZWRz^1xWP#OpghA4?oVNIr^5LCK~1dFwIz&C0-Kw}bUYfu zW?d_>lh~p#JJG5|V3W}7vvPmTSDc+Ux8lu>kC&HcPuGvnJ9xad>6qS+Ki&C8#?kw1 zR~c*R7#8{+{B4(fJW4FW%j?y>z11ttUuRva5uAJL&CSkfXO9{!+ut%_f){(8{@?rm z|CyKNTxj7G=Bann5!?Uo*K39k_p0B|w3xj*eEq#$SAPk7_Gk22VgBdVl3#1o#JW$P zKJ7o(%5|^$gws!t9Y4N&*|Mnri%-3;|Gy^U%#B`7h8{`dTa|I4mGc!sMYvpZbKkzX z*)R3i!{6UOG&D3eR<=~T#KVK5|G2l8*QQ7J(!p)BmYkJ~AHO?$?b^mUhHBrKa`a~U zlzHC}lMxXSNO<-3{Pp$m^7i*Wn#<qWS-gDJs#Pmjde$1r3koJWo|m2?zwW@DdhP#p zW>Q6U+zcCDvfqeZFH`a4`-kXV)6JO<e0;3_=+UE?m>3Sx4KF^mbo!_*w(8{L;fdK% zu<+<xg%*u1w{@gUR)?=&cB;hZ(4j-ya&M;<K4#cZ`@8I~eTMqx96bhw_ph^W?ET%& zn_qT+7c0Y?1q<%)`}l0j7L)MTeAlYKy|JwO6A^tom-%v!q;b`^H%C%WPm|1j`|RxO zg9i^@JCe+}mT8NJ%Br<%eZ9Pl3WT??rfk}`YSpS8J1pYk<E71Bw@67zadDLysUDeO zxY*b@+||{Uw<zShrS!aq;3`z{iOsuvyUXAH;@!4=`}XbAr!Qab`!0Ce>8E>zJpKLG z?^v!59$!q`Q+&>o>%z8De<se|3bUBspS!s0@=iaF*>w$7idWV!)cgNBe`_}b?<y%1 z2A!xaCuWriI5n_lxEn_`JS*DSTpzt9bywb<6*p(`bGg=BTfOgGc}htQqZGrd*RS1s zK6G|;Y<OrhYu2n?yLK&J{PtT_Ld%RqMk%lZdBcl#?s@#~?z(mF@-{~3O^?36VD;+N z{IhM7TKo^3nD{JgOM5EgEve>!1~-nI0%8j;)*e!1&A3~qtL8iF%j16gA`2ON``aZc zS8v{|{8{u_x!)#f@-^tlHAi4fY^*ywTOS`!Nr?h@bfzb!<loz;Pfc@gZJDgTI(3uX z>*)6{Us_gf`n9lqS#@P)<b5enX$v!8p`y!n23`gkzVu5=Jg;88c5Oj*Rh8d-JLAkt zOBxuw?|p;L**ImaIPlLLq|2py83QlF!i5VTAM0JcYSpVZZ?>$td+yx1_xt}R-q}&O za3Rln7PpLm71eo%{>=tyXc2H~_QV`vw_9-4$=TV~*4BUCnt2w6b58RnZ@lB16R7rD zm?KIrKCkY@!j~2Ajf;d>94Dx}e0cEHyLaC{ek?4p0DF^T;lnknSD(IonOTDCY(-_$ zgw2L~&MLL6aq(Dc#Jsq=x>`SW*OhD6#6-U;v<s)~;L)A@m9up%FYo>yN#nFjOFVCY zOnznVdw*x~^IKc9g*uO16a+_?VoRHGe*XFi6F8OK`&2@%ECx-<sHY^%cFmZv6F$A< z!8l7vsI%_x*X!H1ZQGc9yvQQi#&&OnPPx6kJ;RGPZ>F65wQKk8cXwXyD1CixhGDW? z#RJCp`1s%MeG^uCOj`19eSpS_VB4<_ko+yMN%5@vkJy-)FV=SsfMy}OF6N3YOgvV} zePPPJef#?Q_!b6eO#Jfg`}b~_ScV6$tq+|&d-n3>?!ylYEM%(Nx+Xj|@qhDyhacjB z6m_fG6PNCJb%N%r_=C4awzLVS>pLi$EXkaA<KatLNc5lZGkL!tWmU?<r<_jb4o?A1 z;P4)sE}&#`CP4pJfPCNw6_|0wv#x40Pt^fUuXxVb0Se?s){GMQgUOswlh*m{e*tzj zV_qi*FO!bL;@={2$<V0xW778*aN^)i*6ZVAfH)B1=?foPSTi6@sM4~=*a8Kp$R@*Y z=QbD3Tq(SJlfxdZWAh$HtlR%q&2z`D{%05ZbNBmB;##)xo0<q0zr5X@3l}b2y2Qkg zn3xzC82I_w*~bMk!u`hXuGt)|T>?(dQi@Y&)dVfb{rc)Ei(}61ZD+SJ@&;CadvkMl zx&GJf{rtbzZvQ7HC-?5g1RXP%>8yw4jwxmqefn_5R75;o<JcNAk>=wwWb-O?&I!bF zsq^2KJXG8!!BhN<W3HLma^5pBa?;snXT{BuPG9b^M&;i3l}<_@E5ErOx;i!Ojkvt_ zuHEi`3g13p4~vM12n=+z)-pBy`t$jG`6m?`=OjhfDvD@1aqyNt6J0QS_H0WTzS(El z80_ZrGb~-YltDqPyVdETfUV&sPP_U0b8nmR^Yb%+(v$l9nm@O)Z#tK>@?1<kxS_q! zW7ZrSn_}LhM<u%qSMwfyV3^h}E!S=AGX2oW!)0wB<|wiqo@42>y!UJ-v+?xwI9<)) zKgDr3bOY~8|KI7ys}nCKX>v&UW%uVr@9OI1zvs`Ncj=a@@7>ED8)8&$`b9P5#s5=z z`ONUw<Dgp`x5qzWX1E;jJ92N;RtE(J2D97MUtSpAym^yh!u09ozsqJv++haAM05S_ z8O3hUC^+08S?j>vdT49*^>y+4_ifu&_V?G<D-K`nudj>M7U6nn7rygQ^V5xsg3?zk zNN8(6-ow<Gni%|cQ<ABD{LVYcuBsem$1a(jHo5ab=FCry(moD`<l}v{4_n3WS0vlc zKRC~}`b*l8PXT|oFA{nYHml5_Y3{~X{YT!3Trgi`ZE)>LYvGqo3?X{qrki5SOW8DY zmNj1C_^Y}p#rC#Zj<fXiN=usvMcwsFt}Sf8R^L2n{;GncmuB+2bW%GeYbLT)<{Inr ziJmLkRhm6pc9XBM%ieoFo^t9OaX;r*_4QbD{aSyF(b|0P)Wx#R3suZFyxx|4#>!Dk zc!s6l+!b4lz5cH*y!V*<uEVbk$!%5D`mCR?r5A~1)}H#8$iGG-`MK+s=<RzCCtIX0 zx<8-Cjpvqj%gd6g3B~@F$-9`hPn<jZZ?bWn(Srq>Ws}>Z9$)7+^Y&8^bvUK$Ufs@K z!JxVPUpL>knS!s(lc%Up__V{}yyU{ViwEr-PBn&H*b=Za<}<gb$QgqVx~s!}^e{C( zn<902^`s+fE`Qw@ef{ZLbCK(_f3N@JW&CYhK;hcR!rnTaw=$-WO?CzNaB*|9GBM76 zJ9p;HlWChbZ{BPv!`FWJ<hgTcn{UpXIWuQlxwp4>V&X%A&QphkGrOZVWU)$F{51$F z+mL3+o8NYAy#wzwQU4wpaUJ_BN-b^d#=jb#6<EaRZC|=H_4G8|SB<=2z;NJc(ahbR zU483LYYM2O7hQGMGEck8>@wTt^C?j|%RR@8rF0!WJ=*f~w>0CFX07kjm+0!T<bBF~ zsWppj$Lf&7nX@+S+?ag)-{1G|FZE6GTAF=rP2{$mncp6~sJS~~(c;%Z;UTBWR9~Aa z-jI}zoO4fO@v`+X8)LSLh4g~f>g})DxW!=RzSQOMVh7LN_!*!!Rh79RA>C0`<#qjq zx<u*N>ZZ9nOEWVUOuqC=Q#-uErQ*s|@62h}^b(`@7Fwz;c@k^%Qg1_DwTZRO!E-lG z=)}$RnYHFmx}$1}8guY8qa!y@Ofa~%>E<JlUGdY`-`T{%x>0cBg_0=Ay}iZ97V#wB zP?YFD`|)7#{oM-^+@3s|yK;GWp($IID)ZZL;g=KU&NkaCo1<1d$+$katZ$}SqvT@~ zhxe-s-+Xl4U~E=Yx%Aw})-r`wv#4WpXWX5B=)kq~gz%Raa<>^KE%uppX3M0~zUy0} zx5pl4z7?!?eC{?$>&8Tz|67V%)Sm4T&b`YlQ?@PnLqPT+$^69&pP0Np<Gzl8H8e~u zw4Q-M!^24Hz~_k1ciG)5Pl>89G&nI9IsHD|)O4dmCoXE%u?5F={n}#mi#hlySD4;< z&t2Z4CC?-?m+e|8*_~Kx6tXTrE=DW7!X|V=)+=+RwOY(V4Gb^+?RT}>Eieu%dcwfK zz<6nLXjO9NvlY_I54I*LiEyp#Q~vjD`}X>uOBJ=WylPd?JuFzXXwi{J@Am(F`*v&g z^{|kTB}*Lt@kzke0xZdhUv8Zq(tN6KA>S0)HwSMew>U~wYgOyE^73uvSh(=?p6LR5 z(c5(N_4yg*)&Ju!Ed0n&@aIS2s&=Ep;d^Z4M5c2aU9~=as#Y~KGgGxx?C2VylihkZ z!*_OD?Ok&xe$uvz>7j2UU;5Yonw%@`bALwsoZZ0_)@+U!6VW;MXzIx;uZ=3F-&?=w zr1vF-<(>>DW9}NN6@A!ba_y@7XQh>ncS4uRC*=xn+qhL-L%;2de(}SVM`vlS{rEGs z_h;$ES7%Jlo!anrW1(fD$E-CR{xgf1)h|nN9-FZAm_<=>a+HjtW1i=&1JjP4y)!>v z=4V;zvQJSLf9an%#bdZ(RqwH9A0BAlIpdodY5A1tt?U&CBZC^#seE^L2A;WjFlt92 zL&Mb0T!Tj4h5xc-s%sv)eOeGvUhZf;!AW@S!nrd7`EG8vE}88cCfB)hqRoZ*%6~u3 zs(Zc7yTUAau>{Zj12YQ#ojl{mo~P@#qcr+>U3-*jw|~N!UkjR8SUFV~I2}Z1F*dZU zF0WeF^O23!GIh)Msn&b*^j2wZEim>!ZM3k+^`u>I<E!<N?oa>i`tw)nYw+1X>CF|= zOJfA4Ty<UkyogbuvM}mZ-Q;?wm$sEnQ7oQM!{4-?&+JorTJ-Y2pVsktD^l$LF1n`9 z+FMn;q<3=WLWz~Tb>nu2-Te4vWAbrcpFK4{i_-hE3V0U=w5t~LZ{=9{@ZcUMlda3^ z{{6IHvh3XQwt&*-d#k^Pg@hbAe%!cr!t~voZ0qD$S$CHH{B3@9rM^9jb+Yp2SBwk} zU!7MkP%vwfni3Yq_c_>`!AmJJGE?e%YQgj6?&)vW>-hLBTbDlV4bz1m5B)Z?-dvZG z^<&vCkGIR%(&mOOE4&?L>rhf>cYe;)#qXvaS+V_o-R&hWmBMqMY!nkeW50H1ve*>S z>&tUZYDD99u6L;nOH^dn_x?0#%g>d&gl8WxOO%eRZu*quasT{NCo3I2;gm~ruVtq# z<6OgY`^2$SL3N&!W)CIr)nshGqQRb*=hMB|evY-hZPkNAH-71#xRu*m87kd-_Txe6 z1%7PL@9c~eXik-8Ww>FsajWnRp;znMUcY$keM{{wcg?Lvk-z$<rxY`!fg=8>nRUUm z6=%;pHr2I$7sO`I#;koLaA*3j8riyUC$=a?pMpoYg6Gt!o(yY$efk;pQKXMw<HSjs zZ>`tXWgb*^aAfk7%HU*RVDT;e8aZ)|PQ!~oYHM9r-w8j&{2^f~Xl?Z3XLF}c{r&3G z_4iB+@BWljtcuy7H97m(TJIG9+48Feonjdp3UXiG+0>@Oe$V;EtCx>%SNBPA$LVqf zc6aCBIMDv}xrea&XD7qOa*p?Qm1b8|{CHpg|IM|vw@vadigLAPUtjn0`~GrsbMy7F zyT473ue<nbL$TY^&Se%1x4tsoT$i#U=HRS&C*PEBo0pq$Pi;F^dt_E?>zYT6#}%Zm z9u9pSwp}A|=OJbGOAD5?gs1(;WS(`a^_jBxta|CV#tny@H~TUD@@8a?cYn&&FB4~{ zuifn>nWZ_Yd~TTCibclC!Qs~z*sSUkC{hUi-4M68%5?tu<=?J!c6!cQoOXU5F9R<x zZ;f63*;%GMyej&B+Bf}6LsT@h+rEUXs|tC__3EJ2N}pRZ;?3*b8W|RRdaDz+Gem2$ zSL*Iblgm9%UskZ%AGoYG<KePp?$=E@9V-8C{<hC|b!(%+mf5Rf1VL5UWUtgqMkki; zvI%D0EZ^nr6Ju=_FkjU3^6{`w>x$y81@DqoSy|T`_VvutcaEM{PyAE8)VNu%^z^eY z*V9B_Pgkv+zD0AdMUp@=TXMGlR-IRGo}Tk>e^hjEL2G(LWAEv}IR+}C&E~}y(lu>w zwMdrubUPdG*_XFqJ=5`e$1|&MW#shn%Q3L9TB=@r6?s{e`EU5+33F$M8qU}pc%yG3 z%Qe}hc4sOpHrUt%d4F-|tuf`Z-FK#aQ=_p^GxJn-*<BfD_bH!k)4BaiX6IS0^LpR( z4fmQY+*^8k_CHPGzn)Wq6Kwv=Ecq$**d}`W=7bxKvn%!<m@_AB?#~IUb{VhSbv)9M z$su^Q#iYY*td^E1mT&asVOS=*VCT%`sX;4!w3bG1nPe5W*hg#X)Q_9QviIaJQ`qje z)w9_6`*LyjO*S?`3(s6xo)r`It<shyPWjiKnqM}1f5qs_O#b(M#V`9uZ?4a?E7G5D zr+?p0KW_f%weL%rugzbaH-}BUi}C9#n^$|MBo+4iu?x!ZwO6&vnL2uVpAP8o>Ro5S z0IC-seNj8R`uCIAQyiDQiq71Xy{Qz!yj*@4_oCQ{73WX2{tcSBMQ5$u>$hG{r&zgi zGOSqtxK{J(TD#XdGnQS~>sjZpY!dg|>x>LvBTK!PM0qd#$C4}SratSS%@w7VIjxfV ziYBZlYwk^$Gdq6z?%)MA9A1ytxL$~0U-inc{OYkSzjnE;s_qS0oZtRn*)r$CnV_s$ zrM`UG7KMy8(iVj}E7xbUI3~xI)a4m5d`;+hc=L8piCyW5i?+v9-fKNh&AnpR9~RqI zY<%8h=~F33x98@kmh}F-sQO#0lugQp;l?cAX|1y>XIY)#y%pN>aO?6IF~>^7CFh?r z1>9V|+d@iS<_s6(<6}=P{3Iq#YSa>AsGW9cvF{AW<6A6D4sR{G#JNx5SZJ<^Sv%W$ zn-rI{kEhu5_P?CeXn2{e{&`v|&$4`xZOJ-~rEV+vi%-4Qm>an3_R8iy{h*m!CQi2w z*lcW3@PJ{J_}YncXVgY+`)XM*`)S&|iC(Ffj{cspdg-exi|+1v>-%3i-KtZ{<jifU z$Ck6_&Ybw!Z&Rr?|1H@ao!7Z}PG-KF*&oAKWI2IBW#yk}J@y7U&;48c<?JS1)qOeH z<0*6StUVdsmtU2>XYsu4a@S(!9*bOsY?jocHctx#-t@%s{9bCbGGtrD{*|6ickGzw z6>*fa3Naiwo&O+fy2`=R*IN}BJQ@nZKQJv?>ht>W7D%=A=Ah+bDUSYi77n&N3yag& zd<yOQHTC|%#0OuP85(wO5SY8aUQ~R=y_{FGSV~+u85nLct^L-PS@rhNBT<jvr2!KI zjKlO>XDzhqapv2~p_rbS#aQ+G+uNl}mj(s~G6clMt+Raf<Ktrn0a4M=sHk1FzsruP zt*~~}E`N4SvplS=Abjq$Q{N5;yS+;a*ydU8+}o+^5H<7HhKDufdJGII>(8(EmW^P^ zQ}It1U*EhttG+IF-RHSX%n{pkF0T5$jIDLz*6^K%tM}PyH~m^@ZM0f0!~Y;_>d~)z zIM&G?zLI+Fn5o4a1C<4GdS=rCtRl0PIJQHos2F?oxevLMqOQ6n7pHtUvsLkIiovYR z=KaN+)z~(halM{7>A*8nkL`1<o@hTf=ih&A_0o%cSN<;0iV7}EDoee2?fC~;zoNuQ zsk>g+ymZ^c>*h8z=AM0FIeTuzgwN+Tms&F)b6&et-QZbWfaBik2_gGhCj8>}P&oP7 ze7BgtWbMB+@d>Xsy1j3>mUODoF(B?tu&vtaLix^TizVGAOxo?h)HCUDL^(r3<tffk zewlUe^mP0!85|~Pvz%aTnDG78nY(u^XH{%@T(pzn!ks%j3_07j2WVW8(H7ylnUnvO z<;oF1xv4ip-pfw)n*Hf){ra~H+Oj4&>U%|OXW}&sX+P+!>-639^ScH=Pfx~%z182} z-Q69oA;Q(_^eX?WM)QuD(v^{)H(z15x%$9EZpHkwcV@1>IGxS>vrlr}mWN!aSymUe zSQ>aY>lP?i1}rM&I@<f>s&>AJfXEYz7uQ2%@0|Jjv-I=T{XS~XpE-vuS;%g@bLMQB z4@b6m`b1AVHFwnm)~83mHvieOapBhRo$FPs_7^^Af2X#KTjrJFQb)UGMmaHkPg)ci z8O)25qdK4U1~$!Q-F1I~-!!S*i;c6TFFy)6d^I}kY1avz6Y=xc{Elp|ck}_3_2&d^ zczaV4eq_n)Dh}SH!uHvWYc(hix2^b<CG%U9<5b2oPjJIh)7o(NrkvNs7tEp~SDst+ zSM`_nO~vEc>1h?M688VM@J}wj$GJUk`GFnG+kdbe+rzK*WWfYxPbN>T|6v;W9eI1M z?#-yW;F>5tL1n@!O<$E8GgsePp&cIZeV)30;Mc<n8WKC^iA)i1{#E_Z?Zd0?(<=^S zmUDga{_w-@XUk3o2H{@`E!q<vy!8)QY*Xv0!05)%a)Pm8&IFzLpO-#M&wS<~zx<q& zr2Ad5ZDntx?B?r>eP0u^bJF_6r>CYS74pwNzx>_?ci%Tp0yB@ehs%Hy=DwWp{pBG6 zVKMnZ72Ei)8eHb){^iQKI!*9o@PE0mo&J^=9*LfaS#2mZ>!TN6@s_5!8$;xkf7L6r zv>6$5T}awEW0fiMfqAyoVe4Xc7Ck*>Tm3D-`O0D*&$#*WYrnr>|9a`|PaS^#Y3?b7 zRmq7)E9SE&x~6?JODkHLUcX5xQm)E=QDN}q#hLT{FXkpDlu7xjzRx<tewBCaDaF)G z)z6V~a%+xGu<M8|;Q6BH`gsRe`PI7K`>H!<rY}h~h`)L}B=+C*s=r^<pFeZH_GoSu zFE8Kf>8h5S{BAnAh^@cVG(A4jz4&dWuJ_Y_lQPzJr{}#okZbu$v$&$S`P%Kyv@2Vr z#U*}P$p}w!Ru%WUYAwS*?Rb*M)&HBeY`&7w?ZcV8dIImcIf;dnxJ|d~XiUDC<9_Y~ ztKr(L#TzZ1KbV+IYW%jk@XR@1YhB&$gL`@pWi3<LFjH4+ztr(M)`>@7GOxd8XmR1d z^wd*+XV!rl0-MgdnLXo6nfTAE?83*W?tg*FANp_kXuFsT37@ln+idtecVqG9X`IrV z4jaBZz#FeG5y4fgXEJ5GO>nJ)HrqeWC$0-$Jlrs`cl)l!SGSWArZ7&`USZO4=F!xb zdsgaHhAUrPU+5yXK4$94-qKm-U)9CUmWjJpZLqP4_<Zn+ieijy!n56fKSm!oDl5lO z!0aC{#Ne??=xkAICqv%5zlHBL((+XA+>DZ6Hgj>^95%78iNEfxUmLyM?*AWoA>s7t zSsp%f{{Hz~e`8na>T^f@WT(2-m>gw%kTy^6`AWUp;UP>a>(95Z@!+3!{E^kXpXnNA zT(GpHW+komR%goo+o0Ccx5Eb<9&1n7_QdITsl<_p_Jyv}x=tAtN=t%fc1{k`Z+u#` z^Yk>`)hkvki1UyT6`eY1(x&wDa*YljF1pLV{Bpnk|AWsz)Ap|3wPnkdbsr;=JM_5Q za<%;=CaJ0OpO0}aENn|UljUq!(R1@*+wn&{7nc@%+AvqqCcWdJL3-bX%;e%*2hKeG z`O19BmjCVHb<7ObeSf(a*!8!@pY;4w{`G3U-nPFVUj4WIbgr{9*mD1TOGT6K8V?_; zRetAmZ$IO4vGnZLXQ9)x#UCvCbB(o};phzxOP|uv7M~!M9Mu|UcFTE(4jt<1;*yvD zCjallpL=_&K|TGI+Jy@PejJm2JzX#M+xq(2TX%K+JUt`#)%>iLoBG&U^i5Cin%f<J z{S;c><>xK)my(m)SNb}Pul;b^=Esj8|E#fN*z@<>ZBYHED#G>t_A6so6``FwCFAG+ z{rk6Bpl52^i%khPwmoVgWgypvOGxC&*=pO3iHq;Wn(#9G+x~ff_^qR|cQ;ujhHu`m zd!4UManl>G-7{ugy7*A)k&%+i#4WSe+<&I@@6PWud(T}=*JI^2i^!c*lMy`s>FH@{ zDJd2vM@PrTe*WKc%kNdb-Fltj!QAqDFJHdY)X-pH(3@_3qBQP#PuI1Cwy2$ktL?1r zOIp8l<XGsK;>IY&aOm*itM%Ds$Ihp1Hg&(-K20z7*S+fZGwn9UHgCKn5G%%WJ8X`D z%3MpU;)-WdUERha$zjr62b0h6ncIk^cj&cFZhy=3(9)U5E&bINL95&xKj|4ePsB+w z=-e)iDt?gvxqiXF88bffGUTk?wPow8NmWVdZaa23omu_q!T;wszp{Nf{YyMwttrjY zVBXu?+k>}%1Z`H>9UZnVW~Jq|z;a3J^pGuYWL7OuFjMlrxwj~4W{K$au5AKN84?DI zx%r@D_)aH88gIszd;8RGUC_TgyZYYbvfkriC+=A<iFx?Q_}0Zn1_q8+r&ZNHjSdV9 zF?!Qqsa)RZuWp?l@_+u`-TkY7{`t@F&#&~AOX;hU`f4xpM@s^DG!qSL3=bz6?>79N zmYjSo@5Z#*J!>b<GECyx_;*X@4Ue5OIhJ0Mwd{L0)oyOF)$-ygb@g++gci;A|5#;b zQ#Gf!cHQjnmUG{1oWA<?<t2V0S_}@$+Zd!6;NX^v_%?1hkD=kYFjEGCn<31xfDz7J z;F}>TCblV-87{(L({7TLm33nsTv42h<s%zuZsTpMD>h23y_~k2<=T|mqUmpi;#@46 zkTl+E5xdO_H^;&Hpk6{o`VB^2n9%vPfBw{L^Jb`6sMx>;6J%&GYeaE83r@$%O_&4% zhss15&NJ&GdGSR=Qc_aKiMw~_zIBRt@Yna_)H}QV-#klPUHh+ibJ>dLtj}M+o;_{a zwI`|z10=-7ub=yB!_0C4=7I}?wrW+`D?*cYxMg3xaz!A}!^7kCx=WfdC-<)YbMjZ` z-IBEDTb&IjOq&)K6?N;0s@?qi=Z@M)V>3W~-PaePednM5x7%ovQ*pZcg+Y{zUU<%* zo}Uqa%RZGFh0o-Oio47_W9H_ka@uRfqPE=Y;n|#j|K82b&sWTsv#Ysr?%cbhcbNWH zOq@7TRCH72=V#_w{M@&%?5+MDxHzt|f&&pY4Ser@)cm{tZu;YAH?|&6(!IqP8}aDx z)Jw_BwqDx(?d37<Ef;p1p3derG&G!FD>h})q+OYp)s(onxF&h1wDZY2vEA+PQTzM% z`~6g-o0pcJekFZ<U2OH68yC0Vn|1Mtz?~KWSnx1JxgI?xKUL0n?e=Tx=fu=x?Q7K* zWnNy!%EtEZ+wFXAF&%|PvAfHzUb)gEZ!h<KQBKOgKdg+5%KdV-QbL=;?k@71&&=d@ zZU#~;KXBC4)KpZ=zS?eQ@8;|4>v7`N@naK@KmYt!N$J_=pEY*#--|1%DJd1U%-_{$ z|Gy%3{^PB=rL}UeuI_mGqvqd~y;G#FEPwawZ}(T`zVpw2pPm2ydP3VYqu&PhKd()G z@Ajj?>FBwjw<mqo&b6xE+x)pC?fJ_y=Vn(r-aT?=&fNVUzbBP0{{CLn#U*6p$Ia}! zO$|4k%<S&Bi(T8>+S+<G{ldF<?=D`vc;20D?%cUsD~oTuyuAFX|I(nB2b<aX<!m&j zdR^6B?mr*24$Rtm^-N*C=xuB4n%DWypRODIZN)zeM3%7Xoib(0l`B`m<0@N^KVBJ~ zc6Qd?LzeSJ?9BH^X9b*^zI16~NsV3osaubW54Fk1ORL<8moop;XcvF^>7^j+!j|~? zF9jDres)84{{83MS5EhSenU_e6f|;n?Mi=M&F<(}QDT4BzUlFgKX#>?yOjU@`r&$I z+wx_*;`Mm5w>n#G+m~x%xyK|+@BZPi-<oY7ckeK}c<Rg_ua}0Ge>H9Y)zkN<ciSuB zIoWpSo@&$^E#^LI6|LRp_r~gz)6wH%u~S!9_)A69hkm{0^}1EeMZ9Zo{dx(@jjuQF zPgt~JgMreox7+XM<mOJ-jTV!YwavS;<KyGw@w-Y^{`-9GrB39gC5sk4dT_9L|G!<g zFJ1cd;^N|m4`+9-Shfr_Z_Uce8ejWWRZ!Np>dS?NFVfDf?3>*$XY1wC??0c@8eTdr z5cc%+1Wkstw;#W;F}d!S=A&n4XRi)lpLMe3-Me?Er|Dk4aG|2coR_yZ_4G8`mo5p3 zA2vO7aXGBc7L>JZ#)+G;JIYV}oqO(;-R@^M1Sj5|qt6^1ys7iZ&6Th2o&|;by(?34 zgpU82CiUa#;&atv>C1y2xRfr7wdWL^Sn%q_H5;X>IqKg(Z)B5yuV23_ap`v>`8=I9 zUdwjPy(p%3|Jy3heM|Q(_;^=DPH>`mx>abZsL;)_mvh4cw@d#rWPZK=TFsx(dFS5P z%w1c){)yewy0>W;E?lU1^zO&DWA!azGh@_N-(~-MM*p*?y%ka+IrsRBi;KneVs@mS zp7!NSPyN52<`xxG*RFkgYio9GP0bCxwVGwckG!6DDF6BK=gNV<OA~p^ohDmYPt92L z>tnO{(VK6ho+zu_-}U=#{G=5-{e?@S3hqBL4iwLLVm$wMPGZqRb)moW)*H{BX?MA5 z^;==~4EO&jW}hO%vs3>4`C0w_9WM`0%(k3JFRxQSK0eOQ%38E|@y)ycVxppMrBoXm zzxew4y1aGSnZt)KU%E7@!>w;k?e;7DbLPf|t@~qTX{o88u;8ca)%klIOMfqrzBhS; z;2U^J-{9AL{Bf_0rIDfG#oN2@|9*eI=5eq2r%#`FczJKGdtLbE*^yX2v1MtizdJ7f zC#I~X^wsQn=i$ybb6U52f8Dlw$y+ynQM((T4wRg8y7hbauO;b)N3K`DE_2?#E#0!d zd6!;IX!Z4LZ0)Av({lDWq%3^uSibnxxsrc2Zv~&bTo?4&a!O|9#G2KQIGJ^~*t~f6 z{Oj$d(aY>=`M9~WXV}?i-mbP@3EmX*?9I*1t5>g{pS57~=F@+Ea=-fD>J}ege`$&5 zWHsMQ*RO|f|MBC;nfdz<+`PGTrm&gK_ni+bFZ93amqpYkGkavMzg>?n=aqd`{@_5P zvU}gLBS*H_D80G5I{fh8C9fWHNX<Kaadr6m^qJwcza5ko9r(Mn%;lzwQ{t%-JNwYP zOYAl%zbV=fKi}@pf?a)yho2vL>;LfjHkNn#ywY|xNe`xI*8Xs8{Ox`C%HOL`xtjHl zZ}t7>6S-Pv-kq0;_tLy>3%y_esbrgwpkTauv8dq3ZR^&o%D(a=Z|PO#?>g}s*KV$| z^K`cUwS1k+mm7_*G9~9O<`E2BzwQ+Oyu#H*E-n?dzkFOCAL~_K)Hm5q_~N$Q{SwmB z!kIaDe|>&)v-pOVvQAF$;@y1L=CkMK<ryX)>uGP_P~X7`t1kA;C^}MUCYIK}>(ukl zvu$b`5@)=-yW4;Mzh?)V_rHGq`u*+g?+rB*>+1GRoqF{$xIeqf`&!i1k3YY^SH0m_ zSs#37&fzK5w=?2@Jeqiax1YMI>eDkbFBd;M6Kdbv!69#RW4ZE@^Iz>*LqkJ9KR<u{ z%9T4?GJ~h<#lE;`uaK){WE7+}`P}^d3j(VnZY+CucXz+k*Hed`1sve*6l*zohu^<` zEnB+OG%MtN;9TSMa}$-_|NZ&wuQbc9_Sd@D-Evb!?V=gxPMYN8k~_h^tcgL&YRd5? zXV$P>IM3i-0Q0DWyNJB}{}tY+r|ZY>tJ%4CudU$QTU%FOo&Js^I-c>x!o!JDv02ZP z=JA#x+r6K8SE$Wxz6^#8-Pjv?FtZpK80Pt-Hp>(c8Rxm!x%&(W;)uGRfdQitw=ouO z)}9?)TwFKw7#VH}Ahaa(E?ug6Tb02<`jDUuTq(l^HKdSXaG34D0B@}^Fyt~Znjn;J z;Y74}KGd8#e?EOTOM|#9!V3JZIw1T59Ox_MxmyqI*kMujnz2HwnT<EcZ~Nx-|Jkp- zZpkBzdhz1YrAuDk-dFp7*3_L=&pD^^Rhwx`Oj6RL$JP~<m0SH)-|`^bR^l>m-aOEH z-<2ybUbwJ;T{+oq{`$P_Tetdpc~x!uDL-F-yVsdmcM(~U+<zz8nJd<stJ*w2xBgpn z-I8yG-&w1-`)sQ@#mU9DPrRZeq?mnP{M+qUUrL5$vLQTtL2%{dRJ-~2Q-c1i_?EV5 z>sH&^Ut9Y7{U?X}&$r9X&i-xkxpPr-onOX{1jBceTc3UGEq?yZbJ6@<(Iro0eRJQ% z2$*Vr_}pxFJFa?H!HrK_a|_p-mM-Mo{7ene6mICtJ3r6%@-pA-A6r|6+1T0jV|SHY zUpLn`E_PSR%VoZ^=M{N<F63Xj{c)3h#j#%uuOj^BS!P|ncA0hk*65TwyAUzy;J&@! z;i1gS%S`{=I>dRrM^ac&@ZV|u+qJdrCc8xB>rb6K_bzbu;`wfiZIAjKIyPUpBO^Az z<ZHcs#hwKR_q}9%&)zS5g}1W)z|Z-MxwC(p98k%L5s&q_qVOhfN6W8|(OXtO)RGHt zT6FgKO?UVC>R-3LVce6}Q&kZA!U7bEJAO(D20D1$*~C~<xAlIQl&gDR34iBo#k%*s zzSlcC+*)Pg?H1H6FHXGj_uJJiB|im~xMcQaUU{|S>EGGgr&S$dmzpbfrubILmxVuH z?=o#b^bX=&R)?*fXO<gve_!qH($`V<H71At`ThRm-{0T29&Fmf$bDab*Ze<5oYM9C zEZ<Fjz-W^sWVX&)WmRu&_oDwx{F|EPtvH=U_UhgG_xC|7lhVb73rgG1%<k)yUaPdr z$@QY^<EG~0lV1c}IBzW+GutL*@kNan4qS`2$rVcNygsSp+<HD6tE~4QPfl~;%)Z~P zC1WtNV_kglEm`q&N6zf&R%`oie+yVPM_}j5#Oga)S=R(*o`<vNm2p|_%WbeKnJ2on z{B+9c-@UAXo0&SrY;69|jM?A>TMK|xKpp5larf@s>(|S#t%-Eml72o<X_nbrUZr0@ z9{0a}`*wcazC|xe9WQ=8&$dV2=H14-GtYc({ri7;Uv=fWzq*UocO2tpaY?bus|r@! zpkdkgYrnpNl2YSwhF?3^{TH6u|5@}(uT}gJ0mY<uGVAiWWcGD-Xeg+>Gxb)|+ELoO zPJU&siquno7ni&4KO+PLZ(3T)M*f?3`Caa0UAY<00^jzB7rd5YJrk6lzO5$r+KRL4 zM_fu?&$_%PpIzXpEYGDmKLz1s-2rYb9T4a_|NQ#)Ef0>h@y}<}t%@mMwqe4#|1u@} z_B~v<m|HF>G0@!h{GFz*dAkm!OS9&z+{^i}`HFh}mEHe;2Hr2-ppZ3f{{64)eTOPS zs<SIE{fUjLc7zv68GZlWv)?!O`>^C)Ypc&&<z*{ANKUKX7I+~s;+ECLjk<yTzxAU0 z?rkb}{GR>jSgqXEe?PYRt?<{-x7hL2<G=<+mucJluA9C0PzaLexwHq#?GEnS3m+eI zi??38NU5|-=Yw>5;lJ}Ow>)NgT7-Q6Ajl%eykgycQ0RUa6A(OqXHl7xnxfUihoMqc z+X62%eu>{#E|*(%_<a73`S%O<UwtmWW5$NCyK*~L{$A6zJkccYy?xG=ufC1^yvtwD zW@=wuy-z%JMcnIKmmb#D9sbMI-*;>Ey|TOYl^zEsE<ODBPg}j8vb$~FT`MV5Q`5D- z5Os!$cb~=iV~5^+to>0_H~Dyy&8oc%|NN=Z)?TeX?cnpzug^EsT~oGjx#)Z6;QD<Z z|AneOJYIUy)#dMfemQ-Gz>*8+xBgszbceqf-vd)ye_6G}$GcuQEn@HcEg;MF>!*!i zWRG;Z{M-*0wB*8HO|R$*^u2daVBXyYj?BWs!t(czpFaKi&CUO}md^_dDEP4VK=x)i z3;rdUh&rr6_ADo8hw|l1m*n!^UtJwuQ}gHXaWngde-GQ`zkK<Uc6Qd)CgTOx%Z{tv zx)8_4D|KT|-dv3azX;o!ms=~Vx9`37W5TQU2Wl;_=)O>BYnYn1^T2@v{PuqW;^XT- zJaEk2E4F8bRp6#S5v_sm_ilVS>sO(J$DPTS)14T28TyYK_ymD~(Ct<mR)7EV3!U3H z#X<)tN~97K6TPSF?Ja#ht-qiD_Ev_H6tT(MW#|8yl3c*T&S27;IKx!>T1NThG9jx{ z(-)`8Ed3Yitk?NgkaJ)|!}j}iv)@KRT=t-FRxt}ZLrE6L0>%ZI@oRs3T?l^g^zqR$ z#q%0p_lM-EmLF>2%n@gTsP1oJkb1E5dh1&zh6T!2l@C)=OH-fw&hPZF2-xxe`(K{J z8)7*iDj5!Rb2FMSm^^&+wEOTep5)zK)1-{5Jf2(ag$?yQuxw_KVwg2y(ws&4E6$gR z>Zayp>j`z<SO>L>;la_RN6Q!)E(nHR57`{+q`f1&xc{vX#P|oCSX&8u_sYUs2^X?b zPFi34tF)@N=;ihJ^V@Q)mU>;iqV!1C`}*8~`rMm;ASN*|TsS7+!0fPjg+!-QT-ccv zAwGpOW9|mU1SkXw3a(UPWlb%5wJi9shiK}~R4%1grg?MJC&nmE^zQN&adBCqaawnp z#(V#ja-r5!clp=Wr(V4H{(DSnh?bjD;whC=zwGY5IkRP^*Vk|*C09>J!^KKL9ul6B zZ=K+lD=IXwH9QMAq8C-=apuT6KFi>O+}G3VJvB<7>tFvN{_Xv_1+Vx2o0k?Lw%5?l zP3644uI(l(lX)VB+SliWEd9Tu;_&{X%kB8B{U-%aJl-{Pe|TMOpzY(ofs*^*+O0ls zDgEp2#!J8duI}D^X{k%s4cG4P>d!>fu796sqT^lk=D|j%llQypd_3-bylJi;wC;Z5 z<Fl}Vvxa4gAeTKT+EMdajxR0jT3OyRwN1CTpWL)PHL>Vl?4moLIgR$kotKp7dm`{M zGScejj+v)BRxkEG^046S+t@iacYlbM{FX|7pfzWs-41y{Q<+lhf19pMIW7P4sCW9i z@7FKCKK6FmdE+MqXLt9%SUx@E{`0cKoAQ=>^R%opR<f5{usA#8`8(?av!<4_!$NCT z3n<ArFANGf<$dajt7@uh(M%_`>G8exI)SH()~SSX-VHWiZ@J<BeVM77HU(+vYwK!G zoI34<mUik=(Jrr<Yu2n;;c{-qcdgrhBVVk$&)412abj8hU5(cbjgwyNknWsnrhF#! z`|sk4Ti5mDPfXO-dfId9S)F`z>!wXXYMS9;VW(7{)t)Lpe{Wy*=}w-RYl5_nGs4@W zvR!VzzPz_h864V;Ywvy8Ise>M^DF7QCy1T&IXNYE^4`DSZo@N@?`gs3mbV^Gk7S&O zJjRH%)p~)&dEUY;F{jEzbyanzf2y$Awi*^56@{QUQrl6zBYjEAhFDkcSi9<*moHC# zs|8aL7X!-JoWbgTz4wIAmWk>r=}s5BuO-I80(T3;hewx^b~7-%=-}DHyD#ed)%N_F z9VK6bw5?Y^<C!?k`}5JCm5=tAtvr6=z^QYqW=<6deDw0j<@))2+`QS{Nid5R%!G}* zTCEUDJ-I!;UR$X13-4F?`<pfPdjuWfdH3A*#_eeL*_U5Uo#L(Xe3JgrxqsJJ=RaTf zD^~t;aI=Y)ifHZcFLOV?li4S@|Ee}588(DXQ9f6^WpmnYE`|(ekXM%ed;kBR{>L*j z{hyu5Y~LzY^X;a2_Vq^zkd}YLb7rQDhUaqU8rT}9{j$|sReLF2iR<5&%kkTCGUsoF zJGK>+<-1i>ReyeYe?RZEq?AO6_SCoA;BmPHG>)4wamf;uh27rO>mq_<&l>ntuY(nC z4CmPxO&GRZ+576%x0rRymVtN>vmKU$T70*9Oq6Th&dbsISNvO1aAMHXtct)%8~>iR zwfsI`eC|)B4F9sja$2J2Zb39LFub?|a?t9aJ12Fu!i5Aiy_UGuFh`os<ehJEC1~Qe z+9UH-yMEtQaXZ$wDNAY6{ge6{;S+bx><kL4t!HyBayfF)noCJEcuIY}0?fn`IZ$YQ zoie|tM>FXk*RNkqT6MqgNxOZz<fIgOt3UqT>7ZEe^Q&Gj`<4GWZsW#3es+SzMfd-U zPL=2R^)6?z<hfNwn>Tf6JPrtPI(l`2{-RG2RlYE@Kb!%%_O<4@B%Zr1?{m4n`Po&S z-ei9L;JsNLhaYB5-j*1?Zrwu8=^Y)DlJld!T`AtMRaxtd*7Kb^b#HvRxxmes$LP(n z)u)Z0JrfDNVco~^GjEe=_j>rC|2$5n42BHbZ|_nkdOK}@Z#C!fqwrFLCoV~4d2x*q zdTXbg6ltreJe2u$=6Sv5cXD?sR1BY|#RZ0c|J0!xZT9|`di2tukW(pXUyTLMN7QL4 zE?*w_>{4j-wm)@}+htjxo_J9LPp=zgt;;NC&e*Yg=hoX@*>!&kzq!kEvNV-N3qsW1 z^60ZTf01whC$0}Rhe4fRLAn0vvnF1gr``4WQ-w_&M!Gn0VWD%dvGMI<SGoRncn4rX zFsOg3d+71UT`yiNS+acl`J#u`Wj}uZ-hLih88a|kaI#>Qn#X?h=%O1p7N0z+$rF68 zOxOST!Gnc|S~}02lY6yXYwD{box&$io;1(Dm$Ka;!<CPZPgu>TpsXy+URO^ncGs8q zqEAz2n-|~IUGr8#>Q!~sw~ycJZ=UfvP^Js^&V_{!c|ci&DdWYLKDoQw3m;G0S$w~w zygYUHwB^$#O`17r(!|--)t8sWb8&Im{rizzUS2LQFK=yaz0JEhY%*vLW74GAvv+4+ zURM14-@P3lmuFr+CN1^q_RYwRu~E`iwZ9HMJiM{4t~veeuNG)CW5Hu52Hp>MoEdoM z-nRcQv#a9cn>#!6H^q8%FIkfE?(T2@$eB5yV~g6_a;7uqDygcf8XJFnbhLYZoz?XV z0rTG$-8%X3u)2lJWY5X>5_Urd_g^d!aA3CiUchEjlGo1X>Ob3T-dnAxQ+Mxf-4yib z*|WAUKP{iVdpB>=q-FPhpDELQn|@|S;{6)oGi9RSU|?W4AjNXw!cIwv7q;?+_a-RD zRaI5xgfr%PM@MfqmJ_+`)XZLO$a5H>oR8(gh0acwMYCpQZCjloTl<?UR7>=BsKf15 zD^?`zW)a)5dv}M65~6S}Lkxm2K<0_8_V>KCv%77KXyY(2NI5d_&W-Oc_nTk0+}+sv zILq12%*$B}^NJ0No8*2Qm)Mr@{d0tsJ6VbiZRhmWI-YN~RZiZ`zuvt6`t0YMZJU#x zuaN(&)}D6c+(Tc!-ka|Zb9XI#y>RuvJJz}yYHA(FU!R>Ve7fu<gY31h0rT%|wO2EA zw3+|baN*?2;v~)F->df4`^^@XHg^B3eC@XSmnydxDfi~wm|?lM)@gn48U6UTf9ujR za#r;JVxIt7BL@k;HBJn?bLTIfJfWkCqvgwf+vj#dLV`DUa>j<w`<=Yhz}WWqIbV+_ z8UjLsrR8El59U3%xY(U#Q<RZIySktM-~025<vD|0CHwrGl-$$B7wwYY!cp&T9{%u@ z{kgRzzP{q$3(6Fg+|9$4l-$)9eptM=`;WU{S?bn0h~*3~1h(AJV_0ysXx-9fL4IsY zgQndM^zvOQ^GWrT&v`}jU-x%hysK$de9ODLBj&EriJ2Miw=5{E&d|Rd%3P9DmUqa0 z`Cb<hiCc@=IfKRbn)G_SnBvH^$bR`*$-;BJL6?s{acg}1=VYMDo!u`~mAFJMdn~&0 zKD~`g%{^5}u^Br1S8*}(%9Se{Vwn#Z3w65K{}uW4a(S`*t|Hqj&o65%IvKrK%=CLf z#<b3(Kim1^=UIP$c%A8d|I^drYvT4!d8-xW?)Kuz%s`jP*XP7t`TNoK`x{G>f(H@) z{^!4G@_;>QHC?7~-r~8Yw?jeWUVIr9a;Zn$m!>UaYn%5@<)yJhdhy?kkhH8<|G&+t zbNU6*!@!_#!E)h)&8v^+GM~wA>#hh?QB#ZCS=9Pg%gQ7_Kfk=ZeB0`b*t_C$_igHU zs|2=(fnmX8X9ivd-Jrn0hp%4US|4w}jr-+-b8{?}r=PyLj)`G`aiYYtCnqN>P3(B< z^zQQ)5P0&j0@{GM@Kd3o&F{^-yVWi#JL?`C&JEkYrs$vXpFO|t7&e8?jw`D@e*N|v zr!d~#_m_mMDk-t(wH8}G_k^kZwd+f68n2$>#W%TlXV3lR?UAdeoZ6Ikch}6>vp2`O zvR~breSO=EZ6D6ZKfZf^j#9>>pv&_wv9Flo)#rC}|HF^A&-^x4#vFH>|F)?(US`Ml zvxgjAT&C=<uPyqo>ih4A>A#lnu&}$k!!IxGJ|-L|%CP5yL|f$M#NIOVT=j*Md#@+| zZ_0{4`RGY3d)Z8>+3S8*@!p0s4@!(U7A)NS>U#d^rQR>+*Lkts{W-_lOX>2%;P#A3 zU5TqKLxZO7lk{(YqRRR-s>VAmS7LceSAO`*+cOG0H8pp{=4K=>Dc^73|1P9Jr}xVg zAveb^tz7TPd3Volc^@J)u}f29t<jb%>3wze2Wrmc_^(@(C#SUN&fEQWt4agc|H`ZS z)MQ=0dzMt#eZA`@Td#zQObL^Wn)O0cqRk`l<i<Cr{%m~Pa8-IUdx`ztulkQ?CeQ9z z;QIUe{P+8poGjQF_Hh2gkMD}*uRngNIn_&6b}svEz1H^db91d%m`-mDOEj#BX;9OY z^fX<*E9UCeNyh_?j+Tq;YHO>s|2M<*b94BXkf|Y|n(I|;lVgv{eqA0LI7$1e(bJR3 zSLPo$7|d+aDfMT@300nnPU~`icAVeVxpd`8+l_mcL@doec6p=Z?|F@Cf+tTGoi_E= z<t@p2ZvHqW=eMEmhvv+!^9z)uEDEGACi1yoz7TNzO2~N-+OoQ{bKcTab8BnoukzK^ z&bhh1X7_^`UNB6n*>~i*sJy<s{x<H+Ggt4H-k6a%Q*-8fy^8PCefMvO<pZT#hxALJ ze(1c5?ehCf%GR9z`~1`wd2#tYiv6))e%*VsC4T>n;1e>|Kk8d2HFww9tbRA)<MDH+ zf2me0_j|0%@7$4bV&@K{7b432v0vUPew=&b>gn?$F?WAGwd=G=d%9XWcvAfzjTL1Q zsc(KOJ5Cea^rJueXXHzvMQ8Sxsh(KhQu8}oPEauQc$`vtTytLPcfEfCnwKt~Id|^b z-oWb>%9Y2z=${jj`K@QM&&vMotd@=w3&LGrJ>0V_Zg#?(YQ||UD*7jN6Q;bHeq7|q zv^(}E4krD$!r&cb)DsgIbbIN(_Bn|&CJFsy<}F&bz{T%t?d$Y?_RTgwf4}Fywq8O1 zq^`z9?UmQBtem$bg{!EzxVV^GBDLAm+e^+OTq&!o?bwtRzuKjwr1pj_vAtX_Hp_A9 zpU2xLnu{2Ai~X51SM=Y}g*I0Ejk_-HsrlHXrEWXdLvDA*uYX5$)ZQm#EV=RE)Asvw zRZebv``>7ewtepTpn9gzlh$JH_mcYF-U>gmTX<(yahul9<45EFMAy9eyrJT&(%1QK zb$6eaDmu6B&pQd{5S>%!EVm|{ldpU=-{M)wlmDW|?BR8_+v@(6gg)C^vZ!tThX)TH zMsM%Cy&>_*B3I_Px|<ho-EvS0R8x7<)~>$q^SOl&50_h6=RYafw{_dS2hX=Z{`>uZ z%=UM07CO&-`EvW})$cccS7UalzFnFyy|dSo-Dm#mox66=x-~;BU41iT0Ky@?N%q2p zNZ<MQs!s?s&#&`ZS-bA=!=jEa7BTFN?eh<4u3QwL^pJIjUw27py!cUdZ?^rfUjAQa z^!h=J=laMrTQ=$UdRK%C&Yr2>F=6W7xwE%=Osk4MA9;Q2{Re@4ksJSuPO=mX^jmo6 z;!S&%CXHn4@c8-Dt9Ks?G_X?HQFiy$s@-1_%!7IZU0vcO9=$kyl5?;9wOc0-<{r@9 zER$zm8(ZtlEUTon(&g3>?_jn6JAOQA;muS3x1nzL|NZj+4T~QCIMQ*MF?jX0b)tIF z&lZMXPo8}D)%By@_S$!68CO3(aAPj3@ZQU2%h>w7X6?WH?XKoDpHp}Dg&hx{H^<ui z`(@j|*I4G<`f)rvzqrowiQujcI!4D<-Je_fu=eoYx>a)@&duMoZ25K33EOMGAHB|= zId>ZG+8^J7=blhqW@)<YY4r5;^AUL;;~nEyKi2lw>-ykj=fBwf`wIQ4Pyep04~q%4 zfA=#q>nvB)#z$I#>#zOpb7q#2U1ug3-k$yXjp2ctFIP>mX`i`%{_gWHUq4if(VIC# z;QFrL9gcdE;;-75$n885`}bT2|NX$b9T%>en_N(j<-534S+gqM@4e}vXC8d+?b+|1 zJTiH}X76sh=-cMG()E6~(#7_FPl$6-oH+Bq;{E@({NLt%)xNOxy2L$!hg-fLEGhe# zzxDHLnd?s{O_ZDXOE}NVq-x9L<;&A2uV1oh)2nA^i#G0v(b3yqIr-$deZ@bE4(_X6 z8MM;t?!mKXT{KKyUp?)kVIs`s8yh>j{u(bsiP81E7-_S#8<T%;%=)wCV_@}Sn`u?h zaV>}CjSNy&_B*{6u1GrdB&gLVY*CQLDz76`U4w+V?|)jld3*P-oBM6DXBbaBaQ*8g z^M}@LyT8>YpV+YJuluGDu7e5eKY3dhty<F3)pg1%#i%tzPkq<idS&lbPhaLM?vGiy zL%Z-%dcDk++BF;Ai^R_>JN9&m<DS*t`?+Ob8x@?|@y|wy+gsU{Rq*SR^!f$w%&s1; zmnnakdb!u`%Gz~>PUpQ^L*jy>f>b8I_^{RZT&(V!i<@Vi$<>)v;b>(Q0}AHOs`zuS zO`Qr<+IP*;EDFwxo?T{sCHsQ2fBWkPZyr8>Get%8sJaK+{+BQRFAS<wzI<Zc{S%Cq z3!lr(b#HeONNtgdylEBj`R!D>y`DRNnu(?v?_qej<wU}w8FRN9Yg9gq(VMwq`F6R- zbqVjLr{=f!UwbGtar5?KpMVz^E<A|qT=@T*pI3_QuaEbqtqxzm?UA{p+>!~N+DkWC zd$~TnJE_KX;u)WLQ{p9myxlO_Q?;+==Eun=_lj^OO-V^io*^i{Ttn|^w~TwCef+-A zXK(*Z(vP=(eCMjP(@ZC=_tpoqZZ`JVrHQ@MUpXaQYw4y<mlg?0E>@CT{%-SK+k_b@ zw<k(#wVvf*KWnV|GkjB0@mV(haPdbMR_DA-U#L{ReERX8M|xrB?Wd-z{Qm6pEhGP{ zdd$xo;fq$Ue){TEdFfO0tn;TQr=;FJc}i<<)z`ADtdGymig$HucXXV-D#Ufx##Z-A z{jV<@9~5o9{lu27p{zW(q<GR@m2ImljM@@GvzZJG3=51wP5t@zPMq*iT6A9dZl}lJ zimT6Ep2)quy&$@O<?iz9c5n738VXM27TkH|TfD1F+{8E+!)o8PGBIw}I|L>s?ERHg z^46li_o0i6y{q|*Y36Typ9_1Qx;HO>-LCs@e*SawS5i9o*R9`!U#TeG)n$v)oQ^5s z=Wp~#ovwazTFU0&yJqI_Uo&p**zYp+`1=m6b(S}yLbW?fI-VG<bkfoe)DkK8KGLPM za^_8s@80*<+%&wi_x<W;L9HQb%jf-BEzi>0C(1YHLh!-~r@T@wExP?kXq}T|PwD(k zOE){a{+$z77aVHeJm>iIzm-<iTl$Ry-I5M^AN=g+zT8-ii`8)FZ@a&jKc8M8{r|}4 zpW)Nlz=j!xT34y>{Tep^SJCA#pU9n`UR{kd{jL6eiN?ZXUbFV>Ulw`azJe`g{rT(F zf`Lz}loo|@cXlijnAj{W`1e+SN1L0F;Kgk3!<`x1<OKsyTx+=XQ2S74N0nQZ;Kbkl z`&_OZZtbv(eedWJH~-4FUH@<X`y;KS#IE$}Yi~nG)$SEjPDQ8O@Qq*ozw5=nt$*L2 z|Nn7)bH|i${#!j#rx!P$|H8F)E$^DOynp_(e${1V-E`$j(%1P%j{I30t$+23fZ)o{ zFYIb{etqBm?*9E*hYvblVwf9R>T7yi)x_H}_*@xeMZw%oH(y>Or59@?+Bi9X*4*55 zbFKMOo!tBS?mL9<$)~4(5LqmuG|@-Fpmx<%F4vuGOwxOIE!WhXsj0brx$kT@uce>d zj!ggW8}+-d^sei(8}BL}N<aRg>i%f6+ul0|^Ef5M#g9M!SW{a&|IXLek}od;d3k#o znb`y`etOCswm$AunXCWP!1-_Y%+O8mardh@Iq&m|iC^b`u&w6fm9h91=w4v6dDW_F zPtVrr`r@nh$L$JP5E3Rhar^et|Np{X8SHZBpL3n@!c3p}=Czsa|Gk5v^myZi_ho<9 z+s4hvz)(^5q~o*9+cop=@H1HHzG-Ol>pA}T?yk@qtAfj3fBnVoU!P+buJFL_tps<Y z@8RXk{Z#v8f3pb&KKyuMGxM{(7eDOZXCt3~Z{CG~$%>QXUnaaXws|l2_2xD?+w4=1 z-OYZrY`4-~s}~m+78e)xRkySA=kxQ==i1LNf7GI(^M*<A<Ik$Ei6#I4T~kx5>YvBY zU?o2_=;+0hzf5C(KD$$QRw|$%@37RzBNsHAwylMXEXg%6NLg*?6ppj5`Eg_hU;X(- z$F=pR|NDIYW##8-!h$#Z=Y7q4%vYti&p6iVo!DdJ^m8hzsvBcn*;OZ>+_PuTjdhP& z7o1!C{Oo77Mb_mauMB?u`T6I=ha*$9A9tL%IyGM2?fd(FSuuvW4P6sMidQXNwaz9< z%OcIK%Eim`<J+uSY2~wj7T@NZvEOj_^BpU%y10DW)KuiVZz-d@=ERWf@agy8W@Rq; zC(FyKyfZq~^H&<%v}JCmzGNx6dNMlOcnjzK{gY-h$>8d(&`Z02rLkEpN$T=m{YBT; zMAb(%bmF?sgUa=HA*)2@u`rsH<gMRpR(i0h{OF@UJB#n9?4Fh$7^mm!dGgQi_m}hX z_TF5#l=JA(qu<}%t*((*S663eZ~wM(`C>yu!<Uzqo)+GnnYs1c{VkJTv)kQC`+8cd z`9s0eJ85~}l@~SbP_^EAT|fKav&yGmH*;F;t<BwKTHfHb@`-`v^wU3Tt7h2#-lUtD zb4J$mROS^8^{<!LtO+WWsD0>k@7-O^@9(abygnvrbEE7-!tR63x$OMgu3kJ?&&z0~ z;QD6K($v$_GjsTjtE(d(ZTq}=f3dZU;yi<`Rwf?L?}l$)=Xu6cZg-Jo`d_KFvGp_j zU)85wmEU(-$6R0F{G9k*{x;P|Q?iv(fAzhL*0KNCdHY`K&2RTyTw0Hp$rpdzyVpAT zr1UCR?oZ<9^>1s<+jcGC?(3h%_S(0n8|NN9aKt{3>ug{9yxC8ye=Uv{p8k86GGqZu z2IC)n^OCCBW`Bzw9y&Q;Lax%p6W{@<d0lO7Zqw~*_w4(rrlRqJds}zrp+;u*U8S#= zt?b;r%XHy}4F&i1RPNff>+QBhj^%dG`zD=8eRU;EN%U|?@v0?SwZ`-KPI_~l+WKRf zO{vqOBrY$}n0>1K&R(95TNkd(o4IGngL8M+Eo-~F9n_uLx^yRxWHh`NXmV*W+vF3l zo>oUk$Vb8So!!gIl|_RCqEa(fs^?owbu4|m;?=K}8kM*EGaKc7Ue{H<jz4C6T<GGx zy(?2w_b58Q*|KHcoa@_J#l`n^bN@eUUM(CLdUfyrf2VDW-D;klS^Iv!{r9KSH@cW) zOvtU3>z!=HV8x@?e%k!~LkI9&kW%Ec+=*W{Ex8`DnK3#<61EmVF7DXwrFVC|eDzvd zV(Lqwi%WNi?B!qfT`H&8<;>NKTT9ENALP`Bdbzk*$;7_C_io>MNx3-XW%pcM+?c9& zDe9^EJ}TO=jj5lJY58i=Dz#mFOy>5DwLz>;?@Y7i`s3WxnIyb+H^1DIL(i%~oj`^Q zKNTC=o;Pm)9+3ZjVNUqRnyTM#w}1U=9lqwi-?cT7htD1Qbi;Lik&^ievAy&5|Jb}~ zt>xu?8|{RXRrhSpE5CoDpIz|c(z*K$@-1WUz1{TW>5+~r4c~V^eLDHx-tKs}TeaT< zQ_Hq34?A=&d2daAd%BLqM8n$E#U0^q*7F^lAL1rkD6_2G;8f+dyFVp1*OhN;`5r58 z)6pTcXx+^ml~XsqA3wV<?RfaS=r3Ep@s|dddRwlDyH#6w{e9N*U#}(~%6{qM!nRi{ zi2r%-RmEEy9`4_oz24ed+TEo`)~x60-%n9dv28pXrHzjG{WZ~C`QgmW==5_P-`{#i zZ-1vF`1M_GoV*)1i%nQJYsEp$kgij!CK+jIX=+bAEn>9u=4s~B-;SrQ)M9PU{d#$e zv7UN*p|+^XN4^cee!TCotKt4`*VVOO>;1H++FmJXTuOR^ft8+tc}aQS6W42pii;Xm zh8>!zoi^|LrFC=nK3%tBjn>KaI+JEjS)nBwn)>LJ(8|t5>iWN%-*4+LeQ6uCIml5+ zb>)9caL1fs9xqcy!@1XQetq4N;;DUidcY*Hf3b%;*55D9oBMLX*%yU7UajY2;<s-M z4su=Sa)`TNuGq_{+Xt6zPt7X&7h9ycXF|}`*S@yC>e_}gS$kleC_}H!%X11fGhe-U z5oK+;gLg;jH0SC6d@o1aR^Dl!Jk`8R{xPqhU$lITb?nu<yIou?TZ`P&|4-mh3cBha zDiO84<k+|SS<4@N*!8mLq(^^;ht|YNniqe5em{MR#G2^xvL7GjW?%1%*i};Sdw*{K zqnDWvUuGKC?=u&S-CgD`>vsI;T^@da6(x6f<x+{a&(rTOZs)vxlxa`K4rS%*!h&mm zwRG%Jy4!i8_HdGtlDJY)q@bV67Q0CuFAmTDB^<~vt`xO@UdM~ctzR!o%$jk#f_Ijy zi;4NA-i|x_l^0EPacREtS%1y^=abKOo~R8id3&L5V(yPm-~=8g@aB)13B#7Qy7zmZ zd%AcnQ`qj}_vOLiUC&urd*)2xIc&hXHT;R{PS&1HAC)@|?*~NrdM$Ig8}z(iQc5a# zQAdYHR##hFTbtW@QR!E5OSb;)Zu$L0tJNtkMkQS1iO)>0g%hTCych9&Dpq?+IW7PG zo~JI`c0~vMNp#aZy=Rg}=_dRArQdH#U(XZkOp*Ctc&C1oZ>!6r9me5PHk~>x{+L@! zG^o-u({rMalFZW0r9b!G-5;-4_##y7W8{lx_xY~-rRy22O6aKiw0SyP?)^{EM$X@t z7p;i4@~y1bQa$fc_R7gD&~)bQh%49Zl3E^LT%2F`?dF8k)BkJ>9%yO5zb|ZQDS3Xz z!;Pt@|6jWFOjJb2vLNBqkB_#SHhDci^Yips-81+8wZFXl|Hseg-jR_@bHce8&W07t zUbAx&)3(##@T+Kqj?yw**i-pAY<=9{lH@1#XCl@J|4huwI5#_Zby(Xgz4_rXl~xH^ zp*PANZc3G_auNCe`TU=c*UZ=RhW;~AEB&=;_iX>(Uq|(=!5!)SUwPNoZ%IwLWcKbh zV`sd~w|M)-7SFuiU)=YqnB6S@-kyYmOdo%J4G&*4!$)LmlIwX<?Tn*cxi0V5MmTDR zt+*ZUlYMPX<?pxKcgEy>Zr6$5m+<w~(%kSMX-&It;gg=<Xjr~??t)LR4({J_Y~Qn@ zg7XU-nU7ahRjr!M%v2Y;a+UwQITv4*Zj)UZA}L>QtoJUh=Fi!d78|8a+n@jZdGq(L zTfcwZvbL7q9IJ4kIO*4(m)_QY;wN1y%KS0wL+tGGji3>d1D}=M=RD6yKU*fsaG`Aj zv($pimo7gP>U?zG)933MH$F2z{Wn?5PWbLzn|bT*hHq+F%xyE>&)p4AS+VkP>09%p zD<=C_oq1ByrY@q_!6O$E@&Co6i?hx4ex38?ZAZuR=;?O$r>?FJm$q$qK0DH(Vfmhb zPg53iar4Ago_+eTIQaSb?|t3Evi5b0OS`hgfBmvbKDMK!Wlzn!J3ehcO{}V3E%D5I z`Eq;uxt_AZn=f8S{Q7qL|MuGIOJ857=7e)y*eUsm=ceAnlS`fk{q-w5o(zuXX`orH zbG`xwYjSQ+)S2pJaA@JDQ?h|aP1U1UXQ@u)6I5LidhSozjr*Re&q}QAwY^upeffXV z*S?dG-pjm;%X3!#x+t=L_h#q58IpHIin~AM$@z-zGyU{$zuofn^EMTIy}EjD);Irm zo`FuiQ%x%CwblmMAJ7ljBVm!o)UE!#YC`LQWhcLVd>p%X&ziFL`;2NVPM0g!n6<T8 z{r^4x^#6a)om^5=r+)lses%U@W#!48E2_(tzi!L0x36YrSKijm`Xc3y?H%J_qu9H# z^Y2WxmDH4cC-*KV96S+zVWvU@+lwVryi_Hn%9Ibj;Jq&(xKp55=VbcNGlhR9DSs4S z`CCEhldO4bN6Z}!wR2Za9ZlWR%`LdL<J;P~kNz#@{ms;oamCxkCExbPYX7{`m$SlF z%72TR7`EBzZ$Z&r=7!~I$;kmRF$c>;*B&_GQU0gm`p3tyoiEPGw*Knr`|)G;?d|G< z6IZY9+`m8JMZm!e3z>>PugekVzQEZdXIAyFoqPYyKfJeFZ6<ArnN?x+@w90CCQveC zU~oupVvt%;oV3p6Z`{{&LigExksAGyUmW5+XI;59vpUx4F7K`F9xocEXf5S?{&2D( zmtS7QWMjiGv5bO(D~-;nz5G_@akKPZ?K=s_!xz1#_VF#Zd@ZsxUhnbumlv;`yqK02 zs~=l+?;S^4&Y9Y;SLN34yVcy`<@H3}zsql)$kAh6N=ibVEAr#LONHLP*MD(sZDhW} z0qzsmu6+CYa(%tw`|hQyr`x@n!JWC@>r=--y(Os3t93md2RUthc~ZCT1Zi<+c2 zKQ{I)>&x9}1xjxRK65deI6Ob{x$g7bW4Yi?Lyi2q><h2I>Q~u5wrXu{74n?@r@k&d zJT~_3qK{sl2j_aNTPW%84<1rCef)C5o+S(B?2>vFP+7Tkq2XQ4>n2-GE(CgU<%LV% zlE^fgl;u~tbJc3qe&^EOswGKWUaNU@eY5!gsa1M9?i9NZ9=hMY`b)0QjwMq-or0(3 zUv;+{@4G+I?DN~}Ti$7{n6<+##x+;on_D@x=&g3pvG;ZdYt!S*jb>Z9O!heE(V_KJ z#<=#`i|_1bo}c-)M*ivoo>lRF=R86}ul~xr>!1Jkbj7m>rCWQgpWfN26&tJT>>L{$ zZ0qaWd&nuW``+HZvqxO=FD;ojS?#Ne(#9P&W??0tmc00W|FU_`kN%FDnm4b?-O67s zI#{-mLH6{Oz~JBC-|jaoS?r;bHN|oD6s=6f<m@cNOZV^l+}@%aroUhH=d-!`DPFAi z_kG+yPx2Gb?u?SiPZxz6S2_ecZ`KV1um7ot1Fdy&H!?M~EqcOnJG3N#jg2jKm(B0m zn8)SEJ{+HY-{;cRQ+-=s9bdyO-u5f@@8Msi|2Hez^Z&f_vt6O9!o0fh&k2tEPhu-; z*PdHrV_EvdKE6x*y#8ISd3!hJzd84)^IoKMaJ+PU-H){R&5yOu>vmOKoz-C}R(hmx z#=V0Y&p*cYJ@uIpB`USVT7N~-)7Ot?&Y$}3bY*(s^)J~jQw_WAPR_I|pOScO|Mu+P zEVu8j*VTKqEJ1mq(cj}opR2X(|5AVX`&XXA{-0ON4zG@UDO7ywPj-0Yg;y0XPP%fx zbVxdIW!2W~*y+9d_dQ<*7TuZutgh<9x4Rqdlx?d+m&l!yUhOO*Ru;EZC^Y<j_7A>{ z%-Y<{mHFxE8Tt7c>EXYZSC=P?izoY@eg2$nXIWXBaazTh84n#@UcOX)HTR<Z-;$5B z^B-Btoc*QpYw7e^c1F?<Sg+h&^PB&mz0DmvTZ4kPn-r|GU$^UTU1X@gf6k<N`^<FS zoZtUH?{X_B!863ka4cYaFj38a-kCDa^J^Io`|O+Xd;0C`(}a#GI9S*j&G6Itce{q! zy<l_THYL3^8;a%j+B9iA+p>1^afbBetAj57Wbxc@Zkt}SB1E=-g0<D}c9$#P_LZpk z=6`)sDDQW!>rc$3^i`4h`j0zqSDo9%cP_8)+&51z=HhjFGbIGC-^q2^zb^XQ)$a@0 z7)!tnJS!Q!c8~VMTep=Le%_O)cJ1}G-qq{RpWYk$P(wmi$VbI;nTF5K+`L<{@%qd6 zeXLqBv2_2$dEZ<lRi=8Jobuw$&F?n0w(sw))ze<BqdAeC{kXh+-Q(5k+nzo5KKiI= z;|?1|#rMz7e)`pN>uBryH)qNV4a*82?%p|*t94n;KDpAmygaqMJhkHIRe~3fcC)@R zu(J4Z<<rySy*(xEe4;;oTmSgY-EwFdpB`hy##~;0ei`$1YcHppmYZ+Cc(^UrqWW6( zg$3&0!Bfc%>W&P&3<sK8OrD;}Xa76*%2xlI?`|&K`FBp6kEHA7>GIc}O`oJ3$!YS> zqUNVxVch#g(|?ACv$XPw^U17Ry<$)Fr1ct;X3qS%EB@AwwBrij_X$^h+-%Qr%P#Cj z`Kb_oxxo8@R{6U3)xV1I@Jd8%)7A41)s#roKEEpDj;^q_*OD|Yx%hw2PkyoM@=6M6 zVym5U$_q3yeMxzfkVKl1i_Fdt#mR<Rtxjs%n%Y{EjIC_m_MG-?t_YuACvJ5u^}&?J zrR7E1>u%nTx*Htzab4Yq*cTDg8<S<1aLx4bTjG8-B`?|W)UN4k)~?M=yLR==nrz=* zw|=>;mO0Mb^E@|g_TIe7YxCy!DXCNC?B@La`~CTq={Y$(El!(v*)Nlm6N`$PTRpvG zf8DgdzasS_jV5&X%@vw&quJHF_v1nKdf|z4=Pum8|L}%HruzEEwQCh`Ph~3MC@d_T z-PC+Lcc-DU+ne4#H^{b-3tF%hKN<J-RIUzRpSHVe+oV~uqC!Hh{Q39p-Mh53^AFW7 zKxXK_aL!HI)^4?L^9uLfB40F)F8`+bwZ^vLe@ot(m3Ket<@XqCSr*x4Pw{^|$F1_~ zgZQZA_+rZ)&o3NomT5e2_Jqgv6CT%Z%=mqnpVQ3j*Xr<o1EWi(MvtT<U)sIWcvAg6 z>(ZsX<;%oCXsPJ(Wn%IB<J?@Nq@-$pMO0K>`}gwl@kc**Y@Y8FC@Nj8Y!)UWUH$mc zQ6{CLa`WK)?r-1A4NPi&Je$a%-}UqT-tDh8pTAXn^y$Hav+I8@wGC%sV5mrZ3L2Zc z_4xZ7h6ddmjJynQ4_>@@@y3lEmbS%3MYncIY%_U$|98sC)F3ULWpZnty-#yit9bUz z^Te$O8}C-c-P`lxLcn6h$?bM~yf<t(@L=looGYCxoeIrWm#$dj6Brg28MbW2x^*Yd z=)AoD|M_p@k0q}Uzi^B1?Jf27{i^2o=HtEU+Mb>rw{FF*i_!G*(%MtA(?D}&!Si!Z zR;{Xbxw3hA=Kp`!{{D{s{yzWe`uU-&_sPC(KYdlo_EzPWjC3U}tw~3Zb@|N^IC>=I z|BqxQL0-9>=kN6c+Am7&s8rmOkoE3vb<y&$IH73B2A?Q)rVNILvP(UGmdrjbEnl(4 zS<`<}a@yq{S&kU-``2S@X75W=T(Ng`TwdPCcXzv4nHqn+yu16V%(?BW!+51lPwfPG zY1xkA<(uqggGvMK)gqlUel6$!KdaAbwwc*8Dan`ner5Gnf6o%>TD8gO=*h{8WUVK4 zbR53;<;xZcg9BA31gi7%wHq70_q=CXedg?LRyHnX=2n*}Q$ttX6Wg15`e^?C-seSI zUu|>cw#vW7cOi<)uV(Ay%|$a0ek*utUA#BcOVs`OzkC-F*`HbV=}!+OZuMV!{d?WM zvuY(%&;NbsHPx&Av&|na@ZxWW_ErWdh6QtH%!*pNBxTp`-J4=PerxJa_gZ@D*O!?c ze)IRax-c^O)&7bwNpE92_+|3`RqZQ6u0jS+w--LHRJwHO)uQ$5lam&uCog{gA|oa3 z+SbID*!@>;9a!*KuHfOLL*<1J&(FKt-ytOY`D)^q=kt$iO$~kaEcW&J7X@W`*YqVB zO6s(htypsEz^NARQ=b-P$;E%?3;f?1yxMb~*vI5!v*q`stqH%q_EyLGU@w<dpPD9R zIcq<Dr*^ActFz-t`KQySzCEJ<>;5l4I!Cg$@@jdJ>a1nYEM9_(!UbPJJBl*Y*YE%L z?9tKBW;s9ZoO{=LV{25L9xvxjv&>7<ywd)2cV*_Bd3*i*rkRsh`1j@cou4&pmRseQ zUTL4KtdCo>%a1(zByE0b(`N7FWLKF!HNll3S9{yCv&u3{7(5oY?0OhpTYK%BcU5I% zWo2aTr;`h2&6*{w?()ibar*gx-5qo0{(O~t@o<~vjG3jWtDPFQO)J!RwQTp#kEQ8i zx{H`k{(Jvg{E6_%|GdAZY)<rb4XcVZ54_UX{qHg_7gy(|@2*e3nfAw5riHZ#3JMk% z#rIUcw@$RK+P8kT-d2T^Cr?;>uJehgc<+1g-kZG!po+EOxd<rvelyOw@uKu~*^OJX z_@%B0`rXRV7V3O+ZSA5fS6&ON`^j0AL>%^B?$_DQvoX8d)zrkKr+4SEV|Uz3cN8u4 z*lYaj&dxhirX(qC+GZxeb#~6&-kcmBUY-)Ew(G90n|gYLz9x6N+|1C@U8~pMxm>z7 zcd@ieRz?Po{5yl19n6A;K1-{jOLEp^oSxS0^5kji(tBcW-|JtvdbIxa!=00YLmpbx zxtu5uk@#9V^>>P`FZ=4*OO9Vuee_}1t0K?6e|P>UsVbd+GRBv^TV_{eMB;m!N2@uM zeogOKVX%6R`IX#TYUZczZQ4KEZoSS#Lm91_++c&%kky_KDqH_+vNDLt{`*(`yx*=U zad*$R!%vIK-~H)LoH1G5--zdMnPqP4@y)y(5=Pn68jfez{QI;r*u1&9eRELg`+Lv! zR?j{^=jQZ|y!+GUTPoWXKf5;5c)MBdE(ezyyYdeSyB(Wzj`x?#+T2+8F!tZ7Rqw9O z_rLq(rTovIm$qz4`kK5l<Z4DNpZn&Sfm<gEZqE*Xn_iJ=Gw<E%_1`MKUX^oE5u1Me z*gcCvr!D3AuXdHDo0^!s%8#|E*znePe>H=wyZ_=d{9(D0w+~l$Er0vdm;KznqQ_~T ze)H;<Hl3Opc5G8J=S^ici^(&mzg;?kSzPVT3Ef>!kDvczmEqlRq54im=+Z}dJGWN< zyrdfKGLKKc-{8`|GQ-TC>c}UPE=2!7f3NnqY3bHNhI#=H4;7U)28TGJQ$)TyM22oT z+S;}H*0pQfwYE0hy0vT77Okt-R%JA9)4S6V?YLB{Y0(1*hiMAhn>Y(Rlbo1N{B{=+ z6b)1q|M;`+PeRdq%kTe+EVb+`Ew7)vR61?C<xPFaDdP+C++QC3ZLQcMa{l^ta|443 zZ$##*>gujdKR+)jDvIIeZ1*3Bl-8d(D^OE7@#|@>3ze0XGJNf4(<V>d_W47_9`EUT zKY#z8EZbrdzFutCjyIk@bBqfTtlt%`&?qhCJ$v-UkBWPX-M@yc`gCF8v2*9t&Yc61 z`CA^i)z&6UFMTyFe)a0ta<*BqYnKIuMqODPAG~4N<@n&W`^wil+3EiJ^t7hY;Z(}1 z$_ksAV!8SEdH;7T%sW&5?ahIy+M<=mQnRnKy}!5igt1bKfRp?ho4AcTJ;i_VGdZm| z{E#Q3Wr9+q{;nM-uA3AECT=KQvVLX03Pa9GPCcG)O4brVEjMmBsZGAMbk%u=1<RIw z`gr`AeEpx4d&x;j8~4cleZSu``}#4)0|y#q#KnWf#e>7cFJHg6Iv_N3=Gk{Q&#BHx z-E_?CSy*_uHy3yI<jJR>L?3zdOMJ3@{M0(niN7BApH=sNw|1%P?&9Sx`_jG~YJJXd z;DpEFv%Rn1ohvPVJZpCLzK@~K9vdr;9__M;UF)#m#AQYB;VoD8g03%E;&F4fyGxa5 zm22OPoKnLb8$L8gH$7%9|CDlVhGFdA+qM}3=@%5vJv!>lpkTY#$ZlTwTPb}drN905 z>zEHbIOulv=!^3BJ2RaEuU!tlemOYbKY8Vrhpkp$C(pcc);!k7OKY<IG>@q8)tM%t zm7!HH0v;bbw#>ah<^SL5+w1GK7$hWCSX;j2m&<wb?%dW*m#$q2Sse87IP;aQHBVlg z(AG11sPW?M>g>)=y~Ayq&tf3g0+d$oU}1NPJ;c75<@oD|LNa$lqoP`yojqJy&ObT1 z_vE=xX7BE=2hE-L>h^SN*Zc@zU~q1e*u87ksn-|tx0e+^U%5KFVq=Kz{Ls6bx?)3B zSFW6RBBgijuHcngw{Dr}>PCG|$<kdLzK+Fdp~mD-QWx2mZd!7r{^6kqywV~C>!KPH zZtg0b{r^Yv*{50$N<dCJq-r7X>RUmVuoH)(t3{>J>U96m{QT%m&3ja(rE{gF-~Ru* zUY;Q(?bG8&T*=AY-`{%weY-uI;lZ06o%v#KA01kH@x=e_p}xLH4>Tku9LVrb?p(5O z*)l!j%|>d=6bv_Ns4m^JDJUjLDJLr{D5&YzFE+dQJ2Bg)c}Yi=zP~y7l3V4jtKp$n z<>r1UvJQ83bqu=HyJJU1(+X8<@AO0?Nk6~ZJ9phT-HiD;t*fhR#*7(Lrc7B^ygNi~ z_THS!YOQm#&mQaTvb>&cIMc`6+`PQJoa^by<$8H{yH1}z-P7C4{vz+QN1RL-$fHgx zq!s?#pX5+%v13v9OR22Bt);C!QFaOQja#p7+<J9p?rnaCOP94DKjM1)i0k_sPfnga zYz&9nXYbfCW7qEDyLZmq>%Q*2c;%&xRc&oO&ssNZ-t;4Uok+~iAOYdvfWVI)p`ka= zp8c}<yi81t&+o6s8CwHNSGPKD+VtaWfBc;2vk3vWB3E6z5)vG!xIb#{go3==+xDlQ zk@){|d7heDTgvg5F4x!HjoNae{>~2nWqxz3A0BGmTmAjq48!Dmdn!|&I|W2XSHHiv zw^LaC-@o7Q+1S|X{|GKv=O<~FbHLxe^!)q28jW4Mtm;3X<xfd><N)OoS?1{v99DQA zP_>u^N@$a6{`M|*U+y#O%f53BdHq|qaQ&2$4PR%o^7g6spPoNECTn!0<4sAvrsm3! zxSqal?KNwsUdqrqyE?(zdiIvP-!Cdheipi#TQhZgW=6%GRlD2Rw)XzkKD9q9)3)-? zV)x_Me`#wKiR(rQN$i+%GUs~Cr@Vxln|j~9Q=UA@sQ%YW^-Y@>TszhyX`FXQgRlMJ z)2EJQ)BMCGD`z@goN4pZcvG`Ni$D-dOcV3MJbvyA9HpEQ4S8*>FY;bqkAG~I*Ry`@ z-<8IzT4E>f$&(fiE_mwI=%JFl@ye5_8Rg~c7B7~&`SM;+Qc__|Okz%sV~mWy#*|Ah zSDjs*z%QHir;lBnD>Zk@^61>0oSeUxxx251&E0i1>Dt?#Ek#ckU0gg@Rwn1($EADY z+4$#GJUpbTHrcaG;7U|g)vs@F_qVtFaVisFEi9ZlYtkggGOiW@r>+LpjFw%tF-^>h zOE@aQ;BC&ChY$GW@1DK5Sn}Szy>@e688du&n|)#X`h%dt=fSJcc{M^G9~~8!v(Ga! zNijL!vu#Vxb!p?+BMThoI5u0@|1l6@$h)I4X}#^Hyt`LZPwTB*9XzZ1Vl(^xvnBa# z&4&^Ke0*+&eiz|bqQCCn#ZTFej2Hj>IQsq8?HQhTKV>H;A8rq;Wn&PZ&Y0rvpdTI_ z{P>w!#~YEZ$4{R+3b1q^RkG#)--S^X9?{^&QEF8U2AhHvF2(GdGk;dpzQV^Io0=!2 z{V16H@UU;#+M<bG(od(p&<^L~li9(}5Ed47)_C#l%JT>Gl1>OLR&?&E`*Tr};n8FH zQ{5LC88;>s?rmcWjq5BcGpqYP^P>LJg^pJ*EGXLfHp@pqH$7<okI+fe!|(1{ntJ@_ z=iR6Neiu1;=FE)ak1Z`MCdjgEJ@)vcjEv4nzl9dZj{Ra~W%cv(OJRp3;rCqJ7dRAK ztgheNtGR8P)nd2E39>CUA*(*E2o(F|9T*&ZJ*Ma1_xmag1x1(2%b)MsJ-f1^p!(aA z39{dKEv%)jt)=y&&3G8r#XUXQeKGr5j9~Zct5-tW_)N>n%*x8l3d_vG!qp#^Zj8v% znKo<Y&DYUprlwoh_|CW3xa{&_P#)q?YzZiDX9ZP~BH|#hf7{H33l~nj_`7Po*_R+w z)6(ki%htu;|C>Ma>oOD5t9$lVS5|*#YIv07=;Pz)<8$!j<jC3P>I@C5SFhZ?d**KI z>qn1Hd9x(n&F*gX(XNLK6D9<R$p1I6oA>?u{qnlMrhE)+d{0co7k~YF^(5czS(7GB znkMG!{raTRMRh+0hj-T!?GN^G?2lWb<_yl_91FjTi7gOx>Qb0|^2(JfC8edeGY&uh zoN6@lkdorj8@tVyu3Y)@^LcwEYme#29%h`G^U|VtnKGy}Pfq%joW#}CBy@ev&PD6| zCi-`ml|Q$#d^vgUm$N)_IVKewE>2Q)W>C;w>lD{xSNdw-o)h<WZ(mo_%a@)mti4)q zx7fDU`&&E8%=>1V^E)};wKn8)dcSr>rM5!J-R0}=%->xacW1?gn?K_CK?yJ5dow5u zn^vq?apC0`GpQA;R%z+*1kKo69lXqEqp?ZN{4jI1>1)^atzFx<{yhVOhlfU2r)Edz z$@pDg_P4biZ)@ZE$t3&kU5v4@@21K7B&(~p?X|6bcc+daAiyDJ|G$8^{%QL5NjYa^ ztgd7{a5&e%IH!@>GGvv}&C1zF&m^<nR{N30_syDz!Qh+1$Ix>I@2_SuFkI$a)@S{8 z$Gx)E{w?v(K85_B^Wbp%d*}PEncn8hZ|ZyPXj^LXh4Iu~t^dqMx!Q*Bl(P3eb)3IK za^}94`h&j?r(a4q;`m{9p#;MLy9Y=3eq<Ibd++!mI=}kStgGv;wx4&oQB<q+Cv5pm z78RE*U#FRZ!ol<6&sngw00LF(6F^rm1*CU&Yx{U<{e3DvN8s1AC&nGqb*01N|3`ou zc7K@JgBTB73v;*Ay><7lPxNfJvP<TNpKjU_bFD{`k0BsbwXeTkLjM1UW4((+we_xF zHDx%^z}R;7Xhw9jY|!CZH*THYe~abKhqE#@f(H(rl3S+hFI#@Au-0$g{<XXfol|X7 zn7(Y<)Rwt#;r$socXwO%Ub(<Av3>eXvu_DaPk&jmM*f@jjp13?wF#UTy0iI{r?>B# zoxgP>|BqbuKPDEFuV>FOO=;S>mY1Pn=hD4@7s=MWV=!C&@jNurn^-{?=*&%he@{eP zJ6B&{dsFkC?;)Yp6;)9cRZ$EMp;Lc+dfGH&#-G#EKQ}k$GagvrIOkc?mQ`8&n-1@j z%+39^qtNW}v70C6-`f{k^f~S0+1W=84O#2|mU1&}*_wIw=!-^X%U!#2YbPuc{$O<Z zowFSOrFVy0n@mn@JIkcquw~Aj!i2}hrxu0JE4{_@UXtP4ww(#A1vm2J?z?7YGJNam z?F<M{Ov<iLJC@Lp8D0IA>9@)LgT@SRbT>C}7o;8ABgnaJ!nBjj(KF1>$)4eU!~dI? zts&D!f_1{S%5!1s{EyT!NN<W~1;wktD-SPUU*D8;2ad+|>+=&56mDu-1=iK=b5VL& zV3E5;Q&)FsfX1_D&$zsoCfLZmzqHi*-@kt;?12+L6;0gtZ&~SUn`!#;er410wDs4! z+38xTsqNnqvSiVv!-t*YI-l`LeYto4{N`OzO8Rd1cZC*xPAhahs?4xq<3%}xhRgf+ zC(gI~<>&WHO6tlv?gy`}wG9ehcHdt7%yOOo=8f@kg1=rp&AA`1sQ9~`SNipX2M%Qd zS8g3_W|x&Ik(Igk{!z}gu=$pP40iitKX1<1{q$h-@-`mH$4{OtnUTPu*y1texVD*j z=Ii}k91Fk8o@;R9P`sk~@89pfO-21Xi+@j+U1Du)e%-|U`k!B~?HDG^i7ES8ROjP! z@YdGC)6-%vU0Y`A->p_H+P!_rQdeo)TSZ?oynkMP^Jdkvq%RYdUm8U!Gu*iG;)M3a z+FviMtzNx+y}G<^-Hglaif8{_mc6_2S5JWY>AeDl_PV)m4rZ@kX$QUyc;P!1Zg9Qe zn(<<8<>y~}%TEjM-#=&0m$`Gki0jKSF>Kt}`pI<h{=a5i3}?=mJiWZg*5=H;`_fKP z(b>__+2`lH)To~|Cr0gm>G!<IkdQtH1y+XI+EQ!lZF~2w`!lb-tSpDE`O-zlJI<X~ zF7(-HILWhd@6TRYm(uP4E_S)vz@=GgzT89Z?mbH8hfQAV?suzV6=$oSIG3|@hphD^ zFYi{1zcY2#ty{Kk-LmX!4IV1laf_3$uiMS=;K`Er&yJOrKi{>p(7N<**Eu!)9p?6D zPd!?`G<3<*&?U>m<91BgU7Ee9X7|L2ZF`DxbJymkE=|o{d-mxj4UyDILEs=zY`MVB z4hjU;&2c4#6W3=xS#&5tKf<K_jme71fBt@#&3_-q$CtCIx#q={tD4EjqxxmDc^Ony zoqkHmF88~8f0HUBLmQvzwD3iD@9fahdVljScl67v-pj-F=boHgeR}@2tENkqhNh&1 zq@{<arib6%@zFp>$5m<N^!KJFDKlmn`TERIQ}anqUe?DK8$NyAYVYe8U#?v3{eH%$ zl1u+4?3($xeP7P>5VfU2x7PjjUTUOeYOUg8RbRK??Do?*|0PztBy1xqT@Kt9p7Y?( zWs#q?_UrR+F?v7SW78B87C-B&!^-KCGuzJ#gey3DUC1xDi~K)Tl))j$!{hFs>G2=S zCM|QHzq8iZG(5}T*Y$F%fbg)gwE8)R&uHG6{$`R_YDm`Y$Bt@KgI1V|J3p#AJO9!% zt<Rz_r+0s``DGXTXSqq@)r-gX*QxJc;p%R-lqcrV*G(KoE2lU;xx4n_yUX1Fzk(zA zmD>h}UV)$uZ_X+!?d965<esx_*Nzjj-k7W~c5!`rXJ725vbF3t9WNB~@Jbq|Tb-J| zVMqP`SEr^n&6v?7Ydz`O+TE)bU0S?T$hKsK;Z0BLhFP<`{{L(H`&)Y3ors8t*>hu$ zKE7)9e^>49EjuCt!mnT0G;@-Wh9(Hqe&%Ipm?6M$rBgF!*AAy+37c0asA_3ROSoB` za><<PF?H!`r8PMT5-%C{d#qS=I_;$Q>9WVm%$Yh^SsGl{WG!%JF7yr5%~*L_?@#Hu zf_psbD<(V4^|-QP+0mw~N_WY?sH+D|5(LD}<gd;)-~Ro}%U*`F%NI9>IGC(5yK>E# z=SlJP)WU_=GwU{AVLbBZQj};e^EA%cWu9&!A2f4ht-k!O@=|8-U|l-3*GJjcYKzsr z;J*t$L|<Oc_hQlK2S-^L6$FEMUOWntJlx>QYPf%e)Rvx-7YeFg+R`)JtgbA}S~w&A z$a3kI7v3)O&u5t+<f6QE;kKR5YrEDRoSg4jtY6jbem4DLpxPoc*=cKk7q^OeNX^gI zefHVWz1{EC)ryHd3R0T9PLj>6SNk>CW_?LNykKIy%azsH#?q^@Lbvc{l=`zXFf{x- z{@7-!qZfyiX7AQb^VoE{rmR>oZH3{?qmGU@i^b{|DXng9vnrImu=R?{)lYpwKW{8c zdCTK9e_KJ@=Mw+aiZZKH#gAne7G!*1*nY3B>_f?kml7{t**xp~`N`hVEqULy05*m~ z-@vt-)-|$i{rXXN-CK**rs+HkHGjXpbZ+liyLPMR?la($VukXa`<LemIK5YV?JC~9 z_kgy<>hpK6-><(fX)(b#OXObis@Iz~UYuvW{r<zllTV%6=kN6^?Qol5R+iTOzh!4{ zR*H9jz1_muzCFj&!%t7yI*r}fG__AA^WWF&wM<NR%HGS>zr6I^)ARnHuh*9=yU#i; z{pH2Nl%zu?C0AbGzMgP^!I^;}Gws5i2R~-9J8FM_I_1ckdo#Eq+nv@MYh2&Hu4CO| zQP)4EE9XT`o2|U6pRZd_`P|RHMecPPg&_z0!&5XJyTfDGbj1A(mzna`uE2e@)z7Fp z*Q#X#4nj}2S3G~)zV+kn@VJE^`*V3ux3Bqo{Jl{&Uw-#m&6DRu7&?;w)OlqTS~Xf| zCA`|t`cko8PG{PD6~jl37a16os^TjwS6k)O7Kk<MFfiA*&v+((-BIZ2_J>?g+TMGM zEp5}g7k};74+iENKi!2z|JP=SXL?<@bKu9Uo&{46TB=T5ZGNw5)8vJLlWuL8pmE~X z{_lE|>nm<oGB&JOvgp&FOAQtR?mz#QupSAl3;uuBlRvU_!;B6->qs}5&%dAU`qOc~ zD)p~$)m+b=avPL(DXC^$Th+bvqW1Npj1INQ$_yTh{?zSaI{MpLUn5vA=f(sjwtHu1 z+Ze4s>fM?AXP?#4)qR{XV)3&!K7L-{*q!K5Ewf)+r+v|!zzNRPH*6Rf7#yYvZ86h{ z7kaw=!TmXJCWJ2Udid-fhttn@bE7xyIpf1n*mHl4^7hT0kCLMgS4fp#|5wP$a&fo5 z(3C6t%hON2vp>NyVd<MlnQt48zKrTCW?(qc>B*!m=5WoPeVwu9b>@E^Y7AOjMW5E` z%_v_KF-vmGj|jU$(>E!sg*p$Wzh2wVzaa6uhVCW_1_jNPSB|CqzPh?qB{mf@Y-R{5 z)SOl*FI_Tau3c^Yy**~vc^zUs=i9M$i}PF7R_$`w@aEOkoA>MOLsTZ|Mhe|se*S)2 z+w8P67T@0QFE1)ub)xU)$EGGBU!QHD#D2Vgwv*GIpy21`X8&R$Ud*3k^Zwe}|95wM zG-Y6z>U8;vvDxLzW~RSROw`p~r`54r`@+(V?q9E;TC;?2M#elbQQs9`ABLp~Nqzek z-?Fya=+ny(QwFZ7%hEG*El-3+v;2zV<A45t&Z1TR=@+id)KQzdEZut1{JWc@oy3l+ zcHQ`LkNZ!1#;VnqC3vQ(wX$9KR8q2P*37AEUnc}N2Hab^aGxB5!plFlR_$r#hdd^+ zJD6{MXPwcu+Kkaei<hAywcjFaz8?47n-_ll2w@Po)+JJP_IAJ5(o89-*@attcgkBz zd39?$UOvTC^l23X*CQd;oL!fh>dUnnb}iiac0)gptHbh33=MuuXGYdOvAPkYpmSO! z;@dawL)T7TudTSYT1U@ufp>a;(X~@+mR+)#c5Pd8&P}BSo33P<Ok?bJUCQX-zir8j zxTTxcu}<dOYxj4H_)77|sV_vNqSsG1y?x=zk!g#SwN~d?^4t)%NqMe!Z&Ak1fZ6N~ zH3v($rY_@hSbV8xt(}y~jUW{kb^g7{pAY}EGO_Aiws5iY!a^N4o~?O>>o0Bj>}itx zjpP4KF`ZIVDeuXyp^I(IUx8CpM$QU$28}LnfmfHdx?65GI?Zt7PCuL9tcNZfD@CMO z7rbFSxM^ejhRnMct{q>_%)s%qx#p~tIl~Oo*DXxzbs#O?3eZr3;+2Wp^7p6atTC)E zli$?5V7p<?jFYFP>WS;u=}la-qag9w^mwbM&xP;T6koelwR`8!Yx?_bc2<`c<>m3- zG`t_0nE3X=LF+$%&iT*Jiw}5E|MAiD&(FTr|D5zRXr_yj(8r^PK4r<p>rCv3%yZ82 zJDzrb-Qzw3HiJ)vRRY?ZlN$@?&tfj#{_eN>CI$wEl$I5KN~?stUbQTmwW?@e$BA9B zx6<dXuX@%z@7AiFoZCOSOtKPGWOi0wdgL@G|Eh|mS$ce#uj{RMy-t!dh*%X_o}aqi zZf-=By5Q9hT0fm8vM?}w*)gl1gW)-6+w}gl)aS3Pzp!upb?VNW>g}1+{PP*Imd+L2 zk@R|@v$<)Mto=@&CA?KJho|p(vCctjsz-~`K97jFlaISqgakh-d`nst5>RfwZ^?G& zOTX@ad$X$|UM)W)G)`}ohPbDS(jqsli5)-ooGM!AvESeK#htYW|GPY6U|_iZG*ds= zzkk-{=bQ7rcPLw&=X2oToao~8fzwH4Vh4v~XsP2r=2;sP7mK`mcei@_lhYrSHu@+D ze*XFB(<iBY9x8%ezqd)SImjCI)#<w5Uv`v1fPtaGMP-d}*Q%wHtOWNj*%YH9q`v&R zZ}e+Lucz4=-FdN|g5D}gPF%m-&aAm{<4V`6M@*kDZaI9qY>v&m0A3y6i&vvpuJu=+ zY$yHPh=HM&+4rO}gR(#W!Iz(ZZdY|vJ~Jir&!j7FW+-jjJkw_X%vj$SpVl61S1NuJ zEo;xdK=4b?7e<C-{o5~IejOR3qw-P<+?HL~xA4l9D=uYhEdoD&{bFNdn>2Tk@YCnd zy;X$x+Aq7!zH}*wt2HSvZ{3Cvu49is>c#GQ^8USl*#y5S)5DV!1;6}$ue|^NzTNi@ zzIJvIDBZZRwXm>t<3`r<cT<=eT3eTOcdzX3Ub%Yp%9%6OZZh6K^Y`~3PT@n+QgZKa znb!R%m~0mH>(@Cho|sh|67m-+{mR*NS>pWkuyac{dE5VAx$mL+^zd)%y7<l)%(B`O z`hLQMzlYm;OA88K+*t8mQt6k&oWJRhxBPtmc$0ho8>RZWvNjbL4mw^xc(Cn_!g^J2 z`?8&NXEK&g*U{IT>?Pm!Z;nZ2^Lg!hg$Zdg)~k)uCVkxq?rj;Dzk9o6$)#VvLgz|K zD7FZk{8VxDnOg4Oa6!c{`wq_*P-+o)W#H)885Omqm79H{EK8}1n0M}<irF6@=Q1o< z<s~GpuJ0!P?%rG;hH2BH)~#Fismf&fX(j77uYG5i`M54Uesi<2j?TT!mwtBNm^aUl zHI?bY^^Cpl6Qm0FC4T!K7hB8bxbaA))9Y8pRZXTj46h$tTWfW=*6yX!)#u;2j^<6u zc63xND2=}nTB-TwoWgz1+$$2NyiDz8rd)~H{p@2_;Wi#nnQ-AZAGk;I@bk~DTes$# ztXRL^+{h>>Lhj1LQ>R=U9XqqH?FiI3m6Gl_*EM?fv$uCo-`*|G5E9n)^yrHnI}XjY ze$Ujfb!%C%;jJSro@F<tN9_IORaA8I?d|&|&996Z7y@p@{GFbAUBaN)>$a__g`57A zwYxc+6oP_+?)@|f^Yc?U<JoccWrK(Qr7KrTN=n{LaW3aH(VPBl)7v@z`zz0$xbocY zx95XTPycK(nmF@j^@np}AXf`yF@uND5>ir@EMNZpR@$mntGGCttvmw)l%}rwbhq5% z?@#B2tG(x&oGiPf63w8YUw;KU>bPO!MaU>(S((|kjTaTIbr>9ceede;Kl1O-=Is4- zY#^_CXox&}@`Ojipy7?e`jFt@$uno(T+4ky_VIzn>Zm9a_v6?9|7if<Fuco1$3eM8 z#4$8fwEOhk*$xW4TwXCd3MMRDCUrAXfb+|js$W08eEay4mmxKE(Ty92epJNO{5c%E z`yErmLdC^9CGPIG&)mM(y2gT+Vc*YX_pRlYe>pQN*7o|E4;kg`jQRcbJ5H{XpZ8wT zi~py3;gLt{*W6R=0(H^m>4Yhq-8;{tw8StdKR<nDh?nB0ch@q$zr6Z3>`{WzOg+6^ z9S5gPfByXW|L=GI8<Bk9DZ8IfpQ|Q)eY?bkpp`vdOSk0xIG1dsxiTd5>V=y-*KWNf z2nyMN>!6X-faThHdU@3!d&7EqdQ41qy>>smd+mY+N8I~g6@E=;VfgjyRq*m#zH_tK z8CU|v<^Ko7^~7y@;*^{`xsC1W&6_)R%B@|sY6oj{pNyxx@v&Kl6ZdRO&B-}<Zf^P2 ztBedwTwIsB_+EEt<`Sx#7~ncRcR|em4SsG@!aOr>u}!gJa!?90y|Az`Bp~YM36o1K zb(yALLe|%-1f^y&DlVJ7LDNN+!N!)Un=5HwfOoX>jURX11g?u*)p{+J!JwG2#N^tk zsw_suB^yd#T&OA774hLo56{8Qv(I^+pOrYWh~dN|r}dZrq^)f3(O8?6Aa&vB(yL!> zOK0{@-Fj*ln^Z5P^Ax7+$l&oxgKgG?O~x9vw+=~)T`!w+b(ZlmW3LOT=}wPip7}qt z+is|-vLx@{pM?wx9{fL*3y<jQuRq|uG)Qafvy+TkkNo0&I!`O<yh-0`CzG|ZGUvi; zuT)#!h$+u5x=s!W=?d9eGBsOUdZyc~Q!cKl%!fUmztocSXP5hWGh>RNi}F%OjpPjr zehD6Rn9L{Cv?6~3!(oTRO>3iK**}zQFzn!--T&(B?AJ%Ka_so_{GP$WU~GK$&!6L< z!S*swNJP57a4chJ3HTl!9DMo0g$38_m>L(XTi5sI#EY{gCN_LrUNIXI5~{tbUo;;| zT3J~cxi<cPVa}WBrKQ^IV}5=*E<bnblqq%p|L)pdJ!94_EAi=fPfv@rDpuRQE9%nC zL?a_DcAkpAf3m}`+vepZ{{FU<iNWDk{BF4y_pF3wsdn6}ow#7hzrDX185+JkJX`Ig z#vRlowtiQH;NDN`El&JZ|H3!9NIl_b=uC}o>pP^P!j7z~KDBAhp+D-TWsW5gC6a~b z-cPr_w4=8AQ)K_DQw$HPK0IWPI=b-n;-62$5Br4)9A~QAsn_`_x~jq5g)MJS$gc<I z=bsmvAiYmNa*EWhivNex({t8%oENe4oh$M2Kn8<D*pE(^z-z~js%OdFzbO>v5PI(9 z$-v1j^45`R7SF^*W^YQrw(7^F7xveVo=o{JpTfkDal_WDTc_@MxArq}(T_*{>(o0g z1vzp3lK1~^!Z1N->C&YwKRlgxzq~y6i7ZRhEuX~2d-63EStkg!M4ZuAU83N3bI(tS zcpdu&i`47$Lf(CeuZuLgd-=i7XDkQRm-zSVtNv)&lDh1RX_;5Bl0s6~r70XggLj+0 zJnKJyTR>1y)wYLw)x0^Q<Rs!}3vSW0SZ-5P`a)O0g?+y6b)`f5?oapEzWq0RPfyg$ zsh>OMm6pXXvM7Cg>+h%c)`g|tGZ~*=J9u~I`CI82eV;~?)bndtryDN{KYu%3%|8Bf zLUqKXxta_Lv)DJ()U)?^vNb0qF6{I!PyqEk_Pz&oJ%U)+nit-+3(=bTX2XkKR#w%p zu&%;i##ytwy!gYzFF!rq?(TL@p+i3Z{=c-(&jQ)ldTM_M9q+YXvUcyr^7jw)_uELy z)V%)ob`qa`b>z$yiyj5Ozqc#byu0H>N4NHtEmx{OJg{b9FnEz4P_}xBoWk20p|dk= z57lquWVmy`@CjqPH#?$#5mI36xWG4kw?($C#^btM`&E9mtjc<Ob%lxOVn+XeVXM!m zn7nzrpCkJE`*W>H%I>q4YO*tIaj4k;V&blac8j0En#ciCQ<t56nVOby!f^Z5%fg}4 z7}viMJpSr(>O$k*`Ew`wf%`5$cd_$+{mQ^lnVJ-={k?bLJ(+FGr@uM%GJ4f6y(yb~ z7*F3zbG-3=U5IJl(wT1+ytj263JPDm(c~oqgHz*&quL+S!oR0vOj%;4qr&x~f3n$s zxtSB<To!r-H;J`Bb-r`2BkSqz>yw}A9u2Isk7dk^`7p0$t$U~{gG<SclSYqb+}FQ; z6y6gyh%d7@7IsjxXSiZ+a_DmUdDHn@KbMt#T)O=D^d<LvYTw23>^6Owx%aw;>kkvz zj}z@<CmSBs`+M^8a^0}sYy7hBeTZ8ekm=)`oZM&D{yR|LIkQrA$=v<Ek1wosFIZX` zay;_cO~H#yQS!<sR@bDQ`djjN*Gw4(29GY^MbaCN*P7nm<63RidhFWk)U#$LrW>EW z=s2adGQ{*81N(ISV;kRpeDXY7E@#@SS0-%DUvn5ve=k2Uqvpecs#hV^t?{0ql%#m& zASfw0y@<`dH|N9G>$PjvY&pT#bWi>7FG-yk3k{o^qQHxbet#ElY4!c^;XztTNZs$; zD-DeQPpP}t|E~oNJF~JL**)J+V+v!#I=#Jb)0X?CGCHI@;o;`~S#fTMfaZjbPkDE* z6)cpE+xGa$$Ce_ekn~SSO-?Oq5Z)8Da*3bDs+C&LyCa%yv-IYj_nTTU_pHO?<mI2L z`}faVdT{l-R2GGaUawqQ;^3W=1>3U^H}-Div^=^eXrDvWvE90c&sJTVb@OVA-hHVW z4I_7@saHCGm@X=+6OGrI(&3V%{kG?TXf(g<uE?)%dRSbeP0bZ|3PHOg4fk$YdWXOH z_dI}$QRI8!mj6X1ZyC@0y3%&;uI!)lPfIfAx@bHL|9IM!Nz*&H<ZBq8gYpZ>m-`=I zy}D&n!<;=@3=H2i<PRqsCIwpstTf?b;Q4fcd$xSsxhejB%Yri*3Z6SHoTz;F(iN5k zI+GJ_-qz=cHlKp%<)*H@oS`E-?GHmqDO>NtuTO3kpS9ek+;*$>&zB!M)BR&3);6U! z%;jIQ+`jhJ=3B>)uS?x%S?kNNCNBAVpZ@;t2`7)Yd7N1P<Z6dXsnVgsrjuV6ul%{w z&FnAZ4!ga^$*+HJV5r(`H0|HUuk$aPKds;JYuBZ+oI8aNYMA!_-~26Uri;?E&qtp= zHLaQGp(N7Hn05Me_oHr|J#&s+vg-6mxM_1kLg(t5-6y|1W7Ii+nK3y?XWe{L?)<AA zp!U_5d%;;*SxVN-P8>D0wam=SC;cu)Ub=Lt>f4)@ORuhbl@b>x*M2y0^X|L48yPBW z?k)A6{^#%ClYEyB{`>R!*d*19l9Kmt-Fh`)E^8^fQRL&Zvyb}MPkr+IIs-%dVF`-~ zm;ZRj{%yTIcduXI!~-`fKJP4^-z%4U({1zrzwgiV$$DB^-j9sR`U&o8{Q9<jNo>(! zeh#&oYs){D<t%DkZT<W$e~4hM+0D$J=d=Ia)jVra7M6NO<@K}k^IBTo$eZP?X>L9| zTSis=$L{^SZ1#5341ZqNbegx!`QWU0lWS{C@9lo_=Y_!ZNt=I#O)5UA{AXFQgO|+D zWBl9lQvPl-xL7>Vt)%7gqK_Nz%UzJUd%oz2&&^vuzs|0k`e*0$yrsuG^Uu|6D!DY( z_qlt!PMiJn`SLqU8$Xrp|GaqnjyZoHH9UJ!H*H<8T<(|Vwf}uQ_ZGO+{W%#m{n8tI z`J;{P{PJolDraUIr}V})#QvIiFZ&IX(VGL$PYB9;#BWwhJ}V{9&@sb^HSBv_vit-_ zhP~m-muhd~(cRDa@XE^I`zx-)=Av?}G_Pi-yq#BmQ1!}t-f78o#|<mrJXrbn_tZy^ z!}lcCw+J}BpATBScGCKfM2o<yPao7;I22p%#RUgnUgm55@B99J5w&iztxkb*W@l1v z7zqEoJV_|A*wD)0!z|DgPjz(}WTLG0m&BKsi_a&m-1}{V$t*4g4;9{A^VfHy*%|oc z{i1hXdKw$=xm$vN`(B}4rhCq-Kfbs07Y{>@zyI<kBgPl|FY3me26ukGoYR(%{F(Qg znPCqj!vUTHrQsS32TpDH$G{NGaNw301H+0nnu&=F4E1f*Ob1>ZWOz{b>*dmE@1yn$ zG5mTj&&6=~346rNPuu^kowd6s+wR}<^YKo*O<%e*FkD;mdrjo!+wS{bdd{^}+WY;L zX<3<_Z}z>fTebNnpPX_sC1vj3Ej$(_j+zaQyLaz-JY&sTQNOvrK1#E@f=8WW`9VDz zj=g(*XXj0s!ZBS((yL71O0J}ok($p7(?lozpO>#(`83<Sd-5c&$&*hjDH*+bCB<;y zQqXFD`C4~(Tk!Py?Mt6j=WkzdF@(`UX=VQJ66ZDv<^${ZA3Hnq^7iKVlcxiDepme} zJ+o3H=bg0v(uL<uUri`3FSN_Pwx`Vdx_Qox4Y{|Oet)fAeDbC2u>-l^w6>eS{o<Ew zWV-dk1IP2`Z~H)5vSpV7sLSIava@pY)kUt?QjR<1uiW_Y<1%0KXXoCgColFb6Z^8T zpyWz%$(8K7s`qiOMMXF7?p|8{ep>F$Ndcj%j1BW_L*Kr=Syq-)UA=AVRuGyxb=s_` z-DwW|Qbz&<UtV17-v9Kp{>r^|ai*^pty;ZWKW2wRSy%X~wQFm;<9yVNt$w{aHFclt zyye`FK6+)C_-+aYw^tVSHG(Gjlv4A*^?u>{*7c?L3)itjpR4mPFOyD9Rhsj!$K%O^ z17!sX=J%JaS>Z8ZTG+&CVH4-Y&72ig_u_(W<<ZE<o$Xt<hV{#N{r<lE+EvpT;7PM( z%Y4)}m-a?_dioU1wTG<*IC=WCmh$4F@9&=c{4DynC~A^dYRD^Y?^y1N>OY5l%l<z2 zxFqo1SC>_bORw$Q5%+odmN}<&CVOdKDO<bd;CY`FSLJdp&b@Xwee+E@Ik}YO8Qt5q zna%w->v!V5DT|ZmZ%qDQ{_M<tS-F+oJImky`}Q{7*~x68EDLyjODPX10z^($O}s7^ ze_!{3XpZd5>{rs94ADhR+|7GW@U`8GsI7erijec~^HZ;`yX~#Cgu%^C%FRtmH{UoS zz~RZ0kks_>^z`tlQ#<qS>+LM-y?)_C#J=$0;Ik(@oWr*-hs+QzcD{ab;p>+x=UbK5 zKXBkXz|1f~Nc5_Z>9R()*qGpu)oZdBII?o?_uzQNqs5UeEfM8#WmSgs292b;%(Y$H z7`ZtXO}wNq#qfrXmPcpTDYmwWe7y5Y*%=sCF4(eZV&)Q0cF4rmg@w&i1WbaYvQuq& zHFnN!-t=7OkBe&<JFmm#z{w|WXUy23>2i0nxOzADUcb+?m-5}ZY&+FaOF=4BI_tG0 zTUMxgnVjjLoOcVB?|q@0WMe(IMd6jSRMo9-yY?#2F-_0<{!@l|s@K*{o0P0wmnRrV zEcc)P|K0ANzP?|1*m~bs%ynG3G4SQP*opn;YkbeXGgbq4pX>@iL#3M2ri<sC`^L}K z@ZgYBOw(iAZJC#QySm&h{z{e>#^`mQPVJS+WMuI5_5J^M`t+GUa|0(X*sx*R@zqa1 zW_5S7PMw-$7hm(=ZvUpBm{8SeUeb&Yo}GPE_m|<pvwIxZD*OtKd{x!E?ymnef5N`i zv6J-+_Q@61{(Sgw_KxUhjw|X9KH}Efe^bp}@>cl&x&`?ihwle_i|MbwIng}%_5|r_ zZ+CtVesAgg@Vd}@wU>7-WSFqKKL6+u#+$b<sr5d0eR5Xjy1<9_TbuIbf9gKa{kJWP zJ^$PKFOa#6H|?9J?KJ2=9&VTUxwcz;I;fK*-C&Y>{*m^)+rCZ9KRwe~&vkzG@5Ro) zm>U)E@Y@I8nqI4^a4=s~X74kjy^1BxfA@ThT+aP_lRm4;nfdYGF2^;mU&bS0dg4{! zrKgWp+Eu*&`JJiz=&jw~C;TyV6nN5BS+1%1^zm_dIfDZRN{8I{r5<cL9UAIt|Hq)| z4rtASfYS<Q@cQ70n>Qak{krAJo2?mwD-$o=p5!HMmb>fY+wIIcI(8kVR*&<J%Gy`% z*{~pB?#gvPHgjjUrlqCX|NpaD?P>FlTXUDk+aJ!oohRfnw`S3n&6_`Z&o(tR{rlze z(zVgT3=9WOI_F>hQ*b)I$Au+($KM{`*AIR@T5MGx)XU{N?{(-j&4kKZXE-)9cHGQ9 z_V>ip?3sU7DCoI9c=Ptjzo{l)9bQa+$G{L!U>tZMf7xa6f0zDj_<6|geulNxW~b8` zVJ69|``IER(>x-rOr&1CVCYRYOw#x}U-oS7f}>~dwf(AMV9*NfWpY@)YG&lkT~RaD zxHDhzn6d>gUg49I_jI43NW%^-&0X;)FK$Y>^l6rP+S_X;g%YM6%oDh`DkZAN6kNF( zp(A!v@SbO#oniI2pK*IF)cx!3ZB}OmEkm>_cyRB2eZQi$6lfSn;FSj?{eE4PFz4f+ zf4~2Je_gZh2lLE-dwzYtI`!&Q<LBp73?x%hchtZC_vYs2<>zKu)qW}2WK_aj`&){^ zAt-2NdwZnx*(p<|Ow*CvlzEw#fx*LX{p@Ym9(x%bUZ+;_^BNQT>4|ZR6Mt?}UUf?} zfv+lNDfdLqt)hFn<~`1Ke*RAHMY>f{+FqAS2cBP@%3XS6an7VV-kYB{`o_!eo;CH; zyUTmmFzjHKowV)mw)7Rw_c`auHO+ngIaO$}VA`Y{&sf|2E<t)p-KJYyr>|Rb!&Ak< zqc>{1V#<L<3@-{zKXWj2fd<NdUb6D6<@G-#zDboQ_v)IKo`v9Mwp{Z4@~&#%(#9u^ zOBW_CJ`-S_{;=zA@|)j%8-+Yuk_;JSr5ckLte=q2=ydi+&BrGv-9tjB_RGyxT5rdE z;8^d+zP_saHJAJE<bW&Y70H^Wrlu3;GAgp{+qbW=u`y-&3!Ti&Oxx;jS1x5;_c~Y! z**Eac&-_SL)A7f#yGl;pzd!$t!uwUrmYus&@_CMB?f*Z;A~z$g?oN#kKNo9dUi{Bz zQ!@j@noqG?Q$LI8&Gs&v@O{RvU%#%dzFYU>;n(+bbs~jyC%)n4iTSmPEik%#_V2Ur zt}gs|FU0lB&6MSa^Va|VJ*mS^GTlCLPTAR?JN8^uj-LK)$;s#ES5^6Jst#i0;k;>| zb0dPCz5N_V&%KMAQcpKEH=p#o$S7w!saI;Nz5e=Vhgu`~`25{I+}wOK`MBJz{q>L1 z=Rf@5%(0N)TW<Z0J1pYN&MT~6gGP`9oZipum45vCmDDu7QZ?%ir9YxyuK$pHeA4gZ zkxK`bT7P?^V14xW+Wh##(c8OjUoLuh$T8^U<M4N4Dc3j_tl4t7X|L?I<;y4U@cFPS zZB3&5#zkfMw&8DHe0p@`(y5?n*~MQa6<ITKa%LGQ+Su;>^yFmb*{kUc92_08mX~B! zp9e?5U4FfTjRHX}r%s)^b?er*Ej3?W1g5t;zF)K>Vnbo_pHEK@fBoti!5jIpD(j0% z;nUtQ2_Lrg4en)K-*2x7e766u*!_9amMuHe)HEsl-L(yWbEf9DAFZkuG21TNoqpkL z%(EFg_tebSoBsRG=h^1LX=i?XyE|F&i<YpO%)YYT@_&EMG&0ZkExWz%@3XhJRm0bx zQ!|u+<S`Xc9xJs{R#xtGxpeMWRaKRgl+@f=?0dU;r5~A^tdKwPC7mH7CricpQ1L7V z@pDz`i`}Ew#YhUv&VBtd^W&{!&h32r%HQv6Zti7jDiz$i_0X?h$9>c$zfo9mdzQ(| z6E`>Ce15+E*{iHudjd74u(2FDH}i7&4TH&Mzd*Y}I2L{v0ks+D_8m>y7@@N%cmdyp zxv^VwZ=XGIpkI>b&jGtC{jaanGqO%u)&Fy>=DM)|pOi(>lH=#*X3vaG6RTOiYOUzM zZ@2gBgqg=Q$(IV+*$E!+PoHOJn|np$^t9W|Oi9_<uj~HZoVo^DJ_m!!=azu#+#3St z9~#)rd3k<C^sgtvr$0ZJ-||^(mZ0GA<GsHxT?$ISwB()58&;-^hufcKX72p|`~Dy2 zcD~87?4|y}%jImVOddZunVEdt?)%E7=<QwRxw|&z&28UkSoe<;)Vx_yeTd1#$wP1! z2*m9#X_y2COrI8PFZiDKa$RhBbCcc6i_H7obA?me|4g<?`Y58ksd>S4N!wdSCSS_j z+*04)+qFLTOwz_{Yq^UGIWx0X6_j3`oNrTS^ZCrooc#RTg^$-*Tdrx^5OHkYyu<r{ zwsA8=G`P)8{PiW-y>E%Uy<O>_AJ?*Pt%)eSdD64~=ck8DSRhMxxj?JPCn$-Ch&*}z zeE&Ad>8DN2&BGn!zKEISbZp;t?cclIjVbJkvv(}p5*B&ep_xhH;dHLhEjM*eeU@(3 z$?bLTWl#{F5@u?|3mPR-5amz_xW3@jwS|p4mTi%WaGPba(m|ooE#NgLi(+81M8<`A za$FpavL;Nv!OdRpxZmZu^=}IZ3xmccgF(%X&iV7R3qHKPx>~(prw+r9Pu@SiUf(gl zzVGGT+bM6O`u)zW4q$PdAp4ND>5lC`Yu~c9?{{$PPW4(Dvg*(FFB2y0`uVxN?8e56 zr+sFZnb_F;eQ{Cq-o3q1Z-0HizvTbF)7I5xY?=qbZT<;KUlgnvoL)FDT)+PQdf&FT zwv=?2^(Akm^lfbZ9+%(!S&QXuar*uJtZNQ2*Uw$^(A_;oMPp^XyN$xSciih!Lgl07 z=V*7|E;pI4x>Ad|;m!x)lZ)0|II4b%fx$sY)S&$K-ZKka>tojU@byl-CTA_cI%!42 zQS0|lMUTt(D@=KR@1(*yIqOJ83o(I`SfR(;f1G%`XVbTP`-QiPPhDk{*7J2`@b}yI zQ~&<z|N5m$FS=}H<>^(SdeUY+5!>IrTI4EjrKrrL=_uf$8PBsI@!+zM>x>?qmlg#% zaWNz{37r1EwT2^T(Uuo4-J108vni;0d3$qy-2C^^l(Vz@KXy(Mp8elXZAsbX<<^WI zoK8B=PWSUA)dhCD*K8D7!V<raac}F%$;yWgU+$NkZIn4FcXjO6t(T^1>(_rg>K+&O zqfrnv{<ZKO4``aLB`*K(uhq4`rE0#0%5Q3((8t=e$4D`@|FZG#8mqGr)h+w`J%irZ z?y@_3?xx3~-Q^2!9GIAvb&8Q8Zsv^Sr~7oSM9VWUWQ3T0t~<BRn9cOg`o~cYb#c8l zi|4H^wzq!1u<CeN%V)_w>`c>o&o=qq=U*C_Q6;AQEAsJQYwLqYI=2-Tw*LHS`ZmXZ z`RaA?|35xFoca6PQj`3cT~{i9fAim-<N4#&>fpJ;pPkkEK7GDdX04j>tn0P^HkH3y zwS&K3J9j}R)9b>TP;u|Y;p@7yKMHI*^j)<p$XxH<{P{vA->;vr-Z_<lL14T2qNtzm zzCL;Ox0>sHdK#0-lqKn03`fAjoP|^FU#Ty?<Qyie)Ast{f4d7>JhAnY=I{S~pmgo4 z+1D!+JonD*%4gj>l~edozwBv?(yUuYI@hi~&#<BBY3jm&YiI4;AoFf<E#P&^>kB`n zT-#a9KTTKKt!%<N2Ni8CKT&C^z?N@|SGG@Yoo`dO{npLPA3p6|lQVB$^Wv%5hfnry zEHCcr_Wl`m%d%0sOx|jWQpK&Et5odmU6*dJPJVRMXQsm}x%o5HSFIN2Oqnnz*8FWX zf1udmb!H_$-#u`iewj7NbMA}@6MshS*00ok^W)>1Z{;&hPk-EeUS^t3=eiXYSN43o zozMQ}_Vc~f<)4;#y5HJ($~Md1YHHf${39<U*YSSuej45LOIqZv)=KsTL76h%*|#0H z<pg%OPYC~Z;>xSby$g-ct}yYPT(_8QCKJN}1^&Goem;Ea^YZfF_*<($19`HgY`q6l zGJ`TdZHBF5VbK-1qc5~dx=11|j_>E^`h6=;u}nL?T<=HN1?jA;EGgq>7iJoNS5{8% zk-lDaH=SWeg<<~hZ?j)ttCWy@xR)K=<Jn~y!z`uPav^(7eEr$Wmy<p{xtGHJl4+A% z*7<qnbp?<2em?o=;_0#qyPI$Re|KPbk;==Uy}g>LAzPlI;j8t$_iJ-A(!Q;nDanu% z&B(Brfq^ZTi9y05iHl)IB-4SH%U9>L=e~L({`p~0_;Q~)8P$(mo=sA9zI8wQvYNm3 z?g^^ii@v}8oOchj*I}~fTocWtCnxs0_x;GoylAEPzJ28;73=5~ub!L}yg$|BRcG|a zi7m4)|Bc>$ncYLhNpSzFJuxAQIdvX2i{^g(+qE|NO?%HqA+HuCLk3v}1;f30=c4+H zPu7&b?P=BC*0)jK=x9iE$+M_)?zdJ&a&F)BQixN)bd`{&?R<4j@l8jWG6mmnyD{<f zy0g1ttt#fe-+Gz<z^`}rOn#qtFFdhN<vst#9rtcq|2Z|asrb3w=Pz3-GH1)z?|Jd; zSnQUJ4NaRtbr^@@(Zft8P8<ujy}2{9<aJn~&l&L)_Lov;*dpdxZ>Vmcd%H*RSN^r& zDY{pT7k_j~Sai?w;sxoM78lE&oq5bJ7ZM$nwRLm%ym`Oo*H_hjJbE&4u}<2#lAL>X zWoynJ?cQ8dqhw=q=+NQXoSZGz>Yv)(u3xzID>yrw;Xzv~<AEuE85ooq84k5EIsE_1 zz>vs1Oa5Q&FVFLhiGOGJKQhYWVu-kHx4r&<0E5IfT^0rfoi{hHf7Mph{`2q6Qe!sr zdv^0r{J64P{D49{L&N!vKkn4k?7MN>+QxM2pF2Cx+t{3myQQX}V5Yg!#IUdr=G~wN zLNXkREw?u1-QD`~vh1BZJ5tyc+l4f2zt35fZlCz=jV1Hh7x`5xrLR|VKkqsGsyO`N z+q>S8JCA>SJTw2w>(A%yXW8AYJ2~maCZoX9Z}s$+P1mo#c;Um1!^%2#^R6%SwD)K# zQ9Qm%G5o`?X|iW?cH~CBxF);ZH0I96XMfBp_S_0w{O$R(Fn9O!HKAXBzPr20G<)5e z2*a8O4tq|3TafZBa~L5jgZE90I~X@{-$b4ppR$*P7bI>Fzd7^5>YN(_^XJDG|N3IG zsd<9iQuph>+Jl0FC%@si%QAPJRbkS4Vf9VZ^h)a%_eF2(`S)V+h4=fc#RVT;F4{eJ z?z^X_<9+5<UAbHPexmYZb)Oek7gpLENR<VL-z>efvDGQDva(Y8`L^$$m>MRr^IK^; zR2xX}*xK3(G4Gjs#%JI5@(O3?$F1C(Wn^xw&-(VbUtCt^M#XzaaJ9kje*IUysnZMQ zguN%SyVt)L`@qHbEviL+-`i7JS+B0G-~a1wIrH1M@saK?zJ1yHrFE+l+hoTw0fvU# z*Yj3?4N$gr{cc#e=<S!6$KTywU$xlP_{N)gj*jzvW(sYr{e6~|n{C^z(x0EigO|Hi zRJXUc_06>29`Ek%CfjiQaqRB0vllK*04;!sj$XZT<;$mE=k2wue(tw&`}ah#ZZS#A z!-pPC&7aE3s`~GHd|t?v^sX~);Kss<R?sNip~}jG&vO1JY)W2mJ#zoQRUx-_)ch>i z)I1^c<)fv=`(|&h`kl3@xnV<C#oIeud-vz5SbKbb_%_#jp~ifRi9av<AHKI@alik2 zR&KVs?{_W5#e?0CKVP;|OY`7FWjk&$m$S3Ww=Hpz5O{EHVrL+`p}F~dn@XdbnsJ(z zmX^xO&2L2VpS`;3l>fd!Tl=lB`m$HA_ZO{P_~y+jRqsXn|CT*apC6%RBnNKBD~W?z z(OlE#^2WtoOIhxad-~+ce~<fLGcxAoP7$(W(GkmjI%%qX-M_~_Bp>hGyYth^3#VKT zw{{dKHU3B}EKHv><z&Ja=}YAu&kYu}voM^Jn>N*6r@y-^T6}|Fv~YgG^~4n+PdkNk z`{nB&Gnp{3u+|DmNAD<jxKlfPUrpirZ*S*INg0K$*%1?^_2>Egjj|KI?o~W-_woMA zDc65(6APc<wKOE_?92%k?LUKe<d@Idq`r4)kmgjc+HHG(JUjcVk$LC(iY}{@KR@&D z*?YL1&(y9kX;mBB*4}B}(_CiH+GLjdDI~%Sl$aE+h=MjREh)Ix-L&z~ou_N#>!%*R z_~XEG`_q<|macQVtSUdH9Qw$@V31<8K4!Ps|I_-u7Bb7)+|=iqeA@qiTHWWzr{3@1 zU+|c1^2w6o;@NgpR^3NmExBB~Vb9)b-?>#L%8NIZ=ifDdwPFd&?QOkf#oW<5KYj9^ zzA1KJ&5nhN$=}`ttEwJqW>?=DJGI)r<EQJ@1*uD%*#$m#XN8vVMqEknU*eLP%6!@5 zc$4qSb=8;lgt=aCxauLWsg13RFIMM0pXTi5OV4%YeEeAApUO~itDi5aiD5#ACY#my zypNjqSF>K-s<n&Fg!7_D=8CC?JQ1L&`jBbU=G>^cQgAOueZ{(I7iO^OR2AmUZR?(* zQF}9ZR*(L|mm8vL<S$*nag#m8;r-RwZ<waJFno!dJ8hp@a@VCP%loafMPI#p`s3pn z&&ho~lF7A?j)aI#-IkaC?|S_9bMwyHRTfE2UA1OI1-O)1p`G#ixC>~*{xWIvu5WKV z<M!1=+`ihvf2xI3IBb2KZSA8YyEQcrN}E~SxK$SSRgz(kTOZH84T-ny|La8WxpDvg z{gWp-SD&Ao_{b$%%J=J$&NbU#ynb~mcK5a9ySrAWpG(=l<>2&qtJoa|pO5t_nQyn1 zl$`p0+LV%1b?3z@TN4!n9bDeq`3B_u-D~~%=HfLUYC9KQ>Fxe*|I>#-P_}GSkHxd^ z-Z@?u?!+s<f0AbRR&VOv^JiElEM?K<JKesf-f2B(sdAW0_!5@0QKcJAs-EuJA(p;$ z)4O%Cm96LO#RR75_kEiEE8nl`#H!|_m!>Q@n)tI<_2o>ahU{wPRa4)``Lk)9V=Y_1 zBiv@{l6yW=_dIF+`t76PyS-LxS8ASRH)2@uH2I6w?{7=}W|gG83fXO(zHIy7_pW() zXTRTfKR^3={htcy)}xTFRxC@Hn1B<<)@^lvulCzr`utVap=^R)`ulr(Kc}A$JF|0! zl+<B1UaPt%9Z7!Q6N3U@8Wtw4e|+5d{<_~?qKA+7ZT<GOcg>obFPGTn%@f<WG2YC~ zj8}f2wU*X%*-4Z9peuwGUe*ZRond>fe%sH@?v<(iK5OmnN?1)+&X1kux#7)Q@s_p4 zOD~!D{_2%V`M<?_>QcYO8%rWWq*xayU|A@<C|qShaAsPV{7$}YA{;A2q*xo)om*fy zV@;x5RpRHvr)OSz6qE41$#H$fsiL1(p8hm1d~<DyxvA;elN>u385ne@$JV`{mZ0Y9 zapLWHdwav`ZI>S&ULPM&eR5JpZEa~x4Kt`=@!~M3-8<ot$zHyjjDidYW*Xm2KcDva zk+lBT9SaY(91gtka*tb&$KG=P#O1#YDywg+sZLEx{dj*}b-{+|KG!Vj>z=HZx^a8+ z`nb8aIWsz^UqATZL3F<K<dQu%x>p7{-o5+dwcFxM>uGN-3TzthZ~qyX|F&nT_O^e; zFVqyLd8sHhU0$wM^6uJ$dZl1jr_KPCyo-B#mg?@R^4&N0?aRR8Up3!yIm=nxwI*`7 z{#o^@NH9=tdu_FhqWyZsa7{y_hmNf4w>ZF-&35S9YdJ@oYAgPXsk%F7t6bBSC+#AW z;}|;i>rd(L+wlF+=j?6nK7m0&L9>|b;+<RePP!!W;UnXVyN?XB4*&WZUR$fY|99Sn zb+M1*Z(CUWxVADla<*CJrI)L?PC)9RT~exRekfcKMJ!MiMe4a58wWec1tA^u@x-)^ z=jP4L%U>Pso<CW3iT1CYPftKcFjTtTm#?=e__9Lj{Evm8-N;w3|Nr@1qyGQF{PLFM z<3{TKcAE+xpOCMUxaGFFmHT||?Xu#RLC<-m-S*t=6lqZCczSyJ<bUrcnrOe{JDi&F ze9!gC^XA0`1sPR-daeF;k}9~uI(+){>!Y!!r|EL@@rBha39I|@aKHV(9sfR`U&qLp zw?4P#zuo<ViY4df*d08mUkRQvWO(wi>#VPc`AKHQB^4FIPAwCZ3U<cmP4_P2`ck#K zTwPs7Bz9NJ)#v76Rh3`kybknB?RH+W`8odt&r}hurIqPFe_nOhV7za;H+-(a_YbG$ zx<y~-uf7(mH91gI#DU9w`RYEo+{%A{nz!pY_|HoDeVE^Qy58UX4+-Z!JY2RuOHAYo z=k(K2n^bl!Xt=Tc{A{O#zc=jd+Hx`FLcp)rw-tlV%q*^Yer`8tyOOPR{eSMXv^BcX zZslbLkg6yZJeG99xUn&Ox!=~$A6{(xe8GB3kH&NJ42f449HOG{owyXXnoYu@uxjxd z6|FBT{)rd=Hd^UF%QP!1cr}AVSoEp<Klat-a{O2S9b^16aYovv9@F1J9RZj2#e`g1 zw1jo#mY_oIRli@Cc`v*$FGPH5mzeIQMIO6V!mT%HM@yI#p7AkuJNce}idSnI&(}Tw zcdUPW=DW@P^9Jp=jnntJ2YK$AzQ)7#>vFC~p%?3>i%vUdyzE+-h+)gqsw?sxw@&`} z7`1Mlp-x!uj0oxb%s2MczB$~k>gN|OXJ7WqZ(```w#<xx=Vx|)I4<w*KWE0OwYrzD zo!D<C)O!Bz^Hr->_4JtO{khBM<>kd9yRfpf)FAoT&Ckz`ot)M@Kl}RnB<HesJ{_Hv zg0i;K_X{0CHOsHLiJ-n&K=WK{;i4j~b8|O~mP|OO_&KPeF|j||`rYnbhju;*^n0{L zh~eAWui38U7HMh5B2sNn+uLm<pDH+Nv!1XNj!U_teD3wXM+z&?Yw46#Og$LF;Fj~^ zt{ihmJ@fB(-w#SVY+L;C@m2-}wP#0rBx`TQJb7@?vzbjcYR`|Nh#Ozt^UOB$)wi2x zm45E$MCJZ@7KXWRZp_P_C%CnD%9N1r@9s{XJegJYNp(m_2#f4PZ&6Vh>DeEuzjNuw z&dN-^x?8o~raJ7`{{MF)_Ez0!;f(sz*A8whS{dayD7QpCzq&fy)z!7h@1taB=vBTS z`Ct9o4?g(y>)!9r=N)T*e-kK~c205oo80r7&u*7HW&T+9z0FJ{(RV4+f{rp~h3?K$ zVe$3*yLQ^xE#9`DH!>nvQJl-`{;KTR)hvt$&YstDIOn)&hQ-!ThKiYK2DSV99p+!p z_i%SVcEI7Ey7UDrD<gJ(zgd>Xi|Xr-zSn2V%~>NMzrWzzoX=un$NA;vym^vx=b2}q zv<7IapXSy4>C>kD`+mQ^>Fnh-cfjCRE-Pzm;^8(<v-78?Pc<`3@9v(tJ<qZxeeO*C z9XpRoNNT>hlX>tubVA|rVKx(|6{Yv~R;#P2sp;$Mzfj;kb^7%Ez18Y3MD{bq->=pQ zJG-m2p2Nyx`9*iF?AG@OJ$E(d^oGd4v!8CDxV~Xtv`*aFMy*LxJf2Oy5|qo#IzfKL zuae(8-LF-;rmpu%-DI}bJ|ofKM3$GY>GRmB(?YJre-&->?A%i^DJ3&Pa@Vc@QzuSa z*{m8TetVyq&jl`S@4qLN%F5XM=TBP~S$z0LMB<ql@BeZvU3&83#m%uXi^TNz&6)52 z<44cGa|uW6^Y8CV-F!1GEv<>~lkd@^N7u*g70PK-_xDOW!=XO0CI9ZM?1T%K_WzqV zZ)0I0>&A_rf6U?q)m<E=TsIorIJQPzUl+T(^tIXx5#C*8NAD-wOqd<LGxv5aKYy^Q zYN2ELOB0ivGFP*lZ}yM*8I0SQ8Q$=-GTaclVc}DLaG^4TL9zhDfpw32-LLTf4oSRU z#=x-nG1I<tAGezpExFYv%UN03vP|u3`m3DVY5(3x=6-yn-7jb9={<SBy@kSopxC*) z%HE#cv**+Vf$SKSaD^jBj{N$P`Fra7KWaKUIycz9oSnVXIIZRN%ad*Gw^yw2*z#dT z^!87C_PndAnl*D))(2x*aG&9o%r3^2Kg(ci0XVD}oH!H@e*U;~`3jA;>GuC8EOGJv zt-qpJ(!fEGVV>R6zcnkF+10{B3&r*K-I;W-{=e;`H#a54_0xFe>nu#S{&}AMeC?mj zyU#t_o**;*G;4*F#EcJ*7jBtx^>$wU<BgY2H_rDz{<LWJ&D&bN?!`Orm|g!-+uFXo zU$(mDhQZX?=Fhk7`5hA+yt}6I%M3$XTN|IBQv8r07Xt<P!uxms{$AfFQ@O2fFK1lC zPv<k+^KTdLdM+vXmxuRu@v-~UHf?I@>N+x6UDZC`D|m9%iwjRWI(Yog-<a03ed9%c zkBA@t{<c3n+#j=J!pF~y6&}f#l(;3E!d%ifzjQTe;*M!b*!<F@iJReoYKCixS%J6S z4_ObT9lySPbDRH-sm4x1s&B>ANw35HW=hPC3vp52@%5?bu^Z7EOdDRhx|WzRSl>La z-*hhT#_c5rvlVWztgYMa`7$k8t7qf(fSjHasu?Cy2iX!X+uKVi+zInIVK!&}{WE^* z8ZS1k&E2tg@4>69H}5VN&-~eVdYbG0n#i5?|5^T}LRyh?xy=>`I=v`={#G_UXU&i2 z^P5>@mk1k38$YXb`@NOpvAoR-`viyGzTamXn}t0&DSCmypmf!`>C<OUzkau)Lu_wU zPmhR@kXWzu_3T?)Hs9WM_qiuq+yk}uv7%8vwa?zlc`tOYXnnSEaqL^Zr%PD#IJDc& z2p^y4dCC8M_evel(+Lb47RO#c=Jf2~0v6AUEbG5s?_Ac*$e{4w<$`WvrduJW!?T%> z`6D!MhtFN{r=Z?HgU{2#R=u6)WOaD!v#D`BUC%;V+1!e=HyIf*WKH_Mj_Yi8&<>l* z^@rPLZ+ZRBuF!YWq*?tZeednoGFiXPF6qz44_pt^IXxL#`Q^px{>9{;TUJ$ar`6)t z{bj!8bLTFerY|oeX0|t!UCw@9(TfY0|Nd5g_3G3oO=(DyF4@4?EAXrGX5F(_ub$Q2 z)V<qpHKF+VrR1cz9lK|9Sb03(kn!<R?*D($5ixi8ijUe?99Xr^Y`(=t*=J4+2{~(i zJmJijy1=lZaPi7s-}$cHN}D&|-;!d}sw5<rw>j^weD?KwF<Ue~9cSOdF4U>>>n0yp z=bDvw&zGzaYo00py+P66FzT6^mzU2R9X-#fN)s7BJr<HI68TxEyu{dRHV+#^!=)e3 z-<LksTovWTuybkt)vfAz{IeG8<mW~fn|_+OVh-oZIxEe$aT6y0W@~T}Ri3<ZQ;1OH zm(7PnRW@y!)^|_9w(^>Jk@?J>`_z`&JvwpG)@knfDV{}+<&Ruq?dm^UZGL)seO1Mg zyjvz&@9$lUJvwK;zfQc|+Xok}pFBCk|0cMu3P^7;fA7SxHFDehpEqnR6C?v3q`h3W zxoD~1l<r;LA{o2y?$~K`-1V;NsY_?i>Lxt(ntPr-+HK`-7siIAi&H}iL>MC2L|7WS zxmj2mx=#mZ?E3t9;xtCa2ahiOSh190{xAI_x2^Losmxs&JUjoG0L#Ye@7MP15tp~S z!gOV8x`C#qWM<}0-`U%))&G2PadEe}{<G)Lx2LzId3t!~+ZHUiyKMI32N&{+O}%}6 zdrzk1-PsWs7bnMX>hx!4Cq8xc<=Z~LUbuB%#osMQ8W_7utbRW|eJXD6l8Q-+7B{j^ zOnBhht@QqG^o2vtH8pOpUz|8Izur*&xvxh@>G^qkJU>mIV$!1Lq8c_u{M*^^#|8H; za$BbQRQ@b%^Ec1ul}ygCx$WVmV*D}Cto1PCs+%uPJvO{)D#KgsTlVev!5juI4W5wt z9e-1rzIHcl`m@pKW%jk-{zejM+4dDvL{onnx7I2*o=qy6vF6Qg^I(zox{7J@0<ts@ z?~<9XbpDA!<fmY_aJhB*YtHOFlep<c{;5+DE~j=L$Z4)mdr@bsHuvZggUFmh$%$u< zELnZ&YTv!Z>(wqUe0I%nhV}OP$?7woWxjqob>6!8@@sAm_n-A0I`{6*&CQvPj+3Y9 zWPUxaKTUtXma6N$?fm!6Ace;KgP`j9Y)Kf~4%gnhpFh4{p~0cCW8zyOR)(*(NxAm> z=jgMir)RT^h(s`@{Qem!CKBPcbBD>wlS@o(xEKVk1{|sN@4MaGG}UUt+vne327dYc z?OpAJIWc7q4lGHNSLI0hS+rc$`wb6o`u5@tRp;lYTUwln*n8{mv0iCWQPFef&P|#$ ziOKWR?A5DQMeQtF+T7ecA>is#@9=BuO5-*i3A?bc?#<87YfetqHOs%3my&X2(#KP$ zgct%MPclC6y&dk<RPtlP)eb@Tn3zROQGcf0+*A2?%hsjO&+oUW`SI|=g_VzweSPFP z!|XxPPKHTBj}o?+UEpBQVPtS?Wn%cTi}}ET$?DQ>-|mWYFbGI-F>I(dW@zAJc+p-b z#lx`Rb<r~phBI<}3<VD^hu(9me{0Oduz;t8UzUS`xt!@h2t&g|^)}`MCw}eq<^Imx z(72Bwz^+LnSLbu@jIZw3-A$MnWNjH{Sby(MU;Tb&*z=py@-OQ@`I^0LZtRb})vbbp z+b%DAx%JzJ+}rQscTTGPxoPhbl}`DOkgWH-l{cd$V0P;7oo`MuHoVDc&=CJB<9>QY z!dHz8W!aZ9I*S6&b82vG_+uh*=YW6gUDg9d&Cz9l-546Sm3@mSEoC^(o5$PFCc<JO zHqr1}pVaDo>^jVO8TC~nzc1K#9$oeETVHXJk(`ms(wmIhVHUrCteG-JB>#DWyrk5( zd;9MnK9qFu#l__7>teN6NO%MV87U|{cyREpr{_sV#@Vd0%a`)-R?oNCnEmd~*6Dh# zTT^Ui-VtT6nDgD{j6uzgtbhwkmU^#$@%r@knwei89u5^25<5G;zVOcv;p*>x5&LQk z_?5TDyj**sMNx0_R92%(?u|#;W_=MY>4<lZx|MCc`@^YIudK_T^~$WgcI&XPP~6(s z>f*Dr1ShM#{Gc57Ty+BfyNryCE&rE*`U+0>8^Iy<a?PH|4Vw~oCuSc$ew>Mkfx)gf zBh7%pVqMEG?FF;#-rU&1$m<&R>cFXEbEnC-FP#76t!#MU!JpS&o%i(g%*x_odSh3g zlAC*Pb@+eze&-rDfg`uJo@?^EnDy=3<fP=}vuDoKSxoW~V{CYp6=$}9G2!GS#>~v8 zr>D8Tes!ux^77_Z_miiB*2T=+TJ&_QsP?+F^!+!tuP^of_^IXBk)zzV>#to~7@%Pv zy=ci26&;-(@x&iZCsVpQIzCiSyK$o?`gXCG*Q4$E=U?BAUdAgrO@F^t&5l>wa-Z3p zzvd~(^6~t!`nd3Y*UT>b3;4cpZhCr{VZ8WWxm2@LsS{84yMuSAev}8*{Y+_+0v{eb zc3dwix|egi?Ec}yA--#Wy6S%V{Q2wGt+y>hH>aJEkQbb&@j`?{OH1qOl_@N97hQGh zG3e{~u|Ade#V_pz_dnVkzPDF+)24f8W|wOk7EbKyayiZa<+Jqi#mbK#2~C~+`Pqw$ znq6H@_0BKE7cW?lkejRfLd5>U-s<vw*X*m!&YpXB=f+0c^K&*%ob>8i8&_VQq5u3# z^K2r|e9oCG;wT`zMy=xC>y;`O?$4ZlNbhXHjKX(6EE&@rK#{qsoj0RJ;FoM=_5I+` zsXwkgJ<s4E&@ydWO|{!EF(J<_t5$hk&=la{EPb(?ug*I*HkUiz{_d_)R=XI+Sbdcv zRW~*q{`@R<PwDH^N89(GzgfAUukXvBpVQlTENi~Jm|~c0@>B5r_R>E;KE8UDrKqUr z$o_NLtXWd#=H~yd{{Md8{q!`~^Yd~m9v#`TEwrP<<NNpe4e94Al9OHUrM=#BEiY#G z>mz!Fj`b}Wr`Bkm(Rwy@cDUM1^ZMoNpg#V>vSzT`-`?39UGOI2QzP@_U1e`SH7~sQ zdga7tE*Dmmoot<;aCQB^Gt1+aELs%dabil~VyFLqjDOv)SKs#PhGBA*nwphfOvTAN ze`YXDZ}}IxbJwn*l_8GHe=M78UH)nPj&}Dq%Y4i4-f8>wvo|}sb<?Kpr>DivwcFdj z`nABlwAWYe)mEr~cvrkvbMvw}b_G(>7eFB@v_pQYoPZO@-=aNxAG7g?#qFs$(BJO& zCA0FoW!1}HFXo?W4d8ZJAOGv_^~h!atNx$aCgSH`&&yEz>%>;gYyC54X0ovQa&c5_ zDSzL5O>XrXow~QTWX!iO)DDX&Ez7%TD=PTQPJH?b-`Vee{p!ms{w~QdO~3!&hlP3n z>loJr-b++fRn3$x>0n*M;1Cn^C-k4T<8p9JAJSeR=(ILGE-o%GQ1OKb@4fx?>z6H4 zdm%FS<jUZc=K0Uu+-_}8DOk4u>;<0bE_)jm%0)6HJSbI+`^`~$EtP?xd1~ju2NqwB z?lPG1boEpTo_)*pmp4^P>^Nt|YkWAUDXM&`y3_oVU$#rWn#gKk*<;YZgzZJEFVFn1 zNwOOaj(`93GGqf+bL825e2-1PRm9lIu5&f}5M3;l*0wZ9`r;)?W@h=)mr6(WvzajH zL>eh*cfWfjb$R#pGdl{S*4o}VpFd~byf>3n!!KQqm$$WAn(nVz*Yc<F(&@&+wsYI0 z=6|!{<yli!CU@?BretQLwfv0ys2_*-#W_pqP4`xsX!lmH?#G9_4-QJz_}u6W3E#hc zd;g9K!_OBMp6u&8mb-3q_VxOQ4_~IAzontk@zLO({)1ZC_^?lzv#nlCS*;H0=e!UH zrL}<9D^{-5)GS>iJ+bs{*Zxyc2X9-SyA@UbDP`_7o@-aHHS%1zdaZG$US}0!AH#*< z(+3h#3k)pyYA3GF&STJDuzVUL!;37515ZjF7puAXw_Tq8^S8`}d<Apm?6e!Kw)eMM z&gA~e!%&qaae%ua?iQOt@!a!A=DE+Vmu;Fg&oO`f1J>^1_%)eNUvF5_l9_sS_Wjk2 z@9){_X}>=E=jZf)zw;-yxvdVbi`Y})FyF3-TilILQV5g@Jts$%DE((Kb7UyEv8YSL zY^__&M6V!;<a|Y*n5Gq?weg|K>pWCn-oAak&UC_=g?sDtHF-rtW1otgoYQvkQouox z&?!qz#FmSPHg4In#-RNH!}Hp|$~jemq2ZRUS}!;2wr%NA+59b7Pw!&P-!_vwlep`i zPno7CsdQ@1{067`NZrIksu`j(o0cevz9^aScLo!K!r9>a2fY91+>MmBtG8#>*YDr3 z-G2JCZ@)gJ{+?g?_sDVae_yYEy}G*n=8Z286Kz0wUGa<eAyo?jr?r>2W?#>f<uO|j zo%j9S|4WzS>!06ijz4kcWZRWLFXrTUoZUZd;?!Az91IhFDTy<r&GKh4wQWAVx$W1| zYwsIRZ=QCqv+u||<42A2s`mPypY>|us>N$>d*4<#oxI|8=81DBSr{yAvujOio|n#e z`mo|lf_8j+zx?z&`~PP>^I@K6KXH9)OGNp5J)`=6N4Lq^6)lNMdbCJTIYiyxZfouD z+IwlgnanHSPtyIaefj$?_9s(ZDs$>t?mXGM+UfI+i|fkTi!L#lw}>)Z-zv?06VB{; zCH>yJjUrVo;Tdw)w@M$LJk+&9_y3(mOW)tCXj`ElSMw#MspRP4A5LXkUSFy0pZxt? z<a~!1{=E@iE<5tFHXZHd<~TXI?)S1KnVa-q)z4eDO+~kvG2oH~qsV@i%DX#~ABrA2 zFEojPOWsZ=Cran+W$ttT*!HG3w6uh$r74Pv&be{pr~T#Hy6@|*-L!nwZ-1ri-IfQi z;9h-b9j_C|Up<aRw{BaXJDPf-fw4>1#^t){oC4Mc*029dSsTtQPMGla^$JlLdoG5U z$H6hu?EWf2O$-b{9SZZ(-S^Kuc3qBvfyJ~k@M?a#+}FRyUJFQV6W8HmVpy>%>tad$ z|Ju#<^{m#`wQ@)Q%UN1_d31c0ua}A4^yE|{bM8*d8Cy(#J~}${^|iade!rjn^5yz| znVFZCa>uW`qc-tGkk_hNr;J|RsjF?2{vhRHdvXzjh)`tk?)fXXg$W63s1y}5&t5R$ z#HUlctQIV}7wm7@J~fKVft4ZE`*86&Y3=9iekv2I`3>an8^1kQe^QcXRqMeu0rDrl z)L+>!b;G|&r`)=(z0O~^^-HK!*9?oum`STLGbLW`*;rJUuz$KqrSJujmm3fM?76qh zaDny5&8$sEhYug#yXO$&uZm?iE4Cf?b}&#<GJ5m&Jg@Y!s#jM^RF}@*<vMS3aY)&> z+3NmcpS7fat!Rr@_7Y-k_;llL<Ic-AVp$wk;59M={0YobidTa2@9#T%`m}IKSN^Me zdv`BewroLgNyfc<g*o4TPmBL|XU&=Hiz`<~8XrDXS}DrC@Y>_IuL~X@v)-Qn{O*p2 z2fCAVjf$2;6>ONgI63A0J)_lOyxGx$@%IgDf1S{cC|J3VJvTw&{Ot)02c8yL_=wFt zs#6{7p<Zm^5VC28j9T}(r?B2vQ$nFdz_~v~3gPa~FPuV>Tq_gr*O>A>mz~R(nwtMY zN3H#25_159k^JShUptPt?_=Pth@CX|tcanMX^7>Kw9fi}3~M)j{uRD%<^4^jwcAsw zd-k|EDq5<)duBRg^O+Vd2Cw)l`IFidPIjcIsU1Ci-CyAUsT&m<4lz+%7k_`T+OuTE z&QhLd=ic7`p;Kym`IU|0ooixs58r*>|KBcV+nZH$=l)w6Y+P3~ccyduJUP2RZ$2by z*X?;y7i#MAbN2T~MzJ&VBa}ic6Q8|~DiqaBT=eH`b)jpdQF{VINO<?Da`knxcGr`? z2`O_5ozV8Us&c)~CM<9oPr%^?dsj{knX-tXK=SGO?4zMePB0u;w<MJFw1yYM!4+*$ z3f`U*>O??Qz0-<X(6ITHAX8IQ9yaH|jZ4MPZ(IKA)vHsdymB1s-K&1Rj@|w5_MXZq ziyryk)qS=3b<jos?!LZtSr1KjF<n~fEpBaX?YR7h5Py7o_O&}VHYz8co@V&$nQdk8 z##AxgSM#U3#_#=A_5PmGv}w69Jc;M#?5nCO;uepSvNHK`Vxs1@Z8mueCjDB=`<9)7 zxt5*DAwz?qq58%0-1u?^iHQBORxi36vzdDt4hS(Mg#68jXOIxI+OTlPyCW+Z434lW z{F*UmQr|fjSy_e;JvlYqZ!TYZXDr5GP^ZBVKJnX=+`p_>+~Tk2PfCkdU}y+D%)-Es zkd(^JU{%FnQ2y@v`K!;~+%&77Z)H{f{kEOm_dDQL((jW&Cr_rHI~OjdFSnr}@xOe( z+gGFYF&YLF_CNKvxV_gZ!lJ(W-f5Xj2G{-?v$B2K{zrK3^C{~r7Vo|L;T&h^_mwyG zC2Z~Nzg;;QlfC-;KkMB)&uI2n<RpHriw=0df2}dUt=YzU`7LX|UsC<@BBQdot69Bw zFE9U^s;3Wfj0zY)4RQ{}D;L3;h%0t?+0<#%#7er-3}*W9wJX06k)5@@e9khpuj=~s zZZ_djQCV48TB@q5FBI;Vd`yy_uJ!K6y7>B?g^%a5^LPFIb8P2M-rWBTx3~BIt#EeI zU2FC)OV+@_(C}j6!$aO>WzR2Nj<2qo_0c5RI$??7)U7A=B`<hCa(CXjHOsjzxXxr% z>5dq^>8GFO`pT_Zz54e_u5K|`Im=Hux6MAAX1o2VkxPHB!Q3p@*f`BT{+0Qp-?Q!p zCtoR(XV7?6Y5Z$f(ffmc6(71iJ~!Qc>Q&RPJ#i<+CmlVqtFzlYS6=+6ZSuG6(_dOo zkoq!fQF!dHKfe5yrG;Fs(}HJx-PK;AUs#l>)cni+edO*c<~x?x7Ek}lP<MZ(2&g5q zf)_Lj=d^!c^!6hExn8z4H@q%51{jBgggkj_{Z9R+tBVVZY~%5+E{W&omd>}HUiiQ6 z;fg@1@9%UaEI-XY&HXvrqvPv_#Dkxo$M^Kd-*~2!Qgl6d`LgdXmA4l@p8Nd#X@2=_ zi-LB4G*FrE`QmnN#>1(%Rk-?hpI@|Sk)z}OH;cZ8hQ?I?E)HM6&!Q}6RkQQ``T9GG zo^JjBuX^f)4ITd3eg8N83MdYHV`Jrc{KmCa^L^)wTi^5DoU!S0)b3e_lP+t&OwD2I z)SC2DXYZD9dDayV!@`Yk8U?o*^4&kXdS#el_|s(quKC<oLZ8|f?3^m<I!FAKmzR8& z$=B7_)>zNVUy+w}@?i*bAah8dqkST%X|Yfrl!sgDYVY0q?$#5K`%rzEBu`#m-qUVz z(Wofh=rzp~Wp@~#teL#_oA~dY`oeM(e$85861MVTk*jB~c$qD)P2gLb^oruIr;O%> zp89e<cc1F%bA5dK=bc{SarNXY{q06t^(8Ma6))QU(r0qq+J8q3m30fAGk^Bw-hbvV z^OhM`kGqurwcX{~JfDp%%-Wj&dC^XlOZs0YzPL2Iv2fS9ZCYn-j;wt+$z}ill%02^ zgjT*Pdf@Dw?%n&Ix90O3GvCZDj*rzZolZ7)slQ>f|6ld|db1x76Wnh<>w8|5?ctJ` zwDd|qtRzFluPNKo{grx;RsGvzW4iUtRc$r~pSi25KRwwJxtXW_gU?SNuT{|*E53FJ zy35Gu$=KU{P4~*Zk&u+2@cxB_Wktb<hlj)J|0r%)SEatGAo2F^f3h)YYIpD1J-VuW ztXG=PCNl2XmzP&;tA)P5k+jc=C|0-o#n-!X-$eQS67S!AetNEMVHHEd3vPx7k~cO4 zZ<+sjT^&Qhi+z#|4#E=OC$U*t&+@+b-fqwApNUI0&z%~Qdgk!+B@^=|HcR($-o46q zo(+<8cR}Vs{#n)8sG6DWSMAQvxl`dDZ|@LPl>Pr7dri%|tM5}TXPPWxV_>lOvZ$!( z_f<c(P`6LHx(pk%yEA%@^>4a<gjKa;#)=Nc_P7wg^y?cY^Z#}Y*|d|VDd9q=RBg4k zGK1N{1mUM8Wq*Bm+rM9UJyoo7>7Jb}Pt(I>)y~Ik%ei^z=H${{8x>x9^jx^p$~<3| zM?X*EpelF@LC;ZuW$i|zy&cyi{#+Jwj&hq6`THkJOjFpEf(y&fo-e=Vb+UBzznc8R zWyytRjvJ((UE99h{L!?S57rZ03L1U&7hSv=lW<wOf3^5a6_pfeJ_d$|+nhk)*Sy`* z=9lVzBnxx23Vsv&bRbnAhi~t{_H(HhGM=)`p8TfVqUqd2A)clcOQv4PU};}q`bXha zyxE;e*>&ufIM>~g_-!w;@a5??X91a}u%91iPp&sHx_)B;JHvDh{YAwLPefB*uev$) z>w4Q>&uwB|7tWlXH22~2@~L|3md-Bw>|@E`kdiWO_wTox(=YET6D=xuAueXNchRHw zpP#>FxmUZ+Jf-8*$H$lb=6KxP@$sDhv{_c6-w!gotEw6bPhQN(*k2*UU+Px=?#b+# zt$XVKKYVw$(&nYz^JigJ*6ufNOYhjl_w#4g3SSjAzDXTl?WLkuSl>uWu+MrE`2WVE zea-9~R$`#(g8*+(q25wgc<)}JaoQJ2`?%M?53gD4pMOurJZHwKkB@_$otFLh(Zj~z zVNv&jb*sXQ``snKzAiTByf}r~Jzn5?|9s8GVJ*MdQm!3gopXBfvpt%O3h!Fubkvph zn5ka5UM=v?DOJGX<3(@IOGgg>XqvS~T$15UhJO3u^P9UnGp^@uywkInZ+HHscRPRE zuv7>YXvFV&u;l$wFFlVJ`+a-0^3<L@wob6>VmVMDDJfW{KQ(Mp{GF*RhXTH~McOO8 zi>PS*u(?HrKui9~=TAq~o7Qo5$KBqhJ9BR3qZ`Jazh2fF_MB;U<eapKGw$_z;h*YF zd7R$HUET~v=Vj^-c-`Fh%Egd@q4U?7+qTo3`af`;eXRDr^hUwtvb%TH`EFcXmz|vL zeaT3ILDk(~%_H2VN5ADzJ3seqzwA<ttBd^)m&x~E*|jS~S|jU@NB&*^-E#{jJBPLI zOLDKiDSOJF`;KfFPvP-J+AWub<o2FERlyh_`*zo>50CG3J(5^|LFm=yzwb6W#PIj4 zxX8<L_-mg$m%wl(<xQ;UME5(~7N4VbDLq=>F#XOGfp*^Snb*sI9l7d1N&c_Mmz4}N zmp2I=aTWe^JwBab&&iXTd-mo0?R+%r$=-VlD|=oqyzbq(dfn`KHEZSvO`biGk-_0= zx_z$}YeTQJZ{(WN%F1;UCw{ZDTm1Gd?~)}}*SJK#ePgq;TWp@+XI*9TQr$Z<)ARVT zbN@e|KUn`y^6eX$qmwIE6mxP{+f|ih+~3Dl{{Gzc>(9@AvO9M!@Y1D}m|r_pO-xMg z8QuG|*eEi6!`#<Q+>hlJIb1W@82unCaY4)KT+sgS6~zZYBlo(CVy;{Tf!IZMb&2o9 z-#ijx6?pnci1lXOGhY6BvrRky&YsQFk+tT-&vWP9ce&KY3D=(AmivA4=KDD}K0H1> ze|`M<uixe6WpYf@{q9$O?wK;>2qVLi#)+Y)L|!k{nJ4>s${MZwciSA^W}YeTGK#z( z(>nS0pQy&9_^w^Mq#RyyH{H6Oa8qx7TdL{3{nhLY3vzB+pRfGxESR|}!rUm-YuXjx z$owM(wUt7W4Juw?Vb?DjUz%Lc?ZE1mCpdZ0k~?!*7!ITu%;wZoi<~o=lR;>2$*yUe zS9ZlpUsD$o6kI27kW$hg@Z30c(jk?i_l(aTr_bDX-s_yg3O2UWPPJ{*>+Vz)t#w$c z@9O=x+mvh9>Ef<=`^BccR*jT{O|q>r(VM8~K2hG>$x7Mu-_PpU%C1$@gdFl-Mwh<r zyxsgvqkiT@7bWfNmoIoPPEKcRbzxi3(K-33>dINu+A7aU%XfJ+y*tvm>;B)!CCiuB zZ@hSMg2!DKMvWzTvu;%_bG|C+BViO}cIBtn%p7yWBJ)*iL^|&{pRZ}y_hY&9ykkoO zLsHk=$@y~h$caafLJ9*nX&kt`yI+$_<gcLA94Dcbvo}p!c27XJGVHJ5*01^t|LjQT zvE1}$N8=^Q^^7T7et(^9zWTiMGL23hrVm!l6ATPyh`%y^ko@;v2-i#<MQ=ui6-j$o z8~irLz1>w>Z(${+A5-!2-Q7R)*Ke!;-?CtVr=w%Pd!NmusjmNjHm%rvW8dF@Z*D$+ ze(r7g-(NDBnMVFud3P$F|N1(;v2og@NwTl!&hG2<TKa6sGY%_P<}}gCUQ4;GSV85T z0H`gSn<5zyP;i)c(<G5)e_(3?HY;jzF>&SXs4cr)I(I5#-Yo`(n>TMUvVs8Pw6pKa zg)j5{_)(y&_IC5)SI;LcYrNgt)YQcA_I&oD{6&{<-n&<*9mezW_V(l7-7jV6@I8+; z<~PXd;tIa8N^4Ol+vAhV|8wrEu-ll_vh~v2;+Z$~MS0k>X7Ag*!}eLEpQGX0-F2xK zto}Cy2lD=Z_imx$*J%tVYGUlJq_3-RvkO=n@m*+g<W(85=F_PgEUvEkv|Wa;+jYH; zcCv7c*!C4a45K}rr*JZCz2NM+aHfUY>hREC@Au4(4GB53LRg&b@=oW|@6*$@edb-< zFyV9amMr)87kfmk4!oZ9=1q#=;y~x$;cU7e`7I=-F8*1#y8q?w$+we*in+KlEen5t zKQ8#yJ$(Pl6X&ZP!$Mbuni$r++HLye#95uv?u%0=8s6-;lzP_8w#xoasgdGuSI5GA zZ9czdef`JoZ<}Kg;_3XtG2~JAC#PH5dhLf(F5aIqb>pei5i)$;(9Ws-GTyI+g6At3 z&-ckzU;7f7`gX(DPn)*#vNzZX<SD46aGP~Ynde0Px||oDBi4O5<?_y}GGVC?v#ll{ zt(<VI^o!g%kCh8fZFqk)ZG**CokeUSB1?_rk1W|!85?t@+D7xod}H<V_KUlNU5)0e zKHWG|M(p$rr?=m(PI==bdU#(<o@x8ZW&0OS-}oy0$%NpEtJ0V<B6wE!?3w*{N7Uh% z&>1n2GbV}0swA(Aly})$|MaBlzvKLFPo?YE@CzBOasOz^uyw&2CG`{e!P>G`CY4_@ zeA(N%TU$fz<8x0=V*LJIf6a;qJaRHM?_$_%)tNs|Tb+I8e*OJF&*x8ExbWJZRg$7p zH&+(ld3JWOj!xCbRnPSO<Gl7Q+3@7};~(#XZm4Ew&)X{jo<qCkvtr#kzYCHAP7fYE z+LU@)%yIdT##5(G&6zXj-rj0v2k<0z!?xSKv$cz*w)022S-w5VxPeEb;Ix_iZguu8 zck@^pPTy#o%Q$Vq+wWKZ@#fu}EzO>B-Tu!{zk<TX28LYw{T3a!_Nap=)_$9=<YYLI zVs!fS>E7O6*5A6n_8mHOD0+L|&Ye5A-tNiEGdy_k{HM>csjv0f|E^=@*1Nkue#YFr zd;XoCFhL+Uw{u-)X3N&E7j8W_<bQIkKWm-ppWLU{*Q-eSZpwK0e82JfIVw77{A+7v zCNHt@GWzIs-ScwktNfJkhzKDuvE5~FZ}lhdWSQ$cZE4+iyYh?P)13k?91%Nn=4?;3 zQl3$aWW$a+qjL${rt;XT=~e%^k(NK<M6r9H%uL(rZF_9;?bOcm|Nj2Iyr6)AL45j8 zM#kB<inH>f&P**|yj<G!vt+T}b~XKs@Abyl^nSb&`r>BlDY)HLtyf%M+p^y7;^D*1 z^F1ru+>-kw3SB}&KfSyA(?;_|$~6lsw|Ta+w-qj4Ieq#~{^P<d8}sh&>ihrw#rCh~ z?f<i|u+;3Gf4bH_``XXX&yD~6Enn1qS|QHYefj3zUj8qymlyopWV=4=A0J0kLCm`s zTaI~p`o8RLpAmYtcGvUeo!(vbdp`%=SZaPWzbx;brjE*)eosNCj`kw%?&?*wpZ~uS zaN6Inu8FTf;MEd4)A~{-E-tCEbvh9@e|$LGKYRW*hLSL|?e_~+U3TuM`MBZn@x`zH zZ`@n7ly6PWoy?m{)Ux8dyk_qI-@G>ZZ1kmCwuaQxY^^OSme%f9*MIU{8g%(m(VG7k zc1e|(?AU*EO<37{Mu&Tc4r%P4!pJ40E4kLv<NYho{|SFNH@9(K?o#s!|9K;>?wiit z3m-PmK00y5ru(^e%m$ZcoVxX7I?s!*hfjjL=-2DpS17Xw9{%$;_5X&M7wqmnKj#`0 zv}skB=FOPd&Hf(09;-hQpXy{Bet7!5E)R)E2EVQU`)TSf_mf!f*kq!%J$`>(jnB#8 zuC7PN`~9UYKb`pVbGnn$vOhJBg@qT5)6*oRPUYVyc>eSArUwbyak{4)too+wYp0*@ z^YGQ(Us3pMiss(Rh{}_bw69*>y5mc6cHqh@#mCRzJik@ld&2I{a%Kj->CrQ0xxe!Y znlgFvGOv%xm!_=gnZ^HpEBgy32l0h^TbyQX-TKwu`~Sgr#-JL*iV3vP@z$YDJGD1h zg*ZNWE4zHH?&t6Km7^@`4lpcrZdbFmjD2@;@$TizXU?2?b5G^Lva;wkvAnmW97Ez3 zAI;4U;!l3f${W5Rdxc4@irKe^r>4G+GT+>??=IV4F+ZQ5SLQE&F~j23pNgGt?oU~| zG&JPO+sMro7esR{yV|@qzn{Ote@pz2zsjN^CJYP@_WuuB=0E@N>zEpoq?T779|z0I z=zV$Pd3VRfDe9(o@A~raK9!Z#=a&?ck;zHTT6J#nrWMK^-P$uuU)Owpr&Rv_oV>w< z)30;u+xpM%{ruec-2CmqfteR?cf8<U-ZyvEeGgC1$n9xo^UD2AQ~$-?`EH|}{CZ!l z`nfrb3^BhXL7hceE>H#fLR>`nvyzR?-y0jRt^M=jMMg~6w`+I*Zrfpz`Sn#Ix0uB| zOX1{n^LhS?(MpDfw)*|cmM#1Cc;Vd3?fmlR=2$9UDlk6Uw_?+#O?AmnP8jm>IV!vJ z1^s^I{8Tn9DamT`Pd{g8=L?Qe>F4I`tE@b7the06bg7KYuTM*!P0`%d)@Cast9<s1 z)3>*?H{{$*m^a0>NmT4x&9^t77rSM)wfY7J2s}=Fx;i|5$L{-O<>oW3zW)C1<7&UH z`1ZC2-DnlnANP)%U%AYEV^`_XO{vHI<~;Zw10Hr<+XSBYWUZ{eZ)_S`UXbzi6!Yur z{|}}V{r~m4DpNE2INxjA>TfwWKD_S`{5y4O>W_(^qgz^b8A!ZoX?ec4>gBgLKfCY$ z>^hsq&0T({-=qG=hlh{1b#-0qlT{QFdcrCEFXQ}Hi>TEvUmriaHhA6j&56yPadA)Y z>=ZXKU8(H;=^5{gdA3XQ?$6tvboA=e)9dZ(<LVw9PyzXGQ?mP^S*GSPGQZ@k&8BXj zdiwNzy~v`<M=o#A&UXK}?Nfe-0!Qb&ySEqqj`0t2a@u;FKhL@cRC!$a2N{=|wb*^~ zyZick3J)*LZO^}(b#HO|ja8x7Po0W5-nWzSz|n4TdHZwEQ;&!l7#T(FtrD8*Rr}*Z zptb+qdAmwpZb~@V#8)SLXj#0Rby=4}$Bi2|zSVnfId%Mc|AOW%cPA<b7Zr1|w{w5| z$USvx<+XSBcb7LUOzc0}t*@>=UCt^cHRDEMeDw?KnAqfR?`k)cy*;5DeeA=YACHbs zzrXi)Lw?`~m!P0a9ga4;byK{rT)p<}`SbE!{&k?f!Her{pj8pt1r~Ge+=+2qo^fn< z`TJdEN8>Yi&GP#;Z#OqEe}D5Cmv%T`Xuu1*>}x+S1zkJXJbCTf=<QS3e{Bt18B*i9 zrC(TmS)W8<%DX$<+w;yoO^j4mPgY(m=jS(_o!_qH#f2x9#TA=Rv1iH0<h^}!Q&3P) z^7nWDKcD^Ym7AI8?y7znbZx1(apBAKc?ukh)@|Enn?6NAT%BW)ZMq96-TYE~b6w$z zVoBHOFGoPDQeP^+5V?P4V)(_i;h-ha_8Ic?t1By~hOfKvKSj2>`mmhskvVhp_@zo- zTv&MW+BMk}$$+x5k{@4V)Ld8jh1KtzD!5(6?n9aQcFV)J1G*-P?fBgIb6M-Hwbngi zn}5xCv2MTn_KXjg4;;u!fBrB=Z@P=pRz>AsdsnXTkg>PBdd1|(MMEQt8(r;F*?EKN zeq1<t^5v%H!>v!AY?8G;_Gv@KZ>_yD66r5;R$tt;_|<t&&_r(Nwv`PJX3T0^vSdo^ zo(%I;uJ`r2@jEBIeJJ?)VPaP5)!EOFUYtH-W+S8j+5cweZGO#v*rX|CY8n%GvA<qZ zVy1h!o#|bZ)gSjh+4Nibo7kDJGp|1J598hLHbv#uxrKtDGV~Uc^aYMm4kst4*49?p zKYrOtN=ijVMNNJeJC`n9`t`x*Q#~e9r*B*5U0sz}`|HC4b<?UX&kncyb&JQ(v-*1G zSnsm9xHS9t&+1d>N0vt1tG{g|<WQHU#_iza8TP{Wa`&g5ENh#br-i6o7m#_dM?7@O zQicsLT|twrE0>(#CUMDV(i#1A-j9X0Tz{_`nxg4zZht>gTlM<ev(KHSw=G?`Xw~XD zN?WHXFj(XSx<+>G+gq!<{Yle(%cV=b+d7Q8S2;vQiOndPFm-9o9Ft3)Cpt^Ey<5Y} z;4o|XzQ*bQZf;J<mgc)~T-o%j@!hZ&kGI+V-+yw2v!P)iKj+4I_Wu_xTXyBw*ZL0| zHmz7ukg=k4f1PdE`hD}JgjBt_kiy&B_c=^s`hvZ6`bxfn>sMwK<xPBbJ|T0(k1fH8 zJ$qXX3OE;qeW?xY-Jvw~%gvLV0so~LmMl%x>^;7D@!xZrx}`6~N)*l(9$jPjP3#cE z8~^8TpQqQew(G3)VEy%c`Pv5|AsZe)dd4qv;&*l9rHnJG-s^nkt$F-1^VsJ{D;SqA z>QL0V?mUS_#wys$ttpiIQ}VKzoY$wsaqL=Sl7COY^Wv{W9?eY8FkOa%)u-aFd#(5~ zVfxc$SD74qMSJ74SE{(Vu+I&ivHi%5Gn$L{PY;-+%KfbqR7r5u`incVJ8&>E=tOK# zFfa(Xpeay)cYpo;GiQ3%2Uk=dFMWNj^e~%noamH^ita8qK#MmoFWViwY>u90;-^(b zw{7+@FI()v&@+9aVB+_n%y`}oYq2=RKRSw?vTv<Q?>~OBxA>a6z;$Q+X+nbQX3xqg ze9YwZY03S4nm_-%cqHt2y~TBX?(J!3&e;^cnW^&k%RUJ=q@}!ngdMlHER{T}$}ls% z&pu&kPJHPi35Et2#KPdh$=|JVc6jc7_fDAoO~&=D8@H-vO7b*JTC6U-L|g8dxYNVK z?XAAcw^~hkb@9W^CKG>si|T7^48JOtT)VpTmcuXc+b_Nw=f~Oe^9PrIzkR$<_4A$| zt3nUw-JA3KQ|i+P2M<oyOZ~W~?sm#N4ljXe)%%WWZ+p4(>qnltPd_=gYnk-RzRfDv zP}ePRjwrnRS%QI~OWJ>L|MC0!o~IKWe0{^**c^O6-3y&Rf4eW2$v?No^?uO@JG-L~ z^uIG^(21*Y_2A%>nQ^B75eLHpEi;o{Jv%nlU0ytE$KvImm)ywrV$8bqEzf3hc=WVs zcYla)d$zyfa_glxT|x{ec9#5kd3#E&w4ceJgQqQp|4o^?FF&-R&@;`9S>biikLK+! zZ=1J>bHDNg$MIIsw9qSoEnBvjn3!x}|GRqCs#Ui(CLiCDdHKgKmgAR~Z)s?7fA>x; zB+L9>*u4!0pL|OF?cVS8>nk@GclEj3kJc)oj+4amN*L{OU-5aSk!PaN&hHGLKW_H9 zpRSrN5W?J?y3p>hw|$=N&aefSrY~Ch?`S$7c>^Spjf4kC?*DjF6ID^MV|rt5#g66a zRtyeRzn0G{zMT7I_s1_L(K|N$-%~06{?5tgl^+e0P2_EhWGsWO-um_B+uQGzar?i1 zdOXj`zjD%|ThDW^`KK35o~t4hDbnDil%4h6Sa#LX1T)M2*XzT>@@&4^$=OGNmQ8Ek zckc07b}Gm-<>LACx7Aps>K7O6FTS<SoR!tEZpzmW9eayZe;;T(+0|9EvY&zB)Midk z+h*6_wQQ>K)k|+oU$b%@kAjw$7^6b)k=>o1*W&-psafu@k>52ql$U|))V)<-=DgTg z>~~mxPt&FCTDP9bIhxH%O1gXGsA~7Ad#k>i+~0Tk*=l<?P*vt6%b|C$F~EIe+Syss z=6O2N+k9eTVuFH#E))vnb8v!y;mk9v++tte-=Dv}IQO2+^5yE=tG*i4iOe_gR98)X z*(DmDe%?-AI(kF-`yY9CSw4s#N%^|!ww(3*b#rd6o)M_7$8$h+)r?ft)|`OV`KGoW ztINK~)tYwRV~(4il5XtU<Hj4xw=we3e0zuNH+%j~&3?5#$M?SOO*v)#zyObPox3Y} zpXnGcWODdAyX((({VgF=vqX7$=I7m$GCFplV%yOdrw)TxFn@OZRsKEKerCeoMGJK5 z*MP?)CiAr2yv4tasbNyvh1L~Ex;`D+w|<8V-(=VN;ILy_`pkUn9FuxH(vpJq*yOJ0 z_pW)uz2KNk^Uh-Xy;7UXZdASX@xQ*_I{Wd=u;-i)w{3fH@%Uwj6WlrHt}!lg{Bb<@ z%WbQg8?UaeUUhS`@}oy$8JV7+x9#ZRdHSc)T7UiSdGid<o!hhaE}N8E6zA>l-{gW1 zOw6jvE1e%C8B))tANFsD@%*Dt3?fVP+CTTjozP4^wb_2|@fZdnhi8x5g8e@~&S&tJ z1g(?~l9jyn^oK~LTKh>QySdw07Jo}_?B5@_;Muk3%ipe7H8RS+ylnSuv))Zxa-J^w zu_E*eueSNxZ}q85QnONj{agQbd#Y+z*U8qLG}G>*f|CU+C(ejkm#x5Wb@=|@t@>_Z zdlu}7zR9xkOX<FUV!I9>`~ECsbHto`Mv<?t$!{@`NJ&*vo%B<sbVtZFsr${7OW1Gv zy}n;~?E+-8TT?)+?7wQUg?#Gv_VE`41<nVoyi&H~`-7?4Hz%vl=i;87m!E&&dMBS; z&88&Ro?W|^?EnAc<KwMAtio-@#i#2=Z!@`jSoMX>CY`Ul&A)cX?GkBfQrot`&fNH2 z=Z=#FsSJ;PowR7a8D{il#*Q~1lW!NrAHHT?^yI{wo133LeR?}}+qN6~>-RS|JOBM= z|NoD$fPlgcoBf-wufM6L=B}#ZQCP_Bp^{kVQ~2r0;@{u<>k5x?dM(>uzixH5_qj*Q z>VDaX9no(Rdwkq7BIJmK#fJwQ5?6`q-T1i8h^e7lTz`|dx9;(6_iOE#ot=*P&j+pF z&NEhOxp4lpuFkuaZS$Wxya;a#cTm0}n3<8mVa4<+WzXKn$9gV4DgQ3XAf_*ukhW}N zlIxikPWAu)s*hY-`|QuWkJ&1#-jvTi&(LGCY?IkfRpu(sKPx1*hvlC5@ay#Ql}LT) zgR}fN7#U8S4D_2fCoQR{<lCE$;^#R(4O^Ek{r0zS0|z?;!`c_N%`=ZN{FR?~bpFqm zpMPxs?Yg1jW2(@~*Nx1RS!AC~|GH|)ljF@5t7Pwe184OtQBb!wV0rn62b0<PyONWi zZ$DpRWo2Y&xOsbC@BioXqc2{xv@VP2k-omVc3GY#XYFp@U%Jv>ivsNOf=hg4N-N6P zk55~*YL$?nVCMVC=r!B6g<TN5pnmLFm%6{-_HA~1i=LX=?=NiXI~?BiY_<88r#t4` z^|OBNc5t|JH$Q&wuSc)0-u(3GF6-Q<*HhBczG>L)vrVsYUHq_=2UHTh$^iFU=0@kf zWzT<a!QQ@a*|Jw}E#KeTs;usF;os}^uOA<uAF(m%M4xQ3tLx8AY7WQ4!^5Xfm~dfR z^8Nkw^{=jI-g}lAHeD~)#ntt8!GaAR@_!}2-LTB(<=*`JEl*FcU$x3>P1MopruQ%A zKRVRPBR{{|&TjGTblau(g{OMyYH4fh=!FI6_4iLZZeMX>b2xjoH|Vk$Cl1hR)GIf0 z@5y|BC7OJgjWK5Z_4V=n(&jRM{s{g5zW+5i)OxmVyO#T3f+_rdgPd(uiFBW=K?1}1 z&oyh;t<y6$E<QKM@~we*7W?UGymeo@HdcKt4Gr~_o^99EciC*|bmqrAb8}5+Rd$?y zI?3aHe0n>Go_b&JV%N<&uJ5ULUha+zIjkAXR(hxP&g|*){dMAMQh$}~Eq(n@pk$hv z5{Ht#{d@%uyQ}8L#*a_-n3a{SwzW}<j`$Mt{Qd7E=Z%f>?(g59^z_t?8#k`W{r)=H z6%^c$6v3%MJuKwNhmSkIf4{H1Wos(S)WoN!77D9p{eNG7eYv0Q<0mP5N>}gPViFmU z$l~hZu_BlE#kY?S54WE=<Kwv8Vb7M_**{l@hi*=HU$M%IM|PFc3ya(Z2FLC>Ni_Hh zFvx6Mu}G)Y`+}B5is#9uz15dx!p|(aB4GOd=A3eQ7ZqqLeCm;9;-RHegGJ7Mxjp;Y zj-;?!&Ihn&``M7-B|&y)kEwP<UHl$u`lw4jKk3vm@zBN@Dx9lU-K)3kHwoF3w`p^s z)I<O6j;iZgY^8T3zC69(T$Sh3%M@)lYs*+MadlZ6i^vO(x0)0>?(W`x?OK?($Ar*O z(H|z=yMHe|bZC?B>>5)OlSz{%mA${WcGaq^goF!i(L2tU7cn(x*|p?&`TFPYn<v+N zGR0u#TB{AKR=v8jvp9BF$<5v6`tvt|8b&Y7!E3)?9jU2(eDtU%)Bd`(<@qyDc>G?l z;CS}6J3A^2vrkVm>=yefo}<!ISDBc2Ieu@_nR&H#dU=hTHtksOc#DvE<@;3;uN^jb z^Bt_+#@}PNP|`$CJ0`8G=-}dqYkGJZW<A;K-M3P2i)>`|74D`xMPaeh+e6>)pD}OR zl#azx-b<w0)^u&PGt$%3DDV4Qz5eUnu-kUAUtG7U9PK=8e{NfRZg=d%Ri*h&#nazJ zFW_M~^0k5cRJWVz8tX5|_1@Zg+n@Wa5S8h0w9n!31;OJ|<!rs)c5w-7N=|EED_tE` z<aNJOO@%>2SBtGyp>%E4;q~1GKcB4MzwZ8?nboha-8uK8PSH`|^mOaBk&jm_TXy7n zr;aWo!!+IBr|;DzIyp6M-@bjx5|#LLku}fH&$qU)kg>0ex!?#ItN6nGO6dgy=r|$` z&6OqwA1>}HRaRBm_doG#*`|`02hN;H6;{izv~u&CCGzc0<<14dwTC?Hc78meocCA! z=S92Sd6)LdO%~hn(c|3m^_d%`WBQ*k*zofBFfiy%zik&On6+`khRm&7OE;&va#(r1 zp6HPh$RO0YX3f&Y<}Uv8Se@OzbClWzt9gq-_n>*@9@wGiJ58rT>hqLETKP}6Eim6& z*rDN27o+6dr(~bkQsQ>>`c;*kzG;gmoS1d%uTOiH;f!9<_%9dKGc{J%imf$iULYl* z!~OTqq-S?7ZGUx3csu*qz-6<1Ocq{yFOs*Tenp2z`mQC9Z)|)5TF$n&`p%1svzpFb z5^LxGZ(aP%rLKIw{ilzSU*GSq7SoUWlU+Wa@xX-(1<%gRZ0DC3D-mb`t%h%c6q8q{ z>3+O*>r(yStBrQw*Dg_!lgg@n*mU>w^r^MK+463cgkR{C^7vwWX@B952s?%X;Y;i7 z&aMn(VMw^#o#9g3+~u3@aoWQun{fxr+77n@$3Vwvr`NDvfG?v6iF4D|TC^FomSXcx zmbn?XCi#87BEBkJnh&&+V%x*F|7|YjyM=}t>EuM!)GTa1%<7n)scP1JGI0}!9&F;L z<Hr{0%u{GvslHt+sJWBFpvt?DJ+M>%6nEyT$0rZ|XPIv^-=kg4`H8MuxZAN5`)3(5 zw9UiUp3EuHYd^e5e4k$OrW*_l2{v+0|1GPP_sYyVcX@Ap>II?y4b6d;zGc(CPV|i5 zeDD8*mF+Gcw<cfjdOg4OThGQxCvSeAnda@w`lU8!>ysx&>dQ}me)ctbXVHoUo3{j} zs@6U^(fHPE?vf=H=jVCtulc_7-ie9I@9*qXejx%X9e=TwE_-b%;KWf|@;dC@&CQwa z{eFTa6Vf80Uq?m1UKd?{`mpl1L#=0YqmT8-uUCB$aOkfX{|COF*}wfw70tr<7CgNC z{WJUhKd%q%n9H`^`NU`4ds7$=T(0jIsL!(Hz7%Q8$G`wuQQ+Cwmnq4k8t8SA@&28s z(LD1~OXRh~ByRsOtYK)l{_v&Q%F=nic;jy^sj67E{r_f{{qr9l4n2Hm+1WXg3s-49 zd~NM^p)jh)=z?vD0s{{Zc=aM9Lk^>ZJ3oUT4|~JJh0Kf$J=fTz7#ma>4y^F#ZaZ8% zi$`(?bgvjVm=`W&VA%JLH*|&A?(-20E|)LupR@eqx^=!~hZ;{D`%pYpdi#^L&u*KZ zx$9|R>H6)Zvbao+>I;S3>GR_+oHL$u^6sittLi4pZE0y~S)dFazY}i>cTjE#SpMX- zw0+KuQ-6NCfwrIT+m|e7S2AhpQlA+GMHd%&NcE~daOf%)cieG*>vvn<SNCgbr9RJC z<a5#d`hzES&~D#4HU=$b(Qdh^dwy3)w8Ce%A2rLA%xiNsI?A5uFuDIBGsB6O-x(S9 ze39gAm^=4ipKS8>oKAk88l4w9a|M)lPGVdduYc;Zc2Uu;KTkMyEh>txubca0K7)|Z z-P@IJnVBb7Y1Q3#6abgx;nzC<zZX_)sf$iOx8&}=x#}OP`Tt#5;OJ$ZXTic26}M~3 z%Eg<{-~ZpZVA2Ne;Gj>Ihu>bkUnaY5+E1nVhn03Hueq8x-}_|U$|Q>oNVBS`p4S&~ z@M*uk_;?E!U;9ZV4zc#bN*+c^Gdn$(E-=ilIrz8hUr2+R{9$$m25IRZS8Dt|Z~6LZ z(@{T@EdBbwrZq>q6!r81!`G#7TY0A|U(El;7H;h7c>KZs+TU_)?Dn=L8J`*$-)^Zg zvfukfKJ)Q>O-LekT9I17$=4$As-~v)z3;p=#+gCSf86+fX(@AV?$^6_^LOt&I>&bQ zv$wWcS5|!6_gU2S?6ojnhJUwmSQxaEoERB=Z1`s|IK;~`+^9Xq#BhwCwINVlhao|S z!Qn*#gG9vtm49m+8Dg3=s?)7fc{mxS9IyQ)VaLGmqI%iYO0&Ae%PG<ezdd+w|L^K* zt?J($yUU+TOaEv48*)Xeu#i<dEGBki(uqT@e_7|Ys#oniw*80fzB7xx*Ux0x`R!4< z9H^*M{9+5<6Yuxze!cwCB~xTA3_LG5Mma{!k`YMA%wD}e@$lS>i~DtBtqMLr3*59x z#PNC7+EwX+{wB-(RR30}I57!`ncY33bL5_#l3CflMT=%Ec>Lka;dXvYnLdYQayD)= z-s-{D0#q2x^btF8#U>>5Xlc=|oUBz3-`mGsh^%;eE-0%ZZjtw~fa{kT7$zU?Xth*c zUbTdY;S7)W#;!N7S3l1eem85Q-chYf@4vjvuzlP4aPyxa-Y~Ue`WHlV%0S*&c%L6M zgR;W7^835y_3!txa`&|Hg$kBT3o|ypyrVq-;J#Y^yLa>FTTXuV*7nrV)C>ImuROH# zPxa5T-FlP#)vH%|cXwSqml?GVG$kw;Q2pZC+U&`4Uu+zYKb(2%R+Ox)tkBB6_kVf% z`~NpRC#$~v#P#*}-CWNKl?ccMT{d3vKR<tc!t|bn=8RRD(g)6zYKBd$tu2n*_3|rQ zz-6-ro`!i<dwKV4+vUe%@WETOBoE?bVThAIe%%`$bm+~G)%NwrKRs=J9scCU=kqUu zmj~_LbH=Uz-@PswDJiM9qHB9wT3Xb6U%e1t!Y^<4M_t>d{@<SX{dG2+%|Di>`>zaM zzHIiawsW&Y1;xx_FBDcR^PaAE=+L3JHY+Dg2(UhXg5S>W`=P^^&(Ga__0lA<5-~Zg zGahG~?l^gzZOZ<+a>Cl_oVOTOTI#P|u>I_gxLrG~R&HK)j>+IcH7CPLx$M7N)!UXc zNpM(MfCio~<a2@>?3oubbmH$<|Nnje!?}CzFD@?rz0i5`+qb-Cd3%i0&TMq;{*`~r z#LLrj&&`9u%l&wHcuLC3@}5u7Raa42vV6Jv3y~UeF|lVaUuwP(d2!sWC&0QiYuDP` z9g`;gI5$_Usjr#k<)^1P<=<~ho6Yc<|F8RRpOmP}5(b7V|F4%aGPp21{J3?Z^r7P} zhFx|n4=-C-%qd`HC{PvSP|^Z9QlLo>G{Nh%V(GS=o$hMoZ?8<ZH#e=?l2-HQQ2qb8 z6(5tPO}n;luC?$iS+jx%4r-GnB_wW~`*^`UG&D4Nd!DJO>D0-Sg-gV)D4ChnetRRi zKl^(9?(+ZYFLXQ-xVTr(nWMCJO%=$07b0&RoO|N(1TNvbYFt(vV7q^D#WD5@IL&p= z%KEvlmVbM$@$#VEoL1cWJO9kzTixHS`Tsw|Kff%WT|BDOgLX~{5>(RJ8J%@^+MO^x z>HWSnPdDkzcFODCDxxKJa_**etr3$>FN@Jy8WJ>f)~O>aC5_b{eLo&jwBNLN*PeOx z6+ZJnTh9Of`plNy-|oIFzGKxdpa1r0Y2m*=#lOGb|M>0Q=fnJI`DY_{7Cqfr{9Mgv z#)7qL*DhXs*y~)Bwzl@^8#gLGJvq5;+cwi=_ok>rckk+{yPM?4Rcua+N<N-+zwuVa ztu2#d*4_H{*7*kCBAHsI89x}dIoEJ645)a1PBzTz_3PKsQBj+Mq!<_&vN%l^Ffy!a z4_&RdJ?Cb^!KU{&_=0{`?5WzfulacY_HUoMB#fRM*ijgEdfHbr)2nMO(hoE+GPCg{ zXe&CDZb|d4Z*(xpyE8HE?3OogdvEqFHqn&+#ec(N^ZB{+KYu&FDQhw-_qo>g`}XDM zb_Oo~m6P6h{*ZxBSXkKcKG~@;=JxjXy1Kl)84L^z0UBV3G<J0KFtZD7%a=b@CcygY z)>Q+WnnUYiH+oNVnK3i>+m|izyS9|iwc7Di?7{1|_iUBa-9grObevqa>}vJ<ik$)G z$=d_m-H%_m5TLZF+@zPsSJi#L&+&ld?Ey+fUrv81E}4^SwtUNPnO9*}c2_4_{rWj^ zw)D@R7v0(a8vT{Ix%+_E#`63>yGpPB`%|3o|DW#7b3v>px>99I`~H;HJz}kUyifM4 zT~(8T=Bj}0+1j<LDb>M;+jy(Lyjb{Tk*BApp`oFd9v1@x!&csJ4Qvc6*uvKCy0f&q zvD=${TeHTUCnwFmzd!%!!;76Yl_{&k_U$e|zHu(cf~wp5>zDNLrT_V%>_6Ww-P(I; z!I#r>a<g7dpE+~p%$>*2=Wo*#4D|APc_Mo6<4YgS-Q)e={n&T#)xFxj?$fi)-Y(f( zyu0%Au8nhDC#JYE{S)q7<8eToL-lBngTj<4yh0O~bW9ZCYzdn5RQB!$`)QhLN=kJP z8rx;9Urk)&ao~J<ii=9Bgr;(ZlH$q<`T_<=jnv`~WJJ$cKF=cL!@W)0|NQlyAFg0w zoPV~Jf7#@d9Yy}X<j*NgQf+HzS^MGBr!V#YC-X6Yl9C-b26s)Eu>1MBrPpVq^VbF4 z-BlX4=EdwOCWp_ROSrTonVId)&Z@79w-++3(ysmci=D5>$5&Uv{vXHfNUiRf%DDz+ zW@ct(WyQB=cukq)l&YM!&}IGmYQ5Pn#k_odgYS6pPoMuzt>S)y#_Z|e*2e9tF)e+? zSzNqV);jA`{uzP0_FL4$WaJIZcTAAq@%(<$*E>&mHoDz>aId{^U$O1^=k5CUgd!)+ zpP`~<tNHbjuF+G$ySIugRtEm*YxuosN9?(I;j9nq*Y!Nvw`Z5JM(EtU<toKjJJWxC zxz_sTyXZC<^K)$-DLo68I4-U_|3v?%6Q`i3gxevG7NJQ`W$tb;oi@?*rFmXLu%z&| ze+eHC%#@S+eC(!xpl3@Bqq6cO10H1&uauq%6E&avGBYqRB=AaIU|<NnyDD_Ltc*`P zZ}#Cbfu%;~*R3lGuB;4xEcq<5U(R~DKmXaYqMK#87DQ#;-*>W+d9mM|9nW7?b-mTO zf9m4-^Ak_xocnpndcpbhw6wH&^OM8Og6g(>aZCHTW4^L!ZM9Qc+OqpszVn8?wq6h$ z<9FoPvv)TPLwtRwzSZHHI`#LJ16L9Q541d+JGWP;N#8iedoowEOy1*bX=~r=lpK|k zii+`-oo6K&c#`{PKBL5~SD%wV%@Z!P_{tNteZz+Awfbs*A2P?uT8o~{z2d$v+I?Zf zmwCG;8GLUQoU+mULHyM=*PE6uC)>Zph#y}+clUS4IqNq+uXOzJXzD~&%T7;Mm!pOI ziksyGZ1pu2l`?1iKE#o9sJZW{k^7y!`bU5M+hp_Q*<bfdKVDS4ls0X0U%dhZdgeuc zQ;JylUX_7?q2bX&MqY-1rK~J>cGOyL|90o!A2E0L%QI$VN}KapRTwNReeGNSuQNV@ z?T1t|`}TYLYF}JiYrc1{{>Hhjte>`(_HM8HTfe*P=(`(+Tau42%SjJ33BJ2~wQUWb zOoyJ5F#GH!uaC-Z(dH35vE;nVBX!nFC&R_-R+rgpeG?Q6oV<*8iGQcYw>PeCT06ys z=l}RIGekvDjN|hWS0lgag=!niD?iQuI&FgEWwrM!S08*R^fYeg=R+~^iz{EJxxC!z z-|H)Tjm;<H;6te`W}7!`z962RkyW_0q#{aYot0qw@{><L&H7X!qbK-O&Co`B^-M?Y z>cSnoJyx~(>1Q^VZ+N~p^yteEtHU|HZ%x~~;D}4>zL}s5$kpC1z{C&|yFTvXs?cyX zznuSf%g^3CcSx<g+&cYvnfG+JGxO{7zQ5a{>Rr_<b936;0EVkQ-QMkUWF}6(el+du zmSui#f4mf45M^2Y?ce(SZRh9TuYGjnTTXf)(_zl&?bGWGKdq0yFZX8CK3l<?=hT&M zZCO+@;d*(~%hrg<-HqDjJSvMAU0fXRcAlsbo!C<O>BNHT2E|HBkvY2__SfFe;})LS zBj~*}Wc}R2FTZN9w=GY7mdbNs@9qPKpR=#dJAB(~snW&`3i|$M3QDd{TAU;w(YZv) z@Nmb{OX5y#g5FDyNR(7;dLTZ($8T+QiHN6b66eLqn|BMZQLD@UaPKsa+}cG>xzkm2 z{ysD30i}-63<qY0kl5_&akW1-6kJ>+m&2YIf4D6s{{BH>^=<Ln-dtJ{c+k0RhHm7g z-NDPH>Zi*)q<;Fc<@`xO-`QoGB8_#~*@L$|c367yq@eHIs-z1Gu4P~6OR(-f^s&M! zzIxTJrzhehCHqe-xoF+qCGQfawXM`ZQK?Gh!B?rwMgQipTI{*#=;-3oUM6(W|88f; zws{)1H&j>H3f^3&q;%_vze|d6inq(QPr+X2W2z3t+1)ifF|EVn@$b%j)A@7x<kgg- zc5S)+V)xxR*|J}!x>*?*7*;rKU}a};5LFcuUmsgtdaUQ%vu9N~=_|Eza%a!Av3&O- zaru{$W7o=N@BTgWc>mJ*cDxLye*CuPlfIUAXNU6k{O6nIvTF5qpXO9r^^#vsCp1Lm zXWQnTYVTj#2~XVh^uojYrjyO*O3$28pe^U^d)CCr=vUjK_>(UUcAW=R&dv|`G8h`P zvfkcW-7oJguJfbstwLzu<lt!a<=b9gi;dm(CMY1_&Lq{n&(6F&Ri@F9_4q*J#JyE- zrOfr7JUZ&>J3DKm?DNfc_Ev)q$vf%l?d3Hk=Hu%#^XuQ8nYm?iy1Gern62H}e3P0V zD=u8%?(3_a8vO3u+-euEszu3hara(cUOqK=b&R89<0Ne+1_lS+7B&+GhtMh0zn8qd zwVGS3COzfL)&1EqhtJOcKexucZ)frOQ|4`Qc6a80(m2EP)ny+Zthl$g`B<NA(Z@$i ztV*Zcz414wtgI|&>bl_NtNw3#@a}G5{lCiGzrPxp*|#NGcTf8A{{4f8hPyX>`0?Z8 zVUgI^r>08({yyKxEbLgFX<J)c?XNF^P7Al2<lTt~4&MC7`|1BB?4UZ38C(Z0+M2!o z+S+LL?e_ICkB`l&tLyt@_N7Cxy^S~f@zblTlihQ8ct3FJMw?lbWGvakUi;&N#<s^b zPFLSEZGL)9x3T+l=gG;r&(6I)RwlMIYG={oZ*OO(pNskS=_$9YZ0nuxXCJ>zN#(5i z{%&*S=WQn^*N3@uZojfRe0`|)wEC`sr>Ca2@k(!+%?NUj3fMh!*!k!E`Fg$n^t7+n zu0E}+DqDMf>*|LuFWbvnO?mOQc4hGL-2cDh#r4<6RaHslJZD;QX;*1>-G>J&<m+ur zvcqcQ?;p%L-l!iI6Z7a%(V=6@JaupW`l%bd{M;O?(q%<iKY#o<Gsm*{^Ru(3G>=cS zE`K-2uD0sur>8mWj0_A7QXIUXw3B{z*6Lrsz83!eEG}t$tmury>C)HhDy!qUxVk=n z+4BGE^>;b#Oe-$A^%#8rTwGGjoqH$Z^5Mnmw+kPf-mznjho4y7e!H!&@)rf&ojGI1 znc3#~kB)SPg@xVSef_}yO(LSAswyfSE{mR?o^GCTq2a9sDAh89Yly8XDo^t7R((Ei z&wg!nd%bJ@#-E>e`_H>`@3wW(zdyx}j)ie?-~9Zhfvn%P%zyjY)57|3H46(L{|a7S zmSW9Uvu<nl`geDw_m{u#e|yU`&DwiyLUMBPpC2E4dU|f$h}gC{WZyF1*?e*~Gmbyr zD9Zv0cAXM)28LDBOtaT*%Q!gOe0^E&i^xtX(^dO3FF){{e5<<Jy-!Z|(F1|!PgC>L z(@&J?HE3nMymW8pPXFb;);E`QruEDH$~oTX&&}=q_wDx2+~VJUyj0KLw)u*l8W`j( z2Nn1$>OKUBGc;(asHs)IzgLm7@8ergX<%Xa?Zm{3H*dPe?tVAJ&Nf6rV52P8f-WwO z0vWqIHE(WAh~8dw^BmLs2~$H~JSuwBE`KI${k!93Vjv?M&NqRwmguIszxB_aRjpgM zEr)%jV%?vMN@mwe54XMNm-WiHd8z#CEA1S0rWK3$<Yca{i%k}v{y2xd(Z8V3GH`v| z-M6>1A2)-do?*c(CuS*z1*>+{&8>eCpk#J`Maky$a$o=Q`F3}|eZT+T)cpRQ{QI)o zgc(CDW%^znY+f9<H_4j4=G4#6FK=(>&%Lw5?zSVySqygK;O5fNUtj-k&ArWWo-vq3 zZvDOZ`dWGM=UJI6?Gq2#Gqb<jS)|(iHh>|td*Z}%eX={&Z(DVHM`6JJI^7$7pxnUl zf%Suc6GMa6!~Or|*x2v8es^DZYioARlM^o{s|WAdtN-<l<cmj_4xU~;ed0vE+dCOn zb@|PmC1-i4jN@qazdx3@1??PNU6<zF{r+F~?%lh7ClkSL+b0Ni+o4}y|3^l?{Qswz zeOvRD8t1kdypl=VQoVb&e_tBA`_Y~~Z}#q~+9=D#FeUx;G~M-adxHW46Rl6MUtJ$x ze``x7BuW`p$bc%Y4ewuFZFlceVP)e>w)W69N_KmGa&qpTz52S5LV_Y9&tGQRS8n3H zy^z7dQ%pDN$ispgejgq8?c0~*4tCKBlN-!Z3=Orfug7O!UuP(_z$<M3zFV_Q|GvLh z`ufhzgi})<*ZyLO-SMFTR6ch5sQvDVbS>Ps|Gm%O7gM7D{kwk8R{!Gt*TT<hk7<Do zJfH<CM<U987G1lz_~hqjr65<OCSH8;;NZmN{{K}b?|pGS|N9cp<CiYUftstYCK~j# z2y&>pxEQ$|5cl$!R$OxU+KoRpjPVByob2Kcct|uhOoTR#l_U=v^n6%)YW49&LY))N zPoM8Eq&QzcMS^j@{uGavnuRSo$9p$dZszc8apf&7bx{r3H?OC1d&tcyriCtQ@vcfw zKL4z#TzhGWi%{arRZIK+ELmh^HKU_LXnNGD6)RRm==p}6lI8^YBH;D{MqY*ko4&qY zfAfaPOpA@Sw;i*#IyOhe?|!za^fmwgf3x$lcAdQZ`O)X+s-V)qDy4AWxp~i7A9jbk z1$|m*d;RFg?C0-lXH1?E;_^!BWc1&p9gi+Y`x{D0et#$GefTfmQ_~umFRSA>shqi6 zdAxVZn{*fb88@O|mTocW=<sl^sq)@1VfLQl=dxEHJ=wy(3fxu}?LMLOx6C%<#}<Y5 z4$b)YjNjJ=eeyNg#QZ%r`-jCZuW2f0Y7<$OF1f4zY{v1fjKa!GIj6e%&aJ9&RQ|52 zlc`;wxzpt1)zydnrcIl6s@5Nz%(FP(fIPZvg~q>+kH0rHwQZJdshwyz@wwhS?+)(^ zS1zU)y3Jqc;v&hKX}|k@$m+!>S33XO_fO{;;|eJYnRSlY#@xHvf4!VC@AsCaD-Yjd zSd=2aZW^Ee>AWR<&l^Le)n0$$%)b5pYrgKTg%6*m-Ms(AXBS(0cEZK|yHksLENX&R z9BrGLdRuR{#m#3q_E~G=Dil=`AC%i#NcHc?7u#8BdijF);;+iei=xv{U4Q(ga`TiL zLuU8a6JEyotNpev*x{0L+3|dS;9OQazF+@;O;J@fD){l?s;b^ro-!|+H8-{kfFg6j zHc-*h;Ja_%bzPk=1;0Np+}!RbYj0Zn@XN*hJ!#gbrCnMVDK2)``Cr@F%UkxM?Us+) zWG~mGM8~*!GbGnke-G!MFTZA2@3!lq-hEwXO}D>Xzxi?5@~39I%QMTKO~~1Cam|Du ze81YR$x1$(Fhydfi%!s6%hmZ)epl80pSjJ3Pw?Zfn@`qM@4OXR?K|zKze@6vAkC-U zapIX*U++AB%lOx=nUQzo+ofeEt-n6i<9}~Z(MfZb*zjGkmJ^S>@LW2jKKE_Z#T!$z z#P#pxt*$PgX7kcwtMKm3M@RUcikFlheUYmD?%vj#(i@r;Tdr=}?V`1qf4|k6Bd2zA zgZv(_c;%j|uU&6>7#OyO)YQcN{>J$4UmvKfPEWl2_s{Ro&(1`@+dk*5g1pJL<=H0| zJ{A+J%3)^=&}mDo`~Ua*)z#sfWnDI!<=xp)@X(2`{qxI}Iv>A&ookYLY4_u9G0@p! z!F6&B3=FMa=TGHjrW`2aVhB(GCn>4;`>&53v)a1nw~x#2<}&|yi@9$_<c;rCX58NP zx&HUtJuaW-yww4@k%58XD(AKb3=9eGQMVq;TIa2gx1aD<;mvO0^7JeJdy}k>9_Nw0 z{rej0zxnlXx3_ASotzYxmpAvO9}C0%B|CORxVpB!6#*Nxl?hb5zWMNV@4Ds74YQ}o z-gdkZ9>3e}wxHd@C!wC#*HtkxZr-z3IsFXB?XB9^POrYsZ$D$>TyBPaZL?<G`t|ko zO}~$ZHgf%MIl#tEWdn^jiE*$j@}0eC@7~{6)^@L*u!=W1`Cgx_v$}uY`?s=|DJK}! zmv8f)_GQzSE9uta3^g+)jng*Bf-~0wF~`Tu3=OPycGpc!uH3m>_`CS)<;}}K?kql6 z{jFz5t@ZU&r|J(j75mRmN(K#VfjT4KotdQ=9B#TSN{YY#B69PaEn6*f(pRoZIeK)y z-4yw!JKq#&*;?&1H+j4{%=g3n>d%|i#KceA873cUDO<Vn|L1S-K3|UyTpRWC*YEp3 z*0eHaO};bvU%T<WdJnbVSL~BNY05`Fx?StWp`_LI`EPCdt7^U{$7TLkrw2T#z1hx| z@?E*P>|d>o+Ww$ROrRhLi3U|M8n>^lHD7Y+dBudg?Vgj(-dN~P5%Qe>;d6J2iYOP$ zp+!oLbraY85fFT7eo4D7%BlAk@7tSGJc2@0G*3;JpCtP9^L&q|`Yb<PCtWH%dyF^N zJLHUrr>g&_nMsQtDJ@&!@xjIGs4LS!;m$oVh4(JX{!Z?;yTQ2rz~#&T{{4;Q<6D-O zxA5++w-&`}zJ~c64qLA*xxb^)*YlWxP-nn_6CEDMI9Qn6lsa#3c-Rr3lq}IE$W`=% z$?Xuw4<}B+i7qF^4U8hsUF3~UmYiABxhYUdiSw|BL}S3Gs;!@@o=(=9wq(0s)n=!< zc@6pr5{mKj91onh7t@y5q8}P(D>l`mrDk7%laX7*wyZbjjJ1U8x9#1lYw`Op^O==@ zx98T+TOstQ*mvW5V^CN*h_<ttFf?q+y<1g$N@Vu4vs-WS1%;lRw_JUxV5c5?>vQAf z(<|>k+2?a-<GVv|kHnZxl3%sL;$->JiR?!`_Z9!QnqOb}aazW%`Yiu7Ds~A+@7;NE zH?b${(b<TfJ}+Irn+B@vePQ=GA?sA!`Numab)R;7vrAaq;`rmfZ*R}myA{aGf3*Cx zK*iqB_sh-1-rmx(cQR6fhMlL^T33A7_wjMRiaNLU$FmG8wxxgvQ#=mcIsRwvtQYTh z+Rs)hXSWaATdTY5M_iE5L}-n4{HFUf*3^%A>my_weJUPsy4j{>CnWhL1qlWg&Ut@l z0lUwR`wRE9^*7gj^`3V0r&aYl@fQ6!$;fR{FYWJ(s)g!AN-g=LqGt0VLa+G9-QQUt zoh!3d^1pUJ?DEgIJ(`hnXLq<xZL;KZS@WPx^9A=NB;_x?e({n*W=+YSKkNxpCQpo= z?z}1_LZRxvgP#5Dkj~)k8yW(?Me~CKJ7DPoMqY*mA?$p2JiV*`oYvo#!@ly6#Vx5j zRkx}ZnYiuly}IP9w)Mn)dy_XC|M%qCv9x`MXxi%4#aBD7T;18*dp7EJ#0$HnYux>L zePqPe&be@8+4_4EUoLO4`m}rI&Q~!%=b!bxb-Oe}w{F$Kxb?kX%bVM7?)5ldyH_FH zdG)+yecOIbcX@a9^piuao{f!%7cKfBCKfHGzwg7Nqo=(pv>8?z^0lw_TXOK>HiO*z ztFvD#3EupgD`WCEV4hs~<kL@IzAW6qCiZuCbk<(Gr`KjiOP&4Ner{gU%9Tg2UV4~W zxZ{<}_H%bG7+l!!CSS?-dBG00wP$tS=zKYvy87h_FMr+nAsbUNCw!V*G+AQa)T?I} zOs)0S{vx?jxKd%O;^fj_M>hYu`{jPju>*_h%e`}j+Vi<;6YupnAK6^K;rYqU*FuAp zm6S|PuYTuWF|EEgy$&?Q=<v1;ly-wyS?<VKY?wNCF5_*-RVKNyo@b^`pXUGV@4L;< z9WvTX^j1|IF}j>wKlkjUtk+&i>rw;+0}D5PnHljXLa9nkOkB)+e&<pDc~3Z1dpO^} zdu3nCH>X3d%Xdm|?8R7_|1&x~!c->OO*UvfdMRBf@!VsZjV?}KH2yn!1;x(J^PMHR zDrSFy^;(5!g*EF}m)XC1w^+a5wsMni)GZx<|KC%!^|xm|m6ni*o|(_(V5%(Gy+mna zfZEiq*2w-(E=ec99!U=l|DxL^{;A~Xbmd1!f>zF$7$|(0?d0@xN1ofCI+tPGvAg!- zx7z<MoLeEIMjfs}6L&l=Sj?^XQS&?R+T2v5l_4r(Vo#oS&eTp_Ehu=ge7(A-))W<` zRTYyQ+tnHO|M-#1?K?I6gzD^nR^~tFPP=X6b^Xnml^cAl-RAi#iLLxL=c@Us+P}PR z(`w7U-@GJiUgi5{R=ug}(vuScm-#$-c6OpqYvYp%R~1h#Tg>+2$kG_muVrtK-bx20 zXodjM74Vw+=u+>Qd#m67dOrW6vRlN4xl6eU%ZlSRR540V)vwxd=~RQ={5k4cB6GQI zwx^t&bUwyhb!o!QP2Ru1-+y^~`_W5F_f~x~`L}HjgV!O0Gw=8R-&gfDYg==O@unvy zW=DOy8~;DS(B8=C`n`RzOU0wMWK5htKYpn`Hv_|gbzj!JndY{`k$r*MVc83yb<?G< zd9}4`OXjcUD13DJ*fP~f*QxtA&7ApeU#)#x>t7Wy@!PlG|JwiGdgkQMKW}?6JA75r zHr(_&?&JSis<XCny|4o%E{2d`a4q5)b?Y%RyHMTFrNXxzSILM5B`#gJ>?!}|XJ5^K z^|U*7aqVALYg1A1`t|kYdACe{oS3-e+S=Od>-PQ<?PhS8di>&r2YU<`EL?an2wd4W zXmR+vGBN~AYG{z=l`8o7<6yaI&V_&wjZ2p<{`wL!&E}DP*8P2dug|qEPMgjtd`mZ0 z>f`PF=ilG%e*E@s`i%`{Q>FPAJk!+EJ9p|-lC`U5X=$mlvhucIaAbsp?*LW9o@MX* ziVI&ZSk_kmao^d@mdmXdxO0~On9;La(#*^(zSgQgJpb`A$BP#)^YCnG<F~g+^Et7% z`jA%-d%$NAaq;I*o=gd0JU`D?n1dx}zdYFFs}k=T*cbxZ_EtZZx1HoOrz6(!{$uOg z@6CSX7;HDoPmUGM=k2o+4vpWsue0-{`MS$Hi#KoBF#p?|&iGAF7VZ2groTS!^t7+* zT51?fL+<V>oo$kNsElip*HZuacB$5&;XeikQ*dTBdUH?q`uce8?AOO~*jFxc`quL2 z+0W=32RBTcrptS;lEuv4&h}l^oLO0S*=|{Nt<bCZbK=aYGkbQI9zAHKRazwf%+90c z!m`xamYbi4gz2U~FME7ET0gSr;_cs;{{1cAv$wimI{oj<%V1wIFx+^5dIAH30)wZE zW5_CXP!~`{&+y~Loy9L59S`5+3tGB1a$j3VpRBdp`FMW2+FxI4B5pLyvrS(+f6awg zzyJSK&$+#E{xYAH7B}v#+j~+%Sgt>O=hl$W(6BWxtn2n{oqql3$H)I~?zca9d$)f( z-<$g{!TmG_hJcqBK;gOL?(WA@W>5U){Fv&$adl`LfBj<L_d7Etp59S-O-!t7o%O%t z^1VDfliuH*{rz@+*E-ef+j19Am~ip`pUF?2mTpWwzLs13Tg1ji{j0RLfffgYnqpF{ z{}*#JEGXDre%yCf%e&9w$r8^z9UFyqoiDO|^X5`;@YLYdclzz4R8)58Mqm5gZ@+HF z%v`$y1;>+&3=eb{=H)HSfn@C!o?thwVP+R9Dn7d7?@#TNl$4t5J2x9?zskr;OG(k# zylBq!@byogNXlB7$lCuq(IMC_B=l+Oe8vT{yl-B(e`Cl0wkhl9e`veFJKtIu9O8C- zptk8ztAYo9@9(LZncaB!y*o7}WsjC-V47>Lu5Mf6l*o-Sv(2g$75&=zt?%yred5-w z`=?(kX&W-ES{7iQoSbZK4kDA2leY&{n%}%}LpP-E#Elyj%9iK8S=%3f^R?#Z$L;D% z@@`C+v}xh~=oNd8|2gNgJ=#T6`d9m`se0g~#&91rV#mN*_36pYlan=--DYf-U2;rN z_4oRl^SyqmGxw(p1Qu>wbLilrCl2fXzFfcm-0oK|H~v3+*0d}2=&6pMOXtkFb#J$M z@yDd!PfshKJ!}5|v%k>oPKH$+?)%T&T(+zZG^;tYt}n&xIAmh;)a!%WpQX>6o%`z@ zOYou#A)76iX-c0sb8*d=7dvlGnWSWYdcAUM-kpqRFMjxehSwMverSOUp9>ckd%Bn; zwM;5AT=#HE|If-+BPFGk0aqNtqhp+Y{jGa*cZ<dM42OW6#KNCj7P0Y`9#M5s(LVFo zep*m+t?kSmEgfCltd{+%A#;SqHkd99a69S~*B5Z=7HjQ^Pfu$fJzhS0=F2{r${RO- zYRr#6Ql`|f>cE+aW_$KA-^xwa3iRR%mEb8gt}FkYwt2hS604vL4NDL)bE>SYK-Q}t zzuMA4bI%vP>p+4vezD$dMh1qgO^e+p|NfGBanDY(+m5UDAL>}}x!2k-`p@mZUuzFJ zzPoXcb*IbG&V6y=?f(;}&rr%zn;-UP{(Z-HPww>>cW8Y5A-At|^NCWy|KGU<1((Wk zJuA<V+4<(xk(K<xU9&FieSDDV^|Al!cE9?!d@^Ho__w%g*M6z{^>Fj_#BO<Uf3f@I z@b&M$@Bd$#Xf48!E%WzJN5``{=jQ~QefstEb$Ic!J*M@2H)p4xRJZsgIPr0%y^_*q zF88xf(trLGoS3YZ*T@D+s4HZ^C263X{j_;jt$)q6JnOg?CnrALRGIpG$7cT7+a7N- zFjEK$f4)kv&~(eI%vUc~2n!yKJ(F`QY_V&xveKzD)mb+#C7zrwJnPi-6K86(GH%s- zHUx9~o~??Cvih@U`7zz!>(^G@eO?s2?1qZ^`GT@M^XzLc_tiG9i$9-cEeLW01H*yo zj-c{9uuslcP03_|cKgP!lNVIlHC8)aK3lcdV$-)ny&-km6ud#L7;n?ktCtoDed_Eu zv&-Io)5|lxU(USQv&W40UDf(eH$VG-S)BCJcw@vZx9{_|AKzxno+qAV8sNQe=7kjp z_p+|umizm;nRUPH9~+xE+xq(Bo72@rL{IK2ySuO8VdXYqaKDg&p@uQ%AS1&94flSv zuWxT3x*+g7KZNaTp7-|>?b^40zdI<s%Jz1tHQTPPbo*+yH~-5o|6aep=VEeVT1Up~ zd6ypQ&DQNaQC55Nx@_2QVZpWb3wvHnO?Yr1jG28~)Xq<z9vv0;o9h+1J@3JTgKKZ{ zL6Q{1hfHuxD0X#w`_1>0He17c+i{ioRI5|}-i!1f4=y@-{`td;#&-9v9&osQF!BEX zf8|kX)d$OzAR*Y`e*n}X;41uCbnW!?^;O?Y(yTp9uk9{>U#cBu@#XdMEnWPqOv1v# zOQ-(kx^}Ji{Jgmj9v9dC`}1MLhAZ~}Wek#9SZ^<65P9_T^Ya?J`ENzOJYuc81a2OD z@C6r-9jB)ofBj-&Rg!V2Y(iGg@yD^feal{6o*KMv!wL_Ti5knVnHQCBFD@{cYj6MO zxIF*v9VHR_>lXC+*=}=Y3{m524=$~fTC!}}u`+PRZ^+^Sm5{AFYAjc$`zvn?4yoQ< z_Fm4Y?$1fvYCGGnw?)K6E7wFme*Jv;3#X|^uWWg^F*$jA?(Uzj*FQfu*ZccdS(6+I zxpGd^_F1!LZ8WTF2AjG-%>gt_{b}lyJ-ccwv(L`@_uh6_a(leX5msGY-bLYFeBa*w z_){b2fBkm#)IZOT%$PA_!GZ<T_2aeHEt=YUcG1_@qTA~%*S7K6is^@4c%(FOg<~_@ zzJ2>X>7So(FDkO-_0!Wrva)CMV=51^C@tEYo<Gm_cizQxEv>Al^59W-28M=D;JJ#Q zdhzFK{_T0Px7^|UoR>+NH<La;Q$6J$+L?Cl&());X>oCJIXQ2dSh-6|N^bat@ZQ;3 zeEjCk%FD}q>;Lavxa7&qOZ(W>e17bIdiwgU8#gqT%Ru7U!L{@T9|J=G^U>qa3wM_0 z=FZ-0Dkrq*_=SM{KR*)JELr6;+gv|#dtPZy&YMH6+!t&A`CPkpO*?$umoI;|E_rhE z%S+)YVdd}def6GJp|KWjD5wk$*|%nmlk(#4TT+#kl&0LQ3|S#xFB7m`udesm=@&0v zh=_=2{I5>9vqN4<Noh(9xRJ-e&;U*wE&QenB%gJDI;`QbK5i~I7uOBHz`uJcKF0iX zUArdg__1SJ`}H91X8?@=O?~goo00qW*D3zR3a?&eeSLK`+1mB%;^o&Je!9l*4SEo) z1kHzbOrQy;Q`4u0-q`cAz07Uj`^$$<sz<J@gc`;W(FmI3c&e>2;nmB`ng<Em-?b0E zdp3W2K+%HL=l^<jvzofiXwSak-oLwQPwAc=J6t9<LbcxG2OGV7eZ0N>|Cj81aV1YJ zf2zcnJl*>E<E@Vsa)~APm$&~ZwZ3k^Rh)bM@bg9f{blPCMYa_lKB&rFdx)v}!>x~1 zERVLmyrp*Y_{ul4pDfZoe^Om%L;D};w5unZAKM-}Wb@>{*&eyZlZkSB<Qfz0{A{jw zPm$U2>cPp6>%<Soc<*1?k@5N2jNjk0&xt*OxGEqP)NKy<DP_KH{&e+!2OO2TwSUgf zo#y(pM^z~+HOn>m`|<bk-kdAHM@MZ@G&0(%q?DC;@mSVP`FDKZ{K8Ik@r8O;UD~_x zcfa0dFHc{yO&gT5GLu|GzVU9pv@kVWd$na?VDTEEOP8XzZBxq1%yM%{$xCu|{>J{L zP{L|SjpocZN59{HU-@H0$5L-d6f{I}LBnbN&xh6vHct|Ir@Ay<RrQXy)$EB5nk!Gb zxNxrg-g(QS_Wr3mS9B6jc6?-isyt;w%0mB$l!B&Dhn%loytL@-!H>$*RA$VawcTjz zuI)=!|30`We+DRwIy4k@=XM<XR&HRv(d)*A(m$SFCp^@YtSs++O}f!J`KkBLUAOkt zcqSijOV9@|O=4gOShg#Noq=IR<1CYv@}fuoA2?{o=wl-|@sIy^O&1Y2mxJ8?f8=Bm z{8IK!N(`Ik%a?Yiv*XT8O|Cwk(1|;%Uz#%r20GXXe|Yx#$$`)?&DG1c-K$&5FUV@} zaee>veR{U4+TBtnE6QJ7I02qz=KcA6zM<D1jupIJ@7~YadpP6ys(tS*)h3^`kU5vG zGpYKL{iUj38NxGtjy+WQ_1k{7-QM5V-B$&C+bmr3FXrIM|8LjqKlym>>#2A9Z7N>M zov*sF;oPtH@+bN&>;CXvUUog=ci4PMa8r4~E^wD_YW}S)ex9C(nAz<<?|a&<&KJaF zd8RBNM{7mmr1Nd6Dt9*jsy&r%cWF~`db4x8o2>0D8KI)^jVBjeyO_6h{l6cQ6MF<d zu=ezHr1Ur_B&ckfvsilDF(V@-rAdZ7hdEj%UD9W%`FZ-%O2{bPX}=9J=I5TRjqGtz z5}BeG`f$tj$#MQGBf^BXCmt63`Eb+L7js#?`%gaSYOUEfA(5qKUx1R}r~5YHhYWfG zRxJMY=i%l}tEY0Do|fwOc7N{g&n{C1=4Z=Gblk0UOMP^H+xG3O>Dtd0gVXkkDo{zW zqUP={Nh^yPc{hdrR$l(iV({_I)bqK@OebdUW;gb!IWYat9ndT$8(+@WRPUZcPL6BK zvQM8|;$~>gG)c3l{6q59+t-u4i-abhGLxI$va|n2iSoJfrsJkw_rwZ(-T&S)>MvN9 zvr6Y&dESNQOTsFN@3@t<&P{6B+5gkp^y2;E`pn1M-k5mVZF#=SqVDaTy_xHmhiGVP z@0&iwC8TieCX=V!({wj#e+CV+wf*=qEkV(|^7%RIRYy-|@`uFFpDq9V_vud;W`CC# zocPA^%UmZ}x%N$q7H@uXwCLx}C0=uOwX&XJXDc$=^t#AnDi^oQsUI$2udiYP_qURc z^_&Y|Z};ct^T#)e#8-(hGq1gIBW7E$!`YOK+f(Exf1cCv=9d}YtU3*U_t4<()k_aQ z77)xV*pX}XRo-OZ_3rBH%8R?CGGEmHk3GEP&Zd<|9<CD3JmH^l;Gs}z$c&}%!K_7> zj^*CW-1Ozn@?*>RvYFMk)Y-Z|E{){#2aRk!4Ug#dx;#ZcV%w1vZeP9W%a<oUN|{~! zX2q<khfgQ8>{6S{y8e9anTKWuufFV^Yj|<*TkFd_QP~0$cQ!k}JkK9`^-4#Fhws{V z>};>5@vqSO^BC;I6-uDU4d7sBzieCWCSy0}#>&gvN?)%_O__4<pPOss?z*`0#uwB6 z-^=dOiqo0Aw{C8Yu9fqj%IBPmY|Lv7LgFsHeex&2Z&}2qP2Bps_P>69Uti$vr|<vg zlv~<A`>}Dddh_~Jp{McOGc41x5*EF=oL;N_@oy}5-F}CX?Dxx^_We~nm2!0b{vRh^ zR%QmCWEEvUbol-M&;FMVG_KueWORVtBPD3%j804GQyxdZC*>`P^Qkc_b-ll+V&SxP zQAHs?`)%Z&E?IJ9<;^b}rEh#c*=ek4zC`VBbd3JoUjaIkx{e6x#%_JGVur}Z5Upol z>ukN1CVL${w8p(sX=Baq?oF3la!cRqefV&*Ou=gTp($OdmAf9D4xbmk;)hk?%Qv4? zCFZUB@o8$vqpzD!?)+TTxB1)O<ImJmKK;6L?9&7zHyzViCZV-^e_zz$ynAo&?`?m6 z`MC35==9#H_3G`d?#?@VEGJc_FSveW-OupgpjkYUsjJ?c=KuwIgRa(k&>TB6gG2As zIXWe!wxutF)C6C?xFT(Dm-zJ+YvMXNkqw*VgF_BoR$JEbVx~)MynnODr<V8?w^pp& z_UB}X(6SXjTswEgF$-~Vy?$l(bmi$8f86!2NM&8o*VCz3czE&gMZ0>xRLZQJ@c$R9 z=@kvT-Retj`tQGyS=^B_vC(=*@Et30W1r4n+<_a#`sMc9P1n}d3e?xsS$BVe#Kc|u z<{hh*pT8#4K2j|E<!1|(<WKT@FBn~UJWVywcCYQG=U3#P_+Qe}5y`zHu_@)G5bK^? zBexGPTKg8ZwZunkR}BC4qqT40JgvhXFIiV!Uz$|q7-PFG1gv0QTT5cc5}~ilszkoG z=Rdj<`S`0zhsK$!Q<<248TxScFF$3V`bwXxd+V%E7Ak_DxL=!Pol<twc>3z(`!hWM zlXrfb^FQ^y#nr24J^hbqTK@iSKX;k0LBN5f7Z<r2hp&$d_~kmIU3)Fhi|`{;GCqfN z&k))w-g<uPtgPY{e~eYD{whv#(a=ztmsa>>+Js~4_HR*rX<X$PqdRF@#^)6sij%yq z%z9Pm8KzPZvMBk6Lvx2^(Tkk(hIi*Zt@;1=TT|1wqeoR^cS+>jdvjrDv9W86Y)CoJ z;XnU=zh51`KJ3J+PxV^ar_;VehXQ%+Y(9vJ=|(+y{`~vdn+yyLtEPPc4FPif+-=Sf zA_(p<G@d#8RY^%LJ>`sDY1W_j`@gR!aFKepPt9rClh=Q)R~~$NRC{sfPMH#&`Iei` zMAw<G);alI{Qia6Gru41mpQF#_2^x-?$3+^rdQp{x9M~TJimKyk42NV%_HG23p8vr zY^GbjeOGI2{o%*fHlHt|b$&@vH|MP`(X_a{#CYP9MZae>uk5V0{cgXmV4caC+JpOa z)JneIs%Ootubi9Ip<%CV`uCI1^~E<&F8>xY{mA;*jo%$JC%G@l{b`~Y@{#|X*S+1p zxAlE^u*_J$1u>m5$)FrG>2Rs}?%eV_9w+<sZ-4#jh*)!)8of76;lBH}LvibUDlTk{ zdDgM}yXmB3?#I2opMRCQpB7#|-Mw}WPseAQzaRE2Fkv=rjeq`n!f7$L2`V`^XY4l? z`uqRZ{J+19r}}IB71-STJ@&C}-@cCu>Z&U{Jc=&f{rRDH%AKYSsoct4k87S+%{$K@ zzejaa(RVhNRjcBoHmi9$9oanP4%b=LMPX~D)<v5?xMe#1_4Vb8e)HsLc!@~P*taA8 z%gdRjO>2&vc-Ncu*&5u3V%W+GYWQ-c=d5}BB4by=!E(`KJ7n|(-REW}<fJ7gFZ@5H z=(0qd^y-<f!^_l_l=`f;H##nVpL=CeS4CKE8r$DnIz|(tUKP!f+H=#oX3CL_=ty6# zsGBDbY&_fivfg#I>7^^HmM;yilK$HL{CsDJ$(5bDKDWNVy0GiT%h{48yl0|KvePbH zT2z?)adC{&CG*VtsZT1T-KP9|v2tVQ;agLMqo$}CswoMHYW_JGDLL_a_ZQQgv~%wc zuQXV7@S#-1m-qKJ3SI}zSDbcF-Mw$yg96^D*^xIQUvztKuew_CS*I#_{q;L4ZRx3| z#u=&Qk8WDu`0Vxku8nHR&NoMYu&4-UM)iFAer><Z$}MIy*_O}yb6#wj*xp@I;+=8z z%RX@~m0#o-|C+sf@1oac7q2|Y%KRv`qL?@8>-)TGJ;D7Ra}Vd<xwU5N+}3q7Ouj7L zSuVHIENiK1y*5|(JfVvxCW>uNyIJ}=ZN-|?OcmYRo=TjrbdJv4JlEONLP}~*KX^8Z z;fffjgQGDsM6FisoOsvL^GAOAFAdrl@k2%5|Byt49p{g`$KN|-XbB2>swl0D&{-%Z z%f(#B`Q>)m!<~CSZr!^3+?_MigaVD7r@j_nbct&di<IoVH@}ajpWk+&=ZW;s*l@oq zUZ*Zx3ia;WrG5X;mYJP>9g34gyq5|kUVCga(dE;xn0-FKd~|A*&IyZgJbfCn^U$0h zQ@U&ZzK`1S^lt2j<>$8vU$k86*|DNUO4=;&%kSi*{MziR^1I9C?RWR(kyeSf5}yBG z!&)_3XKI%ur}8wfqdh&Rw&$Fk?zt4Y()NVc_Iy>XyZ24){dJ~x%~W6iy(;(8L(c>H zc6GO%f;E4?dAB)rdvW#^-AA8y=2maHcB;>&M9og~@{;X)g>Iz?-85dgL&5)#kCtAQ zQni|>{mCj7k<PED?1O)9xx{a18F%4pxcS;GCc5*YKE0hG(ix(am~yn|$IOrzg-Le8 zo%2PWa31a1@xbuEW7OVfXX8$FtZ3okk=Fbd1gfYQ7#QyHS358>X!OsX{rUCZ`u%=I z3;chHd_RBR#q|HDg*Ub(v%RVd4z#>^S9$rXe+HL)>V)SjeQ#KI^4<;RU&gf;+fT&Y z6VLp1`2yP^<BOWjyE0^UF8Fp>VeOtd_5Xcm*;aoGXK9Oidb!$xTgm3X$NU$cKUd2w zRG)m(V$S(pC(XYvsbBK-%SGQ*BfjUIf3}{y?xt6K`u_i$UtZp|FWI4S@&EbPfA`*> z{=2y5-d540KmQdLe^^!C{p7feeO-Iz<?J=J+CPuI`>xC%x9j+3IkPpJYl8olv)M6# zJmk>ZV!MDb%jOPfuG2^Be#O3q_#hRppG|iazf|*WpO_YYtW0Pp)7yiochi-$bV7cl z$(ROto;<B@_q^NAWnON2TuZ;dOW1C`yTzX?o7p2DUH`XG$TWA6y6{wilM;;a7}MwT zRg)#!1gF%g3Qjwx(m6q2z$*pPkoWe_xRihAz_L%NKRyYo@F;8A?<{E$<Wdz4tFqns zXX?`(g=V0oSP3bqm$k(7vR15C*3yjr`1t54cCY0pi~90zNNEdv`03Op_~EBhr;CRD zUMB^#Np_*cpQ|=npI_ng=jOL>+Y)}}#~LjEc7NO7%0*rs{Wa(RmxC6~GB9Kbf!exL zo<BT%CqHIk=Kq!RlF#hRDCg+gx6m;)NB!cFBO4xlJGDLke(vpUxvFcTPZwBx-S=#b z{ttnjY2T9X++{DzS?1@<<7?8<AtZd+*T-kyBE19bcW!MmUKx0%uOX%Dj_jX^uiv)L z=;CLbiqrv6yYoIE?(lKP{l8Sx+28HH_M!00RGmoBM7YRLPRRa*fKS^RvaMcSpH|uO ze1F}B6*Y#DbKdKpcFw=IKmH%b#ZT;0#Z;%;_L)QrJ=<sC^!Vx3UdNR(S9h;m8I$?5 zBy!39b?m(J#hy$#`nzJ|r^Zi5<)5jji3)yy`BL|wQ{Ja@bIU`zCtsFZ5w>H?rR7V~ z?3Jqy9=YeWe(_Sr$cq;vm$DYax&=?{x1WBRK3S{qm6({pmw(`HcEc<d&|uipmlqCx zJ2$sFXZZ@5#Kh?r8vb!bMe#a2>uc<Mu{C?6nVFfF9+&B?g}K3XKIe*+Hod-Wk@0Jx zjcs0QdqWmdN8veQcG|pPOP#@8?I_>&!w*+Yp7m$tLL0vDxf;qwt5!^G`}h66sZZ6P zUk4X`3X<X5-Wa(2{o5<2<P>kc`P%Gt`LvvSmO}lb75@s3Kf0`*bVd4Rah!eOmuEM9 z4wp%-?d|p2T)!ydr^C-jYfZQAh_c#q&2O9K@xE0n#pC!qS7cwBS^WCz(y4Z;SA%9B zc{tlCeunvDftl78Gp2{FS-s57#U(3im5a-gsDGugRsRpT+tmMiy5AKX7zbAQ|2Gw9 zV9@H`{(Y6AGuyf-)AJ`*NZyXzcXC^<Vr6B|!i5WkvX(Ae=Cw3PRYXb2*m!f**L~0U zo}N$7xKZ@}UP5+u@zPrUoZDiTHZ8S$*U)xKaWbf!RQZ;parySMxHG+1%x;}uw(do> zRoD%;@S0CvtDO0NvYqHJ3JP+`GOKNqN;${X`F=ru#$D5&$F8o^zPoOY$K;I8B}yAx zmTTKps>a2uh<1K$|6050v5(irD@*n_zIpPRy<4c?S!kn&mXP;}U56*L?*EZel4X0~ z-mhz)?90Axe)nVY(sy?w<?QSuN~P^0bfyX^KmH=Q>f`>~zGhz)B7c6lxOd+FP2YO< zm8FT9_n(oTeDVOl_~g)vH7^tH?%rSZ<4?lX+%0=Sy_KAIPwLDpU&pO0yB0S&^`CIy z<%e!dr(c_x$miKP(esGX)p?tLx$Rtk{rmitRgVOG=iF%QSaJQxI`(zT_GB2POvx-d z@rq@&>tePSF+MxJ_Qtkfwq~AxY3b?v_5W>;T-#Rl-yJ-Vnk8z}BEaBqGwp0q?axg& zE^G+gn(e%L#g)n*2Jc^8jaGKEaCJYf6SE`0-QE47>-zZp_ZB!ZmzI{gidX&kkl4;A zYhr3D8kPG0-`~5tN^kEpesEHF;nGy?qqY1e?AKhl&|z8pj8FdG;-*y&yq{mT3)Ias z2oLAt`0;1?(rZdTCr;e??b};BqYsANV!FF3Hz${reEas+IX1>hLrsZ+p<&ZQ#TEur zIq*!aS^RwlrLNxI)ETd~-(BA7dY+X#OdznNq~}ssR(5vr&KTG5lP6F9{IbMr(VX{< zpZK{QR(1)wvMsyw+x5ySqiyroN2<))mTxxuzT}T7udgrvcmMy~IaXg?Vq(^<fB)cA zFSt}&zyWGLY+$bb#I%on!K#NJD@tG0d}emqqI<j|D$H$;l!vqPV_|0bs|y^Nm2Pdz z_4xhGH|-oxckkKXzuzn7-g*(11|A7$IMvoJz{J47;IML<ZgkwvqSm(}ALRc1`?t6H z`?US@3>SZ%s%_8R>c6|>=kE^>UBZgN`Jo29YAztTb=S_;O>-F+RL!(5e>clC`$F@& ztZ(n{>x*^&{{BAR?$h1!vx^rmx3rkiCn@~sVPWIZ9B}O`->z%Hz_38g^X7&618%cw z-~Ev>R#FmbX<KGtHEZJ>t_4<|Jw0>m>u;W%9PYA6N7W`n#IEo7V^J}&vKJQ;e|~zZ zrKKgxpP98v-ojv0?eAmVVt=LO=WkCw9#H%DSI$##YWX1mD)krK;wUvP<1Q^J;o;>~ zRjPKseBwe#(U;RDJf>ybs!HzreeB(j-%KlhHl=(H>%xWYPItFWmsK_YdFJ}_UzVFn zO&LP3^vQ1j|7UU=UvB+}1?JONA1j-qU;O>u;<~?O+jDQfxL>bcSM+I`uAy;y+s~ht ze)IEIx8!hbDoE`A_EviLjyZ2GJ$)~0-S+ME^+|8R0nU(rKum^#A)wddSL!)4)32w` zoH=vm&g19ix2JSys4gve;(Rv6egBy=#hZP#&*<2TGu+#d<oe{wO7*&*N5B2}xbf<` z-##w6x6Q0-ZfF`A6@Pj0p#S`z@Auh_)7#F@N)2DT`+QL|`)oIN|J=)N>+Ap9N}IcF zlm#c52fUyp<M1`<nTK>wZ*On!+`D(omI*Cg5^%Gl=J@jqmv+ywe|<+J)s20{qqH*| zpTF$cQIh$-p&{$fYDU{?DOtNWA~H4Km1iGFPw!slV`)~9pe;Y&@zj}R7Hw^}($D+N zFkgRrj%9jmjNhKBqh$)9m~JrATL0mDFayJnqP)C3ZgIVkL;p5hUmtI7X7;RTXP4fT z88dFIi?#Ok75MaIE^IA;Z)@1i{q^<R^X}&4<cLJEKJY%7qWbt)tBmceJ)niu-|Oez z=nLlDmcQRL_twdy-EXJszyJL1Vk7hSJG;X_+^^R=J1bMuezp@U>(QM%=DfJE@#MF+ z&bPN_pDB}JU}*67Mp||XY9%o+1guU?G1y!Eo{Qh#zOpFh><c^Li&s|4hOd9OJ;`-R z|M{=m`OeNN{dH&Omjee9P1pbSaha^PwZCuPuRlM%t#`lu{q1g|HDn}M&IvRQ643qk zyL|nf9RjANSG}jJmA<;t^VVW&=EFmBtgM%AZa)9wRgt<+hPwQh&)qk-XjYvTYu{HJ zy+PW)(5fs)O4j!3(Wg&ZIRD?-Ir;l>`M;nwtDr5vQlQQn1H;xU_WxCSrOS_;JNMwh z!9debWe-YUvvITvr9WR>RVCHTwsl{@!-GANiN@(=g~hMWl$jh23J$)zw|d9ct^b-> zpTE0v^8Uu;jLB+UcjG~BWq9BW+WN)7;E?;|xwvuBlZOuvpVg0@6{EcSd{JZL;Wi#a zX<MrwUtVs}4DS2>{(jNrWe0QGgC_m_ynDXg-{6>-yy<%N^R3J0gEz%61b9E>%V1zw z@k-9FX2q&it6pdwJ$kfDk1?QBCst}>&P~<w^4-1C>>KC0KID@xdv&|~`-zF|6?>{0 z8xP;;TO0y%eqHUYD=XF6`0nhk`+Hz#@$QXt!S2kG1?OikV^dRIP0c{RwN+nVX)YIF z*bPdmpSvSBE?VF2?!RrbhV$O4QeB-d|9-zu{QOKNH<#~r;gqun9A1BUIbTf2!aP6j z$6V{5*5!PmpbZitpj3KA37j#eUfYo9yiJ+mij02zJ}F~06_qFNw&gl6^L>4yOh%QH zW5>qg=WkoNt8;Fb6@Pg#!8pAx$y$*6+B(^U+`B)X&+k`Pv*Y5C$;w=L9x?;ELU#kZ z38-XUJ7K!|yW8e3j&xSL_xG)|z5BeQqvz#i=kzl#_EeSbKiod|+&tge1`p-8Id43C zb7ySGm5`ZlTIb&Fd+=a)&T&wI+i(js>%_p&Fzfxfxqs|x%kJ<058C>6xPA6!S$EH( z;-iz*<=<alfArZ|K9?)&<GY>P-QM0VKYsTw&+UshF0Kr|yh20#XRzdS-Q7n(xqyLT zg(zrvwBePvz{8jOjHed)|B^qKV9o6yTK4cz^S;{VS674g79<9Je|Pp~-(s8KWis_2 zAEhQd`0#1s#l^bYa|%Cv-Mg=*Ql<M~#F3|~WGxIX-QIov(o(_XV=Xqdzve)Sx`4x= zX-9^u;g{8_i~>0!8<-~<f(G^tjFglll^<}cx~K?#Vs+~5N$ClwV_C4xvch0t{QkRh ztxWe;6i!;1se3D=_S~G!>F1WPvhii#i`o5X$L#3z{P%WoapHgfB;7c5%*x;Y_XL6E zmzQ7ORd!cSc=BPW|4u^u=O^~u+WbYM%9+|T_g8lQoA-OO=FbcBUO)P=wfOrzo;&4h zA3lDe9jVgW-#2~JToH$tX1QH*=I>6laK1e^XXb*%!ToP7PHirIeYRJ6aZN2dzr=-4 zcNfo__ic09&9gHE%YGCr`m{MzP}zN3Z&%UE`1rlq*WWri7D6LUiW}5|Uh&RCW}VeU zw)WeHw$!d)x3=45%DmrKZd^&sJ<#IUca48pwd?Aa0_X1?oOiq|h~ep{FMBMquf5z^ zy!-7<<EFPdUZpRCmaTrRX}<m3|KIV``Okj*DEZ~G|Fz^}EipSjILy4cYRa};X;;^s zKC`aWeR`6-|8LnmXkIji1pjm&wW(c4oIveB?$n@_5i`DO_^V9Yauu{WHvM+vix<*O z>$LA~nRH15)Fr=}^PDw6Dg1h{c9_e$xV!m(e>LW$2d>()XL;~4nb)_sADyPlCqI8@ z`TPF+_4iMm)U?pk^S8XYYS~=t_O;RG32$$$c5asw;8KN#!7R6@S67FFRy8%eI)3(S z?!!Z^R#sLy>?_m0y}y5dZM3<xwDh)S2j1sTL}Y}D%8&OgwEusn@vV;6QG+uxI``X7 zPBp!-dim1DKi_h{GQINn%ELbo{~q72A9}R4b?Lu9p9_6`zs|L8zj<4FGpLfwng||? zWCLw?VqJB*43xVWR+#wDvnejJs(BgoY-4gVcsIPv(j<wrPhVbM7VF7Lj-4r9_x{}8 zMrXFR`8?~7n66e}XTQ8+#meAiGViZuPv5_P@#@vOw>v?GEocKx<}>V@8la)0shMc) zI`!I$z{OUj8{Ud)#8mwfR$u<0oxl6v-|{5gJ)Ku`zb)c4*4hcGu-Du^6K$IRYt74l z`~FScT@;#}bZB=);iVqQ#LLUumn{+b^Y!}o9Cc7btYH=dDB1i7J9zM*l$6w}RjYE? z6Mc{O$*x_y*8WOs{jV=CH>aOBF)^7khbwD#^mdlTZmg?UUj6w!J{`1f?|9(06DQ87 zClxL&pZ|20q-pTwpx`5?LN83y<;%VGV%P5Zo}QW<TvF>+ch{GLik1WBpmi<`S_hYS zPR{yScOhxx59jufkdP@eS+bVb|F3=Uq~yjKA9IU}lF!d><s1*(_UF%X`@c`j6VtMf zPObR)D%H)ct+TW9kynW9=CqqLXT9>9SF@)2``q1Syzj4_od7KfdLLeIWMptq3;}~} z`S<^Q{I<HQ%d20`c3<A1=<fFRc57?v{iUbWud}aUbaHz4?fw4S=gxij^Rsj7hTlFe z!OLW(d%60~`YaN@$n&!r&tZ+czpK(dJh*m!-A<FNkp0!)Wp|e!hc<Lp8G@^dPn8uF zD(WC0Eh+i;@Av!pvTrXgZr{9l^Tdf4=U5g`nmk$Ef8L*ai{<3x9zJ~d-tWVQ4-?9_ z%iB~06c*;^zmMBn6>9Tz?{e*fS6BZ(e{b*cqjUb&Gt{47bY)pvhga}U(WL0<rP5K; z5@U-wk1n~!^XYc%^t<nO^_1S8du`Xc)2psdC|Ov<?V2pE`Q17&c*Qb}mdsN<o-^;u zPrkS-f0^CU*FW2jFE2j#e9rYP^1ENZEwMYks>1ch3|7{;-#>JG`%-dqfBl@9GX*af zN_;rXe`&{#FOi!+g!{5x+f(^>iAsEY{B=&@vh%acJ6>9VQf5H#LIz$2hPLM~UU;~i zJ9mzglT-h@nyPAQO3H_yf41e`wz9Mooam#begE{s0u`ao2%TxCpX&1qbRTsDgQSfS z_cbPZ^vPPQiEy31|LN3i?b}<kuP<7>I9_izb4c4#?|$D|Tdtp9AMA3(W7%c{WsMhq zPEA$+_aoWi`8hM6^q&T~w@lt_zrRnYTiCt7FKqRE15l1+V91gaS-{A!AjrbnT6m(@ zQX#HZ9kJCloHI^8-L-S4s*1`S+v;gYlXT<uM1-qdn|Lzi-@kuMjSU@D-`@QE#4yoA zMTD!<Luuj*b#V@sU9<9kM#oiFFZJ^FzP%yw@RO61gM)%jT|dsKb@<NC|7T`>{eEYs z?e+EYM@q!fRMbwX``)rn^;({JdDou8gu;!>x|C`sq@913ci*n+|G(FFcjxaadC7OV z5EOh1+7dIjMlCaDU~o8VT>9$D&CThr<7^}Z1Rgwp-acJm+O%oQmM+cQ8l|qT-s<%6 z`TY7W7bT^jl_4%ESy^5#f`Wo~ca;{GmZn<hU8$+7+t}EcK3(_q_s9KrXP!IM^QR{C z`Z^(N>+Zwt>H-%hD!c35-FGEDV1AMF75-wbm5jUdejPg-e*9O()#ZQg9J)0vEGI}y zZt|`zeWkU+y+JFN9ak+~BQ@*AvFlkWseWEdXL+s6tNr#_**8fkiLG4vkKzAkdyAg- z_51r|Wz~6f{9X~5JEM=8fkD1+_NVBx7TbK5Gc<U$fYxF$uw7mis(m*v+idpQ)ppDw zY<BhG2@fJWQ(m}7*QzPW&%fI*XUoYa_iYzr<w3*eQW|<{skRei_xput+*Ldq{BHiX zXLDYCSoCoA`WUWxidM_}qD?B_PMu<EJWW1at<B@T);ImA8b8_X8PASso9ElEJJlcj zcWd_bA2&AUxA9~?eJJ?${rnRp;3YmQ3<DZK%l%e(y7hE$aqr%fdwWHvuzk7}cXHjI zKq=|jaxyk&4mSSXW$4RhnfiO}o{;5@J0tJzdh@GQ)2mo~Ij5q1nThGD*H_jZZ%B;w z$`g~go_lR$`|R-PLXoFRTX#-A-6Hy^PwiN#^!9fbH?FM=ty?6uFz@cI+uM47{d^v$ zba7$+zRpA|aJ&5qkA?#?14GEVOP7L{DIZ{WT3ct7;Be#K-c5U}ZIAb4o-UC&mUE|~ z?r4|r>aef!1`Cc#x81d<{$9Lsd!(1z#@DNb&fEOmqfk>+@S@Fmrc25DJhv#X-0OM1 z9q;a+JFz2Vx9|J&x9xc5@3tz*&e^r;#mC1=sfD7ovu34#d~{Dy@!i3L;=jLe?yTKC z0h*WZUQM%NU|^_eC|S>bWp7%;`RDDetw)a^|6F0StT=Shn>RUIqyC=K%g%nS#m6ka z<oEZ`!|m>IyGqpU>T2fO_4yo6JhL&ms4?OF5>MIX{_lT1n|PM}o4V5Vl`dBbL(7$3 z>AYO}+R~?YjZE~{vK&_t_i1K*eay15of!+CbZ?3dU$bJ%A9=R?_vd9~Zq)qK(=)fw z$*K7MuFMBgLA~O(Uckt3z+g#`X7|ygjS(&?0vt_EO&uO;lT%Yt&djy`et4Z7bBNi_ zJq^dXz5VMyObnm@{(kt+A4k5tO8tL5zFFJG^Ws(a-sowkrn-bo3A=G)qf6YEJo9zY z<;xCr*Hu(~-Q@4{CHK~qJ?ZBkbaZI@K-$2sxLGq87z}vi`pxV9RNP&czIV+Uot-gy z(@!rA(hNSxkhSZ|l|TRf9_Heb^IrOAUF>Wl*>+DmJ43If&r0>>YL?V|(VIMDtL&e@ z{I!<PTvD!Oo%!ChP-b&^bnW9~pI3*?t+~ENo{{hPqZfhm3m@O=mEJDAUKKQy&~V+6 zQHp_q$60A&OKa=K2%VWe%dDH4k0#x`eOov%B4WlnCWe2ji=P+${?5NTczIZj&Hh+x z?PZS*UM`={_wM#|F&UdRk(+<%f8Vuh*S)j*qAOR&Ta+c<+Vamh{aF6ZqLrV*R(5X7 zkz7};`*4Zp?-}PnjR1zLg6BZl<FEh+3sa**`P(N?mh7K)`stZgrWH4Zgr6R6ci)zC zGvWF=L*H3@9^2jJzr4&>e44KHz9iQC2M4CDmpPEOdA)l4`XyJnxw)jxGJYJFf7jYN z-)F{#-HFbZuOIzkp&NJS_Q6Km!bkJg=(tAQ_~6!SmudxG`x>HrgOL|>!hx);MZw<s z{};~NWy{Fh|5ILXCvQK`w(ybM!VQPd%)EQgAm{F@Qv06&2Oq2!7Zb^g*;TmdeTvep z9fdD8B>Kt8U0m*W*XW0n=`Hj7HUGZfzZbsl&cmYS^K%ZGgNGyL9R~Fj85*+G&CGI7 zOvr6!+j?hfw$IyJ@?ZNJ+xf5B*%{ha7n$WqeA;Em)tdD5(o%7~n2dWz%o2WiHK$j^ zMC^F=eQA8%&!<N;gBLBb`SpcU($?zNg@v4FXYYSxFroiic)X>WTHWF2@1GPkA3o$( zQL!Zv>OpQ$c5iriGQ}u8J>A;c`tMI^{p}0~ULQHKWY=zYKKXZhil0j?+iY<Dy7{w* z&ZRMPuD@o}5b1iFR5<(D+4>n48-pgtczQ~H`g*<k`}_XBZ!a#VcelHLd3gAqm{_TH z>BU(~D?k70?A-VG_<Jc^tE#7`{u!s0KttEy{o;E8%nS@{DpS28b;P=lUfNz@F-QE^ zo;yqo`ZqQ{p0&GrNxQpr$o$TXb93sGl2T@y@n&CKbnx}DH9!7-XUxlM{`GbB8-uq| z+rP~>PXBjj=e28J7cH{cw3*w+W|4OFMXBXsYyG$7$^LxYe>eSH&;OUpn<4p!;TfcX zaPaZRWBu~$uV!_gIC;`@_0?ZLew;`#ihX}tm*K;v6DOVoE?#778@p(c&5U!0_UK0I z=|)ca^80;lJ5T1<w!~YLCY7y?4);~*Tl@C!?()tRvDT|sX!JL;=T}v}T`_BE_O#T~ zzt+awtiQSG@#Ev~Q>?&SiVb+&3m6z05<OHVZ2*HSSFRj6;<7Nn!zF6%wDZq*@7yUk zabN4h1q@fOZp%G6Z=UtB{(N~Ut2r-q&R7>e+qOQxr@#NTzx~&W!yCHA_04iGEjbk= zII(qRWLny?=4R*j_xLVel#`RYIBnXp?CW*0Qzf%nB#n37x^d<6mpgU8%N|}^yI9Kn z-;|f&5x4_9Z(vy~YHir+t5%klFV}Z!n3#kp2u#UmY?$uq8vFIjorBL8|MGG9@*;5K z`h1_~=e8X@c=(=8(87Qj^-)Ww`dUXvw>mA{EoZvQ*Wti|(${|aadQHuN@jH#Cf`z1 z`LS&2-S>B^KTp*zp9!jo85qtufXWbthQ!<3<E4$$e(xxJyDi7@>&%W5*Ui<ecPm&_ zyr@1KG(+k`wTso=yV5d~Jzb6-omDjV)RhN61<g<Mp1Wh?Tk|6RyLfij{e35<XwDVW zf44W`;KZ-5&+iGp#UFBh-kihjwXd$Ny}R81#6o9DXq>Yx05u934lI$i4zjUXWNUl7 zwY4|F%6sdEgo6`byvPP6uDiP~*6)k_tMJ^fv8}^nZhXZ3OM6yKS+h^-<I>W?d+QEN z=w?0oEAiAXUY#zlPLJRM_2-SVURg$5t^6^gql>#J-##Gl<J%nv_D|wA30bqF*gF32 zGSm8hJFkDgU;cCd|L*R-ec$FY*Rw=z%PDwqp@mO&&Hi6m-XT{)mw^{*IfObxLdNj- zx23&OqNZhQyj@sUop*7$y-ig=ZqA3(`g`5`{=9!Ls$(G}RPMgff6EV_j~5^0N`4Lf z{<))T{koa*GXtxhXGJC6-0(>F_4bp}E9CB|E&4L!!smXy^?xmO!mm%4ldRqM;?}L1 z7q{mvU#8iaVt8@6Tx|5O;xB8>*X^nL%HZ!m{o>-q{PO4ioZo2Alv8&1$B&PXk8K4- z)cpFS)fNm43<r+0f~y}1F;Jb?0cw)!-7}bU`suX%i6>KZ#JUeZ49Rn8c=hD{{`_6L z^QG<XRKC78(I<VSm|pCz$FHRyKfRiFZ%>@)&i{F{4lUYx`bg=cbJHJfUVD4C#jV>y zl9Ds8C>j~A4ZnWo(4mfw7ndIDyf$0bS0<x$YS-r#nVTEAr}b~Y<~wof_Z69^_i;1X z%A7s(>e}k`iN((+)^6VCJ-zzIzTA%;9TWflGL<$~v$B+Im)#!~aiinq<=u6^bLT|V zOnC|3IUi6O07?9vE-S$xXl00k01GSY)b~@pmj3#*B}B{D*Z1qkkCl}|A`2cqE_@TQ zZTD|8x%EHK%}t(hE=bp=GU(S?bHlaK=2fq|+2c>|yL)(od>DKCv3ogB!!{+qT)6qA z<@Tbds}3D^b<Hw9ZFSxMmDl05yX<dn{C42x?8xo!?i8-7&)xX{)rGmsxv$JR-rvn7 zqnq08D($pAPGd#*e!o{cpSXQZwf~uaW5egBN3z%YyFP8$YASDARUH=>$ZCJ6J@4wO zf864AmihM{&abmNQ377%zCvm1Oi)`+p2OYUU8$(7Y@T(wUjOmxh0~8e?v=N<GclRc z@ubMI|G2l0&y<rXetv$t82$YGqSl5fO`MX?@*`lb{e0`38{5v!%`JZ~ce-TSt3%h# zpWWJ8t?ut<Vzesspk~i5U7ojLWqU0;++Av|1Owlf&KC?^et+7u(#V>fMlZaTq%L%J zyjXuBef#=ocb6@XZeE}NU(CT}OVWAk_2<*B_jY}Haald(%#63~e7-9}U;El~e7YF5 z;lSBLhboTs{Agl28(+_x25FCmSb<BZ=EAZvH6?R%^G+8f5w1v`X+CO~OFcnls6njv z`FXaHI@cZ@?VdYl&X1aXE=mj2mzQz0I)%)C*gSpW$AT*>R*31odVkM$+oPk`_`4(K zNXXTxT2$OfpKtne{r9x{`(h<0-fK9UwtwB~)YEK%fs6g-?lP?^DG7C36}im+{jSW* z7kH)5RaU)AfRy1OR-kU&0RtAM#<0~_v$opE`PZ*quQomZVs6>A(@$MQq@=V2I8N~= zd@^PTv1@(waYf+8(pOiy`s8vG6VH^)$x3{FZc626zO(b+o0Y9OUBCDG)vKW^gF@X_ zUH6=JQbtDRp231>^W7^}1X`Cb^O?D6{VJ!cHv9I?&%bY1b$i>BhliDCLRv;s!OcL1 zhE>K{At7bkihh^zTU!?|+Z@8Jsrhr?KEuUsTO+r;IL&qET-xTz^Zzb!6`gQ@SLhGE zukRK*&sCYUu>Nmp-n~7}p%YfMNm*|CdT;N%>Tf65_<AZnJ<){r1vfq50UfT;uxdeo zhMHfGr-w&(r(|||`kH_}r?cN?&ATq^|8duO>%>E0($b6V{}rtMV4iYzS7|a!(^LEZ zIdSXbj;2+(pE`6XK79SZ+Ml1wJFSYAB>VYYZ{_BnH8XR$&&wZrpZ{Oazsufmdh4xy zwJWAyKew;eJm<FAr6WuD_I_*;2K7i+bVmG0OlM$N(XcXj`MG(vw+|g^>R@7G`t#>c z$#tt;#tTaScP4I(u&w&y;pKHH-au@Z(b6SLR$P4*UKSZ0Ej)4MN=-pm7nhRP*UnzO zy4CA2<7KnFnEHo@B87z?-`Z;5wf)l7RjF@Y+$ef<WTnfJ0FAJ9F+U$1Y+mj^f7<`; zEPI0d{QUm@`g(m$q;u;1U8?+YcWQraIdbSw&&!NZE%oPe-J$7cXMNRhV`iw~$vc&A z`uK*?TqXuB!7>MChK9s~oiXn2$6H!jetv%by027CX=TW)S+i!%n6YAif|-iL)!F9x zZEM#qjj(BcsSv8Aq?C3-ATA?g%J%KsBXph>Soo-~GF%t4(<tS{gwog7bfdRbyt%Rd z_SWAX_fJO!1pK&L-V|RK`R|$VcF+jcf?tOvFEB79NO*dBN=i!B*u}@!swwS^Sy#>f z@a5&@rQ(~kY}Sf46yDz6K5M3AWhHO2l}G63Pg2ibT4r2Zlll7ETIa7n?K7{hyF0)B zpJny8p8lP`d|brDz8-lr^YiobsaD|mhduh>JbCy*(ayZQJWftdrHLmlUJTR_;c7kf z_xJbB5jxh^yPMhhU+Fz5vb^lcxa!<QW%nbGUivIgIJUsCw(L#E@r}}=35kgZlQQj} zz1rN@>S}AfyKUyonKxL#t?k8-=Gn(X56}Ioz3^)~?}N3>9|VIm<cwq+J>A@X#Gmb& zaQf-8Wu-Iy0(E!n*x~}NHWw^AEC}vTPjy{gd#Z#*?dtmex93H#tO%@KrX0fk>{%LD zYtu{cG{=WHaM91OLL_>-ny}!--m5YFS6A}1gTj!3A%TVK0w~$FmA{_$Y4`hY!h(UH zGd(X}o^$`>zQe)GWY+BoVL0Ozt6TLs{@4*;!K0y}5+LO(q#$i+PZc4t?xnlaHb%tg zZU4i1;JAZ|Rmk$bclBHN{1dC!_}SXD-ko<g?|fSKqZh}r*1g;HcZx;V>`U`@|N4-X z_gk}Y%C4%v+j1{2JMxlku@Jjy=$$Fwa>}aB%q>h!XPg#0dbIP#od+RSe~vfp<z_ip zxZ1YlynXel#4h2DJ3+h~!F<748~$(G8yCE7-Lq}!n@`u}Jvhj0dU-x*h=JiAH^^@Z z5;1zy&p$7=keTQK>#=H0UAAo5uOB~N=+Efm3=n<vIKQPOCTh<Pb3wtvsNFB>N~21O zzD6i5dZrtjk#po}$Hpmh>J~?4t1J0=iz_KTpSCvR&8q{Ad)xa`^=uFP-ZgRFn=LP% zyxMs3dcKwQ4uQbUVtOvA`?*#2F-LD(v~jhlptFXh@zzLg@kMF6(Sm}O);lgt=x{jy zPtNbx&Zeew#-9~IVS2y;98rfoyu2P2SO|5x=!m_Rep<A1@?>GbxpuWt<%*L}N_2As zgx3B2n(_V~pHm{clG3E*DyM_;P6ba&)%-Z~<dkXiyj-TtscSxQa&dj}^J!}*iSvBF zwJcllmRYXXorku!C3^Tj%$v2nWTNg1tK8Y%-DyWM-)_3T`t_<OPhOjMcBF8#99-!# zWzI~mCyy?kzIpSYYGr8n`n|iv7J-8Jn7jRd{i7!*Th{-pY@2x=oPgQ_X1`=$VEE8D z0X&4aaN)wDoiR!iIa-|-2JEQ+Unka`nx0<%;eq4b))>8XD@})|ULGgBye7TBW%?}A z`Mtx@R3)Xm>o3=IYV>t1N`F67TK0v{6P+-PFZH>f-$WH!Zpcbzmbh@>!0E1Z{|&{L zo@V~yyIVS^L&I-FdR9<E@uFvqPv?D0zdmnQ^rT5IR<ED+_t)#d#s|g8$$w6=GB7YK za61I*ZW{2YtE;aKTfJJJn}rF~_|IbJkywzebD#S|A~)~eCy$bzzWdj9oloxG=H5w} z556>pPUl+itK;_O>61<-SG_NneDm<4n*REXpPz)M&IKLC%%H{jO%N1m5|?HgZ{Hbn zPP+XI-x0RwT8h(8&$p{RRnld?GIn>_<z>Dz{Q|F^df#8S`dF|1*DobEH@m9|eO+@V z0Hiq}5**_U221|bOx?Ow^0H<_hlZNkv0Jx(P4-{){`{Y(&!79xGU<FNay9n-y}pSP z!)HRyoD*$f0!=YCD4J%6+1vd)#&2Kp`%AF0(xN+)?ept@oi4xI=~0>d`%ACc>_5Br zKiYO@|Nh%4yTU^Dt+x33<LIup`wKKyr-|RaAv5d3;rFwrxww?XY-(b$-;<?wNhEvT zoxL@4uim?Q?Z$-pYurA4`C?*fnrd}4du`<AXMfcL<8JMFa%cL#`xbjX%a-^5ktw)b z?Rax@$g&q%2ik&b)Bo-MXn#p0yQlZmJgc+4kC*q{{+<=}?T^;e+1Ka4F|01}R$4S? zh3NEsKN2sj781`kaq}<Ik59MUeJjv<qbzJKfb`2*dhz>$zwHKZNXlC9YPUQK14EYH z%8*k@8-LX7+vln_d1HhQU;Ae#{rTt9H%0`loU(BZL)*5j(Eq~fo7S$GwtIKJveKr! zD<4+6O|1`KsQCHWG&g<|7nfD-mOH(81qD}rDlQg1niBikbDP`Z9jo)N%kbKVJm+RN z{+qD*Sy(A|_tc#~vy>L~Emq$p6u42z+&tdZWl7+jvnRtRKRdTBR8ZV|jg`HnVAZl2 zjpySFpEEP{?Y}W?ySaka=c8^<uQvRgeQC8yuxZFUMa|#K^Yhl!21KknbsnVKYh{3K zwTH>6J9FAsrEk~xR9sv%RqN>87}njMhaVjZQVM$h{7&c#xs!hmu}yoXZ!&GR<H{i0 zGod2cBITv$XYYIcvujtn|HA55UHxow>o2cfIrAT<`SXaGHd=bS_r844X}k8c|ED*b zSLo%&Y<>Jto$u{@nR}&f&MqdkzZy$l`~Ck{eSg(&G0;lz21iKEbMR@=&l<b-!xKGJ zY~=Fa-PsA6Lg=|Dy5Q?xqnSF&%E|BU?6i^V?>xaUby2YT>^E;_8mE_OYgU&1`f&Hm zm)V{7{ce_ee_yIpSo>rz8-LlK9sk;#r1rWemONYkLPTlNqn^u~n7E7YvR!I<q0@fu zzm(6CeRa<BwxzYbuvqy>?5v&B%89%EM3?H#-T6A~)jD1AS5Nb~EkAsCcXf)B(xP+I zUf$LZ`+L0JT*@`iZ=I9#sy}n))U+y@hc8sjdj0aH*OI^|&z@<8q%zO0d3tiQTCdZ> zpr_C6R!`BAj))SOHqCePdac>M6X#D}uN3t3`RY?^w@m)8*?lx=YwVAOa~@3i^L*Ls z-g7Rj%Yw3QoZ}Yb-@ev2Kq#>D)1#kn{9j$&wI%J@`TF})&;9<aarcHm#koT-?kEK= zy7lB({A>N$BC3D3`e)9n3=Ug!+jq^BHjmFDznAOUEw_}~W!e1qMV*|WZ2bPWRn5_j z|1Q;>?LBd!+jTl~dRyu--`|=s>pK4CzO>(YJ^bAL<qEao-#&|a&$q31aaq1-z4=?8 zB@^1*?j_oDe2ky(wdB;ULgVDKKb{^p)yz(NccQ}1^WNt3pU&6b{3@cP^eSiS#=jzh z6Bj4{UF=@__m5TR-|wI!_!)SZz}?oKB}<m{^zhit*B9XE@X!%^ed??gxc_tQ_;Gi& z$uFxnZ`$;vXlIPxalVWn2X5TD_WSAdd%wR`POZ&-`r)Ry^4=KH)T28;bEf;wp0Vxi z!v)jk+ZSBDa<1q_Nq?G)O81?Ty@lQB$6cq`RDL>?pfp)*ZOolLyCO7CT-l)~c=t^3 z&FydYniTw)ym<PQFtv5}>n`u!muV|(%)L!eP*lWb)g%6Y>(2e(sk!vx%-+V8%lyx; zj}oi?l+`!UaOI<AXYHKax4YP{D1BHF`7)+B^X!=kJfU~C7&^WTXRhnpvD9)`U9nrU z`}cg|z^s%PD;J&iPH%fU+omIC%g6aoULW1s@npIG>C@|<+L%YK_WiaXo2Ta7sf4>H zt=^w`tL|dy?k^fSbKB3dD)Zz;N|_!xp2gD1%E^<D=|*jRap~43jn7{^mo8lyx?YZV z-E+xu>CD2aY^!KR`%TX`W}0i?4f!4<@=Q-p*y)Ju`J?x<Zrxkbx>r}wbb(XkIc4M7 zYF~SvR`%ya^UV>qxOeczkxSQZUOaYeTjc9wz1{DgPTY6;-OsLN=jZQze*S%<_Ofki zxxdXq@2ePX&A+;^d;099hi;rW((&S_it2egZ-4F0yVTzNTIS-?%IfOka(P+l%bTCi z=6?kbP-pRi<CsTp`s-)UrcIcjAk?WM#Myn+s_e}SAGODye+qTFTvrm|nmcFCm%ZP< zeRB~J6I-^M;fKRjqm%n<E#DUOh4Q<HZj4$RRPwBl@9q9MYWcU;)wVMpn`Alhp|$>< zuoYM4Ok`3%xg~acsdPoIj1HHmi|suAWxG@>&5h2@TYLN0&9n<<(_Y$lHks$_J@W2p z$vyjo&&yOKYqKJsA3NFo-6J^b^@SNb{r|f8T1P&gv-59D$C_W&H{MvR*<`M2WNN0k zNUv6^{fFzljTh!JB<AEKxuj&}Ji778c>6ltDXq^RZJxEwJU8*Y;-cA={cocAVx%nY zUE8tt`GGGhynA(eJLj<TmDFV(%)V|n<(F}6cYo-r?!0-H(U%s+Zu&pz?d*U1R%&Uj zx_Wu}`ID~N=kDo;*z4(3Rs8p>6WpCWzr9}GWA~b}7Y{w2+}eI`r_A*D82LLU+4(+4 zrM^Bsw5V;qJ<t3-Rwd3kY0}##eOSt=emVbS@#m?tY<@;=o$EZ8DJ!$`t@*`QYoq<| zUtJ+D{?uM)*W`Np_|O%4T0t*&zsvrjt<`gCo~_cNV|-ubH9M+y+?KgDZ&ul2&)t3@ z-%sw9&I~^{YfHtqKd;mc-+z6xSzvcv;G>x(O1_@S?9$KnodvZH5-fDqhMg{9V_;ZO zxy)~_RrR+VZf<TRE)I?lpFdxYt=|$96m%u)tM=|SYu9#qe3#nN(b182ch}BcyTURp z63*=?eE0hL|Dc1j->bRB<ruf6|LoH9-S}+&)X!(r{@;83wcPuAY>Did&8r?fVlzxX zcj<mz^!F~ll^Hd!rmqusnssKztrv-x%Vu(m&(@E*^!v${%q_Qeue-8tY1RLu`!3t$ zc7~+af3-G9aJ{|N-X`*6ch%Er+wRv28vYf@Z`*0I>+hQPd1wFIEj^nsJ?~xKEA8#} zt9KuN|KvhLe)ii=mHhYTJ3BJo-r5?!`mpuS<&)f}n4MajW&hVYa&y|*7Ea-~j47v| z3JNlAPXBE<@r7H;j!U(7o-a)o_KV#8b=%q>F6--=x=m-jIq>tj``>pTf4zL~t-O9` z-^-cPO1_<({OjGjccP%y>D7C_Ki8(s`ToP7k0GQQGEl_8us-SP<-4ZOr%lQ^8~-LS zrtfa#qmPGQuRg!zOz_T6GuGPe=k%93ro5;wHGWqvmx|J(mKFiQUbRJGYfEjH&3)Ed zqNEht|KCRGmB>luMU1hX9sh29&N;R|r^71ut)t76x3P6AuPrK$+NgPO_oml3e|bE3 zb>jSfxnFiy)0H+o`WR#UdCHY1OP_zgXRr8tmrrT^;V-A6v%<g63v<bQFA8o^uVMv_ zxG*rR(o9~xY`xB<jn@4CpPenAWnNgZ@(ue3zMdSb56emo&V+>V`Nmz%vo5&w!u)<_ z-ffZd`k?Vjc4ly)V6!sh*8ckcA0HoYZ)@8Wu}03eN<~%GP?n3q&dogk-kRv`dY3ih zR&Uud<t4bE%K#Z)F#r`NFJ8=;FyX-S&qtF!-q~5~?CiWWC^IW7D=A6o@=JyX$yfGN zelC7~&T#G{-;(qrpr!;v%>lba@XV#cq)C%3Wcpl`1iO#AsEBo2%JjwPl@}E$Db4gb zR^rgGYTC?|3Q9rC*36Wi`fu9Ca{fO86&{-R|D4_A{C;=N#igdF&GshkP3nDi^XbnG z4UgCF3N3#8<Kmn}=Kk}4e=mO&erL@^k;`*ms|UaTzkS2hoCgOQ-<|*R;^N}4ufah< zo3_jBjQRH{eZ{Ni?M2`9MD{05D>{EZJHzDYQ=wSf61)9}xJ6Ur_RR=2yS>=m|K278 zP%aC}2TyyoDNa85=kH%<XXmFyJ6)6nxmsOJ^6%MzyD#6nR&gC@&whAF+0pTN{(ZeK zpOlQuFWFTrId%T5`PRG)FR7z<t5v_wGBdfT@$O#m_1u))JfEXocP{<v?Rh`DcukK; ze`m*)pO&p#r6V_b&iwsgV`r=A?rWR5gO!w~Iz`5On(-=fW3T7b`M(=(_)5>3;5M^* z{gp+TwaIH2Z3vk=fAIpgYrMXt!5c#hrMKVinSJNzof#ds_`d3>25E}AWQEGUZc}q{ z38^vpu;Zl3zL{<-119fU(pTy%9AtZ@(t&r@HFMRVr_aT%Y}>MJ-B*?9#r*NBvQ2hv z%<`S};CJFV&xsRxkM*parf*;K<;BIr?flhWs}8T0mMnXIPPWzQ;KPD{SAV^K-X6kV z%#~%j$!vLfWnItJpO&px8t!hm_W0BJez%1ommdo$uWnoRbl&{*^2qB|lm70Am{=X3 zo0NH0@2aWP(!7}B(l_7ZzWR1{bcyc#?ya*%`dZMld)iww9QZ+o?pRvQCN)ba(C@>w zHxDo0nil`!KL4M;Lfo(G^<8$kT`sxn^mcwupUq>-wvJ={_jjiAXW!cs_x4ukX?E~5 z(>*qDiidXbc8fu#PS@tM{P0*4Q<-#eQOo=N?~O77PEVM??c(BE{_dXjuBy$C)$Z?J z7^!FWe~q2d+0S`PKK+l1;m%Q&C^P#blfUNYTI=&_0bb60w@X5FxC>^!n2=|=rtq4p z_U6@vySf|icA98r|B!z3@AzH$KPTVsua(lwz4|}y$5Z(#`x`~&F3-1YJ*nI-I8|fa z-2Jz&tX)~RYTEsoG2yqS=q~7rHo5)7eE(@<)!el5uG?=VekAKFEegJPefB!lprg7{ z^K6o?O}<ddT=%lZXk+ewcE;(f!rAWf8P|@NxR;!cG;=vBxjc30oq1`OWDCvo_@}jQ zkG^ZA+S<`^H>}joEWhWycD(Iz8)M_m=k0#?ycAhq`uEq@J9qAcm%Nxi-*VOji`9Mn zW-KKiw%Yvs_WbyM*IzpgWwX>*p4sGQS6}BLYo1$VRDWvn*J!pi`SqLL{FIEfwpe&m zVY2K&zReacv))_|_u9F~f4=Y2J-;@;);urfaaW+O_|Jt&uBTt0`?>K+xFBoYWV_E9 z^Hsw%e+j;9KObBkAN2l`{+8kcCw)^Jf6u==(|Xb0t6MYgz5T)+x!lbyt#re$^uS5^ z^Eb6xMW>#za&@*_=sDS{t$lgy-m33sW_qfr{WuJYWrwrP%Aole1|CnXy@pjKx38{d z|4?!E^sF;dx3|9gGV`qRuFCfl_Z~j5^wGy{*XFMIeC|%2Q;Ggdua%ppcE)xeJFm85 z`XYn!!kGd}?`|yhKP<4nwp^#{tGJ8HF*mhsZ>_&cy-Zcz9e97CW$K+h{!=P{O}TXG zO6j35_uO2xUfw#adak#3zW>#`YvS%!i9I{!;*ydTGyTMg8%qki!*q9T*;Z5b%<bf4 z_0+w7vei5vUIi&t-`Qlj^nQ(p%X9u1)2*9jtnMzB6g;V99-DvX(3DR>Q*y+Y=R4Px zB+s5TV}`kjs*+ZKUDfCB?w_wMmU+PX>$&>-T}^MFe0s}O_`STUE{EMR^~YM9*yZ>3 z&yzPYG|RlUasBM+(Vaej-~3$og!#Gen>D}uzCRV1=p$5m_u9cPKSN?~q?P*K*!A|j zrMthFnbFoa_nYTV`figvx9B{>)M+-Ai3_8D9YAUXKYq@A@vP0%+SB*EnQf!&<5z50 z(9!YY_4?=|$3L%++bb?#zgKJDZBTickO3O`V_=Y&<Q5zi^l8hT>qoOn0|WmZwk{9p z5_^+vuN%KN@qFgdtv@1`?t1ZT=H~u6Z}r!4*iSF}du{ERn%-Z96Bm7a&VN{aJ>Ok{ z*_E$WxqZkkfBKaDSNA4M?oato=bX*Cx4iq$mHX4Xr}nRx+kJP@-Jf5*&D{U$28)Z< zUHbg{o%(XmbJJ$8nwL8F%H->xIy$;UUHh-Pe&@d0&)qF|Z~x@@B^R!$N?Tv4U!tJ2 zsCv8cCB3U<Z)0bDDDQGxxwGI+%w=p1+}Sm80v47Pf7_g2rsPGIsA<k!F(qfVS=HC= zt`ld^ULCMfZ*A08<#^X6r_P@Y&FC=UYIT}8d%c$VvNwEFofe)rADVHhs_0Ybd8yB# zzXY{h^Y(Rxq&_y`YW12rfAxiodA=(z@n7qdJDapILg(6xnY+5Taj)O^-2VNkuzx={ z=KeM)c=zgSbn@l<FMoR4R&QT@V|Sd_v+nc!clXboR=Cn{_C3|}^X5PHWt)*RTlwbR z&rf7sFD9RB+32P%_I8r_6@S+^zg#=hFLidz`t(cVyUYoT)p@tBPt1{tSe~RGv%gyV z`?<~O4IQ&0u7}(Iy6&{?*8x@8TdKeHZ|-}UAGx#jO0Lf3dLh>Q8&#eka}<3&liSm) zzg2(PU~INdce;4U$M2wHyBT<zTIct$F*I<^uqu7^=H_Ny9i0vh1%(6W&-<7Ez3AoX z8MylD`Zt@lZBtVU4h~l8>gafJZSCyUtFx!JHLv=5JKr;@@X_IR`>QL1v+wM9`1-oO z*%vPJFn`Ni_7|?-yzu$n)OWjISj{L8Gig22$gFMP`0=Q0`zs!~3)gnMd2Lxd?ccZC zR!T}%QX(mqXUw#hR$p9}sj5BAq{lYr^2dXl*2*$j{WaB?Y5)4<uOp1szvFo~$)wFL zt$lFdoy#n5Z#Uh|zvK7+J-D@QerS4q82jw{Fq;pbPtV+Y^xf=>cmBn`@hr~lEO$As zy64E&O%v_hW+&N2|8+js^6_W!v<*$nxixI6xo7@o{+zLAhlP~Ig_#{j#>VI8+rQ7= zHs920*V(2gts-~R9y&$s_;Bk`t6bYJzJ2m{1!dme-mb5q5wZPTyvncrUQrr(T^&qE zMSrUQS=Y7xoyC`w4-L03YwfvEoB71_x}ojmN$2b;gYF+$a<_pok)8k3?{B$jFIF%x z9N2@tnlGV3sMBTp$qhBi-A5l4?R;8YDxN>XU2E#A_m4jR)DiR6n!3-R;r#R0>q?o; za&H|;+89^UE$$%t=|jfn7l9uyEj`}p@pIc}4K1bbayMsb#Fd79s0Ou6L(Tm}&GI6Z z!owc?+q3)4`uXAWJ73(}+kRee_m@nWN8**s7k19<<lLR;*wys*(Wl&w9lKX<><m7> zk9p4>uaxbljzwg2boBK4=2(}%F+F(t)u~=YukGTEC3ee`|Lc8ARep8*hUKlOTh=w# z?zt7emYXRxJL0C*_Dvf%=3l$DtuQc7ZsO*3zt)J?ZuQ+1w)?}aMZzvFC2wzS<*K=G zDlIXw@Uh#{y*ol@hGo2tC|dmDt+MvH6>mMv%YLoo(qFP?X<6y}OxG!si>G(=$(=Pa zH!mwLHYo4`6<aHWK*bh#hRSaKdGJzL2Zak+TOA!8f5m}ksa`#P?CkO@uF)Z&?hN<m z4i_b*OIcg{`udOt!PftIaI{+-ylkb;p<m9ngM&3AA)s4~cbV_&O(ickzR6j-IGKCr zpKXoe8{S#HeZDbvEw7EXprB-=rOA7vXTRm!iq2>kluus9x9t4>NvHE?&wgER@aW3b z<4y6uHT0iv*6kLW>}6jsVNv<@7w^WGE+y~FqHZm<TDLd%Yx1dgnmdZMpGTy9c8t9h z5%=43OV#0Pm$!FwU2SzuP0z|O$tq0@tP6ZNxBAl`rLDU>J_alf6My<#{O-<T`~5jj zT6LrK{%Akh>Z+%6?ZxWcI~uoIk4pK<T}}D@nLF?Px%%G=x(xG8pQRtX@GNbrX}zQ{ z`*c0gxD$7_t(<BocyVL0_^$HzJ1alC%FAE3D*d1?4nFpjQ-2a00|RKn;?mVVR;I>v zs>;gF_qC^=uC$3uN?PQjR$Nq6weWjurHj%;7p03=XO$j(fmpn^avz&6c;#`~n;V9W z4h!TbOr5&)YL=={XPsihs_h8}r(2gT@tI$j@YwDD`+dS|qPI7^bO~L%U_rs#TLIzM z_2-#>k+PcA5w%rq(S~;}NA6zszAotAn-jHF>c%QjLCY7%1q3I$Cf{CWyKk0@%a`l( zHf_^)va)?`_AjUGM7qnBllz4QTU#dl3$L$NdbLpc<=emO6XXJaJ$^2hB`)>sa9EpT zbKAdP*$4Ji*7>j}2Bj?7;@qy6eLZep?d}h|-|wsV4Vu1V2+)O(qTao8M@UG>MQLJ$ z&NL5|d-v|S9C`lv?wvbT-`<=|+W6+pn<qt<f-kF7g*pR3(}ycpuKbm>(MRp`_wW3? zyi-p<Rhp=wqtnxIB*{>)wYBx^Y;%A6<?Al#f)+xDPvzt0E-os1b$`FT;6qjR0}FnA zeZ4N~>ixsYzfSAFt^bjDul)Yc;+?X)O0)A51N&cQO!Zq?Gi6SVt=_vA6BOV5{K<dM z>{r&pT<^)!URnPhO?!REW|L{?6QR&kVehlfU%K?^vcLV;Z}Xl$Kc0X2*u0k(p<PE; zO`S8R?$3{@&(6-R{w8y2+1dG@pMA}`xQOxcPEdwg(DXsbiGg7S$DWoCtQDM!dvcET z{ILILAt`S^?|AmU>hJH)oH^6f#I(#g^v>Jct&Wb*V`FFYNPk;4Uw6ZX4F#njaQ4g@ zo5Dve)2D||Rjt{4=FFMDzrUMjht=Ls3Xh1mu_|=+x3{;0ch-l$xwrTCrKR5MW#px2 z*F8J4c4KnvoVn6rxtF}s^YhnNcUA1!@a9dEcKDyH>&JddGcd^O>}e5r(A*AQ`^+#k z>FTO~MmKBa=igQL^C>AWPq#W(UHNCn5^r(O=jYBX_v4&#F38c$%uLy>C&B7y^o-g2 zcL?9Pd-rcC|M@0XldO;{@9w^I@B2~m@)P5~owX+?Eoo-YKXSa^{i`H+h6%EeX~CwP zdp2vLxA!I=%ds!XXj+*myX<ku9ET0he|=>)-TuqR#m&vFSK9oa|Molk>;F&vd}Vcb zY+umLZMj#b$LGlzr&T*0VyUh+yIjcg^1;E`#n1j2XNU32t+%`!2@389dlSqV85lyi z#JZ0@EsDRXI?*FSXIh;^`(e%d+TbOH^Uv$sKWKGpn04sXtII1i`ln3!b8+!@<GD*8 zP1Ca#ldE%8l6>_j>1fF`Ez`nBF4w%Tt&KijvhI1-^?xb1w*{8IsxeAC^X+)Q_l&+| zgUU)*ri1hT{hh5Jd1*Ri1<{9n8<;`MVVh4swX(8OQ&BlH-+un#hf9_%Q&Ushcjxr; z&!zbyDoQIuq~zuGr=LzWn)y$)1u~(qaN)wI>^E-Tel5+IHLXu}?czl?Y&;yFKi=G1 zS$x*IL)q@%u{DwP=Vx6#eED+gOP$cSll|=qOG;9#jz*j0X6?(peL{afkEC&0wa=M| zWsfC}9qFw0@}8e}$70G$@OIM#21plv;*=><CQdx~{4*<4V~pN)(J84$GxtqD{Ln*1 zsP^m3jtZN34hjNXt&x$DPnQdIAKjIE@hSTYX~wKM|NhQyZ|&va+-Z_}%5K@_KjxK{ zu1*i<F)~Nh+>j2O8qWMI-z(k9^=RpvjLo^XSJ+mkn7(7IUi$y{{vA7Zlys)7So^kH zJqa`t;@}Hja1WYuzJB(suA-u&icn>BHF%kT_0E`eucu;}CM|q??9H1TYinz{es`A| zyZdL)_I9*5Eqpg^%^ID%3_D}iS#MqZCoZ!=D&@|OvVQsL94ys6Jy~lbKbu}Iyf-yq z$M!8D+7o#atxmjNDbn?5lF;HdUQPSu3(6L=eR&WUIG3$AOZ<-Z#*C<I8E4g6oqSbO zg8Job0%k`<Z1xRJwLP}vRJhrOEgCwiy-M-9mnP(%`QpB+!?8Jvjg?oB>-()6S7zJa z?|o?@x;@47(yy=S|9)kEXkgTZE?91B1kFTBxCI3T{nXzYmHSg4G}^4o)aam~Q9bph z`Td&3@{8>go$voX6gzc-)Ph$&bAD777QVc)a^taMTc_*3K3+0syKpDp+uPH{q+f^j znlH-ITRU?PsA2Xta$|Uom0g6`g~aCH_WSSudAI$1(B;>4b-HGL*Cj5z)c@!EZw}+p z@c!HUo6qjb2(sS0Cf)ge_iW#qitqWt6MubrdHOB;w^b8aGn9llte!j*J3GJr#<6Ad z94<7zv=9}Pt4lpMr~cX5*QS|4?#niVGFijH2OOZ)WDQ!6o?n02Z_lO^UsrRir()UW zJ+2{FLhJv#)c;@4#+P%lWSY5wnc2$oFK_Jko-4w7`{>i#0)^#|&;3a|c`>N<<a55t zUv9z4!nd#0?%w`)mH%Ub{U@x&ifYgA{IO=)Ti@s##T^}YvlH~qF3*3l_s^f=^_sy} zoUPT5A7$O^RQmmWdB6Pr;zKOg<Lh3Yg)DP3Pyw$(VOU{xd0FYo*x6s-ZvXA=HE&&P zwD0*x6Hb0=J+wFZ*p4$Z52sq4p1raQ)F#l%`u_9qe6{uG-rQJpe~F{6ZA|bq(dy3~ z^GtX3)-4H}?BqOsy`9*fTj~FgR?WBPxxy>|_FKxQOUz-<B8w(lZ{PH2a_pYpw_l~# z|N4@dmZnxbf1MH&6WiT=u`gckR8~BA{OVTD%Z2x@o}6sC*v*w+_SKfk&j!#?Yy?+{ z3;|33z5l;&MeOctQ#5~jdCg;E;YqSOr_I4qotyhQ^!4KTr)QMS62H{hvEuq6+r9Hl zH@UC7viHrFm}CzQ!NBzk7k91*%~rbfeNE33!HW&+TwLy*?>_J1GI8QWef^)8{p}?` zFo(3QjdtI)Gxyrn1#8#XrCOc4y>#i_?;kqeT{viEb*mXta3xe&G%+(U@c1iD+z_F2 zH=FrugpSzs)4KOp@2+@l<DxRv>+AN{FQtCg)cs^!FT)vd*Js|HKqW~jiHd8-)6FkO z#(jCaz0lM1(}D#H)6(30(i3NVTzzF#X!pyQ{KTxN^w-xWwzf+7pO^JXuiX9S4O97d zkK*FTZ*SZ7^sM^*9lS_Uivcn~r8oWb^Us#x(NPYTsI_Jq8XlmsJ2*JFwx*`T<G!{4 z$Ep6xM7fC`A$1L5t4m8tbnGV`e|&bXwYj3=!&XN9ewGz&YJPugY-(IQPAm;vylBR` zPcZ=(e%k-H`TTr7bM==E$yVGUG2LRkN=j~Wc5@8t{^%{+yyxWJYOV6`9=*#_zQ5bp zD?Qr~vO`OYweJA~@y)k~A1i*j$@MQ^?X}+^LPzX1*M(n<>!mpZcq=Qn8XFr+87gh6 z|Gy!2_puqXt|gkCe|dSkn(r;^%%I~dgRPBcA5oZRS37I^^zetb?SDR*tmd0_M)H*Y z>#L{jl#-S#f6gZ@y?LqkZ$sJVqFr5G?dE4{lwoTD`0r1f9W5enzb^GO8)SKN!>J~4 zp~E))bZK$1w}*#7r%Tet2&IV?)z!j+^Us$T7r(x_S-tz{rp=otpML7H<n>e!6{m#( z8Y0V<Eqk@<l8Xw`Sa02dCnqN#K6D5?JNjHjX<@*M-KnRi>F#2538_<YFf}h(F*)Rv zyrI&j`281FXz)khuJTc>{IkPF;l}Ny-k10PlR6W^c34YObK=RAY15{O?)d)l@^Y`G zo7}_~bY{GXn11KZqM62zb8}w#&c8SHrN#e6Vbgc)&fi`3_Fg0NW6<#g(0x%ZBuw_4 zxN>Dmhmw-guF}`fUcHK1`f$N5>*8nA+TBa;?kZih*!I@e%}FZE^Y>>T@5^59&m9}X zBmCge(Qb9WIUhcKGCGkX8W0mx^XN!t*WWU2P0gKEU$fT7?Y(EWrAXq#ebN8F?;m`6 zy5HTcPs(=J+u!HY1hlSBKG>{$Ztm&3+t05~_y2Q%i{ZfWcgy~S8TY-teVoyux7Bz7 zXzD`Z+Rn{y?f?52n6CYMHC)lXFD0zD;pyrA_SRTFE~%^)uZ%<FPfz>$`BT>Omphd; zJ<pYhDJ@#G=usoHvR=%I?p{}LgX+QJ22kuWFnpe6zP|p&g_iSn*`Kb4N0+_xS$S$H zzucaW`~S=Sx&MDxzx4HWTGv~(gyrlOh3i-QpO-byw@WeW3|c8^qVed|RO^i!<6`ty zod=cd^59981wk7kbo8eGKBYI)=UCFlxC;LTAzD}O2JH(6l?`iFb#MppZn#;>FZZNh z>T24P6DtlJ*c`g~#a!!tmZrTnai3rPoM&Y)Wo@+ktXbDSez~(SY`VeJg$o{hT;M1e zzW!c!@7GuN?)I$&FOUm38US8!{h(-Pjoo~38wA$N{9Lr&L*>%eJpm1BN^8SjzjzU` zFC4rUJJhwRAxqh)=*sr{bq}A5@6HHx64f!U{1n%_EJR5%h&4O3cw_MLV@7iqelp2S z+E)7dME3P}pryJh2M)LQv-9;#IQc0#dGD^W+*2Ol1#pnXeMl=L6$DN^EmBukSDJJ( z<yTy6Zj_FgwWVd|)+l*-`C5I!j}<ntt-q%3Wssk`HGBWRr_=9oi_3ldy!uYpi$_N} z4GlN(O0(U*S$joaP}M8?>h|}mOqK<QY~qt$vpr8%Qh0LI*Qwurf4|zy)_Q-(M+LL8 znCW^IXGK7hQpcB?U1nrpc))z{X%W1ew0*ldG>e|TSE-7WB_Y!<ORi@9tl2kv_G||Q zflimi#6*`TFJ7#8f3;VHt99kdmAksk4!9@X+Y{$IYX)a)_2*Ar+j6B-b7D?E@P2c9 z`nH6F6Ir?MwDJ9YP+z=s?W^1G`%9#@*kuQ-`FkZo3B<DX)!i+|<7FJZzwW{n`x)mV zU$XJ%eZ3yvtnPpB`j(YH@9eZ)op$k0&D9471tTL_H*SoRwZ0W{b`dBw1=ND~SF}x> zG9~1n_u8=Nf8KZZrQO}?pdi4(vg`GQ3judqBS4#ceu2vDA2&EyWM`QeN?Vt?ua7(U z@S$?lmW+f0CyR@@)&1|8R}`#n<=$`dV9V9e)snB5AOH5dSwna2(_d@WIPSU@0di{X z>Cn&r7D&F1-rALWH0OktQD)Hb=<Qsti=4~K#A@n(pNiAdUY+pc!wKv1uB7C>RwWzO zy?F|9=K`rikX52ruRJ)owomSBpq8m^HJiNEl*9uw)qQWdyGWbWsJPoNUpwoUyH#M6 z6z`(YZy@lLf8mBLe)E4hU2f04xJbXYHg@mca#_nskt?}lcbD}a=hoG^B4c47cQqX} z4$v<KTK&tw5E3tI6``*7t516S=hf@Cv9R-h{#aQ1-%?!1VpD$nt$np|*RG|#w~zL{ zkag^Sr17bB^W!i6`s(6hoc71ZxGqgayx1&PYTDejGUj>DFD|w_J6pP_c<;TL#@pNY z`*Uu5xE#CN&D!eP`X10t?F<Xt4)B3jYiF%ZbiVxK$44ed_W1iVj&=**E8aFk;^w2H zoZaHz<xEyAb$sN=D=KHVD9(0q;o~wf@##`EpANSh|NhEdT#(?s^l@M<D6{-H0dBQS zZ91A%XdyGxXW8xqD?W!_aS@Z0kB{zgi^&LbeGjXcG)Ly?latl$yv6^1K96HN!)7{h z>eb~BA1bep*=e13$M5jDJ^Arc{o=QlcIVdE+&}dy_^=<SMaf{w2dQiy6z%Nm>*M6) z{QUg<^8$;HA3qlDv{6=W?g(gLGw7IK|1LE>{oQM6<>}%r?fn@yE_~U4&LHzrobuvZ z(q=sCdMW}Qm%Pc4m9tCw@!`Zw<HzCa-sDfPR92pRyzj1I&5qCK<|gwPfmf4WDS-@l zsi>+J?u>yf0O~mWFeN?x`0?Y}TcbK%lqR2?GiT0>a~uJWfBx7}WFhwW*xNTZjV)|y zj?`CeyuGKg{oDKf`|AJi=uZz`6}EbB`TIE5yqaHMRvtVY;{Wd5x$J8-fB$~}{q~Jc z+L;%>=55ZsQ{kv^!?>>I_k{}&**d|y{p1-yli3FhcEqfkJv-XTsmVj7sJQs_xpUjV zRkMy*cgL0}-OG%Ob^^7(EMCQVuUPH4d$;xe)3Mg&%Q}vBCKb+SWR40cJCwC3Y;9Dp zw0Yg9C!R<1wr~5#fAp`^+uiT?oj9jA!_xTPxpOsFR+x#-OFug+`0_H@8AeNk9S$fk z9|LvD8fNi<8(^TtP@m#oX`kE0dyyf*K{v|e!qo-s{QZ9(_cLBzR$BS_#~PiZPfq@J z>&dV!&pW@$bH(Bit<^<4#jmUiU0wS68V}nF$7y<Rr-M`I^0{*>r|bD@8#M2)U*u8p zqFsKMZu~jp3L8+yTX7LQIKt2{>-dQkVI^CRpP6}gnZNyqyXC*{+f-ayQk$0MCT+&E za#oHNA0OWtu?5*%l8^UUT3CcU?GhAJwkqEyX`c7|?d{h8U+>A+Pw8@L7t<+l23L;^ zac$u0(ZP3X5^Mh7UyiS@&HeZ5^@rW%@_UQU%(49MvDDlwM<OXRGid6~8#&)LCLdo_ zbd=xC(b2J)jrT@QS*YHrq>YCTyW3TMD!H>`?*Es^^7nN{ZhUm))m3IOy+50Z7J=$= zhqGX7Lb$}bk3K9&F`D_V>7@mOypH{TzaY*3mzM64vo)J*G4Zd{`)_ZrPt);?+O#Bp zf8E(tcDLW%-QCW!@>1?~`G%&ZrlsD~fBpIu_V?1aZ(<K0Dhmm1+OxNO@97_p9tD+u z&pmih+}XLk{{P?TbB!Qd8~Vi{`(NSN1l%3gwX=)Uo1UJMA|S|hfnn;Z`2A_e`+UEA zyLWZ(?`68tZJ&R>EqyB~+2uL;TV=(Txu&bxl@H#?`8LZmd(YmzZ{NJRwJrCwN1Ig3 z(Im~Or=C1{;@T}{X=P<JsqysFmiGP+pKc|lrz?tmuRMHW&mJZI{uiI07bhq0W#h|< zOyvYQYr!$dR$ygKO-~gePZc3hM_q<b-P+pP&Mt2CRWB8xnLf{+JULS0*1$h)v9h({ z#p~D2kKL}m{`ED#nC`Dh9n1WBQ#bdT=SZAMFbEI7K4XT2(yoe+O3j8@T<q-aT6UF> zQ|HaoyLpp!bK2kB^mMyaujS!=JImhAYj@ugwDRY3`S<H$wLe{Q0wt~=6_DBodBsAA z)>$lhs^;Lq!%<r@4D#<Se0^QsBtP!|fyUSDd_C!#UmMNs?l^Jv>eQDUAJ*0VTIpW4 z?b3PuX@@sfRF)S9O}cYf`PQjdmz~@9L~q-Yq5>&U6d(nPg{9@o)n`EafOG{oW^l89 zxG30JwJqaf!}<F^pPan>e*gbP_5Yvws5ePvzP+`6^Cppd_jXU3w6Cx%Z$<w7&F*Gd zAtuwa#bw_nW@esB0DEYKCN#J3p9+t+jEb5yYo=stYiwt)Z@LxVm5_xC53gPO`s2^t zCbNWMPd_^=-p+g5tR!P~{lAZHkSuWzlq?t+804p{3{Lj;nm5nJa^mTyJaRG{tG;S3 z6L#!PNenbMDXH)}WouV2F1R+L@X&R0H;p$NYJX?kz3BxCREGCVpv|fb3^f+h^zG$j zYjv$|EzXTzJ!8g3`#%bE?fyDsWz{(xP*}Fu@$BPQw^B||d#LR0R{B!Ovi8@tHIcT{ zbY7k=(EypWA`v`Lrp4NQ^wH;^zw}d$B)gA3DzE_eH22on%|Dvtxisil6H|?YknmGb zYg@klja^oVbnNLa(LKD<Z7gi_-rluVF%CYMW3!^uttaE|%E@P6Uf%B3o7Mcv7-U5V z1M0?xP8X%AUcte^rB9!ID$#`ux^Z%HBF$X%cb;I7pYrHYkp2D}aeLoP*L@wnFIMAC z!Iu^JWo3@n*GYeWzyDl_&5BMgE;;@m_21svDja+BpZQ1nhNWSrbSEt<nys<r-Sm?Q zZxycH+PW?~XU4|Vn|H1)Q`~auuTWi<sfy~F+v`GSd_9^`6#xASN2*q<LF_iei9i2- zG)TLAD>kjF>-%f|`^L}bJTJC8U-72=`{R;%|2959clYO$$;)<^#afrVP`fP&%4!Z* zn?c3fjJBYaKK}mVppM;*n>TNsJ*%sxcFf?^<Bwme_V)Mpdo5L3G+}~(-t_9<-*UHt z_VaFJmU{5^=g*_}cYIuMXR+CyJv-F>yR6GfK76~kE9>gYuJgRB7QMbM|K*iv?Yld3 z@7If;e5#cHUM%_eJ74eW17&fba1A&L&RNSKLx@fbCwMLG?Cf-zGIOS<i_%07waF(_ zjQHA>Cwf%a$X)jH@+vATQ(JW7M#M5khWwnvZT4oly9DIyR+PSGd+L{Q;Xu{@e;19@ zN@m;ry<mR-&H4vl7M!xI`%|_)Znn3VSHJA%m$$cT3LZUD6SsceRF5s+UtUhnNe9=O zp`3A`6XljI4AJVf?>d^aEb#_=?hC>0qix%w)~;K@!gw!IT>sgxpGWII`?eQ8wu!ed z{#lf`I*j+oquP}#D+2@Po90F>Pcmv*mHPZ#wzB&>A&xoaZ+>iYZ04VNZdd8rZ8<;Z zobMOv{FZmyY|338P`EGPItXb_tvY*Ne_!nGwucX!|DAopDQp*{b^Q4gk+Rp@3>6j6 z-r4Cmb#va`nGX+_^U1%fdvfA>+biS6$;Xcw8qUwZUuSCYp+09R#1DL+G|IpbdgIDU zcK^AjqW0G*w13Xme|hon%O{?N)Ajn8*^jM_D7-Z1rlY8F`MZmn!F)e{m;c;td+u=C z*0@be-Y;@Jb>hTl(K*tfs0j%KkK!;aSaoaLTd#;4FE?!X7rWc+r@#2M)#+RF@2`m5 zTsPk`c;2j8;*vjC&NOP#N_lkTzLN6!_O?2kYP0{Qm($L^nmBLWOpA}(m-)V~`Li** z73xqCQ0uiJvcN({Z~AGIAAhc2HDY*hcE#17_v>aGRF%wrzwh;@G{I?le^V|mJ7{#X zQh)u5*VpA|nAxsy>gt|f^X=xh6DK}PoAcGxew`^OXBVK6qbBrrXX)!e)+LaTkOGB7 zf>e!Nyoyla&X|=UTGLPS%UX$uh-}HcyzI)A5P5m|ZJU`Z*nMXf9XNKZ=&sfK?VLt= zcih$ed`_I!es?Q$TY3Jfl|{{3D!OkMI&Ap);^LRTzuo)g|6km{N6YNn=cuhZu8a1j zodwTG-D3oo)0rAmz4WGQPd@47<kaG{5IiRpzAonB#|oDvK`U?g2|Sp)Dd%Qq?eCE6 z>wGJMmp_Ycdv$H?$(6y6>}q57|42H1sP(w-B)Je#uA{k)3B`edolb^%4-Sa^|96Ou z*RH4Y=btAh&wPAbZyH|(ik}aB;GOP1&P#(@+uFL0CMiui{dDHcnSOqL`}XaV;ZwJ; zn4#&++~7IKYN~1WwfDy9W%4#ROzJn~<m#5cm68)tnPL6?#fgc#|NZ&g>3PUWRb0G$ zY54lHYoo4)Yt-2NT5+*{?;daQ<7a2LyST>2Y*INX^AeP95A0^tS7c#excuN_Mb+MU zncS^T&bKcxFa*yudg^d}o$oZ=-$%A2itD_1`Y_Qx@zDC%-KWg*WbW+Tyg2i*^HNX< zL~gDV@4S_F^V3ghc1i1PbG^PQC_FIe56?d#U@p829E0y6M+Y#h@LJ|?U-ItG+^yN{ zGn9X9NL=ebSLphx)Qd~Ib1pCAeip%`)tq^m@9eCv)ea2*b61`3nJ~f5xqaKGk3UUS zRnM#J1iRQ8yk3o=K`Z(EyeXlp{np0ZT%UaWSX$Jg(${S2{(b`8xBX{q$Unxjb7mOh zwkgx>r0r^+zq-2o+B(?{85fVMb?&VEETF#pmYv;xo9Z_CN|2!qo4~^jn;#Td#OO`W z{P448+hxWI@jLtDZBkD)p1038&5a5#UN0*7^X010zhUcaZtkzoDJyH-IlZ}SVc7HU zZ+2GRx4Zi8?qPNRcR8yzY|V<yx%cO0E4QVc-ToO`YM>b2V_d*y!oV<tZT|W4($Y{3 z5l2VI7`^Wo7CL8bt-8F-cjd~Jot>RI>Fgi$W*DhHJURJN>FYB^KaQ<l=J)p1!$kYK zKl}7z&GPP8?1<l=Cc0T~#>tbDBNw~BUl-Q9IH2eCrK3mKYsz0-sQCO$F}`+d`|;KK zQ>$j0f!BP6WP&GnK;_}(%a>h2Gpu4<t>7WQn4Lwf#~%w$^jex^?bxvD?f-x8&-BTj z%)VY_o|hAx*!}J8?Jr+43vX}x_V@SkbupEj4qaoNe0%TjSq>X^dQQH@)!Kh@_4%HQ zi*KKqd%O7D9Od0*vBvH-Apfpd1g^(@n$JJyW?^b|Qk?3=%H)`qwruj`$?Mnaw;wJn zDhgVCHAkHzpfz?^N%^NI%=hbVXCC4B&J}m-;KDGcL*e)9|Nrih{Pg6>Z)tPBbq`qX z&2U?6S@tHv&CRW@?%!>9VGfqPRbQ)qTdaxL{A|nq{|5z??`+SNKJ~ER%=UnSg7>el z%m4WC=hWk?`InE~tKkMkw1X&k>=RT!n*3XF{q<=Rh6laAGbdfxmV0<>_THOb2{$+S z+t|E0-v9sWsj0h-Za&zSE4^vz$^Bar4l;E|iRr!5dslmR{>%A$YY*7_{o9y$xh?W? zdSzABzS=EaU;cjIuODBR^y^EWb{L0t!p;>d6z}fN|MKzY(<di6#l)^^C%A%x<_S2p zF|4?<<dSk{=c~uZYtQT~{W`z)Z>cqZKU>nr{JGYrQ#Sd7&QMA-TfepH>#JjVy}Q4e zKV2;)T`bM*&LQp-x8cw6r+RvNYCSo2OPBsyzwg%GWcN>}rvBA>aC9n<_G+oX!1;!z zFLvx$D7qQkt_n%B08KzLEcj$q@**uGBgw-<USB_bTk%3ZS*iJ!%5sK>VpVQgXJ31t zvpm?Y*KKl@_SG#{)0<x^UY@=tCaLd)+VqJFU*0s%dVlXq?C!Skh_5przPzcSm33lU zZn(HkK**C_Aio7zCPI$yRQ>wp<>t)Ge085ZFCTEw-&S1tu9<(8yE}j8?QIXw%=~nE z`ukHU&9hBbo-GTiFMM-jBcH9+49y+AYtQz6kxt{vb2{FC|KF?Cwx-$FJbYxX@7x?2 zXZfQ_*=@(_kjl@`WQ&Ve$A4s>4(gveENueKR3}s!%{=pAo;F|m;pd-w-Jcd&US1ir z(n5xB`f1%_P6mTzzSc{EY$NvWvcKIq#WdM%yL0=oB}<-^zSHsc@JP0vyZ^+A6B*Ag zo~ijLJ4fb>_#KsPd3%)va`G-N(u=;D?iMg1;fe<T#)|t}v%lXw1xiZ{TFl_yxyg^3 zeI6>0igpIA4ABvDcXJb(7^CM8J`O_DICA~<-Me-f<t}5$-NC{jvH#DcU3qtBUS0ir zd*0oKw=t&_Ma-;gqweh6d-y<OVYj&U|DR1<U!L3){>*wkcxm0nSBqRv876<L`CGbM z*?nK$l@(&UPo79=j*WS9<WcRLWngE#aRTjW_HkYrQnWK>rjMAAP|}N#)mLrg`a43j zrY;QD5HVVsCD*_F`s>=7njUw?h7K;SlHlcXf8H41o1!`Q=DDZ&rdc7`|NjMUPXC;K z{@?u<7puFv&qjP}txvwR<i~*n|Ig06T>SZ&V$O3Xmz3PU2aokO`_DTw%c9W!Hh3)q zLpC@)Uk+FqvT)(Tq>VE=QjBK0C_OB&@SSDyu)yNr!Gkt({whKzQ;d`*c`e<zapS^; z3(stn7V2y{{#a7a(NL<PW0|k@mj{j8gyi;pTy^0>|MpzzUHS7@d5hm%8626j{BzW< zNkZF#4JJ1+-CaIEkDK3qd*b2c_Wy3oep?dv>dwtTHE9{ipT}=)O}}vtv~QK+26$d| z2HWPjk!!<*Cr0R8d;PU)@4ou~|Ju&Ym?5#uMpj7ZP><9y$@oKWX0TPvKYBFw=9ZU- zUS0hg8}sJIxu@}xmX{u%k=)qZ>$*KpT3Px0=DFvzOIW`by%QD54i3w;nXp_{OY_9Z z$`BuyTTH$O7td)DQqt1XxL~tuxn`xE{p*R}T%Rva3Y+|2d|lk$=TAjTAGthhWRCY# zd3)1u`5I1PyHDTWf4W=F-Y0uH!5Xw2h#`Ry)XrgGn0n%H`>mPAPnF%Pd}e$QyuI@e z``T!8i^8Ns=J!ixSbW^B8O*m~?z#9mHzzGvIq%Q$o9f$x@&qoPm95qnTk7U>e|BZ& z=PxJSFFpCZWaCWD>}BV>{k`Yt+?`!pTz}^1qtk-i$;QFgSk`s!FWOzS-|78<Mrqq> zw?d04Gc4BC|9_UVJb2&L)xW>Ld~B6?XkR=3)|}@|pnNUL3mOArXz)ro#<Mf*cgfEp z#oL{GIy*WX|9`K)_xjpgK@PL!OKnrE=RUXjedYe!?e^>Ie6v^2+WI<rWpTG`^p|<E zA9qepJ=-?-R>{Arg1y?7Vqv_u%U;-&l-OSN{rcBlHg->Xdr#q}4Vy~eT)2FB=3D6> z)%JhCv~T|&W;cKK42yk5`_^1aczo>O&!4+Gh3k{8!TX0-fS1!YyfkdL7M>WR_q@PD zY2t~BkflL|pyp_{P1cJP_2h<AiO2h%oSm(&7q3@RvL(@ay17Ya(DEZk3d`S%mA(?$ zS^V5|+hs+iT{G55@7z#*@oD?k*P`=7)3&UbzRg2wYwqo(Op6ZfE-#+6X%2gpkm$42 z=W|XMyt}-#_3l>J(}%acwJu)2<3nL!;M2PswWrE`{Cd|uGiZ73Z?~H_A~wuDXJ1gb zvAaiROLe)Ihldg*$2hdEI#|ZU!0@5(!RMdr)~(}eRnpMtuzWqUqs1vPAtAxX=gjKQ zJ7eChUaaA8__vPz|BpSApY-?V#BSxgUm-gGylt_Y(!@VzH9!1TUdeuV$nMRv%atD- zl!|g)T~=EO2-=4n<5@Cqd*+P`3*Em5x|r+VxKdv7;>Sk~rA6~o^w-5)Z0l|LKQYcf z`PiGz?%kVGJnu(tuG%p7-2SgWpRav(=A~u&xryK2%ChmSShBno6#ES)!KFH=+Jtl~ z+g=$ftEepTiJVy(yAa%=H0qHm56ig6F!flE<flJ>j%$a7oIGrPYDMhrqT_w~&d&CH zoSrf!8hYx>JKpx3D%77Y6(xR0S!q}Ke5t6+cN^zk+&^jJ!jGSBeffO;<n8VCk*%xF z_sG}3dHeQm(xW5yi;A@$D}zhBXW;2AP%}!LgN3WrNo(q<6r)a;Lk|nY^kPmtESNND zQi#@650yzLQ@%WE;OlgmG-F1FglWmA3Y%^DtPQNy-<IUusYpD^r8qtNbeW!-akZJf zV&a#h-8<)6yUSS=G`}r5wduX-JL{9~-&|b2#s1wdee>$Pw>|%6I!%1|RCMa>-^+t6 z^Nw(oZ@XM6JaOXuY18axgGxg1LAMU92SGCi2~u85Fa21YDF0=SW$}!*hbwqDM&wAC znpD`t&0Kq#;eG#d|M_QUmHya#zCu{NEWuh_SlVC#Yq3oG_V3qRyY2Wm9?Y(G6&Igw z&;8HjyVjbHzI{&~e?EO&e)q9sbr)9z>TbJS>D()QJLkrSm&@npMQ?C0%%9irwgePY z2i}02T?`GWo6}_XmA-yBNwxN--w_=t^KG5|^0E>yOsl{Bck8<o8WE9n?P=B5SEY(C zn|?kDe;#5U|KU0ZU)YZye~jw>xVQ87uibSu{n!FW-REb8&&;oXb7A3ZXjzcf4jN-% zV3^$}dpct4t0$9G=YOd9dh^`T9w(<?fBt-)&dzt|#U0C_l_9h96|JpzN1xpOZpHf< z$`v^kZzd=@pAr1|Rn6yydH%hP4<6hDHSK;}J)8LNPu$;Mrr$qzU(b-+JQuWQfnkO? zc+j6A;WEFy%(Krs@7Ld-`_|=5-VKBAWpAZCRrXg_x~`42PWbfX+_MPR#TR>|%(D94 z&nb(&wR1~>Vd#zHw~nj#&)JfnV87@-NAS@<=0!za$9irSKk=w4`7&W+^6k(km!65q zy}P^bZ=2`jM~@%1ZGu`19uP~Y(wche?Afy?PkOEmE4G*;XImvPUqE;I>EB;pUtjFr z-z#k{waoCn?v>YHb(Zl4d~|XWIzQ*6pO@76G9}R^si&*BTKo6^Kd2eZ7qh3r+~`v< z-|;CQ!`H{v{=2jD;{5u3Rt5V`{;#~WKQ+8G?Ap%9o!m{&TGz(De)K5m){pg8rCQl% zX4qQAu5@~MdGqqkJEyNsShue9&|&sIsja)cr>p(@7kk4G+`T#jIbw^~ZvOjMuT}+U zxF}t`u`#)`<Mh*0Pd{Dxbd=W)wiW<%e%ukG$zQAXdZ;AbiqV_ibI*<A!#@w-v$Kt# zpWwIu^5Wjz&bKjIArTS(%ic<PsqBy4HAPzT=gQ^j%9C4S_f~Cfo_qHeE4Po(+L+v^ ztxAgoo7sH-J#3esu49<ZTXno|b@H({Z*Oh&%y}bz?%cL#(H*YJ?p1T_=GvCNI=C)& zcFD^}C(1w@-53(Yz^zf_M#~}S;MDn<#_1I{a)K*Ev<~|$4A2nj+!3=ban?tT1HY5c z%~AH9eJygw2L9Wf8xsEf=s!1as!jE>_g6HFK0oWumk(Hc@y@Qgz5AzMzuo@J+=+>) z>Dd{>_&=)Nlid35*e119Cq3FxzV+9ch^?#Qr|b3IuPtwY9JPEP2Du4y#w~58&oR&{ z=aU-}4_nCi6%-is9~bU)F`C)au_P!nCnqN(V@0A=|MBF$2M-D?G~5nXKYBiYa`}6| z$Q>K}d!^pL+~2=7|9!!?H7Rdyls!K7*Q)f@!R<X|Z*FXqn|rosMaj;b?CW(?rl&7^ zP*?Ynk+FSg(E1xU^v`T@S-L6hY=d$7rv3l_l|yea-(2DUznPtZ!Kd%$xiw*{J3;%< zzgF#y%fBNjEPQy%a%U%}8G(nl7){?$t;`_muztB^abL~9owrv6%H=#iv@GkYg|s<e z+~zcgh#Q%W37fsXKInB$O-ZTPl971m&cBJlkB_PK&zv4^lW^c#M@O-=S<SD1Ilb@i z+$_Ag$$y%@{m0w+*Ka~vRX+TXMnIQY`nic)wzR+ZZ~gdnna|5PGc4ZS+iP!K+I45& z-&fMdE5o9)4z2k&b7g!{#kV)IcJ-H!cJJK(UvHAft=VQ3s^-OM-yNHy>b~D?Y+{my z)QAn83mHJ;F98eJ#qO4unq`qcZ$as6ww&idksp5E*_^K0%(hj+G^^a<K%%hw{_2!t zQK}c8eps>DWr?<?q1+iuqx{ZKPmeeCynXCErGDq0B}<sH7TN!wbLM&es_5%pD`oC) z&kz2rAMtWcto4J3&Tpq^TJT6QFfcrbg^ZWV74I;<JPovn_(VmB-t=M%8N2!UHm6Fa z&CFZ??L?&7N$Hs%^QkC(cK;|#f_K4&MVXhaK0p7SWIgfJ(lFib9Xl3!Pp{jQ;u*BR zZsYd+?0agn^#12vbJi6M^sMt+8Owb7xJ%yReIFEZKdtJx|7nZ<@~OA3uKqcrW5th$ zbLae-bW886uAHr!(j~hyyJoLfe!H}z<1YVJms@+R%S~15H{ZJ*xyvN;NJp%5`?fHx z<L236$91wps`T{A5)=P!&)F#=Uf%jP23!S9fu!XJpMNS%1eF3QMjIn!BqdLNVP|LO zW@!Q!0IOH8{<tDQgNKJFL__51v6!t{qJoC0sXJrl&6@S<@#AEhV7=+`RwWu58XC5? zd(Zed8%ixOvM5l<J>K`E^7E;G3mJ}mzhD0UZ~4WqulcP?yZ$_#e#N|J(zon0KkfC` z&y}7%S#r1K#;Uo8-oz-qP5duExkS}Gi03&^`nw*FHF4Vwp7Tw7cB3!;-Lv=8^z0Av zJeBYE+p+qlKCfNiqFr@!S2*lbRy42Q|NqlwwH+t-fBM}0|6%*##>Tk9!uXKY#|$g~ zXdO9zy!eSn|I5oy`Q<YHSDJx*9wG=EyF2yeOUXo!BYQF@C{8{(Y0@MWq0Wy!3j;DV zLZ$oLT3V)PifK>vN{e!FX^C6^{o}{Ll_6PMXH^C+^jd1vrzzI0D&)B}>ne}&+_`h_ z-no;Mlys)zHpBmmO{`t__QoFX%ROGEG&TJGKHu|mCx7^P=e+%W!~A<2%{dEyznkwn ztLl8T-LhXRwU?fKyH?6P-z6nA(KRLW_rg%$+rPqGTy`!GnrF5?|L%>ghJo+C*6a>j ztG1r|%{iAH<*~`PPbDAPHR0X1ty$N$td5>ADgX7wET@tL^~rbDFaG^~^zZNEZZ31W zd;XZHu&_4?3$Be&yz+A1xfz8W&{8ZVYr|Xy28KP#KWg?lC<JJT1g*Ss^=hcnL=Tlo zSFT(+al&KS5gnmU7N*7sooV2nn9GvuuRA*=r=Cm!jXfHEO<g7{B_$;+EG!~&q{nD_ zfrX5^y870r+z!p@r;Uw`XZk(+!oN38fAYx=4P)cUQ}tOMgg$)u+;9FlyRtLwZ(X!@ zSAAXc{f*?u$Nk5foBHB*OxT@xc!67Q*5CHmm8I)g+uAtq?&AGcVz)o<^-V_eO`q01 zzmXw7dD)V}y-7Pig~iteXFYjYl6H5UF!QDS=c%{0pPX-+?A*5ewR*hWMZ3C1g&ChU zD%>KLr587@@VooyzMsAH1o^*b+s^Q<YwDao<5|Nq<Md6gi}tdz?mFD=DqsJ{PVQIC zx?{b$VQU2ZW^7m=zyH}{x5^E3!HWuJFu3Qx`d-e=aNu{sr6rz>jEvj1ZF3QklY964 z`SC6Hqct@(qjG=R8^3$-z`^C(wQDXS;^NoWMw|QlpXc)B)8f@DFP(3vH`|;)(R!j* z^8bIYh1LIsEq2?=D{c4o{{ElYY3t(l{(AiF?asbF(P_8ev~pi}cinq)tNs5uIzn&X zUO1>|_N{xF@BPcp^W&3`bi{fs{q^hXN%^{rgJpUQ3<+i1uiW(ADf<2Y1BQT)1uUSd z-oZ6ulZvLX@&9)DQ~T_N<B~5dn3jIt%f?2EPhvyqMWv_NX}fmpNV&H&II(kYFR0e* zx$*Vs^tDq@eOzHTJ^SUQeU+6*H>dyahb9*ma6!RfuzS&>NlU#a@B6zgcy-v<o9C8x z6_%`-JHf!p;DWZnhx)_q@2_OYO}AbfzCO<L`MJ=Du%E1~b6#D&|G+8!{$EJ#wKn?x z_i(;_ZJRgWUF0giKDPSVkB_&Z?Zte^*@Fz5qj#CSeCVvZ&3^yJ2@~wB%lWKpeuORe zo9N!3w#Vw=xpV72e0;2}sVO?y|IR#HyX52lmV3Xu|9^A+{~Pn`ekmJ$y4=eB@zlY3 zgW9U?d3Wb*-~^Z8vJKM(m>3#f8s>{!dHuC$=brfeb+%Ps0<`{r+Wc9DFa696Lr|Y^ z%FCY4&Pvk-UQ3ILi<9peM&$V{D?T&Bkg4&&hh0w2={pS>wS4OK<^B9L+5XRk!<Rli z?32B%7rSfG#V4ERPPuvW)~zqERA1bU&Pe?DXG-VccK-SH^>)h2k9(8*WISEA6sMm$ zH}|Q3hquRqmKO8A|MOjP@5^ni{awFnNoMe;&x=1lPo1o`H*eP3wQE<eemz0a`OVw6 zGv{qi@0YjzRqb{xchUD3Uv-%peap7hU0%la_;~#(P$FPp`0xxIN0*WMi5@y)(!aoM zIHP%*(@zHn2XD{0nPii7=Vz8rety2vqoSSl;=vjsY;0`Dj(|YN(WIF^X?HTGNwfX9 zer>Jw;;VKqFFwBa<6}1y)1O_X(z)5$hs%P}rq7RG5i;-Zqi+4_y0f1@xKQ@<)6=b4 zS08=;sqEfYbN+thulys&kDs4!AFm+LBVm|yZcb)j-`8E``Q}AW8ooa~X}Bz8UU&ch zpZE4&W@O}sHW}^-fZOnw1GJ{TeECvo;)xx<bVRsZl_oAMI8#toR#sfx-Pvg<XIe6? z^W@W_RHI0wBKhetl|>UK2so!#RsC8$mmw!|`#YZujqgV|pI%$L`u3KGd(}-{qN8Uw zGXKuGyX)8Q_u?}4bqk`m=hfBK<=)!j`1R*~35$XUi(EmY*yicy&Rkm?>(>A8&ELwR zo{v9e#dT*LeQI`NYqmC|1#&<dGLD8cU_DdW!a}BR{rY@xgHJ=S(?uyQxhN?~Nia1n z&1-4U;S~!nTP*Wh%Eil@T4qvgA=Bw{=<&y%^+rch)KpYeSB7ZK^f4=YbHiw^=-*O? zJsa}w&b)JHQ4de+{QDByiWA%C-=8sMigu0Nx&8mnUt1qv|M=L~M&|q9nHRJ3z1f_= z2%1=9U<e77+56Ad%7c%A!6y|`Or7yN_TfW;z5V|0HQ~u#UR`0Ub<0m2JlNQ=X6@Qe z4L!Ye(cAOp&6_7WOJ>8W*xelb{MFXGYZopwzHzQq_UF%5`#&30l#)){`?v1jRrK`K z$;s?$eljP^l-~UQ_gmF_`nt`VH-m>)4E9F9db2FXecNUR2IE8E`Avpm%QBtEpPue^ zZr}Cd>(ZR(hoqvTXIqtKZJz5obxGK2S=qNY&n*hdxOL^@ot-5hjSLJ8=HS6NhK8Lv zH;ZN-UwwVKf3T90)vIiE-vmqLhE-XgpLK(-o?&2M$cG%eWc%zx>N4Hwr(KmMep~?_ z)j89+p)GLP<}*IbQ@xHpESPbfbDH(!$cd3x46^QU27D~pb!o;7Z>7N9;<9^{O%(6_ z|McjJ#{CVm)4X^ZN;&tf|9^VM;(hzvPnYE0t%_WG&OF%<)LclAgESXD{H&SiaRik5 zW=81r_4K6tYHn_3WpbQ(vTE<Wt5>g9gn%=XmPl7o^17(4T^%!+N_H9_P1+c@zQ3nu z%IT*oSFSwc<Gg(5JIM!IpL~+`pKm8^bmZ;N=T|iL%{5Up?aIG??cBPxvi4e2`+gba z?oLcxX@2-eZmn?NuUov_-b-7quHJT@o5Q=~k^Owm0MWZVkGF5#oSpr=dWz7JvOg<Y zHYAqqbJsN0D*2tixVB&Ihtc`^=(-zcuYkpcYi54?_4fAPTHzV?3g^AAUR_nVEqC{+ zPrQtvm813Gt~z4eCTZi13!2zkL<X(Nk7u0O($T@OH}3u8$BTnjo|=2o!{5Igo=4xA zJj`YKQ{B#YH|OT2dAqBdpU=M=V>9pnugp6uGv!=d?u5zhVO{=B??b@SJ6YEbHNR9; z%DUC{d}G4K{pIHq<#bZ{6PR92Sv~*Q+*!{GO_jH17V|G!rW+-+_eZe6#od|O^Nu&| zT`u-v-Le&Tqqe9lTDG>r<;k^0s=YkjAKuyCc=5Npnf>#lN9#5e%Y)+XgBZMAWNLI+ z7~ruqXr_<aL=Ov@zUkAaCo*pWj{t!djU*>0J3Bk~ntK@^PX(RfqMFv`wKQp&;bO?} z^LdjaDM~%E)@Fu=6FZEIjeD)N-*__^eEa==`>(Ir-#!&*9ShwxZ`y>ysq2=@?kfEH zsyEujW!02umoG09^0RJrZLj_E{PQ{^+mg~ahloQT=id0p87i@T>hb)=yVvb{_3+WN zXO9X?L$6=lfAMNhh|;3_ZolPJ7p>OJQj)UVVQ!lHZsXnkuWdvxJA-1d@7?WxM%Nx3 z+;e*R`*~JVj~?p<dG)~T$1lECZ7XJAXjqjFDF86rDQmagQDkRlR|4%IU$kS#j=a0O zDyyo(GKvmNk}_?&zV7R{&#zZp%wS?(t`lYQda9=R;UA3Fooy$}e(jzr{BW*e^|wo| z-PbnGb-gMqFYjMc|KNaKj(U>b%EZG*tUKFu!+x1p|2^~J!wo^@n#w&lQcv4`{Qf@5 z@FgRI!_gf}&*hyeO|j-?Fi?i<voY8^+gyIyv{$oDSAX8+x$<~<Txjgq8DH|k=QI90 zcGlTCG<^Lwo<GZ988;t(Sn~4HlPfE8ikE}O?U#i%zXcu6#c<E@%=sBtSA4v+|4q5{ z@+&>7XVlzFui9&8XE*PyPTcaSty%Z(-OEW2{5b2Uw*K$`)45|}-(GoDQ@j*3BgF6w zTH?I4w78<Q=*}IbZNiL~UVqip)QqqDsd~F}ivRlS?{98?zE{WLf4cuXo8J$bU*)8O zaty<NUeGXnLe&{>j;~dFWAxr%UmxEuXFJ7f=|>j6cH^`&5)(aAY)+LNJ91=?RKU`p zojZ40T3W8Wn)P^FV$(+_8NT*RiAx6G|1#})b(mk*?%xelrAK#OT+F?3j<w_P!;o8> zug|xw-j;q|ZrkP+Oj~ZLv-92g@b&Eh$mMq*?t{-zHsH0JuMZyg@KF=)K00yYM4$a} z>&r_^O`#S3&X{!{R}?;9Z5X~b%GKrA;?y)LC&R*;nwpLi7Q78z-w*TuIpR{fJx}`j zdV6;lR`YV*ds7bbJe7%l`F~NY+rg!08&limVl0ZjzB}Fjz3=SZnkPrwd*-LwPnYj3 z*(J2A`f<psX7jzwE26se)<$mAe7ip;aKSyBx|<U>?fuSouA^e<=lvI7di6X~mA9P# z{ZsO}l{>Tj_x$*9yi2tHk8h9A+`f0qVm$VK|MU65!Q0*4-uwP;yL@{oXqhkrWFEnQ zcWKbfdGqvyI*%l61kX^3raYc`?%cV&ygWlg!()rv&KVib>?%WQ4A{t>zff1IxHanR z<BuIDDnuGY=hs~Na%Cl_X;ug~udm9YTW4QIicZTYk`ooSG+DJ+TSs-#qdjwEc!O7I zUwrc9iD+=H_us>ZE<M^aXN`@nu)1>A{k7lZcsomGRYz7vDgAc)`nA7X-cWoOkCa}C zf>LhWHQV04xMMngky~Fm%=0bY{^YRryQ#AiQm6io{;}Hh>*t3L)#GN)EG{@UY5STf zVTo@1oS%2cpAK5DsdM#N>eDBpll_7N{yb7#_{crdlGREJ<c18cPn(L0Orm_x+4ibl zzvuLMMn?&&Wn_O>XNQ-G<<e5Ah<{rz3p93_vL2mPU3oNQ&i6l+#yoptCRTo%7e7;U ztM2C7-@n?_=g3H1sb5xISUH<hI7*tmvQS^O{9E3imr0GWtJ6;Y{$_kWf3n)v^)WM_ zJV}W*jMoPhA~U$a$r`kZMnOPBgllEUsX4U=9~RWq)<O!%P7lZgotKY~%Azx8d{%~J zNtl*M9S?y{>P4tcE`&93Znw>73y6!0gRD!Ld2&f(lF5dp-qY1OJ0EY_w9HVxJAXxf zY`>Ip?Y^hM%KbMBufIzydGRa6tM_j4!EYD8ZS7)Gs){Q3Sd(Tdt*xYV%EQ9{U75?u z+e&^nBIa;RKE>T3w`A$cr<0d%ys0|<nof_O{si~a#is0kn*U!oQU307#GJpG&!0|; z*3@)yDSLPH`Qzf7JAT(YE<btl)WsL`{;yZl*Iqwk#l_=`Tlid#Rz_M@9^Lia_^x~J zCl#%08C|B9KAFMGPin5cyx>`~QrbGV@6$D`eCN5P@40sFq0G4tb46>KpH0^8_qg!X zJ>Pc$Q{|P!-lI?FFUk|R7<_i?=k2R*Mq~^BQFmV!%Rm2j_BOS`zkR<;<=@TQX?Izx z^!BgKrrmrwx7Tkx6>wK;V@lH9JA%a<Ulbkra^p_VjkW(*=Y>zGovvYS_Nbzi`{*Q9 z&7-r9yoi67S*Fhswq(uEwAxFHrL&(MS#sCXD*t7w5zpL;ok_pC)B8I#-oB{JN_3yH zEAcgFbhj|~w9}?8-;FNisrr4pJ3F@Kiv5ErfdYs3#_XS5v$&yS#kSw`!yj+%>{ztO z?(xT08$X1C%Ebe>9br?&Z7nSZ`@4=N?TuT1{q@Ybr_X4fF*Gzh^DN_VhKEN-;*|@T zGLvt<SrfLp*S!}U-EH1I=|<Iy7$ef}-r2hMfpKFk<L8fm4r*WP3wu{PJ0m|;);=~R z|8CW%D|ypgTtB_|vHYx*y*}SGyGkdQDTRNW9GSI$*U7$Kc1L~H^+mC}*Sl}83&=>! z{K|OouZV9hfB*W$&Q^2mXXLyM$^URA(Z)Jkd-biaYdbqWasNws-uD0G&;PflTzc^4 zSVxHW>UL|foIm%kN~>P=EYCdq<;9mbE7q#Nva?xSQ+K7hu&Mrl;oYUCi*~jbKPh(V z3wFyn@_*HJ-4pwqmrQj3KWX*NxAK4514S;y*%e1-@42yI{`zy-XOG3sa+jT+Hl^-0 zqhPFU#l2G}_r1ST7_%tp=dH#5ccr2xO<g)QxVtQNmzlnn&3cRUyC-h#ZSM}ty}5h; z+mE%GrQBE8`RxB~*!%Z$#H%~@ve6ai`y_&6E0<n5d+*fBN@u0)>fCoze_xe0*}U=G z-h~?<SNg;WDs9-X>hgt?TN7=ctG&H->-8r235hFypB623J1;lYuGYzAO6i}FMCR93 zf2(dReIj&o_m<Z-C0mv+yKw7J*9nb|hjCHYHm%G|j=nvqW5tFA6MFN(Tc><jpo6rD zKUKbe`&vAGZPeDQFXghiyKnPn)}(~L`Z~M!R!PpK&1bJ(IJ(<Rc3)^rNXXsO%g?W5 z)jnsaE@YAs^t@1UV)usIi)*`HKbPD6rF2!^SC3jtTgBCJ_n$vsZC(2%<F$FBq4Xo; zTi>@&IeTwo>G@WhRk7<|tTF0cF-2y!Ny6uS|Kle2@kOS;w^3B`{vLQQ(>^{c;QS;V z-L*O$GVI$tzjIrCKKS{w*c#on9Xh&eWoB>Bxw>>}ZQ#03r-IF^vzI^X?JNp5DU*|% zyx4h{w5#IodG~DJM(nlz95mmqX6KRzg+-S--TtoKc7EF5P0z2)U34fb?tZELQ+?~@ zC$DG9i$A@)vwr)E6?-RCKRNL9^((d9TS8mkWmlW7K3sDC_p7M6IvrcA-ac09_1>G^ zy(IDWwz(VMyr?NWdd+^_{S)WTReX7n81}1omS6AumoazcU0K@J-WQu6v*@ar=u=Vg zd$lXhX<y6gHto}IyR=0=T&M2i8^J*3cB@<VowGQ8i@dR(QRjDi$@=Wl)qAX`ua`f& z>HWt)KTVJLf37Ih=g)mrJE7`TlwP2wY0jmNqxzsB42FAR%g@9aGcYuO7F=K-hr->y zGwXE|mas^@xF|BeY^UDO2mjP-+p40b7%$QG?2oAYbh@FiufDwW<k7qCb`n?a-~Dt} z%)IyJ=IMG-Ti#u*+gak1rGK9LVsF~H(o?!Q;l=asuRQqhapv7C&3~6~JFk-&9li5> z*0Ck;T&&KX7yg@h^GWo5`B%FaeV;e==4Q8NwVQ8Ut3R<awmkjJ!`yE-qn6jVKWlQ_ zTJ+wg-{|JUFMX@!l7CwY*;aqcd3tK9eczgQ?>0WTwPF5Od;Zlw@*kMav#mDEzqe<m zar!<h5m>WRbiQb&&~~}}pI0APRkELtd4K->zh{kJlgi~QjaKYWxAafw^qVds^5x+q z)w%z_W!>F+_jfjr)UBf6iZ>@F*6Hc#<<H|_U<e5V51-ZlUT?(kfo}zPww;0DgVnTm zf7w$~o(5Uob}0V8{kMzw#qjk%{kPqzE@S?+dqY%h9dDw?nh70tib_T5i~4R?2?(C; zeCOdJ+qvSjO4_2OcR#$yP+IiD&*h5Yl#Yz!YD&LWSqonLQ)@fly(B-U<5K>c`2FJF zf1dpHGi}ez@}Ah^er3N89eP#4`}(UG=m^UKd94#CcKGY9&pCX3$-6tjR(Z$nhtKaU zD$e4UxV2=H-F{GA{b4<LAH9L?GuuX=Xuav(E=rFBcgCE1Sn#7}-$#whk!i~sy_P-# zuT}i1A=GIBIwjJ4-r*9z*=A=ql+0Ysuu3m``X_$Hf^TxB`&K`GeX6*3){cnTnwk~c zBe%Y>Jaj+)#=b(!==cA#HKvEJKJSupz3j}7eR<!W_DGl%Wi~wrtw&j~3VhQTs3{7W zR%~i&njy|?)YRNuTT^q&=i2M9K5K6pXo+w!GczYAC7tSh`Sz`^i;rgH(x9cwm$S36 zakV-f_Hj=4@aWjRdv~FL$O1-(_1E9u*?IYga`(w82UR}5xoPao-+tKek1IGAIE2DG zt4}~v7oedca94HGq)9#2txgNUi>y-JoSmFRxLjw>2wEAUHkq^aP)7&HOrK>zEA#H} zTMNEqB}UKu%7R{N-szt!Z1%>Tk2(7I<C*IJ4F5Hrf0*KXEqm#D+w%(^RQ>qWUHf-O zwAkw7ZM^v(!(QM0oqOuM{JOa@-~J@TcAmS`bkk(+@8~xl&63-8@2SfCG;vK^?XBze zvCF2L>Hk|C{^G|b@z*7){zXCg1$S)b-miPUCNpGp*x4V;we#-nseE*#^HkWw*queH zmoL2jx;A>doJB#xP06WGel8T6d+yMut?fxKN>ry!J753(eXPaAt2?THx2>NUSCZ-b zL!Nn`e7xCRp}FUrieDdETqVD^ZaV0=dWMi9_;^L5!-4>fB|$4!uU-vWTCcKl<;sZ@ zCkl18bhs!@bWjlJJ{q*r#LR43+?(IYZmC9+mksp9R)?&*aN)v?88a3vP)G||f8BWT z#*G_`pPey0lA?8S<Hn7UjSpuob#`{Pt&aHV_rP}g+*kprRUuke%ilk%{m44e`K$WO zqqF8zhg`pRZc^9hqEFdZiZ^W5ICr|zqs;eJv|#3Et~al4{)>EdVZlDVrBgb(<Wrx9 z=RXLzz3E3_nBCR2(Z_dvaXmb#!^>pW@g=%j3sxli-rA$Xd$n{$e(sJ_`+iNHb9`6R zoZtOxrEc7wYBX1V$+}x}biPT(-tX#=s<nxTm|HTdDX9C>pGo|(Z)Pk?47;-J%=y1} zSMG2K4qCO8U-peo$*k({TTP`cu54Q(<a@4p`8K|<x?lOZz2jBl=f2!>Q6_5Z>V@yk z=lO4YYhj(`vfQh<EPt_^e!oHGhX;+zmp`8#Uw1OeZhhg$M@O@-ubXQ8f$e<%I)&$T zD|07XUE9?(r@en|&fB*qe*9dR<m-6y^6`}9{Pf60Co30hUG+R6{o|um`|a$Hl+>-b zxw|m@@%nu)gKkgi@R&V4G~)5m%c0j_eLTF}jMuBr_<X}$)xcxta<~8bS)Z~;V6V>) z*Q#k%zKJUzGNvWn5>+?gHVr=Y?Ybzx(jtHRyJ`Yke*gRZ?%cUD(I3*_wOIMw>7eUk zGBu{2nlM4&S@_0?HP>IyOftNzwrIu-iNk*BX;V6Q79X1~kz^D-<7(E{#3?VsS6@Bj z<18@oMI&r2fRFR@IhMtzbb4PIZ&>Qy@5{-V8N1s|u=}?C`(4wgSL<3S=!Gla|LdK1 zFz>&qdeKus&Ru_AtmO<Ts`<O_%dT7O<#93VJ$wE=otO5#>4EUh!07)get%dLl$#+S z82B;p|9SKIyG2ahe!0KXj~3q2dhwyV=VXbk>kmB2i3#BnoT&Hr($pGh>$lwjUFxf* zNb8Gf?A(%;ShCCPV0}@_t*;+;?oTtmo9TW&nA=)w=a#fzPkxyEOv%jocJ=@5lEnva z&Q}i7G%Y*NdfWZ>buF%r7nui-ex7+XXH8J~8{60^yGnlDJ7ax4n5(11>gMwIR<Vlr zKUF`qx3w=Rc0Y4;(P_cU$;JKoo)r<cKaU*UZ)d-2is_=tkJp9Nf4@6xw?8%5Ywu?1 z?aMBmy`g(@TjlR-aym+fKPP8$ls@<S)Z6s@BlnZn-|w$o-8oNka@OC1?@f2Jc0Xw? z_M5t|f~`YCS8?W@?Ek3?r*r;KUATN!_VfJE%^US#-Iw!wBj7FbJ9nku+^@fT`SbFw zU%Nm<4+l)ZLs|?5-Mh>G%UEr>>Tl0G%kuNljhx?j@7le)vFgG3J5!jf`R_e>G4t;0 z9VUyvMDusNIJNLLU+&tub9vjRJ->J1#zz~q^&BtnWhBh@*}uSB{)Uv4i%Uvw;?eBO z+yAFGE#JOHcaEm---eEJ+UKIJZ}7|6uhSH~J1O^6K~CORqbUo@bXU(R`?|KH<HVs$ zub7pzy|tH%z1>xk8y9k7P4urXCqG|on`>3_uc~CPwz;g8)suO9KeuSS{_#?&`t`NR z%gZ*aXiaiIZl8PY#-zNbV%FPV>@|7x`PtU2$eTBAL<$8a)?Ku(vA3Fgt|b23?}zrb z_DjzFy}YsY`<o8K-d$f-%D>(Ie_ig~{WkW~#KQV=t-r`v-HI#S>>1s@#=Cr;K<XUJ z*nso5KEGbMS2xbiUf+4=6;Si{bWZ)gst<FfE-pR2Pj6SWn`PAg8nzW*PEOv$Eh+Tx zwA0Z~TixgHGTpM|x8|%{a&qzR?Iq?>p!RY{#>Yqd7#VANpM89Kx?KCwZSVkvFu04v za6o67-`ibDM^E0kar(Ty`1FjeM=M{omveVZ*G`fD=zHZCuluDd%lYH=G%M!JDOuF_ z;H17cf1JnexpOB+f*OjZMfD<r65HycYi^w_wv=!6Sv9rj@P&$v$NpAdU%$NO!OgcT zm0oUI_u^x#y`PC-#K~!=w#nI)E??kr`$zW1qg?-;Urk?lVqIL}BBSPxjxDaO{oLJh zueS7ee|mRke{@KQkBdvM%&Uz5DoTqE?Y?R0DS3{0cZ{`2`~uxwrQhyc{+7G0P4C{; zmmk(XTD0g@oL#M-Zbad_1(kcZL|$6Kds{Cv=Z&4m-U7qvCH~U8O!U4-U(75jDl$2` z%ep%JZ%N={<+*C=+UsX@beT%|#`U><FY0^9)$2BS^6?s-bEiRl?DA)sCHiS1;?JLE zl<X4!++{i|$=5H=P*mD!-;6(Z&OJP{`d^!Wy41VRlka~szjNl_>(9Y=7Tw$GdTB%M z?Q<e?{H}G1m+9}QS@`Dj<oVO*mg+5zoUbR|e>}Uyb=B$T^D4Gj?yvj!Y(9UyX;od1 z)6FZt6~12C8l$wR&v}P>S*+jwn=RKTN|~%I4lXqKdhhRU$*c41nO&}|=v=$)!+LH> zp?#PC{B+XF4NNp$|9;o}Pt)gKHu>}7;<fxkNoGgVCB(Frw)w`%EZ9`}`RKQ|vbVO? z-ko>})b0wnS@5CxBm=_-HZ|W_A_4*l+1cJM4<A0PtE=;weNg7bn(MEh7FF)A`&;$p z1!!-X{__Hh<YPU8oi4`~`=tB$oLPN(Wr&u!xjA^s{BOCjrHo&{oNZH6)2SmSF{xpo z`DE<v_*vHSD^!m4{x1Feto!rx^1apOWfvDkF5|1ea(%jzQq^p$9M4bhl>OPhu9sA_ zy`q2Q{##xpn+flCJhMD>`opUokmh_}$BT-Tl)dL=^6$S$tv~YqfqG)IaoN)?`G59{ z^8fv_X<ziSFMrk97p>BlT<*K#`^?90rSILl+qt6R{dMN`U3C?k>^A;abBuC&%*Q`H zH(UPR$K`_CT{izNfAcQS{b==mxyk0$hU!|2HlBBQdTdXmVxC~~V=EmowRNGqUpL<P zlD&JwPTfBBn7r3_FZXp!nmqaaot>YT{!2giVeZ=Jv2*>cqtDOx|NK0DwtfAK&V2{B zADqK@c2A3eo!z__{|+>+-@|diB(LqK+<S4ucfNJ)|5fjPz59DUpH!CQ$79?t*S)<L zpM2rMwAqJ}`DL@#gow?tFx(fc?mju4i-AFB7ia+bsQqomd#R9(E(f1~c2yFbetPQ3 zl%$OoMn;ofUVr^{-MV$hjGq=&W@TwjKW!>!`mV<G*{aah9UYRo<!YB-K7Jgm_H3bZ zds9<Wh}P7b@1!4;E?Q*A>iJ{r?-y?5zK7e%ot#{JXr-^`-A+_H707S{qJ#o?O~? zZB}*uq=;?Ticg$=Wh{8})-9X-(wCPFZsi}3z5Qxy&YGN@x0{Oom*hR%Ym(Hndg;{U z<$SjL<#OwvKI^tT)0dj<tsU3C@2@-eyj6NjGv3(PsJXY7Y~Qw}DCg?--MjC8mi*S2 zrz>q<mUrva#>Bw9bxW6q&OPS0uJ7xd*jrn3*PPzxpK^WjN;~N{K6$mF>*v?!9`saF z()z!*e(Hg>(P_VbZ=Un}NygHXhT#=TN~fnevtK#4^UE{tr_Zj)8EjGgY;^ka^38lQ zKe!+#QE0J)h7J&evpo5%pc8#ggiPp7x3ae0y>sW$BS$3qrL0aLNzu9`C@5I9_uld2 z?n{HFS_iKUGtSp9DJwHOA_Co8bZ1}f?HY5w4^@hawcB!kzq+_sXtMjdw{{utdiI^o znr&ks7`b!DmRC>z&t0<mul@O2*WBZ3-=^u?$L(BH_3O*g{yTI1>U836EPqfm&v!3> zkbi7W!24S|nK#;U(@k7{mT%rX$!Heuo1__^l@9&2zP>*G*MZID*ZbvMYlOGeIoE7j z=CNA0s&JXxM!(g%r%r3{s{Za67r1cS29L#;v$(rIb#cAF7yjJPcr$;l<&?kEb=K>C zcu>%$zFq8sA3tBZ1@CH}+w)I9`1~_6GXGOK!~ZVl@c%oNcU#TS{!@I-H|EyfpH96o zvm%5A1A~H!k{*58S37%_i6y8MS;1j?12nyOPq4-=9y-?g>eVZ)iJ$>i^ZPZz($d~8 zii(O#6Fn3JI*vX%a>PaH)R{9=yq2~FIxjEund&79TY;l8(WAp-{q@r+Mu&Zzef0J9 zpKalt=#c_li!*o5oEE1<*Lqn7H@ChoJIdGZ531}t|Ncaoo=!)<{iCN(zy5JPfADbU zid1c-C}}^JFPH7o6uvIWbv~|UYd6osC1u9pj0-zbz28sM?acVMZ{GReix%@9zBb=j z-pRRhg?ov+(kqF(eH~V9WhQ6dn15R@o!<U8$D%!NU)?^>yenUFa&z_Le9oTNui4r9 zXK%^Vu2sI$+xcYA#Oi>SsxWLmAbEj-;e%RSJ=>RRj&z5^_ClTeWDE|R&UyYb%<bpT z)`t%_Zq2^^^_A&{((L~0zGp4P)VyCSP201{f15(3`whp{7bhK5yZ!3#AD$Qb`%MCE zgpKW(XLT&|pI`SrE-m8)kKXn_+pYF}o^q=A_IC9(k-~w?{cN`tGcrJIes2Sridw;8 zXt+CU4F@Mr%*u;4N!HW5Cd`k2^5)Kw<Hw)>`g-QlrTSYRA6z(HpSS)KTh{LW8L#tR z-T6}WcXRrAAK9xWr&Q81Gk@OB|FpBXzT%tD^obJ>1_izO@!@dP)m5SIZ)_BX9FG(# z1sYsuU=U3?#-n+8M}=Yey*<glzpb?UxnyO?tzd<MG;_nvUVit^lyRlT?yLFv>FMd5 z^pD%4w&%qzdwyJg`i4oKN4q;L)Thc-{`zwB(b3w!f9@Su&IYBXd$yoH9|J>(iT`=G z{r{|r?%Q2G)Y`eXDp$^U*;{`5FCRWsOg8^_u>R@0ckkZiee%8fVcQh1uX`$w_sMw9 zH+Z;s!UQ{B>1#>W${^DWdb4uW85kJeD}dLx&e#^CCl0E;igwO9{P4rin#V|U>^oxg zK409CD|1cYl)&?=R~fbX4>nh(pX*RoV$+=Z$}IQL{=a69YtN-yYib<-@=3<Jtmo~X zdxAT6y6)Ted+(k_T->GXd^M_*dELN=3_OU1Y|@gdvAciuYUsiM7FO2Iqe;&71qB=W z`~5*v?ekW0OS`o~_dodTG~By)Z)b<5)#<07oZI<UUd@{7b@cJaxY!dFM~lMQSA^{Q zx$Lm{{gQ}nZ;m`Vdg|-z^XFz=O@4Of9j{cx=DFf~j)0Ech@5%u#0ihENtMTS;@156 zc>M9SX{Lt`{i^>SE4~eMq7nncW#}jeY(A=I^?9S2I+~iEN)si{i*U7qS5Quq<mKel z+`K+=Wr)#bB_$=;CVC-6N%#9|YftjD-Bu1yzx@4v_v)*a#m~RR?Ebc8^5s*O#eEqj z{Wtx%PA$Ct`uu!*c`>nLWlEuOAy-<{&R#n+@2`F5lD}tX2M5%G8lV;7;DxZukT%g9 z&Gb>4SYRQeudjbt&2gf~ksQS-;Kh63-BvdYPR+SBamth>K`VI-L$ySWdnKoW?jrNo zo1UJQW@Tw<*qWoZOmRw~&to%(r{5p8iyb_;*VuTu@7!CtA0MfxFAx3vT>kX=>l^1@ zuU2{fphwmHU*fr~+1Hhnls=e8=PTRUt*!pv`}p|#*LQAyJSDpS>gwOuS0*1V3j!sm z1U;F(ap%kU7#IS+`ph!XR8Tl@?b@`CLx&Il{qtwWw`y%wRoB&5r&&LFfNcrgss(fA zEP8s{e@#^Br^EcZ%Y0v3)mE8X@1B*T{<Y04|K6QFm7mRWZ_Owbo$I!E>GG7&`(Cq) z|F6sye*I`oyMLDHhT1Co{cg<d&*y$!+if~)(sF;@SJC3>PlNC7`nuNhb4^RhtU13| zy|~NI^r!mi)4;#K+}an^{C>MVEG$e|-LK})kB{Hp-WJ!7%SlcamXx%t`BAX>o`~St zdA8Mme|>!xxAf2)>vDA!m5<ZogQ~xmP4(Jq_wUBkw>=CD4YlCW#XiuSaT@r@QU->p zea+5mMYUTZBQMw1TDP^RSXr%`WBolNF3#|FWoXn<&VP$~pRY@gza?0_>&2%_FE{qj zQ(fEVw|PySuI^c_zpm-OmYUxGBk}+ES?$1R|0}f>ZY%w24JXYNl>WH?RVnwT_W~1t zoss++zv%j!$j|@(z5l;0=jNvJ_xG-@4!?cl#)jhQp^;U;l;iLJoonT~Y^iNW_wPq1 zCT?6|#|&B!st)N|u2>>vzAbXwo5^d|yaesGJt?%b`Eb`v<EJxc{>*tE${86QWx4Iu z?Yp-6-~FG9-SbvHW^s#OGNLHqeq=YBt#1C_7bRP_tUCPm!g}xNjk%ZpHl3?U$d*{S zZqKJHXYbuwS(&U<^!Zzv_U?w()}yz!W{0nf`FW6CenUZh=*_#kT`w;`J=-jHb9w%& zRiS^^#mzOzno_y_FvxulOCj5G<%&~`1y4RL0`K8G?en0(LTTcPGa8qFmK(Y%3AP`e zc>3v?GyA(&f|g|WJxpy|-_IGKYGH9DYS)*^*5zp|EFYAW&lm4p4Jw+JRvjpdo7(9Y zyyU7_X33RZ_qIk}+Q57JT*iq_-xFTnzbsXG;q*Cc*VbEy7A1MvPQPrLGRgN8?_rO# zedp4{a%>C#9(((yXAyVwwwNE@KdQgKtNqQz&CNaS-L_L28W+yaEIx8Fvoz(2{K12J zufEC*US5`JtqIBzD>4w(KT1irKW@E#Fw->fYN6<DIfmdC=(6qG%d4uY5)u{!Xr!d6 zsj2;o^-)UVy72TE%Zf#>u5bVM@%TMPM%!y^EM>*Ys{a1k{P<X9-S=2=|MPA+%fmP$ zZt?c_sVQxe{(RZadHwS<Tj#mB=;>QqyO*mdefl@2W0#N8qIYc*WoLK1SpCk$MKAfk zl%1N|v6`LxC(pC1-Byx$X;Z2?7gx#Vw68NvSG&)(3jHcj4Dv;VH>4%KFhmQoWxVif zq=rbBi_+n`l(x;AH_x6O?c>w)amB*TK0e@M688Og#Jv@CkjT@bol$F_L5@j?>pcnG z)Y0#?RLfk=Vd}Ss?P8nLtMBeKPQJRT&b>da=F3I@#cpryDvi3|?qP_F+WTwD=FeFx zznr+S@$HpYncZTwJ+DBAwjB7)18JMuf$riH;c5-hntC!tsI%qp!ymtX9Xocct*uRH zB4p9ek({`5=nX0@vF=tUMZu%Tj#*h-S65aRTFiOyAVIGGdzR0$FZ`XLb$h3JIY02N z2<tU2&AR@j<bOwp<8-~JW$*WW+<bo9>8Iv5&vD-?7ZiLRwI#wj_m<-O|LO1d9bUBK znnA<-PBs?qh^CDjxXl6_H!AJwDm9goo_2%H^qtlswrrPc53X{!CFif;5p%eb@ZN93 zng&*ujhnI)6CDMTQyf_wPu{aXmSe{9`%u8W`^EEr^E{vP^I5D)<(cOnef}@|{_bqV z_I2^iY!!*18r;FvJ#%Z+K4S(3hntVzy?giaWoBBM8^_1bpJ!W@YL&+(rlzIstNOa? z#L6vOwpf+EnlWpZkdu>>)0{bTWMpK#%w(q&H#VA^<#g;S)7_dK{_x97S+~BNljV!* zZ|*EkpRDHl=IzhQ_jg`jU;qEl=gsF%uZ!7P^!C<P-l@-%bt5(;e13Me#`f>w+`Cen ztG+(1{{BzK`dZz+J$h@SuRjHC$ebd{`O3YQh4+UaBg0V+&?qH?gu_y=srSsjUXQPz znj*BKAtp9@_pWVrMJ_utgRhj|e;dE+%cCusvdeukkC(3tdieD8^p77u&i|vH!U_g9 zW(&Oc=iW{VTfc8j$Un=fEwLUQ-n+}b{`3Pc6I#kG1-^gz>A?pF&6?S7$LyK0B{O)- z?Asrgdh7emzLt1vOW)Pi(jR4e(?RElOPT)KQe9kJJbBV2p4rRqeE8lUyZ6^7r;jC9 zG<H8onEvhU#VSx8+@J(rhQrYCX>qjq!+o`f^Y4|szQ6xv6KneGtI?MAbu*&oo-EhX z2xnqiw>@KH<)<gfYoo94tqR?ge%_#DK4>uSLGA_c0hW*Nv7CtAtmA!o%Rimdn?zhY zU6lSt=54s(RcqoKEOK<yntyNquRUoytGa5UHlr3(_3vHL+v`?`ou6g5_wlo{7o8s7 zIyt%j=uz8e*5Xqt85yrfZ@Z&2QD*D*?K_HGH<iEt&?j4%1!~bT>;Z>Ff`rn<j%AsR z4hIZ+T$Db3|Ni{gbe+gYZ{EaYYz$kyb=$UU^F_Ol#>K@I?c8%>R$gA7*3?s{PkZZ# zy}tkN{w$$Rm(^Ea&5L{D)xdS=(xzkj`@i^k&;EQ`fA9G@l{c21y|&Q#`^GoU`-&ZB zZb?0D8hzVW=;TE)-F>@iDlhG;JuE8=4ZiQr%%HQ*m6ep7mIhrk(Vgf~(#&(%#m&uY zY0%%PNgE@suevt>>&K6R94xI_MW<t8Vy<Lujar))8CG6B(R8PNsMghbc1EpbSyy|W zoqs=Riixp8LV%Z7*!_J6=UV6U^X)rXzV6cNmfgQO_Zd&ok~ViU&D&G=>WXmg?Yi2p zt5i%%T$cOs{^SF%C`)Anr4UfKoVa;2Qg8a{6r;ApB|)05fw8;GuI9Qe%bb-c;nd-y z#?8m~?d#X8_chMS&J~oDTp6NOYC6?Rb$ie4A2KpBIwD-9+r=X%Yd?MUDk?*OVc-9K zz9n0}+}L>0G&^kJOK0C%IT3q*73ICt-d8+T>-)7Y@Af{EyRYfRzBX)k+F8+s1#f#K zm%AuA=Dc|_VM3xs0jSnvuoGK)HS6a&1_p-I{@uHGFJHcV=1fV&Bj?ZOzq+#WPHF4Z zxpQL!0s@|dBqc3sZEan-Qd3byMdirJlP3=zT$pm1QAAAiYsTqm+16!8Lf7Znlx9_z zfB)vRu+q>r`}w)KzOzg=Zr`rI?AQBgbLZB6es*@6ZnTgS$Ik7`%I9zWezM`LC$k^N zU4H>5HV?Kr34Q`jY&m|neC|}=pS^SDj`g`>+bS6pTPEDOb7#pC6?b>{xI@BDVmc8U zDnCCHs>`UWJ9ukr__cL=Crz7Xn;9g{-|zSBo0#exMg|70K9;YG-I)F`sykG+flg*% zU=Z~?-p9KwUw+Pv7Z2avyLbNmtf^Obbqe>pxY|Cl4lm3$%l>?3S&Kl?`?$+zJwagh z?MaNYCr_%Ie{;%&>hH78&APfKa&ubE@h9iI#n;!=9FjJPu&uAVvB1&n<HySqX#%^z z$JBnX1ZO&i6$@INKF8O+oIB4h{i;@>OUtc`6JOr1|2|Rq)c5<5VRxe+@B3z_`2F2P z#*|*rWfFIj|If_5_GaJi0F5;>)E(?=XFYyfyU(#Xlv{kBwCSmL2b<-$<@~&MZ5!Wx z@PP*l&Oj1)zx9Qg0*5x~xCSasTycS^Yf;85J(JVC`_`)YUKVlPsB`-6*ZWg<vHse; z%dxrEtfA=mkte5bZl3$@{(M0ZlP^C%|50@Qwk>b((ev-4Ds5J*y}4$?k|j%)Y=}I2 zFGe-@U*_j$j4dX!O|uyknRmoq^vpkZUqkg+ul0=Czjyt3wfgGJ;^&*bzFr@<O~*+o zbM_RI;=^tEQs(O-Yy3e)V*?i}Zw3Q{0nbDam&;om6cQxd{=aRCT6^u*t*Cm{)0?<j zofHIKoPWjtZ~L;@vuArP{q*URQ1{WKjW<r8_ST#JdVPr2)H_U09qan?CRDd8GVHm% zqj2q^!|L;FUuR`UAHVyzrS<5k`E^$FCrvt9zOL)t1x456egDGOEs@x>Dd=a(tu2$C z9!Aywzwz_)?j=jlM(zyK5eRv~{1;R<9(Vwbro$Z_9RVvtOnkjngzheg(0OKc;+J-- z)55iDa{~e<{9BW^A;5Rt;<t|;EeczGHOqAS^qa?zFAq4oWQj_iqnB6Ly1qOC>jjK< zG3V!9`~8i#zkj}2Ud-yy)q0Up>t>p~%wV;U+x4ZZZ`!pLiEo~WY)CzA>U?!i-QSN# zI^A<}&1EeF-oL)BZCZNny#4nT!N;!zd<8j;p#<VIflilm=gt-Fj8U6x$fG>fOS7w} zxENAGsJ2`%Icvb9sA6L?M_|&NIXaV1mTcbT_;;4q(o5H`hbv7ih@R2h+}!G<Sia9a zC1nX{3)U4~4`1J_S1;~g?Xq8-A$9)R+_|RNzm_dOAG>i;f6TlWFHY2aKKt%)yJ*ex zRUJ`VerOqesxJS|7rcC4LGkZ9%&YWcz2r=@>Thq0e){PMNaxbCaT^>$w!WIq*2x8G zuYHIQskFJv&%n?%mz;v6X5HQ0`MGzibZugC^W(3dU3+(m=3DL1MRp(V&9yE!%e-{t z-o1Sh!ux#7%D#PleO=lt=SSxD=g*&Kn@G94yB}WmtAJZf=f<8&<MO?^(PyS;9=9&d zdhy==!nt#glD%77RoBGJm%f>?$+dgEjg5@De_r~F4Gatn^OYR`u9&!h@xCU*0txT| z0}Kp%j^Eh$O<dp4raZ5vTdZ`MuXSeP$JNuX-#p^Ndw=J>^+iulnPy+B`M5G}Z&m2- zvfO?4N2DjKZ{J-NI%)FfRnF}HA3T^XU-$Uo;jXy7OuxTydU;pNNmzV2CtD7wmlqrf zd1eg?F@`C;wp9^dUnFi#@$ApNon)5N5w%Sx>CTR@$?Dr*-wOTExBJZ5vzs?nR8LNv zsulX?&6^)pzn-5ybLPtbP07dEE?x{;`9;E4epjLL-|O+e_x%30V8Lu@b2nF4+oG~< zxAxaR*^qd)+gJx=m4o00P<_b2VCS?sZEN^C5&KG`{I|F23=K2y?s{8Lc282M=ymSv z-R1A)Bqbv!ah~oybH=AjtL94Q#K5JoyW7@8smAU66g1z?G5>b^yXWO=UAukPt!vlO zSvAkn_}!t_k1xQTJO+J8+I@Ua7=M!^Xyp<OFNGi1`@H|Ezv_C;&(x4Ob4JLw4+VRw zum3&JI5Biph@ADegvD;Jr|b8hIdMXF%cVPaY*bZU*M@zbwAttL=g-pibu|-%H>X?A zwS7Hn!i0+poA>`atyo+fzcxZJGjr#$yMJ4n4_}|IS6lz)M#jb+g`TdUW)*`559pA{ zhQtmRrR?nNoiXp;z6G@n9(zyInQ4&dwD4%u+G(#%U#A^S+BkiBctAkFMAP5j->(l^ zxo6LwBS{;BR;sj!WI4Q^cVg2Tr-dB+{MY4K8Xi4<bm`8~rIjTmueRkH&YPFWEk19y z%}!7Pj@r6vb@b-EySpTf(@NgmsXQ~o(8f*I`ASx)hlj`7sI67s-~HWYYFiyue7ulH zcGvs*|F7*zvwrhRFEY#Pxs(y-H}6i~uP=SyzRCYx1U_k#p&3%{gBms}LKjWe-v5>= zp=JaELG=MTVwX*H1vt3Q{`&Fb#M4hsrm04fhYeaLOjh?_bv0{R>d~Z)VXIRm+*XF% zx^Y9KYhl>xqe+Do6%`XVGX(fpm8`hG(E0ED`ga?1qt9GhYdG87onPig&Zj43_v>!= z2qfj@$%%+OdHQwr?%mU8&Ybps!_wHav}IGLPVMgY{{8Lk{lC{OvaT9g79>1b6S@5V z_x;@6;_)kDc3$d{lubYLA|o|5E-4dS!rkKq*9)heMHj->0`N@qc=G0r4*1%cty{N- zXifE6%GG-4{{48ZsX|T}v&zcKrg^9s&D625m?5y}Y8I#B9i77lcUtQnN30C__3IZK zD{EnWrM-nk#lu6byQbbT%UY*qt})fif3B5l;FP6Hmqx9<#;Ya5WwMyj>%jH+@Xz1M zzI`jZw^2Fo^|cv|%-=06YILV=n`^UkZomJJO{tbbp8L<vX8$C+`Ol8JzaNkF2HxHt zzdr8niUkhQ+w-<MHqTo4n+KG!mU12ad)%IZ;edN#dHMG*UrdaRm0N!N{OLQ_YU=KF z8#Zm;%+1BsHOI@xXUm2S2BxN}EiElA7M7Nl78X--tQhM4{Ht!-U+<IgB35~^*Uz7< z#_45Io0sX|UwEpMTU^LIug9uD;ohxVHNU>}U0z=9<9TwDN8eog^-=r(&6YH_`XnpB z!0^CXb%ngCkjVpURt6F1_J@X~i_85No8|8F^F7<w6Eb^7&Cas7Q@3n+9+bH|Ztt3( zePL~~mWyueFtpOqIe744cAKP0W{`B=p1{Sko}b%!ZcgQ|c6q<MduG0S-#_;m$e#gP zH3!Q<3<iz)Ny(RYmEHaL;o;`Z>9MA>eoC9y3CsWAQvTjSeR;#%+v`8iUH9hZ*4J+B zeE*!=-c)~GrC?HW<m>C;lDp}1w`TulW#QrC*zxYgi95T#woIP`HuM*y+(?#at1c9S zbW#>Macguf%G`B9$Na~(S&*(u&cf_IP|?v<y>a2Yxv{$(57${S{19;O)7V{lJ8<u= zk4L+OtG{hAGg@Vm8+BaT{7#>&^xv!Dq3XU?QS0xma_!bzvLxl>+$~#vzt(^I>udOI z)7ut_haUd=x_Yxt?ZZPY4-ZH0$^HBN{`StUNl%`Nmb`hfzxw;yNj=aCE(5gY1ypp* zTDDVc1GICqHEQkFulxV)vIRA0nqG6iPW#IKKl<|7v%X7%Dl02Hk0vb*TDe<qilc(S z3;QVZj1T<W4DYukI$xQfSpEBJwve3N!pzH2zk=`A-G1}pVxW1xpRD1cqo1BmoHi|6 z&BsDUa^{)vE0=VXA3r^BAHOC%e`@>jO!eh$fq|2h-QB*vy!>LX`L_J{|F1$%b_nVo z>$SG1uZ!Sx0e3tqq)iquG8`~aQc?=h67{_-)ahcbA=bT<Z__`og#j7a+0r5+OYB!m z>x4{xow0kzjult4wnm-ZloJ#*>0Q+JOUI76t-k6v!@zN6$i8X;hOXQF_W%AJ=3kz6 z?#-6^{~pPY7u~l=%Fo|e_t)Hi-kI2)K{Zdkx;(b*t^OW+W8Lb>6DAm@^F^<}cgnT< zT>bZ0@1;e**2OwomHg-sH<6SM=i-t1^?H46*qV+%&t~84m$TL1w*{OQ-Z!wBFfd58 zd8ibXl}$VS)M#c;qQuG&ufQp@XGa$lY*@cuU$JFbW?LeM;=_jzTP8etk}}h0+3c&l zudat^P2IO|pHOGZ?KhAP)7SN-raLE_FA2)5sId5+u{3C<^p=eqHDBhlJG6ee9)IiN zV*WqBUN616`uDoX%is6D&c0$W&-l3K!WnW>R)=ovxU{2?eeIfSzkakVU%p?Xam&)+ zoSa)rJl&<u<Mt;X|62KZ7pP&m|KIGivsv{~TXz;)&$l#wcW$nFU*Esw{`LkrAs`<$ z@H-M1F-cDs7ZDM$oH}DhMq*-OR+bkBCnslNQBhGrfyT`e231AFK;yDE2eYpSmA@~m zJkELay@2rKSMTLtznA}gJ^q&G<Xav~b7f_vrEJnymVR54b$Qte=XQ~6*G!lDzc<K@ zYTy1={(nSf=FOm&7lqZ|>BryueO!LG#1b_IhK7YIpu(f($o)@@4MyzN;A=o06t}jo z-d%co=DdH89v$tRf2~%nWlMH={po4>^KE8s&xu^mEiPnT%Jt%^cES65x7&K7xZd8c z-|pTYySJKMO*J*|zMY2R!}gn-=ki>wRcpDjI{fXAkA~c09na45OPjw-h>N>e9|f+C z17yG%pP}LWru_SJ-`y=Y%Zo9#scBmL`1!kpRk62^Tn_&7;2?kXcfREsSzlf-_e!si z-=_2E<z<=XCAy)1{wB-HZ0nH_j9MvF`r$#jq2Xk8znoy7^Pj%H6%{gib3w6nv9hrA z>@XjHaJ{3!0;+cy7=Dzj4v&{J&HDf1V%hWa{p-Wm?_$)h{~mjKgTb#?p`PdGU5krL z*VU<;YxK0Dq+}JN{K4ts`f+O`1T{t0&9(U%ae3L+^Yi89#hzJ}tjI02FaMIUTRU9E z&26fT?92lPq>ugupLxm91WLyu?C;*z-!VPC$;9{d`As_Bfm1wGF3o?+#=Z86`(+c? zK%LV?M@zq!YIF&4u>3k&+RXMRgJD7byO^?bGT)BN?`C1&Epl1esx0ThdwT=h+IN?h z+D3j$Jl^*&sW2ep#oeT;n8NBW8rcV%Hh+D!c8<OMn*9663JZgsoZU;_=Y=LQzIm&= zE^e;N<+aE9?QQDoB06nBD{C3Fbed&#*%=r_=Xj`W+O}=l>8JPZ-2)X5`%+F$;uKaB ziCS|tYiHc%yf7WH>dH!1R#wr-&GrBP!NzKYom7N44;%c_j+|y&{H!Nxt)HjoMbYcL zT2sBGrDs3-afLy2TA25-9?K2o@853C{#{vNA@=>Tj?Sv8%F?f&UP%cRbtfjd_wnRj zS~AV$QkYh5^y+Dzh4yz9^6vTE-(y+z`kF-WW&P#8uPt(;*cVQiU%ov^WNYp32h((Q zpPft1zh5ULVDRGg`qdvNfjXKDT1?=nR(N;rb@_bBw$7fODPBu|X&+58^u5f~xZuK? z{(k?3cTWil3f?gi7Z(SQ6-Q2cx-3L1bRlTqNo%TE&W#D$>+EMtnGzx+FS+1Q)fbJ^ zH!GhvGM76$yH9cW9(jL;;kW1KdiU2<25rxC@;|>}{k~tNr=~o<zHaKPVoSXk4;e$H zEv2t@)&1_oZ(DQy@$urYH80MFe~(N*C$l_w`LSb1ZQot#w5$&M`cE2EG%(n4;u#zI z`u+QJu?r?=bEBu7OgVV)Ah>LEF+VN42J7h1&ZFzrt@~vfInCG4Z`+nFQ%*mPDg5jB zu8hH;W5o*hbLXtDzVg{wbLhiE-HMYJRt6t#XmEV_vUs}A%Y&QvtxG<<zpVaZ`~7zx zgr3Rr$@RRys=dLzKlc0k|2s=xZ$Ei*vyH9m)z#9U=f3W(`#URUuhzzmD=+UZf3T}G z{AV9{DCwy%WkX34XBIkl87A{>$&J=mNs)M8T~Ye&&Cat18=s$BDP_7!bLzIK9=EQo zOg@#b($;x*i>8&{yTX3Cuy^ldf4sU<zu@NP^J^lDUA1y|=iYYMx0!*#p>^_tx+@+R z8s3XA1oXiAKPQ&?Uewe3&Bm9bHr-#t_HMe<i5C~k($DXT+o|;O;^C@;O`FBU_WRAN z(b0MpcvAi3xpVRRY=Sgmw5Q5t-`Vl(=H_+J&-Lm*1?hWrwU(KQ?dR{~W$*UHF043J zE(3~Ejc{m@_WkoGE9=@{p8WjB@7GBO?kvjuW4mN=GIN{ck0&SZEcLE#YgM(dGTK|s z{_bw|?v#1!!qU&pmk(QiPs{)OhJCft$B+8n++Uw^e%>|J&tJ}e|NA|6UChLk)V(Do zDc|1jKMl3b-s^Ea_{Iu{l}2@c9;TjF3S0AHb6KwazRi1%hsTG0{q$<qga;eb&l`X| z$}VLZ_58K;zvJ@yT`xNe3;UN|N_Kj9>+I~s%Y9!j2s?jgTW-SZYw_ZjA9wXHPHxr? zSNZ$PRMJqX<YSWM{X&rU7R+$~^(1-vs~0OMwxmXOEpkx`T*xZodeI~{W14hLwC}8C znq5he)1oy6IKHIs47&4H=kzPRd$Ga{_g>%J9JA3v!{EcQcX#zZKP!D^ea>CN^pu{? znXj)xJ>TE!71OgxPuv)!Wn1=jmE!rQ7Uh1XIXCiiZ{_^``@Q}2^zU_lD&Fbu|FUh1 zj%)kmnl)Khd%nGu-k0Lp|Nrm%L*@71o<CW6v|I_~OpVXrSU4=u>0;u`&BD}{s3O$4 zf4{x?x~o}h*Z%)H{X*olPz{k7_DJ*9_CM~=LK=tOtW*8$jAVX({?ee8(VAl2d-v>l zQe>%^a&nUDxpU`Q*%%)PA31LS_F{5)Ow6yH#gC8oY<zBgZuyHF8xL;FWu9*{^ZD!B zukTofF8A|UAJ<s@t>)cMnS~3>tH0d1x;lJ;*VKpa?F|eIpY_|9t&IBW-JJ65uD^Zh z?fvynRtA5cJBKML`SK4)hDw!&lnsJ{f?89%mSuLjERq)KJ{rRwS-&(uW6Rd9yj)zD z=3nI%TXnK@ODtjpTSv@WMQCNntSM8L?7wmRczd*rq@?CludnRguZ@|fWQ*&me0#C+ z^ZNZ;#PxdKUp(CP-eUezKiSKy+%Ej`|2CAr|DeBb!Lc68gxtO7j;q_){#|_j>5W~c z%SvDCD!aFZt#XmIu`n_#>vFlY&BEw&_KgkCrt5q6^lF#B5)lw8>V6Nd`~un*GV(Go zv?&U8&Y3&+Y0*v}wPXo5t*JpGPoF&#laYDz`n5O5Lh!)1M@5B&qKc(uq}t?{X{F7- zOs9G+UB7<4i;`gX(Uu7h9waObII$_GsA$vDrK;EWKg%j=uXAy8D|>q@bo<XJ^A-EU zr5Nmv?5i!W`f?*RJ^cHjR!-fhnxo}1%|GAmp0@wLpS!E)(MQMb-Fv?OU)9qkp6=^o zJS*S#Mn+bip5_`6wXU$(Ixji+_n}tK#Kd*Z?PmIoXKFHUep-Ecy6R%Ltuof%9{AhO zeQwPMN>x)rr-ZG3YR$~RFva%WyLa>E%}Yy5YZ0)w-@h_=dC_&zu(Gl;M@Pqr!JVC* zVq#*;mMv?UFkym#y1F_$d;26`_78>E*6)Ayu(0Y)#P0_Q;`=s>EVloDCUr(cTW9Tu z2a(_3g#~5aR_d4Z^tqCAOJr|ma7o^~)tbS#d}m*~c<<h#Czn5+xNaV!W^G<m(JgDu z7QQ;|2&fp)$QQcOFU2YKVJ;IxmmuWKjsx~7n~LS+mZzUD)4G2*-O1zaEw#_j%Xik- zAIsm*Yi_j4r0k93!h*M#mWs>UpL-^D<j4}=StVC)Rn6UBe`ZbO+@PSe{F|S0U0>S? zJMG!COU}k(QmVX_C2P#?X|RGWS?jYbC{!4{xI3R@I2`!;^mO(AAIakTHrFWix=o%j z<453jlU%Q9`rD=L_q|)_{IOf??eCY%ZRc8>*Zkb1U}m<~vH8{J^xL)HW4)CZd)5E> z_@UpPNB+j0J9kc<I`yHHH|xcPXWO>L`_8G@5xl%%t~GnV^!2XyE+9Jt(iVWz*YUZG zYp-TSPJ4TM`}-Y*kGb~7PFSRo7f^nXH!3P>)zw$qMO9h~)ZGI`t}gYS-qFGF*Hq^; zXsp1rbn~u*kA81pczU>7e7#%mt@=Md_Rh6#?~%Vh>%GN%r^Od{{C|*_n3))Kcu7|8 zs`&v6OZ_kHO1E|5P>gcgC*ieYKi`_P<gOpzCoQx&Uo)>jeWBl3tGd^JyWVTgUtjsz zYP!C+nxBo&<@QI9=l}Zg<%zW*$kkJL;ay0i(Wf1b8zbI4eHyyr|7q~35)aRn*n;Nt zb8`Y$U-epg>DaMl0lu@AZH?0XzR&TU-n*r(zozL#8YLcTaoT(*p|CEm;gf=*V)B(0 zf4!d0U+&lY_WF9x`-OI{NlA~+YuC@)S5j5F`BhE&Pmxp6ULPF{t9zbWpV%EBa&u>K z$J*Svtla0cMEuL&NW?5|GrYeL<jMtG4uclXB}l*up4jg*A3uJqEWq)_y#+Qn{;o+t zNvvB{s53;%*URhDdQAZiiMEd)KPtAY2+?xth+6y1>WbIWpzV_qXPh|Uu`*;8sGoVP zpEuxJ?7lgd79ZE^ReOJ^l{0nAZy%12+#hCtdA!8vR;^mgjT^Un%B1&NCK%s$ym$U` zaLJDk<<HNpoHK`M(IUBzkb5t^tRekc7o~}tH*b#7n|?CoPN$@Zt8VPBDT`K|IN`B0 z$n&zv_STuV=gpZjXU%SfmJK?y=gi5;%+wU?22H6gUB6!c`o%PfV^^<E6}YrDJG^Vr zG@Zz#<mAPxH79!f`TLjq>?=0L2f2Q8cHCcmU9a)Ln?tQ1b8pq0EuZ5*ef?Se-FMUd zssn$oxS_ExxMsq^=G^r$GeZ`)6+S<A+u11(=1S8pYad|-h6jsx?A~2nRW)noOhKnV zfBr1<n|mrYJmTifo2;y?u70X&YEcmp7_;OK7n_>$cI}drvbj<A|DWJg?dcC|ISUI5 zm#?2AXHdm(-_h>+dhR;jJ2EHAyZD!0o%HcBKP&6qm_0joZ{KbVs;U>P@d~idQpq?_ z&c&eNW&x_S85Sr-ZGU&_%*=Gq+@Zq(g?*bP4rIU0-lr_lFm1}xwTdFHOw8?OnL*hX z7jg5;*>Lm7oPt)Ty{A5efqM==Ozz!#o_@~8xIFLqr;D|0a+THA@9(`85-M6<{QNDy zoXulsQE3HA>I@7aI+vHv|MT;C_r865>;7)#zaQ!4R2OG=vg`iKuhEa#*PK27d%`6D zLuomCmV7V$cKC1IZSLv&--^o|j$L|ky54@5Q|k?r-zY1q+g4Azyz}$7%gg0IKofyD zI1zl1Xj`b!1(^af@fEl9=D2vaNZVEEqBU1h`OEwN?$7$Q*>xSuiU*+1NM`VtYisZ8 zMFf1Y&wJ{c=jIjV#;0ickulpZHN@<aU3K7u$rGndnt1x`^VHO*Ptum8J{5NIs0)jV za^pL>S5Tlp;qlGOTed8ZjLgi;^e--+zby5Mz@+J4pPcR8898fB&+@C<d%aGdK3z5G zlZtk~fYU0|b+Jz?>%yYk^ui-2PhEI2->fQt+sPyD+GM89w?aR0D5|I{zdbAL`R?)- z^;v&}{%;czcR$WHapGjFvNiwDn(sEx(~({u1nS~6Olk!6CPAYji!!4W1PpkT!3mX9 z5iwnM<?JS%)d3nTOpK6L&f4xZD}z>UiP9~f{_dMn_N((^JB1b;s`_WMKYsrM+v>db zw!RrQJ7w<|c3qcmFQ0$Dw(h|Dn!36}%@uiT6tv%!eG(7#<xp&SGB3vFuKmY(_g^XZ zpEz9G{%DhEbXvPzkX?mChvzmM4U@%PN+w^zmWFpNdE&+YJ*RVJp2%iDv478d=f>I3 z-~IK2q@qfEsq@Upy=@<7t3R^~SpEL(4At(FwmU1z4y<i)pY>Vp^!f=?oTK$ZS52Ke z&x@mz^OL`c|E;|*3yuYUWB6_Hddl%%5_bD6k1i?8o&5Ot@rnwIb2AFFo}IZ|a~#yK zZ@9$73z}!_>FD5?>g9TQi;L1l`R^Y;Ufeo^Tac@D+qP|vj*cw?8zatqoyC3iiPbGT zJG&Nvsa~Nu9~n>WT%zK;K5qA-#lh$2mCD-fVZC42H8(O?ap(GT3P(=d+0y0NJ8M}> zO8lMDN2QN{x!qwBeylakceZtzP@28^tK*iuv%W=aNOhT<6}oE1b(4*+?rTl8{rq%# z<U{qTQ>C|gb?=%Ndi%(t=-*NNCdWe0uzb5KBP}p#Lw<GAT{X2`>a$EXZY!31lQA(h zDQ0QjXT7&kQ4%u+K3PQl+!dI6x$4lb7J=ePQ$PIJnR%Bj)cEn{tQ$9b?wfA^^Vjmg zt*w8}a(<-U-L?9D-R|c%H^=OI3@W@C{=*x-Xw!#LyGk@&11C<L=(ThbWcX~?%?lR- zoIHw(j1*neCbP1$|Niw0Hi#DEK08q&JUsmG?d~-@OI`-uUGwkMr2lOUQ{=9%U;g!# z=!}UUKfQ^(KF@aT{d(t{)3y40&YwQFTTb}%4!5&!Uc8uXd2_0j&x^|1kE^2ZER@_? zsUM$~zU1FW6Km`3nQwoePO<*>X6MAzIAe7itBF@$yqU1>Pxd5l-qK~c&Pi9VYAXBG zy?^GtTCa4|=6JjFC(oWfb#kq}PtuW!Ii6=9%4PidRXFL@t+QHZXQ!v`ubDY_>ip?b zC;v8D?)8~1@XSN+RZEt9neyh%pDFI<#jngws`75C6@Q;1>v;Q|>Zc#JT4tA*m)lep z<%EQIP1n1<7+$SZxKT7r7qBpP&kU227yHzFvs&Bw1UODTv|qlv{C?ENM+Z2zpK3nN z^UV6RwPv6EwT|`@tsSLS?^f6O#fxuEIoc%ZIJ?=)D&pgg`u{h7d~9DA>wR}`^^Fd} zr}dX@85n9dv3y<Z*2Gq`oS`8Jy43UOwUd*-AAPjIEceylf7Y@8cAW>ULCN2jd1ptn zX^Fbw^t5ZTvuy6|ZQdEWHu~b-=S9mhFGo$BIJu2K->@j<#j4Qh&|dqVm1m&i`eF+g zmb>@y$lBa^_Tb?AeLtEWS@#`GNqLfYM`CYga7fj!?v2TBx97{}Bz^kw<LTp?=T-8L zca=G--TF9pkxHNlC#R&Ez>KqVPp`T<^Yyi_k0C9d4-B9o#RF)ibkqXrEAy9Xyvkj# z{e-K?wDf5An#hc8CzdmZuvnKL>y?qTO6&Ri@bKbOzTYhs6_dZcF^;d_d+PS@KOY|I zK7PEMm3_B`rRkPUo2n*$ZF*l4uqD3k<=(>N|6gCP=ab!~Z~k2rQ~@$DELZ}b(ghWo z@IkIS+04)~Q(NOjy!$M0k;%l&Tq=I&!A#@yD_L8ER)U6zLnbfFTpM<JZ+<}do)fcv zZT|I@QEN)C^y0KL7OGRX-QAX}a6ghqSxqhX^0F1O){nBTt@-r0KX#e_`+)6vrgzuu z-1+nG?eCR6=^FLR(w8o?TOYsQ>b@gS&aEwcOpP~hY-HbEc6Vd-_U>L^*?q#GLd@YL z`1&pbSRq!jkZmJqysGxB)4~hau7R!^FL&e+>^>^g>7q4NO;z>fbrB90p2I(W{19*o z(Yktj-n#f#cbgfW-uv`)qH)@sS(clFf4;D5Z&l@y-L<~<cWzPTrB$JiwrtsH|NoBj z{@-UduE?CY%I~S_!i96J3*Y_x9K|cOW}d~z6HC2M)*Lt7(8xTywcWqw=cm%^>#Xbk z+crY`bw$J!FV^zS0zz_fejJ{De%E3JoFbq@QX<_)cR>~@On;qW%=7rwt5dNBN4wXo zv|k-Bzo6;EH@o*QCASqMZa2;T^=a<Y;?}l%Z|~Kn&$n|td2;6M?fi8=K7dA*dwR7+ zcit%PT>qczfB#!Y`|~yPR{81n{jYt~zE`a9?X#t`-Ro{|NphWk!lQJ$-tFDx_qSGm zU)#Snc-GduSaX}2q~G7Z9(}Z+q2V>O0ugeeEawNFnR$3!Ty5peO>y()Dec=_Bi7b= zcZcDtW4&MQ?UnYOeJ$~Xz-|6Lh5!6NfBtvM+s9{3-nV_hI-BCfpF9gUUU|zy<IkNP zt|!l&s+ut;CFX2PNcH)N<!R5-GGA@kmV2w}+_yC@do$O!x7|yf5izYcBQ;eIJXaYz z*J|0(iIc_i@{VuM>;3qxEN;&Z>-&+QQ#?4)7eO*iVGmv=bAOv|+TUOKX=h%XD4*v4 z<<ryGzOzA7&3-;tc%-k@yuDR-cXxDcNb6I3{r?kExu2iSzPRdRgI%qi>eJ&KmK7T= zO^^4RXZblfU&e6J(GEe~q@<wjx!qGwo;#WHT+KgEed@N{`}^t&pXek;Z>!19%-mM+ z&~mF)@$tTc(2#!Astg_<IAyc)%Z+WhhPSu#>n*<f{L2?{`@bdo;`W9XKmT`c^YYT1 zH&g!pcCX9%{*(DFKj+G@rCyvR^EnlhV`3iV-Puw9{M_=p_twS!T^qgs@8kYTJ3Cv@ z^1y}7_514%vhy90HdE10*|e^)(YgFx&+lim@6McA33WhH3#c8%;BeC{^HN}2=iQyf zCysQczAu?x{r%schwZ^%U#*SWsPyUg``b1(Kb##7EHKO6r?*dC&a$ecr`!AERsAEM z+vWM*-v4hY`s#`yXmoAH3qhGTpFTZ({qS)8=B;<PRDFH={QPHL(MjSacVB(K|MJBP z_q)5_?<s%p52>LY3LQa>ai0D}iLON)iaMu*L|iYIOx)Zea93x0kc!r?2T||D{?2L* z)0*nlwTOkO5ws3T!cNH{^W)#|?%VSB%Sl+2{P}UMCjF<y#fvK+AD7>@@#c>5_iz9I zJ#T4RdTv$dBe&ixvG2vYudf=f4qUur{-Wft#m9Q1+bX9&04;6N^XcfA@#4jegmW_2 z4m}Fz@4vh~-`>!pFz(B{yDtv4a{m0u3UY9TVJ9@t>%j9o%2=AB3wUzi<kO<RQ+Gv9 zOBLm6UFWz4G`@ytd4^Bawv1Wnv^m4U+0rcW&_h}4M@>y_mrAtvZLVqAu%SiK`CHkW z7xgc-FFwwMtpy1BbZhJ1OP8KiR9jzPmm6f{e?7xQ^|ONP=2!2ll^-2{amjT<_Vo!* zo<x3rR(fyy`@X$<?>{(L?LTKn{sH$XD%RHB+~R5``Ts({zuWEP{QeW9yTHSbwT)OA z%^jg3a_iPDHda<arz1&**R%CNv!TCX#cJ5C8#gkx-r^Ki<7jodyCyGSWr)<5%}i6c z)~#zVd%J66_4d;{3R9Q;uKAEq(=WIC*B4GN&&qwt#~=Luo?cO55w<EMs?L2@S>DA@ z98P)fK6I<KJbC{2bw~G?%iU&kem_6`od0`Oh3lW!-}d~OWG%cn@vxNlv@aEZD)<ib zc=@0I_wBX-d;8kDx{Iu=^;09*oPWO3zPvd-*1b2&vMA-nwY7$jWX-^=t-Jp&J43@J zKNTTMYwOcbi)Q*9Gw2D?TB?!t^3qZfS64STt*KtKmPxiLw!BDlc6R1eJbChDi@;1D z$Y|W^_+aotiXz$Ew#1m&Snjn~)_Vp{3DM%^;kk156<cmjj@Pf-i~(mdegy<vIBQ$o z)+?EOzI+=0rtIsz-`@Uh=l%V*TYrUf`@Y>}zE+7&nHC$Z;wR7hWinmB>66iA?lalp zm7X1IPiI(9Do#H=EBSoUzsRtF&D%bDJ8_(>oi%IS$@TYkoSS|=PRPmQ+~zA=&eTk* zPCq*>*}s_cWbL#`aYgH|f^O=Xsy%6g!LG>7QSaWV>*|D6RnGPG(RmqrZ@#`t%8f0V zvUl(F{r=VVc`hph0|Nt3=cTNzHR%it4V#YNy?gia<;!Qz^awn9{@lFuRmi(thfbY4 zr>CKzQKV&Pc=6DoLsza$5fBm*di3PUlLrA(zw!dwdS$B(RGwVBxA*Y=-|JNGN8Zc7 zyzB+9^g6An^?Xt(#>sBS@9mZTIQw|*qa&%@;zifHly^^l^LpOhIS(H?e!KrdaqYgW zkE>I=KP^9R7WMaZ_f5I=(|_=;PWAFgda-SWTuE=}{(Vu;0xRPq{)Wwp=ihqkYT<n8 z$e-R%Yt>(GtJ?N*!e0N=Z#P|EUAL-MX;Gf_*=4qC&3=_sd_KbJJw5N<#>FglxAs=o z=iQasoEz;^R`&14#<k0QGH-8Py@6$3wnMjAY{VuPyY#-xr=})>Cqy_skwyf-yDJz1 zru9gdgZ!AkzgOew-RI)^aeqH~yEL<{UhZ#yb6@RW?Qj+MzMe;Wf5&(@{o+nsd`~;9 zZ$*jfztYK8%f7CCEu54U(kh_*c~z*-nXH*YPA4XJ{9w9mr8ezayznO#yUS<R{ag|o zm%r<D|NGQg=J|HDi>Ggn44tf%R=Vk3=9yWyeSa<g9W!Z`>FT{%Q-7SCT$z3COK-35 z+iSVYH-A1iLE!Knrj02&ad&Fp-l|(27CX=6r3R>eV_-O704|dlG>layE#6&z|JL^W zA02|aKhAv$>z7YIo$~zE)#$AW2X8ty=e)a9$j?_+SfbNwJv-`3$iEl6b8jDf9V(-< z_|Lcasuf;Ub3VK{disv|%*wQ_o7Tte_2*C&d#jrq{<eSLa<9rMG0T0Qt<$_+mh;<I zQT>1FyY4e=-)2TX%egJ{<#%mTnDz6lBk|uPcRyQmTd+i_aXWu%Qc&fyGk)do{j3WT zQl@H6J>F+~W5vZ^Pfsfw85LEY{$gljBUAoXYE$j+ukZKWK3^^dN~#78r)t<47#fN? zte-}%zPd^0_V)byg^!OF=1W~!sL>@28WEf}ZCcjWU%9NDiutQg@|L~4boBP^X!F(5 zJsllC@_ieO(vS57GcsN;e<x#9l%jd}_n!v`H-CM-*eqv9R!&Uiv7SETv=R{xudfen z!j!}Q?mfTl?7q^L2@mITDyBTvbK>~O^{-ld^IMnyZ(Aljl;u!Ni3`|ne)!I&O82?< zYTj<%$*kxi^5y&Wn&QIDcaJXFSpB+qZSBT+^U}rjZ0u9LcAuPlduvwc^!FL>AHKS^ ztEx0ve0uH8n?Kq4>(X;#Iw7OBA6|l|;dq=uOV@NkBZd<_RQ~<@2kM-^dHPg!`suIX z;08GhQ{%fPX`A9_J=?c$4_f&r-*>9l(yLkb11AeC0#`8HXN#JT{yNC$b!<=N{`@-< zTT@SOe|&uVGiz_bM~~#{|Nou1%-8(Q&Eo8jkKScw7T5jV>i_bM-D-JTt%vHfuC53? z<bUP*LTBbS$r;nko-d!jOV(;h#@(vZpn7E9p7Y5|_zg=|=$^hLuCLa4)baehsl9t| zgQ6)w1w814yrQQ5&hg{z*@mw<TAiY!Z!cJ&aF-QSF~X-{;wQh(fY&BjT}PAFg|4+< zZO;*~?B|b`^)Z#1XJ_pTUbf}2wRhrl{pCG!wF`V_uYG=AeO=sLbKTs&?c0mb&I<i; z?rT_>Q({_JSf}l~u$nznr-pXgzRTVBZ`Z8t+dnUM-@H9ve$Kpkwh0a%?R@`ugin{R zD}Q-;x!~zbTt_ee`&({b`Kbv~nSba6XB^PP7;Jo?P(3X`WNXRGpsqzq%F0u{RDCb= z92Rgoboem1j@ZTR#BqAl$&)9iO`DdqF(Mqbp4i#_|JoGT>@;YZx!pc_2DZn~%X1$d zD()7uJU{1V=X;(1MepWhotUt9t~L9e9UpI;&u{R0YM33i{M1zM-}(CDx^Zvp>gzgf z&*eWqx6rwL+KtEevLCs$Ylo{W_wV1lWsTxgx$FxGUni-4`tl{{*1giAtcq7xZcLf7 z=HK7)<;(1#vokeZUaPNun#;(*a7wPcyxia4-`LpLsbl{9`&U*5?|jXrZEd}K!GZ-R zRvtOx!p+Sc931TA;o;FSdGh4uX6KX3nm1_~8Wui2ws>_|?7wff(<ZBJeQ15oeqF4$ zZQY-Hz0xmxrLM|YYyi#D%nvwn=gyw$@9$dK9zS{{BrI%i{h&H#e~sm<Tc%Y<I+AL= z{PNy4K0f|7YTKJji`f^hcvL-M=gytY&CNS^?)<mFZSl^6hlh6O`*@v7xyioV-~P{Q z{oMQedVhb*P0G#v_b$3(;*=>b9~W=T3RRxDCVQ^cvM0LsHVg~_Zs3)EQ;tm+Wo}pq zo&cH8#QVbOLId03T?G#h9c=!+@6V=5i<4ik3O)Tida<$b=6Cme&z!2-S+`eS@yVf9 z?%Uh*w{O|<=F(E`y5?VjM#jeP@9nLAeQj;&>uZsbkw=dnm9^QieZhm&>3X?aZtef! z7p_xcZ{s~pNBc@8J41sJJ8woq(fXQy-$8319d3$>i;IhurM!!|b!Ls#{m8EC4UA8& z>8kqj&o{}eiio&zX{opN5Bb#EO^nQJ0#3{P=iBAqv&nz|Q`%f_6^Fge%$esitDbC3 z)`1l14`RK3E7pQ?ndsS9S5K?^%LTrZ?vSajo*lTDjfI`vXP%AZ-RI|@JbwK6rR8p= zlKGZtX;*7&pRbA9+Vfrkr0;`Xh66K0!^6USCY6>AI^KaIzL#Ck2|1N)zT-8~<4a%D z`xPgr3URQsrtNfWuCr)(wDe*|))j-b3cN0T9#`y?AN!Zgx1T?AW~A%yhk_ih)KxTo z`hoi94DXvjy_N$8E=m)(ZrvKA_x;<qX&x$f7DVWL`}B#6i|bPS%Gs%rVG9FT*w~8V zv$o!H%1w=h%-I|^$X|VO(;LXpLVyOSDK*t=X>YIZ$C^9_W^W&#oI5wV-ixT7J@LYO zpYjy;nKNgGuAcR2?xH1AuNSWa*?x)_ZE?%5(=zh%^S8fs6ypL7ZpLhm0ImCt%}8}| zX#wrBIClJayTGELmG{Dek*0!YUzInx!_KM^H*w-Ctx%19!Be*A?^{tIzjH=J#Fa<Z zPA3m*YlE!wGKCazNRul(hdq`CbuF5v7wZ)ml9I9{Xyua3S+@_Zna#_~tJ<QXt}g79 zViZ{bTAH`M&Ub0h%h#_@mu``4D=aNlt(QL@xIzt9eq?QpGG7gv#8&;!%lLz3=g#%h z^!K}PD0ayzUF2iEUkQpu1_nFfz6T5p44~ya7ybur=dXHrsP#_ky9+#>E}!m4%FD~= z&E9M$EiJt^EPBO)e{XlqO4|5izxLOBb`4=08^7ht(}jb2Z}|QBZXfi%B<Pu2&9*Q4 z#}XJ+pFXtO-d(%hXG`tvJxT4iXXZuQNKH>s1KIgQ2HG6blCfR&<$M3%kH_^|1d4*v z^lmM*&@?vBPtCh`>dsr6z&8Sg*Pm^g{AADUpB<&@<sD~I)lVKS-FN(3-^963#CFep z{=1l=reS~myt{rvM|TN6%X{v>Ypc-OY7f7>_$}qVDR<?zo7=xtzNRU+PIzmPb>+RY zHAk#iEq9ikz2`dbwck5|ncI#2|IX*kFww942kt3<C<7&G28JnI-qT`4x~2K0ugwu~ zk}}=+_}~4!Yf~pQwg@C;r@FJXWnAl3`u<Lv<?LII%#>7j4#nQtw<ZQE+Wr0gUG8Xd zRYU)z4-dYrC=D08eP`eQ3)?b{ojevlGi%xNb7s1YmD%>qku^^*Bw44{I6Yog)*|3o zY<);~bM&8X_y2jyZ~keT6+g?ggDmo|5df!<4?B`)al*Q<3t4wL{*CNfbnn|Pr*#V9 zleK@}hpyRO^KVVw1&8@O3wGq(EYej|yL$Wf&$HJ#`Sb4AO_=cE!MC^U>F@3<Zx<GA z5h!}UuSsC{zuH`B^R2;pubyn2F0GjIUgGA-$%)mK-TWUWN||oF{rY0pZklka|g zTVbl$awkqXa=Ds|<a`GXNsATsnOE+ly`QnLJFi&z$v36*rRw@^_x>%vu`brU?)O_h z{rTXPO82-y`$ADR0j#xdjRf~*U;1S|+W?wI!8ay2L0}VPo!kr1l2h2CxNaAvys-KW z74|j<(r@qleC)!)ZLzx|jvf8$$)WhS)<nvQ<Ke&ihnoe8<_QRCaenUluu=6$*=gUi z)Ar~8`yI7dvu1*ogJ!C=p_B2)_xfMfd$y!0De_-$y>;i?*PL@L-_%<wTC!|PKIgBq z{gNkXu;68v=tO1rZ91J#Kq>gcL`c(08M@<f?Q6T@nwlD}x7m<V!qL%j7q?Rf_!jw~ zl_r{+p8J=93X8UC`-NUhm0ApVgdwX$vei^oSArG-+h$+Wxw{6m!)f7^?(XWEuUV&l zeB^r{RbrH*A2><y{^Qu@fPb2LZTG_NZ7cp>@p?DM|EI_0cON;jMAkwe{>(;@s~!X= zfbL=jjljYd^PahND+;u_|I+;We?OPcuTyH#n0jid_jD_3Yj2fFA3hX-CL}h!YZ5pF zUG%Z^UtTJ>Opz85SrWDyQmnKT@aC;M>T}s7eDZE>3yX+_0b6ozPMUp{S1)GAh9mps z8RQ?Hn`_UZc<$Vxa@|+&n|aTv>g(&je{yni&GHKV<mAWy{+_-r@AD_S{>$&u*J@if zZ%(+`p5GS$Iyk1`5(|8+;IDq^?**l2<L^4kfR;zDu8(LBTdf;%`PeZx^A-CyMuj{6 zFW}!AwRX4n_6T#1fLVKMes&2Yff~FD0XJS>Uq5;B<aS=^W91XJSN;6-^yTFWR{6|( zd;EeXwY?Vs1yBGBC@(QER9ssZTkCY<(a}%y>t22P9#NO&@?od`KKbiEo3)n6{=WZh z)&I#~bxh{WpPrtQ^GA_&Ud)e^`Ugude)qk<>%o^f&2Fpj+_QOja&EC^Y4x_XpZmHZ z&CC7?UB3IhdbQKz%F3U|q`pq=nKd^jyWYd-Ug)}*ovz(tHOnhjzj^a!yXk_@L5u&M zt2Hc++0CytMRfna>CyLp^y&Ojo-loWdd?R`dzVQ5@8@||?7#bct^KCR@}}@OQQgYV z$`jY`5D8xz>b^Sby~fWcH+t@`%9|1Q<GGc-{do)RhhAxK{d#pd6kBAh%ibSqJ(9nF z>(7Q6U{7Bv01v`3oY&D=)hCy`y{2->&Yz$1?v@ETaTu<OZ~qmX@0>nQ&3kd>CzJNw zb(1Ddo9fP?xYIv)UdAVny<Y1l#Xrlwbm@}G&s_)SNHb>hr99cQ)82dWNw4Zz-W-aS zlA4;5mMZa+r%n50GW|))5}UREO6UH0&e}4e#y9F#{k%!*J+)W-oci&!d1O%88_&Gk z+xSkNyp&;d$>e91>Hn1hha-N!sdPMddCQdLJ9i!2bHzA&+r6tZ%s1{8-uB+};(gxU zM+dekf4~3T_Vnq~zbEA9-r6W>_uMWaHZJZS`+8mDp4ZnG{X26>`oz_YP4kNOFRP5q z)buy0Y$@1(!N1s(SNZK`an}0(R{JE+c-wDLQ|bGys;1&Td1>XTyI;TaNBg;Xof7tq z+o$&SWIS)SwC(BN%M}z`p4j<TetzsyWV9*ks!4U+fvKl<@A!RZy6oCjPqR%TXPLZH ze;(f*d}-6C4%emOnfj%H_j#V(ix4h&ka_jlw(tG#eotO)mT_U;EK}cWYhFgLx$h5( zhaV=8s^!Dt1rOG5&0hcI&Cb=1%~z|x-B}m8*=uc-nwpyHKh~{xCd&nz#dOEp=RH*| zs=oY<J>K>IHrI(q-*H@)xO->UV@Ac6C#vputMbzRO}cy3?%JGB5k;o)KOMdYZJRT> zyFG75Y4Ts4n@jEa@-64jt~~I5$wW`D7t1!U?|9``vyF4R&&J&Es>X}GyTdn0-3|6g z`tWY^)H9pqmhN9!`oBgeGt2K&{+ju=e~;9b?b7)%ah+Nqi~OFvX&cL%ZMp?MS!wH; z{p^0F)>YfSE=@b^jNOzuRr+?_0#0Y5pB<T35%XmG(L2{v%r`!mzy7nytT}U*XU1$c zd7kMtORfLOorulP9HOG4yk@z5Hc?geoxIr7`|^{Q&o~t=rFx&e4BiY*XqlJ($<-R4 ztNr@DBJR~f)9A-0TebFjovRC0_x~L7c|BkG3y-cv8mpfEf48T0$&}N(H%^{c_fBv3 z3EdxsZ<gJEw11c6hNp^wGF*G&{=U2yyL>Z;BI~Rjw>jfOOhaY(cg-p;K6>fF6ZP^( z^Z(b@|Ea3F*tz@R<-2^gUA%YX;;pR`wjcVk{=`=HchZwzZ<n7{aC?bp^|qK*c_o>1 zd(KwXRD3^q=lSkG=O*u2an^cr_TCd7f316LOir$1R<wL>+xBixS@Lm<$TRlcrVp+A z(j;Bm-*l+AOt87y8$I*t+2X_HvUQ6rH&k@~nQHWpQL$x)d97geJ3+;k3AWX3no}>I zJ!6-#-5!)urWk;VDfDSP)WsH>u;FT^yUko@H|a#bc*(Hz$ji(8Z{Ge*J8KoZcbDN| zo?nmqE6>k6>+e6m`q`Nsi>A$%m~E1E{dQ%~=j^A8tKPo0?enX3J@NMPMzv{Td(-_y z1e~Uv$>*1fm^sP*k*VpMH^<(8Dl}OicJ#=eWtxgD0>O{9%--($BK`PB)Xz<s$wl^x z%>qex4la#+GjZ|x)nywV&6`y8@zm$_KH1;jCdvJe_&&v6DNpo9)QkwTmA}=z555j> z5lBkO3EJ+wyYKPwEBn4)c=LXiruh1_=o#B)*j+w3V?s{Z_0H?Pucarq9Jf5Q%r-1X z^45|l)5)){p6%sSR55;iw7q6=kzZBK^ZNgN_x%<7P2Q|K+;7TmGwsCZsUJT+@fJRM z?d(Oho6EP!U7w+*HTCDtH_vKcZk_jb*6zrO<;j1i%=bTH^QT#0((<ldQ!|g*n!G<& zRrRZL_nVUK58OA--gdlRRCa@F;DoC7?C#0xFZ<u;ec-8dDav=dd**L=pICQZ_SWt0 z6L!Cs(7fBzyV~SM!u{Mo3f<AK+TQ90ExH^pIH}^J+qBls!(ZN4O9)S@Ej-+LecRVw zk3;hMEn$DdfAnN0McrL8YvxWt#TE(anI;)m*WKP=D0ZryH~Omg&WXRe1cIthD7<}G z8>sem&W?BakB+{MjGr0tB{yFCU;ixM)+hUZ`8#=>Il826+cICN7ypj_{dHB_iNny; zXyeBBck?%Ve%%st_fbUUnoQen$NT;{E*zc-+tkf6lAPr1FU+`o!#Dov<Cw*>JVifS zskI19nt8VLxO?v=?UV0SK&h@q1f1#&T$BVsEBG4{B|2Rmy?^fyng#_QAQ4l)G;dmJ zWUJG{Y_aUEQQ6tAm9kfbXsr!9efOy5l?J^p3U}X3QuUrQcP{UrKt{XUe|{$3uh|@} zV6eNo{MJO}#cIA;!OQzz?w|f7+i3IU;Naqal0S{V&U<xix^9)pj_PMFVR>avU$#o! z_4%fkz$d?F(z=s%niBS>GOj*yer1(wROTNkzU8fplHvN9vT|#!&phf6xw=<+s%(|W ziNlXRZ~C;({g{m!@Bj1n=C+%bF70Qo*Hl#$RN-JrW@3rd&f4g4SKvz4mRp4@7niLm zoE<Pd>gD>kTeKGKI1=T4OfY(ZX{g|ZUA@=Dw0%~mZVs8?JB@`UiKESTN6Ul)=FGbK zn2wGWC$4wR-8bL9ChuJ3`D#A%?=LSue_HVFQsh<1UOSx&lXq<s>z$i0>(`^Fr*dTT zcdgEx7M4GKPe+UN((S8OKV8ef;B2|gYE{{tpy;)yChR^VS-xC5{cT5JYxTEzwx5z) z!xkIP-%}Lztgj<y>+aZ_#}~Tqx0>l6u~}!y&Pr1Twg;bNeif~sQPQ^h_-V(-cdzQ2 zs<LE1Il;T}k-{|5=7XEkePc5wS8dASSoq^%((MJDZ|0o7>7#c!-6}rZak+8M+`nmk z#f%d?`|dp2RemqdYVN_W-??KpPO05I$9&r2GrKPH9oVudE#mfu7YsS;zGpM)uZ(UG zwXmM>^+8fscXilo`JBqS2`=8=xpNoYHog)Qz4}bRuCpJ{dhhajv1QYmrf=bUioUtX zTTjxvoE3fMuesl8-p(DKJ2rRO->d(yy8C*kW0}~~nU!B-A4{*Adb4PI=HpL6!kj_M z+9&ibUtoUzY5nw#ZcG_pt>#WMO?A3_bjqbSX8%gmUA^2GS7x5xTX?oErrPPuQ=gx? zuCiMv)=Au7)@qfwY~Q*qTaFwmcWT$1A%0}So5?CM=k_eV_M&aAz(pmeNg~d*vy!&S z^jOV|VAHYAjoKx1fFb7Gh4gA~K_?EymH_()-W-BX9JaDAU%m|48=)dpnlIjc)Ryal znx3BCy?gik{QQzOMkojbY<(tY>Fn&RD%9zqz|e5&lo!K?PoIpWdWAY&)FxL}-mQKr zVjB4U-j*#}dcZ)=+bJVK)_U6Z{P<&ccE;VW`+e>3;*2$g@83#Z-+MG~#`4!W{^1M) z$NkwFBpDbc{hYg3a3jNp2p$Fjy_Z!}AG&|M8^`h7;LO$HZL8H8WVl!xSQ%6nuFI7- ze{U+quxF3vqf`co-KF9T4*ijK_Dl@<<$F)}ndZ(sKGmjZi)w^*k>%vL-_i^$Wlvc? zy#D3P_Ws6327#Ya3_W*?H*Ws;)cGRAg7c>z?D=`@L0o-NE^}aXwD*L2SLUVauDra} zT%%;G?wf^;zVhoWHNF?m|Jb*7?z7!rHr-^roV)Mb*V|94|IC<bFMHzWIqCCaJ&B*) zdaq{{mFP<8dS;ZI)3#gS+A@d#|8=HxH3o;`+^t5=@64XRuk@@}U-skFrcI~QZbf<+ zf7Z(NG0t2)`J7l^jNRnysH+?n#+P!~b*yr2Hdh$VvD>>M`t;%bM;l$!f9BnNe0%TF zV;3iyXFjrK5U6lqn0r6Z$tnH)iyMIq1)oeAB)+Cz7ytHZ;oZB(ZWmW3$5*p6#Py0Z zI50HyWn?@#H|HTQ!<m^IH!?8%zs1V%fRn-Q;qQf?H_oWYGGaI*b${l`@~<p6zwTCG zC`hQT^85OQr6KR2xO(}qqizfb9!W4XeCS?ZX4b{;!=mt6@AJJm*G}hi3V@Q%g<>}D z3ml3q^ZFVZ8Wt>AFlEY=3l{>y!>>O8gV^0=t*xz$4L)kO_g0q&1WfQyndG6eERJEt zs#Q!47cN}*@uPx4p!?{uIYu*c&d;+gEG*<|byAwB6TeS}VZ}p+1QV%Nr^N4b7&cUY z&&zUKe9>d-@|9&R^MoTKudWWS*B07a^y5SPyo4FMwzR%JrE$GscIf_PS4Fm3R2hh5 z6}*f4l6!7%QL}yVL1Fnh-k&2SRHjcqad4vN6~+zoD=bY**IZBkC~u^Hx$fmW+q-sp z3s%jl-o|v`MtAJi(!%uIzl)vsF>H8S%fL{T@MC%-gTXCfhHc0CSQ#Q@q`6~7eY$#; zr<=drTF#(ga4)3AR)m+~Latgw-TEIq3=f3kQh3-IEQI5>*#6l!&7Lciw_s+LD8usk zk6$;QR;cPxUmZ00OY;9y)sJ%Cocvrn^-_HFPPu7MvkG4Soi5lPus(@Z_sQjX6>%+~ zQ2ugereyE=x66221f0&V|N8oR{;e%1j~!!UShRTY^|jINvHvqOO{AI+UdWyvqnEz< zrjMF1gWntr!^A@@@$vWLlrPRd7@a>?TQ~Q_$;i(e8uskj6JPhU?&YP*^F^V|d4GRx zSh3<py1~R(&zmQ0DqQs7W3A4iZQHgTJ9aGZ-kzV|W3T;hbX(ln(^K>PZaL$EojWb9 zs@^a2ea%)Cc>c<>v%eQDdc;;G%AwfuYrRvT?VXvwe^|6!kQaN`;KrfYB2eYFYIU^V zT&+Lf_owrIar(E%BG~EBGMk$dwr$(Sa#>UK{QSPYzQ#BvP+}5r>ThDr0C{;~x{8_E z`=jFV5j#IUJ>EWP>HRi$dGj+jw`cE)mhU?eP%B=S5>WACi`?0&NlPyNE;;0O_k7|- z(bL=4f2+ti@Ra|*b9cmTOXt{&qDvod34bF$F>r2u&ih`?>afq%TP81==ci#bJLh=y z?XRh+%%?A1`m}btTw%y}<E>mt3=9eko-U3d#Ru=)*|R;Z_Tu*c|Gw-<{J4+*`L3@I zS8$bjKDjr0{rku}p9K}Zs?5DMz1<_W?%Ut>?XowGKQ3f+{rJ0{_r}ei9xs+&|D@x- z|5W{zg+`_K_m)>(SjcNTKRd|((pAx!XUiVno%iRDILNDtU)CftN-4GoIK7bES>|h* zJ#BYy@6*T5p=YMs+kW`Ea__~Xm(BYb85B6T^4+q^$f;JF;1av{+@(h28GO6gQcrjD z<@8lnht8fCaQCX=8w(xgs~(f<WFx;^JGOM24}-$h7QPZ$F_~(%jM-Cq4O+}S*6&)q zG2!EkT(7lX1FCEHF*1B<d6n1B`}|+zmzGlruO0T^-f8jl;^a_nry7UVYG2r7c^+-Z zh_%d}xs0bIIl0^M_JS-HvGe!lWNlHK#5bojX7{n{)_<?8RP>%^^ZluF)^Fpz`JsOp z6HTPzYd*TZ;^_N*mAC5W;~(qy|5w?S^Da%Ef#HInOLaTn8q4OFOQJ&WA1g@M{K7$~ z^sDSOo9bB`H(tH))pk~J@3mK-+3O^>mA$kO<7L>=5_SI~+qE3Ay{{7&Z`G2%y;dgT zf(OI-zH1&#GlYy7N_f4P+6vyxWVogFRUmryv~!EQPF!ix?g@Rp_6y5JHY?`d<kNfX zBW~urJCHbg`|4Xh-lhS)VwaeYce!X!uS)m!+vwu`k755Y2T+RrHTf`;i4(`d<^5Hv z3od5(`1#GVEPl2r_4K1h@2nSqX7aO4Vgq{p{QS6DA0=`!HdK{1259v3_xpQ!330I8 zE%uvbqG@Y;_sZ%3jTNbX_Sx$?)rJKH{lC7y??tf2{NwBsw(a(P#dAHDD>7Ik=C)jE z&9(ZpRJp+Yuj6DM@BFbeKB(<{;vDN!|BpyEtl3p}SwKNzicEFs4Ec}eGu}7r-`9G1 zYWdzR$&L?a&);&q)-HQ`ecG(^XO6vKy2#dUJU?{JpOTcolM5Ks85kziO%2$XlXtxD z@3h(JqGjilW=)@4;QZm*gIBlC#iWK8Cp^-+@Z7!bga7jKv_A#M{%r1F>sR`0&gCES zS7$Ho=9{WFpZ&tZbEkKn=6~ejKX=z(uHVaLXTI;4qMGH-knl63SSWki8mV6*`S0JS zTv*_E{=ejfy<b24sA0(5{e8(f+p{VE3?JHC{+}_i=*pkT-(T%hzxVX{u^n|5n;-1R znpPi}^YD`-1Dn$N4Sn`~>VM;ks-J9_&-d@ox#&-mrX|jO?5)%qZ~0gGLHlC;ns4{+ z1|KQ<euw2e|MO@0*5)<;@0+$h6$UM^_>$st^w0iM8J?{%|L1)x+2o&4yXDJa-sVMp zk?TZE?!JtQIW_b4A7_SJs};FZ4*6Rxvg7aibp9>Rzu(>N`qt+Y{}o(GUTe${IkWz< zL0H06vFgsZ*MEe5S@BkX`W+^Qgvu??Vphg&dhvbFZcy5AdZAg7xInx?!0AQ3i-SW$ zfJRAK*)$IorHL;-JUq;xAi%LL=jNnIlP=jBSz1PFO|`PNo~^gy*pekna&K=tnX-w! zI4mqos@F|xxsTfFHEZr{O7;H!%6Mwl(^FILR{NfIcu{%b)~fX@GNcR-E$sie#KhOI zEH2^swP?1vhIjI-E?io`7ipTVvs~@9pS8oor!sBA)xUnPp2O&%W?9>PI^C(3)3D;n z3DJ#@3U#!-*-lU6WMJ^wwRHOZC6V68OHbUgxwBx+B2I=E|MIJz)l_dxonSwImg~$} zHy<6?GTX8<G$?u2QoFy)4$eMXP*naVX6C}hvJ4Gw=@!3!@7<NO^6uH9+3V(<x)N`i z^Q?pSz5fE{j7iDD)_2-2E?ngH`jKI2{28WlZSA(LrrmrD7uMv}T9u30@<h&CBeB<H z!{<M|R(B`8w$~~+8uQJUHD4!sX6S7`1^=_*n<e*2hxspM&IsaHEvw*P?C4s%n!Em+ z-AAMHWu}KuwYf4gEVwLj=VDzW_w-GvPxoAuN&PpsjA6rU`|A}CuavT-GkslgD!BM6 zAJ4Zl8=bvg<=Vz9@F^5$$XjynS*7vao#$e`UuWdAGbCJ+h+Dku{4DV+feVdUpD%f0 zVEJa}>Tq862CkEWme=Ppnr`QqcKrme;G+cx!+5->*)lUMh`juXCtn?0Grf}6aZqj% zsIt0r`Leb)=%_9al~?!l#JX1sZSL&u?%uw=JSJw&OD2XDRfPowAKu>HzWezSty@VO zB^b1{wHY6LdwZL!)oEdXin{u2B~h-{>C?p-Qc_ZEZggMxykOTZR)(0^$XZUd?sGYJ zzB(s;Ssou}9Gdz5p61#!+a(OAM$ehD;##KGrcLbZM*D8+?EEnQOqA2*XL}y$Mjh$< z%=O#QmouC1SnX5|_GxR?bXTv*uK7Fn)TKY-wacY~>U0#ZrsN&#m3p8%H+1gB7l)Z_ zS7v8lyurC_rGDJHGuJ*Y+dV5S^K043ZjT*-RjYSJ-Q!{~n3BADaoAOIduLT^k6vFY z7q!`?#9;F~!}1Q5-$lxy_xGyryVPzmN#(c9Z+6FNa(63U#3cPW9)Isb$yU?r*R+hM z<Q3O^p0rNLYOT)d1%E}?&#}FDyl=_rEw{vq|My-la#qR{dbj3L|9AO6uO5{qO_=Li znHE=j{YP6?>b5(%w|4Bg;?i{G1lOk1CSMNh{PQ|>%|wQ%y?)D6eP>=MF<ff0yVw4% z=fp{Y4q3N~@?$p3U!NyXY#Ce^9q69BME=<JOhpEU1>|(1<P*4UK`G?I{CSf95{;ZV z7S=`Vulu{qcXm!r4ugV~Rn^^HrNz(AaB^{Zd3thkaTS%8F7-QeV{3MJM1%x`$I?r8 zcbBuXvUa*CU9OaB=a)B=UE?Tw?c!q&zL`GH-oEuU^-`I1a<Y1GXj*#u^Hr->y|diy zKC9~TrAsUR1g)GR_2c)&3=_8Ih1d0V#+*yrJkv*wVU9&%(xDd4ef#$9f1PyUv!`12 zhj0IsOiQ0WIjP6ry>jJ6otTP(n?{c>E&W_o5*sDWW%%gk-+BLnUPK8Tzhgg7<;vFU z`5Mj3{AxBS_kDGJzHZBY!_!7;CYj4Dj_j6SeewC+-ANyh>C9hOd3`;9cUKoH!-{FA z-~Rm56g&S8-_JMen^%Sku|>IWzBlXeqULRmH~%bRZdbc29l0gxXb7{x8Xc2aWvdl= zVvTtoZr};A@8*kYx=>znVO{=T2EKQ)!RwPP3L;7vR>iVklM$P%67tomjk&$>`=7?m zhp(;Mxm$Bd^82!Si9?Bu7Z)Vo*!*Jc+O-=uZk%nNZ@2kI&PT}x!Q0&3hgLFAeRw8m z^U;D^6;%o68y56ESa7Z(FE6jJ@80gr%e(G5FLl4J#(Jz}$Jg>zpPI9S(~qs$^`HB? zAaCmRqP8<)ALi*q#@<@FN6?#vHT$}g&zUQAYue82{<HV!mR7qhXJ>zRbv<fZ$Kb@V z@OfzKqN*Ln<qN_a1%Ams<O8)`{oSjoc17qc`zPAz;<or=hDqMtT~l{``1Gl(yL+*j z`|K)TaZo+c<CfgdykPI1JwClk6HkP=glUM_7M1mze4X{_|Glf}Ex($6E!{tJ=FP)Q zMa7}QYBja5!-Dl|UtJPgm+iiD+4OaG7eT$85{)b0x0^kW+j&s_f6LW$h6O)$c#>9n zWgVF4X_L0N=zZ3!i1qhZ+ud(J{rqxc#-pG8vOcC6`mH*aF<~OIWs7Ec^z99Bp2K}} z=A!9Sr!=rS|4I!JbN+mI`h8)aoj%L1tGdr!C3{KYci@yMXZm9{YkzdBv}Kqu^?JV9 z?SSWX6MjxS#M^oFr1Z68;m>OdmmE=i{aRw>L%%@I((G4R*<Jj(R)M^`nqIT+`YmRb zRK4(G#14)wU)^p$@x1r9JMW!m2X~4>{~y23Jl*k&gn!slwU@Qc^EUkAVF2}sO2K`i zwxX|(56go)L|<Oo#4g#hXQR9(s8iH(VRIv_v(We}_Vi({3zn9vuE+Z)Y-X3Wx7$Dc z-NAX@hg^#9uK8uXbL#m?z4GTu<!b7+t6%+Lo!3*Rn)2bNzAxuZ37dI$=U;TLta*00 z`t`cl&9gp-*F9HPoBQz9$D#`r<)z-foCl>Wi=5Y3bfg|l*zhJYSp3$Kc{<Wg8g)Bv zm}M|oKQA(yeEQ4GbJs&JyyS^a-#_zl3`5E!<?TD(&Ha4wCC|G3@ejI|zM1`W&qkTl zYjevOmQ6K1e5=isJ)wASJa>iXU8Xe$ZZ__fnHCfi^C#i4JZt)?RT~}{&iU6bFE8}% z+7G$MFXt8Cm$QD;S>Mjc;E?`#&+)y2-yW81KiJP-*T6i#{{2N>4vSf{s(uSz1h-H! z7+~Fr$PF7evNY^2-@5nPy4cw-o}?82{B*mo@9#RJ|Nbj>@A~||_Tyd6kKgjG`PW~Y zWHoo0V_^L4MUqy_G}F!=T(Ms0bVKTLPj7wZ`!CJRr_}APd9A(X&r5^MeV?apW?lMp zPhj%aSz@u>Zr(ytb3bzl>MA|iv*`6P^Xp;S#!vE!k3CgY6|(Bp(caDTMrX;)%BkPe zE`_Pf`mcJoZ=GO4+LD<!lOndfIP>UeIs?N3jhc^rva#|P9Ha~nC0<-)tg6b(yjK9+ zIl9s<&R)gHq1f_|J#e|rY`?O&Z8?%(mmQSb%aD+k=Jqvc;$$^nFMt2~2&WgfoV7%_ z9zT9OdD0{nri0ClcdLDW&OhkidtouJbXsoSzowv@rwf_I^-pcuw90>OR7Upc9e>sD zA3r&7m+r%T!i_Vzlad)3zU8nsY!qj<o_+MAFeAeQd_w>X-O2A%w-i44q_+1P9|OxV zZiWOlh64*T7#i}74}SW6e$f|BeWNyJhB=)2x8&;Tg{3mm&+C2qY`v%c|JL>U=UHFK zb_B<mEv(?c+n~I3W%isoI#a#o&YiomZ1KexuU_5CK6mPr*W!yFy^~I+Or1Ivbh3Kr z{DrS$ULJ1eFMt1bqWnU}=TA&_TxT+wo5#m6zkc4-DIxQwhch!cOjB?ByTA3}{x2Up zQm>Xje5B29_S$n(zxV3jmN~~KZgOXh`DgI#9#5%jc#+)Z+aYu7b50BXY<{b<vi(-{ z%uBm#V{Tqvx{6V6^K;8%{b?prw|D(Kz05Z+_q^bzh4(kc&HAxEmHU6~*8cMocBvGd zei<jn7<B(QsH0r=by{{mmqyq9viB1&c(0G0ZvQOg^RD;ze(#z7eAbo87Xl_l=KVUU z7pGHNB6H=&ifRKfMNl%}wYbCBE8z6vrH8-&@>fT%L^JvxNh<7T+5%~MZJ#`Oa)gc; z2TRD>o$lu@TnOlNak@H78?D_{zTPpI@!Yv{%kI7VIscP?cfkG+6}H?Lq<a4?pRZN_ zYh}|}xhWF^O|!#n9DGAW#1CZtTF1QS@clbYoL4kYt1P_c7|q_Bd!A*|iq+R6tqRyK zJ6>OqQ+cuRtYQB8tjofyc3ZW{wx=$T%Dl8*x%=L&9apAtGAx;Op>f^ersVSsxsx{u zwtZlG8Cq^CrX#o6cjZ>Oto7&385-sV+<m*@;T`+#c>$6+vM*vylgaCRe|gRF@;~>v zDHAqm`U~WzrCqytaby1defP5+{h24<{M~tL-DUfZ=e5N@#C+cFId9dJ@%}=iX}ZDO zkkzklOYr50$$BhWx9{+*bbn*BZBo1Txfidx7*+f40RQ1@da}nCF*ZyKcx`>_z^t>2 z%58JDgrz3$p32NE#rfdoMJZ2)U?;YQb&j3~1o~`+9d0j?OUk~Sv|yUkGPRh*HBtFX z)jP~CNM^`HKl^*|R9Z1R-|aoISJR?aHD+y@AZHP#61DS+b#zgeYE%+CgLZh_hwsnZ zT3NqU$wLbH1BW1;ab*Ps1q}@iRaI3JlPg!Rnp%KB#r1WuiHV5}3X@Nky}u_bBBCPH zx#F?W3e@q%7jZh%PNr0Ud(+w79jqZD)S2@0(^Ccq(YcQwKi-~qS4)Iz<s1eF){4r? znV@!+&riWBxrz#&ot2x5ud6w3d3$5xr}y>gObxq#PcXk<lX=77bzk3oDQRuSRgHei z>s;Uey;=6Uh{1~Cg<k6#O_6oE{Z@9b?Kd0suee{T-}f=*&n11$!_N)Q$v&-r#N!Ya zyFZgdfXAzEuhp6UAL(1ZADo^)wZwPrVCvEP>~By{PfQdP5HPr~x}rxs{>|6=mzgDx zj@{ckvn={P%K}D*ne{$D{Lk5^Es-((|77p3_nqZGcN(sfKc{1{Zr0Oyk?0*YYz>Vk zwAVcDf9$z``W-pTH_Myt_kW(YXGyBW)P9{#k-Dc}`Wxi?_I<cnUG6V<`fjnXjs2Y2 z``_OA@VEZD$TWY@Y1)@28;XAZf348qO3~lyTbEDTHGaK#iQk;3%PMVW(1nua*@c?v zd7t?iGuF51OyIPC+40Lp<COh&;~($!<@Ua@Y5#dRuz%}0hLqHQzK0_kL!;iPZi{~$ zesS@({V_${3=K~&&MID7byA68#rps4d;com%kBiHIW{4&1%ja25ZiNkW^bGC?JCtS zO|<HWR1vbhp)J-ee`oodr%zpFf8DWFWY7@llC#{+KBH>yo;_7L$K5g#_I~1e{^MiQ z{W@be*VNqm|B9odkEhS~oo{{p^zGaCL?%x^{_E-VEQW$PJKjY&KiS`PFrA0N;6=~F zy35UN;(tGRo2Kh5H+k)6T_F~CF0p1;*00~IzkCorp|U*x?e74FP}L&|2TxRPOlt5J zmrU@U`gBH#xBh<5&27`;{w_UxnD>;{tOGKj4*tBq-xi%d;UK?)ks)AN+P0p`<9T0H z!hCu&r~UdeyUp;l#ItvOqF01?W#2L|m{=XYc>n!X(QV;&n%g7q%?zITYjxVCO@hJq zuTP#TI_t@eBhwEZDLJwFBH#BJyY$%{s-`67o?XPuV6r-T{?oJX<@d(TpEc{%`}g)2 zxGOdG#>EE(efo4-|NEuqFSfsoxO}dDYGXe?!-bdAV*Up<YUc>q2Yz_AfqQe-?SrB7 zX04yM<v{tXtVwGoWd`x9?vfR_tgwDxsYU%aJ41(`j%`zUyV)2VmK*L^{Fh1mmfAbr z=f00cp54!6_Xmvt?D%};>;4}s7anRcoCq$yn*8sWoNbwh&)&Bs;u^tsSc`W|teU-j z;>)`0U)=R%-@avF@R2&4edSB!IoI&w61muemYSAl`oqu0?(J%szrd-;WncdFlofki zH>mZ;NGY=ID7hr`Mv{Ty>?|<`h6AsR!QH&iJmC2b0jKjPW*9p2w%tE;xc=T&?b5fm zHs0RO&MTXBwL0V7)t0ip=-)GTD*O1Bzn>DeEuv?}DP6lcE9O0lo;cO^=lUMy*{V|Y z{QIw)=AP4b+0r5V{II>;<u5O1HGA2AKl%Q~t*m{gwPwG4&&a^=wOq?PI_}HdERRl& zhdt)c#O|+{`F49r*w<~xREr(!qpx3Ev~jk%@87Raz4rE*-`)D-NM6>oYu{r(DGBAB z*&iCKozMDDLE_ZLtASe|PrH>B+IA=P-2L}UYFwVKiM3u;aQ@!r^}SL%4+JLLRX*Kv zMpp36-TIB%zcs$RkXDY5lsU0!!n0>rcl?xUI9>eX?)x8?9hP5yerBfeh1C@ry>7ul zL6@TaFD`B2n-_ij$4<Fr%bwkeN^QH8dv4O6CH@_n$|;eoZ{JrxebZ_8ZPs;dZkZ_P zbm)fuf848oEdI-W|HGUOKSHg$Kb_fAl^@T}(C`e}oxlG%=)Ygj_o<>O(=+!lKmTO^ zM?c$>A>*r6EPM8;mSsDp1l3B{@0zTnx~}2z@91}Hv+E_V*BLxBy8Ub0p-p0UWEk5% z=BBVPaD)5wR}Ymtxpytmw&?hH(a!U9Mt^6p$*x539Gyz*`>&b5Do#88)c7u0zj^EB zy6JlJWfK_mo>$&?>IWAG3}<|-PYXD4EZi5pAH8FL<?H-uZi@{ic=nc^d|G5S+gJ8d z)uSVwoWg29e*Ln$eRbjU*09@l85iUjBKF_=->skaU25|5>EBQ5-`9_|TJQdQ>DGk; z%I|7@;$ygCxgX8=eSC7uu5Z71Q!iZU{GxtpslHYD(!aft(+n4S8Xr}>_cx-~?)@Fn zZu7LCC1-cn)kcJb=rAx`iS52wX>dFLw)pBAxvg50R9=2Lt{?sNZnZm`EZ5v`J1i!t zyzD*6e+)6Dv(cDWq}NSYQu61!-S3$kii?X&zTESjeeJ89mhCPxO#`(fYxf6Fm5-Ti zWt?{PZ~TtF42|8>j8nEXd`~&~>XP5n-Uua)h}~jINz1+^o2J}*`d)XL?w5tR_x9*( zX}$Z%Ea1dpyIxD=>fyONnfG$FTzLPYwK0wXoO|Z8PR=}-5@lg|(`L=DKLN1r?0)0y zt|%E>E0I^fqh}Ydzw@BK{?IF9h6^=fY#T#VO&^?4dG%}aoLN@aUT>BQir@Az`s>e& zJ7stB#`3B-W^CovYGPryV5Sku!g=ctGyA!fAzDkj6r`qji7r$P(P}dJ%G@wbp`(pW z`t!F{W|IO+x0Y=Sp1<qXN$cnQH8b6L4D;7tDtV^Z*|v^xigEYZGiT16sX5fWE2`^I zZPgZ==OLyCQdfokm5=9-VY`@Y6FGI(lJC4#Am?pRKmYxzXMOI|Dv489`}yk~_I8PG zxzK*Ce<HY9|3dOGr0L?XG;zkvnT!raMVn^MoEf0;Mld1k&Asfjv}bSL@a$bE6lA$O zzI^(eIXWU-yT6}G+2sDj<;Bh26@kmHZu|cH{du-(Jx<}XrPU`YW&6{gZccgJUObom z{{2()tm+%p7sqo-*8KAhb~0n@Pye3&B|z@~!t`&KZfpD1OH_AfU;G(at(kK2;ig3| zHV9vJDSFc?^(f}VIg!0<maynZT+&~>Nn)1#zCZI4PNf>{)w6sR@^-?p8~uxxq|`l` z729ck>NR7-nmu)!Z?;)g%sSIAlINl0cW;B)KC9>5%Bp;k@y9)Q%e%Z*NM*$4`hHyK ztG>!HykM_G`TbpPIr=72+~SUf;m!UP6E9X&P3-UYug^Qk@W3ZhRLrLB^8b&Ioe$lU zx}R)wxA@)d<aXPS?+q9jUgXUCzQg>G-JEx3KRzDhFL?0z_xBe{pdP@&bY5_|3z}zU zSQzl)%^RJG9xh53A0BRJbWjk;xw%PIRds1~N>S0K5UtX(GPBr#UQbWY+uL#{pG@I@ zwr0&56RF-1zlk0xyWZtJKR4IW(UJdK5~Gx@{l1^eCY;<7pmkML)R%ehwCB^WdUr1_ z-*h?1diznMmptM9)0>a&ULBp~#c}P#MCqiXjyl?G&8g>S?Yf}$HRYy&)5pU{w>b*m zu$;bmX3VnlCHvMj`K8~m`h8aBIg`R<nVm;V-|JLdCUzWP4g2-5n3y|ng9CS*pXs_> z{O`MR7H|(}p}i4~0qE)}4Y4sXd-m>q{OFMncxcH*DG+lA+Bf#@dPWDOi76>5EbQ#% z@4tfAZD@zDdlPrXEra3dvuk_)e#>C^@iV<r{?OOR-~BN!qtifL!#Jm}DnApF*T1Uc zyIr{CO(5fR`<|WV&aoG#&S`UZVQ#Sce`A{RC-&Q(LHt{{8!aubmJgd-^{UA6WbVHy z2hQbgj0#$Q*+k=2cC?A}ag(EKEG52%CP{91W0LtY^?~)>XKk1Ar{~wUPPLa+J6pc5 zXxoA<bIh~Wgk4^geKEt+X>oC!;v(0UIpG=B=^5+RhNYdj`>f}*x0gzZRAgA0<PGp5 ziuY%ito5^+7jm~YR{6mh597^8H)LF#d9?dH1H+t1n<Dp*GmoZSS^ivPX6cXnwKZ*5 zR3}FJegDKU;g_AA%d1bDS8tE04si(lv#q+nC9dl2u0MwDr>@j~zxRBv&U{Fh^xpc< z@!+c9!sc&}9P}9!TQ2<XXlNj`-obpUv!$*sFT<);t9-;6Cd`==6B_#T$rBX;4j;=@ zqnq<=s~<gjB*N9|q7=EW#`0?3E-|jw5WiKgd_@=d?iK26$vSBMZqf6`C||Foyz^^} zH0}34dlmZg)zxG<S^sDEEPi`ePI#$2*!!h66%Fj>1)SmxZu_rXJrE-x&CReOU7Mk2 zuf&a;I(_pw7#QSbKe0CCzGr5*z<hW=4@<+vc?=s&%XAnHJh~CV5Ft~X&nE4zmwzey zJ%dBS9tMUq1_qffHij2w!aDo^r+U~ubUjwU&|v(~_4Z*#2C=zy@BW{55{tF2c9s&k z^EJ|4;H|9HhG#s>CTE4#N*``KyNKEI%GL6S&u=o19Sd{5{yoFbG-~yE`5%clZY_Nr zVZv}hD67_8I%2bn`suH*wE&S{*0uLuTa}Zuy(qy^nbF2NO1X5K+0+S)3$g=*3|f-U zvs^G+*?!~JmXdvIruz8qI25t<o|nHs?gHZr7TeDJZk~Gf8K2Cy%H6BZZV6$&nxSZ0 zu*PFc(aQ2|Pei=89LY;~rwgha1zs5=Mmfa0k6zh-#Ztm;apCK0Yp=9UpB^3)BNM7- z_H~vXgM)&AM6X+`(?whLt*tY&L^@sK;^IPfzq~c&@|11W`QQI=@a~u;#mm4WpJ$yr zE4!%ZXY!)XKO%F}Cp5p@{4VIkEa#i56HkAOZ$6~occ<utm8^28y8PdX3q)%wzlbp~ zM3(+d>*igpYiYK#?T2E@^Yv9X*G^jZ@s_u>n9Q!3@<0DOt-l)Iv2#_nop^2Mv4D9$ zA1yCip`&%NL~gnEU#*9;c;DXY`+Kq_Q*6R<^*<@+g2JztJ=5Afi&;+R!gKe!4T>9e zDxEWGwrZ+-JpMm9`|_8w3q?#BN>+R>S{1h;&BK50|4`+--w*y=Wxe!D=4l=IT)(8V z!Mk_XE&~rZb$^+6V$p{W_9qsefAv~3*Us_#tIeQ^<~Hr4CvRUrcKu0B;jSYKAH1GX zG-00oyzILleBY#+GDvjnIn*W2X1MhJ@xQBdZ)~^Tw`$#rB}=nwJeL$yCl%gm+xmQU zai6^A#?!y798dkxeSH7<sTUKXBhD@GYnnE%XJ?x4?lJ?D$k<}Vhm+Q+n*Gw6aD8!K zC~s!&uFG3zOfla6^B;JExi9s(e5_d2<2ZwfWnUJ}npXNKgOdR?x4il0tfk)Fdjs6( z+}>!sG&T&@{d~GF_Z6hEu(QP))ag`gnb&&1&X}oT=FFRae#TXQU#6})_57Td-!>%t zTzXlMb5&ZTrOTZee;3L#G@p}rXKtHOaZ!JNNb#{Eug&kaG^am&Dsyc4>Sg=)d-2;h z`V{@TwvV4RAk>LRtY?n6HrtMpiHzH>JUkAa6h7>|{@<l%57|;heG~Xf{+rvLudBY8 znzDfZ3Il^iuyORUJ;~-(LfXrYnRwU!@;y8wm8ZD;I9FC-TVELigVfxIFW!HD#dTYI z{*>D~@6W9C`5S7Sd9!2X``0H=arqYIJn~LVvU+kgqrKYat~j%T?Wqmhmfd5&u_o_t z?fZ&+*fOAR-@avEmn+?L<iMrZU-y=uSTEQ4W812oF>I5vH@gZmz9{it_kYC!QM1nZ z8WqJiS|hi<eW2xkHrzkzfpw{=XV^)TmF+@z`8qNugx|NCV_!XAV!<B;)M?{f;qTKv zFDvBw{C-Qb`i-;mv+q>C`W0Wp^rAqN;mOLKuMF#x`{k@vmfb7c#XUvyU6bV<kG*Ga zpD5X%ZPmYW@m^Vm2G8V*-dT31cfQE#JGWTdLS41}=f_n$SBFphAROY+cjEioSv*s> zb6k5e(OdZl!*su>CdlORrPt^Cz}3b)^&QNR6+V#*zCD^f^Wcs`8~%R9`*qs2E(Y~0 zEi^x#*!Gg~w%wQ4S-Y#3Z!x-`bR;CNFlbTK@|7n}$;q7fk+%8Cp?afiPT$#|yS8Tt zTA$N?bKFFAjito*&_yy4+h%Rixx8}U*K#fI&+(w1;?IpOA(MAXnrAg^F9|DkTg=b> zWy!j=uF2{%mhG$9X%u~Y_PeZEORwHm)mM7x_Hym3tV(T$0|9+&`&P+rzY@0E=!stO zvAZu%MOr6?Je;>Tz5h?d!mAl))Ys3Mwo_Rt`fXnLx55_}*ZVyazNW*SnHR^~z_`Pv zoxSee^S-4^pDyv7Tyoy9`JjM+z=hM7etu4x)TffiJ!7A*$;Q=dcWw)txv*sR<Jr?o zre4TQjbwehz5>)eEK`YHc6Hl~-}!T<NedNDE=U)x-}C=LxcGYE<~KU0j6c8Heat*W zd-K!0%g3HBRTEm`7B(Sv*+TYnPviBIds!~LDz(xDbql*Sm)^|%^U|+tN)J=e<!RNA zXZ_vrt!2jPnV)WVS!F5zHQ49N4eC>uE?ufBwoll~=inZNwv_oQ4~w43Zgn%yY3&db zoU}yZ)n$>*PZO@3JYtk^GxPGLrwnWlirW62;|KR)1b*!|K5Xyf#-VtH|Mm6t_qSwD z?(OAeaB+8EAHBVA*Rp_ied*p~Po6xPX`HSXy{)I}azcL`gMqQ};;NM=JSVFyUB2Aj zBDVkX9N)$N^eyM>^|~b+NL0O@boyzI+3b@kOb0rJ)zy4vJb3;3clCO9+xAnZrSIP5 zS5?&&=D73kWB>no7KNL4{c2`E{OQxDx}Q&fFZF)@HDmu4Gm)etn}6H>U3y`wLf_7M z8_yNl>+c7!`OfvIUlj9eQE~XK`!iA{g=d)r%RIW<fAz)ZbFmvMlBfA!-}Cx<yQ}Nb zZ^{?n`!2sc*RHl|LHI|BY15{8Pt##+c=qhsix+!mo2`9q>sM8h8<gO4!uk7Md%vFt zx2`l!4!irm^>s(vrff^+H0}!jX>0V}hTQ8=ZED(@t*DlkWgq7JEcV~Mq+3q%w;&4z z<?KO?r_Za97YfQ9Yy=JMb8v7Jl$QE>dfwcYJNso!TBE~;)YH@6O-*7j_^PI^?!ENV z<Kz9o^1W`012o>4E)UQ!0WCXzaxl<;mhi&HN3XK7)7Yj?Wnnlo|NY+j|6AwRt*Uuz zdfkpUZ2Go>SjneS1)E=8e==*4m^*))6Ysg^-CM!art^0`IJxRPg9Gx~P@5lW2am5@ znY`Do`~Q*8d=2;Oey?4+H1+GNtIT^Rv|q~Fy4-K>EAJ(%*mn4A<!ZRRe`d(n1E~VG z$0moa^!&B4z82Ou4D|x_4I`$lKA8LAvHP9%aYwnLPAs?mxCc_=&xCdlm2GWp6%-sa zL}q0j6xkRtXVRoguLZ=##q;y?)z#HEM(7A|v^Xu?yt(*$!<R2#z_S}l0vrqrHf`E; zd_~<8my88_J~Yi-y*k&`RhYqN){`f%PW}28of*%4q1kqNOXWX#we6oGH+?)9{(R%| zbMY6>xA55gSFJnY9sJ9@N~8b&`AYT!-1>VCJp8gb?Ke+`$t*j!qGfBUE`47AUf$kL zC8y@R+pgz#w*Q{lf9_f3=E}s!zszqno`3%w>I=!k#-Mu3R+f>G(b3USQ&ThKq=kjW zjWcI*zQ4PhmX;<dDQPs*M?)kidWP@b^mB6<8&<8-V&LHA?d|Wszd7CiJ9O!9h-<VG zWZmzjOP72W|C%Vgknzc@Q>)hGEL!*c{P%qYj%FKPSLR)vd%J$gn~RDnp5Ig_zuNu% zNcb-S_em-9lff(51)TgDp#8)zUrIJc`25ut>g)kc!`}go;y!%(R8(Bted;9nH>?aB zBXV|`eFS%dxLTW}o<4ngwbp{+i?X^C^NI8MH`ebD3%>sOS!H;r>Hj~Q|0EuC$;$CK zv0rb>H_gqjc7M2+wfxt<&`ib!@1Adv?O*frS}c6VOiFGpXt^oMj2XYIrvKk>`;Y1_ zGrsECbRkPRgoTq~L2ke*4xueS+4<%KuMF`Lbu`hKs^#RpB7`OL6+45jqW~|j*|WEy zxhe}^WxdT=ZdbZ>a``#=A4dHWN%!KGzC7bB#CxRn`@1tq#vm~N!=iQ578T5w(>*Wy z=+|>a>us?s-UM$TI0KjVz3guJ``UY_i+x{tW@wz$S^xU>A#lBQ0W$fb*mA+xsBqC_ zr;9#w4+)AqdGsXZ^V{wGw^?FqzNz0XxBr_^cm1HW%0jh{U2M9gvCBhNdNMG?HgD=v zXiUBrcXgS1h?eL=bJMKP`|S$WdET~+^A*SnZRTTexV<FAEYs0{MaU^O*^Jp!c&|CX z{i@5xa6wq>D)Z(SoKp{8YrJ=Drx<8LZ2g`j{wPyNla(B`+vj{Y;#npw9nEu#ZR#e+ z^emP4DzZN|%}Cf;E&jJ+)%Q<{H>U=DJ2L&<+_$UuifnpP5E)o<qccm%@|zQHp<YUQ zS6o;SlNis->4A|vXZhpn{0*KO&5WBaQ@X0mBl(ScV33i0(b;uJq@R9ea0rXre>3Os zB4!4hYaKeJ7#LomE_S$Pngm_!uv@C;kbk~BWA~xM@;0}hSWYZAJN)i$fB89c+0ToV zIZBzo&YhGsbyMG}jgwvGZgOOAhIUGB-1N9M&%QvZ|5q2|mX=u=3*1U=b8e|E-PEV> zwPn>i^LessC+?Xpz~FFw!JC>n&?&dC-K<8Y54(=8uF<x2T)`>&^~oLaH6bfK6Cf*I z-{xF-D*xkG%;5#o_ng+7SM_7PAtaKEnZY>*G@{+YX~VFiY;D&si~4=nx8L`w=2xvO z7P}=AyVZK;0=w6Gt!pf�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 Mp00i_>zopr0MhHDqyPW_ diff --git a/tinymachine-planner-02 b/tinymachine-planner-02 deleted file mode 100644 index 855c3b8..0000000 --- a/tinymachine-planner-02 +++ /dev/null @@ -1 +0,0 @@ -{"modules":{"0.6719905562745752":{"definition":"//\r\n// converts toolpath objects into segments for accel planning\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n//\r\n// This work may be reproduced, modified, distributed, performed, and\r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is\r\n// provided as is; no warranty is provided, and users accept all\r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'atk network bridge'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.address.value = '127.0.0.1'\r\n mod.port.value = 6789\r\n mod.socket = null\r\n socket_open()\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n packetOne: {\r\n type: 'packet',\r\n label: '1 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(0, headlessPacket)\r\n }\r\n },\r\n packetTwo: {\r\n type: 'packet',\r\n label: '2 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(1, headlessPacket)\r\n }\r\n },\r\n packetThree: {\r\n type: 'packet',\r\n label: '3 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(2, headlessPacket)\r\n }\r\n },\r\n packetFour: {\r\n type: 'packet',\r\n label: '4 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(3, headlessPacket)\r\n }\r\n },\r\n packetFive: {\r\n type: 'packet',\r\n label: '5 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(4, headlessPacket)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n packetOne: {\r\n type: 'packet',\r\n label: '1 packet payload',\r\n event: function(evt) {\r\n // fires elswhere with mods.output(mod, 'packetOne', data)\r\n }\r\n },\r\n packetTwo: {\r\n type: 'packet',\r\n label: '2 packet payload'\r\n },\r\n packetThree: {\r\n type: 'packet',\r\n label: '3 packet payload'\r\n },\r\n packetFour: {\r\n type: 'packet',\r\n label: '4 packet payload'\r\n },\r\n packetFive: {\r\n type: 'packet',\r\n label: '5 packet payload'\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n mod.netpath_in = new Array() // of UI\r\n mod.netpath = new Array() // of paths\r\n // settings\r\n // the network paths to the thing\r\n for (var i = 0; i < 5; i++) {\r\n add_netpath(div)\r\n }\r\n\r\n div.appendChild(document.createElement('br'))\r\n\r\n var a = document.createElement('a')\r\n a.href = './js/serialserver.js'\r\n a.innerHTML = 'serialserver:'\r\n a.target = '_blank'\r\n div.appendChild(a)\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // open/close\r\n //\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('open'))\r\n btn.addEventListener('click', function() {\r\n socket_open()\r\n })\r\n div.appendChild(btn)\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.addEventListener('click', function() {\r\n socket_close()\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // address\r\n //\r\n div.appendChild(document.createTextNode('address: '))\r\n input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.address = input\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // port\r\n //\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0port: '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.port = input\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // status\r\n //\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0status: '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.status = input\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // serial\r\n //\r\n div.appendChild(document.createTextNode('serial device:'))\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // open/close\r\n //\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('open'))\r\n btn.addEventListener('click', function() {\r\n serial_open()\r\n })\r\n div.appendChild(btn)\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.addEventListener('click', function() {\r\n serial_close()\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n }\r\n\r\n function add_netpath(div) {\r\n var numCurrentPaths = mod.netpath.length;\r\n mod.netpath_in[numCurrentPaths] = make_text_input(div, (numCurrentPaths + 1).toString() + ' network path', 12)\r\n mod.netpath_in[numCurrentPaths].addEventListener('change', function() {\r\n mod.netpath[numCurrentPaths] = mod.netpath_in[numCurrentPaths].value.split(',')\r\n if (mod.netpath[numCurrentPaths] == '') {\r\n mod.netpath[0] = []\r\n console.log('zero length address')\r\n } else {\r\n for (var i = 0; i < mod.netpath[numCurrentPaths].length; i++) {\r\n mod.netpath[numCurrentPaths][i] = parseInt(mod.netpath[numCurrentPaths][i])\r\n }\r\n console.log('new address', mod.netpath)\r\n }\r\n })\r\n mod.netpath_in[numCurrentPaths].value = '0,' + numCurrentPaths.toString()\r\n mod.netpath[numCurrentPaths] = [0, numCurrentPaths]\r\n }\r\n\r\n function packetOutput(index, headlessPacket) {\r\n // add ptr and delimiter (unshifting, so reverse order)\r\n headlessPacket.unshift(255) //end addr delimiter\r\n headlessPacket.unshift(254) //ptr\r\n // add path descending thru\r\n for (var i = mod.netpath[index].length - 1; i >= 0; i--) {\r\n headlessPacket.unshift(mod.netpath[index][i])\r\n }\r\n // add length\r\n headlessPacket.unshift(headlessPacket.length + 1)\r\n // log it\r\n // console.log('packet from demux', headlessPacket)\r\n // put it on the serial\r\n var wsMessage = {\r\n type: 'packet',\r\n packet: JSON.parse(JSON.stringify(headlessPacket))\r\n }\r\n socket_send(JSON.stringify(wsMessage))\r\n }\r\n\r\n function packetInput(packet) {\r\n // shift pointer\r\n shiftPacketPointer(packet)\r\n // find address in packet, address has been flipped\r\n // assuming this is a terminal packet, i.e. we are the recipient,\r\n // cut \r\n var returnPacketHeader = packet.slice(2, packet.indexOf(255))\r\n // and then flip the header\r\n var packetHeader = new Array()\r\n for (var i = 0; i < returnPacketHeader.length; i++) {\r\n packetHeader[i] = returnPacketHeader[returnPacketHeader.length - i - 1]\r\n }\r\n var indexMatch = null\r\n // match to addresses mod.netpath[i]\r\n for (var i = 0; i < mod.netpath.length; i++) {\r\n if (packetHeader.length === mod.netpath[i].length) {\r\n if (packetHeader.toString() === mod.netpath[i].toString()) {\r\n // just takes 1st match\r\n // actually, we are receiving ack'd packets, w/ reversed headers\r\n\r\n indexMatch = i\r\n }\r\n }\r\n }\r\n // is match?\r\n if (indexMatch != null) {\r\n // console.log('match on ', indexMatch)\r\n // dereference header\r\n var headlessPacket = packet.slice(packetHeader.length + 3, packet.length)\r\n // console.log('headless', headlessPacket)\r\n // send on port\r\n // big messy nasty no thank you\r\n switch (indexMatch) {\r\n case 0:\r\n mods.output(mod, 'packetOne', headlessPacket)\r\n break\r\n case 1:\r\n mods.output(mod, 'packetTwo', headlessPacket)\r\n break\r\n case 2:\r\n mods.output(mod, 'packetThree', headlessPacket)\r\n break\r\n case 3:\r\n mods.output(mod, 'packetFour', headlessPacket)\r\n break\r\n case 4:\r\n mods.output(mod, 'packetFive', headlessPacket)\r\n break\r\n }\r\n } else {\r\n console.log('no match on returned packet')\r\n }\r\n }\r\n\r\n function shiftPacketPointer(array) {\r\n // find end of packet header\r\n var end = 0\r\n var i = 0\r\n while (end == 0) {\r\n if (array[i] === 255) {\r\n end = i\r\n } else if (i >= array.length) {\r\n break\r\n }\r\n i++\r\n }\r\n // we'll assume we're the last drop, put the pointer at the head\r\n array[1] = 254\r\n // and then shift the address bytes forward\r\n for (var j = 2; j < end - 1; j++) {\r\n array[j] = array[j + 1]\r\n }\r\n array[end-1] = 0 // incoming port\r\n }\r\n\r\n var thisPacket = new Array() // we sometimes receive incomplete packets, have to track and parse\r\n //\r\n function socket_open() {\r\n var url = \"ws://\" + mod.address.value + ':' + mod.port.value\r\n mod.socket = new WebSocket(url)\r\n mod.socket.onopen = function(event) {\r\n mod.status.value = \"socket opened\"\r\n serial_open()\r\n }\r\n mod.socket.onerror = function(event) {\r\n mod.status.value = \"can not open\"\r\n mod.socket = null\r\n }\r\n mod.socket.onmessage = function(event) {\r\n var wsMessage = JSON.parse(event.data)\r\n if (wsMessage.type === 'message') {\r\n mod.status.value = wsMessage.message\r\n } else if (wsMessage.type === 'array') {\r\n // we are the 0th port, \r\n thisPacket = thisPacket.concat(wsMessage.array)\r\n\r\n if (thisPacket[0] <= 0) {\r\n thisPacket = []\r\n console.log('throwing packet with leading zero')\r\n }\r\n\r\n while (thisPacket.length >= thisPacket[0]) {\r\n if (thisPacket.length == thisPacket[0]) {\r\n //console.log('one packet', thisPacket)\r\n packetInput(JSON.parse(JSON.stringify(thisPacket)))\r\n thisPacket = []\r\n } else {\r\n var fullPacket = thisPacket.slice(0, thisPacket[0])\r\n packetInput(JSON.parse(JSON.stringify(fullPacket)))\r\n //console.log('second packet', fullPacket)\r\n thisPacket = thisPacket.slice(thisPacket[0])\r\n }\r\n }\r\n\r\n } else {\r\n mod.status.value = 'message not recognized'\r\n }\r\n }\r\n }\r\n\r\n function socket_close() {\r\n mod.socket.close()\r\n mod.status.value = \"socket closed\"\r\n mod.socket = null\r\n }\r\n\r\n function socket_send(msg) {\r\n if (mod.socket != null) {\r\n mod.status.value = \"send\"\r\n mod.socket.send(msg)\r\n } else {\r\n mod.status.value = \"can't send, not open\"\r\n }\r\n }\r\n\r\n function serial_open() {\r\n if (mod.socket == null) {\r\n mod.status.value = \"socket not open\"\r\n } else {\r\n var msg = {}\r\n msg.type = 'open'\r\n mod.socket.send(JSON.stringify(msg))\r\n }\r\n }\r\n\r\n function serial_close() {\r\n if (mod.socket == null) {\r\n mod.status.value = \"socket not open\"\r\n } else {\r\n var msg = {}\r\n msg.type = 'close'\r\n msg.device = mod.device.value\r\n mod.socket.send(JSON.stringify(msg))\r\n }\r\n }\r\n\r\n function serial_send(wsMessage) {\r\n if (mod.socket == null) {\r\n mod.status.value = \"socket not open\"\r\n } else {\r\n mod.socket.send(JSON.stringify(wsMessage))\r\n mod.status.value = 'transmit'\r\n }\r\n }\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"1237.8217036023414","left":"2236.2670037054045","inputs":{},"outputs":{}},"0.6070416201560498":{"definition":"//\r\n// converts toolpath objects into segments for accel planning\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n//\r\n// This work may be reproduced, modified, distributed, performed, and\r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is\r\n// provided as is; no warranty is provided, and users accept all\r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'stepper'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.stepper_axis_num_in.value = '0'\r\n mod.axis_num = 0\r\n mod.steps_per_mm_in.value = '80'\r\n mod.convert = 80\r\n mod.block = {\r\n accel: 50,\r\n cruise: 120,\r\n entry: 0,\r\n exit: 30,\r\n p1: [0, 0, 0],\r\n p2: [10, 10, 10]\r\n }\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n block: {\r\n type: 'object',\r\n label: 'block',\r\n event: function(evt) {\r\n mod.block = JSON.parse(JSON.stringify(evt.detail)) // dereference pls\r\n shipIt()\r\n }\r\n },\r\n ack: {\r\n type: 'packet',\r\n label: 'headless packet in',\r\n event: function(evt) {\r\n onAcknowledgement(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n acknowledgement: {\r\n type: 'object',\r\n label: 'acknowledgement',\r\n event: function(obj) {\r\n mods.output(mod, 'acknowledgement', obj)\r\n }\r\n },\r\n packet: {\r\n type: 'packet',\r\n label: 'headless packet out',\r\n event: function() {\r\n //mods.output(mod, 'segments', null)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n // settings\r\n // the axis to pull out of the block - index of posistions on p1, p2\r\n mod.stepper_axis_num_in = make_text_input(div, 'axis index', 12)\r\n mod.stepper_axis_num_in.addEventListener('change', function() {\r\n mod.axis_num = parseInt(mod.stepper_axis_num_in.value)\r\n })\r\n // steps per mm\r\n mod.steps_per_mm_in = make_text_input(div, 'steps per mm', 12)\r\n mod.steps_per_mm_in.addEventListener('change', function() {\r\n mod.covert = parseFloat(mod.steps_per_mm_in.value)\r\n })\r\n // reverse?\r\n mod.reverseCheck = make_checkbox_input(div, 'reversed')\r\n //\r\n // request to do the business\r\n //\r\n mod.send_button = make_button_input(div, 'send')\r\n mod.send_button.addEventListener('click', function() {\r\n shipIt()\r\n })\r\n }\r\n\r\n function cartesianDistance(p1, p2) {\r\n // takes p1, p2 to be arrays of same length\r\n // computes cartesian distance\r\n var sum = 0\r\n for (var i = 0; i < p1.length; i++) {\r\n sum += Math.pow((p1[i] - p2[i]), 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function cartesianLength(v) {\r\n // length of vector\r\n var sum = 0\r\n for (var i = 0; i < v.length; i++) {\r\n sum += Math.pow(v[i], 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function addMatrix(a, b, c) {\r\n // c = a + b\r\n a.forEach(function(item, index) {\r\n c[index] = b[index] + a[index]\r\n })\r\n }\r\n\r\n function subtractMatrix(a, b, c) {\r\n // c = a - b\r\n b.forEach(function(item, index) {\r\n c[index] = a[index] - b[index]\r\n })\r\n }\r\n\r\n function multiplyMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n a.forEach(function(item, index) {\r\n b[index] = a[index] * scalar\r\n })\r\n }\r\n\r\n function multiply2dMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n for (var i = 0; i < a.length; i++) {\r\n for (var j = 0; j < a[i].length; j++) {\r\n b[i][j] = a[i][j] * scalar;\r\n }\r\n }\r\n }\r\n\r\n function divideMatrix(a, scalar, b) {\r\n // b = a / scalar\r\n for (var i = 0; i < a.length; i++) {\r\n b[i] = a[i] / scalar\r\n }\r\n }\r\n\r\n function unitVector(p1, p2) {\r\n // returns new array, is unit vector of p2-p1\r\n var unit = new Array()\r\n subtractMatrix(p2, p1, unit)\r\n var length = cartesianLength(unit)\r\n divideMatrix(unit, length, unit)\r\n\r\n return unit\r\n }\r\n\r\n function dotProduct(a, b) {\r\n // returns a dot b\r\n var sum = 0;\r\n for (var i = 0; i < a.length; i++) {\r\n sum += a[i] * b[i]\r\n }\r\n\r\n return sum\r\n }\r\n\r\n function toFixedMatrix(a, digits) {\r\n var rounded = new Array()\r\n for (var i = 0; i < a.length; i++) {\r\n rounded[i] = a[i].toFixed(digits)\r\n }\r\n\r\n return rounded\r\n }\r\n\r\n /*\r\n now:\r\n\r\n start from segment and find a corner\r\n do planner\r\n\r\n */\r\n\r\n //\r\n // local functions\r\n //\r\n\r\n function onAcknowledgement(packet){\r\n if(packet[0] == 132){\r\n // wait move\r\n var ack = {}\r\n ack.axis = mod.axis_num\r\n ack.type = 'wait acknowledgement'\r\n outputs.acknowledgement.event(ack)\r\n } else if (packet[0] == 131){\r\n var ack = {}\r\n ack.axis = mod.axis_num \r\n ack.type = 'move acknowledgement'\r\n var steps = unpack32(packet, 1)\r\n ack.increment = steps / mod.convert\r\n outputs.acknowledgement.event(ack)\r\n } else {\r\n console.log('nonrecognized ack to stepper')\r\n }\r\n // check if was wait / was move, send response accordingly \r\n }\r\n\r\n function shipIt() {\r\n // sends integer values, I think we maintain positioning because we round before subtracting\r\n\r\n var trapezoid = calculateTrapezoid(mod.axis_num)\r\n if (trapezoid.length == 0) {\r\n var ok = 0\r\n var i = 0\r\n var waitTrap\r\n while (!ok && i < mod.block.p1.length) {\r\n waitTrap = calculateTrapezoid(i)\r\n if (waitTrap.delta != 0) {\r\n ok = 1\r\n } else {\r\n i++\r\n }\r\n }\r\n if (ok) {\r\n sendWait(waitTrap)\r\n } else {\r\n console.log('step zero packet, but no axis of nonzero length found', JSON.parse(JSON.stringify(mod.block)))\r\n }\r\n } else {\r\n sendTrapezoid(trapezoid)\r\n }\r\n }\r\n\r\n function calculateTrapezoid(axis) {\r\n // packet (per stepper block)\r\n // steps, entry, accel, accelLength, deccelLength\r\n // first we fill this with all of the info we'll use to calculated\r\n // the trapezoid in planner-space units, then we convert to steps last\r\n var trap = {}\r\n\r\n // lengths and positions for the move\r\n trap.x1 = mod.block.p1[axis]\r\n trap.x2 = mod.block.p2[axis]\r\n trap.delta = trap.x2 - trap.x1\r\n trap.length = Math.abs(trap.delta)\r\n\r\n // rates for the move\r\n var unit = unitVector(mod.block.p1, mod.block.p2)\r\n var relativeRate = Math.abs(unit[axis])\r\n trap.entry = mod.block.entry * relativeRate\r\n trap.accel = mod.block.accel * relativeRate\r\n trap.cruise = mod.block.cruise * relativeRate\r\n trap.exit = mod.block.exit * relativeRate\r\n\r\n // now accelLength and deccelLength\r\n // using the maximum deltaV for the move,\r\n // we'll figure out what type of move we have\r\n var maxExit = Math.sqrt(trap.entry * trap.entry + 2 * trap.accel * trap.length)\r\n var maxEntry = Math.sqrt(trap.exit * trap.entry + 2 * trap.accel * trap.length)\r\n\r\n // there are 7 possible profiles\r\n if (trap.length <= 0) {\r\n // console.log('zero length trap')\r\n } else if (maxExit <= trap.exit) {\r\n // full ramp-up: have to push iiit to get there\r\n //console.log('full rampup')\r\n trap.ramptype = 'rampup'\r\n trap.accelLength = trap.length\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // for the wait function\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (maxEntry <= trap.entry) {\r\n // full ramp-down: have to deccel all the way with this rate\r\n //console.log('full rampdown')\r\n trap.ramptype = 'rampdown'\r\n trap.deccelLength = 0 // start immmeeeeediately\r\n trap.accelLength = 0 // never accel\r\n // for the wait\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (trap.cruise == trap.entry && trap.cruise == trap.exit) {\r\n // str8 relaxin, no maxin\r\n //console.log('full cruise')\r\n trap.ramptype = 'cruise'\r\n trap.accelLength = 0 // never accel\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // wait\r\n trap.vAvg = trap.cruise\r\n } else if (trap.cruise == trap.entry) {\r\n // cruise, then deccel\r\n //console.log('cruise then deccel')\r\n // for how long do we have to decel? we have to have deltaV for\r\n trap.ramptype = 'cruiseDeccel'\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n trap.deccelLength = trap.length - deccelDistance\r\n trap.accelLength = 0; // never accel\r\n // we really want speed by multiple times, and total distance we know, for vAvg\r\n var tSum = (trap.cruise - trap.exit) / trap.accel + trap.deccelLength / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else if (trap.cruise == trap.exit) {\r\n // accel, cruise? unless entry also cruise?\r\n //console.log('accel then cruise')\r\n trap.ramptype = 'cruiseAccel'\r\n trap.accelLength = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.deccelLength = trap.length + 1; // and never deccel\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.delta - trap.accellength) / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n // it's either a full trap, or a triangle\r\n var accelDistance = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n if ((accelDistance + deccelDistance) < trap.length) {\r\n //console.log('full trap')\r\n trap.ramptype = 'fullTrap'\r\n trap.accelLength = accelDistance\r\n trap.deccelLength = trap.length - deccelDistance\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.deccelLength - trap.accellength) / trap.cruise + (trap.cruise - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n //console.log('triangle')\r\n trap.ramptype = 'triangle'\r\n // find intersection point\r\n var vPeak = Math.sqrt((2 * trap.accel * trap.length + Math.pow(trap.entry, 2) + Math.pow(trap.exit, 2)) / 2)\r\n //console.log('entry, peak, exit', trap.entry, vPeak, trap.exit)\r\n var midPoint = (vPeak * vPeak - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.accelLength = midPoint\r\n trap.deccelLength = midPoint\r\n var tSum = (vPeak - trap.entry) / trap.accel + (vPeak - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n }\r\n }\r\n\r\n return trap\r\n }\r\n\r\n function sendTrapezoid(trap) {\r\n //console.log('trapezoid', trapezoid)\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n\r\n var packet = new Array();\r\n // first, the packet header: the route, ptr and end_addr delimiter\r\n // #define APA_END_ROUTE_DELIMITER 255\r\n // #define APA_ROUTE_POINTER 254\r\n // #define DELIM_KEY_TRAPEZOID 131 // is 32 bit int\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(131)\r\n // now we pack these values into UART-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n var steps;\r\n if(mod.reverseCheck.checked){\r\n steps = -stepwiseTrap.steps\r\n } else {\r\n steps = stepwiseTrap.steps\r\n }\r\n packet = packet.concat(pack32(steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // log this if you wish\r\n //console.log('packet from stepper', packet)\r\n // send it along!\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function sendWait(trap) {\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n var packet = new Array();\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(132)\r\n // now we pack these values into C-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n packet = packet.concat(pack32(stepwiseTrap.steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // send it along!\r\n //console.log('wait packet', packet)\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function trapezoidToStepwise(trap) {\r\n var stepwise = {}\r\n // planner units -> steps\r\n stepwise.steps = Math.round(trap.delta * mod.convert)\r\n // planner units -> steps/min (for less integer error)\r\n stepwise.entry = Math.round(trap.entry * mod.convert)\r\n // planner units -> steps/min/s (a messed up unit, I know)\r\n stepwise.accel = Math.round(trap.accel * mod.convert)\r\n // planner units -> steps\r\n stepwise.accelLength = Math.round(trap.accelLength * mod.convert)\r\n stepwise.deccelLength = Math.round(trap.deccelLength * mod.convert)\r\n\r\n return stepwise\r\n }\r\n\r\n function trapezoidToStepWait(trap) {\r\n var stepWait = {}\r\n // planner units -> steps\r\n stepWait.steps = Math.round(trap.length * mod.convert)\r\n //\r\n stepWait.vAvg = Math.round(trap.vAvg * mod.convert)\r\n if(isNaN(stepWait.vAvg)){\r\n console.log('err on vAvg maths in stepper')\r\n stepWait.vAvg = 1000\r\n }\r\n\r\n return stepWait\r\n }\r\n\r\n function pack32(val) {\r\n var pack = new Array();\r\n pack[0] = (val >> 24) & 255;\r\n pack[1] = (val >> 16) & 255;\r\n pack[2] = (val >> 8) & 255;\r\n pack[3] = val & 255;\r\n\r\n return pack;\r\n }\r\n\r\n function unpack32(array, start){\r\n var unpack = array[start] << 24 | array[start + 1] << 16 | array[start + 2] << 8 | array[start + 3]\r\n return unpack\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"969.229246490451","left":"2271.901392094708","inputs":{},"outputs":{}},"0.46397689809504195":{"definition":"//\r\n// converts toolpath objects into segments for accel planning\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n//\r\n// This work may be reproduced, modified, distributed, performed, and\r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is\r\n// provided as is; no warranty is provided, and users accept all\r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'stepper'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.stepper_axis_num_in.value = '0'\r\n mod.axis_num = 0\r\n mod.steps_per_mm_in.value = '80'\r\n mod.convert = 80\r\n mod.block = {\r\n accel: 50,\r\n cruise: 120,\r\n entry: 0,\r\n exit: 30,\r\n p1: [0, 0, 0],\r\n p2: [10, 10, 10]\r\n }\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n block: {\r\n type: 'object',\r\n label: 'block',\r\n event: function(evt) {\r\n mod.block = JSON.parse(JSON.stringify(evt.detail)) // dereference pls\r\n shipIt()\r\n }\r\n },\r\n ack: {\r\n type: 'packet',\r\n label: 'headless packet in',\r\n event: function(evt) {\r\n onAcknowledgement(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n acknowledgement: {\r\n type: 'object',\r\n label: 'acknowledgement',\r\n event: function(obj) {\r\n mods.output(mod, 'acknowledgement', obj)\r\n }\r\n },\r\n packet: {\r\n type: 'packet',\r\n label: 'headless packet out',\r\n event: function() {\r\n //mods.output(mod, 'segments', null)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n // settings\r\n // the axis to pull out of the block - index of posistions on p1, p2\r\n mod.stepper_axis_num_in = make_text_input(div, 'axis index', 12)\r\n mod.stepper_axis_num_in.addEventListener('change', function() {\r\n mod.axis_num = parseInt(mod.stepper_axis_num_in.value)\r\n })\r\n // steps per mm\r\n mod.steps_per_mm_in = make_text_input(div, 'steps per mm', 12)\r\n mod.steps_per_mm_in.addEventListener('change', function() {\r\n mod.covert = parseFloat(mod.steps_per_mm_in.value)\r\n })\r\n // reverse?\r\n mod.reverseCheck = make_checkbox_input(div, 'reversed')\r\n //\r\n // request to do the business\r\n //\r\n mod.send_button = make_button_input(div, 'send')\r\n mod.send_button.addEventListener('click', function() {\r\n shipIt()\r\n })\r\n }\r\n\r\n function cartesianDistance(p1, p2) {\r\n // takes p1, p2 to be arrays of same length\r\n // computes cartesian distance\r\n var sum = 0\r\n for (var i = 0; i < p1.length; i++) {\r\n sum += Math.pow((p1[i] - p2[i]), 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function cartesianLength(v) {\r\n // length of vector\r\n var sum = 0\r\n for (var i = 0; i < v.length; i++) {\r\n sum += Math.pow(v[i], 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function addMatrix(a, b, c) {\r\n // c = a + b\r\n a.forEach(function(item, index) {\r\n c[index] = b[index] + a[index]\r\n })\r\n }\r\n\r\n function subtractMatrix(a, b, c) {\r\n // c = a - b\r\n b.forEach(function(item, index) {\r\n c[index] = a[index] - b[index]\r\n })\r\n }\r\n\r\n function multiplyMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n a.forEach(function(item, index) {\r\n b[index] = a[index] * scalar\r\n })\r\n }\r\n\r\n function multiply2dMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n for (var i = 0; i < a.length; i++) {\r\n for (var j = 0; j < a[i].length; j++) {\r\n b[i][j] = a[i][j] * scalar;\r\n }\r\n }\r\n }\r\n\r\n function divideMatrix(a, scalar, b) {\r\n // b = a / scalar\r\n for (var i = 0; i < a.length; i++) {\r\n b[i] = a[i] / scalar\r\n }\r\n }\r\n\r\n function unitVector(p1, p2) {\r\n // returns new array, is unit vector of p2-p1\r\n var unit = new Array()\r\n subtractMatrix(p2, p1, unit)\r\n var length = cartesianLength(unit)\r\n divideMatrix(unit, length, unit)\r\n\r\n return unit\r\n }\r\n\r\n function dotProduct(a, b) {\r\n // returns a dot b\r\n var sum = 0;\r\n for (var i = 0; i < a.length; i++) {\r\n sum += a[i] * b[i]\r\n }\r\n\r\n return sum\r\n }\r\n\r\n function toFixedMatrix(a, digits) {\r\n var rounded = new Array()\r\n for (var i = 0; i < a.length; i++) {\r\n rounded[i] = a[i].toFixed(digits)\r\n }\r\n\r\n return rounded\r\n }\r\n\r\n /*\r\n now:\r\n\r\n start from segment and find a corner\r\n do planner\r\n\r\n */\r\n\r\n //\r\n // local functions\r\n //\r\n\r\n function onAcknowledgement(packet){\r\n if(packet[0] == 132){\r\n // wait move\r\n var ack = {}\r\n ack.axis = mod.axis_num\r\n ack.type = 'wait acknowledgement'\r\n outputs.acknowledgement.event(ack)\r\n } else if (packet[0] == 131){\r\n var ack = {}\r\n ack.axis = mod.axis_num \r\n ack.type = 'move acknowledgement'\r\n var steps = unpack32(packet, 1)\r\n ack.increment = steps / mod.convert\r\n outputs.acknowledgement.event(ack)\r\n } else {\r\n console.log('nonrecognized ack to stepper')\r\n }\r\n // check if was wait / was move, send response accordingly \r\n }\r\n\r\n function shipIt() {\r\n // sends integer values, I think we maintain positioning because we round before subtracting\r\n\r\n var trapezoid = calculateTrapezoid(mod.axis_num)\r\n if (trapezoid.length == 0) {\r\n var ok = 0\r\n var i = 0\r\n var waitTrap\r\n while (!ok && i < mod.block.p1.length) {\r\n waitTrap = calculateTrapezoid(i)\r\n if (waitTrap.delta != 0) {\r\n ok = 1\r\n } else {\r\n i++\r\n }\r\n }\r\n if (ok) {\r\n sendWait(waitTrap)\r\n } else {\r\n console.log('step zero packet, but no axis of nonzero length found', JSON.parse(JSON.stringify(mod.block)))\r\n }\r\n } else {\r\n sendTrapezoid(trapezoid)\r\n }\r\n }\r\n\r\n function calculateTrapezoid(axis) {\r\n // packet (per stepper block)\r\n // steps, entry, accel, accelLength, deccelLength\r\n // first we fill this with all of the info we'll use to calculated\r\n // the trapezoid in planner-space units, then we convert to steps last\r\n var trap = {}\r\n\r\n // lengths and positions for the move\r\n trap.x1 = mod.block.p1[axis]\r\n trap.x2 = mod.block.p2[axis]\r\n trap.delta = trap.x2 - trap.x1\r\n trap.length = Math.abs(trap.delta)\r\n\r\n // rates for the move\r\n var unit = unitVector(mod.block.p1, mod.block.p2)\r\n var relativeRate = Math.abs(unit[axis])\r\n trap.entry = mod.block.entry * relativeRate\r\n trap.accel = mod.block.accel * relativeRate\r\n trap.cruise = mod.block.cruise * relativeRate\r\n trap.exit = mod.block.exit * relativeRate\r\n\r\n // now accelLength and deccelLength\r\n // using the maximum deltaV for the move,\r\n // we'll figure out what type of move we have\r\n var maxExit = Math.sqrt(trap.entry * trap.entry + 2 * trap.accel * trap.length)\r\n var maxEntry = Math.sqrt(trap.exit * trap.entry + 2 * trap.accel * trap.length)\r\n\r\n // there are 7 possible profiles\r\n if (trap.length <= 0) {\r\n // console.log('zero length trap')\r\n } else if (maxExit <= trap.exit) {\r\n // full ramp-up: have to push iiit to get there\r\n //console.log('full rampup')\r\n trap.ramptype = 'rampup'\r\n trap.accelLength = trap.length\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // for the wait function\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (maxEntry <= trap.entry) {\r\n // full ramp-down: have to deccel all the way with this rate\r\n //console.log('full rampdown')\r\n trap.ramptype = 'rampdown'\r\n trap.deccelLength = 0 // start immmeeeeediately\r\n trap.accelLength = 0 // never accel\r\n // for the wait\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (trap.cruise == trap.entry && trap.cruise == trap.exit) {\r\n // str8 relaxin, no maxin\r\n //console.log('full cruise')\r\n trap.ramptype = 'cruise'\r\n trap.accelLength = 0 // never accel\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // wait\r\n trap.vAvg = trap.cruise\r\n } else if (trap.cruise == trap.entry) {\r\n // cruise, then deccel\r\n //console.log('cruise then deccel')\r\n // for how long do we have to decel? we have to have deltaV for\r\n trap.ramptype = 'cruiseDeccel'\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n trap.deccelLength = trap.length - deccelDistance\r\n trap.accelLength = 0; // never accel\r\n // we really want speed by multiple times, and total distance we know, for vAvg\r\n var tSum = (trap.cruise - trap.exit) / trap.accel + trap.deccelLength / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else if (trap.cruise == trap.exit) {\r\n // accel, cruise? unless entry also cruise?\r\n //console.log('accel then cruise')\r\n trap.ramptype = 'cruiseAccel'\r\n trap.accelLength = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.deccelLength = trap.length + 1; // and never deccel\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.delta - trap.accellength) / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n // it's either a full trap, or a triangle\r\n var accelDistance = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n if ((accelDistance + deccelDistance) < trap.length) {\r\n //console.log('full trap')\r\n trap.ramptype = 'fullTrap'\r\n trap.accelLength = accelDistance\r\n trap.deccelLength = trap.length - deccelDistance\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.deccelLength - trap.accellength) / trap.cruise + (trap.cruise - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n //console.log('triangle')\r\n trap.ramptype = 'triangle'\r\n // find intersection point\r\n var vPeak = Math.sqrt((2 * trap.accel * trap.length + Math.pow(trap.entry, 2) + Math.pow(trap.exit, 2)) / 2)\r\n //console.log('entry, peak, exit', trap.entry, vPeak, trap.exit)\r\n var midPoint = (vPeak * vPeak - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.accelLength = midPoint\r\n trap.deccelLength = midPoint\r\n var tSum = (vPeak - trap.entry) / trap.accel + (vPeak - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n }\r\n }\r\n\r\n return trap\r\n }\r\n\r\n function sendTrapezoid(trap) {\r\n //console.log('trapezoid', trapezoid)\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n\r\n var packet = new Array();\r\n // first, the packet header: the route, ptr and end_addr delimiter\r\n // #define APA_END_ROUTE_DELIMITER 255\r\n // #define APA_ROUTE_POINTER 254\r\n // #define DELIM_KEY_TRAPEZOID 131 // is 32 bit int\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(131)\r\n // now we pack these values into UART-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n var steps;\r\n if(mod.reverseCheck.checked){\r\n steps = -stepwiseTrap.steps\r\n } else {\r\n steps = stepwiseTrap.steps\r\n }\r\n packet = packet.concat(pack32(steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // log this if you wish\r\n //console.log('packet from stepper', packet)\r\n // send it along!\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function sendWait(trap) {\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n var packet = new Array();\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(132)\r\n // now we pack these values into C-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n packet = packet.concat(pack32(stepwiseTrap.steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // send it along!\r\n //console.log('wait packet', packet)\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function trapezoidToStepwise(trap) {\r\n var stepwise = {}\r\n // planner units -> steps\r\n stepwise.steps = Math.round(trap.delta * mod.convert)\r\n // planner units -> steps/min (for less integer error)\r\n stepwise.entry = Math.round(trap.entry * mod.convert)\r\n // planner units -> steps/min/s (a messed up unit, I know)\r\n stepwise.accel = Math.round(trap.accel * mod.convert)\r\n // planner units -> steps\r\n stepwise.accelLength = Math.round(trap.accelLength * mod.convert)\r\n stepwise.deccelLength = Math.round(trap.deccelLength * mod.convert)\r\n\r\n return stepwise\r\n }\r\n\r\n function trapezoidToStepWait(trap) {\r\n var stepWait = {}\r\n // planner units -> steps\r\n stepWait.steps = Math.round(trap.length * mod.convert)\r\n //\r\n stepWait.vAvg = Math.round(trap.vAvg * mod.convert)\r\n if(isNaN(stepWait.vAvg)){\r\n console.log('err on vAvg maths in stepper')\r\n stepWait.vAvg = 1000\r\n }\r\n\r\n return stepWait\r\n }\r\n\r\n function pack32(val) {\r\n var pack = new Array();\r\n pack[0] = (val >> 24) & 255;\r\n pack[1] = (val >> 16) & 255;\r\n pack[2] = (val >> 8) & 255;\r\n pack[3] = val & 255;\r\n\r\n return pack;\r\n }\r\n\r\n function unpack32(array, start){\r\n var unpack = array[start] << 24 | array[start + 1] << 16 | array[start + 2] << 8 | array[start + 3]\r\n return unpack\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"685.457339396226","left":"2277.229269245127","inputs":{},"outputs":{}},"0.8759207754144251":{"definition":"//\r\n// gets lines of gcode, turns into instructions for mods-machines\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n\r\n/*\r\nturns lines of text into objects for machine controller \r\n*/\r\n\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'gcode parser'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.g0SpeedIn.value = '100'\r\n mod.g1SpeedIn.value = '400'\r\n mod.codeMode.value = 'G0'\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n gcode: {\r\n type: 'string',\r\n label: 'gcode',\r\n event: function(evt) {\r\n parseGCode(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n instruction: {\r\n type: 'object',\r\n label: 'instruction',\r\n event: function(obj) {\r\n mods.output(mod, 'instruction', obj)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n // we're going to convert all of these DPIs to MMs because we live in the real world now\r\n mod.g0SpeedIn = make_text_input(div, 'G0 speed, gcode units', 12)\r\n mod.g1SpeedIn = make_text_input(div, 'G1 speed, gcode units', 12)\r\n mod.codeMode = make_text_input(div, 'Modality', 12)\r\n }\r\n\r\n function parseGCode(str) {\r\n // get letter-value pairs\r\n var keyvals = getKeyValues(str)\r\n // do modality\r\n // check this for no-g moves?\r\n if (keyvals.G == 0 | keyvals.G == 1) {\r\n mod.codeMode.value = 'G' + keyvals.G.toString()\r\n } else if (keyvals.M != null) {\r\n mod.codeMode.value = 'M' + keyvals.M.toString()\r\n }\r\n // do parse and object \r\n if (mod.codeMode.value == 'G0' | mod.codeMode.value == 'G1') {\r\n\r\n var output = {\r\n type: 'move',\r\n position: {},\r\n speed: 0\r\n }\r\n // loop to find position vals, check for feed update\r\n for (key in keyvals) {\r\n if (key.match('[A-CX-Z]')) {\r\n output.position[key] = keyvals[key]\r\n } else if (key.match('[F]')){\r\n if(mod.codeMode.value == 'G0'){\r\n // assert minimum speed \r\n mod.g0SpeedIn.value = Math.max(10, keyvals.F)\r\n } else {\r\n mod.g1SpeedIn.value = Math.max(10, keyvals.F)\r\n }\r\n }\r\n }\r\n\r\n if(mod.codeMode.value == 'G0'){\r\n output.speed = parseFloat(mod.g0SpeedIn.value)\r\n } else {\r\n output.speed = parseFloat(mod.g1SpeedIn.value)\r\n }\r\n\r\n outputs.instruction.event(output)\r\n } else if (mod.codeMode.value == 'M3'){\r\n var output = {\r\n type: 'spindle',\r\n speed: 0\r\n }\r\n if(keyvals.S != null){\r\n output.speed = keyvals.S\r\n outputs.instruction.event(output)\r\n } else {\r\n console.log('need S parameter on spindle instruction')\r\n }\r\n } else if (mod.codeMode.value == 'M5'){\r\n var output = {\r\n type: 'spindle',\r\n speed: 0\r\n }\r\n output.instruction.event(output)\r\n } else {\r\n console.log('gcode instruction not recognized')\r\n }\r\n }\r\n\r\n function getKeyValues(str) {\r\n var kv = {}\r\n for (var i = 0; i < str.length; i++) {\r\n if (str[i].match('[A-Za-z]')) { // regex to match upper case letters\r\n var lastIndex = str.indexOf(' ', i)\r\n if (lastIndex < 0) {\r\n lastIndex = str.length\r\n }\r\n var key = str[i].toUpperCase()\r\n kv[key] = parseFloat(str.slice(i + 1, lastIndex))\r\n }\r\n }\r\n return kv\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"728.5668576736316","left":"1021.7953606756222","inputs":{},"outputs":{}},"0.8045719666145382":{"definition":"//\r\n// generic line input\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'text lines input'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.textAreaIn.value =\r\n \" G1 X0 Y0 F1400\\n\\\r\nZ16\\n\\\r\nZ5.5\\n\\\r\nG1 Z0.5\\n\\\r\nX100\\n\\\r\nY100\\n\\\r\nX3.536\\n\\\r\nY30\\n\\\r\nX7.071 Y26.465\\n\\\r\nX0 Y19.393\\n\\\r\nX7.071 Y12.322\\n\\\r\nX0 Y5.251\\n\\\r\nX95\\n\\\r\nY95\\n\\\r\nX8.536\\n\\\r\nY90\\n\\\r\nX90\\n\\\r\nY10.251\\n\\\r\nX13.535\\n\\\r\nY50.251\\n\\\r\nX14.243 Y50.958\\n\\\r\nX12.828 Y52.373\\n\\\r\nX14.243 Y53.787\\n\\\r\nX12.828 Y55.201\\n\\\r\nX14.243 Y56.615\\n\\\r\nX12.828 Y58.029\\n\\\r\nX14.243 Y59.444\\n\\\r\nX12.828 Y60.858\\n\\\r\nX14.243 Y62.272\\n\\\r\nX12.828 Y63.686\\n\\\r\nX14.243 Y65.101\\n\\\r\nX12.828 Y66.515\\n\\\r\nX14.243 Y67.929\\n\\\r\nX12.828 Y69.343\\n\\\r\nX13.889 Y70.404\\n\\\r\nX13.182 Y71.111\\n\\\r\nX13.889 Y71.818\\n\\\r\nX13.182 Y72.525\\n\\\r\nX13.889 Y73.232\\n\\\r\nX13.182 Y73.939\\n\\\r\nX13.889 Y74.646\\n\\\r\nX13.182 Y75.354\\n\\\r\nX13.889 Y76.061\\n\\\r\nX13.182 Y76.768\\n\\\r\nX13.889 Y77.475\\n\\\r\nX13.182 Y78.182\\n\\\r\nX13.889 Y78.889\\n\\\r\nX14.243 Y50.958\\n\\\r\nX12.828 Y52.373\\n\\\r\nX14.243 Y53.787\\n\\\r\nX12.828 Y55.201\\n\\\r\nX14.243 Y56.615\\n\\\r\nX12.828 Y58.029\\n\\\r\nX14.243 Y59.444\\n\\\r\nX12.828 Y60.858\\n\\\r\nX14.243 Y62.272\\n\\\r\nX12.828 Y63.686\\n\\\r\nX14.243 Y65.101\\n\\\r\nX12.828 Y66.515\\n\\\r\nX14.243 Y67.929\\n\\\r\nX12.828 Y69.343\\n\\\r\nX13.889 Y70.404\\n\\\r\nX13.182 Y71.111\\n\\\r\nX13.889 Y71.818\\n\\\r\nX13.182 Y72.525\\n\\\r\nX13.889 Y73.232\\n\\\r\nX13.182 Y73.939\\n\\\r\nX13.889 Y74.646\\n\\\r\nX13.182 Y75.354\\n\\\r\nX13.889 Y76.061\\n\\\r\nX13.182 Y76.768\\n\\\r\nX13.889 Y77.475\\n\\\r\nX13.182 Y78.182\\n\\\r\nX13.889 Y78.889\\n\\\r\nY85\\n\\\r\nX80\\n\\\r\nY84.5\\n\\\r\nX23.889\\n\\\r\nY20.251\\n\\\r\nZ5.5\\n\\\r\nG1 Z16\\n\\\r\nX0 Y0\\n\\ \"\r\n\r\n linesToArray()\r\n\r\n mod.lineCountDisplay.innerHTML = '0'\r\n\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n lineRequest: {\r\n type: 'number',\r\n label: 'line request',\r\n event: function(evt) {\r\n sendLine(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n line: {\r\n type: 'string',\r\n label: 'line',\r\n event: function(str) {\r\n mods.output(mod, 'line', str)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n mod.lineCountDisplay = make_text_display(div, 'current line')\r\n mod.resetCurrentLine = make_button_input(div, 'reset lines')\r\n mod.resetCurrentLine.addEventListener('click', function(){\r\n mod.lineCountDisplay.innerHTML = '0'\r\n currentLine = 0\r\n })\r\n mod.textAreaIn = makeTextArea(div, 'lines', 24, 48)\r\n }\r\n\r\n var currentLine = 0\r\n var linesArray = []\r\n\r\n function linesToArray() {\r\n linesArray = mod.textAreaIn.value.split('\\n')\r\n }\r\n\r\n function sendLine() {\r\n var lineOut = linesArray[currentLine]\r\n currentLine++\r\n if (currentLine > linesArray.length) {\r\n currentLine = linesArray.length\r\n } else {\r\n outputs.line.event(lineOut)\r\n }\r\n\r\n mod.lineCountDisplay.innerHTML = currentLine.toString()\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function makeTextArea(div, name, width, height) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n div.appendChild(document.createElement('br'))\r\n var textArea = document.createElement('textarea')\r\n textArea.setAttribute('cols', width)\r\n textArea.setAttribute('rows', height)\r\n textArea.type = 'textarea'\r\n div.appendChild(textArea)\r\n\r\n return textArea\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"593.4224085291635","left":"623.1192356994413","inputs":{},"outputs":{}},"0.5272929058286329":{"definition":"//\r\n// gets lines of gcode, turns into instructions for mods-machines\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n\r\n/*\r\nstart / stop machine on given path, \r\nmanually turn spindle on / off etc\r\ndishes gcodes -> planner, spindle codes -> spindle \r\n*/\r\n\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'machine controller'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.jogStepSizeIn.value = '10'\r\n mod.jogSpeedIn.value = '100'\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n lineComplete: {\r\n type: 'event',\r\n label: 'line complete',\r\n event: function(evt) {\r\n onLineComplete()\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n singleInstruction: {\r\n type: 'object',\r\n label: 'instruction',\r\n event: function(obj) {\r\n mods.output(mod, 'singleInstruction', obj)\r\n }\r\n },\r\n lineAdvance: {\r\n type: 'event',\r\n label: 'line advance',\r\n event: function() {\r\n mods.output(mod, 'lineAdvance', true)\r\n }\r\n },\r\n sequenceControl: {\r\n type: 'integer',\r\n label: 'sequence control',\r\n event: function(int){\r\n mods.output(mod, 'sequenceControl', int)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n\r\n // control buttons\r\n\r\n mod.jogStepSizeIn = make_text_input(div, 'jog increment size', 24)\r\n mod.jogSpeedIn = make_text_input(div, 'jog speed', 24)\r\n\r\n mod.jogXPButton = make_button_input(div, 'x+')\r\n mod.jogXPButton.addEventListener('click', function(evt) {\r\n jog('X', parseFloat(mod.jogStepSizeIn.value))\r\n })\r\n\r\n mod.jogXMButton = make_button_input(div, 'x-')\r\n mod.jogXMButton.addEventListener('click', function(evt) {\r\n jog('X', -parseFloat(mod.jogStepSizeIn.value))\r\n })\r\n\r\n mod.jogYPButton = make_button_input(div, 'y+')\r\n mod.jogYPButton.addEventListener('click', function(evt) {\r\n jog('Y', parseFloat(mod.jogStepSizeIn.value))\r\n })\r\n\r\n mod.jogYMButton = make_button_input(div, 'y-')\r\n mod.jogYMButton.addEventListener('click', function(evt) {\r\n jog('Y', -parseFloat(mod.jogStepSizeIn.value))\r\n })\r\n\r\n // sequence begin, stop \r\n\r\n mod.startSequenceButton = make_button_input(div, 'start sequence')\r\n mod.startSequenceButton.addEventListener('click', function(evt) {\r\n startSequence(32)\r\n })\r\n\r\n mod.pauseSequenceButton = make_button_input(div, 'pause sequence')\r\n mod.pauseSequenceButton.addEventListener('click', function(evt){\r\n pauseSequence()\r\n })\r\n }\r\n\r\n mod.isPaused = true\r\n\r\n function startSequence(windowsize) {\r\n outputs.sequenceControl.event(0)\r\n for(var i = 0; i < windowsize; i ++){\r\n outputs.lineAdvance.event()\r\n }\r\n mod.isPaused = false\r\n outputs.sequenceControl.event(1)\r\n }\r\n\r\n function pauseSequence(){\r\n outputs.sequenceControl.event(0)\r\n mod.isPaused = true\r\n }\r\n\r\n function onLineComplete() {\r\n if(mod.isPaused){\r\n //\r\n } else {\r\n outputs.lineAdvance.event()\r\n }\r\n }\r\n\r\n function jog(key, val) {\r\n var instruction = {}\r\n instruction.position = {}\r\n instruction.position[key] = val\r\n instruction.speed = mod.jogSpeedIn.value\r\n instruction.type = 'move'\r\n\r\n outputs.singleInstruction.event(instruction)\r\n outputs.sequenceControl.event(1)\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"90.92248708376349","left":"189.16454586981752","inputs":{},"outputs":{}},"0.703922408155101":{"definition":"//\r\n// hardware reset command\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n // globals\r\n var mod = {}\r\n\r\n // name\r\n var name = 'reset'\r\n\r\n var init = function() {\r\n // \r\n }\r\n\r\n var inputs = {\r\n //\r\n }\r\n\r\n var outputs = {\r\n reset: {\r\n type: 'packet',\r\n label: 'headless packet out',\r\n event: function() {\r\n var reset = [128]\r\n mods.output(mod, 'reset', reset)\r\n }\r\n }\r\n }\r\n\r\n var interface = function(div) {\r\n mod.div = div\r\n\r\n mod.resetButton = make_button_input(div, 'send')\r\n mod.resetButton.addEventListener('click', function() {\r\n outputs.reset.event()\r\n })\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"1287.3513686208905","left":"1522.5146163285583","inputs":{},"outputs":{}},"0.026532783100594037":{"definition":"//\r\n// event sniffer\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n // globals\r\n var mod = {}\r\n\r\n // name\r\n var name = 'event logger'\r\n\r\n var init = function() {\r\n mod.identifier.value = 'logger'\r\n }\r\n\r\n var inputs = {\r\n event: {\r\n type: 'any',\r\n event: function(evt) {\r\n console.log(mod.identifier.value, ': ', JSON.parse(JSON.stringify(evt.detail)))\r\n }\r\n }\r\n }\r\n\r\n var outputs = {}\r\n\r\n var interface = function(div) {\r\n mod.div = div\r\n\r\n mod.identifier = make_text_input(div, 'identifier', 8)\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"403.34188935905445","left":"2297.9325702195742","inputs":{},"outputs":{}},"0.4995702688008472":{"definition":"//\n// converts toolpath objects into segments for accel planning\n//\n// Neil Gershenfeld and Jake Read\n// (c) Massachusetts Institute of Technology 2018\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n\n\n/*\neats objects like\nvar move = {\n position: {\n X: float\n Y: float\n Z: float\n A: float\n }\n rate: float\n}\n\noutputs:\nmotors\n'planner block consumed' event\n\n\n*/\n\n//\n// closure\n//\n(function() {\n //\n // module globals\n //\n var mod = {}\n //\n // name\n //\n var name = 'motion planner'\n //\n // initialization\n //\n var init = function() {\n mod.accelIn.value = '500'\n mod.junctionDeviationIn.value = '1'\n mod.minSpeedIn.value = '4'\n\n mod.axisIdentifiers.value = 'X,Y'\n resetNetwork()\n\n mod.netWindowIn.value = '12'\n packetWindowSize = parseInt(mod.netWindowIn.value)\n\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n }\n //\n // inputs\n //\n var inputs = {\n newMove: {\n type: 'object',\n label: 'move instruction',\n event: function(evt) {\n addToQueue(JSON.parse(JSON.stringify(evt.detail)))\n }\n },\n acknowledgement: {\n type: 'event',\n label: 'acknowledgement',\n event: function(evt) {\n onAcknowledgement(evt.detail)\n }\n },\n sequenceControl: {\n type: 'integer',\n label: 'sequence control',\n event: function(evt) {\n if (evt.detail == 1) {\n checkNetwork()\n }\n }\n }\n }\n //\n // outputs\n //\n var outputs = {\n plannedMove: {\n type: 'object',\n label: 'move instruction',\n event: function(block) {\n var deref = JSON.parse(JSON.stringify(block))\n mods.output(mod, 'plannedMove', deref)\n }\n },\n moveComplete: {\n type: 'event',\n label: 'move complete',\n event: function(evt) {\n mods.output(mod, 'moveComplete', 1)\n }\n }\n }\n //\n // interface\n //\n var interface = function(div) {\n mod.div = div\n //\n // inputs\n //\n // settings\n make_text_display(div, 'machine config')\n mod.axisIdentifiers = make_text_input(div, 'axis identifiers', 12)\n mod.axisIdentifiers.addEventListener('change', function() {\n resetNetwork()\n })\n div.appendChild(document.createElement('br'))\n\n make_text_display(div, 'planner settings')\n mod.accelIn = make_text_input(div, 'acceleration, units/s/s', 12)\n mod.junctionDeviationIn = make_text_input(div, 'junction deviation, units', 12)\n mod.minSpeedIn = make_text_input(div, 'minimum speed, units/s', 12)\n div.appendChild(document.createElement('br'))\n\n make_text_display(div, 'queuing settings')\n mod.queueLengthDisplay = make_text_display(div, 'instructions in queue')\n mod.resetQueueButton = make_button_input(div, 'reset queue')\n mod.resetQueueButton.addEventListener('click', function() {\n resetQueue()\n })\n div.appendChild(document.createElement('br'))\n\n mod.netWindowIn = make_text_input(div, 'network window size', 12)\n mod.netWindowIn.addEventListener('change', function() {\n packetWindowSize = parseInt(mod.netWindowIn.value)\n })\n mod.netQueueDisplay = make_text_display(div, 'instructions on network')\n mod.resetNetButton = make_button_input(div, 'reset network')\n mod.resetNetButton.addEventListener('click', function() {\n resetNetwork()\n })\n\n div.appendChild(document.createElement('br'))\n mod.netPositionDisplay = make_text_display(div, 'last position sent to network')\n mod.finalPositionDisplay = make_text_display(div, 'last position received on network')\n\n }\n\n // ---------------------------------------------------- THE BUSINESS\n\n // network state\n var packetWindowSize = 0\n var axisNetCounters = new Array()\n var lastPosToNet = new Array()\n var lastPosFromNet = new Array()\n\n\n function resetNetwork() {\n axisIds = mod.axisIdentifiers.value.split(',')\n for (var i = 0; i < axisIds.length; i++) {\n currentPosition[i] = 0\n axisNetCounters[i] = 0\n lastPosToNet[i] = 0\n lastPosFromNet[i] = 0\n }\n mod.netPositionDisplay.innerHTML = lastPosToNet.toString()\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n mod.finalPositionDisplay.innerHTML = lastPosFromNet.toString()\n }\n\n // IF entry / exit are null, do min speed \n\n function onAcknowledgement(obj) {\n axisNetCounters[obj.axis] --\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n if(obj.type == 'move acknowledgement'){\n //console.log('received pos', obj.increment, obj.axis)\n lastPosFromNet[obj.axis] += obj.increment\n var netRounded = new Array()\n for(var i = 0; i < lastPosFromNet.length; i ++){\n netRounded[i] = Math.round(lastPosFromNet[i] * 100) / 100\n }\n mod.finalPositionDisplay.innerHTML = netRounded.toString()\n }\n checkNetwork()\n }\n\n function checkNetwork() {\n // see windowed state and push more data out if need be\n // TODO here\n var ok = false\n if(axisNetCounters[0] == axisNetCounters[1]){\n ok = true\n }\n /*\n for(var i = 0; i < axisNetCounters.length - 2; i ++){\n if(axisNetCounters[i] == axisNetCounters[i + 1]){\n ok = true\n } else {\n ok = false\n }\n }\n */\n if(ok){\n var opening = packetWindowSize - axisNetCounters[0]\n if(opening > moveQue.length){\n opening = moveQue.length\n }\n for(var i = 0; i < opening; i++){\n //console.log('sending', i)\n sendMove()\n outputs.moveComplete.event()\n }\n }\n }\n\n function sendMove() {\n var lastPos = moveQue[0].p2\n outputs.plannedMove.event(moveQue.shift())\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n mod.netPositionDisplay.innerHTML = lastPos.toString()\n axisNetCounters.forEach(function(element, index){\n axisNetCounters[index] ++\n })\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n }\n\n\n // planner state and moves\n var axisIds = []\n var moveQue = [] // array of moves \n var currentPosition = []\n\n /*\n var segment = {\n p1: p1,\n p2: p2,\n cruise: cruise,\n entry: entry,\n exit: exit,\n }\n */\n\n function resetQueue() {\n moveQue.length = 0 // apparently this works\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n }\n\n function addToQueue(obj) {\n // add to the move queue \n var p1 = []\n var p2 = []\n if (moveQue.length == 0) {\n p1 = currentPosition\n } else {\n p1 = moveQue[moveQue.length - 1].p2\n }\n\n // TODO: abstract axis? ids -> p1, p2\n // find all letter-based and match to std array \n var keyset = new Array(axisIds.length)\n keyset.fill(0)\n\n for (key in obj.position) {\n for (axisId in axisIds) {\n if (key == axisIds[axisId]) {\n p2[axisId] = obj.position[key]\n keyset[axisId] = 1\n } else if (keyset[axisId] != 1) {\n p2[axisId] = p1[axisId]\n } else {\n // nothing\n }\n }\n }\n\n if (cartesianDistance(p1, p2) == 0) {\n // TODO: check for these when move is z- and have only xy actuators?\n console.log('planner throwing zero length vector')\n } else {\n var cruise = obj.speed\n\n var newMove = {\n p1: p1,\n p2: p2,\n cruise: cruise,\n entry: 0,\n exit: 0\n }\n\n // append the move to the queue \n moveQue.push(newMove)\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n\n // and then check to see if we are ready to pass anything to the motors\n runQue()\n }\n }\n\n //\n // local functions\n //\n function runQue() {\n // converting from mm/s or dpi (pixel units) to mm based units\n // https://github.com/grbl/grbl/blob/master/grbl/planner.c\n // https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/\n /*\n first we walk the queue:\n going backwards, end at 0 speed exit\n - find junction speed (junction deviation) between this and previous block\n - this is entry speed, calculate trapezoid to exit speed\n next block\n - exit speed is recently calculated entry speed\n - do junction deviation, this is entry speed\n - calculate trapezoid\n .. why is this simpler? find entry and exit speed of each block,\n find accel limits per axis, do trapezoid with that accel\n */\n\n var jdsize = parseFloat(mod.junctionDeviationIn.value)\n var accel = parseFloat(mod.accelIn.value)\n // TODO: use these\n var minmin = parseFloat(mod.minSpeedIn.value)\n\n moveQue[moveQue.length - 1].exit = minmin // trailing edge always full stop\n\n for (var i = moveQue.length - 1; i > 0; i--) {\n // reverse pass\n // find junction deviation\n /*\n - really, could only do this once per segment when a new one is added\n - unitize entry and exit vectors\n - find cos(theta) = Ventry dot Vexit / (|Ventry| * |Vexit|) -> this is (1*1 bc unit)\n - find sin(theta/2) = sqrt((1-cos(theta))/2)\n - find r = j(sin(theta/2)/(1-sin(theta/2)))\n - find Fj = sqrt(Ac*r)\n - junction speed is min(Fj, min(entry,exit))\n */\n\n var v_entry = unitVector(moveQue[i - 1].p1, moveQue[i - 1].p2)\n var v_exit = unitVector(moveQue[i].p1, moveQue[i].p2)\n //console.log('unit entry, unit exit', toFixedMatrix(v_entry, 3), toFixedMatrix(v_exit, 3))\n // dot product / mag * mag where mags are 1 each bc unit\n var cos_theta = dotProduct(v_entry, v_exit) \n // catch corner cases (get it? - actually they are very straight cases, or very turnaround cases)\n if (cos_theta < -0.9999999999999) {\n cos_theta = -0.9999999999999\n } else if (cos_theta > 0.9999999999999) {\n cos_theta = 0.9999999999999\n }\n //console.log('cos_theta', cos_theta, Math.acos(cos_theta) * (180 / Math.PI))\n // for calculating the radius, below\n var sin_theta_overtwo = Math.sqrt((1 - cos_theta) / 2)\n //console.log('sin_theta_overtwo', sin_theta_overtwo)\n // size of the junction deviation curve\n var radius = jdsize * ((1 - sin_theta_overtwo) / sin_theta_overtwo)\n //console.log('radius', radius)\n // feed at the junction, according to supposed acceleration through the junction radius\n var fj = Math.sqrt(accel * radius)\n //console.log('fj', fj)\n // but don't go through the junction faster than we're cruising\n var feed_junction = Math.min(fj, moveQue[i].cruise, moveQue[i - 1].cruise)\n // and we never travel slower than the min speed \n //feed_junction = Math.max(feed_junction, minmin)\n //console.log('feed_junction', feed_junction)\n\n // ok we have the maximum feed at the preceeding junction\n // now: find the maximum entry speeds as if we spent the whole block decelerating\n\n // size of segment\n var distance = cartesianDistance(moveQue[i].p1, moveQue[i].p2)\n //console.log('distance', distance)\n var max_entry_speed = Math.sqrt(moveQue[i].exit * moveQue[i].exit + 2 * distance * accel)\n //console.log('max_entry_speed', max_entry_speed)\n var entry_speed = Math.min(max_entry_speed, feed_junction)\n max_entry_speed = Math.max(max_entry_speed, minmin)\n //console.log('entry_speed', entry_speed)\n moveQue[i].entry = entry_speed\n moveQue[i - 1].exit = entry_speed\n //console.log('segment:', moveQue[i])\n moveQue[i].accel = accel\n moveQue[i].distance = distance\n }\n\n // bad bad not very good implementation to start:\n //moveQue[0].entry = 0\n moveQue[0].accel = accel\n moveQue[0].distance = cartesianDistance(moveQue[0].p1, moveQue[0].p2)\n\n // forward pass to make sure we can accelerate to set exit speed in length\n for (var i = 0; i < moveQue.length - 1; i++) {\n var distance = moveQue[i].distance\n var max_exit_speed = Math.sqrt(moveQue[i].entry * moveQue[i].entry + 2 * distance * accel)\n max_exit_speed = Math.max(max_exit_speed, minmin)\n if (max_exit_speed < moveQue[i + 1].entry_speed) {\n moveQue[i + 1].entry = max_exit_speed\n moveQue[i].exit = max_exit_speed\n }\n if(moveQue[i].entry < minmin){\n moveQue[i].entry = minmin\n }\n if(moveQue[i].exit < minmin){\n moveQue[i].exit = minmin\n }\n if(moveQue[i].entry == null){\n console.log('null entry', moveQue[i])\n moveQue[i].entry = minmin\n }\n if(moveQue[i].exit == null){\n console.log('null exit', moveQue[i])\n moveQue[i].exit = minmin\n }\n }\n }\n\n // ---------------------------------------------------- UTILITIES\n\n function cartesianDistance(p1, p2) {\n // takes p1, p2 to be arrays of same length\n // computes cartesian distance\n var sum = 0\n for (var i = 0; i < p1.length; i++) {\n sum += Math.pow((p1[i] - p2[i]), 2)\n }\n return Math.sqrt(sum)\n }\n\n function cartesianLength(v) {\n // length of vector\n var sum = 0\n for (var i = 0; i < v.length; i++) {\n sum += Math.pow(v[i], 2)\n }\n return Math.sqrt(sum)\n }\n\n function addMatrix(a, b, c) {\n // c = a + b\n a.forEach(function(item, index) {\n c[index] = b[index] + a[index]\n })\n }\n\n function subtractMatrix(a, b, c) {\n // c = a - b\n b.forEach(function(item, index) {\n c[index] = a[index] - b[index]\n })\n }\n\n function multiplyMatrix(a, scalar, b) {\n // b = a * scalar\n a.forEach(function(item, index) {\n b[index] = a[index] * scalar\n })\n }\n\n function multiply2dMatrix(a, scalar, b) {\n // b = a * scalar\n for (var i = 0; i < a.length; i++) {\n for (var j = 0; j < a[i].length; j++) {\n b[i][j] = a[i][j] * scalar;\n }\n }\n }\n\n function divideMatrix(a, scalar, b) {\n // b = a / scalar\n for (var i = 0; i < a.length; i++) {\n b[i] = a[i] / scalar\n }\n }\n\n function unitVector(p1, p2) {\n // returns new array, is unit vector of p2-p1\n var unit = new Array()\n subtractMatrix(p2, p1, unit)\n var length = cartesianLength(unit)\n divideMatrix(unit, length, unit)\n\n return unit\n }\n\n function dotProduct(a, b) {\n // returns a dot b\n var sum = 0;\n for (var i = 0; i < a.length; i++) {\n sum += a[i] * b[i]\n }\n\n return sum\n }\n\n function toFixedMatrix(a, digits) {\n var rounded = new Array()\n for (var i = 0; i < a.length; i++) {\n rounded[i] = a[i].toFixed(digits)\n }\n\n return rounded\n }\n\n // ---------------------------------------------------- UI HELP\n\n function make_text_input(div, name, size) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(name + ': '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = size\n div.appendChild(input)\n\n return input\n }\n\n function make_button_input(div, text) {\n div.appendChild(document.createElement('br'))\n var button = document.createElement('button')\n button.style.padding = mods.ui.padding\n button.style.margin = 1\n button.appendChild(document.createTextNode(text))\n div.appendChild(button)\n\n return button\n }\n\n function make_checkbox_input(div, prefix) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(prefix + ': '))\n var checkbox = document.createElement('input')\n checkbox.type = 'checkbox'\n div.appendChild(checkbox)\n\n return checkbox\n }\n\n function make_text_display(div, prefix) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(prefix + ': '))\n var span = document.createElement('span')\n span.innerHTML = ''\n div.appendChild(span)\n\n return span\n }\n\n //\n // return values\n //\n return ({\n mod: mod,\n name: name,\n init: init,\n inputs: inputs,\n outputs: outputs,\n interface: interface\n })\n}())","top":"448.7851529938143","left":"1572.7986061844774","inputs":{},"outputs":{}}},"links":["{\"source\":\"{\\\"id\\\":\\\"0.46397689809504195\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packet\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6719905562745752\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetOne\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.6719905562745752\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packetOne\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.46397689809504195\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"ack\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8045719666145382\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"line\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.8759207754144251\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"gcode\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.5272929058286329\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"lineAdvance\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.8045719666145382\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"lineRequest\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.703922408155101\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"reset\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6719905562745752\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetOne\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8759207754144251\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"instruction\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"newMove\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.5272929058286329\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"singleInstruction\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"newMove\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.46397689809504195\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.6070416201560498\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.5272929058286329\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"sequenceControl\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"sequenceControl\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"plannedMove\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.46397689809504195\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"block\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"plannedMove\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6070416201560498\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"block\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.4995702688008472\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"moveComplete\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.5272929058286329\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"lineComplete\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.6070416201560498\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packet\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6719905562745752\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetTwo\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.6719905562745752\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packetTwo\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6070416201560498\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"ack\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.703922408155101\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"reset\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6719905562745752\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetTwo\\\"}\"}"]} \ No newline at end of file diff --git a/tinymachine-planning b/tinymachine-planning deleted file mode 100644 index a3e4299..0000000 --- a/tinymachine-planning +++ /dev/null @@ -1 +0,0 @@ -{"modules":{"0.8432772280795903":{"definition":"//\r\n// converts toolpath objects into segments for accel planning\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n//\r\n// This work may be reproduced, modified, distributed, performed, and\r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is\r\n// provided as is; no warranty is provided, and users accept all\r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'stepper'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.stepper_axis_num_in.value = '0'\r\n mod.axis_num = 0\r\n mod.steps_per_mm_in.value = '80'\r\n mod.convert = 80\r\n mod.block = {\r\n accel: 50,\r\n cruise: 120,\r\n entry: 0,\r\n exit: 30,\r\n p1: [0, 0, 0],\r\n p2: [10, 10, 10]\r\n }\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n block: {\r\n type: 'object',\r\n label: 'block',\r\n event: function(evt) {\r\n mod.block = JSON.parse(JSON.stringify(evt.detail)) // dereference pls\r\n shipIt()\r\n }\r\n },\r\n ack: {\r\n type: 'packet',\r\n label: 'headless packet in',\r\n event: function(evt) {\r\n onAcknowledgement(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n acknowledgement: {\r\n type: 'object',\r\n label: 'acknowledgement',\r\n event: function(obj) {\r\n mods.output(mod, 'acknowledgement', obj)\r\n }\r\n },\r\n packet: {\r\n type: 'packet',\r\n label: 'headless packet out',\r\n event: function() {\r\n //mods.output(mod, 'segments', null)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n // settings\r\n // the axis to pull out of the block - index of posistions on p1, p2\r\n mod.stepper_axis_num_in = make_text_input(div, 'axis index', 12)\r\n mod.stepper_axis_num_in.addEventListener('change', function() {\r\n mod.axis_num = parseInt(mod.stepper_axis_num_in.value)\r\n })\r\n // steps per mm\r\n mod.steps_per_mm_in = make_text_input(div, 'steps per mm', 12)\r\n mod.steps_per_mm_in.addEventListener('change', function() {\r\n mod.covert = parseFloat(mod.steps_per_mm_in.value)\r\n })\r\n // reverse?\r\n mod.reverseCheck = make_checkbox_input(div, 'reversed')\r\n //\r\n // request to do the business\r\n //\r\n mod.send_button = make_button_input(div, 'send')\r\n mod.send_button.addEventListener('click', function() {\r\n shipIt()\r\n })\r\n }\r\n\r\n function cartesianDistance(p1, p2) {\r\n // takes p1, p2 to be arrays of same length\r\n // computes cartesian distance\r\n var sum = 0\r\n for (var i = 0; i < p1.length; i++) {\r\n sum += Math.pow((p1[i] - p2[i]), 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function cartesianLength(v) {\r\n // length of vector\r\n var sum = 0\r\n for (var i = 0; i < v.length; i++) {\r\n sum += Math.pow(v[i], 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function addMatrix(a, b, c) {\r\n // c = a + b\r\n a.forEach(function(item, index) {\r\n c[index] = b[index] + a[index]\r\n })\r\n }\r\n\r\n function subtractMatrix(a, b, c) {\r\n // c = a - b\r\n b.forEach(function(item, index) {\r\n c[index] = a[index] - b[index]\r\n })\r\n }\r\n\r\n function multiplyMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n a.forEach(function(item, index) {\r\n b[index] = a[index] * scalar\r\n })\r\n }\r\n\r\n function multiply2dMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n for (var i = 0; i < a.length; i++) {\r\n for (var j = 0; j < a[i].length; j++) {\r\n b[i][j] = a[i][j] * scalar;\r\n }\r\n }\r\n }\r\n\r\n function divideMatrix(a, scalar, b) {\r\n // b = a / scalar\r\n for (var i = 0; i < a.length; i++) {\r\n b[i] = a[i] / scalar\r\n }\r\n }\r\n\r\n function unitVector(p1, p2) {\r\n // returns new array, is unit vector of p2-p1\r\n var unit = new Array()\r\n subtractMatrix(p2, p1, unit)\r\n var length = cartesianLength(unit)\r\n divideMatrix(unit, length, unit)\r\n\r\n return unit\r\n }\r\n\r\n function dotProduct(a, b) {\r\n // returns a dot b\r\n var sum = 0;\r\n for (var i = 0; i < a.length; i++) {\r\n sum += a[i] * b[i]\r\n }\r\n\r\n return sum\r\n }\r\n\r\n function toFixedMatrix(a, digits) {\r\n var rounded = new Array()\r\n for (var i = 0; i < a.length; i++) {\r\n rounded[i] = a[i].toFixed(digits)\r\n }\r\n\r\n return rounded\r\n }\r\n\r\n /*\r\n now:\r\n\r\n start from segment and find a corner\r\n do planner\r\n\r\n */\r\n\r\n //\r\n // local functions\r\n //\r\n\r\n function onAcknowledgement(packet){\r\n if(packet[0] == 132){\r\n // wait move\r\n var ack = {}\r\n ack.axis = mod.axis_num\r\n ack.type = 'wait acknowledgement'\r\n outputs.acknowledgement.event(ack)\r\n } else if (packet[0] == 131){\r\n var ack = {}\r\n ack.axis = mod.axis_num \r\n ack.type = 'move acknowledgement'\r\n var steps = unpack32(packet, 1)\r\n ack.increment = steps / mod.convert\r\n outputs.acknowledgement.event(ack)\r\n } else {\r\n console.log('nonrecognized ack to stepper')\r\n }\r\n // check if was wait / was move, send response accordingly \r\n }\r\n\r\n function shipIt() {\r\n // sends integer values, I think we maintain positioning because we round before subtracting\r\n\r\n var trapezoid = calculateTrapezoid(mod.axis_num)\r\n if (trapezoid.length == 0) {\r\n var ok = 0\r\n var i = 0\r\n var waitTrap\r\n while (!ok && i < mod.block.p1.length) {\r\n waitTrap = calculateTrapezoid(i)\r\n if (waitTrap.delta != 0) {\r\n ok = 1\r\n } else {\r\n i++\r\n }\r\n }\r\n if (ok) {\r\n sendWait(waitTrap)\r\n } else {\r\n console.log('step zero packet, but no axis of nonzero length found', JSON.parse(JSON.stringify(mod.block)))\r\n }\r\n } else {\r\n sendTrapezoid(trapezoid)\r\n }\r\n }\r\n\r\n function calculateTrapezoid(axis) {\r\n // packet (per stepper block)\r\n // steps, entry, accel, accelLength, deccelLength\r\n // first we fill this with all of the info we'll use to calculated\r\n // the trapezoid in planner-space units, then we convert to steps last\r\n var trap = {}\r\n\r\n // lengths and positions for the move\r\n trap.x1 = mod.block.p1[axis]\r\n trap.x2 = mod.block.p2[axis]\r\n trap.delta = trap.x2 - trap.x1\r\n trap.length = Math.abs(trap.delta)\r\n\r\n // rates for the move\r\n var unit = unitVector(mod.block.p1, mod.block.p2)\r\n var relativeRate = Math.abs(unit[axis])\r\n trap.entry = mod.block.entry * relativeRate\r\n trap.accel = mod.block.accel * relativeRate\r\n trap.cruise = mod.block.cruise * relativeRate\r\n trap.exit = mod.block.exit * relativeRate\r\n\r\n // now accelLength and deccelLength\r\n // using the maximum deltaV for the move,\r\n // we'll figure out what type of move we have\r\n var maxExit = Math.sqrt(trap.entry * trap.entry + 2 * trap.accel * trap.length)\r\n var maxEntry = Math.sqrt(trap.exit * trap.entry + 2 * trap.accel * trap.length)\r\n\r\n // there are 7 possible profiles\r\n if (trap.length <= 0) {\r\n // console.log('zero length trap')\r\n } else if (maxExit <= trap.exit) {\r\n // full ramp-up: have to push iiit to get there\r\n //console.log('full rampup')\r\n trap.ramptype = 'rampup'\r\n trap.accelLength = trap.length\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // for the wait function\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (maxEntry <= trap.entry) {\r\n // full ramp-down: have to deccel all the way with this rate\r\n //console.log('full rampdown')\r\n trap.ramptype = 'rampdown'\r\n trap.deccelLength = 0 // start immmeeeeediately\r\n trap.accelLength = 0 // never accel\r\n // for the wait\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (trap.cruise == trap.entry && trap.cruise == trap.exit) {\r\n // str8 relaxin, no maxin\r\n //console.log('full cruise')\r\n trap.ramptype = 'cruise'\r\n trap.accelLength = 0 // never accel\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // wait\r\n trap.vAvg = trap.cruise\r\n } else if (trap.cruise == trap.entry) {\r\n // cruise, then deccel\r\n //console.log('cruise then deccel')\r\n // for how long do we have to decel? we have to have deltaV for\r\n trap.ramptype = 'cruiseDeccel'\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n trap.deccelLength = trap.length - deccelDistance\r\n trap.accelLength = 0; // never accel\r\n // we really want speed by multiple times, and total distance we know, for vAvg\r\n var tSum = (trap.cruise - trap.exit) / trap.accel + trap.deccelLength / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else if (trap.cruise == trap.exit) {\r\n // accel, cruise? unless entry also cruise?\r\n //console.log('accel then cruise')\r\n trap.ramptype = 'cruiseAccel'\r\n trap.accelLength = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.deccelLength = trap.length + 1; // and never deccel\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.delta - trap.accellength) / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n // it's either a full trap, or a triangle\r\n var accelDistance = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n if ((accelDistance + deccelDistance) < trap.length) {\r\n //console.log('full trap')\r\n trap.ramptype = 'fullTrap'\r\n trap.accelLength = accelDistance\r\n trap.deccelLength = trap.length - deccelDistance\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.deccelLength - trap.accellength) / trap.cruise + (trap.cruise - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n //console.log('triangle')\r\n trap.ramptype = 'triangle'\r\n // find intersection point\r\n var vPeak = Math.sqrt((2 * trap.accel * trap.length + Math.pow(trap.entry, 2) + Math.pow(trap.exit, 2)) / 2)\r\n //console.log('entry, peak, exit', trap.entry, vPeak, trap.exit)\r\n var midPoint = (vPeak * vPeak - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.accelLength = midPoint\r\n trap.deccelLength = midPoint\r\n var tSum = (vPeak - trap.entry) / trap.accel + (vPeak - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n }\r\n }\r\n\r\n return trap\r\n }\r\n\r\n function sendTrapezoid(trap) {\r\n //console.log('trapezoid', trapezoid)\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n\r\n var packet = new Array();\r\n // first, the packet header: the route, ptr and end_addr delimiter\r\n // #define APA_END_ROUTE_DELIMITER 255\r\n // #define APA_ROUTE_POINTER 254\r\n // #define DELIM_KEY_TRAPEZOID 131 // is 32 bit int\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(131)\r\n // now we pack these values into UART-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n var steps;\r\n if(mod.reverseCheck.checked){\r\n steps = -stepwiseTrap.steps\r\n } else {\r\n steps = stepwiseTrap.steps\r\n }\r\n packet = packet.concat(pack32(steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // log this if you wish\r\n //console.log('packet from stepper', packet)\r\n // send it along!\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function sendWait(trap) {\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n var packet = new Array();\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(132)\r\n // now we pack these values into C-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n packet = packet.concat(pack32(stepwiseTrap.steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // send it along!\r\n //console.log('wait packet', packet)\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function trapezoidToStepwise(trap) {\r\n var stepwise = {}\r\n // planner units -> steps\r\n stepwise.steps = Math.round(trap.delta * mod.convert)\r\n // planner units -> steps/min (for less integer error)\r\n stepwise.entry = Math.round(trap.entry * mod.convert)\r\n // planner units -> steps/min/s (a messed up unit, I know)\r\n stepwise.accel = Math.round(trap.accel * mod.convert)\r\n // planner units -> steps\r\n stepwise.accelLength = Math.round(trap.accelLength * mod.convert)\r\n stepwise.deccelLength = Math.round(trap.deccelLength * mod.convert)\r\n\r\n return stepwise\r\n }\r\n\r\n function trapezoidToStepWait(trap) {\r\n var stepWait = {}\r\n // planner units -> steps\r\n stepWait.steps = Math.round(trap.length * mod.convert)\r\n //\r\n stepWait.vAvg = Math.round(trap.vAvg * mod.convert)\r\n if(isNaN(stepWait.vAvg)){\r\n console.log('err on vAvg maths in stepper')\r\n stepWait.vAvg = 1000\r\n }\r\n\r\n return stepWait\r\n }\r\n\r\n function pack32(val) {\r\n var pack = new Array();\r\n pack[0] = (val >> 24) & 255;\r\n pack[1] = (val >> 16) & 255;\r\n pack[2] = (val >> 8) & 255;\r\n pack[3] = val & 255;\r\n\r\n return pack;\r\n }\r\n\r\n function unpack32(array, start){\r\n var unpack = array[start] << 24 | array[start + 1] << 16 | array[start + 2] << 8 | array[start + 3]\r\n return unpack\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"849.9366130389072","left":"1591.0182750754745","inputs":{},"outputs":{}},"0.550468040422489":{"definition":"//\r\n// converts toolpath objects into segments for accel planning\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n//\r\n// This work may be reproduced, modified, distributed, performed, and\r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is\r\n// provided as is; no warranty is provided, and users accept all\r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'atk network bridge'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.address.value = '127.0.0.1'\r\n mod.port.value = 6789\r\n mod.socket = null\r\n socket_open()\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n packetOne: {\r\n type: 'packet',\r\n label: '1 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(0, headlessPacket)\r\n }\r\n },\r\n packetTwo: {\r\n type: 'packet',\r\n label: '2 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(1, headlessPacket)\r\n }\r\n },\r\n packetThree: {\r\n type: 'packet',\r\n label: '3 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(2, headlessPacket)\r\n }\r\n },\r\n packetFour: {\r\n type: 'packet',\r\n label: '4 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(3, headlessPacket)\r\n }\r\n },\r\n packetFive: {\r\n type: 'packet',\r\n label: '5 packet payload',\r\n event: function(evt) {\r\n var headlessPacket = JSON.parse(JSON.stringify(evt.detail))\r\n packetOutput(4, headlessPacket)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n packetOne: {\r\n type: 'packet',\r\n label: '1 packet payload',\r\n event: function(evt) {\r\n // fires elswhere with mods.output(mod, 'packetOne', data)\r\n }\r\n },\r\n packetTwo: {\r\n type: 'packet',\r\n label: '2 packet payload'\r\n },\r\n packetThree: {\r\n type: 'packet',\r\n label: '3 packet payload'\r\n },\r\n packetFour: {\r\n type: 'packet',\r\n label: '4 packet payload'\r\n },\r\n packetFive: {\r\n type: 'packet',\r\n label: '5 packet payload'\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n mod.netpath_in = new Array() // of UI\r\n mod.netpath = new Array() // of paths\r\n // settings\r\n // the network paths to the thing\r\n for (var i = 0; i < 5; i++) {\r\n add_netpath(div)\r\n }\r\n\r\n div.appendChild(document.createElement('br'))\r\n\r\n var a = document.createElement('a')\r\n a.href = './js/serialserver.js'\r\n a.innerHTML = 'serialserver:'\r\n a.target = '_blank'\r\n div.appendChild(a)\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // open/close\r\n //\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('open'))\r\n btn.addEventListener('click', function() {\r\n socket_open()\r\n })\r\n div.appendChild(btn)\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.addEventListener('click', function() {\r\n socket_close()\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // address\r\n //\r\n div.appendChild(document.createTextNode('address: '))\r\n input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.address = input\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // port\r\n //\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0port: '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.port = input\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // status\r\n //\r\n div.appendChild(document.createTextNode('\\u00a0\\u00a0status: '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = 10\r\n div.appendChild(input)\r\n mod.status = input\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // serial\r\n //\r\n div.appendChild(document.createTextNode('serial device:'))\r\n div.appendChild(document.createElement('br'))\r\n //\r\n // open/close\r\n //\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('open'))\r\n btn.addEventListener('click', function() {\r\n serial_open()\r\n })\r\n div.appendChild(btn)\r\n var btn = document.createElement('button')\r\n btn.style.margin = 1\r\n btn.appendChild(document.createTextNode('close'))\r\n btn.addEventListener('click', function() {\r\n serial_close()\r\n })\r\n div.appendChild(btn)\r\n div.appendChild(document.createElement('br'))\r\n }\r\n\r\n function add_netpath(div) {\r\n var numCurrentPaths = mod.netpath.length;\r\n mod.netpath_in[numCurrentPaths] = make_text_input(div, (numCurrentPaths + 1).toString() + ' network path', 12)\r\n mod.netpath_in[numCurrentPaths].addEventListener('change', function() {\r\n mod.netpath[numCurrentPaths] = mod.netpath_in[numCurrentPaths].value.split(',')\r\n if (mod.netpath[numCurrentPaths] == '') {\r\n mod.netpath[0] = []\r\n console.log('zero length address')\r\n } else {\r\n for (var i = 0; i < mod.netpath[numCurrentPaths].length; i++) {\r\n mod.netpath[numCurrentPaths][i] = parseInt(mod.netpath[numCurrentPaths][i])\r\n }\r\n console.log('new address', mod.netpath)\r\n }\r\n })\r\n mod.netpath_in[numCurrentPaths].value = '0,' + numCurrentPaths.toString()\r\n mod.netpath[numCurrentPaths] = [0, numCurrentPaths]\r\n }\r\n\r\n function packetOutput(index, headlessPacket) {\r\n // add ptr and delimiter (unshifting, so reverse order)\r\n headlessPacket.unshift(255) //end addr delimiter\r\n headlessPacket.unshift(254) //ptr\r\n // add path descending thru\r\n for (var i = mod.netpath[index].length - 1; i >= 0; i--) {\r\n headlessPacket.unshift(mod.netpath[index][i])\r\n }\r\n // add length\r\n headlessPacket.unshift(headlessPacket.length + 1)\r\n // log it\r\n // console.log('packet from demux', headlessPacket)\r\n // put it on the serial\r\n var wsMessage = {\r\n type: 'packet',\r\n packet: JSON.parse(JSON.stringify(headlessPacket))\r\n }\r\n socket_send(JSON.stringify(wsMessage))\r\n }\r\n\r\n function packetInput(packet) {\r\n // shift pointer\r\n shiftPacketPointer(packet)\r\n // find address in packet, address has been flipped\r\n // assuming this is a terminal packet, i.e. we are the recipient,\r\n // cut \r\n var returnPacketHeader = packet.slice(2, packet.indexOf(255))\r\n // and then flip the header\r\n var packetHeader = new Array()\r\n for (var i = 0; i < returnPacketHeader.length; i++) {\r\n packetHeader[i] = returnPacketHeader[returnPacketHeader.length - i - 1]\r\n }\r\n var indexMatch = null\r\n // match to addresses mod.netpath[i]\r\n for (var i = 0; i < mod.netpath.length; i++) {\r\n if (packetHeader.length === mod.netpath[i].length) {\r\n if (packetHeader.toString() === mod.netpath[i].toString()) {\r\n // just takes 1st match\r\n // actually, we are receiving ack'd packets, w/ reversed headers\r\n\r\n indexMatch = i\r\n }\r\n }\r\n }\r\n // is match?\r\n if (indexMatch != null) {\r\n // console.log('match on ', indexMatch)\r\n // dereference header\r\n var headlessPacket = packet.slice(packetHeader.length + 3, packet.length)\r\n // console.log('headless', headlessPacket)\r\n // send on port\r\n // big messy nasty no thank you\r\n switch (indexMatch) {\r\n case 0:\r\n mods.output(mod, 'packetOne', headlessPacket)\r\n break\r\n case 1:\r\n mods.output(mod, 'packetTwo', headlessPacket)\r\n break\r\n case 2:\r\n mods.output(mod, 'packetThree', headlessPacket)\r\n break\r\n case 3:\r\n mods.output(mod, 'packetFour', headlessPacket)\r\n break\r\n case 4:\r\n mods.output(mod, 'packetFive', headlessPacket)\r\n break\r\n }\r\n } else {\r\n console.log('no match on returned packet')\r\n }\r\n }\r\n\r\n function shiftPacketPointer(array) {\r\n // find end of packet header\r\n var end = 0\r\n var i = 0\r\n while (end == 0) {\r\n if (array[i] === 255) {\r\n end = i\r\n } else if (i >= array.length) {\r\n break\r\n }\r\n i++\r\n }\r\n // we'll assume we're the last drop, put the pointer at the head\r\n array[1] = 254\r\n // and then shift the address bytes forward\r\n for (var j = 2; j < end - 1; j++) {\r\n array[j] = array[j + 1]\r\n }\r\n array[end-1] = 0 // incoming port\r\n }\r\n\r\n var thisPacket = new Array() // we sometimes receive incomplete packets, have to track and parse\r\n //\r\n function socket_open() {\r\n var url = \"ws://\" + mod.address.value + ':' + mod.port.value\r\n mod.socket = new WebSocket(url)\r\n mod.socket.onopen = function(event) {\r\n mod.status.value = \"socket opened\"\r\n serial_open()\r\n }\r\n mod.socket.onerror = function(event) {\r\n mod.status.value = \"can not open\"\r\n mod.socket = null\r\n }\r\n mod.socket.onmessage = function(event) {\r\n var wsMessage = JSON.parse(event.data)\r\n if (wsMessage.type === 'message') {\r\n mod.status.value = wsMessage.message\r\n } else if (wsMessage.type === 'array') {\r\n // we are the 0th port, \r\n thisPacket = thisPacket.concat(wsMessage.array)\r\n\r\n if (thisPacket[0] <= 0) {\r\n thisPacket = []\r\n console.log('throwing packet with leading zero')\r\n }\r\n\r\n while (thisPacket.length >= thisPacket[0]) {\r\n if (thisPacket.length == thisPacket[0]) {\r\n //console.log('one packet', thisPacket)\r\n packetInput(JSON.parse(JSON.stringify(thisPacket)))\r\n thisPacket = []\r\n } else {\r\n var fullPacket = thisPacket.slice(0, thisPacket[0])\r\n packetInput(JSON.parse(JSON.stringify(fullPacket)))\r\n //console.log('second packet', fullPacket)\r\n thisPacket = thisPacket.slice(thisPacket[0])\r\n }\r\n }\r\n\r\n } else {\r\n mod.status.value = 'message not recognized'\r\n }\r\n }\r\n }\r\n\r\n function socket_close() {\r\n mod.socket.close()\r\n mod.status.value = \"socket closed\"\r\n mod.socket = null\r\n }\r\n\r\n function socket_send(msg) {\r\n if (mod.socket != null) {\r\n mod.status.value = \"send\"\r\n mod.socket.send(msg)\r\n } else {\r\n mod.status.value = \"can't send, not open\"\r\n }\r\n }\r\n\r\n function serial_open() {\r\n if (mod.socket == null) {\r\n mod.status.value = \"socket not open\"\r\n } else {\r\n var msg = {}\r\n msg.type = 'open'\r\n mod.socket.send(JSON.stringify(msg))\r\n }\r\n }\r\n\r\n function serial_close() {\r\n if (mod.socket == null) {\r\n mod.status.value = \"socket not open\"\r\n } else {\r\n var msg = {}\r\n msg.type = 'close'\r\n msg.device = mod.device.value\r\n mod.socket.send(JSON.stringify(msg))\r\n }\r\n }\r\n\r\n function serial_send(wsMessage) {\r\n if (mod.socket == null) {\r\n mod.status.value = \"socket not open\"\r\n } else {\r\n mod.socket.send(JSON.stringify(wsMessage))\r\n mod.status.value = 'transmit'\r\n }\r\n }\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"1412.758938011284","left":"1588.9731579134627","inputs":{},"outputs":{}},"0.6064355364731827":{"definition":"//\r\n// generic line input\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'text lines input'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.textAreaIn.value =\r\n \" G1 X0 Y0 F1400\\n\\\r\nZ16\\n\\\r\nZ5.5\\n\\\r\nG1 Z0.5\\n\\\r\nX100\\n\\\r\nY100\\n\\\r\nX3.536\\n\\\r\nY30\\n\\\r\nX7.071 Y26.465\\n\\\r\nX0 Y19.393\\n\\\r\nX7.071 Y12.322\\n\\\r\nX0 Y5.251\\n\\\r\nX95\\n\\\r\nY95\\n\\\r\nX8.536\\n\\\r\nY90\\n\\\r\nX90\\n\\\r\nY10.251\\n\\\r\nX13.535\\n\\\r\nY50.251\\n\\\r\nX14.243 Y50.958\\n\\\r\nX12.828 Y52.373\\n\\\r\nX14.243 Y53.787\\n\\\r\nX12.828 Y55.201\\n\\\r\nX14.243 Y56.615\\n\\\r\nX12.828 Y58.029\\n\\\r\nX14.243 Y59.444\\n\\\r\nX12.828 Y60.858\\n\\\r\nX14.243 Y62.272\\n\\\r\nX12.828 Y63.686\\n\\\r\nX14.243 Y65.101\\n\\\r\nX12.828 Y66.515\\n\\\r\nX14.243 Y67.929\\n\\\r\nX12.828 Y69.343\\n\\\r\nX13.889 Y70.404\\n\\\r\nX13.182 Y71.111\\n\\\r\nX13.889 Y71.818\\n\\\r\nX13.182 Y72.525\\n\\\r\nX13.889 Y73.232\\n\\\r\nX13.182 Y73.939\\n\\\r\nX13.889 Y74.646\\n\\\r\nX13.182 Y75.354\\n\\\r\nX13.889 Y76.061\\n\\\r\nX13.182 Y76.768\\n\\\r\nX13.889 Y77.475\\n\\\r\nX13.182 Y78.182\\n\\\r\nX13.889 Y78.889\\n\\\r\nX14.243 Y50.958\\n\\\r\nX12.828 Y52.373\\n\\\r\nX14.243 Y53.787\\n\\\r\nX12.828 Y55.201\\n\\\r\nX14.243 Y56.615\\n\\\r\nX12.828 Y58.029\\n\\\r\nX14.243 Y59.444\\n\\\r\nX12.828 Y60.858\\n\\\r\nX14.243 Y62.272\\n\\\r\nX12.828 Y63.686\\n\\\r\nX14.243 Y65.101\\n\\\r\nX12.828 Y66.515\\n\\\r\nX14.243 Y67.929\\n\\\r\nX12.828 Y69.343\\n\\\r\nX13.889 Y70.404\\n\\\r\nX13.182 Y71.111\\n\\\r\nX13.889 Y71.818\\n\\\r\nX13.182 Y72.525\\n\\\r\nX13.889 Y73.232\\n\\\r\nX13.182 Y73.939\\n\\\r\nX13.889 Y74.646\\n\\\r\nX13.182 Y75.354\\n\\\r\nX13.889 Y76.061\\n\\\r\nX13.182 Y76.768\\n\\\r\nX13.889 Y77.475\\n\\\r\nX13.182 Y78.182\\n\\\r\nX13.889 Y78.889\\n\\\r\nY85\\n\\\r\nX80\\n\\\r\nY84.5\\n\\\r\nX23.889\\n\\\r\nY20.251\\n\\\r\nZ5.5\\n\\\r\nG1 Z16\\n\\\r\nX0 Y0\\n\\ \"\r\n\r\n linesToArray()\r\n\r\n mod.lineCountDisplay.innerHTML = '0'\r\n\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n lineRequest: {\r\n type: 'number',\r\n label: 'line request',\r\n event: function(evt) {\r\n sendLine(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n line: {\r\n type: 'string',\r\n label: 'line',\r\n event: function(str) {\r\n mods.output(mod, 'line', str)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n mod.lineCountDisplay = make_text_display(div, 'current line')\r\n mod.resetCurrentLine = make_button_input(div, 'reset lines')\r\n mod.resetCurrentLine.addEventListener('click', function(){\r\n mod.lineCountDisplay.innerHTML = '0'\r\n currentLine = 0\r\n })\r\n mod.textAreaIn = makeTextArea(div, 'lines', 24, 48)\r\n }\r\n\r\n var currentLine = 0\r\n var linesArray = []\r\n\r\n function linesToArray() {\r\n linesArray = mod.textAreaIn.value.split('\\n')\r\n }\r\n\r\n function sendLine() {\r\n var lineOut = linesArray[currentLine]\r\n currentLine++\r\n if (currentLine > linesArray.length) {\r\n currentLine = linesArray.length\r\n } else {\r\n outputs.line.event(lineOut)\r\n }\r\n\r\n mod.lineCountDisplay.innerHTML = currentLine.toString()\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function makeTextArea(div, name, width, height) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n div.appendChild(document.createElement('br'))\r\n var textArea = document.createElement('textarea')\r\n textArea.setAttribute('cols', width)\r\n textArea.setAttribute('rows', height)\r\n textArea.type = 'textarea'\r\n div.appendChild(textArea)\r\n\r\n return textArea\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"669.4030968760659","left":"803.1033266421398","inputs":{},"outputs":{}},"0.6459714071906415":{"definition":"//\r\n// gets lines of gcode, turns into instructions for mods-machines\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n\r\n/*\r\nturns lines of text into objects for machine controller \r\n*/\r\n\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'gcode parser'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.g0SpeedIn.value = '100'\r\n mod.g1SpeedIn.value = '400'\r\n mod.codeMode.value = 'G0'\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n gcode: {\r\n type: 'string',\r\n label: 'gcode',\r\n event: function(evt) {\r\n parseGCode(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n instruction: {\r\n type: 'object',\r\n label: 'instruction',\r\n event: function(obj) {\r\n mods.output(mod, 'instruction', obj)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n // we're going to convert all of these DPIs to MMs because we live in the real world now\r\n mod.g0SpeedIn = make_text_input(div, 'G0 speed, gcode units', 12)\r\n mod.g1SpeedIn = make_text_input(div, 'G1 speed, gcode units', 12)\r\n mod.codeMode = make_text_input(div, 'Modality', 12)\r\n }\r\n\r\n function parseGCode(str) {\r\n // get letter-value pairs\r\n var keyvals = getKeyValues(str)\r\n // do modality\r\n // check this for no-g moves?\r\n if (keyvals.G == 0 | keyvals.G == 1) {\r\n mod.codeMode.value = 'G' + keyvals.G.toString()\r\n } else if (keyvals.M != null) {\r\n mod.codeMode.value = 'M' + keyvals.M.toString()\r\n }\r\n // do parse and object \r\n if (mod.codeMode.value == 'G0' | mod.codeMode.value == 'G1') {\r\n\r\n var output = {\r\n type: 'move',\r\n position: {},\r\n speed: 0\r\n }\r\n // loop to find position vals, check for feed update\r\n for (key in keyvals) {\r\n if (key.match('[A-CX-Z]')) {\r\n output.position[key] = keyvals[key]\r\n } else if (key.match('[F]')){\r\n if(mod.codeMode.value == 'G0'){\r\n // assert minimum speed \r\n mod.g0SpeedIn.value = Math.max(10, keyvals.F)\r\n } else {\r\n mod.g1SpeedIn.value = Math.max(10, keyvals.F)\r\n }\r\n }\r\n }\r\n\r\n if(mod.codeMode.value == 'G0'){\r\n output.speed = parseFloat(mod.g0SpeedIn.value)\r\n } else {\r\n output.speed = parseFloat(mod.g1SpeedIn.value)\r\n }\r\n\r\n outputs.instruction.event(output)\r\n } else if (mod.codeMode.value == 'M3'){\r\n var output = {\r\n type: 'spindle',\r\n speed: 0\r\n }\r\n if(keyvals.S != null){\r\n output.speed = keyvals.S\r\n outputs.instruction.event(output)\r\n } else {\r\n console.log('need S parameter on spindle instruction')\r\n }\r\n } else if (mod.codeMode.value == 'M5'){\r\n var output = {\r\n type: 'spindle',\r\n speed: 0\r\n }\r\n output.instruction.event(output)\r\n } else {\r\n console.log('gcode instruction not recognized')\r\n }\r\n }\r\n\r\n function getKeyValues(str) {\r\n var kv = {}\r\n for (var i = 0; i < str.length; i++) {\r\n if (str[i].match('[A-Za-z]')) { // regex to match upper case letters\r\n var lastIndex = str.indexOf(' ', i)\r\n if (lastIndex < 0) {\r\n lastIndex = str.length\r\n }\r\n var key = str[i].toUpperCase()\r\n kv[key] = parseFloat(str.slice(i + 1, lastIndex))\r\n }\r\n }\r\n return kv\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"426.77495194393157","left":"914.2517273462793","inputs":{},"outputs":{}},"0.12892300269908796":{"definition":"//\r\n// hardware reset command\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n // globals\r\n var mod = {}\r\n\r\n // name\r\n var name = 'reset'\r\n\r\n var init = function() {\r\n // \r\n }\r\n\r\n var inputs = {\r\n //\r\n }\r\n\r\n var outputs = {\r\n reset: {\r\n type: 'packet',\r\n label: 'headless packet out',\r\n event: function() {\r\n var reset = [128]\r\n mods.output(mod, 'reset', reset)\r\n }\r\n }\r\n }\r\n\r\n var interface = function(div) {\r\n mod.div = div\r\n\r\n mod.resetButton = make_button_input(div, 'send')\r\n mod.resetButton.addEventListener('click', function() {\r\n outputs.reset.event()\r\n })\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"1675.4042290346147","left":"1129.7813578310218","inputs":{},"outputs":{}},"0.8760539425525505":{"definition":"//\n// gets lines of gcode, turns into instructions for mods-machines\n//\n// Neil Gershenfeld and Jake Read\n// (c) Massachusetts Institute of Technology 2018\n// \n// This work may be reproduced, modified, distributed, performed, and \n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is \n// provided as is; no warranty is provided, and users accept all \n// liability.\n\n/*\nstart / stop machine on given path, \nmanually turn spindle on / off etc\ndishes gcodes -> planner, spindle codes -> spindle \n*/\n\n//\n// closure\n//\n(function() {\n //\n // module globals\n //\n var mod = {}\n //\n // name\n //\n var name = 'machine controller'\n //\n // initialization\n //\n var init = function() {\n mod.jogStepSizeIn.value = '10'\n mod.jogSpeedIn.value = '100'\n }\n //\n // inputs\n //\n var inputs = {\n lineComplete: {\n type: 'event',\n label: 'line complete',\n event: function(evt) {\n onLineComplete()\n }\n }\n }\n //\n // outputs\n //\n var outputs = {\n singleInstruction: {\n type: 'object',\n label: 'instruction',\n event: function(obj) {\n mods.output(mod, 'singleInstruction', obj)\n }\n },\n lineAdvance: {\n type: 'event',\n label: 'line advance',\n event: function() {\n mods.output(mod, 'lineAdvance', true)\n }\n },\n sequenceControl: {\n type: 'integer',\n label: 'sequence control',\n event: function(int){\n mods.output(mod, 'sequenceControl', int)\n }\n }\n }\n //\n // interface\n //\n var interface = function(div) {\n mod.div = div\n //\n // inputs\n //\n\n // control buttons\n\n mod.jogStepSizeIn = make_text_input(div, 'jog increment size', 24)\n mod.jogSpeedIn = make_text_input(div, 'jog speed', 24)\n\n mod.jogXPButton = make_button_input(div, 'x+')\n mod.jogXPButton.addEventListener('click', function(evt) {\n jog('X', parseFloat(mod.jogStepSizeIn.value))\n })\n\n mod.jogXMButton = make_button_input(div, 'x-')\n mod.jogXMButton.addEventListener('click', function(evt) {\n jog('X', -parseFloat(mod.jogStepSizeIn.value))\n })\n\n mod.jogYPButton = make_button_input(div, 'y+')\n mod.jogYPButton.addEventListener('click', function(evt) {\n jog('Y', parseFloat(mod.jogStepSizeIn.value))\n })\n\n mod.jogYMButton = make_button_input(div, 'y-')\n mod.jogYMButton.addEventListener('click', function(evt) {\n jog('Y', -parseFloat(mod.jogStepSizeIn.value))\n })\n\n // sequence begin, stop \n\n mod.startSequenceButton = make_button_input(div, 'start sequence')\n mod.startSequenceButton.addEventListener('click', function(evt) {\n startSequence(32)\n })\n\n mod.pauseSequenceButton = make_button_input(div, 'pause sequence')\n mod.pauseSequenceButton.addEventListener('click', function(evt){\n pauseSequence()\n })\n }\n\n mod.isPaused = true\n\n function startSequence(windowsize) {\n outputs.sequenceControl.event(0)\n for(var i = 0; i < windowsize; i ++){\n outputs.lineAdvance.event()\n }\n mod.isPaused = false\n outputs.sequenceControl.event(1)\n }\n\n function pauseSequence(){\n outputs.sequenceControl.event(0)\n mod.isPaused = true\n }\n\n function onLineComplete() {\n if(mod.isPaused){\n //\n } else {\n outputs.lineAdvance.event()\n }\n }\n\n function jog(key, val) {\n var instruction = {}\n instruction.position = {}\n instruction.position[key] = val\n instruction.speed = mod.jogSpeedIn.value\n instruction.type = 'move'\n\n outputs.singleInstruction.event(instruction)\n outputs.sequenceControl.event(1)\n }\n\n\n /*\n UI helpers\n */\n function make_text_input(div, name, size) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(name + ': '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = size\n div.appendChild(input)\n\n return input\n }\n\n function make_button_input(div, text) {\n div.appendChild(document.createElement('br'))\n var button = document.createElement('button')\n button.style.padding = mods.ui.padding\n button.style.margin = 1\n button.appendChild(document.createTextNode(text))\n div.appendChild(button)\n\n return button\n }\n\n function make_checkbox_input(div, prefix) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(prefix + ': '))\n var checkbox = document.createElement('input')\n checkbox.type = 'checkbox'\n div.appendChild(checkbox)\n\n return checkbox\n }\n\n function make_text_display(div, prefix) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(prefix + ': '))\n var span = document.createElement('span')\n span.innerHTML = ''\n div.appendChild(span)\n\n return span\n }\n\n\n //\n // return values\n //\n return ({\n mod: mod,\n name: name,\n init: init,\n inputs: inputs,\n outputs: outputs,\n interface: interface\n })\n}())","top":"165.13595417545747","left":"356.0631935815046","inputs":{},"outputs":{}},"0.014676456915753922":{"definition":"//\r\n// converts toolpath objects into segments for accel planning\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n//\r\n// This work may be reproduced, modified, distributed, performed, and\r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is\r\n// provided as is; no warranty is provided, and users accept all\r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n //\r\n // module globals\r\n //\r\n var mod = {}\r\n //\r\n // name\r\n //\r\n var name = 'stepper'\r\n //\r\n // initialization\r\n //\r\n var init = function() {\r\n mod.stepper_axis_num_in.value = '0'\r\n mod.axis_num = 0\r\n mod.steps_per_mm_in.value = '80'\r\n mod.convert = 80\r\n mod.block = {\r\n accel: 50,\r\n cruise: 120,\r\n entry: 0,\r\n exit: 30,\r\n p1: [0, 0, 0],\r\n p2: [10, 10, 10]\r\n }\r\n }\r\n //\r\n // inputs\r\n //\r\n var inputs = {\r\n block: {\r\n type: 'object',\r\n label: 'block',\r\n event: function(evt) {\r\n mod.block = JSON.parse(JSON.stringify(evt.detail)) // dereference pls\r\n shipIt()\r\n }\r\n },\r\n ack: {\r\n type: 'packet',\r\n label: 'headless packet in',\r\n event: function(evt) {\r\n onAcknowledgement(evt.detail)\r\n }\r\n }\r\n }\r\n //\r\n // outputs\r\n //\r\n var outputs = {\r\n acknowledgement: {\r\n type: 'object',\r\n label: 'acknowledgement',\r\n event: function(obj) {\r\n mods.output(mod, 'acknowledgement', obj)\r\n }\r\n },\r\n packet: {\r\n type: 'packet',\r\n label: 'headless packet out',\r\n event: function() {\r\n //mods.output(mod, 'segments', null)\r\n }\r\n }\r\n }\r\n //\r\n // interface\r\n //\r\n var interface = function(div) {\r\n mod.div = div\r\n //\r\n // inputs\r\n //\r\n // settings\r\n // the axis to pull out of the block - index of posistions on p1, p2\r\n mod.stepper_axis_num_in = make_text_input(div, 'axis index', 12)\r\n mod.stepper_axis_num_in.addEventListener('change', function() {\r\n mod.axis_num = parseInt(mod.stepper_axis_num_in.value)\r\n })\r\n // steps per mm\r\n mod.steps_per_mm_in = make_text_input(div, 'steps per mm', 12)\r\n mod.steps_per_mm_in.addEventListener('change', function() {\r\n mod.covert = parseFloat(mod.steps_per_mm_in.value)\r\n })\r\n // reverse?\r\n mod.reverseCheck = make_checkbox_input(div, 'reversed')\r\n //\r\n // request to do the business\r\n //\r\n mod.send_button = make_button_input(div, 'send')\r\n mod.send_button.addEventListener('click', function() {\r\n shipIt()\r\n })\r\n }\r\n\r\n function cartesianDistance(p1, p2) {\r\n // takes p1, p2 to be arrays of same length\r\n // computes cartesian distance\r\n var sum = 0\r\n for (var i = 0; i < p1.length; i++) {\r\n sum += Math.pow((p1[i] - p2[i]), 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function cartesianLength(v) {\r\n // length of vector\r\n var sum = 0\r\n for (var i = 0; i < v.length; i++) {\r\n sum += Math.pow(v[i], 2)\r\n }\r\n return Math.sqrt(sum)\r\n }\r\n\r\n function addMatrix(a, b, c) {\r\n // c = a + b\r\n a.forEach(function(item, index) {\r\n c[index] = b[index] + a[index]\r\n })\r\n }\r\n\r\n function subtractMatrix(a, b, c) {\r\n // c = a - b\r\n b.forEach(function(item, index) {\r\n c[index] = a[index] - b[index]\r\n })\r\n }\r\n\r\n function multiplyMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n a.forEach(function(item, index) {\r\n b[index] = a[index] * scalar\r\n })\r\n }\r\n\r\n function multiply2dMatrix(a, scalar, b) {\r\n // b = a * scalar\r\n for (var i = 0; i < a.length; i++) {\r\n for (var j = 0; j < a[i].length; j++) {\r\n b[i][j] = a[i][j] * scalar;\r\n }\r\n }\r\n }\r\n\r\n function divideMatrix(a, scalar, b) {\r\n // b = a / scalar\r\n for (var i = 0; i < a.length; i++) {\r\n b[i] = a[i] / scalar\r\n }\r\n }\r\n\r\n function unitVector(p1, p2) {\r\n // returns new array, is unit vector of p2-p1\r\n var unit = new Array()\r\n subtractMatrix(p2, p1, unit)\r\n var length = cartesianLength(unit)\r\n divideMatrix(unit, length, unit)\r\n\r\n return unit\r\n }\r\n\r\n function dotProduct(a, b) {\r\n // returns a dot b\r\n var sum = 0;\r\n for (var i = 0; i < a.length; i++) {\r\n sum += a[i] * b[i]\r\n }\r\n\r\n return sum\r\n }\r\n\r\n function toFixedMatrix(a, digits) {\r\n var rounded = new Array()\r\n for (var i = 0; i < a.length; i++) {\r\n rounded[i] = a[i].toFixed(digits)\r\n }\r\n\r\n return rounded\r\n }\r\n\r\n /*\r\n now:\r\n\r\n start from segment and find a corner\r\n do planner\r\n\r\n */\r\n\r\n //\r\n // local functions\r\n //\r\n\r\n function onAcknowledgement(packet){\r\n if(packet[0] == 132){\r\n // wait move\r\n var ack = {}\r\n ack.axis = mod.axis_num\r\n ack.type = 'wait acknowledgement'\r\n outputs.acknowledgement.event(ack)\r\n } else if (packet[0] == 131){\r\n var ack = {}\r\n ack.axis = mod.axis_num \r\n ack.type = 'move acknowledgement'\r\n var steps = unpack32(packet, 1)\r\n ack.increment = steps / mod.convert\r\n outputs.acknowledgement.event(ack)\r\n } else {\r\n console.log('nonrecognized ack to stepper')\r\n }\r\n // check if was wait / was move, send response accordingly \r\n }\r\n\r\n function shipIt() {\r\n // sends integer values, I think we maintain positioning because we round before subtracting\r\n\r\n var trapezoid = calculateTrapezoid(mod.axis_num)\r\n if (trapezoid.length == 0) {\r\n var ok = 0\r\n var i = 0\r\n var waitTrap\r\n while (!ok && i < mod.block.p1.length) {\r\n waitTrap = calculateTrapezoid(i)\r\n if (waitTrap.delta != 0) {\r\n ok = 1\r\n } else {\r\n i++\r\n }\r\n }\r\n if (ok) {\r\n sendWait(waitTrap)\r\n } else {\r\n console.log('step zero packet, but no axis of nonzero length found', JSON.parse(JSON.stringify(mod.block)))\r\n }\r\n } else {\r\n sendTrapezoid(trapezoid)\r\n }\r\n }\r\n\r\n function calculateTrapezoid(axis) {\r\n // packet (per stepper block)\r\n // steps, entry, accel, accelLength, deccelLength\r\n // first we fill this with all of the info we'll use to calculated\r\n // the trapezoid in planner-space units, then we convert to steps last\r\n var trap = {}\r\n\r\n // lengths and positions for the move\r\n trap.x1 = mod.block.p1[axis]\r\n trap.x2 = mod.block.p2[axis]\r\n trap.delta = trap.x2 - trap.x1\r\n trap.length = Math.abs(trap.delta)\r\n\r\n // rates for the move\r\n var unit = unitVector(mod.block.p1, mod.block.p2)\r\n var relativeRate = Math.abs(unit[axis])\r\n trap.entry = mod.block.entry * relativeRate\r\n trap.accel = mod.block.accel * relativeRate\r\n trap.cruise = mod.block.cruise * relativeRate\r\n trap.exit = mod.block.exit * relativeRate\r\n\r\n // now accelLength and deccelLength\r\n // using the maximum deltaV for the move,\r\n // we'll figure out what type of move we have\r\n var maxExit = Math.sqrt(trap.entry * trap.entry + 2 * trap.accel * trap.length)\r\n var maxEntry = Math.sqrt(trap.exit * trap.entry + 2 * trap.accel * trap.length)\r\n\r\n // there are 7 possible profiles\r\n if (trap.length <= 0) {\r\n // console.log('zero length trap')\r\n } else if (maxExit <= trap.exit) {\r\n // full ramp-up: have to push iiit to get there\r\n //console.log('full rampup')\r\n trap.ramptype = 'rampup'\r\n trap.accelLength = trap.length\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // for the wait function\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (maxEntry <= trap.entry) {\r\n // full ramp-down: have to deccel all the way with this rate\r\n //console.log('full rampdown')\r\n trap.ramptype = 'rampdown'\r\n trap.deccelLength = 0 // start immmeeeeediately\r\n trap.accelLength = 0 // never accel\r\n // for the wait\r\n trap.vAvg = (trap.entry + trap.exit) / 2\r\n } else if (trap.cruise == trap.entry && trap.cruise == trap.exit) {\r\n // str8 relaxin, no maxin\r\n //console.log('full cruise')\r\n trap.ramptype = 'cruise'\r\n trap.accelLength = 0 // never accel\r\n trap.deccelLength = trap.length + mod.convert // never decel\r\n // wait\r\n trap.vAvg = trap.cruise\r\n } else if (trap.cruise == trap.entry) {\r\n // cruise, then deccel\r\n //console.log('cruise then deccel')\r\n // for how long do we have to decel? we have to have deltaV for\r\n trap.ramptype = 'cruiseDeccel'\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n trap.deccelLength = trap.length - deccelDistance\r\n trap.accelLength = 0; // never accel\r\n // we really want speed by multiple times, and total distance we know, for vAvg\r\n var tSum = (trap.cruise - trap.exit) / trap.accel + trap.deccelLength / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else if (trap.cruise == trap.exit) {\r\n // accel, cruise? unless entry also cruise?\r\n //console.log('accel then cruise')\r\n trap.ramptype = 'cruiseAccel'\r\n trap.accelLength = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.deccelLength = trap.length + 1; // and never deccel\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.delta - trap.accellength) / trap.cruise\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n // it's either a full trap, or a triangle\r\n var accelDistance = (trap.cruise * trap.cruise - trap.entry * trap.entry) / (2 * trap.accel)\r\n var deccelDistance = (trap.cruise * trap.cruise - trap.exit * trap.exit) / (2 * trap.accel)\r\n if ((accelDistance + deccelDistance) < trap.length) {\r\n //console.log('full trap')\r\n trap.ramptype = 'fullTrap'\r\n trap.accelLength = accelDistance\r\n trap.deccelLength = trap.length - deccelDistance\r\n // wait \r\n var tSum = (trap.cruise - trap.entry) / trap.accel + (trap.deccelLength - trap.accellength) / trap.cruise + (trap.cruise - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n } else {\r\n //console.log('triangle')\r\n trap.ramptype = 'triangle'\r\n // find intersection point\r\n var vPeak = Math.sqrt((2 * trap.accel * trap.length + Math.pow(trap.entry, 2) + Math.pow(trap.exit, 2)) / 2)\r\n //console.log('entry, peak, exit', trap.entry, vPeak, trap.exit)\r\n var midPoint = (vPeak * vPeak - trap.entry * trap.entry) / (2 * trap.accel)\r\n trap.accelLength = midPoint\r\n trap.deccelLength = midPoint\r\n var tSum = (vPeak - trap.entry) / trap.accel + (vPeak - trap.exit) / trap.accel\r\n trap.vAvg = trap.length / tSum\r\n }\r\n }\r\n\r\n return trap\r\n }\r\n\r\n function sendTrapezoid(trap) {\r\n //console.log('trapezoid', trapezoid)\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n\r\n var packet = new Array();\r\n // first, the packet header: the route, ptr and end_addr delimiter\r\n // #define APA_END_ROUTE_DELIMITER 255\r\n // #define APA_ROUTE_POINTER 254\r\n // #define DELIM_KEY_TRAPEZOID 131 // is 32 bit int\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(131)\r\n // now we pack these values into UART-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n var steps;\r\n if(mod.reverseCheck.checked){\r\n steps = -stepwiseTrap.steps\r\n } else {\r\n steps = stepwiseTrap.steps\r\n }\r\n packet = packet.concat(pack32(steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // log this if you wish\r\n //console.log('packet from stepper', packet)\r\n // send it along!\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function sendWait(trap) {\r\n var stepwiseTrap = trapezoidToStepwise(trap);\r\n var packet = new Array();\r\n // #define DELIM_KEY_WAIT 132\r\n packet.push(132)\r\n // now we pack these values into C-readable bytes\r\n // int32_t steps, uint32_t entryspeed, accel, accellength, decellength\r\n packet = packet.concat(pack32(stepwiseTrap.steps))\r\n packet = packet.concat(pack32(stepwiseTrap.entry))\r\n packet = packet.concat(pack32(stepwiseTrap.accel))\r\n packet = packet.concat(pack32(stepwiseTrap.accelLength))\r\n packet = packet.concat(pack32(stepwiseTrap.deccelLength))\r\n // send it along!\r\n //console.log('wait packet', packet)\r\n mods.output(mod, 'packet', packet)\r\n }\r\n\r\n function trapezoidToStepwise(trap) {\r\n var stepwise = {}\r\n // planner units -> steps\r\n stepwise.steps = Math.round(trap.delta * mod.convert)\r\n // planner units -> steps/min (for less integer error)\r\n stepwise.entry = Math.round(trap.entry * mod.convert)\r\n // planner units -> steps/min/s (a messed up unit, I know)\r\n stepwise.accel = Math.round(trap.accel * mod.convert)\r\n // planner units -> steps\r\n stepwise.accelLength = Math.round(trap.accelLength * mod.convert)\r\n stepwise.deccelLength = Math.round(trap.deccelLength * mod.convert)\r\n\r\n return stepwise\r\n }\r\n\r\n function trapezoidToStepWait(trap) {\r\n var stepWait = {}\r\n // planner units -> steps\r\n stepWait.steps = Math.round(trap.length * mod.convert)\r\n //\r\n stepWait.vAvg = Math.round(trap.vAvg * mod.convert)\r\n if(isNaN(stepWait.vAvg)){\r\n console.log('err on vAvg maths in stepper')\r\n stepWait.vAvg = 1000\r\n }\r\n\r\n return stepWait\r\n }\r\n\r\n function pack32(val) {\r\n var pack = new Array();\r\n pack[0] = (val >> 24) & 255;\r\n pack[1] = (val >> 16) & 255;\r\n pack[2] = (val >> 8) & 255;\r\n pack[3] = val & 255;\r\n\r\n return pack;\r\n }\r\n\r\n function unpack32(array, start){\r\n var unpack = array[start] << 24 | array[start + 1] << 16 | array[start + 2] << 8 | array[start + 3]\r\n return unpack\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n\r\n //\r\n // return values\r\n //\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"1128.344212761479","left":"1597.0739725325982","inputs":{},"outputs":{}},"0.14166905728661427":{"definition":"//\r\n// event sniffer\r\n//\r\n// Neil Gershenfeld and Jake Read\r\n// (c) Massachusetts Institute of Technology 2018\r\n// \r\n// This work may be reproduced, modified, distributed, performed, and \r\n// displayed for any purpose, but must acknowledge the mods\r\n// project. Copyright is retained and must be preserved. The work is \r\n// provided as is; no warranty is provided, and users accept all \r\n// liability.\r\n//\r\n// closure\r\n//\r\n(function() {\r\n // globals\r\n var mod = {}\r\n\r\n // name\r\n var name = 'event logger'\r\n\r\n var init = function() {\r\n mod.identifier.value = 'logger'\r\n }\r\n\r\n var inputs = {\r\n event: {\r\n type: 'any',\r\n event: function(evt) {\r\n console.log(mod.identifier.value, ': ', JSON.parse(JSON.stringify(evt.detail)))\r\n }\r\n }\r\n }\r\n\r\n var outputs = {}\r\n\r\n var interface = function(div) {\r\n mod.div = div\r\n\r\n mod.identifier = make_text_input(div, 'identifier', 8)\r\n }\r\n\r\n\r\n /*\r\n UI helpers\r\n */\r\n function make_text_input(div, name, size) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(name + ': '))\r\n var input = document.createElement('input')\r\n input.type = 'text'\r\n input.size = size\r\n div.appendChild(input)\r\n\r\n return input\r\n }\r\n\r\n function make_button_input(div, text) {\r\n div.appendChild(document.createElement('br'))\r\n var button = document.createElement('button')\r\n button.style.padding = mods.ui.padding\r\n button.style.margin = 1\r\n button.appendChild(document.createTextNode(text))\r\n div.appendChild(button)\r\n\r\n return button\r\n }\r\n\r\n function make_checkbox_input(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var checkbox = document.createElement('input')\r\n checkbox.type = 'checkbox'\r\n div.appendChild(checkbox)\r\n\r\n return checkbox\r\n }\r\n\r\n function make_text_display(div, prefix) {\r\n div.appendChild(document.createElement('br'))\r\n div.appendChild(document.createTextNode(prefix + ': '))\r\n var span = document.createElement('span')\r\n span.innerHTML = ''\r\n div.appendChild(span)\r\n\r\n return span\r\n }\r\n\r\n return ({\r\n mod: mod,\r\n name: name,\r\n init: init,\r\n inputs: inputs,\r\n outputs: outputs,\r\n interface: interface\r\n })\r\n}())","top":"507.5803043494294","left":"2055.6189647324964","inputs":{},"outputs":{}},"0.4370306155232835":{"definition":"//\n// converts toolpath objects into segments for accel planning\n//\n// Neil Gershenfeld and Jake Read\n// (c) Massachusetts Institute of Technology 2018\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n\n\n/*\neats objects like\nvar move = {\n position: {\n X: float\n Y: float\n Z: float\n A: float\n }\n rate: float\n}\n\noutputs:\nmotors\n'planner block consumed' event\n\n\n*/\n\n//\n// closure\n//\n(function() {\n //\n // module globals\n //\n var mod = {}\n //\n // name\n //\n var name = 'motion planner'\n //\n // initialization\n //\n var init = function() {\n mod.accelIn.value = '500'\n mod.junctionDeviationIn.value = '1'\n mod.minSpeedIn.value = '4'\n\n mod.axisIdentifiers.value = 'X,Y,Z'\n resetNetwork()\n\n mod.netWindowIn.value = '12'\n packetWindowSize = parseInt(mod.netWindowIn.value)\n\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n }\n //\n // inputs\n //\n var inputs = {\n newMove: {\n type: 'object',\n label: 'move instruction',\n event: function(evt) {\n addToQueue(JSON.parse(JSON.stringify(evt.detail)))\n }\n },\n acknowledgement: {\n type: 'event',\n label: 'acknowledgement',\n event: function(evt) {\n onAcknowledgement(evt.detail)\n }\n },\n sequenceControl: {\n type: 'integer',\n label: 'sequence control',\n event: function(evt) {\n if (evt.detail == 1) {\n checkNetwork()\n }\n }\n }\n }\n //\n // outputs\n //\n var outputs = {\n plannedMove: {\n type: 'object',\n label: 'move instruction',\n event: function(block) {\n var deref = JSON.parse(JSON.stringify(block))\n mods.output(mod, 'plannedMove', deref)\n }\n },\n moveComplete: {\n type: 'event',\n label: 'move complete',\n event: function(evt) {\n mods.output(mod, 'moveComplete', 1)\n }\n }\n }\n //\n // interface\n //\n var interface = function(div) {\n mod.div = div\n //\n // inputs\n //\n // settings\n make_text_display(div, 'machine config')\n mod.axisIdentifiers = make_text_input(div, 'axis identifiers', 12)\n mod.axisIdentifiers.addEventListener('change', function() {\n resetNetwork()\n })\n div.appendChild(document.createElement('br'))\n\n make_text_display(div, 'planner settings')\n mod.accelIn = make_text_input(div, 'acceleration, units/s/s', 12)\n mod.junctionDeviationIn = make_text_input(div, 'junction deviation, units', 12)\n mod.minSpeedIn = make_text_input(div, 'minimum speed, units/s', 12)\n div.appendChild(document.createElement('br'))\n\n make_text_display(div, 'queuing settings')\n mod.queueLengthDisplay = make_text_display(div, 'instructions in queue')\n mod.resetQueueButton = make_button_input(div, 'reset queue')\n mod.resetQueueButton.addEventListener('click', function() {\n resetQueue()\n })\n div.appendChild(document.createElement('br'))\n\n mod.netWindowIn = make_text_input(div, 'network window size', 12)\n mod.netWindowIn.addEventListener('change', function() {\n packetWindowSize = parseInt(mod.netWindowIn.value)\n })\n mod.netQueueDisplay = make_text_display(div, 'instructions on network')\n mod.resetNetButton = make_button_input(div, 'reset network')\n mod.resetNetButton.addEventListener('click', function() {\n resetNetwork()\n })\n\n div.appendChild(document.createElement('br'))\n mod.netPositionDisplay = make_text_display(div, 'last position sent to network')\n mod.finalPositionDisplay = make_text_display(div, 'last position received on network')\n\n }\n\n // ---------------------------------------------------- THE BUSINESS\n\n // network state\n var packetWindowSize = 0\n var axisNetCounters = new Array()\n var lastPosToNet = new Array()\n var lastPosFromNet = new Array()\n\n\n function resetNetwork() {\n axisIds = mod.axisIdentifiers.value.split(',')\n for (var i = 0; i < axisIds.length; i++) {\n currentPosition[i] = 0\n axisNetCounters[i] = 0\n lastPosToNet[i] = 0\n lastPosFromNet[i] = 0\n }\n mod.netPositionDisplay.innerHTML = lastPosToNet.toString()\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n mod.finalPositionDisplay.innerHTML = lastPosFromNet.toString()\n }\n\n // IF entry / exit are null, do min speed \n\n function onAcknowledgement(obj) {\n axisNetCounters[obj.axis] --\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n if(obj.type == 'move acknowledgement'){\n //console.log('received pos', obj.increment, obj.axis)\n lastPosFromNet[obj.axis] += obj.increment\n var netRounded = new Array()\n for(var i = 0; i < lastPosFromNet.length; i ++){\n netRounded[i] = Math.round(lastPosFromNet[i] * 100) / 100\n }\n mod.finalPositionDisplay.innerHTML = netRounded.toString()\n }\n checkNetwork()\n }\n\n function checkNetwork() {\n // see windowed state and push more data out if need be\n // TODO here\n var ok = false\n for(var i = 0; i < axisNetCounters.length - 2; i ++){\n if(axisNetCounters[i] == axisNetCounters[i + 1]){\n ok = true\n } else {\n ok = false\n }\n }\n if(ok){\n var opening = packetWindowSize - axisNetCounters[0]\n if(opening > moveQue.length){\n opening = moveQue.length\n }\n for(var i = 0; i < opening; i++){\n //console.log('sending', i)\n sendMove()\n outputs.moveComplete.event()\n }\n }\n }\n\n function sendMove() {\n var lastPos = moveQue[0].p2\n outputs.plannedMove.event(moveQue.shift())\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n mod.netPositionDisplay.innerHTML = lastPos.toString()\n axisNetCounters.forEach(function(element, index){\n axisNetCounters[index] ++\n })\n mod.netQueueDisplay.innerHTML = axisNetCounters.toString()\n }\n\n\n // planner state and moves\n var axisIds = []\n var moveQue = [] // array of moves \n var currentPosition = []\n\n /*\n var segment = {\n p1: p1,\n p2: p2,\n cruise: cruise,\n entry: entry,\n exit: exit,\n }\n */\n\n function resetQueue() {\n moveQue.length = 0 // apparently this works\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n }\n\n function addToQueue(obj) {\n // add to the move queue \n var p1 = []\n var p2 = []\n if (moveQue.length == 0) {\n p1 = currentPosition\n } else {\n p1 = moveQue[moveQue.length - 1].p2\n }\n\n // TODO: abstract axis? ids -> p1, p2\n // find all letter-based and match to std array \n var keyset = new Array(axisIds.length)\n keyset.fill(0)\n\n for (key in obj.position) {\n for (axisId in axisIds) {\n if (key == axisIds[axisId]) {\n p2[axisId] = obj.position[key]\n keyset[axisId] = 1\n } else if (keyset[axisId] != 1) {\n p2[axisId] = p1[axisId]\n } else {\n // nothing\n }\n }\n }\n\n if (cartesianDistance(p1, p2) == 0) {\n // TODO: check for these when move is z- and have only xy actuators?\n console.log('planner throwing zero length vector')\n } else {\n var cruise = obj.speed\n\n var newMove = {\n p1: p1,\n p2: p2,\n cruise: cruise,\n entry: 0,\n exit: 0\n }\n\n // append the move to the queue \n moveQue.push(newMove)\n mod.queueLengthDisplay.innerHTML = moveQue.length.toString()\n\n // and then check to see if we are ready to pass anything to the motors\n runQue()\n }\n }\n\n //\n // local functions\n //\n function runQue() {\n // converting from mm/s or dpi (pixel units) to mm based units\n // https://github.com/grbl/grbl/blob/master/grbl/planner.c\n // https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/\n /*\n first we walk the queue:\n going backwards, end at 0 speed exit\n - find junction speed (junction deviation) between this and previous block\n - this is entry speed, calculate trapezoid to exit speed\n next block\n - exit speed is recently calculated entry speed\n - do junction deviation, this is entry speed\n - calculate trapezoid\n .. why is this simpler? find entry and exit speed of each block,\n find accel limits per axis, do trapezoid with that accel\n */\n\n var jdsize = parseFloat(mod.junctionDeviationIn.value)\n var accel = parseFloat(mod.accelIn.value)\n // TODO: use these\n var minmin = parseFloat(mod.minSpeedIn.value)\n\n moveQue[moveQue.length - 1].exit = minmin // trailing edge always full stop\n\n for (var i = moveQue.length - 1; i > 0; i--) {\n // reverse pass\n // find junction deviation\n /*\n - really, could only do this once per segment when a new one is added\n - unitize entry and exit vectors\n - find cos(theta) = Ventry dot Vexit / (|Ventry| * |Vexit|) -> this is (1*1 bc unit)\n - find sin(theta/2) = sqrt((1-cos(theta))/2)\n - find r = j(sin(theta/2)/(1-sin(theta/2)))\n - find Fj = sqrt(Ac*r)\n - junction speed is min(Fj, min(entry,exit))\n */\n\n var v_entry = unitVector(moveQue[i - 1].p1, moveQue[i - 1].p2)\n var v_exit = unitVector(moveQue[i].p1, moveQue[i].p2)\n //console.log('unit entry, unit exit', toFixedMatrix(v_entry, 3), toFixedMatrix(v_exit, 3))\n // dot product / mag * mag where mags are 1 each bc unit\n var cos_theta = dotProduct(v_entry, v_exit) \n // catch corner cases (get it? - actually they are very straight cases, or very turnaround cases)\n if (cos_theta < -0.9999999999999) {\n cos_theta = -0.9999999999999\n } else if (cos_theta > 0.9999999999999) {\n cos_theta = 0.9999999999999\n }\n //console.log('cos_theta', cos_theta, Math.acos(cos_theta) * (180 / Math.PI))\n // for calculating the radius, below\n var sin_theta_overtwo = Math.sqrt((1 - cos_theta) / 2)\n //console.log('sin_theta_overtwo', sin_theta_overtwo)\n // size of the junction deviation curve\n var radius = jdsize * ((1 - sin_theta_overtwo) / sin_theta_overtwo)\n //console.log('radius', radius)\n // feed at the junction, according to supposed acceleration through the junction radius\n var fj = Math.sqrt(accel * radius)\n //console.log('fj', fj)\n // but don't go through the junction faster than we're cruising\n var feed_junction = Math.min(fj, moveQue[i].cruise, moveQue[i - 1].cruise)\n // and we never travel slower than the min speed \n //feed_junction = Math.max(feed_junction, minmin)\n //console.log('feed_junction', feed_junction)\n\n // ok we have the maximum feed at the preceeding junction\n // now: find the maximum entry speeds as if we spent the whole block decelerating\n\n // size of segment\n var distance = cartesianDistance(moveQue[i].p1, moveQue[i].p2)\n //console.log('distance', distance)\n var max_entry_speed = Math.sqrt(moveQue[i].exit * moveQue[i].exit + 2 * distance * accel)\n //console.log('max_entry_speed', max_entry_speed)\n var entry_speed = Math.min(max_entry_speed, feed_junction)\n max_entry_speed = Math.max(max_entry_speed, minmin)\n //console.log('entry_speed', entry_speed)\n moveQue[i].entry = entry_speed\n moveQue[i - 1].exit = entry_speed\n //console.log('segment:', moveQue[i])\n moveQue[i].accel = accel\n moveQue[i].distance = distance\n }\n\n // bad bad not very good implementation to start:\n //moveQue[0].entry = 0\n moveQue[0].accel = accel\n moveQue[0].distance = cartesianDistance(moveQue[0].p1, moveQue[0].p2)\n\n // forward pass to make sure we can accelerate to set exit speed in length\n for (var i = 0; i < moveQue.length - 1; i++) {\n var distance = moveQue[i].distance\n var max_exit_speed = Math.sqrt(moveQue[i].entry * moveQue[i].entry + 2 * distance * accel)\n max_exit_speed = Math.max(max_exit_speed, minmin)\n if (max_exit_speed < moveQue[i + 1].entry_speed) {\n moveQue[i + 1].entry = max_exit_speed\n moveQue[i].exit = max_exit_speed\n }\n if(moveQue[i].entry < minmin){\n moveQue[i].entry = minmin\n }\n if(moveQue[i].exit < minmin){\n moveQue[i].exit = minmin\n }\n if(moveQue[i].entry == null){\n console.log('null entry', moveQue[i])\n moveQue[i].entry = minmin\n }\n if(moveQue[i].exit == null){\n console.log('null exit', moveQue[i])\n moveQue[i].exit = minmin\n }\n }\n }\n\n // ---------------------------------------------------- UTILITIES\n\n function cartesianDistance(p1, p2) {\n // takes p1, p2 to be arrays of same length\n // computes cartesian distance\n var sum = 0\n for (var i = 0; i < p1.length; i++) {\n sum += Math.pow((p1[i] - p2[i]), 2)\n }\n return Math.sqrt(sum)\n }\n\n function cartesianLength(v) {\n // length of vector\n var sum = 0\n for (var i = 0; i < v.length; i++) {\n sum += Math.pow(v[i], 2)\n }\n return Math.sqrt(sum)\n }\n\n function addMatrix(a, b, c) {\n // c = a + b\n a.forEach(function(item, index) {\n c[index] = b[index] + a[index]\n })\n }\n\n function subtractMatrix(a, b, c) {\n // c = a - b\n b.forEach(function(item, index) {\n c[index] = a[index] - b[index]\n })\n }\n\n function multiplyMatrix(a, scalar, b) {\n // b = a * scalar\n a.forEach(function(item, index) {\n b[index] = a[index] * scalar\n })\n }\n\n function multiply2dMatrix(a, scalar, b) {\n // b = a * scalar\n for (var i = 0; i < a.length; i++) {\n for (var j = 0; j < a[i].length; j++) {\n b[i][j] = a[i][j] * scalar;\n }\n }\n }\n\n function divideMatrix(a, scalar, b) {\n // b = a / scalar\n for (var i = 0; i < a.length; i++) {\n b[i] = a[i] / scalar\n }\n }\n\n function unitVector(p1, p2) {\n // returns new array, is unit vector of p2-p1\n var unit = new Array()\n subtractMatrix(p2, p1, unit)\n var length = cartesianLength(unit)\n divideMatrix(unit, length, unit)\n\n return unit\n }\n\n function dotProduct(a, b) {\n // returns a dot b\n var sum = 0;\n for (var i = 0; i < a.length; i++) {\n sum += a[i] * b[i]\n }\n\n return sum\n }\n\n function toFixedMatrix(a, digits) {\n var rounded = new Array()\n for (var i = 0; i < a.length; i++) {\n rounded[i] = a[i].toFixed(digits)\n }\n\n return rounded\n }\n\n // ---------------------------------------------------- UI HELP\n\n function make_text_input(div, name, size) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(name + ': '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = size\n div.appendChild(input)\n\n return input\n }\n\n function make_button_input(div, text) {\n div.appendChild(document.createElement('br'))\n var button = document.createElement('button')\n button.style.padding = mods.ui.padding\n button.style.margin = 1\n button.appendChild(document.createTextNode(text))\n div.appendChild(button)\n\n return button\n }\n\n function make_checkbox_input(div, prefix) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(prefix + ': '))\n var checkbox = document.createElement('input')\n checkbox.type = 'checkbox'\n div.appendChild(checkbox)\n\n return checkbox\n }\n\n function make_text_display(div, prefix) {\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode(prefix + ': '))\n var span = document.createElement('span')\n span.innerHTML = ''\n div.appendChild(span)\n\n return span\n }\n\n //\n // return values\n //\n return ({\n mod: mod,\n name: name,\n init: init,\n inputs: inputs,\n outputs: outputs,\n interface: interface\n })\n}())","top":"272.65519173158043","left":"1544.9825922895632","inputs":{},"outputs":{}}},"links":["{\"source\":\"{\\\"id\\\":\\\"0.6064355364731827\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"line\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6459714071906415\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"gcode\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8432772280795903\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packet\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.550468040422489\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetOne\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.550468040422489\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packetOne\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.8432772280795903\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"ack\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.12892300269908796\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"reset\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.550468040422489\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetOne\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8760539425525505\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"lineAdvance\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.6064355364731827\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"lineRequest\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.014676456915753922\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packet\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.550468040422489\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetThree\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.550468040422489\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"packetThree\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.014676456915753922\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"ack\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.6459714071906415\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"instruction\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"newMove\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8760539425525505\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"singleInstruction\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"newMove\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8432772280795903\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.014676456915753922\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"acknowledgement\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8760539425525505\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"sequenceControl\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"sequenceControl\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"plannedMove\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.8432772280795903\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"block\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"plannedMove\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.014676456915753922\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"block\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.4370306155232835\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"moveComplete\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.8760539425525505\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"lineComplete\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.12892300269908796\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"reset\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.550468040422489\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"packetThree\\\"}\"}"]} \ No newline at end of file -- GitLab