From 724e436417a7b39b6c695d4b44abbbe6fbd4b04a Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sat, 22 Jan 2022 23:20:35 -0600 Subject: [PATCH 01/39] Start of touchscreen button class. --- .vscode/arduino.json | 2 +- .vscode/c_cpp_properties.json | 2 +- Configuration.h | 3 ++ SphereBot.ino | 22 ++++++++++- TouchscreenButton.cpp | 70 +++++++++++++++++++++++++++++++++++ TouchscreenButton.h | 36 ++++++++++++++++++ 6 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 TouchscreenButton.cpp create mode 100644 TouchscreenButton.h diff --git a/.vscode/arduino.json b/.vscode/arduino.json index edb2bc5..3d744d2 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,6 +1,6 @@ { "sketch": "SphereBot.ino", "board": "arduino:avr:mega", - "port": "COM6", + "port": "COM3", "configuration": "cpu=atmega2560" } \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 28cdd91..439e1bc 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -49,7 +49,7 @@ "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src", "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library", "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_ILI9341", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\arduino_705536\\src", + "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\SdFat_-_Adafruit_Fork\\src", "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_FT6206_Library", "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_ImageReader_Library", "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_SPIFlash\\src", diff --git a/Configuration.h b/Configuration.h index 912be91..6b75b65 100644 --- a/Configuration.h +++ b/Configuration.h @@ -36,6 +36,9 @@ // The display uses hardware SPI, plus #9 & #10. #define TFT_CS 10 #define TFT_DC 9 +#define TFT_ROTATION 3 +#define TFT_HEIGHT 240 +#define TFT_WIDTH 320 #define FT6206_THRESSHOLD 0x80 // Splash screen display delay in milliseconds. diff --git a/SphereBot.ino b/SphereBot.ino index e843b56..04d0ffe 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -128,6 +128,7 @@ in the "Configuration.h" file. // the FT6206 capacitive touch driver chip. #include #include // Image-reading functions. +#include "TouchscreenButton.h" #endif // DualStepper Library for Adafruit Motor Shield @@ -273,7 +274,7 @@ void setup() if (ts.begin(FT6206_THRESSHOLD)) { tft.begin(); - tft.setRotation(3); + tft.setRotation(TFT_ROTATION); tft.fillScreen(ILI9341_BLACK); serialMode = false; @@ -295,6 +296,25 @@ void setup() delay(SPLASH_SCREEN_DELAY); tft.fillScreen(ILI9341_BLACK); + // Test Button + TouchscreenButton usb = TouchscreenButton(20, 20, 40, 40, 320, 240, TFT_ROTATION, "/splash.bmp"); + usb.Display(reader, tft); + + bool stayInLoop = true; + while (stayInLoop) + { + if (ts.touched()) + { + TS_Point p = ts.getPoint(); + Serial.print(p.x); + Serial.print(" "); + Serial.println(p.y); + stayInLoop = !usb.Touched(p.x, p.y); + } + } + + tft.fillScreen(ILI9341_BLACK); + // Prompt for operation mode (Serial/USB or SD Card) } } diff --git a/TouchscreenButton.cpp b/TouchscreenButton.cpp new file mode 100644 index 0000000..ae6104c --- /dev/null +++ b/TouchscreenButton.cpp @@ -0,0 +1,70 @@ +/* +TouchscreenButton.h - Library for touchscreen button functions. +Created by Terence F. Golla, September 19, 2021 +Released into the public domain. +*/ + +#include "TouchscreenButton.h" + +// Constructor +TouchscreenButton::TouchscreenButton(unsigned int x, unsigned int y, + unsigned int width, unsigned int height, unsigned int tftWidth, unsigned int tftHeight, + unsigned int rotation, char *imageFilename) +{ + _x = x; // Horizontal offset. + _y = y; // Vertical offset. + _width = width; + _height = height; + _tftWidth = tftWidth; + _tftHeight = tftHeight; + _rotation = rotation; + _imageFilename = imageFilename; +} + +void TouchscreenButton::Display(Adafruit_ImageReader &reader, Adafruit_SPITFT &tft) +{ + ImageReturnCode stat = reader.drawBMP(_imageFilename, tft, _x, _y); +} + +boolean TouchscreenButton::Touched(unsigned int x, unsigned int y) +{ + // Adjust for the fact that the touch coordinates do not rotate like the image. + unsigned int adjustedX; + unsigned int adjustedY; + + switch (_rotation) + { + case 1: + adjustedX = _tftWidth - y; + adjustedY = x; + break; + case 2: + adjustedX = x; + adjustedY = y; + break; + case 3: + adjustedX = y; + adjustedY = _tftHeight - x; + break; + case 4: + adjustedX = _tftWidth - y; + adjustedY = _tftHeight - x; + break; + } + + Serial.print(adjustedX); + Serial.print("-"); + Serial.println(adjustedY); + + if (adjustedX < _x || adjustedX > (_x + _width - 1)) + { + return false; + } + + if (adjustedY < _y || adjustedY > (_y + _height - 1)) + { + return false; + } + + return true; +} \ No newline at end of file diff --git a/TouchscreenButton.h b/TouchscreenButton.h new file mode 100644 index 0000000..0081431 --- /dev/null +++ b/TouchscreenButton.h @@ -0,0 +1,36 @@ +/* +TouchscreenButton.h - Library for touchscreen button functions. +Created by Terence F. Golla, September 19, 2021 +Released into the public domain. +*/ + +#ifndef TouchscreenButton_h +#define TouchscreenButton_h + +#include +// This contains the low-level code specific to the TFT display. +#include +#include +#include // Image-reading functions. + +class TouchscreenButton +{ + public: + TouchscreenButton(unsigned int x, unsigned int y, + unsigned int width, unsigned int height, unsigned int tftWidth, unsigned int tftHeight, + unsigned int rotate, char *imageFilename); + void Display(Adafruit_ImageReader &reader, Adafruit_SPITFT &tft); + boolean Touched(unsigned int x, unsigned int y); + + private: + unsigned int _x; // Button's x coordinate. + unsigned int _y; // Button's y coordinate. + unsigned int _width; // Button's width. + unsigned int _height; // Button's height. + unsigned int _tftWidth; // Screen width; + unsigned int _tftHeight; // Screen height. + unsigned int _rotation; // The button's rotation. Correlates with the touchscreen rotation. + char *_imageFilename; // The buttton's image bmp filename. +}; + +#endif \ No newline at end of file From e7a9b2a602c750638cd73e0155e704d5b68e3742 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Mon, 24 Jan 2022 19:46:39 -0600 Subject: [PATCH 02/39] Moved images. --- .vscode/c_cpp_properties.json | 48 +++++++++++++++++++++++++--------- SD/images/SDCard.bmp | Bin 0 -> 118550 bytes SD/images/USB.bmp | Bin 0 -> 96950 bytes SD/{ => images}/splash.bmp | Bin SphereBot.ino | 2 +- 5 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 SD/images/SDCard.bmp create mode 100644 SD/images/USB.bmp rename SD/{ => images}/splash.bmp (100%) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 439e1bc..37ffea7 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -22,7 +22,8 @@ "cStandard": "c17", "cppStandard": "c++17", "defines": [ - "USBCON" + "USBCON", + "ARDUINO=10819" ] }, { @@ -41,21 +42,38 @@ "includePath": [ "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino", "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\mega", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_Motor_Shield_V2_Library", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_Motor_Shield_V2_Library", + "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\Wire\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\GCodeParser\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\EEPROMTyped\\src", + "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\EEPROM\\src", + "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ILI9341", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\SdFat_-_Adafruit_Fork\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_FT6206_Library", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ImageReader_Library", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_SPIFlash\\src", + "C:\\Program Files (x86)\\Arduino\\libraries\\Servo\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_BusIO", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_EPD\\src", + "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino", + "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\mega", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_Motor_Shield_V2_Library", "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\Wire\\src", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\GCodeParser\\src", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\EEPROMTyped\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\GCodeParser\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\EEPROMTyped\\src", "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\EEPROM\\src", "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_ILI9341", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\SdFat_-_Adafruit_Fork\\src", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_FT6206_Library", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_ImageReader_Library", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_SPIFlash\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ILI9341", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\SdFat_-_Adafruit_Fork\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_FT6206_Library", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ImageReader_Library", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_SPIFlash\\src", "C:\\Program Files (x86)\\Arduino\\libraries\\Servo\\src", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_BusIO", - "C:\\Users\\tgoll\\Documents\\Arduino\\libraries\\Adafruit_EPD\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_BusIO", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_EPD\\src", "c:\\program files (x86)\\arduino\\hardware\\tools\\avr\\lib\\gcc\\avr\\7.3.0\\include", "c:\\program files (x86)\\arduino\\hardware\\tools\\avr\\lib\\gcc\\avr\\7.3.0\\include-fixed", "c:\\program files (x86)\\arduino\\hardware\\tools\\avr\\avr\\include" @@ -67,7 +85,11 @@ "cppStandard": "c++11", "defines": [ "F_CPU=16000000L", - "ARDUINO=10813", + "ARDUINO=10819", + "ARDUINO_AVR_MEGA2560", + "ARDUINO_ARCH_AVR", + "F_CPU=16000000L", + "ARDUINO=10819", "ARDUINO_AVR_MEGA2560", "ARDUINO_ARCH_AVR", "__DBL_MIN_EXP__=(-125)", diff --git a/SD/images/SDCard.bmp b/SD/images/SDCard.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ea01e36d72152fe3ff24fc5ba81e028071cd272f GIT binary patch literal 118550 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 Date: Mon, 24 Jan 2022 20:29:51 -0600 Subject: [PATCH 03/39] Corrected images to 24-bit and added prompt code. --- .vscode/c_cpp_properties.json | 21 --------------------- SD/images/SDCard.bmp | Bin 118550 -> 88854 bytes SD/images/USB.bmp | Bin 96950 -> 72854 bytes SphereBot.ino | 29 +++++++++++++++++++---------- 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 37ffea7..9732203 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -40,23 +40,6 @@ ], "intelliSenseMode": "gcc-x64", "includePath": [ - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\mega", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_Motor_Shield_V2_Library", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\Wire\\src", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\GCodeParser\\src", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\EEPROMTyped\\src", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\EEPROM\\src", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ILI9341", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\SdFat_-_Adafruit_Fork\\src", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_FT6206_Library", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ImageReader_Library", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_SPIFlash\\src", - "C:\\Program Files (x86)\\Arduino\\libraries\\Servo\\src", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_BusIO", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_EPD\\src", "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino", "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\mega", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_Motor_Shield_V2_Library", @@ -84,10 +67,6 @@ "cStandard": "c11", "cppStandard": "c++11", "defines": [ - "F_CPU=16000000L", - "ARDUINO=10819", - "ARDUINO_AVR_MEGA2560", - "ARDUINO_ARCH_AVR", "F_CPU=16000000L", "ARDUINO=10819", "ARDUINO_AVR_MEGA2560", diff --git a/SD/images/SDCard.bmp b/SD/images/SDCard.bmp index ea01e36d72152fe3ff24fc5ba81e028071cd272f..68004a0d6d06cd9449b50a38bc27339961072fe3 100644 GIT binary patch literal 88854 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 literal 118550 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 literal 96950 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 Date: Mon, 18 Apr 2022 00:36:39 -0500 Subject: [PATCH 04/39] Added AlphabeticSDFileList with test. --- .vscode/c_cpp_properties.json | 23 ++--- AlphabeticSDFileList.cpp | 158 ++++++++++++++++++++++++++++++++++ AlphabeticSDFileList.h | 34 ++++++++ SphereBot.ino | 71 +++++++++++++-- 4 files changed, 269 insertions(+), 17 deletions(-) create mode 100644 AlphabeticSDFileList.cpp create mode 100644 AlphabeticSDFileList.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 9732203..8a26091 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -28,8 +28,9 @@ }, { "name": "Arduino", - "compilerPath": "C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr\\bin\\avr-g++", + "compilerPath": "C:\\Users\\tgoll\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\bin\\avr-g++", "compilerArgs": [ + "-w", "-std=gnu++11", "-fpermissive", "-fno-exceptions", @@ -40,29 +41,29 @@ ], "intelliSenseMode": "gcc-x64", "includePath": [ - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\mega", + "C:\\Users\\tgoll\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.5\\cores\\arduino", + "C:\\Users\\tgoll\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.5\\variants\\mega", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_Motor_Shield_V2_Library", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\Wire\\src", + "C:\\Users\\tgoll\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.5\\libraries\\Wire\\src", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\GCodeParser\\src", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\EEPROMTyped\\src", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\EEPROM\\src", - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src", + "C:\\Users\\tgoll\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.5\\libraries\\EEPROM\\src", + "C:\\Users\\tgoll\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.5\\libraries\\SPI\\src", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ILI9341", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\SdFat_-_Adafruit_Fork\\src", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_FT6206_Library", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ImageReader_Library", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_SPIFlash\\src", - "C:\\Program Files (x86)\\Arduino\\libraries\\Servo\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Servo\\src", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_BusIO", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_EPD\\src", - "c:\\program files (x86)\\arduino\\hardware\\tools\\avr\\lib\\gcc\\avr\\7.3.0\\include", - "c:\\program files (x86)\\arduino\\hardware\\tools\\avr\\lib\\gcc\\avr\\7.3.0\\include-fixed", - "c:\\program files (x86)\\arduino\\hardware\\tools\\avr\\avr\\include" + "c:\\users\\tgoll\\appdata\\local\\arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\lib\\gcc\\avr\\7.3.0\\include", + "c:\\users\\tgoll\\appdata\\local\\arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\lib\\gcc\\avr\\7.3.0\\include-fixed", + "c:\\users\\tgoll\\appdata\\local\\arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\avr\\include" ], "forcedInclude": [ - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h" + "C:\\Users\\tgoll\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.5\\cores\\arduino\\Arduino.h" ], "cStandard": "c11", "cppStandard": "c++11", diff --git a/AlphabeticSDFileList.cpp b/AlphabeticSDFileList.cpp new file mode 100644 index 0000000..2fcb20e --- /dev/null +++ b/AlphabeticSDFileList.cpp @@ -0,0 +1,158 @@ +/* +AlphabeticSDFileList.h - Library for listing SD files in a directory on alphabetic order. +Created by Terence F. Golla, April 17, 2022 +Released into the public domain. +*/ + +#include "AlphabeticSDFileList.h" + +AlphabeticSDFileList::AlphabeticSDFileList(SdFat &SD, char *directory, bool contiguous) +{ + AlphabeticSDFileList::SD = &SD; + AlphabeticSDFileList::contiguous = contiguous; + AlphabeticSDFileList::directory = directory; + + FindFirstAndLast(); +} + +void AlphabeticSDFileList::FindFirstAndLast() +{ + strcpy(first, ""); + strcpy(last, ""); + strcpy(current, ""); + + char filename[DEFAULT_FILE_NAME_SIZE]; + + File directoryFile = SD->open(directory); + + while (true) { + File file = directoryFile.openNextFile(); + + if (!file) { + // no more files + break; + } + + file.getName(filename, DEFAULT_FILE_NAME_SIZE); + + if (!file.isDirectory()) { + if (strcmp(first, "") == 0) { + strcpy(first, filename); + } + else { + if (strcmp(filename, first) < 0) { + strcpy(first, filename); + } + else { + if (strcmp(filename, last) > 0) { + strcpy(last, filename); + } + } + } + } + + file.close(); + } +} + +char* AlphabeticSDFileList::First() +{ + return first; +} + +char* AlphabeticSDFileList::Last() +{ + return last; +} + +char* AlphabeticSDFileList::Current() +{ + return current; +} + +char* AlphabeticSDFileList::Previous() +{ + char filename[DEFAULT_FILE_NAME_SIZE]; + char previous[DEFAULT_FILE_NAME_SIZE]; + + strcpy(previous, ""); + + if (strcmp(current, "") == 0) + strcpy(current, "\x7F"); + + File directoryFile = SD->open(directory); + + while (true) { + File file = directoryFile.openNextFile(); + + if (!file) { + // no more files + break; + } + + file.getName(filename, DEFAULT_FILE_NAME_SIZE); + + if (!file.isDirectory()) { + if (strcmp(filename, current) < 0) { + if (strcmp(previous, "") == 0) { + strcpy(previous, filename); + } + else { + if (strcmp(filename, previous) > 0) { + strcpy(previous, filename); + } + } + } + } + + file.close(); + } + + if (contiguous && strcmp(previous, "") == 0) + strcpy(previous, last); + + strcpy(current, previous); + return current; +} + +char* AlphabeticSDFileList::Next() +{ + char filename[DEFAULT_FILE_NAME_SIZE]; + char next[DEFAULT_FILE_NAME_SIZE]; + + strcpy(next, ""); + + File directoryFile = SD->open(directory); + + while (true) { + File file = directoryFile.openNextFile(); + + if (!file) { + // no more files + break; + } + + file.getName(filename, DEFAULT_FILE_NAME_SIZE); + + if (!file.isDirectory()) { + if (strcmp(filename, current) > 0) { + if (strcmp(next, "") == 0) { + strcpy(next, filename); + } + else { + if (strcmp(filename, next) < 0) { + strcpy(next, filename); + } + } + } + } + + file.close(); + } + + if (contiguous && strcmp(next, "") == 0) + strcpy(next, first); + + strcpy(current, next); + return current; +} diff --git a/AlphabeticSDFileList.h b/AlphabeticSDFileList.h new file mode 100644 index 0000000..98f155d --- /dev/null +++ b/AlphabeticSDFileList.h @@ -0,0 +1,34 @@ +/* +AlphabeticSDFileList.h - Library for listing SD files in a directory on alphabetic order. +Created by Terence F. Golla, April 17, 2022 +Released into the public domain. +*/ + +#ifndef AlphabeticSDFileList_h +#define AlphabeticSDFileList_h + +#include +#include // SD card & FAT filesystem library. + +#define DEFAULT_FILE_NAME_SIZE 32 + +class AlphabeticSDFileList +{ + public: + AlphabeticSDFileList(SdFat &SD, char *directory, bool contiguous); + char* First(); + char* Last(); + char* Current(); + char* Previous(); + char* Next(); + private: + SdFat *SD; + char first[DEFAULT_FILE_NAME_SIZE]; + char last[DEFAULT_FILE_NAME_SIZE]; + char current[DEFAULT_FILE_NAME_SIZE]; + bool contiguous; + char* directory; + void FindFirstAndLast(); +}; + +#endif \ No newline at end of file diff --git a/SphereBot.ino b/SphereBot.ino index a532799..61c3b0c 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -123,12 +123,13 @@ in the "Configuration.h" file. #include // Core Graphics Library // This contains the low-level code specific to the TFT display. #include -#include // SD card & FAT filesystem library. +#include // SD card & FAT filesystem library. Adafruit Fork https://github.com/adafruit/SdFat // Controller library which does all the low level chatting with // the FT6206 capacitive touch driver chip. #include #include // Image-reading functions. #include "TouchscreenButton.h" +#include "AlphabeticSDFileList.h" #endif // DualStepper Library for Adafruit Motor Shield @@ -238,7 +239,7 @@ boolean serialMode = true; GCodeParser GCode = GCodeParser(); #if ADAFRUIT_TFT_TOUCH_SHIELD == true -SdFat SD; // SD card filesystem. +SdFat SD; // SD card filesystem. Adafruit_ImageReader reader(SD); // Image-reader object, pass in SD. // Instantiate class for TFT screen and Touchscreen @@ -317,14 +318,72 @@ void setup() tft.fillScreen(ILI9341_BLACK); // Test message... - tft.setCursor(20, 20); + tft.setCursor(0, 0); tft.setTextColor(ILI9341_WHITE); - tft.setTextSize(10); + tft.setTextSize(1); if (serialMode) tft.print("USB"); - else - tft.print("SD"); + else { + AlphabeticSDFileList alphabeticSDFileList = AlphabeticSDFileList(SD, "/gcode", false); + tft.println("Contiguous: true"); + tft.print("First: "); + tft.println(alphabeticSDFileList.First()); + tft.print("Last: "); + tft.println(alphabeticSDFileList.Last()); + tft.print("Current: "); + tft.println(alphabeticSDFileList.Current()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.println(); + + alphabeticSDFileList = AlphabeticSDFileList(SD, "/gcode", true); + tft.println("Contiguous: false"); + tft.print("First: "); + tft.println(alphabeticSDFileList.First()); + tft.print("Last: "); + tft.println(alphabeticSDFileList.Last()); + tft.print("Current: "); + tft.println(alphabeticSDFileList.Current()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Next: "); + tft.println(alphabeticSDFileList.Next()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + tft.print("Previous: "); + tft.println(alphabeticSDFileList.Previous()); + } } } #endif From 159807f39b2a6358b8be1ac49e1dcc821e494af0 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Mon, 18 Apr 2022 16:58:39 -0500 Subject: [PATCH 05/39] Adding menu button images. --- SD/images/information.bmp | Bin 0 -> 4854 bytes SD/images/next.bmp | Bin 0 -> 4854 bytes SD/images/previous.bmp | Bin 0 -> 4854 bytes SD/images/print.bmp | Bin 0 -> 4854 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 SD/images/information.bmp create mode 100644 SD/images/next.bmp create mode 100644 SD/images/previous.bmp create mode 100644 SD/images/print.bmp diff --git a/SD/images/information.bmp b/SD/images/information.bmp new file mode 100644 index 0000000000000000000000000000000000000000..df647e7e06221d0b61234c27b44ab8c4b7a193dd GIT binary patch literal 4854 zcmc(j&ubGw6vsD3E1m?sXa(`dMeyz);N6Qi@8U%f{6SH~BqpIY4Na;QD^1l_tA(~= z(TY;=7fnq>g@6aes#UB=4GA%}v9)Q|?<8b+o!y45`->a3 zO4^I}Zu0YJo2w0Y7x#E7zgmUvER}V=WbvS>{;6Cpzk4&@8#$5mZk;^8E+6rfE@^m> zK@pW`f&j$o#m;9ly^)h&f{prR&Gz{mXoN6SRzm-`FyGgHD%a+*#R&pXfg;ph&_ASK zzW1*e3_2=89Y!3X$A+%XwmTlCu~#qxQ;O)3>#bNYMkDTOUQ(3LigET3n>xt&qi>I|_wVW+F?Q)Zl`bn2-siwXcCxD+@UDqxk* zhCKwUJLSSG1Jx2f7yO$QOQ@fo`dHJ`=l&GtW6pLQK-`DJp9{t%MPW0heH$dgrcDgT zQW>GdRKT=y!nci&7a43QQ!z;;!|5!ZB8o}Ggr;n`f$k$0Q_OIcAdUbk7?&4ck3Z%^ zUMiJ-U1*TY3#|-S;UabmP4Xi9wj?EdJLK|0E5lW|P91X6yMM~S#e#ZyiM7eX-Y&sm-+cMWbc_N zm#-`Jee^e`VRDDN1FxPxOg(#Wr}L~+C^}HvN6!2P?YX;r&2Q+A{G>Y;)vEbP9gbS@ zcuducQSFNV(3AW9cjKYSfU4&Kh{pvi55+jhx#dpn#po@*#(w8Aian=s5bBC?pL0K9 zfXmah)?>WYDr1cMu;FMMve7M1@s=Z2I9_i&=fH;IxsDqd8|>ob?97kvp*6h8G-GwH zgAv7ZY}M>ShZb!ECm2-O)y(;$U*jBiu3H;Yw*3AyzH`s{e&79d&b@X&IP8p^+^4*E?pKQL zXanW?ZT-cH)2l7bW^-k6wpM;J|Gew_;Enxq>0~V8p~5RlnlQlZvih;Vw^J)W{rRHf zbUZ42FvA#^cG!=PkESYpdn2Vnx`Y8PIO5&{`}*?y+Q6*@;Ktz1N`FtiR-OCwer4$k z4;5Zf(v&d99gquA&(tRx)j!=ls7B@fM;l)k@o|b>-0>=K-0NQ8^Q7i;i3xjOHSe^3s_m8!$ zm)C9F{HX=jjW$FU!-?kxRTvz$HdkAq7T9=}h0Y17M3oZjJfubHIFJgR6SA1{5@tPU z#iRvl0e4*%IwvGh)ezxT<5LRt&^2|WESzfrcf3O9gxswfl8XnhYf3Kcg(#mP{4fz1>o55gNN??WBroC9yD za~;${&avH}=9x zJNIs-rX-{g&Fp}kPkJf;XE16i#BkCFnTw=JzUHXFDTRj$uPAB4z|Q37eXmsg3=nbH AjsO4v literal 0 HcmV?d00001 diff --git a/SD/images/previous.bmp b/SD/images/previous.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0c978a580f1e3ad564927c94164b269fd79f092e GIT binary patch literal 4854 zcmd6r&r4KM6vy8{YA)Ki5`xzL1^xl;U9_uzp^a4Fu0&I?W(Fc!7|2NL0jWiS;3|J? zoFJ0?5&dAIU5SecQHZh6xrcXr^BCWq=cw1io9BJ!p7Z_QpXc1`&5`|q$jLD8p~SBc z4Qd7Nt!w&=6-Sp_n$6}$ZMjmsxAy4zmx;c;V&UKOh=&57D5=5#v$N{Q-tO;8@&5P8 z-lG?h_rVNfT)JUDJUo~$J=lF(@Y1CWaKRDxQ?PG+T-zM)PXTUETrG{=saDFXOK&zl ztng6a6D3tCW84ABMZH*^ZIq9@`L`Su$8K+bTF(Z-05goO0e}FN?PawKl^GU{`L2%N z`1NDQYP|)FaWQwG0Q7p%JR_y$uV0nCE^Q5Pw2lLq-D{@9hWF2tLhb$AwwN6%aR)>@ z4(v&D&GNH_L{qyY)wTg*y#~DP3TNfpq~sdjch$N1XAc{VM%!@^sCeTGMXRvWZJ)}j z=vZD(-&NS@(OV}u*)oG76;cQ?>dvrqzIu%m-;CA*XrnDeu@F=(46*@ZwdZe=v_94I z^V?>IgTT7chR9+#@m!U>y}?1jQ>68;pEF3Q64-c_h0Y17M3oZjI*`1i3Tc5<=$w$n zl$S8;r9B-fumbM7EObstpsFFlXY;m@KEC1|-XxlUJ6@r4Lhe=#$t7u-Dz}hM_2eQ2 zO28ej&^fVyOkPWI+2{K5qI&VJ=j^G12)N@FIwzrcLydE&brotKg^C-Y;$*12z-9`P z2jLBs_n{7Q&Ve`7xen?e=U8}=Am?_a4suUXYItun-2qKU&7=YM|R&IbSLNbS-y|*r( zT2bq?qS_W8s&xV?gINnrR}|U{H;s4(+5SCKEA;itr>|c=lZ8G3wF85c4F3Xk0n2u> z5hNZ-vUhi#7IN%U!Uh?I1n{S;5AWY?nOnDMW(9=^Xb8|KBy0cUw-;F@b=kw%-fdIT z&(#ZVpPqvpVzl<}ovUa5O$L>3!0hng_7%9*w6^!*ooj! Date: Sun, 1 May 2022 14:40:08 -0500 Subject: [PATCH 06/39] Added next and previous buttons. --- SphereBot.ino | 238 ++++++++++++++++++++++++-------------------------- 1 file changed, 115 insertions(+), 123 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 61c3b0c..35eadfb 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -17,69 +17,69 @@ along with this program. If not, see Part of this code is based on/inspired by the Helium Frog Delta Robot Firmware by Martin Price -2015-2016 the code was modified to run on an Adafruit Motor Shield V2 +2015-2016 the code was modified to run on an Adafruit Motor Shield V2 by Jin Choi . 2016 code support for the Adafruit Motor Shield V1 was added by GrAndAG. -3/2021 the code was modified with the following improvements +3/2021 the code was modified with the following improvements by Terence Golla (tgolla). - + - Corrected the naming convention mix of snake_case and camelCase for more prominent C/C++ Arduino software use of camelCase. - + - Restructured the ino software file to follow Arduino styling... - - Begin with a set of comments clearly describing the purpose and + - Begin with a set of comments clearly describing the purpose and assumptions of the code. - Import any required library headers. - Define constants. - Define global variables. - Define setup() and loop(). - Define subroutines (functions). - + - Expanded in code documentation (comments). - Modified code to operate servo installed in reverse. - + - A true to G-Code specification parser was added. The class was developed using Visual Studio Community (https://visualstudio.microsoft.com/vs/community/) - and the Microsoft Unit Testing Framework for C++ + and the Microsoft Unit Testing Framework for C++ (https://docs.microsoft.com/en-us/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2019). - Added the following new M-Codes to allow for increased flexibility - controlling the pen servo. - + controlling the pen servo. + M304 - Sets the pen down position needed for new MZ mode. - M305 - Sets the G-Code responsible for operating the pen servo. + M305 - Sets the G-Code responsible for operating the pen servo. P0 - M300 sets the pen height. P1 - G0, G1, G2 & G3 Z parameter is responsible for setting the pen height. P2 - Automatically - detects which code is responsible for setting the pen height. + detects which code is responsible for setting the pen height. M306 - Sets the M300 height adjustment. P0 - Off, P1 - Preset, P2 - Calculated M307 - Sets the Z height adjustment. P0 - Off, P1 - Preset, P2 - Calculated - M308 - Sets the M300 pen up preset value. S values less than the value + M308 - Sets the M300 pen up preset value. S values less than the value move the pen down. - M309 - Sets the Z pen up preset value. Z values less than the value + M309 - Sets the Z pen up preset value. Z values less than the value move the pen down. - M310 - Sets the XY feedrate preset value. If zero feedrate is initalized with + M310 - Sets the XY feedrate preset value. If zero feedrate is initalized with default value and set through G0, G1, G2 & G3 codes with X or Y values - by Fxxx. - M311 - Sets the pen feedrate preset value. If zero feedrate is initalized with + by Fxxx. + M311 - Sets the pen feedrate preset value. If zero feedrate is initalized with default value and set through the M300 Fxxx or G0, G1, G2 & G3 codes with only Z values by Fxxx. - M312 - Sets the pen up feedrate multiplier. One means the pen will go up at the - same speed (degrees/second) as it goes down. Each increase by one will + M312 - Sets the pen up feedrate multiplier. One means the pen will go up at the + same speed (degrees/second) as it goes down. Each increase by one will logarithmically double the pen up speed. M999 - Debugging command. To add define DEBUG true in configuration.h. Note: In an Arduino Uno configuration do not add unless necessary as the code consumes a large portion of dynamic memory. - - Added the ability to set the pen feedrate with the M300 Fxxx or G0, G1, G2 & G3 + - Added the ability to set the pen feedrate with the M300 Fxxx or G0, G1, G2 & G3 codes with only Z values by Fxxx. - - Corrected pen up/down (feedrate was reversed) and changed feedrate to + - Corrected pen up/down (feedrate was reversed) and changed feedrate to degrees/second. -Future feature enhancements are planned to add a touchscreen control, SD card reader +Future feature enhancements are planned to add a touchscreen control, SD card reader support and audio alerts. This sketch needs the following non-standard library which can be installed with the @@ -89,7 +89,7 @@ G-Code Parser Library https://github.com/tgolla/GCodeParser EEPROM Typed Library - https://github.com/tgolla/EEPROMTyped + https://github.com/tgolla/EEPROMTyped Adafruit Motor Shield (select appropriate version ): v1: https://github.com/adafruit/Adafruit-Motor-Shield-library @@ -97,18 +97,18 @@ Adafruit Motor Shield (select appropriate version ): Adafruit ILI9341 Arduino Library https://github.com/adafruit/Adafruit_ILI9341 - + Adafruit GFX Library https://github.com/adafruit/Adafruit-GFX-Library - + Adafruit ImageReader Arduino Library https://github.com/adafruit/Adafruit_ImageReader - + Adafruit_FT6206 Library https://github.com/adafruit/Adafruit_FT6206_Library - -Be sure to review and make appropriate modification to global constants -in the "Configuration.h" file. + +Be sure to review and make appropriate modification to global constants +in the "Configuration.h" file. */ #include "Configuration.h" @@ -239,9 +239,12 @@ boolean serialMode = true; GCodeParser GCode = GCodeParser(); #if ADAFRUIT_TFT_TOUCH_SHIELD == true -SdFat SD; // SD card filesystem. +SdFat SD; // SD card filesystem. Adafruit_ImageReader reader(SD); // Image-reader object, pass in SD. +// Create an alphebetic gcode file list that rotates forward and backwards through files. +AlphabeticSDFileList alphabeticSDFileList = AlphabeticSDFileList(SD, "/gcode", true); + // Instantiate class for TFT screen and Touchscreen Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); Adafruit_FT6206 ts = Adafruit_FT6206(); @@ -288,9 +291,9 @@ void setup() tft.setCursor(10, 10 + (8 * 5) + 2); tft.setTextSize(2); tft.print("An EggBot Clone"); - tft.setCursor(10, 10 + (8 * 5)+ 2 + (8 * 2) + 4); + tft.setCursor(10, 10 + (8 * 5) + 2 + (8 * 2) + 4); tft.setTextSize(1); - tft.print("v1.1"); + tft.print("v1.2"); delay(SPLASH_SCREEN_DELAY); tft.fillScreen(ILI9341_WHITE); @@ -301,89 +304,33 @@ void setup() usb.Display(reader, tft); sdcard.Display(reader, tft); - bool stayInLoop = true; - while (stayInLoop) + bool waitingOnButtomPress = true; + while (waitingOnButtomPress) { if (ts.touched()) { TS_Point p = ts.getPoint(); - + if (sdcard.Touched(p.x, p.y)) serialMode = false; - stayInLoop = !(usb.Touched(p.x, p.y) || sdcard.Touched(p.x, p.y)); + waitingOnButtomPress = !(usb.Touched(p.x, p.y) || sdcard.Touched(p.x, p.y)); } } - - tft.fillScreen(ILI9341_BLACK); + + // tft.fillScreen(ILI9341_BLACK); // Test message... - tft.setCursor(0, 0); - tft.setTextColor(ILI9341_WHITE); - tft.setTextSize(1); + // tft.setCursor(0, 0); + // tft.setTextColor(ILI9341_WHITE); + // tft.setTextSize(20); - if (serialMode) - tft.print("USB"); - else { - AlphabeticSDFileList alphabeticSDFileList = AlphabeticSDFileList(SD, "/gcode", false); - tft.println("Contiguous: true"); - tft.print("First: "); - tft.println(alphabeticSDFileList.First()); - tft.print("Last: "); - tft.println(alphabeticSDFileList.Last()); - tft.print("Current: "); - tft.println(alphabeticSDFileList.Current()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.println(); - - alphabeticSDFileList = AlphabeticSDFileList(SD, "/gcode", true); - tft.println("Contiguous: false"); - tft.print("First: "); - tft.println(alphabeticSDFileList.First()); - tft.print("Last: "); - tft.println(alphabeticSDFileList.Last()); - tft.print("Current: "); - tft.println(alphabeticSDFileList.Current()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Next: "); - tft.println(alphabeticSDFileList.Next()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - tft.print("Previous: "); - tft.println(alphabeticSDFileList.Previous()); - } + // if (serialMode) + // tft.print("USB"); + // else { + + // tft.fillRect(0, 220, 320, 20, ILI9341_BLACK); + // } } } #endif @@ -412,7 +359,52 @@ void loop() #if ADAFRUIT_TFT_TOUCH_SHIELD else { - // SD file + // Start at first file. + if (alphabeticSDFileList.Current() == "") + alphabeticSDFileList.Next(); + + // Create menu buttons. + TouchscreenButton next = TouchscreenButton(280, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/next.bmp"); + TouchscreenButton previous = TouchscreenButton(0, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/previous.bmp"); + + bool waitingOnFileSelection = true; + while (waitingOnFileSelection) + { + char *filename = alphabeticSDFileList.Current(); + + // Paint screen with design image/ + tft.fillScreen(ILI9341_BLACK); + // TODO: Paint image here. + tft.setCursor(0, 0); + tft.println(filename); + tft.fillRect(0, 200, 320, 40, ILI9341_WHITE); + next.Display(reader, tft); + previous.Display(reader, tft); + + // Select gcode file from SD to print. + bool waitingOnButtonPress = true; + while (waitingOnButtonPress) + { + if (ts.touched()) + { + TS_Point p = ts.getPoint(); + + if (next.Touched(p.x, p.y)) + { + alphabeticSDFileList.Next(); + waitingOnButtonPress = false; + } + + if (previous.Touched(p.x, p.y)) + { + alphabeticSDFileList.Previous(); + waitingOnButtonPress = false; + } + } + } + } + + // Print gcode file form SD. } #endif } @@ -521,15 +513,15 @@ void movePen(byte toPosition) // i.e. With a feedrate of 180 the pen moves 180 degrees in 1 second. // At a feedrate of 90 the pen moves 180 degrees in 2 second. // At a feedrate of 360 the pen moves 180 degrees in 1/2 second. - // Move the pen up based on the feedrate * multiplier. Each increase + // Move the pen up based on the feedrate * multiplier. Each increase // by one will logarithmically double the pen up speed. int penDelay; if (toPosition < currentPenPosition) penDelay = 1000 / penFeedrate; - else + else penDelay = 1000 / (penFeedrate * penUpFeedrateMultiplier); - + while (currentPenPosition != toPosition) { if (toPosition < currentPenPosition) @@ -539,7 +531,7 @@ void movePen(byte toPosition) servoWrite(currentPenPosition); delay(penDelay); - } + } } // Clamps a value between an lower and upper bound. @@ -558,7 +550,7 @@ void processCommand() double tempX = steppers->xPos(); double tempY = steppers->yPos(); - if (gCodeNumber >= 0 && gCodeNumber <= 3) //G0, G1, G2, G3 + if (gCodeNumber >= 0 && gCodeNumber <= 3) // G0, G1, G2, G3 { // If MZ active mode equals auto and a Z coordinate exist // set the MZ active mode to Z. @@ -686,7 +678,7 @@ void processCommand() } else if (GCode.HasWord('R')) { - //drawRadius(tempX, tempY, GCode.GetWordValue('R') * zoom, (gCodeNumber==2)); + // drawRadius(tempX, tempY, GCode.GetWordValue('R') * zoom, (gCodeNumber==2)); } break; @@ -860,7 +852,7 @@ void processCommand() // M310 - Sets the XY feedrate preset value. If zero feedrate is initalized // with default value and set through G0, G1, G2 & G3 codes with X or Y - // values by Fxxx. + // values by Fxxx. case 310: if (GCode.HasWord('P')) { @@ -875,7 +867,7 @@ void processCommand() // with default value and set through the M300 Fxxx or G0, G1, G2 & G3 codes // with only Z values by Fxxx. case 311: - if (GCode.HasWord('P')) + if (GCode.HasWord('P')) { presetPenFeedrate = GCode.GetWordValue('P'); @@ -884,18 +876,18 @@ void processCommand() } break; - // M312 - Sets the pen up feedrate multiplier. One means the pen will go up at the - // same speed (degrees/second) as it goes down. Each increase by one will + // M312 - Sets the pen up feedrate multiplier. One means the pen will go up at the + // same speed (degrees/second) as it goes down. Each increase by one will // logarithmically double the pen up speed. case 312: - if (GCode.HasWord('P')) + if (GCode.HasWord('P')) { penUpFeedrateMultiplier = GCode.GetWordValue('P'); if (penUpFeedrateMultiplier < 1) penUpFeedrateMultiplier = 1; } - break; + break; case 402: // M402 - Set global zoom factor. if (GCode.HasWord('S')) @@ -926,24 +918,24 @@ void processCommand() Serial.print(maxPenPosition); Serial.print(" ;M302 Pxxx - Maximun Pen Position: "); Serial.println(maxPenPosition); - + Serial.print("M303 P"); Serial.print(penUpPosition); Serial.print(" ;M303 Pxxx - Pen Up Position: "); Serial.println(penUpPosition); - + Serial.print("M304 P"); Serial.print(penDownPosition); Serial.print(" ;M304 Pxxx - Pen Down Position: "); Serial.println(penDownPosition); - + Serial.print("M305 P"); Serial.print(mzMode); Serial.print(" ;M305 Px - MZ Mode (0-M, 1-Z, 2-Auto): "); Serial.print(mzMode); Serial.print(" MZ Active Mode: "); Serial.println(mzActiveMode); - + Serial.print("M306 P"); Serial.print(mAdjust); Serial.print(" ;M306 Px - M Adjust (0-Off, 1-Preset, 2-Calculated): "); @@ -1005,15 +997,15 @@ void processCommand() Serial.print(" ;M312 Pxxx - Pen Up Feedrate Multiplier: "); Serial.println(penUpFeedrateMultiplier); - Serial.print("M500 ;Save pen configuration to EEPROM. Values Saved in EEPROM ("); + Serial.print("M500 ;Save pen configuration to EEPROM. Values Saved in EEPROM ("); Serial.print(EEPROM_MAGIC_NUMBER); Serial.print("): "); Serial.println(EEPROM.read(valueSavedEEPROMMemoryLocation)); - + Serial.println("M501 ;Load pen configuration from EEPROM (or defaults if cleared)."); Serial.println("M502 ;Clear pen configuration from EEPROM."); Serial.println("M18 ;Disable stepper motors."); - + Serial.println(); break; #endif From 9347efce9435711fa9dc96ce2858435965422589 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Mon, 2 May 2022 12:32:36 -0500 Subject: [PATCH 07/39] Modified alphabetic list with Begin(). --- AlphabeticSDFileList.cpp | 15 ++++++--------- AlphabeticSDFileList.h | 4 ++-- SphereBot.ino | 6 ++++-- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/AlphabeticSDFileList.cpp b/AlphabeticSDFileList.cpp index 2fcb20e..70e3b69 100644 --- a/AlphabeticSDFileList.cpp +++ b/AlphabeticSDFileList.cpp @@ -6,17 +6,14 @@ Released into the public domain. #include "AlphabeticSDFileList.h" -AlphabeticSDFileList::AlphabeticSDFileList(SdFat &SD, char *directory, bool contiguous) -{ - AlphabeticSDFileList::SD = &SD; - AlphabeticSDFileList::contiguous = contiguous; - AlphabeticSDFileList::directory = directory; - - FindFirstAndLast(); -} +AlphabeticSDFileList::AlphabeticSDFileList() { } -void AlphabeticSDFileList::FindFirstAndLast() +void AlphabeticSDFileList::Begin(SdFat &SdFat, char *directory, bool contiguous) { + AlphabeticSDFileList::SD = &SdFat; + AlphabeticSDFileList::contiguous = contiguous; + AlphabeticSDFileList::directory = directory; + strcpy(first, ""); strcpy(last, ""); strcpy(current, ""); diff --git a/AlphabeticSDFileList.h b/AlphabeticSDFileList.h index 98f155d..2d078c8 100644 --- a/AlphabeticSDFileList.h +++ b/AlphabeticSDFileList.h @@ -15,7 +15,8 @@ Released into the public domain. class AlphabeticSDFileList { public: - AlphabeticSDFileList(SdFat &SD, char *directory, bool contiguous); + AlphabeticSDFileList(); + void Begin(SdFat &SD, char *directory, bool contiguous); char* First(); char* Last(); char* Current(); @@ -28,7 +29,6 @@ class AlphabeticSDFileList char current[DEFAULT_FILE_NAME_SIZE]; bool contiguous; char* directory; - void FindFirstAndLast(); }; #endif \ No newline at end of file diff --git a/SphereBot.ino b/SphereBot.ino index 35eadfb..82f6f19 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -243,7 +243,7 @@ SdFat SD; // SD card filesystem. Adafruit_ImageReader reader(SD); // Image-reader object, pass in SD. // Create an alphebetic gcode file list that rotates forward and backwards through files. -AlphabeticSDFileList alphabeticSDFileList = AlphabeticSDFileList(SD, "/gcode", true); +AlphabeticSDFileList alphabeticSDFileList = AlphabeticSDFileList(); // Instantiate class for TFT screen and Touchscreen Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); @@ -275,6 +275,8 @@ void setup() // Look for SD and Touchscreen. if (SD.begin(SD_CS)) { + alphabeticSDFileList.Begin(SD, "/gcode", true); + if (ts.begin(FT6206_THRESSHOLD)) { tft.begin(); @@ -360,7 +362,7 @@ void loop() else { // Start at first file. - if (alphabeticSDFileList.Current() == "") + if (strcmp(alphabeticSDFileList.Current(), "") == 0) alphabeticSDFileList.Next(); // Create menu buttons. From cf8221d57eb9354d2753ab8fafb7b9aadc2e329f Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sat, 14 May 2022 22:32:55 -0500 Subject: [PATCH 08/39] Added code to display design image. --- SphereBot.ino | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 82f6f19..14816e9 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -319,20 +319,6 @@ void setup() waitingOnButtomPress = !(usb.Touched(p.x, p.y) || sdcard.Touched(p.x, p.y)); } } - - // tft.fillScreen(ILI9341_BLACK); - - // Test message... - // tft.setCursor(0, 0); - // tft.setTextColor(ILI9341_WHITE); - // tft.setTextSize(20); - - // if (serialMode) - // tft.print("USB"); - // else { - - // tft.fillRect(0, 220, 320, 20, ILI9341_BLACK); - // } } } #endif @@ -374,9 +360,21 @@ void loop() { char *filename = alphabeticSDFileList.Current(); - // Paint screen with design image/ + // Build design image filename. Start with folder. + char designImageFilename[DEFAULT_FILE_NAME_SIZE + 13] = "/designs/"; + // Add the gcode filename. + strcat(designImageFilename, filename); + // Remove filename extension. + char *ext = strrchr(designImageFilename, '.'); + if (ext != nullptr) + ext[0] = '\0'; + // Add the image file extension. + strcat(designImageFilename, ".bmp"); + + // Paint screen with design image. tft.fillScreen(ILI9341_BLACK); - // TODO: Paint image here. + ImageReturnCode stat = reader.drawBMP(designImageFilename, tft, 0, 0); + tft.setCursor(0, 0); tft.println(filename); tft.fillRect(0, 200, 320, 40, ILI9341_WHITE); From bb1338eb9a2caad6bb13d5fc1a4b5b26416ac786 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Fri, 20 May 2022 12:54:44 -0500 Subject: [PATCH 09/39] Added information and print buttons. --- SphereBot.ino | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 14816e9..9875f36 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -351,14 +351,18 @@ void loop() if (strcmp(alphabeticSDFileList.Current(), "") == 0) alphabeticSDFileList.Next(); + char *filename; + // Create menu buttons. - TouchscreenButton next = TouchscreenButton(280, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/next.bmp"); TouchscreenButton previous = TouchscreenButton(0, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/previous.bmp"); - + TouchscreenButton information = TouchscreenButton(60, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/information.bmp"); + TouchscreenButton print = TouchscreenButton(220, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/print.bmp"); + TouchscreenButton next = TouchscreenButton(280, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/next.bmp"); + bool waitingOnFileSelection = true; while (waitingOnFileSelection) { - char *filename = alphabeticSDFileList.Current(); + filename = alphabeticSDFileList.Current(); // Build design image filename. Start with folder. char designImageFilename[DEFAULT_FILE_NAME_SIZE + 13] = "/designs/"; @@ -378,9 +382,11 @@ void loop() tft.setCursor(0, 0); tft.println(filename); tft.fillRect(0, 200, 320, 40, ILI9341_WHITE); - next.Display(reader, tft); previous.Display(reader, tft); - + information.Display(reader, tft); + print.Display(reader, tft); + next.Display(reader, tft); + // Select gcode file from SD to print. bool waitingOnButtonPress = true; while (waitingOnButtonPress) @@ -395,6 +401,18 @@ void loop() waitingOnButtonPress = false; } + if (information.Touched(p.x, p.y)) + { + //TODO: Display information... + waitingOnButtonPress = false; + } + + if (print.Touched(p.x, p.y)) + { + waitingOnFileSelection = false; + waitingOnButtonPress = false; + } + if (previous.Touched(p.x, p.y)) { alphabeticSDFileList.Previous(); From e9efe4038337d48930f570aa7a9a73531a2754a3 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Fri, 20 May 2022 23:18:34 -0500 Subject: [PATCH 10/39] Added initial print code. --- SphereBot.ino | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/SphereBot.ino b/SphereBot.ino index 9875f36..3cde598 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -422,7 +422,22 @@ void loop() } } - // Print gcode file form SD. + // Print File + // Build design image filename. Start with folder. + char gCodeFilename[DEFAULT_FILE_NAME_SIZE + 7] = "/gcode/"; + // Add the gcode filename. + strcat(gCodeFilename, filename); + File gCodeFile = SD.open(gCodeFilename); + if (gCodeFile) { + while (gCodeFile.available()) { + if (GCode.AddCharToLine(gCodeFile.read())) + { + GCode.ParseLine(); + processCommand(); + } + } + gCodeFile.close(); + } } #endif } From fc8024443d1d20447cd3f325eb00a85a848c7356 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sat, 21 May 2022 16:36:41 -0500 Subject: [PATCH 11/39] Updated G-Code documentation. --- G-Code.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/G-Code.md b/G-Code.md index 4766e39..dc9bb15 100644 --- a/G-Code.md +++ b/G-Code.md @@ -1,13 +1,25 @@ # G-Code +## History The history of the SphereBot G-Code is not clearly documented. It appears that Eberhard Rensch in his original project (http://pleasantsoftware.com/developer/3d/spherebot/) derived it from the MakerBot Unicorn pen plotter to which documentation seems to no longer exist. The G-Code also relies on the Unicorn G-Code Extension for Inkscape from Marty McGuire (https://github.com/martymcguire/inkscape-unicorn) which is no longer supported and does not work with version 1.0 of Inkscape. The original SphereBot G-Code uses 7 common 3D printer/CNC machine ‘G’ word commands (G00, G01, G02, G03, G04, G90, G91), 2 common ‘M’ word commands (M01, M18) and 4 custom (proprietary) commands (M300, M400, M401, M402). The M300 command is responsible for positioning the pen and appears to be a carryover from the MakerBot Unicorn pen plotter. The M400 - Reset X-Axis-Stepper settings to new object diameter, M401 - Reset Y-Axis-Stepper settings to new object diameter and M402 - Set global zoom factor are proprietary commands needed to size images for the SphereBot. -The primary words used in a SphereBot file are G00, G01, G02, G03 and M300. The interesting thing is that while G00 and G01 will position the Z axis this is not used to position the pen. Instead, the custom M300 command is used to position the pen. This creates a problem where pen positioning can be both unique to the SphereBot design (hardware) and the object being printed on (i.e. egg vs ping pong ball) such that sharing G-Code files is almost impossible without some kind of modification. One of the first challenges is getting G-Code that works on your SphereBot. Included in this project in the Util/GCode folder are several G-Code files. They may work out of the box, but chances are you will need to first manual execute M300 commands to determine the best pen up and more importantly pen down settings in order to search and replace the ‘S’ word values for the pen up/down. +The primary words used in a SphereBot file are G00, G01, G02, G03 and M300. The interesting thing is that while G00 and G01 will position the Z axis this is not used to position the pen. Instead, the custom M300 command is used to position the pen. This creates a problem where pen positioning (height) can be both unique to the SphereBot design (hardware) and the object being printed on (i.e. egg vs ping pong ball) such that sharing G-Code files is almost impossible without some kind of modification to the M300 words. -The jinschoi/SphereBot fork (https://github.com/jinschoi/SphereBot) of the SphereBot code from which this fork is derived is coded to use the Adafruit motor control shield. The fork adds 6 custom (proprietary) commands (M301, M302, M303, M500, M501, M503) and removes 2 (M400, M401). The M400 and M401 commands have been removed as the plotting units have been changed from nominal mm to micro steps. If you are using a 200 steps/revolution stepper, G1 Y3200 will rotate the rotation axis one full turn (using 16x micro stepping). This makes adjusting for object diameter unnecessary and makes it easier to adopt patterns using the EggBot templates, which are 3200 px wide by 800 px tall. The commands M301 - Set the minimum pen position, M302 - Set the maximum pen position and M303 set the pen up position have been added. Also added are the commands M500 - Save the pen settings to the Arduino EEPROM, M501 - Load the pen settings from the Arduino EEPROM and M501 - Reset the pen settings to the firmware defaults. +One of the first operational challenges is getting G-Code that works on your SphereBot. Included in this project in the Util/GCode folder are several G-Code files. They may work out of the box, but chances are you will need to first manual execute M300 commands to determine the best pen up and more importantly pen down settings in order to search and replace the ‘S’ word values for the pen up/down. -The tgolla/SphereBot fork (https://github.com/tgolla/SphereBot) adds the following custom (proprietary) commands to address pen positioning and deal with the challenges with that sharing G-Code files is almost impossible without some kind of modification. +## jinschoi/SphereBot Fork +The jinschoi/SphereBot fork (https://github.com/jinschoi/SphereBot) of the SphereBot code from which this fork is derived is coded to use the Adafruit motor control shield. The fork adds 6 custom (proprietary) commands (M301, M302, M303, M500, M501, M503) and removes 2 (M400, M401). The M400 and M401 commands have been removed as the plotting units have been changed from nominal mm to micro steps. If you are using a 200 steps/revolution stepper, G1 Y3200 will rotate the rotation axis one full turn (using 16x micro stepping). This makes adjusting for object diameter unnecessary and makes it easier to adopt patterns using the EggBot templates, which are 3200 px wide by 800 px tall. + + M301 - Set the minimum pen position. + M302 - Set the maximum pen position. + M303 - Sset the pen up position have been added. + M500 - Save the pen settings to the Arduino EEPROM. + M501 - Load the pen settings from the Arduino EEPROM. + M501 - Reset the pen settings to the firmware defaults. + +## tgolla/SphereBot Fork +The tgolla/SphereBot fork (https://github.com/tgolla/SphereBot) adds the following custom (proprietary) commands to address pen positioning and deal with the challenges with that sharing G-Code files which is almost impossible without some kind of modification. M304 - Sets the pen down position needed for new MZ mode. M305 - Sets the G-Code responsible for operating the pen servo. @@ -35,20 +47,46 @@ The tgolla/SphereBot fork (https://github.com/tgolla/SphereBot) adds the followi As stated, these commands have been added to eliminate the need to modify G-Code files for a specific SphereBot by allowing you to preconfigure the software such that it can automatically adjust the pen up/down defined in the G-Code file. -The M304 command sets the pen down position. This command is used in conjunction with the M303 command that sets the pen up position. These commands allow you to adjust the pen to up/down positions specific to the SphereBot. The commands work in conjunction with the MZ mode command (M305) and the M330 and Z height adjustment commands (M306, M307). +### M304 +The M304 command sets the pen down position. This command is used in conjunction with the M303 command that sets the pen up position. These commands allow you to adjust the pen to up/down positions specific to your SphereBot. The commands work in conjunction with the MZ mode command (M305) and the M330 and Z height adjustment commands (M306, M307). -The M305 command sets the MZ mode. The MZ mode setting determines how the software interprets the G-Code file. The mode can be set to one of three settings. When set to M mode (P0) the M300 command is responsible for setting the height of the pen. This is the same behavior found in past versions of the software code. When set to Z mode the Z parameter in the G0, G1, G2 or G3 command is responsible for setting for setting the height of the pen. When set to Auto mode (P2) the mode is set to the appropriate M or Z mode based on which command is first detected in the G-Code file. For example, if a G0, G1, G2 or G3 command with a Z parameter is read first the mode is set to Z. But if an M300 command is read first the mode is set to M. +### M305 +The M305 command sets the MZ mode. The MZ mode setting determines how the software interprets the G-Code file. The mode can be set to one of three settings. When set to M mode (P0) the M300 command is responsible for setting the height of the pen. This is the same behavior found in past versions of the software code. When using this mode it may be necessary for you to manually modify a G-Code file to set the S word value. -The M306 and M307 commands determine how the respective M300 command or G0, G1, G2 or G3 command Z parameter pen height value is interpreted. If set to Off (P0) the value provided by the command or parameter is used as the absolute pen height. If set to Preset (P1) the pen up preset (M308 or M309) value is used to determine if the pen position is set to the pen up (M304) or pen down (M303) value. For example, if the value provided is greater than or equal to the preset value, the pen position is set to the pen up value (M304) and if it is less than the pen position is set to the pen down value (M303). If set to Calculated (P2) the calculated value is determined by assuming the first height position value read is the value used to determine if the pen should be positioned up or down. For example, if the first pen position value is 5, all values 5 equal and greater than will position the pen at the pen up value (M304). Those less than will position the pen at the pen down value (M304). - -Using a file to preset the M303 through M309 values and saving the configuration with the M500 command provides a great deal of versatility. For example, the commands M305 P0 and M306 P0 would configure the SphereBot to operate as it has with past software releases requiring specific G-Code files to be customized for the specific SphereBot. Executing the commands M305 P2, M306 P2 and M307 P2 would configure the SphereBot to its most versatile setting where there should be no need to customize a G-Code file. Both scenarios assume you have set M304 and M303 to the correct heights. +When set to Z mode the Z parameter in the G0, G1, G2 or G3 command is responsible for setting for setting the height of the pen. + +When set to Auto mode (P2) the mode is set to the appropriate M or Z mode based on which command is first detected in the G-Code file. For example, if a G0, G1, G2 or G3 command with a Z parameter is read first the mode is set to Z. But if an M300 command is read first the mode is set to M. + +### M306 & M307 +The M306 and M307 commands determine how the respective M300 command or G0, G1, G2 or G3 command Z parameter pen height value is interpreted. + +- If set to Off (P0) the value provided by the command or parameter is used as the absolute pen height. +- If set to Preset (P1) the pen up preset (M308 or M309) value is used to determine if the pen position is set to the pen up (M304) or pen down (M303) value. + +For example, if the value provided is greater than or equal to the preset value, the pen position is set to the pen up value (M304) and if it is less than the pen position is set to the pen down value (M303). +- If set to Calculated (P2) the calculated value is determined by assuming the first height position value read is the value used to determine if the pen should be positioned up or down. + +For example, if the first pen position value is 5, all values 5 equal and greater than will position the pen at the pen up value (M304). Those less than will position the pen at the pen down value (M304). + +### M310 The M310 command allows you to override the XY feed rates set in your G-Code file with a preset value. If set to 0 the feed rate is initialized with the default feed rate and is set through G0, G1, G2 & G3 codes with X or Y values by Fxxx. +### M311 The M311 command allows you to override the Z (pen movement) feed rates set in your G-Code file with a preset value. If set to 0 the feed rate is initialized with the default feed rate and is set through the M300 Fxxx or G0, G1, G2 & G3 codes with only Z values by Fxxx. The preference is to set this value as can be unique to either the SphereBot or object being drawn on and prevents the pen from crashing down an egg for example. +### M#12 The M312 command sets the pen up federate multiplier. This command allows the SphereBot to move off the object at a faster rate. One means the pen will go up at the same speed (degrees/second) as it goes down. Each increase by one will logarithmically double the pen up speed. +### Using M3xx commands. +Using a file to preset the M301 through M312 values and saving the configuration with the M500 command provides a great deal of versatility. + +- For example, the commands M305 P0 and M306 P0 would configure the SphereBot to operate as it has with past software releases requiring specific G-Code files to be customized for the specific SphereBot. + +- Executing the commands M305 P2, M306 P2 and M307 P2 would configure the SphereBot to its most versatile setting where there should be no need to customize a G-Code file. + +Both scenarios assume you have set M304 and M303 to the correct heights. + Although you can easily modify the beginning of each G-Code file with the correct M301 through M312 codes for it to work best it is recommended that you instead create multiple scenario setting files. For example, one for small eggs, one for large eggs and one for ping pong balls. The M999 command is for debugging and can be useful when determining things like pen up/down settings, feed rates and G-Code interpretation behavior. This code is optionally configured in the configuration.h file and it should be noted that in an Arduino Uno configuration the code consumes a large portion of dynamic memory. From 57f7351f6003de31f80ae9404ef74a69f1f0b792 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sun, 22 May 2022 17:11:26 -0500 Subject: [PATCH 12/39] Added text constents for display messages. --- Configuration.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Configuration.h b/Configuration.h index 6b75b65..06b4863 100644 --- a/Configuration.h +++ b/Configuration.h @@ -20,7 +20,7 @@ #ifndef Configuration_h #define Configuration_h -// Add debugging (M999) command. +// Add debugging (M999) command. Note: Memory intensive. #define DEBUG true // Set to true if you are using an Adafruit 2.8" TFT Touch Shield for @@ -39,6 +39,9 @@ #define TFT_ROTATION 3 #define TFT_HEIGHT 240 #define TFT_WIDTH 320 +#define TFT_TEXT_SIZE 1 +#define TFT_TEXT_HEIGHT 8 +#define TFT_TEXT_WIDTH 6 #define FT6206_THRESSHOLD 0x80 // Splash screen display delay in milliseconds. From bc2369336ef7aba1cedf255ffc2e9c385e570480 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sun, 22 May 2022 18:39:35 -0500 Subject: [PATCH 13/39] Start of print modifications. --- SphereBot.ino | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 3cde598..b92a3a8 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -248,6 +248,8 @@ AlphabeticSDFileList alphabeticSDFileList = AlphabeticSDFileList(); // Instantiate class for TFT screen and Touchscreen Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); Adafruit_FT6206 ts = Adafruit_FT6206(); + +int currentDisplayLine; #endif void setup() @@ -325,15 +327,24 @@ void setup() if (serialMode) { - Serial.println("Ready"); +#if ADAFRUIT_TFT_TOUCH_SHIELD + // Setup text display. + tft.fillScreen(ILI9341_BLACK); + tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); + tft.setTextSize(TFT_TEXT_SIZE); + currentDisplayLine = 1; +#endif + println("Ready"); delay(100); } } void loop() { +#if ADAFRUIT_TFT_TOUCH_SHIELD if (serialMode) { +#endif // Check serial port for character. if (Serial.available() > 0) { @@ -343,8 +354,8 @@ void loop() processCommand(); } } - } #if ADAFRUIT_TFT_TOUCH_SHIELD + } else { // Start at first file. @@ -379,8 +390,7 @@ void loop() tft.fillScreen(ILI9341_BLACK); ImageReturnCode stat = reader.drawBMP(designImageFilename, tft, 0, 0); - tft.setCursor(0, 0); - tft.println(filename); + // Display menu bar. tft.fillRect(0, 200, 320, 40, ILI9341_WHITE); previous.Display(reader, tft); information.Display(reader, tft); @@ -442,6 +452,23 @@ void loop() #endif } +// Dual print functions. +void print(char *data) +{ + Serial.print(data); +#if ADAFRUIT_TFT_TOUCH_SHIELD + //TODO: +#endif +} + +void println(char *data) +{ + Serial.println(data); +#if ADAFRUIT_TFT_TOUCH_SHIELD + //TODO: +#endif +} + // Loads the pen configuration from memory. void loadPenConfiguration() { @@ -1048,8 +1075,8 @@ void processCommand() // Done processing commands. if (Serial.available() <= 0) { - Serial.print("ok:"); - Serial.println(GCode.line); + print("ok:"); + println(GCode.line); } } From 5400f5b7b4dbfb67da11190b4c2d461bbeddad18 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Mon, 23 May 2022 18:09:19 -0500 Subject: [PATCH 14/39] Print modifications completed. --- SphereBot.ino | 282 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 190 insertions(+), 92 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index b92a3a8..5021292 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -328,11 +328,7 @@ void setup() if (serialMode) { #if ADAFRUIT_TFT_TOUCH_SHIELD - // Setup text display. - tft.fillScreen(ILI9341_BLACK); - tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); - tft.setTextSize(TFT_TEXT_SIZE); - currentDisplayLine = 1; + setTextDisplay(); #endif println("Ready"); delay(100); @@ -433,6 +429,7 @@ void loop() } // Print File + setTextDisplay(); // Build design image filename. Start with folder. char gCodeFilename[DEFAULT_FILE_NAME_SIZE + 7] = "/gcode/"; // Add the gcode filename. @@ -453,22 +450,123 @@ void loop() } // Dual print functions. +void print(byte data) +{ +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); +#endif + Serial.print(data); +} + +void print(short data) +{ +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); +#endif + Serial.print(data); +} + +void print(int data) +{ +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); +#endif + Serial.print(data); +} + +void print(double data) +{ +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); +#endif + Serial.print(data); +} + void print(char *data) { +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); +#endif Serial.print(data); +} + +void println(byte data) +{ #if ADAFRUIT_TFT_TOUCH_SHIELD - //TODO: + tft.print(data); + advanceToNextLineOnDisplay(); #endif + Serial.println(data); +} + +void println(short data) +{ +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); + advanceToNextLineOnDisplay(); +#endif + Serial.println(data); +} + +void println(int data) +{ +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); + advanceToNextLineOnDisplay(); +#endif + Serial.println(data); +} + +void println(double data) +{ +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); + advanceToNextLineOnDisplay(); +#endif + Serial.println(data); } void println(char *data) { +#if ADAFRUIT_TFT_TOUCH_SHIELD + tft.print(data); + advanceToNextLineOnDisplay(); +#endif Serial.println(data); +} + +void println() +{ #if ADAFRUIT_TFT_TOUCH_SHIELD - //TODO: + advanceToNextLineOnDisplay(); #endif + Serial.println(); } +#if ADAFRUIT_TFT_TOUCH_SHIELD +void setTextDisplay() +{ + tft.fillScreen(ILI9341_BLACK); + tft.setTextColor(ILI9341_WHITE); + tft.setTextSize(TFT_TEXT_SIZE); + tft.setTextWrap(false); + tft.setCursor(0,0); + currentDisplayLine = 1; +} + +void advanceToNextLineOnDisplay() +{ + currentDisplayLine = currentDisplayLine + 1; + + if (currentDisplayLine > (TFT_HEIGHT/TFT_TEXT_HEIGHT)) + currentDisplayLine = 1; + + tft.fillRect(0, (currentDisplayLine - 1) * TFT_TEXT_HEIGHT, TFT_WIDTH, TFT_TEXT_HEIGHT, ILI9341_BLACK); + + tft.setCursor(0,(currentDisplayLine - 1) * TFT_TEXT_HEIGHT); +} +#endif + // Loads the pen configuration from memory. void loadPenConfiguration() { @@ -968,105 +1066,105 @@ void processCommand() #if DEBUG == true case 999: // M999 - Debugging command. - Serial.println(); - Serial.print("M301 P"); - Serial.print(minPenPosition); - Serial.print(" ;M301 Pxxx - Minimun Pen Position: "); - Serial.println(minPenPosition); - - Serial.print("M302 P"); - Serial.print(maxPenPosition); - Serial.print(" ;M302 Pxxx - Maximun Pen Position: "); - Serial.println(maxPenPosition); - - Serial.print("M303 P"); - Serial.print(penUpPosition); - Serial.print(" ;M303 Pxxx - Pen Up Position: "); - Serial.println(penUpPosition); - - Serial.print("M304 P"); - Serial.print(penDownPosition); - Serial.print(" ;M304 Pxxx - Pen Down Position: "); - Serial.println(penDownPosition); - - Serial.print("M305 P"); - Serial.print(mzMode); - Serial.print(" ;M305 Px - MZ Mode (0-M, 1-Z, 2-Auto): "); - Serial.print(mzMode); - Serial.print(" MZ Active Mode: "); - Serial.println(mzActiveMode); - - Serial.print("M306 P"); - Serial.print(mAdjust); - Serial.print(" ;M306 Px - M Adjust (0-Off, 1-Preset, 2-Calculated): "); - Serial.println(mAdjust); - - Serial.print("M307 P"); - Serial.print(zAdjust); - Serial.print(" ;M307 Px - Z Adjust: (0-Off, 1-Preset, 2-Calculated): "); - Serial.println(zAdjust); - - Serial.print("M308 P"); - Serial.print(mAdjustPreset); - Serial.print(" ;M308 Pxxx - M Adjust Preset: "); - Serial.print(mAdjustPreset); - Serial.print(" M Adjust Calculated: "); - Serial.println(mAdjustCalculated); - - Serial.print("M309 P"); - Serial.print(zAdjustPreset); - Serial.print(" ;M309 Pxxx - Z Adjust Preset: "); - Serial.print(zAdjustPreset); - Serial.print(" Z Adjust Calculated: "); - Serial.println(zAdjustCalculated); - - Serial.print("G1 X0 Y0 F"); - Serial.print(xyFeedrate); - Serial.print(" ;Gx Xxxx Yxxx Fxxx - XY Feedrate: "); - Serial.println(xyFeedrate); + println(); + print("M301 P"); + print(minPenPosition); + print(" ;M301 Pxxx - Minimun Pen Position: "); + println(minPenPosition); + + print("M302 P"); + print(maxPenPosition); + print(" ;M302 Pxxx - Maximun Pen Position: "); + println(maxPenPosition); + + print("M303 P"); + print(penUpPosition); + print(" ;M303 Pxxx - Pen Up Position: "); + println(penUpPosition); + + print("M304 P"); + print(penDownPosition); + print(" ;M304 Pxxx - Pen Down Position: "); + println(penDownPosition); + + print("M305 P"); + print(mzMode); + print(" ;M305 Px - MZ Mode (0-M, 1-Z, 2-Auto): "); + print(mzMode); + print(" MZ Active Mode: "); + println(mzActiveMode); + + print("M306 P"); + print(mAdjust); + print(" ;M306 Px - M Adjust (0-Off, 1-Preset, 2-Calculated): "); + println(mAdjust); + + print("M307 P"); + print(zAdjust); + print(" ;M307 Px - Z Adjust: (0-Off, 1-Preset, 2-Calculated): "); + println(zAdjust); + + print("M308 P"); + print(mAdjustPreset); + print(" ;M308 Pxxx - M Adjust Preset: "); + print(mAdjustPreset); + print(" M Adjust Calculated: "); + println(mAdjustCalculated); + + print("M309 P"); + print(zAdjustPreset); + print(" ;M309 Pxxx - Z Adjust Preset: "); + print(zAdjustPreset); + print(" Z Adjust Calculated: "); + println(zAdjustCalculated); + + print("G1 X0 Y0 F"); + print(xyFeedrate); + print(" ;Gx Xxxx Yxxx Fxxx - XY Feedrate: "); + println(xyFeedrate); if (mzActiveMode == 0) { - Serial.print("M300 S"); - Serial.print(penUpPosition); - Serial.print(" F"); + print("M300 S"); + print(penUpPosition); + print(" F"); } else { - Serial.print("G1 Z"); - Serial.print(penUpPosition); - Serial.print(" F"); + print("G1 Z"); + print(penUpPosition); + print(" F"); } - Serial.print(penFeedrate); - Serial.print(" ;M300 Sxxx Fxxx or Gx Zxxx Fxxx - Pen Feedrate: "); - Serial.println(penFeedrate); + print(penFeedrate); + print(" ;M300 Sxxx Fxxx or Gx Zxxx Fxxx - Pen Feedrate: "); + println(penFeedrate); - Serial.print("M310 P"); - Serial.print(presetXyFeedrate); - Serial.print(" ;M310 Pxxx - Preset XY Feedrate : "); - Serial.println(presetXyFeedrate); + print("M310 P"); + print(presetXyFeedrate); + print(" ;M310 Pxxx - Preset XY Feedrate : "); + println(presetXyFeedrate); - Serial.print("M311 P"); - Serial.print(presetPenFeedrate); - Serial.print(" ;M311 Pxxx - Preset Pen Feedrate: "); - Serial.println(presetPenFeedrate); + print("M311 P"); + print(presetPenFeedrate); + print(" ;M311 Pxxx - Preset Pen Feedrate: "); + println(presetPenFeedrate); - Serial.print("M312 P"); - Serial.print(penUpFeedrateMultiplier); - Serial.print(" ;M312 Pxxx - Pen Up Feedrate Multiplier: "); - Serial.println(penUpFeedrateMultiplier); + print("M312 P"); + print(penUpFeedrateMultiplier); + print(" ;M312 Pxxx - Pen Up Feedrate Multiplier: "); + println(penUpFeedrateMultiplier); - Serial.print("M500 ;Save pen configuration to EEPROM. Values Saved in EEPROM ("); - Serial.print(EEPROM_MAGIC_NUMBER); - Serial.print("): "); - Serial.println(EEPROM.read(valueSavedEEPROMMemoryLocation)); + print("M500 ;Save pen configuration to EEPROM. Values Saved in EEPROM ("); + print(EEPROM_MAGIC_NUMBER); + print("): "); + println(EEPROM.read(valueSavedEEPROMMemoryLocation)); - Serial.println("M501 ;Load pen configuration from EEPROM (or defaults if cleared)."); - Serial.println("M502 ;Clear pen configuration from EEPROM."); - Serial.println("M18 ;Disable stepper motors."); + println("M501 ;Load pen configuration from EEPROM (or defaults if cleared)."); + println("M502 ;Clear pen configuration from EEPROM."); + println("M18 ;Disable stepper motors."); - Serial.println(); + println(); break; #endif } From bffa3948c1e91ae4fc5b22d7fd59541cd1ffe474 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Tue, 24 May 2022 00:16:12 -0500 Subject: [PATCH 15/39] Added M01 pause and display comments with no gcode --- SphereBot.ino | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/SphereBot.ino b/SphereBot.ino index 5021292..2f51b5b 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -878,6 +878,25 @@ void processCommand() switch (mCodeNumber) { +#if ADAFRUIT_TFT_TOUCH_SHIELD + case 1: // M01 - Pause (Used to change pen.) + if (!serialMode) + { + println(); + println(GCode.comments); + println("Touch screen to continue..."); + + bool waitingOnScreenTouch = true; + while (waitingOnScreenTouch) + { + if (ts.touched()) + { + waitingOnScreenTouch = false; + } + } + } + break; +#endif case 18: // M18 - Disable all stepper motors. xStepper->release(); yStepper->release(); @@ -1174,7 +1193,15 @@ void processCommand() if (Serial.available() <= 0) { print("ok:"); - println(GCode.line); + if (!GCode.line[0]) + { + GCode.RemoveCommentSeparators(); + println(GCode.comments); + } + else + { + println(GCode.line); + } } } From 40acbd8447e1f1b23860cba97249053df62f5b12 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Tue, 24 May 2022 09:34:14 -0500 Subject: [PATCH 16/39] Added processing for block delete. --- SphereBot.ino | 875 +++++++++++++++++++++++++------------------------- 1 file changed, 440 insertions(+), 435 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 2f51b5b..d8f20f9 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -340,7 +340,7 @@ void loop() #if ADAFRUIT_TFT_TOUCH_SHIELD if (serialMode) { -#endif +#endif // Check serial port for character. if (Serial.available() > 0) { @@ -365,7 +365,7 @@ void loop() TouchscreenButton information = TouchscreenButton(60, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/information.bmp"); TouchscreenButton print = TouchscreenButton(220, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/print.bmp"); TouchscreenButton next = TouchscreenButton(280, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/next.bmp"); - + bool waitingOnFileSelection = true; while (waitingOnFileSelection) { @@ -392,7 +392,7 @@ void loop() information.Display(reader, tft); print.Display(reader, tft); next.Display(reader, tft); - + // Select gcode file from SD to print. bool waitingOnButtonPress = true; while (waitingOnButtonPress) @@ -409,7 +409,7 @@ void loop() if (information.Touched(p.x, p.y)) { - //TODO: Display information... + // TODO: Display information... waitingOnButtonPress = false; } @@ -435,8 +435,10 @@ void loop() // Add the gcode filename. strcat(gCodeFilename, filename); File gCodeFile = SD.open(gCodeFilename); - if (gCodeFile) { - while (gCodeFile.available()) { + if (gCodeFile) + { + while (gCodeFile.available()) + { if (GCode.AddCharToLine(gCodeFile.read())) { GCode.ParseLine(); @@ -546,24 +548,24 @@ void println() #if ADAFRUIT_TFT_TOUCH_SHIELD void setTextDisplay() { - tft.fillScreen(ILI9341_BLACK); - tft.setTextColor(ILI9341_WHITE); - tft.setTextSize(TFT_TEXT_SIZE); - tft.setTextWrap(false); - tft.setCursor(0,0); - currentDisplayLine = 1; + tft.fillScreen(ILI9341_BLACK); + tft.setTextColor(ILI9341_WHITE); + tft.setTextSize(TFT_TEXT_SIZE); + tft.setTextWrap(false); + tft.setCursor(0, 0); + currentDisplayLine = 1; } void advanceToNextLineOnDisplay() { currentDisplayLine = currentDisplayLine + 1; - - if (currentDisplayLine > (TFT_HEIGHT/TFT_TEXT_HEIGHT)) + + if (currentDisplayLine > (TFT_HEIGHT / TFT_TEXT_HEIGHT)) currentDisplayLine = 1; - + tft.fillRect(0, (currentDisplayLine - 1) * TFT_TEXT_HEIGHT, TFT_WIDTH, TFT_TEXT_HEIGHT, ILI9341_BLACK); - tft.setCursor(0,(currentDisplayLine - 1) * TFT_TEXT_HEIGHT); + tft.setCursor(0, (currentDisplayLine - 1) * TFT_TEXT_HEIGHT); } #endif @@ -701,494 +703,497 @@ inline double clamp(double value, double minValue, double maxValue) // Processes parsed GCode. void processCommand() { - if (GCode.HasWord('G')) // G-Codes + if (!GCode.blockDelete) { - int gCodeNumber = (int)GCode.GetWordValue('G'); - - double tempX = steppers->xPos(); - double tempY = steppers->yPos(); - - if (gCodeNumber >= 0 && gCodeNumber <= 3) // G0, G1, G2, G3 + if (GCode.HasWord('G')) // G-Codes { - // If MZ active mode equals auto and a Z coordinate exist - // set the MZ active mode to Z. - if (mzActiveMode == Auto && GCode.HasWord('Z')) - mzActiveMode = Z; + int gCodeNumber = (int)GCode.GetWordValue('G'); - if (GCode.HasWord('X')) - { - if (absoluteMode) - tempX = GCode.GetWordValue('X') * zoom; - else - tempX += GCode.GetWordValue('X') * zoom; - } + double tempX = steppers->xPos(); + double tempY = steppers->yPos(); - if (GCode.HasWord('Y')) + if (gCodeNumber >= 0 && gCodeNumber <= 3) // G0, G1, G2, G3 { - if (absoluteMode) - tempY = GCode.GetWordValue('Y') * zoom; - else - tempY += GCode.GetWordValue('Y') * zoom; - } + // If MZ active mode equals auto and a Z coordinate exist + // set the MZ active mode to Z. + if (mzActiveMode == Auto && GCode.HasWord('Z')) + mzActiveMode = Z; - tempY = clamp(tempY, MIN_PEN_AXIS_STEP, MAX_PEN_AXIS_STEP); - - // Set XY or Z (Pen) feedrate. - if (GCode.HasWord('F')) - { - if (GCode.HasWord('X') || GCode.HasWord('Y')) + if (GCode.HasWord('X')) { - if (presetXyFeedrate <= 0) - xyFeedrate = GCode.GetWordValue('F'); + if (absoluteMode) + tempX = GCode.GetWordValue('X') * zoom; + else + tempX += GCode.GetWordValue('X') * zoom; } - else + + if (GCode.HasWord('Y')) { - if (GCode.HasWord('Z')) - { - if (mzActiveMode == Z && presetPenFeedrate <= 0) - penFeedrate = GCode.GetWordValue('F'); - } + if (absoluteMode) + tempY = GCode.GetWordValue('Y') * zoom; + else + tempY += GCode.GetWordValue('Y') * zoom; } - } - if (mzActiveMode == Z) - { - if (GCode.HasWord('Z')) - { - double value = GCode.GetWordValue('Z'); + tempY = clamp(tempY, MIN_PEN_AXIS_STEP, MAX_PEN_AXIS_STEP); - // Adjust Z based on preset pen up value. - if (zAdjust == Preset) + // Set XY or Z (Pen) feedrate. + if (GCode.HasWord('F')) + { + if (GCode.HasWord('X') || GCode.HasWord('Y')) { - if (value < zAdjustPreset) - value = penDownPosition; - else - value = penUpPosition; + if (presetXyFeedrate <= 0) + xyFeedrate = GCode.GetWordValue('F'); } - - // Adjust Z based on calculated pen up value. - if (zAdjust == Calculated) + else { - // Set the calculated adjustment with the first Z value. - // The algorithm assume the first value is for the pen to be up. - if (zAdjustCalculated < 0) - zAdjustCalculated = (short)value; - - if (value < zAdjustCalculated) - value = penDownPosition; - else - value = penUpPosition; + if (GCode.HasWord('Z')) + { + if (mzActiveMode == Z && presetPenFeedrate <= 0) + penFeedrate = GCode.GetWordValue('F'); + } } + } - value = clamp(value, minPenPosition, maxPenPosition); - - movePen(value); + if (mzActiveMode == Z) + { + if (GCode.HasWord('Z')) + { + double value = GCode.GetWordValue('Z'); + + // Adjust Z based on preset pen up value. + if (zAdjust == Preset) + { + if (value < zAdjustPreset) + value = penDownPosition; + else + value = penUpPosition; + } + + // Adjust Z based on calculated pen up value. + if (zAdjust == Calculated) + { + // Set the calculated adjustment with the first Z value. + // The algorithm assume the first value is for the pen to be up. + if (zAdjustCalculated < 0) + zAdjustCalculated = (short)value; + + if (value < zAdjustCalculated) + value = penDownPosition; + else + value = penUpPosition; + } + + value = clamp(value, minPenPosition, maxPenPosition); + + movePen(value); + } } } - } - switch (gCodeNumber) - { - // G00 – Rapid Positioning - // The G00 command moves the machine at maximum travel speed from a current - // position to a specified point or the coordinates specified by the command. - // The machine will move all axis at the same time, so they complete the - // travel simultaneously. This results in a straight-line movement to the new - // position point. - case 0: - steppers->moveTo(tempX, tempY, MAX_XY_FEEDRATE); - break; - - // G01 – Linear Interpolation - // The G01 G-code command instructs the machine to move in a straight line - // at a set feed rate or speed. We specify the end position with the X, Y - // and Z values, and the speed with the F value. The machine controller - // calculates (interpolates) the intermediate points to pass through to get - // that straight line. Although these G-code commands are simple and quite - // intuitive to understand, behind them, the machine controller performs - // thousands of calculations per second in order to make these movements. - case 1: // Potentially wrap around the sphere if pen is up. - if (currentPenPosition <= penUpPosition) - steppers->travelTo(tempX, tempY, xyFeedrate); - else - steppers->moveTo(tempX, tempY, xyFeedrate); - break; - - // G02 – Circular Interpolation Clockwise - // The G02 command tells the machine to move clockwise in a circular pattern. - // It is the same concept as the G01 command and it’s used when performing - // the appropriate machining process. In addition to the end point parameters, - // here we also need to define the center of rotation, or the distance of - // the arc start point from the center point of the arc. The start point is - // actually the end point from the previous command or the current point. - case 2: - // G03 – Circular Interpolation Counterclockwise - // Just like the G02, the G03 G-code command defines the machine to move in - // circular pattern. The only difference here is that the motion is - // counterclockwise. All other features and rules are the same as the G02 - // command. - case 3: - if (GCode.HasWord('I') && GCode.HasWord('J')) - { - double centerX = steppers->xPos() + (GCode.GetWordValue('I') * zoom); - double centerY = steppers->yPos() + (GCode.GetWordValue('J') * zoom); - drawArc(centerX, centerY, tempX, tempY, (gCodeNumber == 2)); - } - else if (GCode.HasWord('R')) + switch (gCodeNumber) { - // drawRadius(tempX, tempY, GCode.GetWordValue('R') * zoom, (gCodeNumber==2)); + // G00 – Rapid Positioning + // The G00 command moves the machine at maximum travel speed from a current + // position to a specified point or the coordinates specified by the command. + // The machine will move all axis at the same time, so they complete the + // travel simultaneously. This results in a straight-line movement to the new + // position point. + case 0: + steppers->moveTo(tempX, tempY, MAX_XY_FEEDRATE); + break; + + // G01 – Linear Interpolation + // The G01 G-code command instructs the machine to move in a straight line + // at a set feed rate or speed. We specify the end position with the X, Y + // and Z values, and the speed with the F value. The machine controller + // calculates (interpolates) the intermediate points to pass through to get + // that straight line. Although these G-code commands are simple and quite + // intuitive to understand, behind them, the machine controller performs + // thousands of calculations per second in order to make these movements. + case 1: // Potentially wrap around the sphere if pen is up. + if (currentPenPosition <= penUpPosition) + steppers->travelTo(tempX, tempY, xyFeedrate); + else + steppers->moveTo(tempX, tempY, xyFeedrate); + break; + + // G02 – Circular Interpolation Clockwise + // The G02 command tells the machine to move clockwise in a circular pattern. + // It is the same concept as the G01 command and it’s used when performing + // the appropriate machining process. In addition to the end point parameters, + // here we also need to define the center of rotation, or the distance of + // the arc start point from the center point of the arc. The start point is + // actually the end point from the previous command or the current point. + case 2: + // G03 – Circular Interpolation Counterclockwise + // Just like the G02, the G03 G-code command defines the machine to move in + // circular pattern. The only difference here is that the motion is + // counterclockwise. All other features and rules are the same as the G02 + // command. + case 3: + if (GCode.HasWord('I') && GCode.HasWord('J')) + { + double centerX = steppers->xPos() + (GCode.GetWordValue('I') * zoom); + double centerY = steppers->yPos() + (GCode.GetWordValue('J') * zoom); + drawArc(centerX, centerY, tempX, tempY, (gCodeNumber == 2)); + } + else if (GCode.HasWord('R')) + { + // drawRadius(tempX, tempY, GCode.GetWordValue('R') * zoom, (gCodeNumber==2)); + } + break; + + // G04 – Dwell Command + // G04 is called the Dwell command because it makes the machine stop what it + // is doing or dwell for a specified length of time. It is helpful to be able + // to dwell during a cutting operation, and also to facilitate various + // non-cutting operations of the machine. + case 4: // G4 - Delay P milliseconds. + if (GCode.HasWord('P')) + delay(GCode.GetWordValue('P')); + break; + + // G90/G91 – Positioning G-code commands + // With the G90 and G91 commands we tell the machine how to interpret the + // coordinates. G90 is for absolute mode and G91 is for relative mode. + // + // In absolute mode the positioning of the tool is always from the absolute + // point or zero. So, the command G01 X10 Y5 will take the tool to that + // exact point (10,5), no matter the previous position. + // + // On the other hand, in relative mode, the positioning of the tool is + // relative to the last point. So, if the machine is currently at point + // (10,10), the command G01 X10 Y5 will take the tool to point (20,15). + // This mode is also called “incremental mode”. + case 90: // G90 - Absolute Positioning. + absoluteMode = true; + break; + case 91: // G91 - Incremental Positioning. + absoluteMode = false; + break; } - break; - - // G04 – Dwell Command - // G04 is called the Dwell command because it makes the machine stop what it - // is doing or dwell for a specified length of time. It is helpful to be able - // to dwell during a cutting operation, and also to facilitate various - // non-cutting operations of the machine. - case 4: // G4 - Delay P milliseconds. - if (GCode.HasWord('P')) - delay(GCode.GetWordValue('P')); - break; - - // G90/G91 – Positioning G-code commands - // With the G90 and G91 commands we tell the machine how to interpret the - // coordinates. G90 is for absolute mode and G91 is for relative mode. - // - // In absolute mode the positioning of the tool is always from the absolute - // point or zero. So, the command G01 X10 Y5 will take the tool to that - // exact point (10,5), no matter the previous position. - // - // On the other hand, in relative mode, the positioning of the tool is - // relative to the last point. So, if the machine is currently at point - // (10,10), the command G01 X10 Y5 will take the tool to point (20,15). - // This mode is also called “incremental mode”. - case 90: // G90 - Absolute Positioning. - absoluteMode = true; - break; - case 91: // G91 - Incremental Positioning. - absoluteMode = false; - break; } - } - else if (GCode.HasWord('M')) // M-Codes - { - int mCodeNumber = (int)GCode.GetWordValue('M'); + else if (GCode.HasWord('M')) // M-Codes + { + int mCodeNumber = (int)GCode.GetWordValue('M'); - double value; + double value; - switch (mCodeNumber) - { -#if ADAFRUIT_TFT_TOUCH_SHIELD - case 1: // M01 - Pause (Used to change pen.) - if (!serialMode) + switch (mCodeNumber) { - println(); - println(GCode.comments); - println("Touch screen to continue..."); - - bool waitingOnScreenTouch = true; - while (waitingOnScreenTouch) +#if ADAFRUIT_TFT_TOUCH_SHIELD + case 1: // M01 - Pause (Used to change pen.) + if (!serialMode) { - if (ts.touched()) + println(); + println(GCode.comments); + println("Touch screen to continue..."); + + bool waitingOnScreenTouch = true; + while (waitingOnScreenTouch) { - waitingOnScreenTouch = false; + if (ts.touched()) + { + waitingOnScreenTouch = false; + } } } - } - break; + break; #endif - case 18: // M18 - Disable all stepper motors. - xStepper->release(); - yStepper->release(); - break; - - case 300: // M300 - Set pen (servo) position. - // If MZ active mode equals auto and a M300 command exist - // set the MZ active mode to M. - if (mzActiveMode == Auto) - mzActiveMode = M; - - if (mzActiveMode == M) - { - if (GCode.HasWord('F')) + case 18: // M18 - Disable all stepper motors. + xStepper->release(); + yStepper->release(); + break; + + case 300: // M300 - Set pen (servo) position. + // If MZ active mode equals auto and a M300 command exist + // set the MZ active mode to M. + if (mzActiveMode == Auto) + mzActiveMode = M; + + if (mzActiveMode == M) { - penFeedrate = GCode.GetWordValue('F'); - } - - if (GCode.HasWord('S')) - { - value = GCode.GetWordValue('S'); - - // Adjust S based on preset pen up value. - if (mAdjust == Preset) + if (GCode.HasWord('F')) { - if (value < mAdjustPreset) - value = penDownPosition; - else - value = penUpPosition; + penFeedrate = GCode.GetWordValue('F'); } - // Adjust S based on calculated pen up value. - if (mAdjust == Calculated) + if (GCode.HasWord('S')) { - // Set the calculated adjustment with the first M300 S value. - // The algorithm assume the first value is for the pen to be up. - if (mAdjustCalculated < 0) - mAdjustCalculated = (short)value; - - if (value < mAdjustCalculated) - value = penDownPosition; - else - value = penUpPosition; + value = GCode.GetWordValue('S'); + + // Adjust S based on preset pen up value. + if (mAdjust == Preset) + { + if (value < mAdjustPreset) + value = penDownPosition; + else + value = penUpPosition; + } + + // Adjust S based on calculated pen up value. + if (mAdjust == Calculated) + { + // Set the calculated adjustment with the first M300 S value. + // The algorithm assume the first value is for the pen to be up. + if (mAdjustCalculated < 0) + mAdjustCalculated = (short)value; + + if (value < mAdjustCalculated) + value = penDownPosition; + else + value = penUpPosition; + } + + value = clamp(value, minPenPosition, maxPenPosition); + + movePen(value); } + } + break; + + case 301: // M301 - Set minimum pen position. + if (GCode.HasWord('P')) + minPenPosition = GCode.GetWordValue('P'); + break; + + case 302: // M302 - Set maximum pen position. + if (GCode.HasWord('P')) + maxPenPosition = GCode.GetWordValue('P'); + break; + + case 303: // M303 - Set default pen up position. + if (GCode.HasWord('P')) + penUpPosition = GCode.GetWordValue('P'); + break; + + case 304: // M304 - Set default pen down position. + if (GCode.HasWord('P')) + penDownPosition = GCode.GetWordValue('P'); + break; + + // M305 - Sets the G-Code responsible for operating the pen servo. + // P0 - M300 sets the pen height. P1 - G0, G1, G2 & G3 Z parameter is + // responsible for setting the pen height. P2 - Automatically detects + // which code is responsible for setting the pen height. + case 305: + if (GCode.HasWord('P')) + { + mzMode = GCode.GetWordValue('P'); - value = clamp(value, minPenPosition, maxPenPosition); + if (mzMode > Auto) + mzMode = M; - movePen(value); + mzActiveMode = mzMode; } - } - break; - - case 301: // M301 - Set minimum pen position. - if (GCode.HasWord('P')) - minPenPosition = GCode.GetWordValue('P'); - break; - - case 302: // M302 - Set maximum pen position. - if (GCode.HasWord('P')) - maxPenPosition = GCode.GetWordValue('P'); - break; - - case 303: // M303 - Set default pen up position. - if (GCode.HasWord('P')) - penUpPosition = GCode.GetWordValue('P'); - break; - - case 304: // M304 - Set default pen down position. - if (GCode.HasWord('P')) - penDownPosition = GCode.GetWordValue('P'); - break; - - // M305 - Sets the G-Code responsible for operating the pen servo. - // P0 - M300 sets the pen height. P1 - G0, G1, G2 & G3 Z parameter is - // responsible for setting the pen height. P2 - Automatically detects - // which code is responsible for setting the pen height. - case 305: - if (GCode.HasWord('P')) - { - mzMode = GCode.GetWordValue('P'); + break; - if (mzMode > Auto) - mzMode = M; + // M306 - Sets the M300 height adjustment. P0 - Off, P1 - Preset, P2 - Calculated + case 306: + if (GCode.HasWord('P')) + { + mAdjust = GCode.GetWordValue('P'); - mzActiveMode = mzMode; - } - break; + if (mAdjust > Calculated) + mAdjust = Off; - // M306 - Sets the M300 height adjustment. P0 - Off, P1 - Preset, P2 - Calculated - case 306: - if (GCode.HasWord('P')) - { - mAdjust = GCode.GetWordValue('P'); + // Force recalculation of calculated adjustment. + mAdjustCalculated = -1; + } + break; - if (mAdjust > Calculated) - mAdjust = Off; + // M307 - Sets the Z height adjustment. P0 - Off, P1 - Preset, P2 - Calculated + case 307: + if (GCode.HasWord('P')) + { + zAdjust = GCode.GetWordValue('P'); - // Force recalculation of calculated adjustment. - mAdjustCalculated = -1; - } - break; + if (zAdjust > Calculated) + zAdjust = Off; - // M307 - Sets the Z height adjustment. P0 - Off, P1 - Preset, P2 - Calculated - case 307: - if (GCode.HasWord('P')) - { - zAdjust = GCode.GetWordValue('P'); + // Force recalculation of calculated adjustment. + zAdjustCalculated = -1; + } + break; + + // M308 - Sets the M300 pen up preset value. + // S values less than the value move the pen down. + case 308: + if (GCode.HasWord('P')) + mAdjustPreset = GCode.GetWordValue('P'); + break; + + // M309 - Sets the Z pen up preset value. + // Z values less than the value move the pen down. + case 309: + if (GCode.HasWord('P')) + zAdjustPreset = GCode.GetWordValue('P'); + break; + + // M310 - Sets the XY feedrate preset value. If zero feedrate is initalized + // with default value and set through G0, G1, G2 & G3 codes with X or Y + // values by Fxxx. + case 310: + if (GCode.HasWord('P')) + { + presetXyFeedrate = GCode.GetWordValue('P'); - if (zAdjust > Calculated) - zAdjust = Off; + if (presetXyFeedrate > 0) + xyFeedrate = presetXyFeedrate; + } + break; - // Force recalculation of calculated adjustment. - zAdjustCalculated = -1; - } - break; - - // M308 - Sets the M300 pen up preset value. - // S values less than the value move the pen down. - case 308: - if (GCode.HasWord('P')) - mAdjustPreset = GCode.GetWordValue('P'); - break; - - // M309 - Sets the Z pen up preset value. - // Z values less than the value move the pen down. - case 309: - if (GCode.HasWord('P')) - zAdjustPreset = GCode.GetWordValue('P'); - break; - - // M310 - Sets the XY feedrate preset value. If zero feedrate is initalized - // with default value and set through G0, G1, G2 & G3 codes with X or Y - // values by Fxxx. - case 310: - if (GCode.HasWord('P')) - { - presetXyFeedrate = GCode.GetWordValue('P'); + // M311 - Sets the pen feedrate preset value. If zero feedrate is initalized + // with default value and set through the M300 Fxxx or G0, G1, G2 & G3 codes + // with only Z values by Fxxx. + case 311: + if (GCode.HasWord('P')) + { + presetPenFeedrate = GCode.GetWordValue('P'); - if (presetXyFeedrate > 0) - xyFeedrate = presetXyFeedrate; - } - break; + if (presetPenFeedrate > 0) + penFeedrate = presetPenFeedrate; + } + break; - // M311 - Sets the pen feedrate preset value. If zero feedrate is initalized - // with default value and set through the M300 Fxxx or G0, G1, G2 & G3 codes - // with only Z values by Fxxx. - case 311: - if (GCode.HasWord('P')) - { - presetPenFeedrate = GCode.GetWordValue('P'); + // M312 - Sets the pen up feedrate multiplier. One means the pen will go up at the + // same speed (degrees/second) as it goes down. Each increase by one will + // logarithmically double the pen up speed. + case 312: + if (GCode.HasWord('P')) + { + penUpFeedrateMultiplier = GCode.GetWordValue('P'); - if (presetPenFeedrate > 0) - penFeedrate = presetPenFeedrate; - } - break; + if (penUpFeedrateMultiplier < 1) + penUpFeedrateMultiplier = 1; + } + break; - // M312 - Sets the pen up feedrate multiplier. One means the pen will go up at the - // same speed (degrees/second) as it goes down. Each increase by one will - // logarithmically double the pen up speed. - case 312: - if (GCode.HasWord('P')) - { - penUpFeedrateMultiplier = GCode.GetWordValue('P'); + case 402: // M402 - Set global zoom factor. + if (GCode.HasWord('S')) + zoom = GCode.GetWordValue('S'); + break; - if (penUpFeedrateMultiplier < 1) - penUpFeedrateMultiplier = 1; - } - break; + case 500: // M500 - Save pen configuration to EEPROM. + savePenConfiguration(); + break; - case 402: // M402 - Set global zoom factor. - if (GCode.HasWord('S')) - zoom = GCode.GetWordValue('S'); - break; + case 501: // M501 - Load pen configuration from EEPROM. + loadPenConfiguration(); + break; - case 500: // M500 - Save pen configuration to EEPROM. - savePenConfiguration(); - break; + case 502: // M502 - Clear pen configuration from EEPROM. + clearPenConfiguration(); + break; - case 501: // M501 - Load pen configuration from EEPROM. - loadPenConfiguration(); - break; +#if DEBUG == true + case 999: // M999 - Debugging command. + println(); + print("M301 P"); + print(minPenPosition); + print(" ;M301 Pxxx - Minimun Pen Position: "); + println(minPenPosition); - case 502: // M502 - Clear pen configuration from EEPROM. - clearPenConfiguration(); - break; + print("M302 P"); + print(maxPenPosition); + print(" ;M302 Pxxx - Maximun Pen Position: "); + println(maxPenPosition); -#if DEBUG == true - case 999: // M999 - Debugging command. - println(); - print("M301 P"); - print(minPenPosition); - print(" ;M301 Pxxx - Minimun Pen Position: "); - println(minPenPosition); - - print("M302 P"); - print(maxPenPosition); - print(" ;M302 Pxxx - Maximun Pen Position: "); - println(maxPenPosition); - - print("M303 P"); - print(penUpPosition); - print(" ;M303 Pxxx - Pen Up Position: "); - println(penUpPosition); - - print("M304 P"); - print(penDownPosition); - print(" ;M304 Pxxx - Pen Down Position: "); - println(penDownPosition); - - print("M305 P"); - print(mzMode); - print(" ;M305 Px - MZ Mode (0-M, 1-Z, 2-Auto): "); - print(mzMode); - print(" MZ Active Mode: "); - println(mzActiveMode); - - print("M306 P"); - print(mAdjust); - print(" ;M306 Px - M Adjust (0-Off, 1-Preset, 2-Calculated): "); - println(mAdjust); - - print("M307 P"); - print(zAdjust); - print(" ;M307 Px - Z Adjust: (0-Off, 1-Preset, 2-Calculated): "); - println(zAdjust); - - print("M308 P"); - print(mAdjustPreset); - print(" ;M308 Pxxx - M Adjust Preset: "); - print(mAdjustPreset); - print(" M Adjust Calculated: "); - println(mAdjustCalculated); - - print("M309 P"); - print(zAdjustPreset); - print(" ;M309 Pxxx - Z Adjust Preset: "); - print(zAdjustPreset); - print(" Z Adjust Calculated: "); - println(zAdjustCalculated); - - print("G1 X0 Y0 F"); - print(xyFeedrate); - print(" ;Gx Xxxx Yxxx Fxxx - XY Feedrate: "); - println(xyFeedrate); - - if (mzActiveMode == 0) - { - print("M300 S"); + print("M303 P"); print(penUpPosition); - print(" F"); - } - else - { - print("G1 Z"); - print(penUpPosition); - print(" F"); - } + print(" ;M303 Pxxx - Pen Up Position: "); + println(penUpPosition); + + print("M304 P"); + print(penDownPosition); + print(" ;M304 Pxxx - Pen Down Position: "); + println(penDownPosition); + + print("M305 P"); + print(mzMode); + print(" ;M305 Px - MZ Mode (0-M, 1-Z, 2-Auto): "); + print(mzMode); + print(" MZ Active Mode: "); + println(mzActiveMode); + + print("M306 P"); + print(mAdjust); + print(" ;M306 Px - M Adjust (0-Off, 1-Preset, 2-Calculated): "); + println(mAdjust); + + print("M307 P"); + print(zAdjust); + print(" ;M307 Px - Z Adjust: (0-Off, 1-Preset, 2-Calculated): "); + println(zAdjust); + + print("M308 P"); + print(mAdjustPreset); + print(" ;M308 Pxxx - M Adjust Preset: "); + print(mAdjustPreset); + print(" M Adjust Calculated: "); + println(mAdjustCalculated); + + print("M309 P"); + print(zAdjustPreset); + print(" ;M309 Pxxx - Z Adjust Preset: "); + print(zAdjustPreset); + print(" Z Adjust Calculated: "); + println(zAdjustCalculated); + + print("G1 X0 Y0 F"); + print(xyFeedrate); + print(" ;Gx Xxxx Yxxx Fxxx - XY Feedrate: "); + println(xyFeedrate); + + if (mzActiveMode == 0) + { + print("M300 S"); + print(penUpPosition); + print(" F"); + } + else + { + print("G1 Z"); + print(penUpPosition); + print(" F"); + } - print(penFeedrate); - print(" ;M300 Sxxx Fxxx or Gx Zxxx Fxxx - Pen Feedrate: "); - println(penFeedrate); + print(penFeedrate); + print(" ;M300 Sxxx Fxxx or Gx Zxxx Fxxx - Pen Feedrate: "); + println(penFeedrate); - print("M310 P"); - print(presetXyFeedrate); - print(" ;M310 Pxxx - Preset XY Feedrate : "); - println(presetXyFeedrate); + print("M310 P"); + print(presetXyFeedrate); + print(" ;M310 Pxxx - Preset XY Feedrate : "); + println(presetXyFeedrate); - print("M311 P"); - print(presetPenFeedrate); - print(" ;M311 Pxxx - Preset Pen Feedrate: "); - println(presetPenFeedrate); + print("M311 P"); + print(presetPenFeedrate); + print(" ;M311 Pxxx - Preset Pen Feedrate: "); + println(presetPenFeedrate); - print("M312 P"); - print(penUpFeedrateMultiplier); - print(" ;M312 Pxxx - Pen Up Feedrate Multiplier: "); - println(penUpFeedrateMultiplier); + print("M312 P"); + print(penUpFeedrateMultiplier); + print(" ;M312 Pxxx - Pen Up Feedrate Multiplier: "); + println(penUpFeedrateMultiplier); - print("M500 ;Save pen configuration to EEPROM. Values Saved in EEPROM ("); - print(EEPROM_MAGIC_NUMBER); - print("): "); - println(EEPROM.read(valueSavedEEPROMMemoryLocation)); + print("M500 ;Save pen configuration to EEPROM. Values Saved in EEPROM ("); + print(EEPROM_MAGIC_NUMBER); + print("): "); + println(EEPROM.read(valueSavedEEPROMMemoryLocation)); - println("M501 ;Load pen configuration from EEPROM (or defaults if cleared)."); - println("M502 ;Clear pen configuration from EEPROM."); - println("M18 ;Disable stepper motors."); + println("M501 ;Load pen configuration from EEPROM (or defaults if cleared)."); + println("M502 ;Clear pen configuration from EEPROM."); + println("M18 ;Disable stepper motors."); - println(); - break; + println(); + break; #endif + } } } - + // Done processing commands. if (Serial.available() <= 0) { From 29cb307866124e1446330545ecbf3759faaf53f9 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Tue, 24 May 2022 10:51:57 -0500 Subject: [PATCH 17/39] File corrections --- Utils/GCode/FlowerVine-A - 3 Color L-R #1 #2 #3.ngc | 2 +- Utils/Python/feeder.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Utils/GCode/FlowerVine-A - 3 Color L-R #1 #2 #3.ngc b/Utils/GCode/FlowerVine-A - 3 Color L-R #1 #2 #3.ngc index df95f67..50d3d55 100644 --- a/Utils/GCode/FlowerVine-A - 3 Color L-R #1 #2 #3.ngc +++ b/Utils/GCode/FlowerVine-A - 3 Color L-R #1 #2 #3.ngc @@ -3184,4 +3184,4 @@ G00 X0.0000 Y0.0000 M2 (Using default footer. To add your own footer create file "footer" in the output dir.) (end) -% \ No newline at end of file +% diff --git a/Utils/Python/feeder.py b/Utils/Python/feeder.py index b34b7fd..b3c2b90 100644 --- a/Utils/Python/feeder.py +++ b/Utils/Python/feeder.py @@ -9,7 +9,7 @@ # Configure: BAUDRATE = 115200 -DEVICE = "COM4" +DEVICE = "COM3" #DEVICE = "/dev/ttyUSB3" #DEVICE = "/dev/tty.PL2303-00001004" #DEVICE = "/dev/tty.PL2303-00004006" From 42c4c5ea79b11704c32266387b820f55d5c8bed2 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Tue, 24 May 2022 11:15:22 -0500 Subject: [PATCH 18/39] Pause after file printed. --- SphereBot.ino | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/SphereBot.ino b/SphereBot.ino index d8f20f9..2ec96db 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -447,6 +447,20 @@ void loop() } gCodeFile.close(); } + + println(); + println("Touch screen to continue..."); + + bool waitingOnScreenTouch = true; + while (waitingOnScreenTouch) + { + if (ts.touched()) + { + waitingOnScreenTouch = false; + } + + //TODO: Add Alarm + } } #endif } @@ -887,6 +901,7 @@ void processCommand() if (!serialMode) { println(); + GCode.RemoveCommentSeparators(); println(GCode.comments); println("Touch screen to continue..."); @@ -897,6 +912,8 @@ void processCommand() { waitingOnScreenTouch = false; } + + //TODO: Add Alarm } } break; @@ -1193,7 +1210,7 @@ void processCommand() } } } - + // Done processing commands. if (Serial.available() <= 0) { From 1a1711e7672648d048fb80febb2c7cdfd424776f Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Tue, 24 May 2022 15:47:46 -0500 Subject: [PATCH 19/39] Enum correction (mzActiveMode == M) --- SphereBot.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SphereBot.ino b/SphereBot.ino index 2ec96db..bbef087 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -1163,7 +1163,7 @@ void processCommand() print(" ;Gx Xxxx Yxxx Fxxx - XY Feedrate: "); println(xyFeedrate); - if (mzActiveMode == 0) + if (mzActiveMode == M) { print("M300 S"); print(penUpPosition); From 7cacb51e8d31ea682f8dcee4d6f47e254736e5bb Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Tue, 24 May 2022 15:56:18 -0500 Subject: [PATCH 20/39] Configuration.md completed through DEFAULT_MZ_MODE --- Configuration.h | 8 ++- Configuration.md | 163 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 Configuration.md diff --git a/Configuration.h b/Configuration.h index 06b4863..b7d82ae 100644 --- a/Configuration.h +++ b/Configuration.h @@ -121,11 +121,13 @@ // MZ Mode // 0 - M mode allows for normal pen control using M300 commands. // 1 - Z mode allows for pen control using G0, G1, G2 & G3 Z code parameter. -// 2 - Auto mode scans the file on the SD to automatically set the active MZ mode -// to either M or Z mode. When using the serial USB port the active mode -// defaults to M mode. +// 2 - Auto mode determines the active MZ mode based on the first pen control command received. +// A M300 command will set the active MZ mode to M mode. +// A G0, G1, G2 & G3 command with a Z code parameter will set the active MZ mode to Z mode. #define DEFAULT_MZ_MODE 0 + + // The M Adjusted mode allows for the M300 S code parameter to be adjusted. This // allows the for the use of G-Code files that have been calibrated to use on other SphereBots. // 0 - Off does not adjust the S code value. diff --git a/Configuration.md b/Configuration.md new file mode 100644 index 0000000..777ad7f --- /dev/null +++ b/Configuration.md @@ -0,0 +1,163 @@ +# Configuration Header Documentation + + +// Add debugging (M999) command. Note: Memory intensive. +## DEBUG +The ```DEBUG``` directive is a boolean true/false value with the default setting of true. The directive determines if the M999 debugging command code is included in the compile. This directive was add as a safety measure for development as the code is memory intensive with respect to both sketch (program storage) and global variables (dynamic memory) especially in the Arduino Uno. + +## ADAFRUIT_TFT_TOUCH_SHIELD +With the release of v2.0 you now have the option of adding an Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch. The shield adds a 320x240 capacitive touchscreen and SD card reader allowing your SphereBot to either accept g-gode files in the original manner through a USB connection with a PC or to directlt select files from an SD card. + +The ```ADAFRUIT_TFT_TOUCH_SHIELD``` directive is a boolean true/false value. When set to false the code compiles for the original configuration of an Arduino Uno and Adafruit motor shield. When set to true the code compiles to use the TFT touch shield with the orginal configuration. + +Note: A Mega 2560 is required due to the memory requirements of version 2.0 compiled with the ```ADAFRUIT_TFT_TOUCH_SHIELD``` directive set to true. Because the TFT touch shield screen uses digital pins 9 & 10 you will not be able to use one of the two 3-pin servo headers provided on the motor shield. Instead you will need to solder a 3-pin right-angle male header to the motor shield breakout area connecting pin 1 to ground, pin 2 to +5v and pin 3 to digital pin 6. On the TFT touch shield you will also need to cut the traces between 11-13 and solder bridge the ICSP pins for the board to work with the Mega 2560 board. REf: https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2/connecting#using-with-a-mega-slash-leonardo + +## TFT_CS +The ```TFT_CS``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch chip select pin number. The default is 10. + +## TFT_DC +The ```TFT_CS``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch data/command pin number. The default is 9. + +## TFT_ROTATION +The ```TFT_ROTATION``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display rotation. The code is optimized for landscape (wide) mode. 1 is landscape mode, with the USB jack at the top left, while rotation 3 is also landscape, but with the USB jack at the bottom right. The default is 3. + +## TFT_HEIGHT +The ```TFT_HEIGHT``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display height used for screen calculations. The default is 240. + +## TFT_WIDTH +The ```TFT_WIDTH``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display width used for screen calculations. The default is 320. + +## TFT_TEXT_SIZE +The ```TFT_TEXT_SIZE``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text size. The default is 1 which provides 30 lines 52 character long. + +## TFT_TEXT_HEIGHT +The ```TFT_TEXT_HEIGHT``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text height for the smallest text size (1) used for screen calculations. The default is 8. + +## TFT_TEXT_WIDTH +The ```TFT_TEXT_WIDTH``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text width for the smallest text size (1) used for screen calculations. The default is 6. + +## FT6206_THRESSHOLD +The ```FT6206_THRESSHOLD``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch screen thresshold (sensitivity). The default is 0x08. + +## SPLASH_SCREEN_DELAY 7000 +The ```SPLASH_SCREEN_DELAY``` directive sets the splash screen delay in milliseconds. The default is 7000. + +## SD_CS +The ```SPLASH_SCREEN_DELAY``` directive sets the SD card chip select pin. The default is 4. + +## ADAFRUIT_MOTOR_SHIELD_VERSION 2 +The ```SPLASH_SCREEN_DELAY``` directive sets the Adafruit Motor Shield version (1 or 2). The default is 2. + +## PEN_AXIS_PORT +The ```PEN_AXIS_PORT``` directive sets the pen arm stepper motor port. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default is 1. Note: M1 and M3 should have the same colored pairs of wires, as should M2 and M4. + +## ROTATION_AXIS_PORT 2 +The ```ROTATION_AXIS_PORT``` directive sets the rotation stepper motor port. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default is 2. Note: M1 and M3 should have the same colored pairs of wires, as should M2 and M4. + +## SERVO_PIN +The ```SERVO_PIN``` directive sets the servo pin. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default is 6 when using the TFT touch shield and can be either 9 or 10 in the original configuration. If you are adding the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch board you will need to solder a 3-pin right-angle male header to the break out area of the motor shield facing the edge with pin 1 wired to ground, pin 2 wired to +5V and pin 3 wired to digital pin 6 of the Arduino. + +## REVERSE_SERVO true +The ```REVERSE_SERVO``` directive is a boolean true/false that sets the up/down direction of the servo base on which side it is mounted. The default is true. + +## STEPS_PER_REVOLUTION 200 +The ```STEPS_PER_REVOLUTION``` directive is the number of step for a full rotation of the stepper motors used for calculations. Well known NEMA17 1.8 degrees motors have 200 steps. The default is 200. + +## DEFAULT_ZOOM_FACTOR +The ```DEFAULT_ZOOM_FACTOR``` directive is the zoom factor used for calculations. The default of 1.0 is suitable for Eggbot template and 200 steps/rev steppers at 16x microstepping. + +## DEFAULT_XY_FEEDRATE 400.0 +The ```DEFAULT_XY_FEEDRATE``` directive is the default stepper XY feedrate in steps/second used should the G-Code not contain a feedrate. The default is 400.0. + +## DEFAULT_PRESET_XY_FEEDRATE 0.0 +The ```DEFAULT_PRESET_XY_FEEDRATE``` directive is the default stepper preset XY feedrate in steps/second used only if not set to zero. The default is 0.0. + +## MIN_PEN_POSITION +The ```MIN_PEN_POSITION``` directive is the minimun pen down position allowed in order to prevent damage to the pen servo. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot minimun down position. The default is 100. + +## MAX_PEN_POSITION +The ```MAX_PEN_POSITION``` directive is the maximun pen up position allowed in order to prevent damage to the pen servo. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot maximun up position. The default is 160. + +## DEFAULT_PEN_UP_POSITION +The ```DEFAULT_PEN_UP_POSITION``` directive is the default pen up position used when drawing on an object. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot default pen up position. The default is 145. + +## DEFAULT_PEN_DOWN_POSITION +The ```DEFAULT_PEN_DOWN_POSITION``` directive is the default pen down position used when drawing on an object. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot default pen down position. The default is 115. + +## DEFAULT_PEN_FEEDRATE +The ```DEFAULT_PEN_FEEDRATE``` directive is the default pen feedrate in degrees/second necessary should G-Code not contain feedrate. This is the default setting used prior to saving values to the EEPROM. The default is 200.0. + +// The default preset Pen feedrate in degrees/second. Use perset feedrate if not zero. +## DEFAULT_PRESET_PEN_FEEDRATE +The ```DEFAULT_PRESET_PEN_FEEDRATE``` directive is the default preset pen feedrate in degrees/second used only if not set to zero. This is the default setting used prior to saving values to the EEPROM. The default is 0.0. + +## DEFAULT_PEN_UP_FEEDRATE_MULTIPLIER +The ```DEFAULT_PEN_UP_FEEDRATE_MULTIPLIER``` directive is the default preset pen up feedrate in degrees/second. This is the default setting used prior to saving values to the EEPROM. Each increase by one will logarithmically double the pen up speed. i.e. A multiplier of 2 will cause the pen to go up at twice the speed it went down. The default is 3. + +## DEFAULT_MZ_MODE +The ```DEFAULT_MZ_MODE``` directive is the default settings of M and Z code modes to allow for increased flexablity controlling the pen servo. + + 0 - M mode allows for normal pen control using M300 commands. + 1 - Z mode allows for pen control using G0, G1, G2 & G3 Z code parameter. + 2 - Auto mode determines the active MZ mode based on the first pen control command received. A M300 command will set the active MZ mode to M mode. A G0, G1, G2 & G3 command with a Z code parameter will set the active MZ mode to Z mode. + + +This is the default setting used prior to saving values to the EEPROM. The default is 0. + +// The M Adjusted mode allows for the M300 S code parameter to be adjusted. This +// allows the for the use of G-Code files that have been calibrated to use on other SphereBots. +// 0 - Off does not adjust the S code value. +// 1 - Preset defines the S value at which all S values at or above are adjusted to the pen up +// setting. All values below the preset value are adjusted to the pen down seting. +// 2 - Calculated determines the S value at which all S values at or above are adjusted to the +// pen up setting by taking the first M300 command S values. All values below the calculated +// value are adjusted to the pen down seting. +## DEFAULT_M_ADJUST 0 + +// The Z Adjusted mode allows for the G0, G1, G2 & G3 Z code parameter to be adjusted. +// This allows for the use of G-Code files that have been calibrated to use on other SphereBots. +// 0 - Off does not adjust the Z code value. +// 1 - Preset defines the Z value at which all Z values at or above are adjusted to the pen up +// setting. All values below the preset value are adjusted to the pen down seting. +// 2 - Calculated determines the Z value at which all Z values at or above are adjusted to the +// pen up setting by taking the first G0, G1, G2 or G3 (usually G0) command's Z values. All +// values below the calculated value are adjusted to the pen down seting. +## DEFAULT_Z_ADJUST 0 + +// If in serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun +// values to set the absolute or average adjustment threshold. In this case the following +// default is used for M300 commands. The value can also be set with the M308 command. +## DEFAULT_M_ADJUST_PRESET 145 + +// If in serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun +// values to set the absolute or average adjustment threshold. In this case the following +// default is used for G0, G1, G2, & G3 Z parameters. The value can also be set with the M309 command. +## DEFAULT_Z_ADJUST_PRESET 5 + + +// X axis gets clamped to these values to prevent inadvertent damage. +// Most drawings are 800 (-400 and 400) by 3200. +## MIN_PEN_AXIS_STEP -480 +## MAX_PEN_AXIS_STEP 480 + +// Version dependent configurations. +#if ADAFRUIT_MOTOR_SHIELD_VERSION == 1 + + #include + + ## ADAFRUIT_CLASS AF_Stepper + ## ONE_STEP_TIME 168 + // steps/s. A no-delay loop takes 0.17 ms per step, so this is the fastest we can go. + ## MAX_XY_FEEDRATE 2900.0 + +#else + + #include + //#include + + ## ADAFRUIT_CLASS Adafruit_StepperMotor + ## ONE_STEP_TIME 1290 + // steps/s. A no-delay loop takes 1.29 ms per step, so this is the fastest we can go. + ## MAX_XY_FEEDRATE 775.0 + +#endif From bb85af3c360e76a6504bef28763a5d6b84ceb18e Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Tue, 24 May 2022 16:01:05 -0500 Subject: [PATCH 21/39] Added initializePenConfiguration(). --- SphereBot.ino | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index bbef087..38a3673 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -430,6 +430,7 @@ void loop() // Print File setTextDisplay(); + initializePenConfiguration(); // Build design image filename. Start with folder. char gCodeFilename[DEFAULT_FILE_NAME_SIZE + 7] = "/gcode/"; // Add the gcode filename. @@ -583,6 +584,13 @@ void advanceToNextLineOnDisplay() } #endif +// Initialize pen settings. +void initializePenConfiguration() +{ + // Used to determine the MZ mode when set to Auto. + mzActiveMode = mzMode; +} + // Loads the pen configuration from memory. void loadPenConfiguration() { @@ -633,8 +641,7 @@ void loadPenConfiguration() if (presetPenFeedrate > 0) penFeedrate = presetPenFeedrate; - // Used to determine the MZ mode when set to Auto. - mzActiveMode = mzMode; + initializePenConfiguration(); } // Saves the pen configuration to memeoy. From a9792cf5641886f2cdcd579961e293924f7c1efb Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Wed, 25 May 2022 14:20:45 -0500 Subject: [PATCH 22/39] More configuration documentation. --- Configuration.h | 10 +-- Configuration.md | 187 ++++++++++++++++++++++++----------------------- SphereBot.ino | 2 +- 3 files changed, 100 insertions(+), 99 deletions(-) diff --git a/Configuration.h b/Configuration.h index b7d82ae..68b68a1 100644 --- a/Configuration.h +++ b/Configuration.h @@ -51,9 +51,7 @@ #define SD_CS 4 -// Version of Adafruit motor shield used. One of the two lines should be commented out. - -//#define ADAFRUIT_MOTOR_SHIELD_VERSION 1 +// Version of Adafruit motor shield used. Set to version 1 or 2. #define ADAFRUIT_MOTOR_SHIELD_VERSION 2 /* @@ -126,8 +124,6 @@ // A G0, G1, G2 & G3 command with a Z code parameter will set the active MZ mode to Z mode. #define DEFAULT_MZ_MODE 0 - - // The M Adjusted mode allows for the M300 S code parameter to be adjusted. This // allows the for the use of G-Code files that have been calibrated to use on other SphereBots. // 0 - Off does not adjust the S code value. @@ -148,12 +144,12 @@ // values below the calculated value are adjusted to the pen down seting. #define DEFAULT_Z_ADJUST 0 -// If in serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun +// In serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun // values to set the absolute or average adjustment threshold. In this case the following // default is used for M300 commands. The value can also be set with the M308 command. #define DEFAULT_M_ADJUST_PRESET 145 -// If in serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun +// In serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun // values to set the absolute or average adjustment threshold. In this case the following // default is used for G0, G1, G2, & G3 Z parameters. The value can also be set with the M309 command. #define DEFAULT_Z_ADJUST_PRESET 5 diff --git a/Configuration.md b/Configuration.md index 777ad7f..85d61cd 100644 --- a/Configuration.md +++ b/Configuration.md @@ -1,163 +1,168 @@ # Configuration Header Documentation +The following documentation details all of the #define directives found in the configuration.h file. They are ordered as they are found in the configuration.h file. + +While many of these directives are critical to the configuration of a specific SphereBot, most of the the directives allow for future flexability in the code and should not be altered from their default setting. The following outlines the directives you should concern yourself with when compiling the code for your SphereBot. + +As mentioned in the ReadMe.md please do not fork this code just to have a copy unless you plan on making meaningful contributions which could be merged back in as GitHub forks are overused, abused, and misused. Forks are not meant to be used to keep a copy of the code in your personal repository. More information on the proper use of forks can be found at… + +https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-forks +https://docs.github.com/en/github/getting-started-with-github/fork-a-repo + +Instead clone the project and create a personal branch in which you can store your modification to configuration.h. In this way you can pull updates to master and merge them into your branch without losing your specific configuration. + +First you need to configure the code to compile for the appropriate hardware configuration. If you are going with the original hardware configuration of an Arduino Uno and Adafruit Motor Shield you will need to set the ```ADAFRUIT_TFT_TOUCH_SHIELD``` directive to false. If you plan on using the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch set the ```ADAFRUIT_TFT_TOUCH_SHIELD``` directive to true which is the default. + +Based on the time of this release it is highly unlikely that you are using version 1 of the Adafruit motor shield, but if you are you will need to set the ```ADAFRUIT_MOTOR_SHIELD_VERSION``` directive to 1. And unless you have some unknow need to alter the default pin settings on the TFT touch shield you will not need to alter the ```TFT_CS```, ```TFT_DC``` or ```SD_CS``` directives. + +Depending on the mounting/orentation of your Arduino you may need to adjust the ```TFT_ROTATION``` directive which sets the display screen rotation. The code is optimized for landscape (wide) mode. 1 is landscape mode, with the USB jack at the top left, while rotation 3 is also landscape, but with the USB jack at the bottom right. The default setting is 3. + +//TODO: Complete Section and check list... + +### Minimun Configuration Check List + +1. ```ADAFRUIT_TFT_TOUCH_SHIELD``` set to false if not using TFT touch shield. +2. ```ADAFRUIT_MOTOR_SHIELD_VERSION``` set to one if using version 1 motor shield. +3. ```TFT_ROTATION``` may need to be altered based on mounting/orentation of your Arduino. -// Add debugging (M999) command. Note: Memory intensive. ## DEBUG -The ```DEBUG``` directive is a boolean true/false value with the default setting of true. The directive determines if the M999 debugging command code is included in the compile. This directive was add as a safety measure for development as the code is memory intensive with respect to both sketch (program storage) and global variables (dynamic memory) especially in the Arduino Uno. +The ```DEBUG``` directive sets a boolean true/false value with the default setting of true. The directive determines if the M999 debugging command code is included in the compile. This directive was add as a safety measure for development as the code is memory intensive with respect to both sketch (program storage) and global variables (dynamic memory) especially in the Arduino Uno. ## ADAFRUIT_TFT_TOUCH_SHIELD With the release of v2.0 you now have the option of adding an Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch. The shield adds a 320x240 capacitive touchscreen and SD card reader allowing your SphereBot to either accept g-gode files in the original manner through a USB connection with a PC or to directlt select files from an SD card. -The ```ADAFRUIT_TFT_TOUCH_SHIELD``` directive is a boolean true/false value. When set to false the code compiles for the original configuration of an Arduino Uno and Adafruit motor shield. When set to true the code compiles to use the TFT touch shield with the orginal configuration. +The ```ADAFRUIT_TFT_TOUCH_SHIELD``` directive sets a boolean true/false value. When set to false the code compiles for the original configuration of an Arduino Uno and Adafruit motor shield. When set to true the code compiles to use the TFT touch shield with the orginal configuration. Note: A Mega 2560 is required due to the memory requirements of version 2.0 compiled with the ```ADAFRUIT_TFT_TOUCH_SHIELD``` directive set to true. Because the TFT touch shield screen uses digital pins 9 & 10 you will not be able to use one of the two 3-pin servo headers provided on the motor shield. Instead you will need to solder a 3-pin right-angle male header to the motor shield breakout area connecting pin 1 to ground, pin 2 to +5v and pin 3 to digital pin 6. On the TFT touch shield you will also need to cut the traces between 11-13 and solder bridge the ICSP pins for the board to work with the Mega 2560 board. REf: https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2/connecting#using-with-a-mega-slash-leonardo ## TFT_CS -The ```TFT_CS``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch chip select pin number. The default is 10. +The ```TFT_CS``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch chip select pin number. The default setting is 10. ## TFT_DC -The ```TFT_CS``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch data/command pin number. The default is 9. +The ```TFT_DC``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch data/command pin number. The default setting is 9. ## TFT_ROTATION -The ```TFT_ROTATION``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display rotation. The code is optimized for landscape (wide) mode. 1 is landscape mode, with the USB jack at the top left, while rotation 3 is also landscape, but with the USB jack at the bottom right. The default is 3. +The ```TFT_ROTATION``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display rotation. The code is optimized for landscape (wide) mode. 1 is landscape mode, with the USB jack at the top left, while rotation 3 is also landscape, but with the USB jack at the bottom right. The default setting is 3. ## TFT_HEIGHT -The ```TFT_HEIGHT``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display height used for screen calculations. The default is 240. +The ```TFT_HEIGHT``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display height used for screen calculations. The default setting is 240. ## TFT_WIDTH -The ```TFT_WIDTH``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display width used for screen calculations. The default is 320. +The ```TFT_WIDTH``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display width used for screen calculations. The default setting is 320. ## TFT_TEXT_SIZE -The ```TFT_TEXT_SIZE``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text size. The default is 1 which provides 30 lines 52 character long. +The ```TFT_TEXT_SIZE``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text size. The default setting is 1 which provides 30 lines 52 character long. ## TFT_TEXT_HEIGHT -The ```TFT_TEXT_HEIGHT``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text height for the smallest text size (1) used for screen calculations. The default is 8. +The ```TFT_TEXT_HEIGHT``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text height for the smallest text size (1) used for screen calculations. The default setting is 8. ## TFT_TEXT_WIDTH -The ```TFT_TEXT_WIDTH``` directive is the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text width for the smallest text size (1) used for screen calculations. The default is 6. +The ```TFT_TEXT_WIDTH``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text width for the smallest text size (1) used for screen calculations. The default setting is 6. ## FT6206_THRESSHOLD -The ```FT6206_THRESSHOLD``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch screen thresshold (sensitivity). The default is 0x08. +The ```FT6206_THRESSHOLD``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch screen thresshold (sensitivity). The default setting is 0x08. ## SPLASH_SCREEN_DELAY 7000 -The ```SPLASH_SCREEN_DELAY``` directive sets the splash screen delay in milliseconds. The default is 7000. +The ```SPLASH_SCREEN_DELAY``` directive sets the splash screen delay in milliseconds. The default setting is 7000. ## SD_CS -The ```SPLASH_SCREEN_DELAY``` directive sets the SD card chip select pin. The default is 4. +The ```SPLASH_SCREEN_DELAY``` directive sets the SD card chip select pin. The default setting is 4. -## ADAFRUIT_MOTOR_SHIELD_VERSION 2 -The ```SPLASH_SCREEN_DELAY``` directive sets the Adafruit Motor Shield version (1 or 2). The default is 2. +## ADAFRUIT_MOTOR_SHIELD_VERSION +The ```ADAFRUIT_MOTOR_SHIELD_VERSION``` directive sets the Adafruit Motor Shield version (1 or 2). The default setting is 2. ## PEN_AXIS_PORT -The ```PEN_AXIS_PORT``` directive sets the pen arm stepper motor port. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default is 1. Note: M1 and M3 should have the same colored pairs of wires, as should M2 and M4. +The ```PEN_AXIS_PORT``` directive sets the pen arm stepper motor port. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default setting is 1. Note: M1 and M3 should have the same colored pairs of wires, as should M2 and M4. ## ROTATION_AXIS_PORT 2 -The ```ROTATION_AXIS_PORT``` directive sets the rotation stepper motor port. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default is 2. Note: M1 and M3 should have the same colored pairs of wires, as should M2 and M4. +The ```ROTATION_AXIS_PORT``` directive sets the rotation stepper motor port. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default setting is 2. Note: M1 and M3 should have the same colored pairs of wires, as should M2 and M4. ## SERVO_PIN -The ```SERVO_PIN``` directive sets the servo pin. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default is 6 when using the TFT touch shield and can be either 9 or 10 in the original configuration. If you are adding the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch board you will need to solder a 3-pin right-angle male header to the break out area of the motor shield facing the edge with pin 1 wired to ground, pin 2 wired to +5V and pin 3 wired to digital pin 6 of the Arduino. +The ```SERVO_PIN``` directive sets the servo pin. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default setting is 6 when using the TFT touch shield and can be either 9 or 10 in the original configuration. If you are adding the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch board you will need to solder a 3-pin right-angle male header to the break out area of the motor shield facing the edge with pin 1 wired to ground, pin 2 wired to +5V and pin 3 wired to digital pin 6 of the Arduino. ## REVERSE_SERVO true -The ```REVERSE_SERVO``` directive is a boolean true/false that sets the up/down direction of the servo base on which side it is mounted. The default is true. +The ```REVERSE_SERVO``` directive sets a boolean true/false that sets the up/down direction of the servo base on which side it is mounted. The default setting is true. ## STEPS_PER_REVOLUTION 200 -The ```STEPS_PER_REVOLUTION``` directive is the number of step for a full rotation of the stepper motors used for calculations. Well known NEMA17 1.8 degrees motors have 200 steps. The default is 200. +The ```STEPS_PER_REVOLUTION``` directive sets the number of step for a full rotation of the stepper motors used for calculations. Well known NEMA17 1.8 degrees motors have 200 steps. The default setting is 200. ## DEFAULT_ZOOM_FACTOR -The ```DEFAULT_ZOOM_FACTOR``` directive is the zoom factor used for calculations. The default of 1.0 is suitable for Eggbot template and 200 steps/rev steppers at 16x microstepping. +The ```DEFAULT_ZOOM_FACTOR``` directive sets the zoom factor used for calculations. The default of 1.0 is suitable for Eggbot template and 200 steps/rev steppers at 16x microstepping. ## DEFAULT_XY_FEEDRATE 400.0 -The ```DEFAULT_XY_FEEDRATE``` directive is the default stepper XY feedrate in steps/second used should the G-Code not contain a feedrate. The default is 400.0. +The ```DEFAULT_XY_FEEDRATE``` directive sets the default stepper XY feedrate in steps/second used should the G-Code not contain a feedrate. The default setting is 400.0. ## DEFAULT_PRESET_XY_FEEDRATE 0.0 -The ```DEFAULT_PRESET_XY_FEEDRATE``` directive is the default stepper preset XY feedrate in steps/second used only if not set to zero. The default is 0.0. +The ```DEFAULT_PRESET_XY_FEEDRATE``` directive sets the default stepper preset XY feedrate in steps/second used only if not set to zero. The default setting is 0.0. ## MIN_PEN_POSITION -The ```MIN_PEN_POSITION``` directive is the minimun pen down position allowed in order to prevent damage to the pen servo. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot minimun down position. The default is 100. +The ```MIN_PEN_POSITION``` directive sets the minimun pen down position allowed in order to prevent damage to the pen servo. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot minimun down position. The default setting is 100. ## MAX_PEN_POSITION -The ```MAX_PEN_POSITION``` directive is the maximun pen up position allowed in order to prevent damage to the pen servo. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot maximun up position. The default is 160. +The ```MAX_PEN_POSITION``` directive sets the maximun pen up position allowed in order to prevent damage to the pen servo. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot maximun up position. The default setting is 160. ## DEFAULT_PEN_UP_POSITION -The ```DEFAULT_PEN_UP_POSITION``` directive is the default pen up position used when drawing on an object. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot default pen up position. The default is 145. +The ```DEFAULT_PEN_UP_POSITION``` directive sets the default pen up position used when drawing on an object. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot default pen up position. The default setting is 145. ## DEFAULT_PEN_DOWN_POSITION -The ```DEFAULT_PEN_DOWN_POSITION``` directive is the default pen down position used when drawing on an object. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot default pen down position. The default is 115. +The ```DEFAULT_PEN_DOWN_POSITION``` directive sets the default pen down position used when drawing on an object. This is the default setting used prior to saving values to the EEPROM. This setting can be manually fine tuned by sending M300 codes to determine your SphereBot default pen down position. The default setting is 115. ## DEFAULT_PEN_FEEDRATE -The ```DEFAULT_PEN_FEEDRATE``` directive is the default pen feedrate in degrees/second necessary should G-Code not contain feedrate. This is the default setting used prior to saving values to the EEPROM. The default is 200.0. +The ```DEFAULT_PEN_FEEDRATE``` directive sets the default pen feedrate in degrees/second necessary should G-Code not contain feedrate. This is the default setting used prior to saving values to the EEPROM. The default setting is 200.0. // The default preset Pen feedrate in degrees/second. Use perset feedrate if not zero. ## DEFAULT_PRESET_PEN_FEEDRATE -The ```DEFAULT_PRESET_PEN_FEEDRATE``` directive is the default preset pen feedrate in degrees/second used only if not set to zero. This is the default setting used prior to saving values to the EEPROM. The default is 0.0. +The ```DEFAULT_PRESET_PEN_FEEDRATE``` directive sets the default preset pen feedrate in degrees/second used only if not set to zero. This is the default setting used prior to saving values to the EEPROM. The default setting is 0.0. ## DEFAULT_PEN_UP_FEEDRATE_MULTIPLIER -The ```DEFAULT_PEN_UP_FEEDRATE_MULTIPLIER``` directive is the default preset pen up feedrate in degrees/second. This is the default setting used prior to saving values to the EEPROM. Each increase by one will logarithmically double the pen up speed. i.e. A multiplier of 2 will cause the pen to go up at twice the speed it went down. The default is 3. +The ```DEFAULT_PEN_UP_FEEDRATE_MULTIPLIER``` directive sets the default preset pen up feedrate in degrees/second. This is the default setting used prior to saving values to the EEPROM. Each increase by one will logarithmically double the pen up speed. i.e. A multiplier of 2 will cause the pen to go up at twice the speed it went down. The default setting is 3. ## DEFAULT_MZ_MODE -The ```DEFAULT_MZ_MODE``` directive is the default settings of M and Z code modes to allow for increased flexablity controlling the pen servo. +The ```DEFAULT_MZ_MODE``` directive sets the default settings of M and Z code modes to allow for increased flexablity controlling the pen servo. 0 - M mode allows for normal pen control using M300 commands. 1 - Z mode allows for pen control using G0, G1, G2 & G3 Z code parameter. 2 - Auto mode determines the active MZ mode based on the first pen control command received. A M300 command will set the active MZ mode to M mode. A G0, G1, G2 & G3 command with a Z code parameter will set the active MZ mode to Z mode. -This is the default setting used prior to saving values to the EEPROM. The default is 0. - -// The M Adjusted mode allows for the M300 S code parameter to be adjusted. This -// allows the for the use of G-Code files that have been calibrated to use on other SphereBots. -// 0 - Off does not adjust the S code value. -// 1 - Preset defines the S value at which all S values at or above are adjusted to the pen up -// setting. All values below the preset value are adjusted to the pen down seting. -// 2 - Calculated determines the S value at which all S values at or above are adjusted to the -// pen up setting by taking the first M300 command S values. All values below the calculated -// value are adjusted to the pen down seting. -## DEFAULT_M_ADJUST 0 - -// The Z Adjusted mode allows for the G0, G1, G2 & G3 Z code parameter to be adjusted. -// This allows for the use of G-Code files that have been calibrated to use on other SphereBots. -// 0 - Off does not adjust the Z code value. -// 1 - Preset defines the Z value at which all Z values at or above are adjusted to the pen up -// setting. All values below the preset value are adjusted to the pen down seting. -// 2 - Calculated determines the Z value at which all Z values at or above are adjusted to the -// pen up setting by taking the first G0, G1, G2 or G3 (usually G0) command's Z values. All -// values below the calculated value are adjusted to the pen down seting. -## DEFAULT_Z_ADJUST 0 - -// If in serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun -// values to set the absolute or average adjustment threshold. In this case the following -// default is used for M300 commands. The value can also be set with the M308 command. -## DEFAULT_M_ADJUST_PRESET 145 - -// If in serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun -// values to set the absolute or average adjustment threshold. In this case the following -// default is used for G0, G1, G2, & G3 Z parameters. The value can also be set with the M309 command. -## DEFAULT_Z_ADJUST_PRESET 5 - - -// X axis gets clamped to these values to prevent inadvertent damage. -// Most drawings are 800 (-400 and 400) by 3200. -## MIN_PEN_AXIS_STEP -480 -## MAX_PEN_AXIS_STEP 480 - -// Version dependent configurations. -#if ADAFRUIT_MOTOR_SHIELD_VERSION == 1 - - #include - - ## ADAFRUIT_CLASS AF_Stepper - ## ONE_STEP_TIME 168 - // steps/s. A no-delay loop takes 0.17 ms per step, so this is the fastest we can go. - ## MAX_XY_FEEDRATE 2900.0 - -#else - - #include - //#include - - ## ADAFRUIT_CLASS Adafruit_StepperMotor - ## ONE_STEP_TIME 1290 - // steps/s. A no-delay loop takes 1.29 ms per step, so this is the fastest we can go. - ## MAX_XY_FEEDRATE 775.0 - -#endif +This is the default setting used prior to saving values to the EEPROM. The default setting is 0. + +## DEFAULT_M_ADJUST +The ```DEFAULT_M_ADJUST``` directive sets the M Adjust mode. The M Adjusted mode allows for the M300 S code parameter to be adjusted. This allows the for the use of G-Code files that have been calibrated to use on other SphereBots. + + 0 - Off does not adjust the S code value. + 1 - Preset defines the S value at which all S values at or above are adjusted to the pen up setting. All values below the preset value are adjusted to the pen down seting. + 2 - Calculated determines the S value at which all S values at or above are adjusted to the pen up setting by taking the first M300 command S values. All values below the calculated value are adjusted to the pen down seting. + +The default setting is 0. + +## DEFAULT_Z_ADJUST +The ```DEFAULT_Z_ADJUST``` directive sets the Z Adjust mode. The Z Adjusted mode allows for the G0, G1, G2 & G3 Z code parameter to be adjusted. This allows for the use of G-Code files that have been calibrated to use on other SphereBots. + + 0 - Off does not adjust the Z code value. + 1 - Preset defines the Z value at which all Z values at or above are adjusted to the pen up setting. All values below the preset value are adjusted to the pen down seting. + 2 - Calculated determines the Z value at which all Z values at or above are adjusted to the pen up setting by taking the first G0, G1, G2 or G3 (usually G0) command's Z values. All values below the calculated value are adjusted to the pen down seting. + +The default setting is 0. + +## DEFAULT_M_ADJUST_PRESET +The ```DEFAULT_M_ADJUST_PRESET``` directive sets the Z Adjust preset. In serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun values to set the absolute or average adjustment threshold. In this case the following default is used for M300 commands. The value can also be set with the M308 command. The default setting is 145. + + +## DEFAULT_Z_ADJUST_PRESET +The ```DEFAULT_Z_ADJUST_PRESET``` directive sets the Z Adjust preset. In serial USB mode the G-Code cannot be preprocessed (scanned) for maximun and minimun values to set the absolute or average adjustment threshold. In this case the following default is used for G0, G1, G2, & G3 Z parameters. The value can also be set with the M309 command. The default setting is 5 + +## MIN_PEN_AXIS_STEP +The ```MIN_PEN_AXIS_STEP```directive sets the pens minimun X axis movement from center. The default setting is -480. The X axis gets clamped to these values to prevent inadvertent damage. Most drawings are 800 (-400 and 400) by 3200. + +## MAX_PEN_AXIS_STEP +The ```MAX_PEN_AXIS_STEP```directive sets the pens maximun X axis movement from center. The default setting is 480. The X axis gets clamped to these values to prevent inadvertent damage. Most drawings are 800 (-400 and 400) by 3200. + +## ADAFRUIT_CLASS +The ```ADAFRUIT_CLASS``` directive sets the Adafruit class to use based on the motor shield version. For version 1 it should be set to AF_Stepper. For version 2 it should be set to Adafruit_StepperMotor. + +## ONE_STEP_TIME +The ```ONE_STEP_TIME``` directive sets the motor shield one step time. The default setting for version 1 is 168 steps/s as a no-delay loop takes 0.17 ms per step, so this is the fastest we can go. The default setting for version 2 is 1290 steps/s as a no-delay loop takes 1.29 ms per step, so this is the fastest we can go. + +## MAX_XY_FEEDRATE +The ```MAX_XY_FEEDRATE``` directive sets the motor shield maximun XY feedrate. The default setting for version 1 is 2900.0. The default setting for version 2 is 775.0. diff --git a/SphereBot.ino b/SphereBot.ino index 38a3673..57aef89 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -1116,7 +1116,7 @@ void processCommand() println(); print("M301 P"); print(minPenPosition); - print(" ;M301 Pxxx - Minimun Pen Position: "); + print(" ;M301 Pxxx - Minimun Pen Position: "); println(minPenPosition); print("M302 P"); From 0d5b3c609268c386baefaa9ebae163c7db158d99 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Wed, 25 May 2022 18:57:35 -0500 Subject: [PATCH 23/39] Eliminated jitter caused by I2C!!! --- .vscode/c_cpp_properties.json | 2 +- SphereBot.ino | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 8a26091..6b253d3 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -55,7 +55,7 @@ "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_FT6206_Library", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_ImageReader_Library", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_SPIFlash\\src", - "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Servo\\src", + "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_TiCoServo", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_BusIO", "D:\\Users\\tgoll\\OneDrive - Cimarron Ravine, L.L.C\\Documents\\Arduino\\libraries\\Adafruit_EPD\\src", "c:\\users\\tgoll\\appdata\\local\\arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\lib\\gcc\\avr\\7.3.0\\include", diff --git a/SphereBot.ino b/SphereBot.ino index 57aef89..974392f 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -135,8 +135,10 @@ in the "Configuration.h" file. // DualStepper Library for Adafruit Motor Shield #include "DualStepper.h" -// Servo Library -#include +// Servo Library. Adafruit TiCoServo library https://learn.adafruit.com/neopixels-and-servos/the-ticoservo-library +// Eliminates jitter caused by I2C (i.e. touch screen) when using standard Arduino Servo library. +// Also tested/considered Servo Hardware PWM libruary include https://github.com/dadul96/Arduino-Servo-Hardware-PWM-Library +#include #include @@ -227,7 +229,7 @@ SingleStepper *yStepper = DualStepper *steppers = new DualStepper(xStepper, yStepper, STEPS_PER_REVOLUTION *MICROSTEPS); -Servo servo; +Adafruit_TiCoServo servo; // GCode states. boolean absoluteMode = true; From 71ab1b795fcd731cab21ce8a6e789478f72ad812 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Wed, 25 May 2022 22:33:29 -0500 Subject: [PATCH 24/39] Added file info. --- SphereBot.ino | 89 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 72 insertions(+), 17 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 974392f..1ed1d81 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -368,25 +368,34 @@ void loop() TouchscreenButton print = TouchscreenButton(220, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/print.bmp"); TouchscreenButton next = TouchscreenButton(280, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/next.bmp"); + bool displayInfo = false; bool waitingOnFileSelection = true; while (waitingOnFileSelection) { filename = alphabeticSDFileList.Current(); - // Build design image filename. Start with folder. - char designImageFilename[DEFAULT_FILE_NAME_SIZE + 13] = "/designs/"; - // Add the gcode filename. - strcat(designImageFilename, filename); - // Remove filename extension. - char *ext = strrchr(designImageFilename, '.'); - if (ext != nullptr) - ext[0] = '\0'; - // Add the image file extension. - strcat(designImageFilename, ".bmp"); - - // Paint screen with design image. - tft.fillScreen(ILI9341_BLACK); - ImageReturnCode stat = reader.drawBMP(designImageFilename, tft, 0, 0); + if (displayInfo) + DisplayFileInfo(filename); + else + { + // Build design image filename. Start with folder. + char designImageFilename[DEFAULT_FILE_NAME_SIZE + 13] = "/designs/"; + // Add the gcode filename. + strcat(designImageFilename, filename); + // Remove filename extension. + char *ext = strrchr(designImageFilename, '.'); + if (ext != nullptr) + ext[0] = '\0'; + // Add the image file extension. + strcat(designImageFilename, ".bmp"); + + // Paint screen with design image. + tft.fillScreen(ILI9341_BLACK); + ImageReturnCode imageReturnCode = reader.drawBMP(designImageFilename, tft, 0, 0); + + if (imageReturnCode != IMAGE_SUCCESS) + DisplayFileInfo(filename); + } // Display menu bar. tft.fillRect(0, 200, 320, 40, ILI9341_WHITE); @@ -406,12 +415,13 @@ void loop() if (next.Touched(p.x, p.y)) { alphabeticSDFileList.Next(); + displayInfo = false; waitingOnButtonPress = false; } if (information.Touched(p.x, p.y)) { - // TODO: Display information... + displayInfo = !displayInfo; waitingOnButtonPress = false; } @@ -424,6 +434,7 @@ void loop() if (previous.Touched(p.x, p.y)) { alphabeticSDFileList.Previous(); + displayInfo = false; waitingOnButtonPress = false; } } @@ -433,7 +444,7 @@ void loop() // Print File setTextDisplay(); initializePenConfiguration(); - // Build design image filename. Start with folder. + // Build gcode filename. Start with folder. char gCodeFilename[DEFAULT_FILE_NAME_SIZE + 7] = "/gcode/"; // Add the gcode filename. strcat(gCodeFilename, filename); @@ -448,6 +459,7 @@ void loop() processCommand(); } } + gCodeFile.close(); } @@ -563,6 +575,49 @@ void println() } #if ADAFRUIT_TFT_TOUCH_SHIELD +void DisplayFileInfo(char *filename) +{ + setTextDisplay(); + + // Build gcode filename. Start with folder. + char gCodeFilename[DEFAULT_FILE_NAME_SIZE + 7] = "/gcode/"; + // Add the gcode filename. + strcat(gCodeFilename, filename); + File gCodeFile = SD.open(gCodeFilename); + if (gCodeFile) + { + bool firstCommentFound = false; + bool hasWord = false; + + while (gCodeFile.available() > 0 && !hasWord) + { + if (GCode.AddCharToLine(gCodeFile.read())) + { + GCode.ParseLine(); + + if (GCode.comments[0]) + firstCommentFound = true; + + if (firstCommentFound) + { + hasWord = GCode.line[0] > 0 && GCode.line[0] != '%'; + + if (!hasWord) + { + GCode.RemoveCommentSeparators(); + println(GCode.comments); + } + } + } + } + + gCodeFile.close(); + + println(); + println(filename); + } +} + void setTextDisplay() { tft.fillScreen(ILI9341_BLACK); @@ -577,7 +632,7 @@ void advanceToNextLineOnDisplay() { currentDisplayLine = currentDisplayLine + 1; - if (currentDisplayLine > (TFT_HEIGHT / TFT_TEXT_HEIGHT)) + if (currentDisplayLine > (TFT_HEIGHT / TFT_TEXT_HEIGHT)) currentDisplayLine = 1; tft.fillRect(0, (currentDisplayLine - 1) * TFT_TEXT_HEIGHT, TFT_WIDTH, TFT_TEXT_HEIGHT, ILI9341_BLACK); From 939f04f17c10a1d43cb0f8f88e95519d4dcda6cd Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Thu, 26 May 2022 16:46:57 -0500 Subject: [PATCH 25/39] Using new method GCode.NoWords() --- SphereBot.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SphereBot.ino b/SphereBot.ino index 1ed1d81..4f32561 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -600,7 +600,7 @@ void DisplayFileInfo(char *filename) if (firstCommentFound) { - hasWord = GCode.line[0] > 0 && GCode.line[0] != '%'; + hasWord = !GCode.NoWords(); if (!hasWord) { From de27590d2e07635a414222fabcd7131c8c0e424e Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Thu, 26 May 2022 17:14:06 -0500 Subject: [PATCH 26/39] Added TFT_TEXT_COLOR and TFT_TEXT_BACKGROUND_COLOR --- Configuration.h | 2 ++ Configuration.md | 6 ++++++ SphereBot.ino | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Configuration.h b/Configuration.h index 68b68a1..c186593 100644 --- a/Configuration.h +++ b/Configuration.h @@ -42,6 +42,8 @@ #define TFT_TEXT_SIZE 1 #define TFT_TEXT_HEIGHT 8 #define TFT_TEXT_WIDTH 6 +#define TFT_TEXT_COLOR ILI9341_WHITE +#define TFT_TEXT_BACKGROUND_COLOR ILI9341_BLACK #define FT6206_THRESSHOLD 0x80 // Splash screen display delay in milliseconds. diff --git a/Configuration.md b/Configuration.md index 85d61cd..960242d 100644 --- a/Configuration.md +++ b/Configuration.md @@ -59,6 +59,12 @@ The ```TFT_TEXT_HEIGHT``` directive sets the Adafruit 2.8" TFT Touch Shield for ## TFT_TEXT_WIDTH The ```TFT_TEXT_WIDTH``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text width for the smallest text size (1) used for screen calculations. The default setting is 6. +## TFT_TEXT_COLOR +The ```TFT_TEXT_COLOR``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text color. The default setting is ILI9341_WHITE. + +## TFT_TEXT_BACKGROUND_COLOR +The ```TFT_TEXT_COLOR``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch display text background color. The default setting is ILI9341_BLACK. + ## FT6206_THRESSHOLD The ```FT6206_THRESSHOLD``` directive sets the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch screen thresshold (sensitivity). The default setting is 0x08. diff --git a/SphereBot.ino b/SphereBot.ino index 4f32561..46bf81d 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -620,8 +620,8 @@ void DisplayFileInfo(char *filename) void setTextDisplay() { - tft.fillScreen(ILI9341_BLACK); - tft.setTextColor(ILI9341_WHITE); + tft.fillScreen(TFT_TEXT_BACKGROUND_COLOR); + tft.setTextColor(TFT_TEXT_COLOR); tft.setTextSize(TFT_TEXT_SIZE); tft.setTextWrap(false); tft.setCursor(0, 0); From 3040d0bf0afac497a9627e797fc0c646849518bc Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Thu, 26 May 2022 18:49:55 -0500 Subject: [PATCH 27/39] Correct end of file processing. --- SphereBot.ino | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SphereBot.ino b/SphereBot.ino index 46bf81d..54a7741 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -461,6 +461,12 @@ void loop() } gCodeFile.close(); + + if (!GCode.completeLineIsAvailableToParse) + { + GCode.ParseLine(); + processCommand(); + } } println(); From f23126b8b7796dc60213eb59b1d9e7b481a9ed8c Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Thu, 26 May 2022 20:02:56 -0500 Subject: [PATCH 28/39] Anded createFilenamePath() and fileLineCount() --- SphereBot.ino | 91 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 25 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 54a7741..687ad99 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -142,6 +142,9 @@ in the "Configuration.h" file. #include +#define DEFAULT_PATH_SIZE 16 +char path[DEFAULT_FILE_NAME_SIZE + DEFAULT_PATH_SIZE]; + byte minPenPosition; byte maxPenPosition; byte penUpPosition; @@ -375,26 +378,15 @@ void loop() filename = alphabeticSDFileList.Current(); if (displayInfo) - DisplayFileInfo(filename); + displayFileInfo(filename); else { - // Build design image filename. Start with folder. - char designImageFilename[DEFAULT_FILE_NAME_SIZE + 13] = "/designs/"; - // Add the gcode filename. - strcat(designImageFilename, filename); - // Remove filename extension. - char *ext = strrchr(designImageFilename, '.'); - if (ext != nullptr) - ext[0] = '\0'; - // Add the image file extension. - strcat(designImageFilename, ".bmp"); - // Paint screen with design image. tft.fillScreen(ILI9341_BLACK); - ImageReturnCode imageReturnCode = reader.drawBMP(designImageFilename, tft, 0, 0); + ImageReturnCode imageReturnCode = reader.drawBMP(createFilenamePath(filename, "/designs", "bmp"), tft, 0, 0); if (imageReturnCode != IMAGE_SUCCESS) - DisplayFileInfo(filename); + displayFileInfo(filename); } // Display menu bar. @@ -444,11 +436,8 @@ void loop() // Print File setTextDisplay(); initializePenConfiguration(); - // Build gcode filename. Start with folder. - char gCodeFilename[DEFAULT_FILE_NAME_SIZE + 7] = "/gcode/"; - // Add the gcode filename. - strcat(gCodeFilename, filename); - File gCodeFile = SD.open(gCodeFilename); + + File gCodeFile = SD.open(createFilenamePath(filename, "/gcode", "")); if (gCodeFile) { while (gCodeFile.available()) @@ -581,15 +570,67 @@ void println() } #if ADAFRUIT_TFT_TOUCH_SHIELD -void DisplayFileInfo(char *filename) +char* createFilenamePath(char *filename, char *directory, char *extension) +{ + path[0] = '\0'; + + // Start with directory. + strcat(path, directory); + if (path[strlen(path) -1] != '/') + strcat(path, "/"); + + // Add the filename. + strcat(path, filename); + + // If the extension is not blank, add extension. + if (extension[0]) + { + // Remove existing filename extension. + char *ext = strrchr(path, '.'); + if (ext != nullptr) + ext[0] = '\0'; + // Add file extension. + strcat(path, "."); + strcat(path, extension); + } + + return path; +} + +int fileLineCount(char *path) +{ + int lineCount = 0; + char c; + + File gCodeFile = SD.open(path); + if (gCodeFile) + { + while (gCodeFile.available()) + { + c = gCodeFile.read(); + if (c == '\n') + { + lineCount = lineCount + 1; + } + } + + gCodeFile.close(); + } + + if (c != '\n') + { + lineCount = lineCount + 1; + } + + return lineCount; +} + +void displayFileInfo(char *filename) { setTextDisplay(); + char* filenamePath = createFilenamePath(filename, "/gcode", ""); - // Build gcode filename. Start with folder. - char gCodeFilename[DEFAULT_FILE_NAME_SIZE + 7] = "/gcode/"; - // Add the gcode filename. - strcat(gCodeFilename, filename); - File gCodeFile = SD.open(gCodeFilename); + File gCodeFile = SD.open(filenamePath); if (gCodeFile) { bool firstCommentFound = false; From 5a1af7cc7f3ab785df252676cad2dc33aed1bbf6 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Thu, 26 May 2022 21:06:29 -0500 Subject: [PATCH 29/39] Added DisplayAlternate() --- TouchscreenButton.cpp | 8 +++++++- TouchscreenButton.h | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/TouchscreenButton.cpp b/TouchscreenButton.cpp index ae6104c..8463e03 100644 --- a/TouchscreenButton.cpp +++ b/TouchscreenButton.cpp @@ -9,7 +9,7 @@ Released into the public domain. // Constructor TouchscreenButton::TouchscreenButton(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int tftWidth, unsigned int tftHeight, - unsigned int rotation, char *imageFilename) + unsigned int rotation, char *imageFilename,char *alternateImageFilename) { _x = x; // Horizontal offset. _y = y; // Vertical offset. @@ -19,6 +19,7 @@ TouchscreenButton::TouchscreenButton(unsigned int x, unsigned int y, _tftHeight = tftHeight; _rotation = rotation; _imageFilename = imageFilename; + _alternateImageFilename = alternateImageFilename; } void TouchscreenButton::Display(Adafruit_ImageReader &reader, Adafruit_SPITFT &tft) @@ -26,6 +27,11 @@ void TouchscreenButton::Display(Adafruit_ImageReader &reader, Adafruit_SPITFT &t ImageReturnCode stat = reader.drawBMP(_imageFilename, tft, _x, _y); } +void TouchscreenButton::DisplayAlternate(Adafruit_ImageReader &reader, Adafruit_SPITFT &tft) +{ + ImageReturnCode stat = reader.drawBMP(_alternateImageFilename, tft, _x, _y); +} + boolean TouchscreenButton::Touched(unsigned int x, unsigned int y) { // Adjust for the fact that the touch coordinates do not rotate like the image. diff --git a/TouchscreenButton.h b/TouchscreenButton.h index 0081431..9098973 100644 --- a/TouchscreenButton.h +++ b/TouchscreenButton.h @@ -18,8 +18,9 @@ class TouchscreenButton public: TouchscreenButton(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int tftWidth, unsigned int tftHeight, - unsigned int rotate, char *imageFilename); + unsigned int rotate, char *imageFilename, char *alternateImageFilename); void Display(Adafruit_ImageReader &reader, Adafruit_SPITFT &tft); + void DisplayAlternate(Adafruit_ImageReader &reader, Adafruit_SPITFT &tft); boolean Touched(unsigned int x, unsigned int y); private: @@ -31,6 +32,7 @@ class TouchscreenButton unsigned int _tftHeight; // Screen height. unsigned int _rotation; // The button's rotation. Correlates with the touchscreen rotation. char *_imageFilename; // The buttton's image bmp filename. + char *_alternateImageFilename; // The buttton's alternate image bmp filename. }; #endif \ No newline at end of file From b530910021d3636c16fd77d7e117dd13b527a99f Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Thu, 26 May 2022 21:24:19 -0500 Subject: [PATCH 30/39] Worked on displayed menu icons. --- SD/images/camera.bmp | Bin 0 -> 4854 bytes SD/images/information.bmp | Bin 4854 -> 4854 bytes SD/images/print.bmp | Bin 4854 -> 4854 bytes SphereBot.ino | 35 +++++++++++++++++++++++++---------- 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 SD/images/camera.bmp diff --git a/SD/images/camera.bmp b/SD/images/camera.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d611068268543c1e22ecde96737f4264562bc4c8 GIT binary patch literal 4854 zcmeH~X>S!}6vv0M8WW<#Es6;yn)nI)0KUgJzHv)1CPWe%jWHAvI@jK|v~=aRHz_C~ zh)^3%+}e_$P$=COdfRkKOE(K86^mu-nwE~gGp8NLnVWWssc+!Pxs$W}&-u@@&U0Vi zKDouP+iN^ub^X>D&uM^X^=ADoI;=ye=v3ZLau8){GPV{ zo5(%@OS3-!Z+BZ=Ps%2T@oL(-me7+3isJ+TYzgX>^2Ta^9m|q6Fmu?*PI{}iE9Nea ziIWfjV1V6Gx4t6Yk!u5NJ!%f8uWM^K@6?%`7)KnF5CC9+NpbvcWktL-=8IHg3k-C( zQiMr7k+-Keym79;Ku|DsW&zwhByT7w@mg@+j+UDFLK(pF;zBCj9vf{7ZN~HnPC@_# z7BxsA(a#*5H~;hZsMDRYNq36&eKum`e)ewt#d7MPV1m&;0t1XGiM|$`w=47*MZU~P zq=xKMyYD|7&vcg*)9xbx`~r>|lIUvzdGF87@r|HJMcKF1IGVKw{YuJ4&nbb)EE5ud zWt}fAMkkSU4|71?nVD(rU~{!>jf|un6s$F0@KnPTXVegYWi?fuMJJJT4>BMxFFcVa z{pCwRg`&()(dG2;H9b-UU|9nGZ~di6cZ$sKvCNOqTN^H-Bc-SE-OOUzegRmPfMqE@ z`212NC+Tg9ut;=H>&)jdIhqR14`THdvHA-rdQwTqvViGQltf<(IL_p?HCE~rpZ)#_ z=3k>D9ihjyckU-nLI4D2PcDf*S}Qm&x!T7+G7|Kjz}d)78A@CDDxqNNfeGM7hMZU0 z_m%Pv^t5x@Ab0QFB6oPO=TG~d07X}e>`-lYZ;v61mPJTk1~4g(e|C0uu(wmqCHh-h zA_Ju&yV7n=m1TEw9->a{$II!hCUj zos6dBnY$1a4k(;)!EPtT!@IY`+qXD<#nEI;^)w|v6<2D_t;0io?mB)Q0I;~}IEBt; z5jwl^COLcGai&S5{wIsa&*ku64I+C;G)zI3&M#WIhMPxGZz2Wr(eCw^3xQA4lc$A{YrbIjz(+UZ*DHP zE+PA*0_^q&(e;l*QR*(JYm&E8r@?$i6ZHepoV=ytm#_VQWN;D!ANO;xEH$fwT(_J& zyjQc%lthaOLRR910 literal 0 HcmV?d00001 diff --git a/SD/images/information.bmp b/SD/images/information.bmp index df647e7e06221d0b61234c27b44ab8c4b7a193dd..debf1511fcd2cce294154214196732fc67a719a4 100644 GIT binary patch literal 4854 zcmZ?r{U*c!24+A~0|_%SNI)cjWV1a4!vy}1g3%B_3V|=5KFn&%zR}3}t&ic)B!*WV zOs8u_R?cXA_vR&%Dk?MIzkLm~@&6PCOayesk$Qz^kMB|0O0aP~Ws#UR0!4tne%{Xf zZ!*K;sZF%7_hAbwn!UiFKE7ui#IBdm9-TjXnilrH>10B)_f{i2Ei6Ja^KKIxn!Wdc zBD4p`>mYkU9w`}eGk8O`cT z^}MvU7ifM{jvt!6z^wG<)pJ@~y?Mn9G<$*E%}XZG+FoEe{CgsLIeDmFh1T{0&A(L7 zgXZPuZA`$Zr?u7nRk3LH0=YLX(WHb#_RE_2eVF!cTRjI^4K3JPSIx$>cloRis@wJV z@8747?!t}jE{njlcjcUJxB@CN9yYUFZ{R#xCx*4&2iCl|uAZZ!b#SBR_Y{BVX2kR+ zLWfNry}X^w!@$e;(btdF|rK=T9Ec%$K7EqlCcC zD`yu^ZC)^`{>+hGC=xW|0Mk-`Rm|T>h&lq86j%Hh3V;`1J8TP3;B7CZ>PyG|{{nfAiAGcU>qYC$KGjaO+Zg@6aes#UB=4GA%}v9)Q|?<8b+o!y45`->a3 zO4^I}Zu0YJo2w0Y7x#E7zgmUvER}V=WbvS>{;6Cpzk4&@8#$5mZk;^8E+6rfE@^m> zK@pW`f&j$o#m;9ly^)h&f{prR&Gz{mXoN6SRzm-`FyGgHD%a+*#R&pXfg;ph&_ASK zzW1*e3_2=89Y!3X$A+%XwmTlCu~#qxQ;O)3>#bNYMkDTOUQ(3LigET3n>xt&qi>I|_wVW+F?Q)Zl`bn2-siwXcCxD+@UDqxk* zhCKwUJLSSG1Jx2f7yO$QOQ@fo`dHJ`=l&GtW6pLQK-`DJp9{t%MPW0heH$dgrcDgT zQW>GdRKT=y!nci&7a43QQ!z;;!|5!ZB8o}Ggr;n`f$k$0Q_OIcAdUbk7?&4ck3Z%^ zUMiJ-U1*TY3#|-S;UabmP4Xi9wj?EdJLK|0E5lW|P91X6yMM~S#e#ZyiM7eX-Y&sm-+cMWbc_N zm#-`Jee^e`VRDDN1FxPxOg(#Wr}L~+C^}HvN6!2P?YX;r&2Q+A{G>Y;)vEbP9gbS@ zcuducQSFNV(3AW9cjKYSfU4&Kh{pvi55+jhx#dpn#po@*#(w8Aian=s5bBC?pL0K9 zfXmah)?>WYDr1cMu;FMMve7M1@s=Z2I9_i&=fH;IxsDqd8|>ob?97kvp*6h8G-GwH zgAv7ZY}M>ShZb!ECm2-O)y(;$U*jBiu3H;Yw&d6+p*=*`Uz>Bd1c@Sh zsbxQ4Ac2x7rlqD?q^7b=H-F4IckkWY?%nKjciK4IdmWxzY%g9uJDi>G_w)I1e%yP` zIae7j=8{ht%Hz~8k1HVol+B09FV(QM`{a5AV$p~YSTYUJP4pnH$Wz_U0ei(jbGaGV zD?o<`tF;mp$1EjV4lZuz6h?poBIpod_T3aFEXAU=AmF;Jd~IU_C?JBaLo;lp8-gqeL;r^QG+bR4aY6C;_(kU=ib%+?7RcazO3=_g|zR?NSDWTYuz4gAjvDA6p5C|cG$P!=BAwtw33vpQJeG@I5ujS}icSl4D0b;O0~ z5o95*j=cWS_@>_9h3_yVQV+C~P`W~LoYf$L4iPe+JNHGt9E*yKR;n{aT;El0k8=#Zn~?GZ_Z(v@_w zzJ-L;cE~~;7Nq-hxm;f)SPMoU9P8oFzUR;XM?es=5QhcrNb2JqH7iXABG$j#P1Keb z$7jmH$<3VM29%)@6c9m&2uXu1#9^WL4Tt={dL2UF{cyhuvG=ZzFOsYU{^u7+%XX!d z%tsUzQU^t{=7SCq!h$TsVWIccwBQJuoAcy9`KsqDdLPtuD#Ks>zMmmk6JkBb()65- zb86oYxUMi=QjiRaX5XiKl)0X(ds*@x+G=nQwUrM5^yO6ZmxR=NXsd~PC`KbE_wLNI Jup4C^fj^Ir=1Kqn literal 4854 zcmZ?r{U*c!24+A~0|_%SNI)cjtun-2qKU&7=YM|R&IbSLNbS-y|*r( zT2bq?qS_W8s&xV?gINnrR}|U{H;s4(+5SCKEA;itr>|c=lZ8G3wF85c4F3Xk0n2u> z5hNZ-vUhi#7IN%U!Uh?I1n{S;5AWY?nOnDMW(9=^Xb8|KBy0cUw-;F@b=kw%-fdIT z&(#ZVpPqvpVzl<}ovUa5O$L>3!0hng_7%9*w6^!*ooj! Date: Fri, 27 May 2022 09:48:19 -0500 Subject: [PATCH 31/39] Added percentage calculation. --- SphereBot.ino | 52 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 2751379..3666bed 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -366,10 +366,10 @@ void loop() char *filename; // Create menu buttons. - TouchscreenButton previous = TouchscreenButton(0, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/previous.bmp", ""); - TouchscreenButton information = TouchscreenButton(60, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/information.bmp", "/images/camera.bmp"); - TouchscreenButton print = TouchscreenButton(220, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/print.bmp", ""); - TouchscreenButton next = TouchscreenButton(280, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/next.bmp", ""); + TouchscreenButton previousButton = TouchscreenButton(0, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/previous.bmp", ""); + TouchscreenButton informationButton = TouchscreenButton(60, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/information.bmp", "/images/camera.bmp"); + TouchscreenButton printButton = TouchscreenButton(220, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/print.bmp", ""); + TouchscreenButton nextButton = TouchscreenButton(280, 200, 40, 40, 320, 240, TFT_ROTATION, "/images/next.bmp", ""); bool displayInfo = false; bool infoOnly = false; @@ -395,16 +395,16 @@ void loop() // Display menu bar. tft.fillRect(0, 200, 320, 40, ILI9341_WHITE); - previous.Display(reader, tft); + previousButton.Display(reader, tft); if (!infoOnly) { if (displayInfo) - information.DisplayAlternate(reader, tft); + informationButton.DisplayAlternate(reader, tft); else - information.Display(reader, tft); + informationButton.Display(reader, tft); } - print.Display(reader, tft); - next.Display(reader, tft); + printButton.Display(reader, tft); + nextButton.Display(reader, tft); // Select gcode file from SD to print. bool waitingOnButtonPress = true; @@ -414,7 +414,7 @@ void loop() { TS_Point p = ts.getPoint(); - if (next.Touched(p.x, p.y)) + if (nextButton.Touched(p.x, p.y)) { alphabeticSDFileList.Next(); displayInfo = false; @@ -424,20 +424,20 @@ void loop() if (!infoOnly) { - if (information.Touched(p.x, p.y)) + if (informationButton.Touched(p.x, p.y)) { displayInfo = !displayInfo; waitingOnButtonPress = false; } } - if (print.Touched(p.x, p.y)) + if (printButton.Touched(p.x, p.y)) { waitingOnFileSelection = false; waitingOnButtonPress = false; } - if (previous.Touched(p.x, p.y)) + if (previousButton.Touched(p.x, p.y)) { alphabeticSDFileList.Previous(); displayInfo = false; @@ -450,9 +450,18 @@ void loop() // Print File setTextDisplay(); - initializePenConfiguration(); + initializePenConfiguration(); //TODO: COnfirm all pen setting that need reset. - File gCodeFile = SD.open(createFilenamePath(filename, "/gcode", "")); + char *gCodeFilenamePath = createFilenamePath(filename, "/gcode", ""); + + print("Calculating total number of lines: "); + int totalLines = calculatefileTotalLineCount(gCodeFilenamePath); + println(totalLines); + + double currentLine = 0; + int previousPercentage = 0; + + File gCodeFile = SD.open(gCodeFilenamePath); if (gCodeFile) { while (gCodeFile.available()) @@ -461,6 +470,17 @@ void loop() { GCode.ParseLine(); processCommand(); + + currentLine = currentLine + 1; + int percentage = (currentLine / totalLines) * 100; + + if (percentage > previousPercentage) + { + print("("); + print(percentage); + println("%)"); + previousPercentage = percentage; + } } } @@ -612,7 +632,7 @@ char* createFilenamePath(char *filename, char *directory, char *extension) return path; } -int fileLineCount(char *path) +int calculatefileTotalLineCount(char *path) { int lineCount = 0; char c; From efb2bdc5a2ab5f3bf88841ce8f2bcc42b23d23d5 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Fri, 27 May 2022 10:42:12 -0500 Subject: [PATCH 32/39] Added setTextSize() --- SphereBot.ino | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 3666bed..e739315 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -254,7 +254,8 @@ AlphabeticSDFileList alphabeticSDFileList = AlphabeticSDFileList(); Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); Adafruit_FT6206 ts = Adafruit_FT6206(); -int currentDisplayLine; +int currentDisplayLineCursor; +int currentTextSize; #endif void setup() @@ -663,6 +664,7 @@ int calculatefileTotalLineCount(char *path) void displayFileInfo(char *filename) { setTextDisplay(); + setTextSize(2); char* filenamePath = createFilenamePath(filename, "/gcode", ""); File gCodeFile = SD.open(filenamePath); @@ -688,6 +690,7 @@ void displayFileInfo(char *filename) { GCode.RemoveCommentSeparators(); println(GCode.comments); + setTextSize(1); } } } @@ -700,26 +703,38 @@ void displayFileInfo(char *filename) } } +void setTextSize(int textSize) +{ + tft.setTextSize(textSize); + currentTextSize = textSize; +} + void setTextDisplay() { tft.fillScreen(TFT_TEXT_BACKGROUND_COLOR); tft.setTextColor(TFT_TEXT_COLOR); - tft.setTextSize(TFT_TEXT_SIZE); + setTextSize(TFT_TEXT_SIZE); tft.setTextWrap(false); tft.setCursor(0, 0); - currentDisplayLine = 1; + currentDisplayLineCursor = 0; } void advanceToNextLineOnDisplay() { - currentDisplayLine = currentDisplayLine + 1; + currentDisplayLineCursor = currentDisplayLineCursor + (TFT_TEXT_HEIGHT * currentTextSize); - if (currentDisplayLine > (TFT_HEIGHT / TFT_TEXT_HEIGHT)) - currentDisplayLine = 1; + // At lease part of the next line is on the display, so erase what was previously there. + if (currentDisplayLineCursor <= TFT_HEIGHT) + tft.fillRect(0, currentDisplayLineCursor, TFT_WIDTH, TFT_TEXT_HEIGHT * currentTextSize, ILI9341_BLACK); - tft.fillRect(0, (currentDisplayLine - 1) * TFT_TEXT_HEIGHT, TFT_WIDTH, TFT_TEXT_HEIGHT, ILI9341_BLACK); + // If the next line will not completely fit on the display, return to the top of the display. + if (currentDisplayLineCursor + (TFT_TEXT_HEIGHT * currentTextSize) > TFT_HEIGHT + 1) + { + currentDisplayLineCursor = 0; + tft.fillRect(0, currentDisplayLineCursor, TFT_WIDTH, TFT_TEXT_HEIGHT * currentTextSize, ILI9341_BLACK); + } - tft.setCursor(0, (currentDisplayLine - 1) * TFT_TEXT_HEIGHT); + tft.setCursor(0, currentDisplayLineCursor); } #endif From 47d9aad0a9f37ccfcca25680f3a6b70a37049cd7 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Fri, 27 May 2022 13:24:35 -0500 Subject: [PATCH 33/39] V1.9 prerelease gcode files. --- SD/designs/op-art-1.bmp | Bin 0 -> 230454 bytes SD/gcode/cubes.ngc | 11874 ++++++++++++++++++++++++++++++++++++++ SD/gcode/op-art-1.ngc | 1521 +++++ SD/gcode/test.ngc | 50 + 4 files changed, 13445 insertions(+) create mode 100644 SD/designs/op-art-1.bmp create mode 100644 SD/gcode/cubes.ngc create mode 100644 SD/gcode/op-art-1.ngc create mode 100644 SD/gcode/test.ngc diff --git a/SD/designs/op-art-1.bmp b/SD/designs/op-art-1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f607c60cd07a8838a5607509a78687827ba0296 GIT binary patch literal 230454 zcmaI9_gh=pz4o2wdVhE_#bcX}BqUJpG|?o1kVF?kg^on;9gJ--wsE6l-0i8!Mk2 zA7PKl2|qvn;peZu{PzC6M|W=D=k4yD2h7+J%H&q@Gg6)P42Wi>vv)7 zlKY$YVGpQ1y!`;i=Jz-5F}u5Vhnkm)~>JK`r_u*Pp)46;PTu5c>6zo^Sh;`GsDB5FoiTtDN9$$GSx6?h6bZN14q<~43*rZ#Hh?xDYG=nOdQ!} zI0)0qGhiBdhMK;46-IKVNv%v*E7O>1lo{+~ek89?EE}d)<}lOHA4E>Z<;3td(qLM7 zx>}yDl;N$WsbpztYUIx)Pgl|7>=%(s(`3>#j0#ygG5l&${A&0`vXpX@PMc*+&a^v= zJG*<&oIU?vZ~g84_ul{XlTWXIaqZ@{8@I0CT)A;;^~T!T&Gprr>npd2t*&gWuk!!O zWU{%kaho&lQ-M#yowYl+@p-^M_tr;(UA1w0b^Z40#vSq^8|$}-VM69B>+36Pt2b6w zZmg``Tw_nI-&!Znu5N5@+OGKYahwmyf==fBONb;rV@f z0!|rL3|KbD$nzUMxwA=b1$RT2gr7|K-MGh?4Ig=a@2%gx7kXJ-cxN3(@P{#Ad5ZCn z{CllzhW_lE&*XRQ#@fo&TQ|SBdF@k>d*#3W`i~2jUYnde7O3lR+AB=y4!tf{sWeL! z*>b5#nV6mmu2*8FLyFn@GZ3=Uo zsg|W0wdrXo8CHv}xvA~s(y71x=UX3r@X@Cqe*%gr!mEIHmBI^t*H$;z*KXrZPRM2B ztxa~LW;bViBnZFM057>+6GB7ClNb1%p5F2EAh-KaDWZWAp()P|V215e6VX3FncYvuiPic!&P}3wZJ;unB|r zyT?C%M?n7h@#CMr`}Xmp2Va9<9?UzN&j6W!mNCmC$sXcayaIa>{s?~wn}pNK%Pv2; zzj6QmImq5qaY3xFcB1;3=m1n^i z!eJm&gykjzuRKjhMq(Pgr6j^HZwg5Yn=?*BW%BSZrxnt^%n>;9@#%VbEtSPi}B0Q zW(?x<5F!ygu9FW2b;HNVfe#5j0{hV%y68M8-54ipWx~Dn`|HH+u0OoD!5h2+ zPWN#wq?z!$M%|&6EjNk(C&RxHn1!EA1o!hBpMQGoy$>$G^|!ZQd;QJHiK)8U7Q3x1 zGu>{~=V?_IwJb|5%T~zX%rQ}5fI)VFE#SojCI!MG2r*dJ z%Y=GDae@)>^85l@-sDMXJiM5I+ze(_r{t!D`1 ze7P(g7S1oD7|P4ROFUbGFwd__PE=k^`PIwQ4DwVM;TOst2CouvfjAi>4gyaGDFc~3 zWOprzNRJ7A-y|{aV}>LNoEf7`VpJris1wt4iKbMQ*_2`~D=nXxnD~$X_>XtreeaVi zpMCN9^=nse-n_BOxzN<_WrEA|%RdCd{GFUZN=NwNP*r+Mr%@Gyn%oLjfiOn6&}%RP z@5&mxMXVFonw)TZ<1Wx({C@u(+**hu++e~lH4>kO^UJ8@Nen6J6P`2wESvBk;~{%B zcKqj`{?AW8{tu%VBjEk{Co;l*fY1E+UqBfA;{AN{=-UT(9)^R)u}NcC9%P&l&Mg0s zzc5^X!}-OWofEFVPtF1F!v`B2#S~bg!r{ieYr^mPCgXQ=b$w$M!3%M&)>bxFXsm>P z9XLYQzPNGa^m(^QCg{pGI3aV7Dk!LkxgxGY^O%i!TP$WryvbWIZC3qmUl$_oJ5Z-Jl1JPLkf zM}TekU5nyuNTl&dQbKYP%_JzqsqlI5;}mjZvcXhR=o;Iz|BYY2`ObUqe|+WB&p*3% zjK%YUXWbU3{DiF|Z? zca881if^wW!?3=-x&eNX-@v~w?E1A^pI-U=y?5UK(;xqQYWZ|~N58$$uQL^DlJhlc zt5%hxQ)DAGq~tu+bflGJ2usDO_`owinW4(-EKee1mch$_4WEnSbg;x&V&YgWnNv|t z6o6~3Bubw(z(6iD+y}_* zh-S>T@f$`x^|$3je;M^kSw`qt+zm20ex)Xzj3}?3z?-H+*h~2Z!nm<8LU~}xFM^u} zk_HJz#0$8AF!5#l@*}jEn~RK$U;O2{P(^G|N|Fuo%rt`~Kfh#b@5GzG`Rza7e)r?c zpI-gq2JXxRVaRAGA-Tmeb&q*|DXMF$H;K^*myV%3Kp3{5mAcAAg}Ja7FM<=mFUhwc zzxsg0zm!uVc09kKIp;z%Bzc6xl@w2HBNwN^_%s)P72_8VY5s~Mmx(W4fr&4BDP*31 zpgzENU;psv9&w(-@#N=x;)wh%VF+_bB4kEh8X-Q7e4jan!~2B897;il_$86=y|sI= zJFs=!F1Gad9v;%jm-){`g4dB-ApEYaB00GZa^Yxw`pM_-zWc!+fB&bsnT3|tj>5uH zv$;TTbjZ~TJ+pA%rbd zn3)0mGQ+Kmo@tbkKR)KupKs%rVa_87 za#@Y(X^QchFh(@aN6z_acyWX~NFrYX@7>kAu-mJ5XwI2K_#V<(c#87NjUj&F^W3_* za{b!PPoTN)e)Rj_{qe+!`9NJ$fy0%NnV+0$(HSfnja8#GYh>97bzzF64Cbk_PdE{X z(C3Z88`4ec1B2f-v`P}AO^hM3%M54}x(Vi5 zVVoK!iq|9vw3J++4MovVIn(X(%}vk0_1C|D{Lv@ZKEJ+l0~uqYtxS$NqC;$Qeljf# zv8WcG6V9l%0#BY_%-Q+R95>hRQhwp-^2`#Dky*lsq!x-q;dy2N`0o(rS!O3}8@I@1 zPBr0oTk#h^l;f8Nneh817yN=*f+sbSf2Phe4>Egpi(FOu9;valDEha~O1cK6N-N&qPM5+l(EsT_e^i1J;&I)KS-l8Rhgy|r@V z`VG_#-+%9eKm7hLGsjQXSGO1B`OK!`%;fxJy;ZL@Yn0h)nqQ?ZBHU&Y^M?2(NgjNz zlHlo)&ktxK#;Ye0P#ATILyoaV6srM}#4w@oN}`q2K(SgJqe*~8YlP8iVlf(+AXZIH z1%yE^K{!rBUXX^#5`jU?Ec5|JvRcU*(qAM4Mji_FN+F#jq^iVe2p9n}tt^wsJqi9l z#hLwT%!?)z(+oC(Xx`DK4mo)UV=Mzwh$#e}7{YL*&ZtHc)kal1DFx*rwKN6y5CxoD zavLFuIAX*}ARaRL8}dOeeU{27A_ce{TCqqg!9=7>q?RPqNr~y1i_8*57zekiz&wNOAP?-e$+k<_ zL#D;J6>#>=ci@*f%pqDytj(Zi$1%sX-+cKE(_hABc-a>$6QVTHvqwID;FtKcBxq&)a_SkYk;JJJnZ>Imv1(C_3fOW+l$XIv#)N34I9kJu z@f#nl4w))GMk$CT*OFJjg}|I@H1Wf!Pma$mKFN3wcqd3%6BFnZ0D9XJ>%kBsiH>=`g8wH^j9_=U+6 z^zsCZFj5m|#{P`l9}{jcIfqyx_zfB6yiv4uVxbN`2{X)be}i#%GkQ;x2;r6x|3ofM z(gz>%^AXg6bWZ$ zG=D`DpS=i12K5i${qW7BuYnj3CQl;3Bwld{SOzaUlfg^II|N>aFq>e`lgmyE=a*xj zP>gI9@tNi1H<)Z#dm zBo^*5G0+M~0U$HX6QUFek#b^D3K8Z}Y8Vg}MX3c*syJArGL~9gv;qi=VpYNzr7#*s z1)6DetQJ1GFc#vDNLeF>I>&1%#ei3%5NW`#QfO2N^a>%VEHi}VELx`@Z=PQy;y^A& z&RAXuY2Hxm$rH!!UGO~^zcjMuy28LU5T?x-;1^XM$}GsG@P<>2%Sk$p`y1lVNdA)K zW+j&w|@Bc z`>!8z{4#`jemNegm@@7d!dvh@$uHrZ+B5lO;Ir4^6I1tS%u6Un=LXF%-vz><=1Hde zByUEWtl%@R-dMf*#r2Oq`sD9#y?x>QD?Ob9CByGNArlewl!7P)EIv{mA0ZQL znOqp5pr#Z?COatMh zc#SMxBNuArM1l=+0YsU!i0~$(`pXoGjSOVW*#zC2OrvoG6!6g~Cir~`Ya%`AEn!tH z)?-FH#Hd~)q%|fvOd_t45cr(O7h9i(Z+fQ)KEC zw4sO;K}a(a?^W{h#PKWQKGOIwGk%F85GmBMh*bc^gy2RgsA4LGRAd>sagnl^2x;`L zq?p~(7>v~7Ba(>ilEv?m$M04Mb}Qm`$>Vm(Vqv?baS^yg785BWEJty=40UGkGL}KN zkh2*O+-uSFC<>fI#SP8?=n zi%|^6I3D*U+?|vOaYzNwgdXLW+%sv45BDxi!ue%@^KV!r(k6)Y0&z-0QicqLX|2g& zFPb`X{H?$J{gW%7T)#@%r@`;WtyO~XEm9q34O$3?3A~hF=r0cPkTQ6gUk3$$g5s48 z$QhOf{Cj>$E(>1tHdLSaFdSIW8vZaGVRjs^@YB!#ga3Z~@#n{sT*fa)F74s~%in+V z9r$JB^3X8}W<0_}4u2MN*cR_0esKvy7$dLX-0OsrTDS^7f~qPh4267SBCjw~7zzd2 zz!vc@Y-9B{DePWfyZZT!58l80t6#l2ad66A70AtVXPOF4DUMWQz5$(7TB}B5)~K_! zD$?Fhn|{$dMBqg>6}1)c3v$6M^C~3?DI_<-B#Ed7Ts4Ggp;!!e{x}`sm%>XNW}>+v z!G-2V$|;G`sNG4CyAq>zB}VV$EN*uqv0X{9_}$X@-LklyQewMcNwGTx4K=+`WK0mlmrmEH zAjH{i9i6{^^EdCk|G~A-udYIZuM>q0H%2ATY`EH@%NoT;FA-n3 z%23Qm8L%ZjGvzm$!W*$u61h_n^^zp|B}wc{lDM7JFnLK5&uoVzjvAhYfnQie$N(}Z zW+1ak>~1*>UN?O2cosoNg+AC($ZTs9qjgCzP#kZN#F1MK_!Wi_2Ceu-h#yNOSRybc z#2FIexOy~B#po?cw~=R5Cy@yTa5KSPS-7W`yp5M1!fsAOsz&M%Y~@RB?> zG&*z|ck;@{-8=WeFBS-FgO|!K*FqV3iZpWY{9=NK3`Pbf5A3rL=5G#L*=+Dj$R*6O zMoPjjb)mVYXuSTnUw!xJ-XkW9oO647OF+@{3?!e)FFVLFPE*jB^NB2Woarz4<)6Zl z&5e7TtSUs+7Tz)!`I2=;WQ77`7k}iN*H=L9<&Qsm>+k=4{@g{ZI4CIa#yq1wSEn^=)j1Gf()dSvfC;}+luk%X62w;;5?=-{?@ThE6Q5^FD^!D& zZlQ5pW+{rg&4_auu#wWZkiip<*+o2OkQ+&mr10((#l9qpc~KO*BOwm%<*6yMi8ftk5dcaY=d8cRv-k$M2LlA zqbSjkq)y4q%^w)r^VWa<*Qclve{vPw@92RC!tjd0BR*8&#{0=Uzfj?A{BEqlcYO3r zena_Z($Nv>izc-4{4)Iw7hlFNV;LilGh5t5ZwOB=g~0lSXYjkVq5&`d%~z!O%N$qm z3o03O9GFy#|1H0?_{(xu?0k&4oS(CY{0p+lZOZR$WR;)AFUoDVZmnYh*@qu}^7cC) zy!y(o#>XZr-8Bwdg~ja3FcqYyIS9GQwq#=-%%HatelV(=UBq67wt!S8O0@GcyA33mhB7G$v4T?%G#5h`Fy$c@p7VnM4x6`!n% zH7etiHDZ%moTibG1qC`yMskYTl2MSCQkW&TBqy2Db=HhDM{agmirOj@q)6itDeH}@ zOlxM5C9~A1&6A4Lh^I}$UWB(K>BJC5aTcm7jn_!y)Jddjra}x3zc&=IBAY}hj#H7e ze2iQYBNIn+MpE%KQNWV(Yy^f>a}^0O3L!NP-e?7bmyFSz^0J#1M#e9Bg;>)1!i>Qi zPx+;DolsyD2$F@OWMM*bLSnL9nUb1j4hCC(^Q+%pe(&;CG;4w1F!2qS;4OY>+b#O5 zA;CPqjP%WQs23J5eE+ob9145U!to=#YX~%@m|N<*4PKsNHev80RmCjCFBe4fCqsD| zzf6Lu^9(I!S!mMBf$SOH8!}Y9{&K2HTR7lIqy9^H46Qt30*!MxqkV6yNN z6pLci@SFvaviJz(oswd~FK3eYoe6P}TEM$Q6um_6U1m?2xxCa;T2)@#*3{kCJ=_=U^<=wB3%IsEG9;$D; zJhV!pH-l8H1ZsJ_S{A1!6hl=>*&2bWQW&QY#*^%mI937i1-z7BsW_T9une80t}@LV zknCTKLJ*^fkCroIN%+_&_*KM3!_y!My^z155=PNHe+(RHbiY7+wefKpU>ipzSOEQ{ zUbFzQgU~2Spa_eNDn)uqa*oU8KX>Nhd;fg@Gn$vadHvSPO}NMFuq|vu(Ju6t#J^Y{ zK`T&9vz@$dJn1Wa162*1ogBAsmS$iikB%ov+Yd3k=(#1-4=fwX*){=U4y!kAI#$ccHU;pu|;`XDhduOEZbjT#%Lu<+X!cV9N~f>U9=~ zFXNXjXk|Sc$T@SKGa_F}YN8|=3tmW_m!@~XFEe4BUJ$E~kI}NU32yrcIZ5D24dN?^ zka8(yl9iIgQ;U5GGMW(eVnXDL!pIlnBVLFj_I!Ng3xXJkFX1;H2**4x1iz5rxEDmR z&kN&U5DIrl#1V1?fXF9f*^y3>k*>+f*5_JudAZu$EO}0v#AFm_7!os6m6mi(Zl>OD zPA;&SN=mG*nzH)dK>u*VKzl`NT|sS)vwEmyXyM4>>AABrQ%fBUo!&gRC#S5hwrl># z(uGs6o>_k7@ctRIu`p9(&(P=jeZhSrhZ@{XMVVyHRq&MW)9VOEzX8-oq-#@;LrNq~+U%NpvRMbNz zWnyZKWu9Ml@JW6j@X0H18j5pCwu-GC`0;zfFT|Hw2;^t+i>eSU`-ZvAT&oo=BC|UK z34Zygnb%+5i)IoW3W5KHdkFOR!Cj8uEigkp8;oCqFjZtWZk-0_f^bTDJQ(zev;>p&%Kg-KYUc1-nrXN@US%{7x|@F*_0%zY#Bpc0V7#>$%w7 z&&5VO7aRF}T=esTnCIeSpNoxsEg*is*6Adi{-Y8idBR7m+9^RNJ zIWZLDXjzR=9I1$lB-wsar(;!e#Kke1*l0Czwkf|rm>Ccj2$0Jn{KAVC;~yIC7P6O` z^z7{1iSYw}{p(woKl=EK&w=nQWSGO@WvHTw8ks9lyq(`wvT`3tGVy(yU%>kq`|5nh zJZG{rIK(piZQ@AtMjn3q{rBjNq|MUX5Dqng0AZrP%=gB~_yxSoSn`UEtd@j(2<{sX z?>z#2OmMf@q(^vux73sR(!5Nw3A>iO2qI#N?dIkK0_g_w&kx`*)15T7Do1!~W9=?F zTM+H8u5R48v2x{;&;It`|9$H8`L52<(voVY-IHf2x8wlcqD)f(<2NzoovJsbg4lOUjtr+~0QW1RSgcM?7@UkL>Fjfcg1;25jRtntwi5CZc;nNb6 z3U(%v?9&bjqSx3LNemnHqB!z}gh&FfaOZR2H*VK2fp82g`nlNX{~Z(e%UID1qErd8 zY)*G^byIz3f7{SN`$%{5P-AslWl6QmR&F;rZ0UA;Mgg?7((bP-tZFO`_SWExdm<9)j z|NQ5_eDu-BSbli(>McOZ2f4h|av;D*X z-=`4XVjp*`+Yj#oUK->woyEvET(Pn*;dk{8wli8?-NY^_?|=BwZ~ySeu>*&FwQbI# zYKP66XLeb#OU+ruIZyG+Wv=vAqs{^|Xw7;}j*deZJsV;A`y{`lW<(ndnD~NUVGQy@ z@SL@=(VEyOb!?O-E>aa6LE9=&!9fGYPMP2(sbEJU{N8vZlV1?Wz95NtK@#=6B=ULj z?&pNNo)hf+WgOx6xmcpY&&R=qj^B|aj!+cjln!_9o#>w&?b+Ye*jMXrD9iUcEiPwH zSy`UPYp<*?Z3vbJ8_ELB{?_4^p{dcSiNV7i^+U~-z5T6wk4`KtFTAlh_v+N-a&!Gq zRY_Bezia03$y3X(pS|##)4=n>uf`9|mKW7~3WNT#=E?mt=gQejG+9PfhE9$} zg?co3N@5AciHLu9OW}10(Ut~yBa)&bBvBD!Sad`ZEGkk4i;R#(MaZIwNzv01OPXQG z$c*tzl83ZujrrRw-?fcjs=r)0iBy!3h(j}{*obtNNS3NmXJu#Sb@%lB=}&*T{Na`B zpQA^MwqT)u13g!~aqS$NYd49l-^9)vx8XOU^D10+L;Mm)n$&!;!eBeC9D}@ua%?ip zfiUf@0=ys>PqA(*N;IfvFZ%?)P+p$j@GcIL{YG`^$NwSxKH&J}v(UT>LrnIc*_7^t3k?ZoWh1OD;^E!mH`Fl6cS}koX^E^=gND7K zoE2@aqIq4UcH<(|u@S(QSj=uEG4xb`-<`6!m!$FF_oXD^OJczeas2ZV!te9q=;y^z z&xv;bZ(+nQg%QsQBc2x`7DjId8YzVla%G$`O_o!d>-87cms&l{N~|7tLAATErn;=D zxw5;ncA%}MyQgVjYV63V>C+37^8$x@Qg>!`Wmq8h!*YhHEJ1 z9Kuh!)4U7Kv=|RD;a`Vc#rw}Z!YuM-&NI*Nmk-I#b)b)Q8nc=XEhMoH4bCg3{4zP_ zfeoMFLOi6G-$!nl!Ao>@?JkV37J*-!27Xs=tY5kE`Jeyt*6|aIbqyVkvYKqW$82?3 z&1Kdc4qk|FmZ=~!-3fTZ`AtRT=t+LjcBRFBiJ^TYSi>Z1<44Vixy?_&i+l*>H$F;3 z$la}E^_rMnis)SmjIn5XLCrSp4&evA>kWJ%@vG$!@hG z&Y%{gXyS~@Xq_@vZ-`ILN;2mta&xtgg7h*^ZdFBIwa;1KQq$AdJPLU0Jso`=<3|sj zT%5ZwJGIo?*x&4K>8k0U8ed#oeC_1&tEW!BcH+p%22Wd6VX(HmeSBGh{WVC3w%W4F9YEOXv02Nj z{cVH&6T^cOdq)nA4NUAEJg{eAa;RtjK-XAr*JwxEKwEQ9u&%ACzN0nu=SUVPbZ zY;36@Nj}q>FW^PD1|yd&rKjulNN+O=MwDM(cDa)4PI)ZsB{V%!es{>?c1Yu2OccGC zB%&09W$|vMDnh4^Nz=!tnUZp{f*^)<`yoF4Ndur zgOvq=#>(y^lc$yzUq8A0`ttJYr%t^ATbzHTvZSdZzpf&$1|q&NcWHU~wKHelfB|0E znKQ4SUV6Q)ey}jp>oAoUWV;J&<%bW>pImt5^x~_h7G62I@G1-wJUqSh%E_gRi}UAB zEu34PKesr2YVO$5iG%aU4$K}LJGOuD@KDFTzLwFR=Ha%+fsSB*Ut|AJpl_hQudBAV zxw5mays5IN&gZE1=K9OB-KCa_%HkSOJkU1O8R+pBS7#<$lu|T#%0*EUVFYO_je1EM zK|4rEzY6UPC+*@9Qg|-_7QHcSJ&2Gb|DoWd+l?X2{AV&Ek%dY@ELTxtbzxS&W?f{o zuFb71!@?_U28b=JP3gIvo!$TS*S9{of~|P4q1M*smIP$7LDnYG-&=H}+KoG3K4Qy$ znOn=XTG3X?XYk9ThY5IO&5dlrcPukbc{yg6;2>}8TAaYp=K19(0Ct;!-);MEgcHi< ztO|@dVVN?>kKz2X`P2Lokk{`pLrwtA%~^y<>WE8UG_#aUjrwc4FuJAD{*zjEr- z>(F0jr%n+CU!H%ZsP z1nN7Rg5Ax5?$*ZM&gQ|+mZ9Fxy#qb_hx#VRhK^3`nLfOK?%2Vl<5SC19Dd#qxiyqQv>qgkOU2`pRu&X71d+`}J37u;6l2 ztk_E7<+?1wfqj}po?o6#Ho=*U-={C(&%{$azu07w7hg~ek2*Ym#oTF{;#Eh;nTl;&iYWM>s;A#;^cxCL*jBQ3?5n(Tn38S|5MT>Q)OSBzh_ODg9) zi_?-ssjPt?{xjC|f?Q_8C=J|Z&U0q)?!re%$!RXtU+^2hQ<1PsEsHj2g{hhHoP52l zFtwm8y|g^DyaJY0?#e3j=J`BUuP@i+aQS^Rv2m88% zy=}E!!OG5t%C0(Jd$77ASk>Cz&@mBa7) z@e72(FAV%5?1lJJx7nV8)e1&?vLQd!kZ%m*7xg1_PGUn;Y}thU7+Kp!qBxD1i1^Q3 z*@$ni3QJhA;5QEZhD@+qDUQ%2MeEhV^b9z|simdX$_iVRFTcuXudZ~~)fNZpO9RLo z2VB7xPfL@lslGT^QxK?h)+5Mu+p0^u_7TMFvY-#1zR2(d`7z)hEMLB6j=|)GI!JeweG7Wo{sU*i#l9z_= z3wLn}ZUyE0MvhINI6FUo5eP3Vz5<(HczJ&D((K&%xnpMwvOQ*fi6yzH*j6!pa~GE9E-uYnSe&^y zKYjkhkyA$xE<%4NM-Pwn?gPa=&4X=$p2oV4&X&Qxj%Ed?j0=RWx8qtCy%ah;KaL$CQcI1cs=}EKpCcEIA~iPo z*~TvqGHbnH?lI3Vmq~{5(tc)AFnY3P#5vMPRjuFo{N~ELm#@73<{wALro6u9f}+ZN z4qig88M13G7}?)LM-ii-9y>WvNuyGLdX) zj(;O*k||M=4wEFLvf?jUXM|Q~xX>sVMXBQ>RWUT%jLb7hKJQinUIA>UQWT*^>wl{hj8_OFTiUTzT4SwW-?RBNO z)%h8SH$Bd5PeG2iFx%@imBSoR-W*?{waV=b_)A)BxiNqtRWmABAWUsmU_x$P#WNoCfF)6py{j8xIyQDh!Cez86)dMDOX!=px0n&hRi z&YG5n(dK~$tv?zR? z+eC}(5ly}%3*WthMk8!0^&{mMC^4)s0l9qY2^0P)o;x<-`3=7?{AA48t1+Er51&4P zuHVOM1NYcY*$8r(J`&hJm)cl z4O$EOH^|BbRfa-I_?3a*L;^1?L6njpN+xS_7{BP5jL{M28O*Y3Z!`^rBUA|yYH6%N zC&|h*IE(W9)#c6g-gfwnf$E;-`hnKKP;0|bb4_1Ub#H^etIpG2?`}aOVuLGKR~)Ez z)Ol?+6}DPeUUgA!l|9?%G*=eqRux+Og^=JJuPe6_?2il_IXt;Mb>QUq=xl#rtjbYe zlQ(iw2&xC=56z`BYpl{K!`&idhz z&V&00j*fO8Y!425%A1NEHBO5UPIy*wNk(!}W{M-%TwLVvIrDsJ>ijgNBUPD~n^n}) zH8wdhy>ILY+GCoU`hpEz^)($nPjgvGLvcY}AzmcEsvyr_kXwOXXq&Yx*HVhT5p20+ zZqIWU+Wp0a)g{HX<*tCw+gx4M9&G4A$lTd6)Zf2%@7UqV11FA7EzTc5J9l{b_{8kt zv17wM`+M6*IvV?X0)3-RLxXjFz13Zf?xxzZATrf{N2S|RQJh_7Nkz%Yf{h3y@Q3L( z2#{d#%Mgy+g`RVCo=dSq0x1(CkrmpEXsc72E=7b3O|~9_h4|$tMj$LU5+hr6rIM9s z*o0GVGA8F#)inJ6_kaBO@+aK)JCH5!$a;V5)C9K^>*5)|+t>`}Zrf9M$VlY*<-rVR zlbyzkcsRoB1^FMrLS4r1Hek0sgbR&6Pjrhxf+?FAnX$e{()!55%O(_OM7|G5hZUM6 zY1`GkJC9&@?>u5{S8$|nTwi_n{g2L_f33BB*zIm|I;-qn}-Rr8tTI9D)}Ttk+o3`K(lBDk;Bm8R>aO&y_eK6~^;R7Pix+Mxq#9d<66t zP0m=MM&QMw9%;NWO=)qO%6yLc8h0BYZ4V4|H4b$K2iqI^+UomTYWrY~RXsspS8aJq zWpSXgu)$vdx3I>aUsGYObm!KT+v>bU!Irv#zP7yst@{JsZXjG>^#%N$<0D6>k1Wp| zIlX`MSW|7cE5FK{U)@xWV$6YKhn9~YKYQ%N=@ZkZj~rRtGkU0{vDfPgIP<*DY?`um zRJB)i?dhF5a^Te5i3{_y7m;nApM`W1gL=*!zjS2c%vk?STjK#wL2Hh#Fj=0HqOuqi z))b}9D9bg-tVTRk=V0-XUTI3#o6TvqJd@LoZI$!=C5{?*VX(~6;Bqwh(6L$37W8*E zR(ID`bp`5rn}b6wfuUyHz8Z%y57rLURd(0-I;*`Mes{CKqRH*5FD>FxAqgQvEzq6sVsjj54rl`(eSY6>j zSD2^JQjw*%;hP=M86L9};w!_l4jLMhpcpDlB4X0o@hpC^6A|69gsoU){POUkmIO<{ z-ahD_MI}+3Do#vI!q+mYGcz;u`}+p}`yX%P%N@w#U!jXEJgqN!Ph^03%T9y zKl8wbgBd>OPv9r~v)hh@^UEX54l;?yJd|q2vS0H33t$#3qvvWHym*K#G+gK{e#v(a zp(*+SJZG{1e-riGJLD@E=(aZCm+3EMoHRMZ&^F27W#gUA2L#@0D<8c7(W%oHTiZs; z-Hio>1YRVptbjMSoQzhN#aeC-xzNmW2E6~4UqrsdbLLEkuR+mdtJIWVg-J$(U(z#) z#c|>^!mp6%Z-`&G(1wIqqcDaDG4@{8$TKabk}^k4bwyiCO}XKZll@c3MR z`<@nWM_pl4u%c(*@bP1ZPaZwAu%~CDsiMVgtMrxBw>1onkIu{;KR1J*a{AnnBd7N5 zoo;Cuz?z_f9Ct~sx5QRi?P(k6K6G$md1m^;;xxj~i}N#=kgA%SyEr=wU-t|QVtoX@ z>&UU*=KVF^?h;3XEzOlF&o@bPv(*JDat3d1vOF(MX-`$y(iOH$mA%;Fg^PP&aO&8^ z-1O8b6s^#oIXiQ4Zsy|2g_ln*Tv}YXxVUg(VIDV!bMtfO7w0c5&Rtx@O#@Nz%%%D1 zOS2~~E+BA*<2`c$*B(21dTMg<;J(@M(PLu+hX=dH+nR^!syi#a&Ay7pDrCHCx;k1$ zMtTp74<4N8J1~OixOS+=-`7;$7AR{%4xzTFuDY-WDeGc$iP@N|mzuDsSs0}fMIfBP zHe%RM3|;6X5JoPGtt&x;IuKl8N&QQHUYo?`uYDdiUBDm;1^$;LK0cjspdh(ab%&f)DhnnL8xT>Zaf5r1YX*x zjBioFHvkgxg%)!@HkK`*cY2FlC@%~+udUv>ac%XTcRpA?b+M^=(B%#~3ae}mU!Kha z@wMc+&AH_m*(As6%C?l{n9H(rO0y98KFKdH!KM^v8uV9hGlnD>yIpDEKdZA8$_$x2 zT_z>TE7JBXP7m=*oM+-c)BdYOVM?L^U)Gb6f>n4Hm(SJESlinHW}EhO1V(^rchjD} zmc8A)|AO@*7|^CC#06L!C8!kdh{M+i=_dgQL?U zT@!T`&Hj@5_UgX<{YQ>Yo;t8^ra91CUR+&j^VYeVhC237P0r7sAhGB1qo*dur#svB zR24OrW&4ZMu^6zb!Ph;~clhX`Q?rOh=Pu38!Y73@2VkEwh@eWjUbk>g~EAq8ct3hr{RXZHneshWoA+tqc&yZQ{rXo*) zzqP(|bnxJz!%NfC=cZ@Q&miSBcW!PT0rFXl^YiBrL@&;t2g^$f0QSQC3^6c^jM)qV zLLd{zn*X55!D;9)qnnDh7(9=T3wt~;7Xm^D%| zVEK_rFl6^%KmX6ae&%Yvj8-DSboY2nc*9e;hkW@EYx%z-%DeICE;Z^K6Mne{3>pZt zj!Lvvvh4JOJC9(HU81=g_tw@QtgPI-etqMee_mc#yx0)zFD(z`7gXjseAaxA70d7` zwj8_^PK*)vDG9H##WPB@T<;I zsj`&HOawJDZmTPkObmqS%7qZT3D|=aU#^{$fsAgkqq5H1(q7-w6&&n9*J5zAr)h6* z)4uk)!KTXY08&*I?Nud>US~aeB-}82J({4ZikrRmdVgWCqjs>rX&*e~8dq~yaOlA3 zvAsQ$jqVnIVQr(oYqam+p}n(XgGU3^-R^>#qI`d~uYIuRz>$NCC*UW~kjzqd(@2f0 zp(xK~GnaXt4Q-VJ2L?{e9yvcZ^D;>y&0d^_L2BnNf~-T6i|C}P^L09{K18^w21F2~ zc9x!;=gcYcJF8l%dq?^~{qj6IKxU9nzBoQIt(2H$2|3EdY)@J6#F4Y}$1ffnI@Vd$ zS(a0ln`*ZhY*}h+rq*W3DD_sf_V$h+oSFx@Gc%`;9a)?@Fg-DLXwSfSXX_w}!cBEu zjVKnEH&qlj6gz8*990GAqjprmiqR2TROcya@RtRv${VZ7gZ2K_wqRc;?p4jhJso>T z2M!(FJAHg|Vdl`u;|CTnAL>8Y)jHbN(2rQ7skX1HailXa*j&>c^dm#q+)xn=xatFC zwY7y+t{j(Ho2QRAs-o1Wze^&N2~gxnISfKfmS#V_S3rngMlMFc8?qFRUrCCD?1qi6 zam>)G&FN{@{(<3ty#4lPNJihpCLJ4JJ^T_24fy006-~k^00{?{9iht0@4vAHECU(W zvM=fWk$z<_S?mz%qNFdorNaDiO!(GHw(~RHLUyZdgQu8>mrd|azW(yNFYkTL@w<*q zIY=1GuRLPeX^iX$HkqXSK6-ff%LjKM+z*j(UIn=~ZhvuY?d^9jFDzXMG!2!MH`$!k zd3G-h@bU(Jb2#&4=Xx@&Zk}HtOp?!``cXK)Kp6b$wYdfu}C2mq~F#pT6yf$FXv+SxnYx@Wj;-(c%RPhhOIYM{~6MX)Vx ztSkvu7B_mF_2v19YHKR&^}))X?%-I!)!tCj+Ep{uRWn#!)Kpd4(%(8h+HTlk*pl zG(J0j@#y$Wf757fSyO?jB3oT(QaMvpd1;2cER!?G8I>J618budqHUAeQm%vl2~$**)_ z`9ncfjVsXTZ|iOz?C;q-IygB#a%8N3YOrIXqj99QVX&nErKrKSy57dhj-a=-p`x*_ zJWyBOSXWoiOP4ut z)nSfVroTWqWT2SmG@M^{5Sq(R7{WB>-5%}2i+&nm90A2}p~)8!ZhlGi7wdK(Y_j$H ztob=?M5Y=mf0_P1#QyY@-}SY7w^r_cc6H^w4?jA2`a*NdP>H+Q?yR=jiSm*rE9ftk zU{D-_*PWeLk(KAku)0l_a#IeGV4}Yqzr}RVjRI3zVR~u-;AQ+W{nayml{qS9wn71Z zGnMjeD6CvU_{G*w_)Z^fQhKT)$DUDASsv(W>hEnGK`Y>3+uq^Uv4N(Mj=KIve{aCu z9V}~aC`DqbvD{HxX0LJEYr!uY>)aiUm3={PPrI+b!_yZmX{~hxI=sCDP5T>t-Ts0= zRZ*}jFtl%QYM^~zbx9N2t12A9{+98h2bNA8Ieq-_@`2Ig!J0ngi1ITl3eBEsS2I4h zvxk?L=PxYGo<|Eb0!%ol2qZ^GkJQ(8+br&MU4AOEPjYLvv7ppe9q{$E*N^TWo;xuG zC-%}Jm|eVh^5mr@^gS+Jm|r+Qzj$GO@glR?nX@gyA*m=^o?uQCrgwGjU0i&HG;Xo( zjwRCOvAp;yZ1MQT1HCiu>^hSqS0~QW$;>*b*^p>9N%OK4PIGFB%URQ0i$>^u2S=ul zkDok#_{{XN^9adNa$1~&U4ku8pBZIh*hv(N5ltUCed5r`!~5qCj?EkxJ~}aQcwf)N zaO-GKU00L8x!%`U<7=$*G}U`r;I1HM>1iG7Z5!)u9wDM!+mE(Sr1}HM^ZVNCd~E@L zd(ex_LzOi>Uz?aLja4S$3oj_e_`(Z@b7+H5Y!9Lq#;dT$oj|C;?pO?7#xD>CwlFbr z(b&v^@(YB~SDBV>tqU~1_4mJjcJ=Dr2M@3&2poYgiZFJ%ApYvVBlpSUL{D+y&yRnC zad!Z!yijun?6#2s8$NBA0)k$kG_3)he+`KO|tZ!Y@+bvA=0SEsUQ@x^3{9JQQ$2e&dQ z3tw8N5aX-sO!$UStZuVq6;_o6T57wyv6QA`6v-vh${QGLukD4ajCBOnu6BQ6v(MS+ zaWoKDnHuI^6lx2Dh<|HJTWU*NgB4wMWo=$ZLw#9WZ~bUT^?)De*y~ykT=nh@S3z2Nd48}huy=fHVP@vi!U9C|+$?fX zC(cYAnC)*LEqD4eQ|#m`JH=UAakkk|>?>*Q@1C4Gyo~sFVc`{YSS>ETO8PVwUM4&) zf?{-Dod?46^XHErKXqVoZg6O_vtv(VLr=D;G%-FiNth)~NFN-SL|+GKpFZ^l>CU1C zmX}VVC-dT|xl1*Ljp+$ldU0m5!lILAC(CmUl03c0rcT7SBwH<6B{h{Dqa#PK2AO2f z=FTtR?y-dTfOmx-eF3&Ge+kY5-W6*gIey~o;i;1c4$d8%oSQl{KXqW{*u>1t!TGt# z`4b0brzTEJ?mIC)bYy?ep`oU|?UlWC6)n{j&B3b9mbzZR%kx|B@2vHA*7!SWe66+K zChU0NDXFv=a|{x_ELJ6rR)Avc6#!#jih<2K2)}WvcpwaZ>Fzq=2!mW6-Xwe>6u$hF zO0ZU&onv(zo0+-t*=P42KIHkOtg*JM?fg=;B_1_1roZ$c1wV{d#^yF`@ep)l1g-dS zyu-{-So}-*<d8?U|fNi?U{oS2kBa1 zEcjjDxPN_R&vW z7{BHDbwJqX4EUT4<#{#8T)C0Ca?}TWy$!xT@Q%1R=;g^n9 zsA=<*2TB~3_U!U3y**2xpQ*Q5Q;YOTR)ru(1s7VJIypHH_LrA`MeNiYTeke_{NlOU zqoN^K!C^s;b&X$BrC3aq8&t zksRk!LO~sxB@>bX-~Nz;a`c!%}X`F16>BIL&3nx$aV1MVZs* zDy(!DS5`ZwdGs{SI%oHb;wZUy4=9Vw6cy^qZ%!Q#W?Dj8h4y{>DRs1y3T3EEZN2N{r&f zWJyvg_$7s4Y}0|=hPByg+4iQ6uDAaCAGhye!z;8s6A`332ua=Il+EF$!orV-@ylXl zu04ZdizB!R5L$VirN_xbz`M=(AB~^BjoGIKmnWA^Z~}f7>!rK{NevZ-5Zm(nGKx`Y z;tT>!`a15fuH63U%IB}V{$^LtNQF08P*P(ntjcpzy09(!%0ug6~ybY^>&vRQOJ_tp^j^e1ZjGLoj zW@*7M<_OKqY!Lo;?IHNx*d&ZZ7(EVXJHk=I$a5JuZmqysTh_L|vcC>DI=4UAHWzi( zss%ni)gqu-`E;|0Wfrm!@ED=wREX>fo>|Gas`xgg(1t1cTBXNo3|kEm^kqb>g%O;2 zt+5cs6gUzkkf=p#OJlVqiF&k46veBHLO3QvixrPL<6$RG$Axicq6kWuU~PGZAgUcP)93?HJLpnZ$t zKj$~a@@ayLjFw53Ne})le(__0FbF*h@8`e&0tS9b%>S?aqO_E%E~RdO{1>02o#C@z z{*vIAG*#28Ws=lj!N{OE`O`1IZ9-901WSe4UL0(jwbNw*8n3nT8~f6t__ zQb%BoDX4}E2E4Fj{uwU##0#rDDrJ&inNul)gu^D6Sf!$*ev)SraZMtQQOq)kmeQ->PtM;aaTnYRUvjEqBG{I zBKh?h3jKz{pdo=qA-@J)>XCpd>{o{io#o|$`hdR3qm38)8taOCO9G94Q%Rw#y0dm@ zc5HQGXtA|s2oBn%4EXdB%&i)3pIn>TS)boqn7uzcvEEicg!GP9;^5}1F-B6xG1+yI z+ENsP?=DPlZ7iad?}&&(m-iMBkuL5*wK&{2kK9hwTk6z$O;Vcyv-Y9tilBw-HFCUKv1ev#eSPByO-w|i@#@2^)yIp|`?bYGDt?GhweqQE0S%cnBTSTU zlH{A@Osk^6rr_BOYK-0K=Eb6U@`>PYdn!->m zh^{Jbt}AIR3s*ZdKFsFAW+(=*UFH^~4 zDY;^u#^NunY@D83_?y4````SU2%(eCmrOUk$}j0{NoJG2^(4k7?~_iGp!LtbL^#}6 z478p_7%x-&;^sf~zbT)a;ukmn@$dg{3gK_Q`uE>|`qgiK^%*hADk-cYDTXAHg_QeQ#uJHda*Y@|V~>MP_H=S$K)C8D@`>hhI>f^1q;%I0YL68q)tF ze|3tm3PVi^em!Iet(4gmQtN5+AS4`w7Z!6(3W3F_@PysvNE05f`(!X*KX!nooGOidqet2xwopLtmjVm{L=LH*4o3(wMQGPk5-o+EH51| zEgvl`@7={gc;P;d%qSjZr^zYVGOfzHw*GK+6}`icHZ~rU{ukG^_2bR8qtW(RE8AmX zc?@h9f>j(~H#Q$)K0p%iLN+4Vut*t0*tS)M< zE^3YY%hggVHk%XtCKoiM{4Y+yFZrd2a;TzgniyB`OHJ~Nf(2yrLYdy?Ev#+m7#Y3u z-t*@_|M(a1gCuBVpqsoRiYB~p@{s#7qE0b;N-ODePdx8g#*^u+SF>37Q}97SVoP3A zpBsP9FUU=$s!|l=2JoKc_mAKF$CqFH;j`ajDKII)`t8qu{#$Yq9cU#pT0j{0&^e>S z2&)_a>M#H2%7?~)TyQ<7r+f>#*IdT{70N||N+p8&RckAL#b;O|zCoSYwhF$Uy%%ceT zR1vQ_46Skr#8;jwuQ?I4l+_gV40YWb>YAx4YVw<-@YjWos?OTc+3^i@1V9dfBWFcv zvq|TY@U%*vMay#l@aFoV@zIrg5JIdRtgIfcEFa@IJU_DyU35{r(V`0}1$K?dZV)?l zT&tFCamoVKfu_NhJ5z&8t1~;Bi~CzE#~VZoFp^ivWHM69NFyWOMtAVy-s0l!)XZ8( z$C%$+k#$>=o2jDY$jqkj`sS0>bx`>vX^%JVKVIKNBI^jPWbxRMC-@=Pp>fx|HJ*+wo~ zk6IprCAT9Ha2Go)VUy0SRa*55hfd}~FBNLdW^K@@3fT2wmoetDU>H}C8-CVT9S_t* zeU&j(pnS+276naFKPGMw(RkErOL%Mvuf53UD28F)R~WuHP+b~9YMS7;sEaEDq;s}gk*99tc6son3cyV28TmR7D z_{PS4Oy?j=NJ)fGoGSPDhYMU7n3jXm-+lt>{Y>DB!tJ{ml!5Vl#`N1!21bNTKd_?zxv5fpwswY zOG}%jrA;1xsl^pHJ7XqC9H}ZDI3*)zz-x_IPy$A`Z_)+h6#NoiQ;^6-LxPnwQi}!s zq*_fF;eSu~wS!-!4F1;)>4H*X#;2}X9}J?8udKbTp}(_ku&rjGp{%Q_xV#8K&9IhwW&OIrCTepidiZF z=6z)=b2F4V=?Yq|%;zm#zyD-)^YQxD)6H$dHnyIuZ$4OE*`Ml}HM1S20=Gkq3U1xn z>Ji*7$uBXbhlrw&5$h6}F`h#!a49%;bYsmAEcexn>A5~pzJ;4-;!(^jiV=loSOL|* zrkmJwGnZi!6`)(nq7+!wBD+dxGb%kXUwKVQYjbr^ck}Q_&z-T}$;qMl(V>OGp~e2* z`S#|q`l>#JPiXWgM!;-}Bi`_8f-YUiWsG_(agQ}Y4Bx}_5@$)kRf>^cI4qY&8qf{~ zglkG#nk(BYV>KGNg~60iC~&(;%R}&t(RL?=BnlBcW7&!{k0ztg6?8aXwpt=FyFG<9 zb)9YPgMEGD)6;jq_uu~Vx4-!v+}~M#Utu=&^1pzWbk;<)3?5;?mP|O4{Nnx80QTgc z@-nU_pC{k^zw(O!JM|1nF0L@V|MlnJ{QkF}qqYl0(-s>xR79=1Q0xQKLPow?}m_YXlShdjk-2WYN?&S#(%>E-h7`r?k-!q)0YbA`XY#9LeFszSvl>Z+_R z=@{;v!#qY5TT%5u?E@#x#l`)$+7Y)dVUdRoBA-F%HHv&_&9jJnfY&bZI~8G{t`MO$ zEb6T2Y#4);1{$5}nAccT9&76Fn!Go^H8Z=>*E1FMm!p{xK1jedYh<2?ud2Uu3gG> zZb`G#Wb`~`G*Y{e*v z<{}-}Y2dllB4=Gy_vYGzt+nF=d>Tw`m%FRQbPJbaVpC1@JRKuX&!id(s3sPbct?faqDLSU{A*l)Zwc(&X z8qi@}Ndzv~r4Ks|5yDJx*#yWwM+uI`F<%uBE{irI^ z>@!TBM3xDW@T;EpKYa&pe%oFmOu~DX-z3FEjGc_hzjZDq{V$0*S{44B&=j!b={R*w zy-$LS+0G+FNs!~ zv|dOuAfPhvTvma@uM5;AS_V3%r$*NnXLc5+?=Q@5OpPuMbWJza^i~%(1g&w4!mE`y z2Cmt_F{=u6dcMh~a0PV1B6~?qsHwYZq_64DaQFPgz+z>%jg_XPT$5&B zm1N(9(py=SXaT>#_WsT@*w*el#LfN3YxnjHJiCtWBu>7OhVA%vZ5#9@d+MC!Fc*;N{FmPOnZ2^8o<^`+6~l6WKPag9)B*7k;j zl~Re7o-f0?4PxU)QbkElq(mcOGK!W{(Pvtq7K^POUr9BZMLLICyM{WtM*0UQ7Va(n z-4A~7tKVR0H#t1#K)z@7+*k3o)Th-rD-rbOBgZdHCa;dkr)LmWSt|@m_)`S|m>qe%>*U_1NZ)p$u z{JHtfnVGfm@r8lGna<9M!g!Nb8PSOST7l;bzd^e+1arzGUTsm4x3MzT9(7gOAe}N4 zl}6i#dKc!VHV1pAi$XPeiA%w@O4$yp4mzc-$+2Z<7w_KP86BFhEpNq;XS>X4=9?@c zt5#&Q>B5k5q3Sd8+r|g)Zf`%`B0X>Ny1)LYx2o5`vfBhf zE8h>#hyWgkVuEh4zj=&~hT24{oURu!j9j{zo~LC}^z3|iUL*Kr=NjObg;W#Cuas_< zBTdb+DL5t>+bBgfnPF72ooc>MD@AEIUK*s5OuIX*5>o1GdTeUtx zfr^nQqGLNb){G{HLKBU^g!oFHk0n_=gV`D@E^BFQ?QiWGZtEHbzde1UcP1u3`0&G@ zV{Is!kWRLe5t*z1gPp>A^2}LCNoG_0o<;b-;`imZf16*hc^2XS1Ha^Bc;M?K!dTFN zf)QlT=`v0z}%8D+?i6PkyxXTcR;Wxpc4l5-- z1>d9Qz2w&hc;!fBMI+YAVsCT6Sng0n+`3q0tZl4&VR~q_qkhzHDm3tIMvmRYcPE^+ zgIx>vX7^AfnH;{0eqo0psFOONrm#!g0d=UvQrsSIA8xsGXW-s&?{s5LZz5EUHhB}V zxWudH*;NQHSr!x5Zr~v*_IQ!UwpKL6JK9Qm#yaN~rl5}AK{p@NR)oBHd3XNa{rS23 zQ+L)TMwemZBg=i=({(jHCT)OnQ%Judqg)eHu1WH4%Cc_r#wM0h@NVzDy93*OXM6pL zS5;(W`cyOrS`OD%4z_k4Z|ywUhJyyk_n+KppEffLHjc+G2x55G^8D5gW=iiq-QIb; zv-MG5?uFn1C14 z+P@%-1o>`YTm4-`3CV*Q%g7!VSoCa*S?-B?DjQ3?MmlGPo9?tGI?6p& zIK9d_dIifYr5fZkgOOviavg5ItJqvx=B}v-HupA7&J3(h53NrPuTBmujrZRj>Y8k- z>MW1d7W&Ja=AcpQQOj*|u}Q{ziAr!O)>R~Fz>Pu{L-#TX}9Eg zS)$45HSh~^cMsm*KX`v{|2??cx#2Z4+iRe?)%mu%(yooo2iv<(wh26+!Dh$T%q*LQ zVR3N1W`TQpWcmKq!|k0X7)!go_2kaLqEYCT)2$jNA_S-3TsS_uw7LFpZ|%u&^Bo<} z&CAhqb9DSXs2mM4rbSFMi6~&%Kv0bIHN!$6%yuXXY!ar0$21Fx_GA-c4=h?jgBXI4?kV6%+C<9hi$fkii#@x;rMv=5u4HWz9Vwm0;z%r@Y z@y1prna03mS{vS!}gfVsd+n%4@soTL-~!OUH0q z$1o7?>Kg6uA75Bp`O%O50TZRj`RyssOY-~8m)N}Uvge5W>M2C8R)|tO;wHuKSyyQzKYj3> z|28}_lSnjqd}TIgAqqpUcwQh(8Y!4W7RzXj>n%|&GS4{n!VBA=!Xn`%_(eM~>o9be{eD)!b9AHU9upsmDbPC)99X%cQrsZ|#@ zgHr{JVAcYYg>3RL%qj~RBtZ?|FK4^uEOg(vHC&HgKqRkh@*qkoVSTY*mvE^I3mw(a zezew)Mm;rJf!n}$!smvxMNP%sBOP};8zxJm4Q^x1EcKd29+Y6bs%WvRrWxIZH3M~p ztqE@>axW%$-$~MU;O< zM7tuUU6JHplhSX=XgQL(yZ6EG?*4lOya(^??LRx%ep(%DvGe?9y4x!9qQm0;_LJ?s zr?9P^r)vxQHi^T*w0Jmnr_kNgIJC9(5Uv^PmbSN_jP%Z_xef)xu3|Zr96R>BAf2_f z`SAYc!>#qhz2(E^Xs3i?qu z2EUjsz_utkHkgWQSM%%+Z7}L8!Q5SRNI4YvR|{EXL1ONo9804xw=;slfOcJIZgO+= z-ofn1DyE~v0@Y!ERV-MOh}PGmGo^lDa&oP&Z?dC(w5?$%ZcivVDj`F{FOc(CO1?mA zH2V@|4K+=K^KEJyY;GTFZ65-^9bKbcePa{T^MCo5{{wXv{N@ACQ#O-{tS|rYhcEvK zga1vbD99)V;sB}I7c)XzB!b&B8AP3jv7`jR2^>GeQ2C z{Fn@hkNSWn64u2NuIh%$frj!PuQ{&f+EgryO%cG*^})8Op^h2!`v)9lMqvPn9WBT1 zkOc#(SWpYzE6^b9Q->{ln}ugJBfZQpnm7)p&=ZhhRBm~7xUtw<9kmw)^g)Xl`DdG& zYf-X{!dx{!ODW0ID)RL5JY=gZcFd0zIxQ@-F<&2$2g{w6HR0Blvfl3cp~3dCk)GM{ zzJ;m5)tUa4a!(!mnwSZ4FY*hnNeiyY7+0mt>oUeI8J!|Str=(Dy%XpA?&03E-Q`0& z-)$;D=Ghr_mhbF<+-KYS@X%s^ zr0BDo%Sb{=c#|a|a1Ga-Liof@rOx`%-e^dMt&!B}L2i{~v{R+R| zd__#x`Q@)a{nw8_`TKwPr$_I++uA-5iDHaok<}3gzeIR!2g1bF=s5AkAeX=vAj9EW z!EfaBiW{N@3I5k?2@zhHn59En$Y=Zn7&++SbXS%vX&$Ta$z z5Z}h^RS|1N&{X2l#T`&z;Imp2#ei1$P@GtuiYT(jZbj53k2qyvB%@p^L}GF9s~33G zT#uaXl(C&ER7Ut-3|TcxyqE^*P=$#(kcI8FiB78~CSw@o`3Q8~<$>mohSB*7LJU1g-TvAh?Vw~>ZBWAzi`O_M_{6Qe{l zcz0~@?&Q$i_~6t?&*V_gYUW<}xkOM@?FL$_vE z6Xwth++f)NlVbirz@iNWd}T|k`&d^&2wGP6*H#aa4X7w;j|OVP{_0q;x&$+;OIneg zL)u|}a&={9y|1Cqt?}yBHea}~tiH9bwYRRdud!{QxqYy;1J0L-pOM1q=pG#yp1Qxa z_p_hxm#c z(OA}lb8c(R0A^CvmvmG_n@WQ932$B8Q4Mm#mhzCf%x@@mYvN87#w^2Pxbf-|UR{x2 zoA9X%eX5vW8S^S*J{@|9Pz$aG!bmkMSq>S?uHw1We78n`3CVs8ef64(V(z+#yT+o9 zikVh9!{$?Ar)NW{rzz&DaT;P6+^S_ebS#HO;4`vZPJYnJ@#@)56VGKTu$yQWOTNWO zH5sW!6U}6#nY2`cHs7emp^u_d=V>*$xa!rpIt@jyrW&>RCVZD)7AeBS8(Vou8?`Az z$Z}(lyHy>;#sss_p=Fs=EQ5lrQy|&GH^>UqLYkbLClTb!#cVw-U6T8@kakg$|CT8K zf{1=m#Jj2F-c*8L<~3>lO^ICO+}(Sh;P>$P!Qu1Wy=M=%--D>zRAAFHtQNTk=hm&A zXUJ&n?7q7+zpE{p-y*9~}iY z)V`r6m9b0`CjJ8DV0>Z`a`Agm z#jNhHuA{~B@ZQ``bL~(Zqj$Yk*b|4&L`XZpZ%^mM;=S$rOZ(%UljVuplB)We=FWyT zz}w%_G1%5I1WWQuq@ZEF0~3qOYyb4mKfzE(;EA|5*~*9O*%}a0@CAb)7tZ%o@9}3m zp7INq4TRyZ&lvG=(mTJL%W)QAf4$kZH(WQJH9~E9=Hss``>HbRU!i>I>b;M%`0*gQil@id-?` zD_otbILHl}%OW=P{Z+T0c?mR+{OaJ^!YXe-JzvfWO;zps?Ij( zvW@CYoi@v$%QfmLCViekldIL_Xw}&oRklW*tA(j@G>R;hGFz?6)2S#1P^_ltRk&A1{4zb;$J?%sRbIQ$-d0DcelpUw8))6q>jhFQn9bT$v| z>^|MuduIm-Z#^?B0&?Q-Y|`Z$hTBIEutXSD^Hv=1|S9@@vMo*mk6>;f_^s(|o5+ z;?~PuCQ~3@*wETGIx)4nu(G$jMl@QkE*=hc-9=p(lGg-eT7jzaqDII{yL#^sZJ6^r zBSX_&Jwt8X1Fc=~yaTNrgCx1BEBNj18=Jeg^!Gpb;b)(os5nS|QzuhUmQ-H=M)+K! zlL-70-ZuF%$>6CkKH(R=zBo8z-zedQPZ7omI`xe&!6$zjp?^+p?j|-bByY%TDmH$F z-_-jlc#|;$Cf)sS7&d)lCLeYv>^^wf*fJQ2)VN$l;Fl0q*&-yupqMZlq>`xlhD}zS za0xSz=U;@=xUu487+;0wO=3%2t(LIE77cpK&@vYD*MvQlMPZCzZiSUao6EwOBUhL3 z)S>Y<3M!NQ0$#%Z8cPDEGM~QKt1I?si+lzQy{U-%>S`MPR4OHD;( zw$f6Zy9+GLs{+bpe$GWM^&&6-Z6V`r5&N=OmZlP26+5{e&J9@s>POf3rHMB1yL<5b z;OGVNS4aEL8VXxXEE~#I8i5&->D_&#ww~?oJe?U{73b=-`8FNH8nYE|Z5+e-0$!X- zL==;f>C~`YE?r=8a&2q*puM`!#CIWnu;knIc_u5{9?-=*YDQ*97JHip(NHPQQs83; z{|PFpSxmJuvvhF5Fx>F-j1W%CXcjHgtVfw!?Dnam5q+^1xh%Q~H71)P6m?W0;cP^} z%ySq}Rs+KDyu?2Qk@Zq1V{A2!Fd~Oq>QTvqI#t+WipAo!IL1z5^V%ZD*YD3xY@mCk zBv=>oRmMYAMMaIREyEpc!x*PIH@iALb8l#Lvb!Il@`>9`!Hb)YuHmlU(L1wqfBmxW7O~l*HhTmt;|5m?_)Wr# z>xm;K;Kc|X0$!^%Y_Wu_Cc^BNh}%&ZkJKOq(a|`9_D{^4sz|h;Bc_}fkJG$rsZgD?*lv5`Qy}jbU?D&{!Tcl%e{A6EV_R*#1)yZA2A#sAbkB z4yjpAR6P(C;|2+59D5aPkC<*3Gwc#30y!rR#TIecA`DtZLG;7w@fgD{&$mhQZDNXr zo2lbx>jc?)agKq1Tg6XT3p2HRgoSA`ZkmFPgXd*A`>K+2UCmBYvu~?ew^cB9nu2vp zUT{NNa6`hnA!Xl?a&Aa@X$lxWT_MO+in8%@lp>Iur6v$gS4nOwWSMGJt`0|0gxsne zwK`9wrKnXDl{{A=$dFPm@v`6IWWL4CdW*%lBH-VYaj#1R#CNGg*9GOq64q5A($Ul# z{JN?>@C)aAc=Y1n;QfQGM{bqR!gZoK!m9HkrM!Fa4#DsJrx8=Bo@ujkoO*!;`;2xs zAFMCz*%e_K)KhTE9IM+HS-!i8__H?FqNM7Txq8G2mIAv^8E!1?ZmS*e7$SO>L7A`7 z6_`|1tu|k0FEj3M*D)N=AndH6 zOvXUGxVB?(Y8K+R+1>WW(c)NRG+Z5v)m4;rFF=_l}KDPJj1%-~08iew*Z%aI#4|TQ+*>F@fsoWB&=in1*+H3MS9OVx9m$GM|iZ@AMaU~H>y-Ye^6o~)h_n&|BFF*Um zvkyL+THNRuoUE$r38VYcQIz7>Vhh4Zcu9UCyCN#TXAA*0;jCdm*c`H%!%lO=>qwNA zG!Km|+!1Kq#698yjvV>s*ZIe-1UWynwYIBWG)B7J~ZJ5 z>wDX##yan{SB;hin&Z}rkfF${iMmu_hbm}R`StRkg5`vqPfWAOiQ0z?FC|QeFyF?f zSw#$ol!YuFf#S@bY1=}b^c8SjFG0uM``A!gmO(p zxh~4PCZt}MI9p*8+gl3TX&1Q#SA~=ttoEj%oxS(qd|?lcK7hbU%QhO3+GU&S zYrA&#pY7}+dG!pRnYseIf$6Yu9RYJ>d;MT_X45M1sAy&t0$qmDZ^ZhfwL7DW*z2Ta zAiy@NXgVFsSYOzTh2v0G2yzt?ib_S(YLmgalA&{|yrtgK5Oif6rwDS&90THKN}3X0 zn3Y2aw1gCsgld)&btQwMz=|U*?12VMl#s1754 zCG-#oBZL;Zbs~>W>?N<*8wL59P64Tp7lVks{?eAFq2YnKwpPT7)saYTEYesWZ)vRP z>}nrcxVJVud}nj(Xm)L zpK|xDoYe`x$;Vzc27ZNAXlEQT$vX%o9WGve14HUqhgV2pbHGCA-$1@9kERn}*j zJ$wJ>{Nnuk^;iG#yWf5J{U82#WBbv|W^M7tw5p>%bmPbd(HL?rlYG znj$AnnSD!@bzPZzRi68{H0Nze))isy4RQ8WUe*VGyWnso;LHgT-WxOrSzAVnU zBF()b%ef-XzAVbVLNHFhA)#LvGp~ukFDQn=7qf1P*|#Lz+cHj?ly_Su%uonHVg^hJ zBxPA@#GkTEg_^2SW-4eGxY=)U(_d$0zQ)Xey~)YDz!uz+sxsBG45i?@NSvYI=V3r( z90?`bMGpNkFZUXwt8EnI9vyvnfb;M6JAOkNCF6gtb6Mpr7rwNkoHO_alI2;j9$gNCIwOB^zWUY4(i z97RDhsPl~)B41}v(G5zvRtaGV9TjSWIL|1^HL^0a`DrTJZ54qqa#@*L2?e=mtC(hl z%tOYqN;xL2#D%#i?WMzhU6BgQU-)K|&R ztGSh}p{d3G(fPi?Y2*aTs=M6bN}C%9hs@Rh4A=rvi!}so6?yn2__e~}Ci%tH0xfjJ zVUM~U@o1nN-DH@G1_{vO!ft2##7I9xhWF|dU1gz$`kG#BneT0xEb`ZfT@@I}5R2AN z0@AttnepxZmRTH!14v;Ri#+B+GrUW4rluCzo#LF`Rs+ zn@4x@XbvvL#-&&RFUc>$Id+Z#P63$~PKK6)U$9%s>>IM2o3hNSqAaKoZz*%GDY7p~ zv)>X?-?^_~!ou5^1lgCw)XP%pMIrS9kyFaOD9pUV&%Gj` zTovYD6&73-v95{PfcKi1M3{41!OzlgQ6x=Qzzf3#6DQ&vjTi`Ls^nQJVVanAl|#Ew zkanJa>pUavCbVg@ zRYt18%65g#C9RbM4w+Y;rqs(p0>3l_*zF%<(9&$_ua?!mj0^5Nx(; zgPje-=mW*LS^>w(Wa{+#P;FHYS_@s;h*|72B?Dsgj zLRLfAh4x{08A`*6aD7Q(V`*vq$ms0w_}s+w((&_R&TBGRj zaysMjNOgbj6x!BM!r0z^JU)C6l7PAC?a7g~YDk)cjTOahGt>9yr?*?GhvJ?ZWR<;^ zl9IB{srlXc#iNCVqp9(=!a%LhQtUA%e1?Qg=dY~noWMGdnfo>6{W77Sn-9-x2fv(r zJBQ|AQ|%mzotua7*ukS(*ttd=$7l%Z(v;}A!*5qXniBmxxTk?BiU~qQM18b$4I^Er zbCvrOgrnMlqkb8ko}*Tvjh3MrAxQt_@z>6eHYJNGi5 z@-~nDHoxGq5ahD1iWpafB)?~F-#`936-yau~=SUmgHz~HW%T*o+jttk_m1pglS4anv!=@!M>#^xG87dlnRl8 zLv}q^C(qG|Gt@$SG~HGrOTf#}2(xsO9D^j=z(oq{rjl_(&b%S#;D@BE(CtY2UvxJh z!;kWu3c9iagP5l&j#pv(OnIVL%yV;?dJ$h&Tv$EQHI2!iXzD~{1yL5UhE*1Xt^-aP zh8Ual!nhhGSj-x*D8deP%#{q%(6tnFR|GMZKU|-P*O!(x4i3+Bb&V|C+uYxKGI?jA ze_#?JGz|Q9_lyn>jqe{GVUZ}=#gKxRVC^J<{F2{OcnKs)D)IcO3nqv@i)ZTLWb*ms zGXdX);F&}?<(&~W69|9(r>}@Y)vNrT1^M*;B->2pod57ODn|&O|NYa?zWV$B=O4Ea zJkKl*Ox*1qnduvz=^L2r?Z1Oyqr9pm6s~Z(V%Xcef07w~Z0IEN6EiX)g0MmP8t7r#G=QWMX8kBHmhPuO_^$ zqpYoKY99MUh{pB<427$$=nXo`Jo>mxgEf5707gm%Y7{)Tu)xWoSUFT1n_^?-*$K_a7DdCoM#Z`n$S|zR5|QZ70M|ld7eo|v-9D!3wITo!_2Hp1zfG8R4xkj}z0X;M+TjB^75NPfoa^fUrn>h<$^ z*UnMXUn^i=7AbBkH5n>(x>AjVc878Sj=%cpH(wN{lr4 zEu}C`#Rs|B24S`yi9XS7wHURn+iEU89pS8q~vEKfgc%&hbXsD=Y9_+i*-aN3hc6e`jcVco0 zixhjhN4vX+34RC1clQo{`fs0n_8CH1(oqtJ-&1&#=UntMpvMr7GI^2(cc~bgydf!0 zdhKL_D=FtV!*2@SKYRt}ewyY={v6`@KYjBbMC6=QRgr&gvJ(ArZOSVzNo;W?$tAA{ zywM5?*~ZG|!SLil|JYpL=xpEcG+{$iNrXqLYTAjJldeL$BL)|YJQdt7>3osD!sHFa z&vt9nWs7;72`smoo!NkZ2kkIW7r_5cjxIG+ca09tV=yunX;sDAija^D)J{#TVh7N@ zy9YSlCNQ-XIcMabeKnI)8?)H6vv#x$TRIx-nZv|amojFPM)iUK1~l>Wt*ks#L7s(` zYh`C!Ihi(Yrj3(fWoMW#*jkl~9OD%Di0I^QbJH6ZX)vut)_cw-Z-@kj){zq<={@$ve>n2-E`s?DI0Yi~fo?|gy)iucHhA|KQO4c zt(D{`x7Qv#-G7dXOx{~8%3B;tI`8oC`4Rl@;ftfSr)H+bOt+|6hWhGG1kVrl-izzw zhHSNsVOBA9*xQR5x-{FM%ri@KP#QBR)3yA|BIzv+_lAlNS>|Db|udH$kpRNR(4yXO4p)3F38XT z-h6x%-~$c3C#z}l9HQ#2g4_ieX@=P%a7WAu2U;(A5LKF@p~{8v<>BTrtc{bQTa#mj zPpFD)I-eI30MXo{SfUcGmBV|;98pnt5lZ+v*<4kjVP|9+a}H_70)_$63Q z!b_%?fg3E9rY3PCzblD98C{io8o8*-U zmCR>Xwxm@0_;?M3&|RD1B= z?(qkE4_@pYzt}(ikT`N4JwMui|H0mib2xA~sF_@WF>jJ3re0 zpr?GmOhviYs^S`FW>*jQpJBze?wfyYY>6zzg8RsZj=V`gGv+`bNQ{Uj`zr}}ogmpnAxFnNaQ%P^A zmDxrV#|bqE(+ZcG49G1uNYtoS?k#2h4Jqxqgn3=cyCoNAs8B3ZX6uwWT4-AI3G}&8(E#(>#Vz@76l}1yM%4TKBn2>g`WC>fGO_O1l^io z+))~Lmiy4M1Sz{bvJgI(Ak1@NLmZYe>*HPn)|D3d?WJBEhr>0+@w$eJjym{` z(Rq}H?~E_p-##24pB)^Y9vz?AJvjR5$G`d=_)SW%Qb;BP<78Bfz!**waqmg}2>zES zGZAQ?iZpPaJOaN$E(s~|aLU_~{1R)8&cx&miwzo&xYHU9 zdrRsnJ2ABeO=^cn?;jpL-`Rf;-7%2i)s^=&Hx6Q@9l`I?eoO6e+>OcV<--H>i+CqF zv~A<=QAMx?6<)7CVKYVthwm+|9>MTcEc{Bunk8JffNJCC+IhKFPOhl{2!$sx{hoZCul>a-i9Tf6V>9K8>C_aA<^|KKCi4jz02+duknAGI5V zuSYMAk3Kkr4r=?^-umOiwI|ENn+<_hRgNM1O*Z(wbS~?S^EY3Iox4SV{90z_TMW*1 zG3SaW6{r(`SA@+j>?#$)MUv7=^~rlC&^JO z&~$%GPQAis-hy+KFfPz@&u3?y&$@L!Ms;Vw*^BE&Xv|`B|=$oD%U0;|!jQScS zEVGQMHAt=Pbv<)qtId@?L1V3@7U9%0#J7Bn0Gn{c zFgWhdzx?Bm|M{l}N6#kb)`rIK4V>W@A@soLEDVmg8yV@o$@=C&jN|b8${e;h)L9k? zwCsfrOa%3mG}m^oE+6dfy#sP#2Z!$?a^Bp0GSD+uUDAo^!5A}+5vG_|+|e`BYrNdoaLA=!J(qVW>3`oo zpK<+sPUai=%CYs%wgy_P3t2COTy| zI#07OwSI8$&d&PN%(q!M|K?s~TQvTs55M#1_{HAxLkrDhrxF8cWB&4um4^;-PzzOO zhD@0ylV-`0cS6$>Crv`R!pXcuzkMn9`WtE2&R@N9?$X6`7vDH{;k9#@-aL2h%DK$U z*C^Br3|@wap2in4v^I4JZJW&%y(67-ll_ac!z(MZyQ>RFd-vZt-hck^_`}DKzWd<8 zhYufr^zhM(2gmO}+k!lYSRoV7Li7BqBd=w_tO3@odf zXL6VVJq?4!)?ypfRzl1zw6-@7VczC&=afU{lhO48y2@#ZV*BvQ)OvGKb4VX`D*X{- zVV$qB$Xww@_e#?F;uP#R5%c-ccu4RIGZ(q6C0=($$Xit&X)KM`wYLw=&aHKHk8JEb z*xh?NcX#FZ(UYJ4g7CjzpzMp{(Vq>E{Udsj(AE2A7?NRg$_po7ek*=XWtd53$!4V! zaVBQn!ID4o6@Jeme3swTJ$ZvGjD#Khe)`$hKlss4cK4r7Os|07{*mPQcXYOAcsdzH z6E3)KWV&aFu+IL;mX@Kal9sryEZ{0}If?;SAW+fV*tfoRg#K|thV!@lQL}y80-u2w&%zI)aV05bR`;C->P^KO6ttjCim$QNf_W2C>GfAxIUjdQuz z&r#riuM$@(VpPg&O!j4-3W$!-ZnH~GR_$au>NZVGR_o_F>2%nRqQzJBhlH_u(Xc<$|s=PtZ{?v3;3UVH64 zZmwQFpFz36;$_OP;COO;aqIr0sU!VvRWOi^C)~i zRRELF>Wezj9*+6I;5T4`)D{ZcLee~@gv(Owc9ddgP0U|a9H~td)((x#Le4QbK6~)+ z{rv||-+BJgzkc%T-=U2A#UDQZ{13R2NS->rKazU}5j>xDoymKmQk)8*lMyvpFnUQb zS>a7NViIBEd*OJK|NHtY%O^)oq`E)d!iegeRt!`DM!PR7@J9HF_ zD#xhIHHp$S;$$k7c})UiTos8Zs#u^B?iKvP`5rv}&cWlqAneg!zy$-|qsM;%?>u#9 z9b3}G3}g0ne%cjQ#%0#6H)+?-<=i-zbMqV}?K~svO>Xu@e&*}!{5QG0DR!-c2p$4*6mYL{xR(mJSJ;#b)a!3# zTs(jC!ntd2oxA+jxr=X~yL|op^&78Uzx?{83+LZ@{oKX3Ub~rdiOGco6m{nU0~Uxc zt?unTcyI6F`>_4T9~?Y>0Xu&D(eWdMA}?$qAAbnapFRB0D)l1k zo_`H<287VGkZLsWE6dU;^NfI3laCBPys#B^2p7Y{lR=fU)p?)Rn3#DqBX!?>4pd-Cf(=fAajjkG}WMKl|i2zyI5(uhi;K^>|SF@ zXXC{3-Tn3DBdi#}pvC`>ulI0k^G>sdC8|yD2%!#0LcRCi=+&5JioqD%u#F2gu3*5} zruQa#Z!U?QGD&7;`@FmF&hE@k+QiB1Z23RF^GKLDnfcyazw5akgun!JbhmS#Gdi?1 zF}yt1H-GQ^qbh4{t~k$~;c}%pQK^B6q!O8n@+vy-J{@~D_wY)eOH?FJKo8aoa()&+ zJ5N+(g2Efsq)s(U(2qs(jCoVI7)>W;m>`oPhtVxo^N6;UFMpn0+6QcjGrxnr`nhwr zp|2>SY0{!4SQG;FF)26=Q=tSBGm*?nBC{F6Twb_D6s^S4Jq9t-B&{M@i?t&_Rh^_Z zrsz}@MdOLHkFNLW@nC{lnXH6K5c*ULbL*EXTMaawiAAVW-nsR7Zk`BmcW*sS2;n3L zap+;`4OJJ=Lz@~{)-a4Nmc>Zd!0EfdSR{#+sNz+UXhC`iD>E!TC6E$Mz&7$YDdreC z1`x)F$w3ruWV$#(C{7d!;|1I(F5?)75lGJn&EP^MAX3OnlFE6y%JPQC{S#9Qn={Kk z%r5TC0jkS;^T6!N{=(|PqVFsK#dv&Sdu3twgu6zNq~@T7g*iAl;j!|}1eJnnP@;vE zYSc0;SZp+*w(0_FWgc>A#A4W8 zSx*+)%0ZPca90-)5Ux9a;U-?O=P%zL!JFjr#wWl2`~UdnkKcUv!?)j|4MpJh=)B*0 z^5?@q=wS}*YhJyFUwqXO=lTC1zrM)p2k&>pf9RV1_4xajkN+id{m&ur`{j49Uw;89 z{#*BYZ(w-T{t%IuNS=LA#US`vd)M__L={XF!tKPle(OEslu@-f<_x9ZyFV9w5p!rf9mXQz1S&Z>G<(74pxLh zGU6E z@LPMb8TjqLH>OHdJ80Mj(p5OB6bTYTyh@C%;Xp=e5G|gZ5JrkTMv4w5#i8$wtROxx zH9e9mj+01ZCBjI7C`yPcjwD(vjTVcJXL5tMtbjB|AUi#h&rK5ZXxK6~HJ-ULI=MW% zxPwDP+m-z}VD<>Vz_Jg&tBZS(3FXBrIWZD;v>5p_dfiB&!S_&7^y(A?I$%16$;h^v z)9eVu8jexVH=QbmZF)WSuq<4gnro~-c@}L(a%ZLxjQ~M*ZXj^*i(=7 ze{qIEAvU)(w~Y?WcHVqi;;OQ1abz>9{}A$a@edpaj7 zidwLMaR1%_oG}4jSmPo7!iKM+=v;xl7OGJ9?mi>>&x5eznS1bXAj?%L;@C17&UBh3 z4SGsEC${g6BDYoSwu`c$w`LV)d!+f<3aF13I@I}D))VlZywGy%QP=PwOn-(K#s`<4 z-WhEvIA5YJ^N91Tf*d8s4wjLGt$}vsm70!fN4<$<(bLRYicyzhQY9H=37BB&1<^_{ zpa5PZG`%Lz*_%R4oT_&c*cJHLas9T**&RJmdnNWXeff`S_+Og}En2oo`axHNJG zD=3p4C}am@vI2R6NQ_FA;^Sg*m_!|`R;1{qG()+o=3GIGDpqZ#+Oa`gol~ShZOG$Q(cVT~Net*8tt4&tg874!Tp`oe;bE1WXz2*6>)1@uR#FU4VdYpZ+ z@w#_>y(#akAy(x`G3c;aoT^dB%M=kJdH_9!lo(8k2quL`lA@x>anXUPv=|XLfnZ;& zD8x~xsI{pY6;>+HC5{jZk8}AUX_82xC{n;j+Zpd*foY5oZbp=lpCCz%;lVS#suB)L zb93I^SroiJ6a&J@pBHfe=fxf1_jK_&af&)UMhyBlFBYtCY;EW;2v#ETNYUvr-KJyN z*_tKF$ra_<(rjj~Ma46=R9?B)+*P74cZfVnwl?2h+}rWA_0%b^IE&gY%ht}6}gXG+f(+p4ovWgcm1uA($wT9hTocS7q)WQRZm z7LoF^s+#JrJbKWN{?F9V!f5yOmAdvKbCn*;gKUSEWd~&!omi(hyI50VV%g*g8g;Tk zMKMa_wUStkFh-5lo@62iW?%ryKAurvFPj=&fs`vo8+wsl&$TJ(MiE3~B1G8f6Gh82 z!bRy}LeQ=S?GDabbl4%pvW{`xb>K2Gqp1EgX*epp_Bh`|t zE0`MfP7f~F!4g3%rW%T@C+DX&ybF84Z`Zj;W(s1o0ZTxAk4Ev}!s7no{8mj-Qxbl* z08UCc>-N>ox&9>&-)%|O+b9NMgpd~@5Jrh;f%I@vYyc^mM2b32j-is0(gNxHFh14~ zl~k>Yf>4NsWtA*ZA&HmCu-_CT6-SEX(PB-40wuXHB9nWJ2mGdEHXW2fC$lLeCOwc# z4dPOcaVX(jmE3)=a{!4nLNMxIgk$8-OUwHUi@U1}yR`*pv2w*DMpP0(yh0qWLgZB> zp&714b+1n~7_s=wve?kS;yUYGb|>|ERsc z(p3+k5=ExQVsUqLJer$WoqD!)aDOK+5Rdpf zG!II~`Noc1OO;($P+ig7+Ik1N%`k|Ufmp?~I`oxS&vzpChIJPdO((`yCPtTmqlw{_ z(PvA~y5~At`!3hsY$?7}ZLiCf7kb3GHlEv&nd1}{m@^@XW-H69y4ZZPr)y|($UD(D zbL;H=Y5l2Xr(F%36Ocy8DVRa~0 zu8CI~lQo89b!*Ml?)Ik^uHBSqGQ=BfJO|!h7G~CO)ZKO@8l8#Q2vCmp&jX}5s|(K? zvYRYaosq7~(ihIp?JO)EECRpY?NWDj5||Z1>2V>ck2{Bl?u=*?l{UIjm!#r^@zNqQ z6N9PYr08R$s31~o5IHe9kgklDsH3FHD2XCo28xIV9W#ms{7hw{N*=F}U^6jFEDX;S zhH<6Qnd$_&B0(Vqs|s|iFd;iAogKiUlW8fj3c7`$oZT3WvwUk;yv_!8-(%|3K)AVM7XJQ3}b!=mit?W9~wpFDV z)ya8=0{6+W?&g79qy(8By-+9#i0QOz;`Dpv#ki+c5 z@)1IhVy+**c>L(b_Z&=z-xBx*g5LxFQKqce9OKE2V=jZ&BBQxPrbM@0PnDSq2;ci(&P6neq{FVU0q zZcSp&i^vNx7BrmUAN>x${e82Ir`if~8``ctdh!ezGCIujfbcUPey?5X&Nf$B6uDZd z8#-)4C>CNk$a9^{ZN7JFe$$--&~JaXq{M{7+;wNMPzhidT6ch z{`j@VJGEJ7vcv`1!a`?eu3MPnk>pw6mLhiLSW9nQz6Udr;YU-gWj9=DS$3w|kc#Bl zq)Rm`lMINw!f2%^20MC6Pz0%g8F2xONK$Hi0E2a0AW1Ta60|Z@l;J|bF}^TD1d6gK zO3Dux;gzX~Qz>GV@))@+S_+ux;-pT7(VU<##Vag{Dr2Hbn}{Vr%gv_ys8WrYE_IT@ zoP_4Ew&(7EcYbqeaw}Jun@_bn5)38QlbEG?37j4*PwY5(P7m8^Wa&?poLO3WzO?*& zap_=X>4isMjC}`MaC%HIWw3knTyZmyt4q=FqXdl5w8TJ41PN2!NW|ac0ZH^Ep;hE6 zQWWIyJ$AOm%ruxG*F)1IkJX}qmZ(z2E0l3)gDbTON)<+0kpd*rnPDPS?i_Tn!bQ9= zL0T}IL8j73DO3_Ag+xgrCC8GI;{#KYLsJuiDQOG^T~nRS|4aKvkgiv)`v=Z+MZ^~iZM}Aq#N=a#iNf$ zpWW;$Rp*)0O| zcR-RHdNOgY@_ezSB-fhXdge;!wMX>`#I}+WETI?Fl|t1!t2z(8teo1S!n*3}=AK7` zS1+_*zjkL~Y3(0=^Ur_y`dbL<0K5c#eIeLi^ZK`UkC01nAbt2nQhkKScj@%ckV`zl zA9xSrukTCzc>fuG31S9f>mfG-CS`{ZhAxMHLD+xALMvn1yFEDz{j^oW_ReQai41vQ0A94-p#g7y z_jG-6%gKVq&aP3|%@6vm;fEIh;r@a7woBa(LxoD1El#)bSthiaHC&HboC6{a7JlJ< zlb=;xb+Vr+%Mg=dazHmY9B)b#gEEG@rSUVgc>^kQTA1F-ioM5YC& z#f7E}bq?oB-A0O9nIKCEK*Eq1Ns5djMaGb#W680MaIQYX?v$WckW;8CF4YvD)D)Gf z3kwx_S((KDzAj0tNl>bhDkLcVM-!(|;T6F{YrQxeGu z@uY+pQhW?4E{>cK8$=5aOo)%AYE;&a+dbnWix=x}%2Jf76d79I$PILfT3xcvNHw4q z&{4ETn!$*s9NTolTyEjpH0gQ`7v8SreeFX<`f{@X!YL-5!ra->Gu=CL%2s9JSrr+& z0!Q&=|Fm~x^v|pH_xt~T`}Ti+^M8Inzp(Y7Yv5)_4_Z}6 z;3cx?cg?GtzQ{W~>P54Hz%R<)*-ea5z>p+7D}8dKM-?vc+k0=MHvde0=~;i}OZd_f z-Z~3Np5ba;b>gBdGmA&;*Fz%MZ4{wNm1mRXW9t(Zf#@?^<=J+5jzgYnm1gTR9VUs} zA}1V4Y??gSqns#esIR-yeygYN$v6~@XJ*%@Czs|%7nVj=#~)1IuJ34YHs%R(vU#3t zuG`A7XxRo8+vJwywiI1x$v@}jyKPLnA=Rp0*3n3?jlEGD` zq=cpmA|jWS-1Xe*0V;0DuGakNaCpwWP_59Fp8brc=izt`(;bYAYVa?#Uz!IJ%dS&WbUM04&93IjApvYrOaKJ+gVEAV};PAF(QJKnXJ>L7%XfX^z@WTa&?kSku1|Qb#`dFQjG?D7CCL4LZ6^AB&yUg z67eyfFoY{Po+*wHi(+I_%za`dl5nm#ECVMagh>yeCXkb2NwLwS7_`NXlOjS$QOMOp z$l<|(QGo%Gkr63;hCCyRCrcEGB6w;LR1(z4)$vxQr)n+fwn|Gi_MxyR1@EWk6PKJ) z59l;frVzOa`T;Aj}}LkFIQf%K)6z1GiV%r-NTEMYg65mwIFOL zbB#(zenI(@{)w6K^~s@))79-Fo>RoP8V#O~d);&63vIFF2I(E!Z(O15>fWv?!JBZasR+H z>K))0L;R^ZfR}K)^9NslcqQ^@!p6=EO`93u?ymO>*x!b66J1vFSHNMbty{EH(;K|t7zziHPXZjZVZ;YNVx?CtLa;DksP*kHB z@cwV+m|a45t|Z@$g@sgX44L&52um6yF-jIxF9OqJ$@EZCVh|}F5T=B%#W6B%iUAA1 zs$`uqNvBGIT%^Osb|~Z2x@5hPW-)Q#ZCv>D&cOA?c1S>LQlN^X(eten{c{Vm8*L5O z%@~)Ym@)kmRPJeXzQCAYdqx0%$3LEMBVQM%@h)w6o%*Nu+q-H=Yy|M~`leE@!Yg6`Fw8xcnt(EUAR+bvk#bR5FtrZVjyB(P>1IH}S z(9~5mO%Kku)!r~?San>3T&RB3`DA%|y|e9!S?o~>3~I5lrRmD_#PZVU=D8D>?N}j% z*q1r)+SPl6Si$&uPv>;Ly%q|V;!HzLRnyG4cWGkv@vUd&o~lCk3DCD5c06f;NmkY= zc#_tYU#uuNQ}y2-75pAm&_0Y4_yy!~euCd0{^w8M`;zB(y{W_S>MMbdz>EC(N65bm z)<3-cumAY{*ZT*rd!LNmx!31Uq5X4SVsZpOz1!U#cOF0P8w1D2->(2w1CiJ7HVX-H zzt%Ud{zKrmfA&&SM|nEXWl(XQ$H=N{BJYm79rgJridY&Z^< z!y9?Hdl741`X669e`CSG=#`IIZe zjaR0D(7@51E^ZuqGI6H7S(S?IKQs1%H7vuE&XL8rE$F4|XnJ(a^b|v(>E!(M*8IZG z(&FB;dt;bBTj_R;LE-qYvixdg_0`hqtM%nqHyUp1lT{`x%+hrOkLU3C`o`;x%{Qy- zAFM6xauWFHAOXJun!Hq7Vx(w+sc2GU94RJ&93LM_xqr2HesFnZaAl^~+jnzt;Ld38 zwP&3dyKmOsxKMnqG4D)6QDaShU74ez%u-qmVcrb44Q+=crJZRsB+B)1ax*G-`~Y-4 zb{O^Xa$~$y7c168Wy-?YoDfE8Kx!hf;6P6d0JV%7hph)P2qB9JAo)a2Uy#P+4y4p?7Fd1k9M@A2a?jGShl&Nr8z&vlgMXIFGwe{}28{Zj>X71`D2 zPhG7qJzt*RP+4}ivaIob=hKl1@AUlY>el|h{Py1o2!qrCksRM@@Zm-S0;VsE_6N`- z`~t1l_Eoz_5cbDnJOQ75AHM*v|M+2h2wseLe;`^|!0(Srv+p4MrymZ# z|ap2%j<~T&-o<^)+qKWf~kt)eK(%l(B1s z4(h}@(W-)22Uh;kq?*FM?FJ#MIJr4Dxide7vo$xlKJ;|v{gdg?3B-?{qe+5O?J%RS8n=So$jo-}7R+l8r( znPLQf5u~uYDvMPKqh#E05zrAyqJ)s*kCS3i=+Vh^1S4$ItLcX3k}KCw-7`aN6(bw; zQ8}j0Yuz)W^R0DPb#$GPVl+`rS@PWB-f8d5*7#E|6qV8RHl=0j1h%o^#aXNiE$*!^ z?AK?XF*EIuL$@h%rlz)#8?UW>h&a2s`~egl?JSFfWibeyiwiH75P3J>tO37kuQum* znUS27046n%DN2@FVEh*&iX=xzlOm|3_+)ZYsjF;hVtsLHb8UVPXBHj%0q^AC!pz9h z?C|1n&-g(17|vktSby(W?}LG%M-xL2MxV4ld3?QR;P#Wg^LMWoo|~iORIQe1r_1%RGI^9p8Y#q}N)RQ=2ot7-VKo>(4;4v!G$}fq6zlrD-B37`f>QJWR+#^MHZh5_#6GOqkCYL13m=tWyHEo!0eV)Ny> z;rZs=vshcU@GTmV_UhG}-ucy;!MTekF1nx~EyPk-Hga8XvscDq6X2zF0TDuDDC*9V>9v$2qcXg?Onw6X6G$1Bf17=XV+F%_c0~_$%^H7=qsP^c_VUmo=Eb9>lO--%OOl^P-MId@=V{UqDc5)kMw127R-dOvk?lYCG)$ZCHac&lBUQv#X z<1jL@n4nd&4F*{53M^P7g_Cvn^=G&0@70^@oD7GBVzN-pX1djg{e>81=5diQTq1xd zRuChMoQPB~f)tIomKs9KOp)C=*LAM&l9lPOvYl!wd{42TJ2gMPc%k-^fn`7xL%y1) zE}a}+#-hRO)Mk$5gpqA?pp7QTzH=P}$Q>ecUfLgeG=(uVieC-adcLWBX^F^?*VaEo zlDs&!1)Us#*O6{NU2$=7<>m6`o0ZKs>zg01Z@gTYT4#o_Qh{GG9gIhLf{YSGIZiqr zPl{%f6D4sxtH9up+ROrjO<=U}jcSfY&Qz&58g07P0E=*rTEkIGsUjsqCTGf2EQK*$ zYvt*!8Cr9?%9^G$(j|I|!j)$6V7DnrZltNKY=aHVu6U(BPHBi&$|D4V&elBua=3Wb!INU*#Jesw4*6j%-?9giR#J5CBZP7Vc!BtC#nix5$x z_;ytmq-aG+l1!RdDK+*z7`*p} zMLK78QP-oVvy)3t9t_r$p3Zj_SC`fG-hOH_`=McZXNcwa9 zzJoI!2UPLQBe44+?32uThx)hw_50s_xwZ8I%Xhc$^!o989hq}`*Ms{{$Hx~Jmvk6+}^kGe+loHg0by3!LDv@#fLS`;FCVO|Z`8r_}4oezgP zI-cHYf85sg==}M+XV11bH{U+n)ZTEq?R0%xef`yjhHE%2Ew^Fp3;1_-V$ME^KMKgz zpjZ>K0C*3XTpylXADP-1p1_Z^HHi(K>8-KenTJ;%U8uZVpe%;biI%E$WH?kh`?`(2&vw>d|wipt1@>rE9LW-64v~XcUAOp0+W2A@(EY^`@ zSxG_@Ou!SgcB<9RahZhn@xj@-sa41}DyS+m=*Mh0#FQ;g?JRhA7iSMDa+}m?77N#9 zOLyG9)Co!?p;9%!y*$5LW<7-pTFkv|OC@CSBj1!6ZH7%UWiqA}^iOmMj+3%wF~)fxxqhhn@%yvKkMN7i+7HYhukXS32+@eJIQZ}=_~Hg%auk9gp#%THPd@q8 z$ml#|g4%B%@+4tEgPs+_E*4CXHiKk!1YTg)fBeDsef(mr;NI=0F5^j!G+zu+eZG@0 zk>uMI5~oUxReDT&wL*?w$T9Mm`V1D1A%m&oGPM~DZ3bPFPS@ZDS2k6}q$p?!B4)CP zOIL82N}0d{zi*ebyaaStXj`7Y+kSuW@zDJ6^xA|MTe{oOZJV0JcIw8`_~yi;sfU-l z>+>4(pwf`xv~%npo(F&e1y`1;fws~KTTPwkOo{d++QsN3E9119B%>rw4e}%<5aLux z$4QZ3AtI5E3u0tMfgvnaCaIcFTmbuGerCP?#90*`O)Vu%QeaR^WCaU&m)pC4?U|9| z)G{HhY^m_ndFS@L*t1*M0}b-&ogpj7fuF=K@^rNIE-XGLDqIBLjSmjiKPZ7m65ZmY zgWI6@&g=lc>sudfY=69g>-tMXrIe6VCYhZ=q9zAW;{vc!6p2{)!P zhhwlawN9=jOXPI$tp<+4!iR;E!9>>@scH*DYo{qpDN-xG8y#_3Z%)==HBgkGC8+2H4XC5(#eu0jnt!(+p24uhezfn zMwhO(-pz8CX1j_nx7@sYt;gpte5$eW^5EF~$mGHpzG`-5*1PuMn@_*`@>?{c{m6a) z`t}`!{qYybMTPrUq57Bc7g+wQ_yv{;IR6EH0aA3R{wjWD z6aMeFI=TVjj=PV0`^G?T21kw{SG69EK)b zC$tCQCMjbYMQo!i!wM-;i15qPV5ngiv+R&)<}s{1?DjHDnRG)Y9lq5@0mHz<%6Y1R zOVMXi^ulDVZ>?Sp;{#5DnvtNQ$0?G-`7z;X3Gtc9$pSVZ9JV(TSDm z*$w2ebF&+Z)0+!Jt3w?ltz}mVl|@db-9<(73Uo>vXw3XLDRz;FO$W@95{}0-GO)U z0NJ3K>#%V=8oDXVSUNksP4t%WsfGQO+5H@4frW0v1jj6KO^t10s_O&qha2l3Zq4qv zxHb>!WtzD%t8QcM^(s17+aGW4e1hxx#;ftib4kIeG%^E&*GN)y1Suv8Z!7`Hxu&8g zw+0u6R=lWlAzaWuJv%f9g|3y!b??~H#@v>7cwuvX^X10N-NpUQxt%@yJYy@~iM8dK z4e#X2^6bXS^x9ni%tHT+cVKRQaDH}hZf4Ls+&w+iGye3!v%dDnU6(s=oW9mkd-ZH~ zO`W5vR8vr@F2E=@7v54#vpPv7j|1OZB90Vh9^(p*^H3)9kEL-#8LXgGMj(|Ilu8Yz z;r%e2oDf2e3nIspN%3TId;kd_#s`t&jv-_dzg`+Ogp&#p`xyLL=?!Pjx3}Is?QGB{ z8RZn6Jk4m)XF*BQJF_u6ver;}MJs{9irr?(?(H3%o8MTT+kJL#vcOtlRe98MOJmdJ z@tNhx*%f#)UT*3zE3yqLx5rh|+c%0FySHn&qOdmKQPNO-six!{n$oALn}^1|!;@a5 z&|@>pQ!}fJOY8sqoB#XG*T{8=nESKy{U6_z!0+rJ)o4K+9FtJ|9DZ=7pvZ>qmuQ*p7psHHf&p(v}Nz+LarodEyAkl~Tj zEW9}EvuM+yGn}BJ#VJ$ca8;+qDyZQ7M)0U%oP=Y{-^Wak*5dBw7U4uoNim2S0At;Qr1jy@5Yp$^n#PH=icU<%gm zuzVLviVPz~#RbQUd8+%jo)nqN(Q3BQ%zCD_;l$Y`?;fVN3(E)d6C0RMfh(w|njv`p ztaru>-s8#(oYm!5ZH;$PBim?pB=+@X7nYY_p>4If`DSzL&Fz;2zV`6O<-3putt~rU zT~b?7SY1_ETai=c(PgVLt;$TZDpN1#C`43YW>Th>sWh`R>J)`KRVhmpD^nFZng(in zU~nlDl(Kk*B2FQXmEl8OvI?cNjv`kl%cOC_%t)>zUYHrdXNIOxf|&`Stk@7{L{RE+ za`JIz09196pw z+4Z@xwR@KzTL~dqheB#ZqXrrv*pi+cTCC0^DAO9DxwQDy@Yvks^wQ$Y`r!SM67xyD z(4yDaFSoT%jL%IE%wDRyT8h#v|=wkVS{Jk#(|7F_>X!VbWkYgXE&3MoscEA1Rk2nCY|3g1!k06X2f6ff39-YHp zw12wfYd#+>2>ZYAupIvW&uF;)`fvUbM69l^LGY}GMi=K60N$Oy1g{^khp_dHfR7#- zf!*`aa-O|hFL2~L%dfO_+_~1<_i$uv0IAC&YS;<%MaNdBCRS%A*C*jU4H}iNVKs(6 z)zrrL#QGG`r`npI+nt}?nVZ@6B7}iqHM%<1H#hWX`qssV=W4GtRJImoHE5;zEQ&T2 zV(dQZ1t>!hRc3?x;3(JfNW+z5+*(qX;#8Topd9MEQvxgIteM_S~-j0ip>T{c% zT!)2jv`|eJirJ8e8H&-EY}7#B`4~SVl*c*7iwj6OMn>U=ExgDma&&A!3@=t>V%qJg zHUm{xS8`?*8$(M6%PTLoR$oDc*+elwNm8F-yLa;$MnYbIcMY?lm$Ofn?F^?e-lB~| zuhqUVyN90D#>Q)acWdj-^Q|{Gs;*g*4d7G=lSMP*Yb$FXAnb1Ke(I0EJ6o?W*4<11 z37M1RKT9=phm)BozY`Vm4%gof#%XRIQ1kvZbnRRE>?M@o1GcL>lF%9f>akT!Fm)H6-6;P54?&0vReSs@wF&`ycsvZ#Ec!kq6YJ>jYGsEX0M)}@=ITzy^rMbx}=^Xt=N zOZ6q^vEZQ0w3!S!_qv`;&#lZ(uPuzNH=I0YR%fYI_PWM%!$UJOBa3%0c2&9RN(t|P zS|5HFN2dw=PD~?(TU}b(_@{sTXOxyd>qP^?Z@(p~;J=DrB-Q=~H9qTq!cho5iobqn z1HbQs7xd=0KR^!J7i!;)cm4Q9I7Te?D_{9NzWpfv5zB-S)}Ma+yWj8bz8V~u9vt>! z-U0CX8&>|b*$+~L-6OQ(2A?|mtp9#wa0y$wW~HaQYj~J2iC!9q9OdNlS7Ju$OZQvYrMxr><|$*WwSQy&5WEwp@BhP;F-t8yno7?LuTFSC2oJxmXPMG?sfh?{~ z57$nP$(U|&XS%Za&YTQ;E)U&2TdpK4m+#EZaAu`D3o^6w_*t$ryF0^~BgoF?fmLF} zadDmY44W&{nJe<3vy?6IWQ*PTs;nxrx(ORTuu&VQjRg{7)HnNnGrn5 z;Ah6k1PO{vsw#~pGa0gLYMQUN-Me$OE7y2Zo9R))gIH#6I^Q-tOF(jFYV}rIw^diD z6x*`gB|SYu6T{wz*LzB`tMl_JQ2dTeE~5Sge#fU*5Q68t8+-e&e*gQgh+ecm3LhoX zNUDjvnh31^VCs*m2);-71;BCd2k&1(7|(~|)=we)-``{4`wqE8&g^SG`;+Q-jp!f8 zN$-0hAqr#D;j3@o{_U^-5v^vFZ1aozN7JGsguaj5!+XTviIrhoeFvI#gZ&FGeSt-n z{d8dZ87Spr3&W$>Yrt~u{K)Wp{}V{Kk36{Z^!nxdt>CFkIoEXKeACUAGdG(X+s`%KYHqxF@qEYa_FlXv3=Pb~7arJ0%V>6H3lV%~ zdUJ7hdvSbyZfI??f2H@%*tyE<#l{L9!z_)F3XkzJgE8sga^T1r&ZmZPqXVfC0YrKx zOIOzvHng6)*_3~!%6Qt7;j%CcW`@DSFsmW53fnb*!W+=Vw5J`h;=Hv(2*m?;LL^H2TZuk47-i(v@osNd{1tsJD2au z<2&u>LZ_Ln8AgxTRj9}<*F#IR?zE>4!x~V>n@?Q4-gLL;df&){k@2pvvEK33$+ew@ z-Gk-*E%bhu_SWZiH@#asOFKJDyW5MqYZ#Lad&i$n4Rj85T)1_(1cNlrHOc^IIB}k0%GO$6k@p4@vHj)&2npOuz*(7i{_1XjtXqKutg*HVC-&Jvv zTo^AA#EQiU5@CXvA1CBQa%smoNg?#45Jog9IR?LkU`}!vH$H@u5SpGsc-#o6kzz)I zjGic_B?)MWe0GY2%Q7(GgG1K|xkeseV|Eta?-_VHI0==u`#1a1TvbY3N|o(K`~9K* z$)fDaoa{36pNZnvhhKjPo|#+sE^YkkZ~g%yS#Z}y6vja!{qCR>^&@zJM?_mcc;CPN zY`}B`cH;SO3DG=1gnhX*HjIuI6NrF&biV%{9}*Mcx404kn&?Fz4Tb$t7<%x~qWrgi z|HF$9KErDd!50Fs{%P#b@QVkJ9vK>69-3J3pJ9a2@s-EjQzm(?M(%EF>pFkFqwds2 z=$7QT%kx|(J*Gm3HrK4kGRw2A$}Fn_tY()<<}`?1R%wnV!vYk5X#+Jvi_mEnIt-Z( zNTTUs@to<@@N6o+#Q@U2#HEusjS7!hmF+ea=QvMRmp5bcxB2wd_BLot&wwm3IkGf8 zx;#I;Jl8wjdG>Clu?$^e5e!X2xXd6fBbdiJ#;1p}sG+pDpd?PRQ~4fH|-MGu~pB1XbH#!4Z_#t|VH8}UFf61>#d$h3;mv*V-SjCrjhryT?m`1SDY zkM577k%eF2`qmqqoy|9=bL&kMX;G%5K$xVpajdUNxmot;m1c0bwP`FLmZb#L2K z5JFsRo0V(5bG-{qtnyc9&;YX2uot#)@I8&YF-jwPM0dE5@9S?nw)850)}GrqBRr+JYV#wYBTb4x>lPgHPJL+ zYa5u5w$|ubYOBC%6F6*{o&t4Afh@a3mYvPFI=NQZvZO}{*vGi2lv9JiRG}qdH3P9Y z7((}ym;h=_FfA&W5gyEm49&oa2u{O&L@+1%SVr9O%;ZQ3Emls8kx*hKaq+VFWI2VR zVx_8?smjz;89i0ZO;@NCcDL=MNnN6q<;lbjVW#$U-K8w&Ntdg5Y--70`~tjVQ_E0v zL>Ft$ySlY=K+KZ9efu@eH{X5p&3E5oF8u9VTz%(onCr){f3yVrf~n;%g#R+fCPFq! zV4Uy%3<&!hPyjNqD(J6sf7-wL&+q@|tq;ri?04V)FRnO#2>Xj)T#4NK`#*zH{jdN2 zQoaC~`_{ z2qis%XTa_)&uyX_fMRWe!ki@4#Bwu2DT$2$E^*dA80?xvRCO_Q*+N@O)y0ifl)Z1Zw?En4`xIwu=i|-Q*EQMA zP?dKvpoeLC+%<~eySe+>*6!!N^BLkV@SA5YgG6%}CNHFza55z^n5m%aU9!AlQ`wn< zGxyHlf7bqN?7`UVlexv=mATQit(BKMn;&g&ezd#&@$T*?dwZYm?R~tn^JZ)N_4dx| zt(`X;+ei;ST-$!Vx$|aw=M75i-OZ0SS6&W1oq`6!rL)&gSDwkS<{HJYPg21TLdn!= z;VVirI1%6J#4eRCS!-t)vsh+3c8jQ57p%imwOXpuz|v&N949P=%_q)WtGn{x!oB+! z@7=k0xASH37K z5>=K$QLv~QR*Ht5s^>EG0=7=VHA;9kVY*$)cgqDXNxE6YwU`ZX6)74SCz@B|Gb^|P zyf~Ang6CGfOY6V-JA~k`zxw7||M9n>j_`Zfl0rW0-#mO5g@14O2*V)a{wQq*ND+U1ooD3LXfhMiqVL`w@v;v6l2Ab-cH>)tE%t|RzWepx|MSMq zhcgR1V?Or;e@T0kHV>iIJic-il!-u$p%P&3I{-59TUmNZA;>i#1jzC{@`8Nh$wJ2| z*ppS~Hk_-xa<2MXbJbNeU>hnfHP>BhuD^D!;RZZvZ(V$F3xDX=&i3XzSlPZ(N63R; zths*S)b-}dt1VS+&}J#Noys*-LbW?bln*5bGuP=7f@+1?uG7k~nwaRo=v;8PV`y}# z3MEaUVrx}QtsqXqiV_IvDzn6%Ys404^VP^)KE@h00g5rNu*Q? zcGUxDc;%#$>5L#2BbdnuVG6_36;T<6M3Fd(M+r*C>;`)`fgmK1l>S|x3++zPxtnJfwR5+(Z>8Mm!L44 zmFu9}3Js;(8y^w)-9gy>e0%SU-GeW75Px?*$}$%pBgcakcAOj+8^kzuvSn#@e{1!_ zz0Ef-0ne@12=u#KAMI=t4KW;Gc6a~NoxM*H<%zS0^YQjB2Ff4q?ti@h;?v!OPgd5S z!(kKrx{jNjEwvX5EM<`KLCI{$uv+uq%?>v}^A~%H$mNk%zjusv9ml8-#MmZcrO9-JS0K%cn zm=Jb&04oGE^#E2_06QuqJt;{?>=t!}xpDQa-}3zw#yG?7MSR1^XZIF`T4}mra!74=Emd1gb2qE=R;6~Md^#Y0542NaBu@h z>1;=>Qj`nN*3&0iu!AtzGd0vdH!-+`Gd8$5GUy#2UYZGvtj|qKr`v-W<5Nk(beIYq5m(Z zsa2_JD;I78ImPCRlh*1&O{tQm<02>rG6{kciB2Q4Qb;fpp(VnVfJC8?lbJy&g79=% ztSBv#6CDT!LRc^Pom)^CrOb)FJj4iu(I+BjAf$xwDrl8&M~LJoyE;oGxTR` zudJh&wevB;E|9x_@Y(*sr@Py42JVb|01Ad1+>-0(?`~t}yZs9Sy!&6^>>Yf8=O65R z@0_g<#3A&3)JOB z`V%#tx`x80jtlpPd!|6N-dlUQxwx~vytju2`0Byx^6uK|-pcCU$jH>a+xMFrnoA2x z6#@k_o*okt8$pgq2%^LVP!a;+9g`A|v?r94f(}(sG6O41(L5qq%X=$}+i=ZOWIDA{#|?NPJ(=ozG2^&YK8zWGG`qB&CLAT+~V4=5rV(`+7Dq|0pWKjKFpty4|Ds-=ESZe~Q_6rHsw~4JNk+dA6G*zi&X`pE)XQ|~36;e1URjs1yjc~Gq z1|2rz=z56x8#opR*Wp3F&2?pGX1O>v2gd@@3CxDD=&FiVY7=!@iorm$7#UUwwyRQ2 znp6WM>~yf_qv`Z4VkuRds@JCIup0|W4Spz}6_7zAr=^hD$s~FLhBX*%kdrasNFq~` z15+qL)Y!npZ>O`Ft&i> zxy#HoTbL-Eb=jHdmfIb4qnmBb7vwqF9&-wE7;}-P6dM+o%CFpSfgt!mcl*Ga_r>$= z&pz1y{MFuPFYp$z`(}F=rTwe*t(R--2OH}LTbs`p=hyGt?5eG3G^wqr5!BS+M0!vX zBPf|2Oid3?Wd+kHU~!-a6_gSmoI;IE7qQg^u9FQX&z!40f3fO(1?GDqtBtGEr$R$O zq^BzNRE35jlgIMY!x%|{iQv*4C&fjQFeH$vP25Yt!XH#$jn;Z)^4C z=G^Wnca2SAN3361g7nbN!t%CvVFN9F7$@1}ZkUIH;fy7P$yp$DeQa!{^WLb-RBAWn z-h1$bXj{!5!qyLAT&HK(W*63X_MiXmKZp?QKYsA~BQGjn;(UY6e_vMoF6JHu-}i6u zCExiD@#LT47n?+H2^smrjQR+zN6ZaBspIJJqno$i{TD1m|LxzudinAfi_80y(;En^ z@8cJB?os6RgO}K1m|7bHDa(I+@fVZgiHQx5sZyHmlw_F8a%!;SgkPA;oKAFXtQjU#n!%W6u=8!8^V#{{3#3PyPCMl&&y)IpO<87o)B$sq5> zJB~R8==VI{ae**GERB^a5@d=br7}fLOfcaQ0I^dD%OrqPq!NUQ8G+msGW48jpcceJ zf0aawC#3?*SWP0TV4o;DM#GV$xD*nD3B#{2fjmRs-#fnM-S0TpX{A{`ENBSi;LQpV z5J@%g3-J2mBOvyC^Gz9cfg#LAwYfCK$g6jDf3f%c3!MFfFP=aD<-x%hfaK2ln@pA_ znAnO+2n~oYFRe${YabanV7v42!S1Io(X3v7wXt+CHM07!W1y+FEyq%-z>W_?1G7c9 zFgHh#lPB_IAwNmC7jd&nGjj^~+4+L(0#SCZD5uO+eYWsoXKT;q?Eb+9`dXjAKKSB; zyJ8&uaCo|?7f3|)9B!`OIs#oT4gM~Szxyc+-6aZMVf08Wf`z{Pps>@ z%tDt-7DPunmm17qg>f=sg+g!wqvf#W)?IX)_Xzy%zxd_B^IyJr@hd-m_clMFCuf3f zh!aYVJym^nb>;c~_9x48djq}G_pWv~6gSyrc9-0(OS7n1CR?UEN0gHz$jZWaS5%NM zF31z*q0?Ke$^ikgIk)NZ$<{}0PgcgacD>JEZG7^<{x9D=|J95Aj}Hz$CbEM4PhT8- z_VW4Xul5n&e}S;ROVrL7czt;9ZXdi7Y`W|Wswm|c7>`s|2%8g>o)N^u+ZVi0lYX4|EGh=ztw11%kz&(u-n+WCg4xywwVu-kfdwlG zODiCu?X9lv?Jhn)X{xqKbIzW*Hov^HxDI~H!P@fk$2a;h+Q@g8%zFPn#@>Ug%>&&U zl>h^#_l^Vzq23z;feJ`MjoxwZ-Hy8*_ZmCyjti#usxCUXJ5HIC=@X~SOwN4whur;2 zfIV5?UF*(z=3N2{kI%8Up0=O8huV8a+q*{)0CHF7$kw{;W?dCj83WmNHS?~*8C;HM z9epnE^q>4)Z~%a-Fa$h51?>M9T7UO_d9-&L{3FPdI8c2^T=Xm_-_;fv-&swT<;AWG%0+6iy3<$&|Tvymt5 zqt~yt>tuC&N{JBrf&!I>uQM0dR8_2RuxxIt+_|ZC&*u7lyEhy?z4yX}y%)~!IS==c zqdU(W+In(l+rjnqyIQNa)m5yssq4(jsxpz$Ag)kz%9Qj{T*vbg1t^${vsDB|DnTiW zFO3|gQe&@*O6cX-gXG)aNV>35T-l@np z8fk{og0ib;A0YW+=L_UIoG+ZNm%y*n_1s~fAL?`@MN>mbU>l}H2PI2bD#*f^Fg4{t zs?lH-SZV}SR*u!iF`Jo2OwLUlqfKD4iLJG&hQ_jWTWa^5+I#WI&1cR*muGxt+OgiOw;Wt4`-UHaZ9RGD@}nD1$9pHnhn+(MlLNhDeLZ70uitO2 z-XzZ{lwNR5+tY@e(uP90pDdKs>NkUnofD_9CWjYC&mz)?uibbp? zr^VwVH=b(~RYO43#5S%GX@+Yaz-uV1+jL$Tur&qIy_UXZos4Yu;;N);?1 zjT&~Dsz3v&HwCRoii>-urUZdSaGnZcO~tt0&4ce%5r#_&YBAd05-RTQRr16_ah#mc zNKX(m<9G#;1^E#)+FD9ZXhueGQc6&4B97F^5iz8-5rjEcXb>rsObYWyco3l!K?HpF zAp8;=g!6M~I>m#bksOp9M^1<&B}GE(DL5w?Ynq^>c;XNk{7D=#L<6>Khz$;L-5*XO z>_|dLQ9v%46b-#)5^-OHFY!(s7vN_p=^zw^WL2mvUtD`g45ly{9z`xAhD*RQvTC)e zSx3=X7-mRG^maOseC^KXK(5>U3gL1G@H^N2a3nT7D~#A5rKW{vgBgX;Gs*~h25MlA zrG{fG&o`L()=EW9RZ0D(nq8kCxYTjK&oMIXnq2VUbHKUen4ELD7936hmUuc`3r_bU zo_6Q_q+@QvF*E6y1%#c>g^BU$-tO_M7rxxmwoA@dX2npG!ZS0YXgT3@S_CsElAaSu zqejrU>0*St=nZ*S78yL%#>?0lqFfp zihP|WyAYVIS5$5>wrnb^Hx-l?C5eiXgsNnbIF^Hxhg71%fhA&WG&vrwh#4XI8Ef;m zwCwKtYH&y84lTD##wp&m?H~%~kv=d-T}5Kx z#m6k{Z-jwgG`ap?T4s8zzG3D4aBx`0Zveu;=`Sk~UagQ<@rxJBX?Nv4zx?u_4?q9s zhd=*3?wW(BKAPFp&Nq;J15bdLAU6WJFcy4D)Xe_{UO4nUg9`&Zdd5y3y`hoT2y#l< z*@g6MkzArSYHRdLi%L*l$Wj+GO4UpqOq@&dwWXLcL75603b1XQ%cvO zNG{3*u@1)Ud!Q?pL7vLq4 zBK<*#K?MWgU~Q38b7Sa?G(KEt;gQlmNFW@i>yesp`VI9I37)mJdhJDLuF(Se?K z6}%qLE4Sw*@-Gr%=l$X6HJK5lELa&9#BnN^<$B_PS8e7KTJ)Rsn+{g*eR`!6s>tmR z2i^81FW~Qb;q|<9xshZ6(&rBMa{{gIMLZF}EKuwsUM%1bGluqde5$i!==9NxW?eO# z%Fm9@%~?xfM$mXsgd+nroJNZ-$d4+3EtHa@-PW@6(Y?;GVJ~Wfv9UmPjcX}45rdAe z?zA7?eauu`QIe-9OcSbei;V^NO^teLacN$0jl6PC?M~b@Z7{7@7ZfWp#elXN?%q(J zUdv(!QSyS}N(^PZ2>fLw1!X{qnj0g;XSj@~ym#}#;N!uz@^vKzYFsEBKK%LM;KW3a zqph@2%`VXv8#;SOQALjrIxif#Rw~vT%PODsjdTu90K(YiZLZsGEUIj6-PYAVP9$F< z|BeoHk0Jk7l$y_9xJmdDb`FAe^(lk{xftI8opNl#_2<9-gE(sNH@|`BDvDR(`Rh;r z{O3>q{1vx{ACQId1ljWAE-COf|4-rSkZ?l_1l%7mydwHvOtJ7pEgdMQSBmOYLsZ&>P*el~!CO&Ml>< zhyejsmPCf36Xu*8qo$x7^C);{mlx>E>E$|_4kTL>*HFRI8|a!6iXX74GI5eb5G&+F zaKJI<#c??ad`283(|PPz9y5Xs{N`f6Pb>$)X+$fEJQ#%xOC|-AR{ldKk>QMqoAD4b zj54F5$O*Vh3J*$4jLhPtiv>x1egaRBBBG_Rcej1EujTNjip`32u_%#SlqD6Xi*B60 z*M4{4_O&MmHXk($DijIAq6ASe<6AYqA9v2KoRsGQ;7jO_X*zZ2F{Y)9H%#cseR1WVx zJAvu0^F<)@dOWW^ULyZGoJ-gZJ-a&?8Ilo2MjK9HrSPi@YmRO>{NU1q&U<}B9h2VC z`MJsGKF3S9>!r)}-0gmWp9S^__`6@&3GlvfdR_#OyOMSn?XCs4_qofpG|)M5WcR5` zZ4Et%ksFzpgXwN~9vu$jVL9RmCMTTEh+~PU;wo(ohEBL?a$yjSGTS~gZl4*Qn3_P# zY@Zz)nZgC%o=t};}CRZ?SGXy7{x4XTH32_)3eu1@a)w zc(yD{UQ8<~$te-V@R-55(r}hCmYo{{aXe^uMB$bJhuG4BlFil~P~MZ|NyHr4#m_JH z-S4X}tkuvpFj>2B@#b*fc>CG=7M2#mciVOz7#wpB4o&ty88t}FDv|o^r7uuIcMV~; z1#TB$DReEXLPV{A{|1=hi^#>FfEQolnrS(Hg@IbY#`LFu|LTul@Pwt>FaL`d zt3&BPg8l`j;ePOb`0-zV{_8Iu-;4IHiHA>zvA`t~E?89hy;rAHPT-g2b0KTGARfVL<$Kdg@Gak@uj$+xQr-Dek7e8$HkwdSYo|*?OCgC z11Lkfyy7CbMt)n9477&oLCy(y7aJuZ8TG~HTgzs zZkds;yLIxGqi=ffiL>YS=+pBZw?4bOQL`DNZ(+QI7S3Tr6Q47gYmk?-l1R9Cr9_f4 zLrGvPC&!V}Fun%sGMbzj6P`*~<{lKN~-}?|fBBgN9XZVCircVJa}#_*VSCu3lcV zOTYDa+tJS3-TfV7w=UkTE~}AKWy&mR38fJCN=mSxG3t-tN+Nmqgp|gx@`936$l$3) zKv5GV7B61JOk*F~boj)kqe`k&oFn2C2+yCsdjIr2eIC5m)e2$h{ku;bU1MiA9M`h6 za#0B`_XkENU8B?6E4S!HGDzA)LCmcMLy$wv6K6LD+xSKmT{=ya$HQXl4UJU=tbEuhtG0)=&Q;FzW~J z@)P(a8ezo8{uidDtAVupGoT6-1FfF~G12;DC=LAn{LlaV^eZy&|Nis=W9NUp|K`uQ zK7&POpm+v;1EZ=>r_HFGKgI8-;3d2@I{{wkJB{}|n`p6aH7IIJ`DQ+)C?}prOAxYB zq~$^rB)efcrsL=#?xf9AYp}h|C@MseoCSr4qGIswk|mOOfe?BuYgu_~3NnLpq4fk3 z9Y)0IsA-7}Yzn$mzc331N`$0?U-mF;4Jj;?3@dpIqhjO8@zjt^KEzAoV7yhZvwCM4 z1Y|N~!fe@@BUdgTyDNIsu`BHlD7VbV`CsVjm;9B?2u=2(9{3b=nl*7CTX=fzq}-~w3MdP zGH|d{Q6sL^(u}MmMQS)JaSbgdC_9#v2{+!wydfy;xdws8c zQ*XRefba{K_qoHfg!1tKKHX5cr7%Zn$S%YcPv$YT7t7?i?F-KECqMB+#ownoD2Y>l(KA4cUjf z$1Bw}Dw+Q5g_~W2_RfJxVztya0ZF}br5^Zw+Bt%Fwj4uP6aOv|w|5MTj!ypRkAKGg zH_+Y^L#pM4FL90(khxnfoi2?(w0C6=gwY}xm>vsa zSo~-vKbFgh;nP5356Q!EXcht9v{-_-kEw4&C>cshP({N5dsG}mkFm8OC!&zfk0{{9 z@OV+2!ent#D*W}NE#{4FWi5J|s+?Z3vwrvO^AC)CgCS3ckB%+2O?_YWe0lE63K3SK zWfd3%@eS9`eTm~)C|%%`X+!mPO+i^Dr?Qq+WymetQ@ekx-#a!6-Xj6tacE-nyN>TW zYn4};IF@R@t%_;Xr6fOAm=>HLhf_on zA`2?Z?0lyVo5uD{N&94GujlOoNSSY!+43%WB$mEyuPTzjyWVN35TsnQtrnEwS z2d9fxaJup|mI8eZtD+=Ds!WlVq{>w(lA=^G7n28U?n1JX$#HR{$YfYZgiypu0!f^Z zkh6yNY>u*=ud9(+OLCQp90@;Hcz*x6^BYc-ah^{g7tg?H68c{vR#Grt1j0|5{&>Pq zq|sk-bU^gHsD}eVG{64*`}2o?tzsG9BqH!0y#E(m>;LxSkH7utFTadC<{o#A1H8+{ zvp@e5(<+$x;-G#d^8&nq`uQVxJH{XTBj9QciMI9!gC=#OvAAY)%f3RPk)9^ah-9RO z=ck9!GeZm5(2s&KA9TVKgvhpp;a!4I7!N;sfjmuGm?V@$GcZ9y=S2<4%_3)KkikYy z&miNb8}nXFdZD2d0S9@M&9UV8^x#ZZBu9{;ER)!_RBe~1%H=5vDLg@7=#ws&Q;RlO zc0!*Sl5XX!((9jHtyWZ(<(F3REcl1l`JngWf%9uegU%8+(c1!NFFR&0O3f;O_0D(fPNz_FR}olF|}12 z;dnkW?6ZSUQ*-)(YVahyxId%=Y<#%Uw?awwF^#-`-bV z-%Ib5KfI{P@jvkb4YGr%(w8QNy9bcTg zJ3itWAM=ilxw< zt#914oPP%_Xt7&mT(WpIvCY*V1BhyLI=JX_&(l4 z)Z6|_`{$pbS@&-^r$BlI=F|Z1YAk2oC&Lf?_yueUZ*G4qgZJ5gA@^z5#1rVV;d!s$ zTvBgT*Bm`?UcxJ9QsEScA#}bm1TT^4=CDs~tRzk!hR)-M`Y&RJzX0GHdfRip*k| z^iiVo6NA#zgFztS(87iEIC*+FBPlEwTaTSvK7()pvT&e;M&H`^Xd*R?o)yl@h^8Gm zbjFV6*Zqn}zQmeoxl?vc&f#=u&$h!w!qS|Wy!_~VIy|@|IhQ&XX zlFAysrCMOCSGHIrwPtzc`l>Bg&)l+)OnX7+oo)#sOLsfDGfB55>37RQ#vvnjzKnS*T=0SM!Bo4O_^Z*2}Q zmMKYtY@m=4mMc#Y6laJq(3Ylflo^8J9H}Hru*d6q0@b1uHj)93U7nlq|;i6;(5^CGh`ngvhQx$Wzt&DonOW; zAPmjM&hF6;a6CE(k%gC0?4L__bPWv-kAg}0G5-=e8~=shfX2>B+C@A3&woL(!w+YF z2~Bjt_yqX**Z*fZh$h#cVLt(H0La++1_BTU%$JL8yoPN1hkwp3yz2mGqkSX*-Upa7 zgPY+eS^1MMT)B~U0baNrjXrud7D%{{Iwl@JuHhAN0(>A2h@6W=ZVL6dV0DXLqpU3172ufbl&ML zrR(G=FbZT7DL73g%aCCdhAO&TVmz_&n1QA-(RH$P;h6(x&KW~j{t6*iW&T2bHm zU~p{6+tV?zt!W=f)TUg$fvT$(*{&SAY9GcSk7sORdUAZauYK&Z&Bt{-gIQ>{2`X*; z%5s+Rz`CP7UyZr#FYR`4r7-(_MS$1wd=d%NvFLOx4)ofupSgu5u@pi*6t#tAvU2g` zHmlTHtF60uU-#5Yx9^2}`V~^J$GQ0U zcGsS^L$&HAn4p=t#s-18QDAKnS67Oy+v@k-xb%2pXxf9dvU7giF>QCu4)ji3ICb4p zQl;f0L2K(o<_4*)N@Uzowdu=amu`P{(ZVk)#myt7v^=NCz)%_J@N^RtWl7YT(!7wg zoS^iKpcKeir;-wAAyiq4M2x**7*>R7^zd9k3>poFAdV?aU@0>AqC}P?l`qeb2vhiV z@)`@@1T7#*9;{jqZqT-Bpa#z`hT7z0zvE=vQ8lkjtG4uyKrPVGiH~}ou1KzdT3yG$ zWY5qf@VldVr@5?h6~D0eg3rh@guBoV53e@DD50@M>KPdM_PakUx3Pg$FI-1I-t`k$ zUQNf?90BRXM0y#&#MM$@sP)q?NWKJwiJk8Xet%yx`}1-D%K`lU^z(my`sqI(KK%BV zzx{%RAVyEv4H2;Qv#Ky^Uha7x58)W$(Gw_768L@cY%G9ZRLeka0KAX80pSUNx4mbw zr_X-#;saB0O|`Z4#`OnUsX@c7D5953sp^6_KCZAKP!>ed%ErT6{C9I%0PrkEeOKmVx?N6e|$L35wDS3#mnW8unIj%JtL|ZN7F#{mzSrEDYCPumUO;mHbL8 z&#KB(Z?E0=lIPHEp=Xn3<#(1mw5Gz%ko1n}|D5S)SQbXzKVR=}>!ukjLBn`IB z$iEq3tkg)__D%ck_24 z$r`FfHMOGJI#E@f*t))?{?w*pqfaOB#|HN8?)eGl4DdTTLXEN4g6|Bv{ zo*i~hS>#lH91DB^HLVmC6zI^b(A)xY7Be&#wOMX(79%20l+0nr78FF~3sVG&OgX%g z3p1oeISP5c^u(qkR#8PMyR^nwKi==`z16GcmCFSs*S~lG{Eqj#v?85KtcGDq$B+Y~ z>5*ak?zTNfwHf&B>YD_35it4kLwK~a8?HD1)d&N>U46p~i_f8|vwFnp!iep z;!9isqs;b07`xzKe*W=S#4>(=M$Zev20^dF`dVI zA3y%~?e~8l8l4L0Y%F6IOI|;g@g*`Zkc;Gt0C)p|{JV-@WL_XQ5YKw-{e8~MCvH@# z>Kf}dKD^g%E2-3T4dra3fn_S9mV$kexrPc6Q4lA<9L8!M3W{J*B#^P=%gPMNpb%Q4 znb~lg4Z@3TMg$X=1^9buDy}=X^YqZ;LC2_f6q++Q0l>|>KX3~$0;b>S%+*Rc~y0ydJEIE-MaJI$p@2zb0Ak> z-2<=?PuDA-_v<;&cfF52SI%^n%A4~N#GC|aK^TVyeV7nR!kTO>ucMKF*U(ee}4Fu0c^6f*owvocAT-lyk=XXinpc1I%jq~nzy zY}gNlJta+kc=vIzJJy*uDS4`<`i*0wZpW~vwW6(rr{1>pK=+6fP4W1sdwaw7GL;ct zmOTRw0=#`lMzC`Qgoz6#qLA*wQfUZ*{EKHt_n^b+`OBaGN}Tlj7fJrAcsT`sieLY0 z0>Z1;g`X~!0-fwK;cBJx{r|!*P>h9ZNqw)fhftwcw!W3bP4YVWz~(uTI?9UV{l*4sAV3{xDgczzry1>nWH2Lzinu-kx|A~`yo92P|i%M40kuFWk<5LQ<6guOGQ!4MAjP28)bSJ5B??!bmRkhxsvlP6StxQb^!8QvoA; zZB~&XR|8XE_-U3?HC9^L=CZbdXQO@Hj#CG&8ih79+oGo%%Q+RtcbyxBrt6>wMQL}( z#FmCVCSj$GYpLN|n81ET zN?5m}`oR6m?bEIoi}Ua2=DwMpemgVs_3Z3>#LV3LsoAeT4IhztUweEnXXoCH47snK z{-RmiXyICIY-@wCvQ1vqB&*t_ZQEJ9Z_mafonQ6O`d&>F@zU!>YmC(ut{SIrUb)k3 zXfbm2H6m-Zz+5Z0))!SHmyP#N+CeHAbna-`r=S)>p|^sjs}tge!nC1$b6aVfnp#wr zS7c&9^OLKHWvWv|%uoulYEB4d@~Qbzxk9?6r(?ilpPqIv_$zNt83$Lt$iCl~w5Zc%PnTmM& zo8MLZu4Z1m_yt**$iD=BKYaM#A3yx>pa1$R%BQYg2k;Bn0>XI0g@k}Df!vR6FETH{ z`@|oC{7baGJ@#jPj*d@au+MpT%Q58Nt?Li=c8(t3ei9lE#SG2Sb*EstuFfqHrO7xc z3d&kW961#tsD8Vv5E6+D+7$i^5=IPpZEje0g;2j|-QJs*U@6y+lW+(Z4-C3+`2z5Q zGmPXL0PiSRh#>Dx&N#-W_crf=y*qC$vmg}XuY6t%zc8h+D7jFX2u~20o+u5VNo1-C z^TC|bmhzT?XJhSO4OVGdwM?UhVYRSqn8sW_h4JYul$QIu9NStCmP;#jETe^EL+RKc zuWr@1;#SB9%=(WDCY>+Fk#HT@jlP7|`t9q_w$|-0#qw8JW#d;>3+t-{wWvH>wd*?X zkNWIyX1wox{^cx?OJu-VB8WP6>h09@JA{|m{=9Izu%=n^V#nGyb8gocv?yU_2rH3H zizZPc$rxF~po9wda9SvnNmwjVh?x6kX8xP$x%YwOix<8!A^kl5;_l~n@M@y$mD9}l}H zXWaJLj{CipMOCHwrFF6zEW}Mr-Dizpcs|)xvlp%|pi`Qey0T2UBAQj6sVGY1)7MZ$ zNqh_~vw}17697E@(1;s4Y)=2^GaZXR-v(UKj^ZG4GMd(1 zp5Z=!{@qr;T~}lUgD^M5UvdL!aozm^M7!H6oByZka=bDOu%;KH5geq5)9xMgvq~u zz`@baV9-H$9D`*7x&9$Dw!ql%E-!fl$v03rudIrQ{M$8&ZWj>%Z)d*~(KP@?&*h4IFiLkM<8bz^Mo%U*H!pIx$DY^wcD)hAfX+P;KQ_HAoxlit0}7Iy2ty0l4f=>{amua*3P^8?}=MuT__~ZLZv< zXH=K~c6qZ!SZ$S5VV`pUO1o#``IPr9mOH3m0a9RUrF{L`JNLC0b?h{#7q1Dz2C=Nc z>}&DH#V1?p_7&2!Igz}~a4w#d2ySw4K2}c9e1;xK4ml?$IG+~DXCz50ifenHjd|VA zfql?6@cRR~fxzpT*{=a!pqK#i!nf12U!!85o_>XS-HAgN*H>?;EUc`TRkzAOx~N-M z)VQ^5{chX#FOPq*;9Phy{bp|F4L;##=H5=vq0%Nk7BH+H>>S;{Zoh$tPby=h*wP}k zLCO;Ab(j;)dzPGzIhSJ&Gu|>>c4uJzTmcqkowoM+@hh&*iEY-+MHB@jYHb{YF|V{J zj$1)d8gq-;YxDT=Y(WB-8bZs0KUyLWMuC&AIlE`x>07j;P)8Pa%|CZ9%?)@i@4wKX zs$qkS9hQSNQ!>E;h)O0!r;}kNlRybd%SQ7R&k?2Jh?`$REtFA3r*h2nEztf9pZ6Uq%z_z0o_g=Da%qm!xz}`AbDM?r6h2_&D^E1QX zpoimvV4NEO$>F5nXi``lIU=46(sD#%c!H27ZmQmN@3T!xSt5r2N8#dm)@W?ehH|Kpb?R!IDcIurM zFQ$kjiw+d|7npV9#SH4_S0FdySHTInd9B^1Zx!X2FcPKwgt(! zf6U>JO*GLXJ+2*%JFPNPld`(0u(n!eYgSfotyuTy`V*h$h21mj@+^!DIJVYqH?noL zY*Rh2x?Wy)eCJ8$h}+%k+HKvY$yQj{Wj40Hnq@R*7guB#nQ_sOF6Kj9EL%nk%PolD zBL-vHU;=ii`Y3#qHGzx~tDhzF#{)!ptYc=3YR z^P;XMt^&s%`E%~d%-R05$MLM^W91Cw`U7&KUTiTSIC*gYneOgMXq#6kD~s4=8=7|w zJsCznqNQm|@*y0mmuD3V$MJJPEQphnG zL8<8>*{N%DgpA_NZ3ph$>g?@vKt*bB)HehX#R<%^d=o=1v)IU5OUDE|4-gKaGlKGz z3F6{JIasyDNm3m|Rylf;vhw1QYt>4d21f)rS}nc8qH4Hs^u}0^bEM00bo=Mn>RLDz z^}@>aMXe3W=7TLq$2y!-jwK-1<(LQiXv+0swAXv(%$=?EyDEf63(tr%TLZ_^s#)Kv zUe{*ac;)n6=Q!?aae6?EjDT4*wlg#DiT0MLliz^c2$Z=nw(`EjLD2BXG>jT;`gH|a z(!6+KL7bEkD-ow_#HkuyVlgecke_L6(r&XV>hmMP1Lx+3aOhzIB}FStFD-~Iq{kIf zA_dt{7)VxNoK-BV`0T(1FvO;2-Xhidv+$dl*|!UGZ~NLuj_y2JqpGh_RJSS{>M#!% z+8T?S*6TNJHgCJK|9bn?Zm<1Cpx6#n-LvywqsE?|c|A4ta$?MP{qtLOin@An<@(~r zjhfaLb>sHx?Y(z-u=qTZ-$Ib|Ld3;Ue<_zkP#% zFp+`-_=UvBDtFq@k?~R{^T2AX!!B_abbj<8wh~6 zz1P`+@OQqQeGY)P+aH7do_g~pjofzh=w)2VL5Z}stOa`+Q+Y%0vyn@?E>sJx>HAsLy$iOJ+xXtZJph`@_fQc@-vrh7TrLDa0UysTKd zT&Ug9w&&W_`}pvIA_Sg&U87hQ6u@hPoK7WW(Mh@7&;nJGR2asV$B5MF$}*bHD6rIO znoILk`m915Ru~L}P0{ce?M}z|XInqBDQpI01bRh{z}hIU+Gg4M^hWQL{iO>WV^A3# z3sb;akA44!BW6)GEQVXaIFi&h3aiWVwAF=;$9J6Td5Fp85pzpxGGc}e?%*;Z167HAff}~<`atYF|FsoDwIZbixp)Kd1-E;JJL7e&d ztqV`{V`a1mX@0awmR}0d4134S7UO<-rjDOf$W4@SL0!f%RDvWAw^})}md0IY&wS~2 zqI7@#w97s7Vimsxih*U{bGL8F;afsqJmH?5bkB`D zrW_NVktc(Vnksq>1tU-lQiyp9aXLzdduc{+LhhPWUUFV>u27q&P*9~3j^fe1XUDc2 z)e1_@`pV%^49Q){znEXad=vN$Kp5cl7t+gBbXV^Pj7w#7Zo(TsF}Mbu_PigF9BX6y8O;uFd7I1EV@kUhEkd3 z-1*zs%Z&7Uu!||@nTmzFhj%*%?)6v8DmAP!OG(4&?dM7v8i7S&7nrn`6&W+CSRknz@F^Uqu#4$ZWP4R zvE@%CB~nNkbaIYpEten4Qp8BK=_)-%LmcQaE94nP6}ja$I;=yCyXp>fJRJV=`jaNp zMk6$Q_!cwUjJZ=oanqA8+97G~9G`c9W9$Iq_c>G+&mA~t;-jv%So2LaJT%4iO^W8` zl6A*7oOTV&%=+FDQ)TaKz}7eOH3BbyV$7DoZ}fV=mv{>*>lA-0NlyH)Y#M!!XY2E(Kryt)R^m^XS&U`yPjl})l=Y7}xa56VqLW`7BVg%)? z8n1I{*8Tdm=l$dp_h(JVtHpIPh|DL-#YsinghFPVf|pj39my%6@O1JDrQiAlys27g zZCznQi)LM&s_yf>XUF=S^E2-j7QO{q=jIXL;03^om_xHX`!%M5$M$?~mfNajHOgl~+s|pi?GB7HEUt3|-g=1HJt_81ScC>xO z%+pn}%bSWTt4d6lkDUMF*tN3UqRIkY6{mcMzO^DtV#rb$sd7>3z# z4UWNi3g&SxkZJpe9MJCQ9-QdxC&2sP_#NvW7=7{b^#?+Z<0E(j`4`{~ya;r=t0~z3 z;$x-#;ls!L3y`kj_vfGf6KI5&^Rge~%h2|}?XQ3T6|5VWq^#hV7+VqfcLls3@!K^X z*zls~4S=_^&(+nBfGyWDa{c&q^>x@a5_5^fboJU--Mw}=-(5WPg;i)PVyXxpQJ-gj z^JjXVMae3^d*$hY)`MEMR>Le)Gs>al%#UG9aV#93FOKJ{(&U0zW^PbsUI;Gqv%#YS z9V>&Bfq=4W4i4CZDcm?NH%Y`w=8D0C%@#wkA&r!nLW<8OrLltP+%*M)aE5`R)n{w< zS=x#`y(UXz$kkWll1Nl}Vei#j=O1rx*{|j5jT{564?qaC2+XH5EANh(Py@T(~k*6eCM(ev0oKmE^B%X z&CGr?OU#YmqllfIdEfJuofanpM=LXyZ_qW&Ai1M5_r9I=zIi$O-J;`d|J}jMyRH^z zgMp?N#1+X?)wD2fGK8#2*rewO5`>ae1@x~f#O4<3`tHXAQ||fc*_Zgu=Ydv)AH~4$ z{QNhI^WVD0=TGgwRIRM9B~o_n`r`HIeb$$^T>R|(M89)!?(N+Co7vgdv-59U6SIf5 z9xLbT&3to}xT=LH$XlP?>+*RQro4+?_q%Ik6*b)QTA|)7FS~N~@?ht%rKp-1KC{a< z>RXOA?lok}Z26_-*-~W!(}L537_KB)RKiyuJ9-wZ5`xv~BN$@XH9K7MfhTBVSmQo< z&~bR%(PE~Go{+~&p$X&j7~zzx(Bw5AC!(0B1mVk2QV`}U2|;meoJq!VB*^%Zvis-n z;uMib7hL<|mVL-&D>j$NwGeD4z&qh3V%!71R^PA__ytF+XK)fac%MQTue%1uX6Bdt z`S-u@yHY$8IQ<=dS1N5((L|dJ{1SO~rRNRc_XF~*|4tzQ-em~;OY5IjM$mux+pqX2 z>*%%P^d7MNcvaLn2IK|;`4_QF&-l3Kb^7t^?iz4+54w8>Jw3$J-8bNT_Hdv?XebgI zZr$nV8E}mbPj%etGYc%G9L=>$_i(Ut_tF!is8Y$$ZED^#*gnyS;~;@qO)sk{Y|!SH zmSoC-Txpy@nJ89g!b)3I5JoEqr^(W!ym%fJY8&M2ykKepIfp^cE+A8xLHWE$=oU(F zxXKLA1N9CI!7NfLjhs`kCP$lIsLN0lCn&UOCB|%B1-0DDFzqqze0b`?fyU3kX4Epv zEId=a&{`w59&A1^f-86jkUIx0R$MDwIC`_PxK7I`*X3&(q_xcilcBy^TKn1h6A!LD zbB`@~a4Cn)w=cKqEub*DpP)DQ{z@32?zdjT0~u71ET_La;0{ zH43Uuo>$gdvHj-fj~xB;OH+S%KL5w*sjso6{WK2}*>K^T`Pui~5AB(2`B_oY^cZfH zW#jDZw=;9!P0wPU{LReVw{vsfKA-vKmG8Z$fA-Aos}1T6>{v-wP(d1*noZ2R@+l$U zpHo<|Y<4oYm|JSrRNuIK$Lm{|p2c7pi=?k-h!2YQz%OWH$M;{b7S&bB>uV(q4T|PA z&BnI!jc4~>nsq*Z_57Q~1?;3=qbZ)Bdo$EIif*??QHh+}sA{cOHyz)8VzPH~cINqv zcj?-xo5;v@LQ@Mq`ecUNmjDy2S+^JEsjB(rI+^9p@h?DuwlH+nTqE>z%Bc#>wV*?& z%2jH_+I_o^c#&=0Q22q!07eQ6_KB%yk9v=Pc1B-h$cxKn#^=%_s03{Aj~**@cB%`Jw$s z93!sEBCDpb9Jjzj|1lF)4UucklOfV`B>ky{D5li52%ChYx%{H0%2F+NJIFhePDK=zitdz1Un(>fz|B04kHPXro zhOv?ZE`haLTHUH^zI^1e8xpBdP9B?ibf;(Erla*GO`s?@O6wcN4b6p(fNhPk;qbt$Fd@Y z)L2D&9Ivi=>-6-uv-5wLTlk;3#UJJu|A^=8!uLcaJoj#X_T9Ao`KA3|NYhIMNeapu zxGsVLLdy)J;an@3oSGV(MTw?oMpG%_sQ)iu|tG(gGFGtzW4l2(-z1zK)tp` zVu2F18Rk&@3Td(w8y^*~_~?O?Ue}y^Vyfq9|G}MytU8;FCCiSO$<)T49%iMWK-5=q_0UxAcoSRn2TakniHBOr${Tc zRrMtnHLq|}>*mQpJMdeoDC_B;7@qWvOcMAVnn3>jZ~UT=9#~Gnz%Q_jx_WHV6+k86 zxsqy$#2NtU@~Fyx9sCJ?e}VkY&;KBZ96$d=oE;G>Bs>Xt`Vs2K?@u^N`t|=1>`MPH z;XPn_5ch_D{QmH#pN1!hBqH50Cg91HJ}zy-{S?(7FSLJCH0syyZlN&{V`J{o>kJ_I}UN z)*~hs_AljCCDj);pSH4e<^rt|;)HP3VHlt^SPrc-iVA|>vSdDNu;48#ie_;_^9vJ1 z+Ek@7PAG_CWd)^UiH~_BMqU(hrZiqEj1dT;1*%l6eYMscJ;2)r5--2f1f@s1p^8^! zV42N|`cwNZ_dOePOn`woeeLYsT3wr(3rX9`YJO#{u%4;1`3Po|!3Z zVFIV|Z;@>Suys1IczrcI;QRd4&9WjJGnq?^WHDm+>?j=T$z*9Nl*&Bx-Lm?fO~-Cs z>~xMUElz(oi>?;at=ac;i{H;b{{v!fiKt^y%>ubZ9qSK(7sQFVnRicak7P%Qa^nlL zlZ3mrp9FsAfM0-j>5u;SVPWZimY)A{ap@04$?bk|V$-QQalK7gYvfh36T~^;49MuE zka0#04S{UpXfc>VjieVO3m7>Pxlms$GYRum0a?f@fyE}UG?lhNvgYy4?rGPeZ|b=Z z1@pq&`Ngjn7rq{RGGP^0nG4G6xK_;Z8dX(?wj7-D%+JieoI#`NSp;v#!Zp_kYav=& zTh!2Tr`tCdTQ|$O(&TWsHbkbbiAyBMB*K50@PCZKNm>dy4joelDJg?^CT5b7vdPKW!D%_+ z6k1dsCxOL@W$@xz{5S?Xl1dFqOe004kRp;u;c=vJYHX%3SJb4bR?tLNz0KY~S*^67 ze(vd?MDiV(oC@UM!7=xz`4=g;dtef<4P;?Fdj=+8ZMKqs{|mo?@|c)Y5t)}rzMtUt z*B`Mo{`=3sFK&2IGk?sm0gwiO{1YyGfmxjD`*+0tEKJ}R-~aKqAO7?+RJd_{0JH|C zRRR1GV`r4jUE_fE(>_Og|MHwUkbj9$GpgkwPxr95dk8_~UnJkY5#P|r)YE%CHcef5 zN!8Pi(cWQ5nRzG2eCsT2CW)ca+&GF|&xoh{L61dhGRQ1-mFtK4CMP-^O(jhRp0Siw zdVI%`^ZQO)1UeH_t)>;P*S6KE8g&eviJ>>-s7q2L$^?!vM`_MgYg6ULaRNmsqa;zN z&nuyY=Oz$G-xyXWGQ;WI2oCtq%9KKAFIP~?Y`F#t75Ud-%{5fy8Li@4qo`_k%dyV( zNq7%+cMP9DdbOsw9#_B>`4tWFCKQcUVRb|Cx}Eh$FCTyC9>opaYYdIOQ-Sl?*KSBl z`Cj+-xlbOwzO{L`f?dMNkmbhkC26IQ#DrPAFkU8%mn$in%Hp<*CmxOtOg$(1%J*P1 zf__ZYt7vZ*zMDnkx%B<~N)UbMDt-ga@9aCI)VZm5=a1b@TEn2kN-`69M-E+HSooiL z#L^!Zp8p9kzxc!Ai$5+t$2Y&5oqcETaqXT|Rjo74^)*%elE%$BGthSoL($U;V9Di z(qvvDs$G=9q~LJUnh4UGNb(xYmNALKdKU+VNu-!$QhX{YK7$P8rXU4l?m-EHW^V>1 z6qaYOv&p1_R~ej23r(l5&EQ4n3SyxrjPp0_HNqmvA$f^8MR|qNY>|W^Zol=&BGwm) zRfPQegcm6|kbjYae}`X`&|L$VWf2f2@QZvsI{D{6{RJx|fBp?Xbvgg~A-s&-Pr!>R znuq|4@~4&gRp7`sP%UF3jQ~gy{(}X~s3Ftwzsmvsq#wTnV_qWv`n%o0sChXB`@!4Z z=Xlod{1m^P11^Lgzd)|9XLzc2*w;Jk1$g^LvB&W~xbYOa+}Pap4mkUv(vQvT*wnt( zy)?cM7Sk8C}nXRFPy6U{Gz zlEc3Gy^x18=IP8dE$DXjT%(>+tf#2Vxuu45MIo`EXQc!$CM$tiG{2ZU(+sGJ4{kj1`0hYom*d{8&fOdKS4belKt`Hfpu+ra#MM^5o~r0mzf}7C(8usDiLW0d0(u zu)A?gOm{r$zi{^Uw)Kabj9WRWMX75z>1%~4(d>i!FDwGQi$5&9`18`szaSQnd7uBV z^x_BP-=(?lMjtyil(aR;8!BYASjSI0UcR3GzVGgMy>7EbRI5x^aiay45PC{*ZX`K1 zJSZhT0_5t{BytKhjG7aQbAbH(Fb)Gu@;I3AvK8qPF$5%qx&~{DQKHw-wG}Ljg<-1~ z)@{_Szw!B?$mb9E&TAHOavDL*{Y<^@8H7qTDP4rrFD5yJeWTK3K%dQmM1}bhoj0C6=m|} zDVUCO#4(KgAlyepCXvFDf}+?lbV(XVk;A(UX=}c&L|Tef?@Ip*2>SvhbfEcN1u`HE zDcS&jyZgrn{48jc(18r=$LYr{@ai{L@$1jU1i%CPUobQftNC~J1~kpxL{(2eLK@-LBmdq$@E zhJF1bzJbxHegeOqJC`5YRF%~gjj-4l7{vsDaHTwd+z3GR*$LjuDX3_$vxvsKKC1!tkwlfyW$ z{bp|F{rnt;$#{OdF#p~BJb_<47Z$$9glc+@=y_-7za^gNeCNJ_)4@o;`{{#$GskXj zU-wzHx~Wo8XAo7Hr43eTQ!%|VEliLVDNTxGo<4PZk!X8=SbX`H7q9>J{MBC~A?*DQPIC zmI+gfQiAis$tmz;fxKP}DLILp91F>1av}_dQlTmkN@s-T3&NPPIH4l5kP*Y6k}0&{ z0(vNy5z5OA%4fu|r1WA5UsGOQbL!{?y|~OoDYj&*4QVQc{H zkt#2Ql{SSBnW@~=Txuu<`}#~mTRS3_9Ey}0P73o=FR=7kUEq>dz#9}n3ITGH$T4Z8 z1k}t~q?Bw@3YC-n#T&w$qh-(BBSI+?oLK(*5wK>ZaHM;sK4?Twc+vm*Ti|8<_F!@~R5&yz#(%T7J-B0WVn17D*8S*#9UqcptVB_$8We+sIS!pv-JWJlom_&mF#; z&PY>Af8e*3AV&>fKX*q#mT@9^m(M?V-Zp~tkmnEkbGZ4^czL=Yi(pT^9BsYbBS})G z#-}C6rJTQb>*ce)Vp)+qQkW9L=2HYWPhLMdskQPN44`136t_77 zjtwqWTeiR`*xEH_O9X6$lQzZDwj`vuGx**d_@cw!Jd3VASbgN;v0HoVPHF@N3`AW= z3*=F$iWqqsNtTzA*Q9HHbP=gPkpDo;3nd-cl3?l240cUiIdMZH$%_q0_IHd3*&Gw< z7#Ho56yg|zKtsAaofXWl%5A!K=FzhU{S%{0V+3Ji9`j)Wt&^{(a4nsFI|clXui(Qm zVmAaT@*>XCL;W+)pA6i;*?Dm1g~H5gU`;{INF%396I2=0>>O4>F1$uRTYf?w0*yJ~H7J|iawL<>bRJYCVy4aT_qz3*TuF$K z8_Jf_#COl$Jz9QP7A{akh$JC=VF+)BvYF{i^;)|P^F|kNJgi;A9pHTz5oQyZW6xB_WcGXa)QsRY@u>J8yUCp~qKWjP@7@;adgm z4@3lghPyYOH&yKuG1H^HNRf`Aq|H&`8zZ6SgJdtzE-KuW%!!p0Dz{%d@o2c4pf?j# ztKkLkB!N((&{)xYiPJLXQLhb?uh0ZBvl{N7fmHd_;j5+Dl{#sGlBZM9vozHF%tUQ= zk~Swt`P@RFSf5(5x8kTEPG#=DiO%+s`}ST$|DBwE{}a5wnPxxF z&HZM^?`zZOTfMA2pOsgLza*o)vtzk!i*^=Oq;)ry%wZVRl@gYuRV(PUPQ!j6KD_kV~fM37$fxa*WwMH7FoBLW1 zH)}*)c>CJ;1g!UWgSWPoE7ZGiY<9A8+hXO47gy`8uwi$!-n0otM7$BPHFkt()Ml;K zS|HcPdM&_fE}WJ(z)f_MmBVJj_IdL*YiA6T{nl;^vGEDD4Tu9hU~@DB&V(-UG?zI1 z>Sk|COmROGw#90l$vpNnyCfF}KAtJ;*F~3d;@PB?GwvZ+a@i z7X6sQFkbLFPd7rov?bm-P?LawR3?|s?KC47;CR_I`lZf?q)RQL6>cKky3_ zBT>aLJ!2kWSy+@mnlI+h0O`NuceVKv7{~pWXu&_J&cD2vDU=vwVTxs@YT$*KJev!= z4qzF!S2#aoC;^<_e)xl)fjzHfPXy#zM$H!dT40OkgVq5Qap8S2On{e2)3ZqVMqhM{ zzU&-6wdahInVyxN`>eGOhv&BLv9_*}{*JL+j#fdIm*mwVq=PU;?45+0qKc}9puRY> z67Jt%-wn4<==u5SvFX%c=8^p;`!KA&)|E+7WyFGV$&zx?9$tNRrunQSJQcp9qJR{p zH{Hhu2FrweY@3yvIgiXg%r=PWNfW_;IE=3$%k?bP&eE15c@ZD6hM`|9~dxkJ}`+9n7q^6rVDp6S7^>FXCC>a`UK5fr~o-eC^GQTCCr_la|iMsOj?IWEQ{ zNy^CDRd>9rb#!bP+8oe>(NZxog1`p?J)-9V!k|3^(W4`a=($iHJ-*+C`Pib zYMxe3O;3%H3Zf+{DgxT_a%g#(F=|b`x`35m%r7e7>TA^Xdn*p!IDW7Fe&2Z4>}2np zVRS{8*5JNA&d(uv+a}VflXrn%gW-e8^xN$0=b!Zn_%#@oUm`bznT_87IV@eNw$5O{ zjO*>R>BG$2C!zr1+4r-CSI@7sYLYXxG;IbYixVPY1PEzf+z7{nV5j)NO)-HEQGs@m zp$?>A$2fl&fjUHl+e2LM8?-(Y{`quoR+1ML>K>8{Da;`Rx6Yt-J}~9pV(sB%<$;Jm zT&o?BIYoFMIpb*LWX_y2H(c~wKo~b2djhA{n_Sj7xvbd&C9nG$SMPPm81=-jI-UgpxLdM%#yh^%3t7NpXy3 zY>r8F1Fp#|4>H4(%<)d*cqVe(DIAYPULaEzgG?xK8ir=Eq7>ic02?2VwcC8wy0CrY z*9c zI6wajzyJF?@wGp`S@uW&V}aza9TtGawuo35S?JJs|I2LnjJ?ty{~v+h@BjVb(;xT^ z1Dsmu8F*TnuVv2sD}F6AXN;POdVy>25N^A`FRIldrN;r-95H#k<)kc0s#WH{Xdims zG1}HW(bhda)H78nFH^)y5%vo3n(;e5)H#X047P_dMjBYAot+~vCcS;+wlYQ`jui9B zscp~udtQz`Jo^~Bo^(=LN)#_smecmI`{t2b9Df$eix##a(A64we^@2BfSu(}sA9vQ z?dA9}Q-ip&s8l%#bVmU>$*%~KFRMzNswmfhZn4iqTi2 zV_*(rw!Abw^%l01@SeST<{s2}#ksXwkzP&D&Y@*zk=5B`O-`~_N7ZTRIoTebxz2eo*+mtBINeWIIv_^l5Z?g-ZiJJdp zG`*djdJQ=kFrJrEn8D83Q+Mjol};_MD9)80?~3VGJjtFEx;DhuI=}_l#~b5Fp6moS zdbATIXhTE*j>k5^L3W{Fy&}97!VpOaS02WLH!O^`<6IL0)(83GI~$`&&SbJ1h2ln` zdQ;;OjN%d(>lhhj9~y~^>Ut1t0)p2E1g#GY-4GmR8yvL}L#ODZt+7J0fx+vAqFJGy#LXBe?31F zE!cwJwxM6~i~B6BFaTaGj}S3=uc+%gXyVIrZTFQ=MJJzp;_dnIdt8j3nnqq!bs_!S%7fWAfU8o3aSG zge0MbQFqrL=(yV{i67TTKET&LJe1&CkiynSl5E3a zatj+_y|m~^wMh@bD6dSnaLD*UmqxE#9RQ6{y+S zfMg~^3x~$+WL*wLn@`c^QM4uOq5@7~L26m4qPAAQ`^c{IH_tzO`KW(tcyWI6wQ2H= zX&T6VZ<={O4cHpr8)rTkXWoOAVVHO;Nht|)V+T9a-8Mx$deo1@vtb6!^z-c87c+i; zGnqaZ3~y#9R$2;o77B{i^3_|@Ore%P{7j{aPmvV zC3K-Ptw@naD5@ z2(^s}w~Gv37ZT$b%kgHxB3l9jlK`HQ1mDgyNw|pb%cjHbaw|DuGl{Y#7N*=>U%D(z zpo|jZ5|kDu#IIS1I=McK6fYXvBN+!>+Ex++W>(ns!;W%OSkmSQ^2SiasW6?Qxh`@1 zt?^=yB%ymE57$_aWFB!C<|J<>sCuaZOo1N_c$Wk+guyI^PZHgq&JJQSy~%=rWPF0= zn;MRo4;s@ik&TF9Z!+CGk>i&XzR}m$+68Cn1m9SZKta%|f59&r9L}iEJBKhSvJ_DK z_ys|#{Bi$%(G8dB@$o6BfWLkHj;*c*s%WqO@v{0y{OHebfBx|m{0*#tzyAR2&%xBM ze_ZXtfH3fjC*kytrfgmTfBy0hs5Kux>4knDb&t^V{!kVDirm$OFR|x+@e{n}fit?W z<^GG|6$(L<`?eocvDIb84Y=pN0Dri5ssmOMea35hFR0?=DRJDZmyuCN;1`Xr=fR+k zp-xMdWv3S)IjgH@0?v)k@AgX*Gtv@dj2Hnlzu+N{b{P+r9hO8&u`5gtril_I?(1+) zgLfA6o{nHdM{WpZdC-V>?oA}RYa$=u^<@fzQsDZlh?ju6tQF`EHy*in;cokb&f6F7 z)RZ)k0ux=<`)q+xo-G2oNFh!XKZp2`%}JqK5}9HADoySA{nvV*jg1dLz>CchX!Ax( zfiT?FH3@0e<@5JW9=Nin?s#=xQx;E`K~qTMC73>CCab_t(6RM68y9d(bD8=)hQ3%( zRwk=xDcXB<2Qd4zr)_d(`pq2fq(*euH^7cz8ui9#cn9##0J#RV*AJ%Ik5h&>V`K9Z zql?j@sS&P!lXc;0gZ~(Nqf&fNp0E6cZxAp{vYdqUM5nWOmlA?$Zq(|_T(IQo} zP!Z0@9~F_rCuw0^aR5W?N0<1~#oozsADYZFS?)y>xRO)7=zJdr&yTK*mnh=JI!yI&80gUiyNCtns%18 zG#54~5=Ai%LBTe@ksi?!p$hSf=H`nhQAl@sfhktkum!@F7HsLiKbA_ZJ^#>OVU ze)%1VNEVR(Z_l42XtQlB_QmG10QT4CzdEwH3*+WX;P)36C1zas&X=$Mgnj|K1Ni6s zs~{=*A?E!tt+HHx3GlWJJ!~6#yo%hHBhOxrJV)nkANh&jv0Y_*GMLJ$vK@rK4MLy$ zrUBs|c&J`|u1->jD3X0UPZGf&uqE%GnI2fI&#F_=RLGOMcJ(2gK)PZ3KRkDA*SQRG zdTNwVKu<%$JKFj{+n5IFa$!80KhxXB&t(mgC2{R_hSzs2(iXNP#Mwr|a1u9PK_FKg zn#%Ks)g&!FIkikxc(mcr*}bP53hOeFUF#d;VTbvQhtGzv0DDp(WV4R3kz3;9e3=}w zQm<*cdgfVw*YxNhakqu^z-)~U$EP{yeJ-E7b7c4FqRdJeP05cJ!}c7hf4E2IfY{H- zF6HFq$=AdErlz_hj&>2Q_OUK@QDFge1OyY!ckTJmNetSU800|l-Vh$|$w>;} zM!JxrHzC#>aS1Uoj`490aWM{YarW^sHZi32u`zZestZ{XCQu+1kt|Xtre!56(_w=T z=|_wtDy{ZM0Aw##IC|Qv`nocLl&P~fzi?S4al`>V0N@vNb-tlpcxZQ^axJAn4*^o#8!WI+* z$Q`&2caQwqf6;|4__eH)@NC65M#d3`1PFr_N#qjZU~E1}qaCkyGHa`LW5{g5Z)e|hH@fZ1aV;lH zN|u)AHxOxh$kXXJjttJ-I`uG{sg);Zlor)@_ZzwfXL^SWL!A@3DLN?ik^`yr+jqev zt-pKxVEsWK$H1*?;av&iJDi-IJ*?aV*Z7343y61!68NU11`EUyLJsan;UZ14@<7Gz z{na~kvTSZVCvc-ru#K1ZS`Tj@gnQccH3qM{W7u3SC`}IG+G4MTu){ZoDQxS(lfn$)#wpjLxNM3Ya;CoZND8 zNsYR8XW^b}C+-h-nv6rQXU5-76Z7Yl$?4@OFd+#R#|mm{@)eG(0IA9Jc4~5Y8nkCz zr3V*!JEpFldwA}|tphvH)RyelXI80G^MsU)XfNhg`*^3dQCn@JQ4~ z<++0LvnTEvG1{63c<~p0nw@*o^=w$n$jhbVmkKJxBt^0}C((mR_27it#f91+#FNAi zN#zCc=^hNK8!c&TGT0y_$GBL#SgJ!Z)q$G4Igz%7Lb8pHbs{APB~@u_8*`eAL}fXg zd`Yx8Jyx2Nq|Cy?JzA`dmuJUHH6&36kc<8sm6}PGE0d)9)SQZp$|EKF_v#v|MEVL* zK@mrzNs=gHxoIT0XS1XsbZH1HBZ8~JKN1B&8DAE{k%q8k5gchmiZqNZ4aFINBM)PX z{i(8G2ELyj!xcrc_+bogD4mArG`~b<2qPtoof^U61=5)wNpK_ga0$=Wl@ZFs{&C2P zyZQ)mF)o;vBlPO|881)U2~y>1!M7q;Nn{6uTURhKB>m&i-{ zSzo^W(^8;heEIqhpb~KY_jXKhvB2f{Wk5~H4Dq$;nU!Za5NS?7 zm8OwpDp4*X2|5vdg%&($9DZpi7M6lc3(DoQ*1;}hWe%IhhGx#~J*%RmbNrdK7|xx$ ztuQqW+ZKVq6ohEo69Y_VtR{ok1i-B>d25`AaKhnmgE;AwbZk+xMEOY(4Bt&)&^ZUL z^^9B>7;765wIMv(K00V!aKy%lWItxEtnBi!+Z~U)hdPG`yT;m|_FX)CXHV0S>cWO% zWw9bfla`zzi9s(=s>o^$Ia5c=$z$f{(em`v+-$PCj9b_suimX{I#zP%))81^_jElT z8hkl5KDY=6xrxzb6bM%n#1@#40ZyX5f@(FoJT|n1IF;5X19xsbzi|3iZCP_geodyh zK*Z3fQj0YF!dzZq0l!esFVE+d<)@V9((_gE*{mR`@8%>=2TH(JYD6d#)3YhlM*_c# zzoX_Be_vSozOe9l-tcL=W@ovixgx!>rSgzz_S4M#=egx?D70XVuy7!McDqZ*%&8Ps z)uuNTq*e9zVs-hE0Pp-K;>JC^q8FAG(o6N6%7V0-=JJE58!uAbVFO5KY~{q-Citug z3fd4x*&MF`hde|i3*a%l>BXsK;!r6Qy2Xu2$xey%EoAbhgs6=%0S@85P7z2w7PFQ6 z>JHsFa^-lg2g`Tu%B*OR71T-cs`y%MqEr^ekwtUU<5MM3De@S; zG@O$jo{|>KQiP_cBDt9{{ER4WdL&PdZXPK}4P}d?xB_IXgfpbkTz(Kc#3tCqA+VsZ zrUzbIgA=RO*+<|PN9bSi3xVOY_8-zDp!mg0_<&5C&(B1+wSX7TU%-o|{BL2StKdZo zM*8RPUy1q#@P7RpVPs#v{R4$m!Ecryef#^nxhzaA3yLlMcV_Mlj=nfTTaatk@b*7` zPVkulTT5YEWP$A}c!6BtceQZOMXR-(lN(B!RXjD)wJ>;ZM}|AVYr*e;=|K5@1k;G= ziq_VlPK4PZRcB~sd~p6`)0uRticggtJa`_7KR7}|<2lkZmdn$Mqf+BMTN` z`csPwU+3mO%>%!)9~O)sk5-*4U=&xSR#zzMch;UTPOdDCzrNUXUJ<3By0YRo)1sVc zFD8)c6-hxu>g#%#{2;U?F4B=$mj^i}_&bLA zZ1&;P1TEDqcc3l3^!WUqvq!5BG-q$m=VoTn(-mlyvS)A-<~(@z4B<96+1WP^{NjL2+=4qn$1+z3fnN)RpPKPIJ~oZ>^S3YN z)AE-;emB=o{1Tn_U(MGnA+)q$%l+4a&ELQM{q5V|U%&qK<;$OVeub{#Cu}WW!1Lem z3kt`#e=aP4#Ps+FY|S1TPt4$5#V-L~%eKgTY$h(e=9BZU;01osYH`&C$q;&KC0Er@ zgY)xf8-`Z{Mig3bZ~x5g6L)~$RI=pymB(FuFa2fxbDO@RzgO0sJ-$sq(Qq+lC=BC^5SGr-#0 z2j*96{R7tcdJ^{U{!vb0!cc0FFb~?*i$|}YK6K@9%jp_@gFd5#L-+=8I5twiw_^(Z0&0s9D&_a-((M* zY@ZK32S5DAlcNVOY%gr8E!>fxUY3)Zr%TbwC>fABrzfeU2^mUiwu%X~>a?7q0zqYN zN?DPxx`11z=M)w3OA9!~g}m}SP6<9K6;@UXD;iae4Z2;;`rTI#-8|cHNgAV}g{FtN zusm$zqJ4O*s$E6M5mO8A*zaM0rM1nwFz2;=%_k zt3|&vovw~^ql9gU2(k$$IWy>fyja(maOZGedoLfy0CG4}uPHyX|7_3G&c3!j=z^bI zeRQ;DZ+&)UnY2*LQRmWC+IU$;1V1ZIiUyq#El7*x%Q4`BHVUjf?_^lgF+-?=7#4UJ znOsGVTw7CIy>I7%Ti5PAd)(Ikw4<}Nd!Tc0sC#&{e{9@bBYmSoeWU%o!vnn|13e=H z{o{iJqa*!e-S>N8OYX5bSgR`oW`SSgiGwt105hD?m%XFd1ru~EhziZRLP&!x_=QIY z&d(DQMq>VK#xG!tv$W+nZH6%L`)|$Ha*DRxf6e{(@87>dj`SA+TQhj^j#`B+UV!CQ zI9pH*E+ytypkQ?%e7SXS6~e$T{z!ac?!Ql32hpH0Wd61Ju0j~dwUh3F4OeLj-s+(M4>>uyJB|t~9+ICJ%_DId}RN zayjqbXwA&Agj< zIme4o`fa2HIWnBrgj2)hVtx)zyhdztSN>R7`4ct2{0Hv8ujaq)Ej?D1-dH7X$Q75p zd@+Ll3-B(z`i>{ozO$wer}kXW7gg-e-B*{{^zy;Lg1Pf9E`7nvb;sVc11UaElX! zrD&PzJXRL`?K2W2IjOomHTxc3etK@##dNwRY8y4u32JT{DA2eU2it~(ZjKJv6z03p zpX3wCr3rS_?s{)7?(g-xaMyc{;XF4G`f!Ztyhm|lb_ zL|Cc{_B-KRRWwf##!kbLJAy5U;&37u%rGh^n#m@y*wIW@6eA^;nZ}lA)3y5SqVoKT zg3SD~oZ{{J%Eroumik@08+Pxi*_9*Ig>Q=RatcvviePuy4Wod8$*#dE6oA~-KY=c6 zp>qJj7HL0p4LC(Z9sIlvBDDk{teObk?rStxrLjM5os(yjMFDB1F@4p0W&42}p zE%hsME#S3$$MQ9N0tn+ej9c@&kKZvbLVgNhYbhWXH)1@WfMjI`vSqf6IrD!sUkh?^ zat3(Kdm=dWPBoS^D>#a#+CAMp_{BvuWi;QOAyY3>DLW>!*jb9?^djB%PILe59X8@$ z(eRM*_OTmTNI-~4rAM&H5p>_pfo|)-;c?nvWxvkKW}Vgg^#rrd*1^iw%wQ+NtswmL zfI*h^HbiLztnmw68<5}>&+=v|W5BL~l!-?Ppe5p0v>$~V$`Hi}Br)RDPyuv^fNgq& z5D`4GQ0ytB5|TWZT~N#`D`Xec$;zr_Wx3)KwJ=}GRwwvVIT2h@f>;!rnogD=c2+}G zU}3GLDd7?$rzm+bgo0Q@%`W5>7BULT`Q^FvysQMZo}O3CDM0C&dBwcqGD%gnx@BkS zk&F9oT-<;2&Y7pZPbY`lO}$S>=Ejy6jc?~bXqAqtjOW{>nGg3) zw!#`K&W9i2%nGnijL^{O591v_ytwt)8s ze&>FJkSa$~StO|}5ERztHqK7JSpdKnep_7nY?^pelha%(t}2z)7o^qi+i_-L5y<_B zVfBpZ)su^lkUdewDXU}^=f-7nw$c(e#`~`gb6XP%x6D`<8pl6{>Yl`anPgnLE&-xK zn1doiJZ744xZ0pn}Yo8yuIvw zq61^~xus`LUKqeFbYj*pVVW7AnH@JxbdL-}i+bzX<)arb?K{0wS5?l>E}$v2IA$kE z)KP*=k|;AmkVO(}V#KPbRAqFkiX>7;V{gS0BO)!7A&nF8qf^)+G+sDe6wVZdF?kVm z9*N10qOl`r{BU;SHj1}Xh*Dk9Ltu8IduaLxeu+~w@H=LKFmaatDJ`_L;Ag<^%U+{t z;q&KjzyIf*ml$FFUz@MxL(47Lf=x?%1%7`4?>{W>me%~^T>Y;v5cvK0`LE%Lc}$N9 zz?wTRz-y*Q4&lX8z%Magen||RSC7qjS?#=*B`=r)7v!R4+P)Ut+n|JKokaii!Q*Gq0B7BYNL?7)V#va+$Z zUTdbs+M^32Q*tXjx~-gmUzpl~b_IH^&pNL#yAVS3?aRRbi;~?asUduRuz=+QY7kfG z#}z_#2xlH&1_N28+Y%WbNtkyDg4i4%2GR*rLipu^n@D_5(xm;E@reU*7U(t4#(0`ZzSj5Zx*ZxOCbs3HIs$Er@ zrZY!x5JN3<^96nvSH77{pAIx%C{;E!YFe7IcicbwXnFo4X3DdV?CDKI`6}$vVhCp@s_$6rMhr7q`-*~aBa(^~U1JVU` zb8M1ROwtw-c{8#8i`W$91p}*%o}L@s$kF6HUBS((w?>CXCnt=PlcwqEx$%ja=}FVV z)ahM1U9w#IvG3aqW)XP#e8TJVdf`5--kQ#9~vVMLp+ z!)A4`_W|Fs;OEy%@_crl-=KY#hp(=q|uuNXnYB+3&%`|{7}**9&Sqn4fvF_8tcMCZkO8=);C$_(EB2YvxwRDZvrsc45J zQM$k7a8K_TF1elkQyr**DWc)_j_-r95;Y?_h;rcI=_}XnUbuLBSIe;sxh}*r*kcX& z>YJe;vnI^Pe)g7-BYydM8lzTdrnGwz!#7D`d&_;y4yzEpANJ=?t4Zgn?KpV`|PkC#=OuXx$hdfJ zOr!>+(McMaSU)}U9@k#LcKOv`%dh`__2wV%mi~Nt=4rj6v0T*&e)sJ1*99Q= z&G*Gu0P^RN-i1=tjvCFbI^C|_l?Rs$?-u7iEX{vfn)~?Tc3*+0vOK+^LfNpp=GZ*3 z3x11QG`&B+=W3C#vPN28FRQMQ7Tr60duGTm^>kDbE{k(a4&0dNYZD)ALyq1^iL{SR z4VI`8855Dlc4ef8NLA4p5C~_%K?}ZN)J!Q^ETX1X6jh!*dwFzZa(c)(@^tX-{+kW* z3Q0&x{N~6QCsMq7Qi3Zv!6^nAD5NdnfsVfJ_FKb!LK(@d>YB#WXD_uPqjbVJZCIF| zT$mc4Gfd1+kC|qt7Urjy=BF1Irx)hO=Z!-%^P_Vn+|Hi&bUkWsyVG{-^zCcMZ(Kfn ztTJGSi`d>XIz#e!}Ult^Y+w-_pw4ub;pE1T1>4Wng6?LjPDB0lya5{u_jU|Kkge z&Hu-!>iZY7c>i}Ip8KnLv}K-d0ki-0{mXy-{^g(FzoPzuEAYzeuh`E5qy&V27B0NM z*01cHo+0Ps~-zBER4pxyGQmn9HsfQ0-ZuO z*>2hF;N)n($##vctu<-`bYvT>)gQ-(8bt;BVMb~Dr^VE!dd9pT* zuF>%Fab?ct=IRB-I%Yu@Jr{hfd|pYRu&h{8St!P4wpc4D62@o7xu;;>%WzMjxTP?| zRH^iQbw)XMJ(lK+{=2;L$E#Pre^~r>x%o;%MsumGp(1A&L{D?ezc0W2Yw7JDORs-l zS^9eI=z}szeYv7ZudeCun0mML_0{5Ui>7z;<8Pbu4%VgbYEbQLDBJ_C$UIma^X~=+ zrmq~jnN7F6;pN*x0SqD0}db z**dbOAR#v`AT8Ag_ms4pL~U+jRsj`r097U>O+}N-nWAik_S*Sd1D)`$U0#}4nE^fK z#qg2l6IyYBI7Y_a#(?}2`o1`qsCef{B$x7#0jubJJ6%iSgN~$$2>JO-{~FPR>qD&B7-W4%K60b8y?6o?JvtP0US< z;hQEbeMZKohexKT`==|@3&T9aVKdS@JPq*nA{Q0lwHQqkPjsSR`mfnt$8rURA4OYd z|H|w4#QchYEzwxb`2E3xwzS>V=da+kd>Qb>W%lP(>c^_+_piXOMe2(^FEN@nH|2i< zy#Fffi@*Hi!^gkitPAzfQ!|8D&&)qM?~ndVEPO2m*n;obipdqBO(51r0B>t>uJwf42!)Jq{Lyut z&(^h|Q#wQH;!LQ3A$WoO+HPga4XNyb$+q-Ver9& zq z$TU#;aPo7gxr!*2Ce$@EXEfiH_kS(F`*Y>> z_oeCg`-%?KE1T+bb{^h&{>}2Y_sib^;gy+>_s+biOlz)B+uf4A@8rHq%S*q_Eqq*< z`&?hN`$XmGdijoWX>EbL^5*5IGt+O|9uDgG1@IRtVV73$s%50?kj=Dc500N>T*#Jq znkPHig~oMfrv*s0Q5tP*mL^V}L(K*`t&pWF0!xjm$z^0JscGqCF*lqgOcd;C*xUNF zV{mZNXjq&&H!E<(aYzCjB z`bVexN2mHm2yBiHOy>&JA>N_aZ$9c9HTI3p^o|(2hYf^Fyt&YVSMR^(D=^`XMc}ui zAJx%4@b29w?2mqecXi-QP@th7{1v;u$7Xm@}`QnJw2|3q8_I*jVknZ9S7OdL~=( z?44={L()8C#-10kl2v(iq-`-Fn}fF6xR}-1z|IyR%XgiJ*Lr*yWNYoZ!OD3Jkr@hC zPhup6^RUZWCofxfxcCOT1bf)|g*kyCA0A~FO4=9}wlOf)H7XVo?5Gq$3=baBB)bU8 z=7eNta=b%yt2?+obMN+?eRr>P zfRC~8>UW%+=a;{{TKfIbg|F6kp!%+MC~;MiQj>B`0r- zBW((UQYjW`?;FFBoaJrf>1*eU^0f8XYUAu;v(YQ>5cQZqTR!s9bB*9e$qc~>K`)! zzdgeSbm5=)#W9kwi?>{Xi7B)hzku+I&Vio(kx!q#{s(@|ShmcsEXV18t&mm+(H1P5 z30Jt){%FCL*)joJGndl*{Bh?6%t7`bPR@iE$A63?z1b+JsSn_tls$zJiyr3?~G1OtZjl(w}MN}uK z_(6PLh=3QxFU%-T2xGc$2#R%~L~bNfuwB;z&JO784p#OXt!#0jwzERwFfr3M2er6C zmhNlq9|(??T~rKQakfyBof8xBbWLXZ^QrDkwmUP$la=bnbO0kVw7hj>qRly?9dEpf=)#%q=hNu%nA{+ zV0*=ZrIkMx(Rp8)YZ=GmZx60?vRrEhOveSf?31UT!k32$vJ(_~c8-pksYz61QB{Tf{5?f`iqlK;Q?hfDl?C)H$Q-hhGG%e1G`d7Y z7s>?bx!L;Lw;xYV%@IJJU6?g3E}53z&%Ie3o$G(n_vF&!Lp6t#EF~j|5xUVY!p?_e z=O48(D12j3#KxdFr$`8aqwRyk?7aMJw|Uxmcy9CtqCFfuo!|{(v&GrYY3s%<-p-zG z4qH84wz)fP-R7{xX}yE}8e7LTPBv>cUb=Q4;65B{{n>~u??3*y+J%3$)4?|}Mh1kzzrqQb*dKw#@%!KSWVO(s z(SN^u1E~X_{|%ZJK#dPU(853a`RhMkzyF4C8Dw!{k%R(@fmwjpQiPHSlV|WGSC7y? z@e2t5ir@YrLrvw*U>CxQ8RjH}nWwcE^xf&nqSCC=eJzLXTz~kowWsIBU{mQHd9qSX zR?3lOA1BX|6g|1uIoxOH@0~zAw4u**dFOc@RjrJbiK0ZQNs`NF@AULc4h$HK!={(l zUK9(8vl6vRk~lSnb71Fz!2#r08Sb6Dk8lvMfZ$iD?DE!9Lxg~0+* zf-K6DvI$H7O$l+19a$JyPSTiqBA!RmvD8KR7j$s#8&QX@vDnrVIf5>YMg99Br=L*IcoCN9CTzvK@_8yUrcIcJcI``?ot@whr}mO?0&n-@f)- zEvb|wRdS>91fd#sfK){*P*U?*;Ywb7USgD@X8V!X@BV)E_OF#Ue-h7E-(N3$JJo!- zUVE^m=*aH6Q^-Gk_4@nUcYnQp^T(T&KTbAZsm<8ckbR)O=H zRz>E{mfRzis+NPzXF<)HH@?4l`bmkTs#emtTYIot*K+ObZPUcU#S=GkghhH@SqZHc#&FXrSKp59=z+Q+axsOjOb%I6^r1)^XOp0N~0 z&($WYG;Ca@a_*hI@$~ea9hw?ITbB%;j8aF-$fGOs8A=U9Axsivq$>98IygFJm^LoV z&MuiuOEbphx!KqAbFY`?iCQ+Sv|fFjOPA*)i|K(BK|GHi!=d|9VjaR0Hb%tSA)hfU z${{q|Ap`-VFb{`)N2F~)sEr?B9=g#tXoFYKdN@_O`K^cL7k-)B*jsN}w{GLjyU+T^ zW(US+0b%rC+<$-eUt+2Bf8rMq27bpT3>ZFxKMDPyWpecszr;b>Qmf$o^~LfdU=U*{ z_~8Jg#Hg7-CD2NcqJd3wnMsvj|NiakUnu+(T^RG{Kg<~a{OzCbKmR#pTJG!_YwH-s zW(TIPFJ2BIofEJ%gBSQ61AbAK5j1i0H8Oh4i3*z_5SENs>og!q#Y5G{-xH zM{Wp;+8kPyUHa(Glg`c|C@Z1t=S7dU`KE&OX^1ZrXHQRpF>sanL25l6v5&L%6DZXh`@todMAWC2e@x=39#`D zUhfS*@Xb~m0c7-LbZ4L#_Ajp19=>aQg4P9wZ3qj3Vx4e%2#9 zabWmOqNZeF45ek{=RhsUD$HRP;6eyAP-dM z)M8zVK8sTTI;EDcl_sUr!leOjsr1-tc6f2JhdhI<&*g8=7u71+l_F{>i=u0&JGuP& z4{U`1UIM?be_x*Yt)=uxL&=Hyvg5mVoPm(x-TS{$uU>th8GTnMsxA{Z?=CvkRCNq1 zs^wST-mH9oe7&myV=L|cTFsskbzSF+k!91z+oztCi0f;V`)kyDYIApAJaK2BV-n^< z8hTEtsH!BjvWQ=<7gcC@IvDF^CS~jS#fWA|OVE(L!3_)D1P4niuV}~EWEYCakEM$N$Q+rwU(~VWUAy0QDtuF(;JUFZgm{5Jy|X<)u&`*nOi_t6*4k& zsjAF)nLI(1O5rI*s`|=?8&~fR4oogCyf@9ho;EHUOptyo&W)PRwH&^8{9@;m_Jx`G zrJ1EkBsDziJ=t=qCbwQE)vLK#yf{&uZ(_7(T(k!%YEuyYLr2&L2Cm=cziw;bTGs$; z*KJmtwh%WsTi5k&?ykO2>!b5p@QcIqulHYqh-KC?{Jj4XDj`2WQ6HCl2H^<;AC|<7NCfL2dQUp)tec zi0N$0c^xwgxwM?Pl!JSYPjna$6zs{PW-F5vsubnDlQ;G3%-jTpB$B(Uw51}WoKTbp za^oB#h`6*huG`jZb%ep1)s~Hfq2(4wYgcD$4|jqe5(=Rl(`)T2HHkUd)cjml5l)+Wnm&hGkk2nK=9g7Vs`IG%dUja} zuc}l~T_)UKF513bSY6I3t4OWN=M>4~G!%ca|2BSfXkLt~is_q~%dO2#tNjux810&CVi38r@)#O~py`;ZOqv|?tH#QfXZK!C56w>XOx-+otun1JpQX|> zGxL)*x!{42Gcx0)qA)fmj4GxJb2AH$95~g}H8N#fn3|a%8=W*v&CVDX471C|*_D~O zSH?L!R}iT=zwmy3{@sG<_43T?xyePtm}$6Ybnr!A$NjdaS06k$fBn(v>uIrke`_~4 zD`))Y_TTJF_KZu6VIW`Ff?oo{m}33B0u!WY^xr;6VhJwvDumm*hdO!&mzG{*_-xiM zSXwaAg?}Aet-{sX-3M*I`M7ODoG#LFt->c`~SqA)V+6yQ*C_V9HYiCb1sGt@Ia`f}tz)t+QO za->seuw#g)y$>sif9Lk|p5Doh&XJy;i9uwk4;V*U$97~j`w$)sG*&93GyY7&a~p%^fQ{fZm!;PU9vBs>+)n0G#SF z?$__kqi3p<(o*8Nmrvg6xYkuhoVS%~nquGfJx5CS>nLh?#%cuGmXf_`QIb4LR(hy3 z#vVrhwu^=p(L9Ks&f*{jmB|j2m=J^ z(HZG6nUa`Hd6ZHXDwl@IGvYOpSfz-hl;D63=M83IK}wlkSXCn4-mKf#lyk5?d*62T z&Ruzji$#@{vg#UHZH;hywV*09AvYx`E!kflJ+PCKl##XOi|M?pI_syU0U;WX3qi=WK@%^P2>k1D&dC>Rj4RLsWi{+8=_rtZ9 zs%ZF`NiK1<8Stq9Bt9;u2wYG7wo=q{yy%!-Os11GWRrRA8XD%QI~)8 z+4Z5TM;?`=*HxhECKRC}!*O$jZXR%n~?s#X!^`RZ-;%s#KmV79|POdFj>VwKuQd zZ3P!lR;Fi`jm9OSOiL4n`AOrv!C;yk!|Hjg zF~8D(g9j8b&TF@FD7@PzZiu3|qLehmr45Xk0Nz0qF2W;5oS%vPubENV(MQmY{)OL8 zBBr6MZ{*F}59aeT!Fe{HpNX**Og2_wyZW+bBN_fdS)yS*<@Y zGB-Q4aPP>SYJpyppb(Lz3^Kp6xUsc$aA<4}VXwxq`R=$}Du z6zixpVd2&xxZ=@VX-QiWDNd9GCvvhYjp@x7g~*gq%8VGLA|W$_nv=~b%4Qd4F$?n8 zkOY=y(em>-r8;)8j)(bkb!kRZb>_~p^y;hoZ{0d{|Ju$Q`7{i{)SL(YL^V*>U6gp~t!05{M8hl{>1_8_QBF0bYGdaTYDNGQCMlFVfOV zN=1!1oQf<~ab{9}T1*x{EG=+jbbv#c&)UEU+h|EZsxD3`_UB4NMCy2Dc4DSFUI7AI zA+NAbU0bQB%%y8`lQnvV4vq&>vRsrbP8VeCX*tyXq-$YxZmxT#`})g!M{i;HoXb$@ z=t?a$BRf%nsh2h>T}hUR;`u2gIyIUmWJ&Y1Wk-*mdjM0Lfw4*B!nA1#jo4sXG0wi4 zHm)G>Wqf*R#JD^%vt*cE>h0)FrSW{%djxFo-DdAmlvh5|H_>|YxtN@)O4AOZQ%}qd zP0S7v5T3E%m!MOELW%Qp|HMnkk<7l7Xu*~m7@7R|;kPfu<(Cj2tsbHOH~g-`*75=t z^eQCLf(hB6MaV#C83-+s8O8sGU(5H=c?s}h9ZYPBLFD-B-N$d(k-=Qb#^( zag12b&w6(KMYW(IL&DIkQ2D)h#WfP+C|aEXjzGXF#a#mW-{ggrb6(+i3gj zzVhQ~duX__lN#giimk_rN(98WIGmBIDl zvI7u@Dv^;jYIKr?M9(cLpcj;}ON*JsdRDQXU_?}8GmA4h`gDd)&dg?o3n?Dl zL_cXvkhHn*oRE~;QglIVQ`R484i?hFz%&)B&~x4%SOlfy05B<0`= zUz65=%BJRWgW%k#%%DO_*_57`$MBahF>sE~%%tk6{=6v1IAk40+b8h7nAtH>eR7s2 zIs<3vjA*$g0c)eoJa(>@n_H==xUuKbj?B94($WH!E+a~wMN#5{BcrA9l0>=cf`_-C z%uFvW7+)_iJPoVp%ydRa> zX+h1)#@6>>p9p1raJqkFHa#`(`q}H34xPJx#0Yf_b+7FH7$`-0hhNq=5$rvMJb4c+ zhzF+-2>&B~TRI1tJ9hC45Z)(J!o$Gu#MZ{P&U|B6bF_B_M%KRig1e8|{rbEA1}M<5 z1A?0@Oq&6}2rBhcXc$EAeEqQf^~26rAXx6#-~9)8uRAcfMt}^nudVH0C#II$J4O)O zz2;t|kp>N5EA-5}^%oxCOC5xDoQ*yF0)&C#4EJC74^^I3gSm;p+;wra!-hvDym;LP z^Esf&boGpm^iI_kJfS(VQ5PL7PFr01{t6o9QBY6=s-@1ZvEJUPfu8A!zWHZWZxr52 zi7Wgav4}P#0Z;uBCe!eXv3DG-T^{7t17AYqCbqzp1Nze5ie@D6$kvn802@ zvS+A-!R@d6-aqN^Bl`%^0-S|61IsCoFIHfLd|Swv_DohKsJ-N%M_{8F5)7YZMPu7= z&=;Lq_8baYP@Mk&EFVD&KiE3kQrA-wTIPojBp8$M*YQxJUCuk3{$Of#+}avQN5{ZD z#?JWy*7F9LZ!6|o@`biSrWGHG5y^(*ZOx*fIG(qO3=0O=jOmL}_+!;-50DK8`Vh1# zyav|6Y)6^5CCB+D)$%&!7F>JpP#GS9VvleiS^~vhp_??frC3`Ku?r zGgBXi`&UxKtCF=fIogW+h~lP)Eia$;XqAa&@%8zEl?kHkP-;S^UuhIC6-d+(+;}Pc z!Xbr6@{;1@8B)(cE?OaSQA)7BWNS9fQAV;A<4rj-&k!XHrAgsxFOAm?GUlwy?SrPM zQ_eU;cgzKQDMp}hmPqXQURSYPOR5~rmm(Z;uF!=mAqa~T@>}k|Ez;!itZ6XdQo2gS z&T#8tb6r?uw6{X&Q(yOdY+`Y8a&cmOVRmA9etdahc=2)Rlf;0OAch|TUMr%=o-VRy z2<+$_TMEmLO0^|Xt-YyMMC=Vm*PCeU9Sp`4V{hhYans!Jg5l9a$1WVbcHxL2-i6fi zu4`<3esFktWN_kDeG}0MFO#WzhbDUmr+bE=1W!P8IMmX@p3mUe-ds-wQ z@VB=2O-{~iZfpU5za3#g@!do5KU{VH3BP*%0t}x4zi<%e9EeKMQ>_rH27=I?ZT)rl zul^b8FQ6FSf7pTZ^^>jygT`Td``4AVPd$B;ZJ-;{wb1bY@IS;axMzUSe!u<#egVA5 z{JCemq5iEs;zxwWo4eT?+j+auk`i;k0=lJhsI6E?SQ#5QRCWwMiZV+TuXN%H zP&Anv4+fqv_+o*hizNj_NigNcT*5F>ES9UNDE~gVK7xJR*y!fu_$Ewur@B|l6Knlw z!E`$g-HML8;pt}R?r_@C^0>XlDYX4Xcg$tH!&x``pV0Ul1iCfw_C<1cUzxi~>ZU-9 zJD?ETz|c$(F?|556p)UW+L81Krj_MUt?Ha^1gKei#FkU+6iSuZ5Ss_>Jh5+ z4iD$2XoS(v@4u@oeD2Fh6H!xHR83=Jrw+UT;jinP-WxQx;Utj-i zb>+*_+}F~~7a5wG@|4DhWp5{j)+Yux8Yz>{wB&?B(7$cIPg zp#aUJIWsg0&D*+HZFO&oqOzm;8ilLS2P;y!@KvsSF`7kj@Ro8E>B%|oTDoB{H8C|m zHMKA^vphGuHaj*y-Ze7#x;ra0P0J5f<0X7Y2FHQHf$rLlhRBh?x)5ytZ@Re}Io-N& z>*%5Hft~w37|0(zuMLSC7?~Y{%kuc#@EB~SW}j3)B4LP1pTPc+sotS!T?-BP9YgTj zqq_ok4z)v-9B@`5#1TSwpG;_}w!_6P8e)%n-$_s@InH1ySAiiK>E_G|9` zgWd&8*EZ``!1}F_j!XG7CUze#oN0O*2x(V@FEc2{`zr8H^tI@30$nP z$z|B!z%3Xl!Qi0*^;dTV1|aK-FI;|y{t3Uk3M0h2YU16yKKnZuhwBamGY^gnlk3VM zp=o@kqPV2C6?BvxgKZsyLtwk{b}(KM?+6w6oUQp8vpW||m6Cv_7w`LeC;NI4kWTbX zzN>BuruYh6_%vq@)|RLVh;Dm7(APgPJTN=hHl3j@6kwE)F^#vUDn%hJulq;a=N_g# z4Iyj62px9H;DOWh@ZG(Pha#*D#JOY?C79tGM)gxUuteaK1`ggP1nMm>t`)=krU%EG zZF|xl54F;Xo1a}XJ`N`5+d6m0oyqB)>B*h>sSo2l3lDQ12T}ul3I1$bF3yk7QhgApBV?tO78g`PFpBf=d1N=5O^b}<_%18+^MtY!6 zR>RW{egC|){Oj7n->Y(76~#PB3oc6x&V_iR)wQpiOTWE;Hkqz{P!L(47j>^J=gC;# zWdor-r!Baq)upa z+|lZ!qnn`z-JC(Zg$Ea3fUv?zB1G||F5nLtEJpE!R%{W9E5rzSo_x9+EiE#o?>$H< zCwdz@v(cu(r0b?;N{_+1-mU zAXk47@ao+rb^cd+{OXG@Kp647((ixww1K-UN`%z$8^9BR>dvqFE*grjZcPlgV+7Oy zZCw|=SE;vw81Ml~aBJHD0%54ay8c-YUft*5+qOZ#Z)^MR@Jio2>ml3*W*TpMu_%Ir zF67+&1U@`t@(!rVVIF|g8D^46E=&vy}0 zoahV!w*va!_Qi&xS3x9yxr>D90A4-R>imZ};e{+aj@MlR-H90`iVSj>C{Zk~IT;MV zskglZwj7+H8;p+8=iFQ`yRp$6xR`_YVR7H_P6Sy}tKI`!M*!uFD+w{>~% z?`Jply_TG3Ys=7Ka=0%k6eLqo= zjGE|Ai3_B}(VSoe7YNxdNj|wyY85cxr$4_vVQfV;BjJp2GAF6fK_qdN$dFVQwaUYXZ_N?dvXodU zAC$t56b_01w61Y(WOf7GI2$_i{E}5zfsZTLAV^ghF%Q~f44vXcWO{FvgZA3=SQE5JQ8*#}0gN_R~!-Tf9OZ zI6SpD2%R(RixK=TPEO3{rR91!c}B)0_Ki&L*WVrpGVUGkf^~4;cze$%9KDthxeM!B zXrNOL4UKPYBAcWAva4^K_kjG*_yx@BJ#zrj`UiLehF7~KRj=aT@1K#2Fv7Od>wjUc zg;-<3wHFy}A;tHf4-BYbk+k)BVq&?YV+0_q$1jxNckc(`6OL|q1dD8-bN|&p@7Lef zuCdmZ0Vj_U&CZ~1p0v1n;;tu}+W7cgPxk~2wfedzM+WC#H}(Vyql9iEwll}ep6n|OdHb?! zxPNw{f1&kBr#~Y=j1_QP+1^f++@zAxu9=QU?}N$6!iZ%@##wr1h2`b=W%6vhr5DDpK*0OZO=us5~I?<5(>&LxI0eFA|7#w$JE@< z)AR7KJv+NOJF~Sg^Qq_ESYB+AmKUa>hl(*uZ*wNeghIUOiM#4bH=_Wx46NEEu1bm- zo#z1CXSs(7-OGaQWaw>oj_78@x_u0D+|tcO;u6c(}K9Vhh@*# zp(3yRt)posJN#j!x-3+d^Q^pW_}yZ0%FDvk_wgD??QF|Rd7PP8S69|vmfZNVpgq&4 zB1v2n>r=*OBnA6ahAB$?7|9A;s2?Gmw4LPWb6%&paMsZ3|0nrs7zC^s*@<( zWl}dO#Dd4Fk_t2h&`Zng1wu21#Fiz+3aKuPC~bUaOZURm;_~>y*!!W%q|!ig0Q@ib zIC1=(xe5n{#F@o#qIlT2d)ax4=;9KP`@QQL9hrr>&D6}=#xATr9?2Rx5L_f)*%;$(*GX3dvD+tyt?{npnn=7irzs92Jixq zb>~eh;&Y`x-_D=^!Y^2Dvb_pMFHa7(jVAcUN?mzednOs>m7q=NdDGSPxIL5}EU{I~k8B^06<5SyH z;Oz$Bo%!^l^pvN?PdKAPcBnHrj*U!UCl4k@1{0&g z*{NalSQROtskU7U3@AZnN?=7n>b<$it&F&PVrIIput+INecv_(_usX(-_}>YG*)!w zh1ZuQKhKD+>;_dJtdnNGR;0hk&^}1f*5-#*^*(>^SXc#$3SC{Ob^-nTkA^l_|DRc+F1EhEW~6yrk(kCSFziLzw|`sTJ8PR?wpKnrE^HDzt63Hj(oLGj6%UEMh;BlGYz2jzTw*V0 z+(w!ZKq5d`=^^ELaEg-(Tk6^(IFT}YzAsv&auSN1gfukQ(~%URjqd9moS9i%URa0u zbIZflJpa@{oY3Eeqjut`fQ{+ElG(HP4iqxV1CMf}c~Jcn!8uuFuV1vKM5J6lbM-q! zk$UtygYSPl{DVTMoamn%Zy5qp4oE&CV5uE_qXWD6T?G8jj4!4}q>-`o{Nk#fq4C}! z-TZlQqIUrBJEp@gh?U?X41+9$#euZYod|wAx&~HPpn2BWwnGfchtF{KDlZ@u#?f#o z22;C_A3++thgRf4*H^>0zQylfYa<;68fq>=gx29#4`JOd=~qB5G}7C9Xx#%cyhqLl z-TUp$FLN`SASQxc66kiD;S-ihNC`&pt6%=^lQ;eXFO0Cjr><>C!Bk<5(3ng1u6M8= zc0>u!_u>6#K(*?6(ODW@;6sq{omn&#)x(O&p-7%SdJQn_?j9W)nC*HqtYL={3~`u~ z=sU-(j4xY8M`l13h7?^$UvMEC z6YWphS^r>-I$=w*AqOh8Bcn^>lbe9wnRzI?zv%G$X;z0{@M4_=JJ$J+)1ZrA{4_WB zVP)ad^3>L7+jMb6VX&8vkB7qBhG}#Tb;RJ>kwYMJyKQvT%=Vm%*$F4Z?@;Fs+1)sX zMO`8}8B$56{6Io@G%Gork(8${4`(ET^-X?kQTx;0XkJRBFgsk4`Q-lF>B$dyDbM_b zWpYNouQUV3D3)O-o1I) z-_|r!o!{9|I$W38S(Drn=2P~#tS={~J}u&5dQ?-0q}rcXq~_%pr}g@CD&CdMRmHz6 zhx2>_W zvEZ?m3|d^JfB z&b0Q%Ie9&Q*$PY#xcQC%8*>6o#+IYiF?bB6{>jUpA!PrnpI-rf^(DBgS2u`8@T;@d z(c!llxDA7&TkAV}`287@jKFsCBd{oS=L0g4hSpk#-<^;8`m6s0M8kXJyNKo8M?{sN zE3f;XyEoju`n$aazY2C2!8&S|Zjc2)-b3;Bww~{Spj&soZmfPD8D4-vR*Me2di?G) zH}q5gPCN3XDu$S3vBds=(DUbL4+ z<@(_vF_TZWB;#y|VZm{4UU$NJsJCZgv}Xon2y!=-X@odzvoL(f}|7{xD-cxLTF-pbKls&?5o<>;f%lltdN7I5gmy^@{rDF9eKf- zLMH*&jv;kmM$Q$f0GU1`?)+WfxC40zL%6#lF>Z?Gb% zJx2W?CFXT>_?tM*ySU(HA6|V$%4nkeL22^ag47opWkz{UL(}7qxykLF&A)AJ14zHD zZF~jfuI>D>0q4WtH$OmrmhO4`x9#=chMOmX$srO)iN|$3AK9A|0!aZN2P2tLr9caJ zk;~j<{$4)e)L;chjf7LnHJ5>^$ufWM5*-h>&1DUYUiAi=O2Fe4T zHN2XbT^XNVo}OJa5?OwfeV=UR;qByAT6Vu58DY&2Pc6ay7u@+mMIjze#OJ_f z9)$X<>z_e2JfJVZ$P^2BSxEgwtf6&wSe*l{oiJmafy*!87tY7+pFjQMfttHNywcCF z_De9l2k`!Nkozw*#-Df39&C}ayZy_~*3Zb<{$(3ENafvK0q=oVH@`yoS37`W-Aj10 zz4di&ZVOP;2G$vS^%o}3`(;{q*h~2ohr%WwR-u9=;188zC1}rJ? z-p=5{ANaJkp|_>Ky|KL@st`1Finy>)!sU-rkvs;l+X11L;0VfkYo6hE28crnxd}tDlbaj*qkqCdss1 zN2vsy_~ z;f$~j=bSGdF+291@!^AprY0UY4IRxc+ZY};y7{9S`XxsgvXDOS4~-Lhef_S!zzPm=WLdc47tY zzpKAbbgtE;zNk)p1xupRyr*L`Kfi98zL)ntH>M#?`=BcAReAFB)QGzDn5JiSbN4C+ zD@*!Q~GQBc3yEZ<%2DuV#kKS=?yr@ouP)+RM#Nyx>GQ1id zpPL(=Q&A;2G`_W?w|5wsU+GWZAOc~SVj=j|Z;|$hl)z_b?-^QJT!qW89={*{5xjt9 zD766Fzs_E_3@F~mFGLo?(KW_M0R^<`>+Jp;K<@VDC**AXytVyVk6iud<~Bm=fN~7N zCEbCWG92U$DOd!oNI=+V8W-EaFlo^~WEV)*M_@bKGl2>f!o;bDIXd+WI6l~cE*qCmKk_Yckt_D)Xr&b+C4qoD^YUBuuf zM|P$pM5PV%j86BBKQ5?KdCH+x<6$@oy1KETp(HF%=)_{87+e=A*M`kB@rId+z>ejb$uOzWq*Ulcw^^p+aLb6xeX?V$ZZ!OjG%Z2-XmudzV!iVp*Oa^ZmoYEd@&G2 zP|KW^LPwb|MhTJ=vK2#34gwz%swKnM%MZ*()SfDd13O+4oh?sSW8?uiUtrDg-GyX# zdS&T7*zK;vf8-Yf$tJN0$`}pnH$1mJ}fymK4)H67~x&A?qU!Xnf4|L8* z9w;=@+n*p?P!C>x6^4d+w_DaV&wAv3i(e?OfL5g7>RM&}Cjw`HFaq9Rws!sjzq?gf zN8#Al9s+)0K)t>5+t&8i&CM_K3){e`gtq@(JFIUB*^5EYCs9?1eFgj?S6v-`_2AvdFM?v|pEtfvwoL&q zPT(jfnQ`Q3xxz_Cyh8!WVE{f*=?Wxpg%YO#Yj=c6Sf1&aZu*S+7qn4fU3ZtcWse3j3Bj*MdN^AlP2FwKB0WzioT{*zMa#jISWx z;77hg?9mP%L_WVed-x3YvLnwFa+JXES<*K=qX#cif2Y@0CzpIZIU+YYoyh7RogEm5 zDfA+U8pgWE7#K2xNbiH;)xX0pvO@Z{{&pemcJ19GAdcAD__#lO){m_|A$g$s^YbUb z^4`oDYOWr<`kOBx8iBK}5bJQg+av={zXdNm>w4y2pz`Xg?YH%J{}}*_#IGQ_eyGI= zmjehPuqK8-vbOol#Pl+-P+B?x!cctS{KcHq;}>KL%{uax9={!36B!9bVv^jKt;SwM zS^i*XdFqDq9eWCzoE4w*;{Nlh)Y1UJ83wWIhh>nAt1iea?RfRRuHarcKbVK63*9($ zCo0dIf3NZpvJ38=9O|2UQu&JQDuU#@+b1k8|9BJYOsTGE7#^92jDW@A#g5vy;Z%qU z5=!whvKxcXQoVmQ&{E%;sEU(g#WY(o7fprOonlR%5BNuc_00{c%V{T^p^Maki@V}x ze-Z_%-s^{qt{%8%e%u;k?fLF)_vpy{`<8*a+NQkBiloRajaUoXb71H(ZJAVa7S4!( zzUYd%=;m?`;|vt6AMG4|w0At_V0YBk?zkNY=$x-W5FVFwn+z#_Oj}71Ey@REyq>`l zj{tvKbeuBRk00@@=5>BlQM4d2j1?Wk3mqGtUtIjq-#ig3%?jsd`mv(ky&PFx`(thC zKSc*tsi+D5ob+IM+WY1)0QL0v=faeic}XvGQl6FMznC5SB{TMMWp+z;?31+U=ecPe zZ=P%xrVcI)|M%u6TmR)>{>T6RZ~xclo&WadhyQb`^UtxiFM}gE@~^48Ap`UCid zU-i?yi#!*p&`rgHRWDi^gb(CcvV**Wv|hpft||#mmZQz~^OE}$6tISnkOZwS+S?kt z{plexNLfWolo&A+=E`hCgZ>^ZPJ zI&}H00oa;>ZQA$XhIAC{{SThHe9ky0A-|)xS!~M`+cChICn7R=Vs3qGZhd@q1GY?RMKwf{K1n;u2`gSQCy7}|&{0b&o zi%VPEo4fekqe|`$pY<2vk6WMM0X}yRxMS^2vG(h-9>srMa-r1j)!%KsTL1rFMfgwn z-PQi<9CZM^aNq}E7reao5&n(9;~jB=-NWy(S1%WWM(1=g_SbkzlPMJgKImOhIXyz^;@RGxmpO)8`#pFa#RTAJ`*pqNJ5CtTwEU0RG`ldFsJdzhE zcjmFJNMw6&Ur|8agXci4gh0=cj_KT}0*_mG)Mf0Qvkq5Io5|(D?>mQw2B#+nXUE=; zrE1f;cnR5=>1IP9VcF^NIbAQ?%aaNf9uk#@jP1x&QB?Pms-(_xzBQj~$s%2Mr{DCH zp!iN_olJi)Gdy?|qJ-}rF|{~vCGwVXJq0WbpW!IvI0<16!?9vQSOe(}+2cCV`5YE~ z#tmvN(0$#`yJF6{pwGJC48359>}lwQze*(CVX*Ba6e|wZgr>kKmAH^VN`!_H8%&E9 zVH6?E2(36C)bY=1TY|y=N{|q(NKH>HSy=wKy7alexGBM>C{|q*p-%63KfSp8+seYf zp%bB|HuFPuV4QA#_Z?z=bwXQ&ua1)`r7`bs(7L}v8ADSs3_`r zO=hRYw z{WFwim}?=Q8=uF!<`e{fxmN(gQ6vETdItDl_DG z0bShos=NDne~5RG%$BdP;|oDWVo&jM_DV=h85tdKX=+aKk99h2ZvEZ$I|dhw4xGDm z;HR?(PM$^-_s35eKnxc6m>mI^!gJqUH8r+!QuxcMpMq?dCdMU6ISLPBVxI2K6NvF2a9dcI)HEy`vvq>6gFzmtuWujf|)E z&mMjOefu!ngDRMBd`2udbXr3FCvyKquE4*3M2OJ80T=qi&TmNn41aw4%jV|i^^IR< z<~KY0CIG+9?K;}?U(9EiKaVtbjl4t77~mHUApJpA0|(CwRfZ?XBG{G`%VTC%XDm66 zOsShd=)$2pP}x{^tU9_rudXb%NKJvJi%v7glTbt+o|B)P*Zk;BeR^#mK_$lUU|H<# zNLB~}D$AZgj`m33)WF-}gn(@HZ6fNbn<40!jIATWlRDc6zzTSBc;QV$hc7Ew>?s#| z2)$9>N`|!g$(yGIk2Ta_k+XmYf+Lb5$3Iu??klq5v+puIFS_Bcx`W}f3B*?!7@j|H z@#f)MZbmK)YZ}9b$#W2JEVxW_wzn}ElBpfeU{GgVAOnbI!Xz7$JuYCem)$*X5Qrvp z{4Fx=F2nt*7u}pAun~$Jq+EM3+m7#t_YbCo$?+QSs7doH4Db&30WVfsNNjNGK>I{e zaBi3=DTEgnERE~$pIco1w6*+OMp$XIvQVqc4Gl<}oBO=7_V?Are@)Un2o)DZ$O`?X ziNk|SYfE3AKj?p1Gm)x&TA23gRl{gm?#sBqnuo=MxhV}DuUGSvI-6=fe4YAlt&P9G zdira9{>XIG_8&9<)=)kBxMnjaek46+AYSt(BkEO7((C;AmsM%+Q^Fs`23AF?tKhdp zC^s!HsKSRB;bkw5^v{n{W{C)aLQ0TI7?~8E2SA2oWH7~oE&1Zgr?m}GLVXx*o$@0D zXy_4OHX?8k2YLnsdHI%y76p5#gWSQ#Kq2*#J}Z72#nt%X(nj7!&eOrE?q*5`oTUF{7B&(2k@Rj9R7d&>A;bn z4xGGv#Mtt>)6++ETmN}veCd7nSSv`AAiDQ2{DQkRA{&I_t3QBW z;CnZ}?Bo-L{xVH{&I2Vz;C>l>Qg?Zzxit9VoME|jJ5#Y#b|!muKT zGc;;f71xBrF=Znf-b+s4N`3M0)#C@woijLZ{-X&EmY6q4=rb6?6$li-dR)U%%mL9H zrVWo~!Gf09{R);~Okmk?c}`N#yEO3M@HQf`%)#hMA#o53?0}yy^CblNgXfHQaB^T? zdE)&bdSnXk84xJEvGk=lslFufMS56$Zrr0skE^cEAz%f z1Mb(B59K6v79@|iJp5FYztPq9Z%F|!5~OwStERG}o)x5Z=BIQ%E}u^gZHm!6%*|@i z`qjLsnJGwko}jIki*f@bB@v>0Ej=-qo~RLIr-amKg_#7DM9zxid51EvQZhzF#0aHDiDGuNTJk5VZ zHu02Ugc4UF-I?WXi!X@GjpIjoU-NW3?T9*NX>ru_&e5A-et7ke;nl-ePwNbU&*Vm{9`+4@f#AV5p6+ z+Jv-Np<>z9pNFLbJjITD}{HVoStX;)E1Mc5FdI`Lj%IrWhw?V|a8Y zmbWu_HH1HV@_M*uVxnjENpU07j_!U9<8;CH){n+GN8*E;#?gW4Y3R2fwWf=s16)D- zBVxO7R19@pR$YETS}?C28O8P z)%ZekhiQq6D}S3D{T$|B9w5n2(9}k03LvC=dGbTFG%Y)# zz9hLRLY|eXDNm1jl$p|A|M+88=~8rh_x-2aaq-=i#Y?77-$G zb~2hE z9>P_3a$#d?acg02ZF_7bz+L8p7O-6ye4e}?wnbCRaN%7UUyfk=^BgE%XgnA}4^7NX zPRy007E;})xdk;y^9=QObZ#HN0A4tH{u1-S8^5ft|2(&_)zd%S-ZcUEZQaH1=zoA;nAf$B$hm%?IePcHBP%>x;4JVq zCEkI^xx>Z)Wc(eh*KI5bvLNlLG!%(!O`zM72{2&9Famf%>6#31GvhgODK<1m6D-S% zn;oC~{NC$=xNQ#OnUkF^+L;|U zxq9TrxdZ2KAG!_>YLhJ#T4-&IB0o%$6``(-j%p4|9n63GUveA1hQzj|WDK=5{PObgLS@eD($pv6 zs+^jJk3db6X#zOBFGL<dchU5}L#)UeYa-FVIJnwQbx0n`}@HSUTw@>7sSREBzH%4`KZXTK`7h07G^XfOmiYi;yId zgDi7lmZd*i$WROEs{z8GT0#!8^F^4GI{fMtNxyDG*@ez|=NA}g!`a;WWpncvWJWQ$ z+SxM+;BD1Ka)a?6;8(Bwg-;k>wRKOnbpwTC+)ow?_O<$$d!U9e6dA>z6~k4k=V#ZC059GrYl*>dzm%qf$2gFUkbb|6xY+(3v1*~F(KHTw7h=k`q=|# zE*v;}<-6-%rbM~3P+&siT2R3+ONoKNJ6)6jP7zMmhT!~s?18l_3&i>R<9q}0{^@?{ zkZ}Mes|v3GB_SYy9hMVYGSoJiA6EhXR~kmR#9LKe_IQ4AXK8jPR+$>Yj*So`N2=2o z7k*yd_McglpY0yf`Lsj*eIpeVq`xXp zeD1?e$&7ninbTH~_zdp6v3`%LGdq$r_mZ@ArRl9XG0#eq-$eLV1j(}#0`g*2xdE&! ziB}@WBP>9e?rtGwyGOX$`8cCw7PlC84ZSUmX*W*0U`+YeH(A$CyWcS+9{ujdiNnSh zkD6Wi!R+ey78efMo-lCw>9Et8AMJlUWc!1?F)9b zRZmwY)@qU}Am|Xxr5RQvf<2+2unKm_6Z2~`vuhg@Ysnm~%!M!U;jkmT$3xrprO+}IxKS2qG-7!3DZ2h{l@~MAl{(UFHbJq3GNHF(4{~7j2p#Oz0 z!4fAtD49c**FSpG(%kFA3j}$Q4^HKH5p~(%f+5U!kDAz?vvxJYfW8}VjHQ|oIOY_X z?t0(#BAb&*)>M)$S?n%ScqwIQ0n>uawCA{)5;1085x#M?`E}WvYz64f>^THWZ>%+5 zz?N54)c3Ruzr5G1q6FBVb#OT6V0Pa2(oeUvfl*zp{i9uD&#RyLQI#rpq0mjh!SX^C zkyS}mATtEnKF?0zcFhBG5ewn zLko=NMQN#_fmmNZN4cMiuZ9>BP7Hn!Rhbo#=}!V~cA!5s+>aB|@d~(N3-|J#3P3KW zOT>=yPne(ESX%!0wxL^$^9^Rk1o2~DJnq~8QsTz%P=XhRx5M}eY3ibQb=I4geSlx& ztp9y=;XnCF3L+Hc0h~-9LG*afN_|Oll3!_RP-UXJG%=teE4m>w^0|sznx8is8r|~l z&6n)>msyebQ#BRkS+6r=9~C7xR%gD839KqldzT;fBtPUqQRI{4p!)K(mh|vPSy4}N zVn7}IEGwiwTk{~nH$TxgGf`dOLrV!36!X2~lS1w(y(8s>a35wOj~wmcsK(m+*xzQl znR2Wy6KrqL?_436+#nr0dfV`f<5PBL58gguU~-w zfeFKz!`H6;aQFK6SItkEn4dJW{s}xx9Boe8V~z0?OBw-;9ey&qbMQLqM-!*xCf48G zus&pjK4E_2`%6%r;dXQG$kn{eGDsx`760g3$= z9MGO$_DihDToj3hr9?y}02d2Pqz9h0Gp)R6Xo^zqJ3KZuGdZIcC$|%Oj)&Blty%FPJzD3{9>sZ|EZRIC>2%&1b;054Q9~;u z>mXTB^Rwo*$IZDx>1v#h1TClA(9~3);;7;jRjLpz$?e!o3anJ#xxXenV3 zo)W|j?RwY0zOda;_5$RJe$+5THmi&uA6Z;j+JOyGPF#gAMGN&eSRMz(7Zd>?x`+8y z`}5&ob_}R~G@|(4?%B=FKQ}l3zP0h^#=^gbt04L_6Z+e@fSi%$xxDb&WOYe;U}dbb zFeT((M%cqRWl5l<*bkJvQLn1ATA!A;y{zrdPpZ#JeU=elpPTTgJoQCgQAc%lYf^$1;g7ckY=C&8?ZBALcTyUn`AaYD-_)BhfKU!kWIC)<2WSTG-7Hk60Wx+7;&~2L^ z%$!fzI2<=eeRtFIj5Xncz3JgA=OLEP;3u=w=0p@p!dG;|J#=9W^uMb!TRjh3e9>I6 zw&SB&bS$-`q;hO_VQgk$b8@v@o5i*ACfgA_T!|3FJv2JI+&3$9ppj7oyc>Q1HojwX zY&;u8NzI)@di)}jXWjC*M>l^4{gIx+0p2g5^#8E&VSg~Chvx?!|9N}spTP@Q)?r+? z1%_zRJqZ##Aei0S(L;D2zfgG*%ey_zksif*%p!Gp@BLq})nOCLD>C@n1uW7LI)ZRe0<3=GL#U^@Ak$p1v87>H~!L&u$ggmFD)Y@v`DaLb^IPtGc~?=*{zXj<-ak zh)4}cVWFr_XY6kq7#kZH+MTfQGQ@gZ#9%KtyPR>ro=4*@x!|s2k@Vi1ILPN^n1gc^ znE``eb2{OcH~toZYDuEolbLp8iWNSD6IhW@k*G*eK*A1+N3)`NSrNok#nXz$!8e1? zOP+C@*-qC{_J+1*CvRC@GEWan>w7)W_MkmQl%xdjaSw^Wg)4QJ26(ANaI19yAu7%D zf}_I)+sj8TLwq4jv8<1p5^lO{SpKgno;DRf3a9w_yGjGyRT}TWU{Zia81}sGUBkUM zN{YYQ!(U({g7A6~PTu~qXKs3RtY;>Gsqv?1G`yHlSsZY;R@cDv_2Y2oTrfK-k{72H z#M~=u*aR)l#&6)YzP9>XN%H*^bzY1#JxrNAGrhC9`N!54)ZahW=l=|m=E=x0T2WTG zGNJFqSgb4?cEr*0{3QSKFj-DP*ZCT#idnNDd z3R~}Gzp2h?E=+1l34KtT`R0B`Q)&F8ywLkGvaC>Ha<;arG^Rc;uriUK9mPqFXYzwe**_|-#r7o-jGgsy3pYb(s&U?TyvW8l;#F5Nuq=Q)e8tV!7OsyuSQPX+m{4Eh35)6)KCKp4?np|GEK+y!Edu zGoN6V1?C&6A^90`#fu9tbJ)f2;>1@!UWSwu6Ua^Rmqd2G7>Sc-$E!=VvV0jM$)A&| z73KJ_V1!kh5cnu95Pk`iM=5i)K3S=ewdoP}a-$!l1XpH+J^-?1a#&qq^0Vxy`)Ofi zxsg@*;rDYiHQCzgoY3n0h}sx&W}+-VT$mXt%MMd!2Z+-`gy}JgqEKO8FfU6b{E{aR8zCTRV`QNsDopKX*&Bp40)C zxWUnd_FlN{{=@wjp-_SgR_Dl@rVb@5Aka7JeftQQ#NIEgmyx9Du{jlKDI}=QbHnX|nZL%On=^#?t^5s@si5XLTn=Ce=LG~8 z_P_<>@2+Dn+WDZlN@s2$L9HVCB?hO0dSYsHxv}h}pO@Ol!xuKZVa!NBT0qmo=Gm#W z<(ch*xC(`rZxB`M#|SA%tzKIGyuA7uT9?`3^)N1&N5w{PqaRf^frkbZU%>Ci`rk%7 z=7X70VS>a6pX8TM->+|g@CP)uf9`DkOJDQ6&?`bC%vRFkd<9YE8INLRSz+S*P@ifF zHiGRD9xTpI46RFze4G{WC?TjiFSao~qCO?OrYNPcB;gSh)}pBTf`rD*_@{-b&kK|4 z)5A)#B1;Ps?qx+*W=GwN@yRQUeV7?qnWZhy(cX*mDGwE9sp&Bh(o8iiO2dlxC58o1 zqc!Y=U{gt&G15dbu@RpeejZOfhRkWl~TWV&s)7+$udd6 zAZ(6?ru)HWc5u3H068F{0V62@FDP4who;t7*T0=y>3d`N)D>R@#ehUTpGrSlM!wvJ z=J_9`f;xcfX_E+Y^+#7dVSl9OVeSG}2h4xZh~9@Ypj+QOBM{a>d;eSe4*>Z+u@&K#;e1#b_L zLXxcLyqDGQGJ>-3ck!sxD4WwL!=pw7JMUPZxXP%KSi087NvHyKxiwb=@t{{dd3Wg8 zb1o3Yb?U(RYlp7e{9xsB%2tTsN=d3hD7(Fr)1wRZr42rwJ{nx0kGrp&6quJ#*7JU3 zY2m}_{La(z=Q6xXO$va8SA;5lZhCuBhu^ieUmljc&@yA9cnKOw^y2JCNJ)VH8SuNa z`Dar_YqT&0>Tj4TacbiKW9&S<(#pHNucpT&rmL~{-Ya$xK>-m^5v(X6iX!&jyHOJp zqv?t1-EM4&y?4QyWYT6PGta&6`#-$;3y+xxp$7eO9J z!ta{+kI8;^eTXI*D7Bn{w&qmDVejkFQ>Q zcI(pX8+EVlHFsaFe%jL5*8X7VQFC|atLfg(mG;*YeQo1oeG9|AbL}tQw>=wr^LY6B zzX@o?mPtIZ;Rz2#E1q3?%2HW6{w(82{uE!No*m z1tkjoxqfE8)=D-o-qGcxz3XW^GQ5zDaSRJ03tGtxJZw)|njJOOgvph1DuxI2?BO4V zp>s)2S@-L=lYNsft~^Zei3qbLh1vKATY$mE`B=EpeFLkqN*c4PqFnsxmcDdrBDiOs zR-Wlmf)_P+f-UegQ!L)xor3j$efv4l3g>5s$9oZ*Ynm|*80aVjMM@dJ(BOu2s_v|@ z-T|0tJ}X`oZ;E%Cd}Z*$37BA{|5ws2`0xB~Lu-{AcledL%E<1| zzkw;U!bsS=#{?s!@7|2K(~_MdbF!%9h$qjw-n74a+cj35eKC;4th;#q_SJ_JcWQt$1#5~oK4GdX zuL@>PMM1^nsGiM9ONTRd_NQ!Zj@wu%T3H;nG&^K&e%Ks3>rD@sSSebd&Nw=sv3EFa z=XlBnJZey{^3y}3)lqKe?J=4z0T%dRJ93~IfuN5GvxEtxj2*L&1ikft#^MDpOb~s7N5jLaLc#&!8KT@v0a<4IEnATlJ9US(t(< zudT13W2S6z=i1|;!P%a+VIDn+Y8S-u;)0$t7thJ$7l8@~Qsh6o)!Nd@L^(TCES-AjZ5HDQ?Flou)6vMjIWg6t<^s&_;u;Qpcb1^lv#(! zTZwk;uXyc`mFdrMl*~xKv?zR9q;Fa>1Lky>2Y93qy%L!aM{|l(_$9-G3rlmK=3%J! zQv%`~HRTAyIehWc!<`=g-F;-0QhmcC#$|QgKFIuAnMMP@TrBNaB>I zbE^13IYLHJA+I5eQ=P@Ggq^Ich!Tj$vm=W$!*eskvuaan3u8*tg0j;o*~wTzDo&V8 zO5+id6N9n^v^yH6s0kt%#6qLWwX7bV{shtTX=X@Ze&W0ur!~QN3|qF zv}*@Lqtwt&ryMCJ1cr4$kTnS;pxN%B1YIvLRTMa2y0FPBuWEM02&?H40NWF0c$|fY zkE0hSjMG$o?M?HODt=)snn^W4M?2HV#%LIT;%V*?<`Y=PPK$M?2SKQ1;O%GR1zS;p z4tQ^UXI~wc0242aF)9ob6lhQMGe_g>yvvh{JgwaG^DB_Z7c8&D1WS#tjNfUUH@9lKQKkB~?2JOB;@mEhHp!g*eaPIZK4Fq(|v(Qu{02-vRn06U) z+CF9d!y1-~#?~h+%@12ZBc8=!3$ugfrU%T7_nR8*Gcwp`0L%EGk=YSrlLLB|hYhTc z8ath`a#wahtD#`vo%?wkr}MU;Acxj)rCJgoQYM?gTNh49By&HaEin*7PvPX;D8G{s zBydu5F;%pLo_ejL1}G!1)UXVg*T8lQWxIxl+t7VAuwKgUUYZ#71G;DBG%hG;=^WAb zaq?{_Z)AaNj}tT0K8)kR<@)ljmNqTUZqF`$oSNMl?wR8fd9gm6gaAQ&u<-fAE>Nig zcmd(%h0kTF^=v;ro0u3IA{-lDhL{)NMb`4?<;iU!H8UeHmlu@MboB|c9lZAY>iQp| zjXyxW zQ?q#iX$he@1;Uz|oNFb5n(EZLG-hf%DONy^=iy@#1LB2@q)K7MlZFQ^H8-QN;V2bX z=hH6U8a_6vE@5a^B2>A+s4`0e+l3wtgH-e|1YHd3ge}-yb$Mky2wv1tK{o#3pkro3 z4u;uSHdtRvFE0}pe|zsFChu}qRRueT<#f{6{hT?@&;@Jc;dI{0#{fmKz)-AlXlt+9x@KwQD-C{k$wmC<-u|)a znMJW^eND8!0aBAt_AJ_jKp2*cU&-b#(v>fDjDc2ZvBP35n^Qbp!ySG8OwW45TYeZYLVfHG!(CWfZFwu2~qdJ zbjMp5R5S+mx1$@GA`1LA)ZK}qb8BmFA{ni&;ogq-!sztifbdr@x?kRIrF$_WiLtTN zB-rh>Id6O6fQFLXaV5DUP&j9N(9ryd1t4sC(98sZ*Tit2vB7>LgZ+lUufBq=9?&GO zrXzPjPeH>#LECV@uGt|&$72>QN>&bMt(=q{t&W?zsW|xQV@ZZMk^v5*;pMA?_0@Waq}7rud{sE(4T8~#8Ur|iQy4rys=MOkT4Dx9bq3FVMC|s6J1U?IVd@4 z>@!f7yP&gA+wiCX+Snt+i5l%373LHkj*hM?yf!zxF|)8WHNQ1Kv6UW?li-(_?4KML z5P#>&W7yJNfQ_N$&x;Gcz3-T26Zi?F6dqMjlv4{_i$nnLcai9;c=>bp<9EVegT4t-sbbeoVbzXQ1P$ZgCNW+%Q5;G`%8(SVVN-hoF?~eMMM`an;9@bq7KWkZCR{8{ZYbf^6~)zn6hJzwvO>^Q#JgM~Y|cx%0xMV0P?6DG znc37>_Moxi;jOyokDI$5Hnu-#Y;Suq-0^Z4-aJ>TZdd0w3Rnf9zKKz!Bq1|5BRn^c zRg})m$qXyVjw&gLt*Fnw{-mk%>Fu6|(i@4)R9--$fRZF6CnQr7l4x-iiG>d@-Fws0 z{;=_RpcmcpoRzD(i-)E=Mh_kC7KxC~NDi?kupB6Hs2~<}WvaW2VEYuT~M30pSgBp%JMoB;mYw0iip+ z{1S?#oeMI45m7tI0@5Kw-Su+8Q0`jN9jE%A<`@`+o8h?oDNqb-N*D5xM65%~veXL0 zIh;tdVS8^7i@^}XjuIjt3X&9W`zO2Kj>9A)=-6uS8ft~XyZ2tRnEcF)3g8zqUGTr6 zw(2Dh@N+=KZj;hYN8toTDu)w=$I_oKFosd6vOzxPPysGsH8`OChNK;!W zSz8{rHCMDUJY=fB-$;MIp`HSC*{f^FU4S|eRrw35avI8V8ftPNqN1U#prN_%g5eQ8 zi(|%)N>(;UEgetVdZ~HhbZ{hXJWkmIukPiq@9S?&@G->`?8*G##EPVgOpho#C8)i0 zwpOw=I%?#iY8PZpjCKqOw+sw7r+J@qbvSNgaL_F2ft;DmwGU>d z*QXb@W*4`Y7C$r=--y9-A)mu1CspUvgE*wr4PFA{JO5i_{!Jk@J&BqY#}JMTEy9!p zNH0s)*Ujbcbs3GoZ!(CYM`TYrWEXCbcQV~KJ(Qf| zk4|FXv#4l+kX2S7s4hvY&SO`UB{vi&)aAw1v7+3=k)6q(BWy$Oel|`rNojGgw(`Da-5Ksn9It( zQF49oMgPqE>86WKq2x%Eu9y887e^J8qlRM?G4y`jord%VE|wMHNQ-r)N5k-L3j#$C z3tIpluxqSjc|k!%O-{x1urX8!kZlM=Yo9<{9K+E!+>sb)j3#KKaGDNyZ6}hx3rWv~ zsD<*^al>jjxn8g_KW?CNKwTXf9IvFIpmbhA>4d^j7|{;m&&TBsL;KPhdFW$OI)&8d zoY9a!V}3~6Ue&_Y*7NzB9;nj*eql*6&k}z7#s&t*mlnnAAaVsuVsrofh?rv}1V&QO zQhuc;GJYi{7->F|8Dg-%h&#Qjs3VdpW{|^5jgQNI-Ttoi z?MVCEvDQ}uQGs!sNMXmDfsV($5rpV?R$5c}tq}KMf*ICF*Ujvtk*b2Ss=SKkel0r{ z2MRPS*kHZQygd!EC_Qf{9W;nj*(y7jow71jva~#H3nM;H@4KKVcUDR69E{sOEq6{y z{xnoiK@Fsa0!&v|*8)qeplhI@XSv@Pea_ie!wawB>3P=K$Tjo}c?LKCmdHqzIu~fhN4w@EEuT z0S(yO1%4M7KCMoD%8M#Z3(gf#lVN)D%;Lv+`0nP9U4H+V8`%o-;E`1XBQen1{V?dxKo@VA9V&)TShzZvAAgZFUXKYYM4Q=*o znaC>}D4f++IHjU+?6kt+WAX=%$SE9=lRqpce{g3h9F*G!@Sc}Dr7VA1RpG3v{8`QY z7jzD)86DBmKdI~Lh=wL#DZGdY?uX3Pm~=#1twU+?~d^Wcx52N z{_lUk+8mGtI$ENSi;J7XBXbb=OH%IOMUS?34CQ5CPs6dGOOwCG%9p4770yCKx01ZlX}L2?j>Cly!q1BR+{I{N#K%}-mqTBDnqA56}OCm@N}@h+Yk$41BS z{Su+8vA=t4VF`vgeq91sR=z@7sUou>2E$FIWWc;#Ov`%kz0Px^&uIVj(%j}EI2f~QlVb}v>hC6n zrE;n9X^iYtT1G~2P6|DT7o3)#SlQC_d~9%LX=W8By_V(Gl3ao?dU&)p&O;B2H6un7 zxwmWYbv@}Q5f(DhbT%$B4jY+G6=afl;nu_$R3O!w;BeLkuj65%sILO@8uF)Xj_Bhq zxDd2G+*Rx`+Rhja2QO6{^jS;vNpsH=W^Tt!9ToMh4`~_hQ&E>Yc^2slJ_ssUpkIf` zV9Cktlao6tx9_<8;Zq7HPVZMzKYGDPQO8=zz*W`CLD}3v#lrTynaK%V^HT=eO4{CN z5+tu={7Mi;CT$H3O^KEv=G|!qL|kPFu#zjA8)EREp^OSy(#@m2&a?C!zOt8J8MD8f z?By5WMO@-vApIZyh?r(r(ogq9yRz$uTmB!vD=E{Gwkd%LhLcs%hlQoB;n4-iy#vBs zZ$~@2hORX{h-ar=Yku&&eV|n;!uhC+=@*f}Nr&OTy{#i`T5LFt_2k}j0h1qs3Ji9l zqYZp*l%4dCn5f8Ws3>UYtD4oTYRz*-&veGr5W% zo6RIdp-p`)FSzR~JE$Jjx^PHMWxwj#{b!(z3TYsfS2`(o{G|NJ<8n$zgDT=T46b@}D$(#s@wYN$IS4vMk}@#WcdARDy+^%$aW^DAGL7k}$| zIvC}{jm7c9v7GCdpDe9>U6$mQfnP9%b2D454|}2Q9mWYolX*}!DUEyq-nH$&*S7uw z5y+*fEhd5O=Mv%V5@TUV^FhT2<5L+yNh6b@rL}Kj5P<}tD$!@q!I)p%o}OOs@11=4 ztp9e?%bJp#kc`UYmuJV9=kSn~6DvfMixqVoh#BbzyQ{Wp2~8nnzD=clNy* zTbbP45`PoJ(?lR-w>|WJ`gY@^l$gv!rZAbAo*4%7$8)kEVa3X?PN}|C_uyU6)cVS2 z@#=@!v4zV;4LECGh)qc5NIfLZoFt6S?0VWW-Zyox{$3P5G}MbhccaJpvvb***^HzJ z2QtT*N;CELP_-u+V^L?UwB%LJ%Ae9!)Fzo@gRNm7kU%!T;I&a$4M$HEJ4Yqhj4(7i zq-&^f0pvI?$e%ec552&OkTy9ke*mnl6kZUbRNZ&j=pbKcDGyb%@~Agj5OM#11o_6>qa{^};QD*PgYBPrY1g<2Z_ z?)cAp`Q0h6l5{!%!V*Iadrydj&M)x7AHjbXft1#6=qh!XrN{qFp9IOB0uRVUt$!44 zd_;ON@hn(A3O@YXan_NhUt z)A)!EO2w9HjHes=qE9=a6zv?2*n*gq?Fl;@MQaO13(J!>ZaNt2Qx1BNPdjL;bwFGH zqygRv&%%PNQxpVrS=`*&na%mt&kN#j3!-mx5c$r2%#SUNCkhfNse;H%sHy^^yaH(} zNKZkK3)$)E?Z&b@iT)|^#3UY5h^WD@eMc-Wz`OnTI>PVo%hQ{{Zzx%4Z9=iPjqvjl z5?r})tlZ~MdIowYAKht#NW8wJsW7cNnVXl&D@=^e6~+{#Lk|&51m<7LkFTvrYAB7X z%ZM(?NvO(6tg0)yb+7sLt0(;fJu`DtTWhPoi$%XfNWQxAWo7yE*w}K<+lgye9%d(% z#f7DDC;~xnI;_md{Isatn%st$ciQHL7dKX*CGFG7>gRWT)0KIban=NHU2nWGk?ase zbRZQ9O1fSQE{rWbZGM~@nGy==N_2QMJ~}-jqdv2i;Tat2LS>->15L2L+AcIxywfRb zD@7w!IcWPmuYbtE=8U!DIa{c(wLWU%aKg++(b(p=sm%#1qPpEtEjvX$w5lCi#SWutk5_lXX`-Qfd zk(9C|uthFP%A40=E}_JH?>q!iw1ZwkB>0srxD!wX6TIW}%IxWXw41vZ;VV)%8~HAD zC_sC{y0lLL=^5O4)c*&+Qg|gt#GQtH;YGv>&-Wr$c(k|cePKpveop19c2K<@>VPcP z+tKHD-Y^J}>8ZsqOB4oeXK~Xh-js*8p1){(8IFzu4RDxW;Af0?S9NnfjWRuArE$bW z=^(r--CORzdG~&ye`tPSWZ~V|^81O^;Yrbu8;b|+)qlWs5=6Z(=boS|}%WFc$OhXRVc};m$z5SZd zNa&^F=A(x3IO}eE)Y|%pr7Z}|9=EnQVs3T9#!Un5c)``=h^3~yj^QCAyE8UKD?+ea zkT6U*J+?BvxIHiaI=}X9TJ#n8?RhrD^G!@33u8!e_iw&jhH5MEcixKC<%cLHFgVyFzvzCnPyFx(H-LvN&ZK?2^>T{32n^ z-K$TgMwT~0`58%iK*Qs2t*?gotQ@p81#Lnmng!#H`~y8gs|&9V4@}Nauk^g?Er`pD z!Gyygn*{&(#Nfo{lBSx}s!)%RNVkwER4~;PPcz0bt^8e;Y@AQo8y(P5kw2xkUjypy za7Nw~8-I#5jOT`Vp#EfQBF!;?>PYgn$AeICFg`er8C#xOeE;H&E9sSi7TzxB%rzCx zT#!4dtDtIq7&aq}9F$Dl&f9q@+xw_H`)ax2q0>zl#qp0W78H?O{i6IC4{C2?EwQFr z)`i72(5lb{(^6m!Kp;FiJTfg>hH8x+4GpOeEc1jVP=jFmPCN_P%J@Z6%DeE&OtADN z0QXDFv831c-nO>8bF{O61PVMz$)$wQU0}hO{*r12ND+8A;CRnVazOJ&2?;ZwwX zON=kD`LjD|*Z9idm3)LWJ;B$(m0Diff^=5@z{K0`_t!7q&PXY^|Fj+Cv)X%LK=9B& z_gESyhZ(?n^ti2~eGoJ{!U&PEQAwRI`>HeQ=^kNhJU84U)ZdKgtAlq}^EOp-);?-| zX1}_wib-@tBIsKV3@^SPTLy%s@QzH0ho{6dQ)>_OSV3Wkwa&zz0UtLise!+LvU4#^|7-Ti;UA%=D0-BVzmUipeY+Heiw|{Wfx2vM zzlu?t$$ly`ZO}MeCOt?@`8q(#FA`wULmhEk5in>F3aOpm88};*FS7~2CcL6 z;$;|q_f-tB((0Gtck`EP?lQ;;vJ1wlxcO;d?2lRLL3_B|IrHNt zXgxQce{@nXuauu(At-LhuDe}%<4Mz_H}_u+cMZ*q&MeL?ElkhPkIq~zs`1u^syrjh z{hHMnlTZX|s#w1%UTzI|+HEZ)HfOh(JKdr<+= zjz(w`J%^?n4?6osJNw7FB=EvS@1-RXc+Pu`uMFXz=6E-I{FB68tGYujm|)}~Kf`C~ z3jxgc&l@CNgoyaYt`rX-EER+YJf%J`!l1;GB0S1$tK>w=@9Nt2D$=A69fF7z2BMMs zW!p^uE5APzS&|7X@Id$?TwGY(92;MJ+duZ=MNfK0Np;%!K z$;~Nm>lp0o9Srb2oeGtfMvB^>0kK5nedIQZwBxpU>_QGg-TdTMjpLH};vNKk+H$P@? ze#FY`u({whbro6ruY-}l7SnImvWR_3PuTL&* zPp^EKS^n_yQ4a^lN%Br)vSRvkJ4nq>4H-OgvyS4GJ&9%QaHvZn+Le~1`U+ZAdAtwg&6gGdrhVtapdRy!J8;y@Db1tQG ziW0+fvSQ1Mz_sQSm!;KRskrm-dfPzf?DXW;=H~CP)c$x+40?1B|HCIzBe#-E!jUoYic5x}M}B_)QQJUS{yrVDNUvG(CFSnJ!s-Jek4(fMZ5$BpY|9p!1x z^e_qtBXA~%S2ovvYyqTeKOq0Sx%Jo9){m|2zcx4j+T4JU`Ol4wAIQ06!MSMlkMYrs zJ2yJ=(;L`~RDMKe2DiA7UzHtMRuEfVB&aP)uDw)xtLxR!!W@(W{Sz%`Pm1aU5*z4R-dm+^257Ps>C>(`vtt z9hlw2hAxW6ZYRvqXYFumE;wy>KLa$$#xFZMOF&IA|KyCa4Tt~D{sO-eWUno*{>5ZLL0)e4-TN=zboO_24m`U1 zJetlaEv^L<+|@Po^ln=Sk)54f(%U`$=IL8HArglCHi3MlPgI~&5X}x+&-{s?Ri)$Y zcFxH~*~wnb4(H-mRo>9kH$FHr|88t?d~C5QyE4Fu>Y?L_HTLl_#Q5rY`Wtx@%y6NY z(9*bK*rW)yB!D~3bPuY^tm*9-Z@KZ39mMr_B(OZg*yuvt1oGo8CzVQ63z9` zyl8lwM2;ncI@TF`+f#OSXB?cMIsKHi{xKt!{W|9q^mG*A+}u#nNavuw=6>x92ekFh zTN!HF<)>8_@XP6_&{&_iC@kywgHGrZL<+9JJ(ieY@y4G>B5P_pEh0-uON$Ro&P}g@ zyfp9&#&?I`tslTI)JVU1HjH(NaWoIIHw^H!qGk)rrf0+p%O96uI06hI0)HDYU;iE4 z<27XS=np9QkZw*5zh7>BHFB-~NnYxuO#a3Eq^s%Niy1Lx`EgYRu~j+j@~V`^JC~ky zym+^~@M&}N$2yq)&F|tZVD_tckUsriLne!6x}nDj^X%wL`8?D-E4d| zHnb>OMz#@Q_rJeuIGvjr8xSW96lO6q(-N+q#^0ayo5idC=5M(F`ip3-T-HRzJ|yS4DKEn>gan1lSAK)On|l(lxhHX zG7~Iic}K<>DQ4cYc5~6|P@T1Fb7dzIJi-1VNw9yeUsKRhhk38@g>$433+Y`#$}kYP zb`w^JQ@v}55nmS^W@+*nq@j1EDW&}GIUQK6+_&Yie@o z-i^m~l}!bC)v>&k?1GA?FWTE%d-8>O(V@I&&pO(=2K#y^>q>8sam=e%?)7$$+`jUV z;2xM6U))mr2>$&uJVM!i>>vjU*__~~i^Zt8d#k%TD_h%X+4*6EA3cTK!~D?5%+=B> zBpZ^GD#}&M!&M#SXNU%IGlH29!!0<(p2D;w2bvRuQ8ehJc-hikm|Q`0@Q233P}g9N zPh<=}GKZ5j*giBn1!F^3Mn@N?hUZ`3d|4Kq!^cL2Is}G*%k3B(U_eGI(QFK{ zx0{}N>_ z375*VZx^LQ7x4A_jc>Z2k4_J5e%kog#}EJ7`taxG$3H~d;JSZX-Tb<__4~ryR_n|D zw1gruCW7M54)NfIW7r|ssJ!ILj<(S?WO(S8711Z~vW5qzi?eGY$m}>;LIPDF3{SaJ ze|P-t#O%;QLvdpSCOp!O8ApgIi7Uzq5k@&tIj#&41r0RB2O0TNbK=ICGdMIj0%J;7klKu0cz2PGs)^?R#rDarL(E=-i_;zsw%ET zv-mM=!PQH*?q7QlNnsV_R z6FKShWQJ1^)tpE%_9g3iV^v*URh=zV?VT(!IXP85o$oJZ*I*62El=8-pSE*Qar6V@ ztLKT+N0Ur&!Iu6^7%Xdu<&fBXh9JZ%gy|f_LWQtBLgNV0$qYeDLkkoaO-`+hk1fFf z#KudvW5W^{7)F>gh+hT8VWW6{F){w!%SG3pHNUxY`AH%>pX3qlVT5zhbcK|Q-cjT8 za%xKQ%1Uw;2DhX*rLL~%_PyrLwl^~~Q(sqC z!L0wi{pr8fKm5J%5q6ouU5BLBSMm1urPbd$Iz}o>nxg0ekarIEjSu%rW|MPcX<4wz zH9fk#x$$jd8zzT>?BSQr)`5c55>6m5J}4~X={3Mb8+?K((FchjL`I`hS@<4ZBTTVSJqO{G(Bi)amd)=xEcDK9qxh? z{(=)x*VEs`JKQ6f?HfgRp^;tus`ILzKYX2>nCa=^%jYGxzUqGRuq^=3wA4ohQKL!z zVHfMJb@dGnydRsJTatOsfSc53mLQDepd@t~h+>s&NpAo`rR7-C8)RNFz`KU<3vYwn z3Xt6yXVOY(>2svp!Mh#AkjMT9!U)b1>LtgYMb3K>24O1%-W|&;QHS1{1-vJAmNXnm zMJc6Lcms)uf7}h(fBiO z-+vA>-C*$O>nA`2V))*7SrFjIB9m$dCP_}nef)AI6jTDB& zH&!-vw+=1Ne-JHwT3y^;oZp%mTzYizQ4%ShVBqZxZ<5nCy2ng34jHN_=qSr+X~^qn zE9j~zXloodq6e~}nsk2t1I!IvT>iYY{AFq73nZ_~5-U@nc$gZ`jTB7JZmxhmg@hI2 z5C4FjBcyo&`uBm~?pcgYkkMHWb9Jnfxo=hR)f-nIROHm9ar0uC!i3QDG**5#yQor7 zS1G71;Fgsn)>Y>;Un;$Or}1TP`|yVN%l7tPA3y!~hfn{#vHdr^8P-1hfVTvaD1)B` zlLXhk3=B?RZD?UJlbIww#e>DAX3(+RNQ$5|yYcmtVe#_!ZSd+hzk=Bni@yx^PE_U9 za)bB@%oILDm>8Z?lYhCleQ0rRt?gxRLX?p07sDsU2*fg4Tl?l0H$ifIZhmcLY5U28 zS1v{_S_r|i@*R6~FKZ(gUTj)2yUI~|46 zr^)!0d@2(J_=&T$sbQ}bmYQJc5i!BL{K8%^0;VL5j3kqHy>0|~Ft`$#Xh2xj&hQJZ zzx)x9mn5j6-~YqX(ueW!<@@(vJ-GY&Zu8UX!rJPhIsq$*jH5r1)gV9F& zfZmRtw>!)MR6*$A6%MSpP5*0 zuD=sQiI4G*i3{`%nHXQ3pI=*E-WnSiOA6=cDW1Qea7Io3jE3A8PW1ip~Wu0h_ED_1AV(!z>@CZDdShlCW7$l z+S)1v&XWAIr2bjT?{5AXc?c+FNja5uDoIT+JZ@1lJjX;f*SVJI;v=MG4@)Z(R0cW)hPZ}?p<_rkK}16$Q5%cbK)arGhAflTetn&N23AL` zQA*BO6?fbP4}un&YUE2ZC(&%kfer!TJ`vSf7vJ1(zgc%HD=wQw3}?7dLY!b|0tnDW z!d&=JG&3zKqc*R8xO04da%~ox6lTOTvs=?M8#6PTlVhS+4|`zeB`%21C2~1fZahAo z}`i8u*1hUmzDMuiyyrGVnV-u;gY;vR1=88w3#TnJM(_)Udp? z=)wYiRSncC-)QS;otPbm4Dh$D?f=?>cy{}5;B@`NkBtw1ZAq}*fK>L@j}1ve41UDq z)b_*sy_v%5*zgRhPecN%AR;I$icuIHUU;qX)%(7M&5b|dA!}Q|i#NZnZhR4~eI6T_ zt;@N@r^F@E)6&AS)1tDjRW^_GO^8>(A=w`39v6fraYk)HA9lIt-Z zQEXILyierK!lo=n3JXP#aS4gAhq5bQ5X1L3!O_g{VYUHKWdVt3)F~@4ope&jBt)W< ztJQhcdS_uT{;<0INmaR18gl1A1=@JOhV5|^)Hyp36(_8k3q>CT?SyPk2E!?UY>5rW z1YRzzeR=13QF0;4g-rJgy?*KTyWWXAAee)uqU{LIrZ5?c+uJuZ*gKRa%quLZ8lRj& za#p*&MG{&OhgpiP%ml*~z*Dv)2=4$c`R?w9ktC}uZDEk~3-9E?kf$Myfe4!t`-?OS zON}o)3TWCPXcu0%O_IWb{1rky!ZMiepB}j6Rq)TQ2Y86gs>*njp8P`V&mXt@1lbko zoggzJUC^V16n?;hlhqHau*UNVudBNwheT&zI%SNm4T1oMJ9E<>AzEZKN!t`THGtS*8-jB6cm$9N(iwF z1U&t;z1>yZjgMMfkk`_b*L67I?0VK6t?J>ghYvI%(M*UGGeUs1f1q=afRQeYOphe6 z$WG*7XDZA(gnw5Feq0`j6G!6#+Ar?5P7SY2PlzWcM3Yl%Q`76iLv#0UzNjr}%u6he z3yhDzgt2|1`F>nJfd>I>e1I@LGWTlft--@%ryei=W;PEZ(`^nwn4+N=uCl$&X>=@tN7-xE%!PX7QO)T z>)U^b5pp3p_64%gi_`1Zs%|IHg(>v3tcaWpPF~B^r%O|ii}?lxKP$5v&6T&fpcE7! zi1X)V#AUs09q4O+FAPtL_6m!~#U@e`9@al7i7N?qq=6D|m;)6i6R}(vbQ_Alu@BRR zOxE|NnD{`cv$qC{?n0sCf*v$K_O$gnyYGam{7INO2ptU?^2&w>wapbJQfcSyFd85@ z>_yVY1e@Z6tb7BU2tl5d+MMc_x1N`0l+!R27@<{^QP$l)(Ahee$jgCL6_d(hGZVss z**$NEdIv^2TD!B;i=I4t4MomkXz!Ku^Ge-asm`_{A8Cp~wn?*_O~Qxmh_wh!E{x=wH* zB}Jv*u6n@mWCnmeb)g4YlDyPC?9VvqA2mNOr=hdo!2XOgTE_=(KUGZ=cW;3GlCKYG=4#B{;jHeJ+DTW=U{*BJ7lO9S74at7l088 ziN&j5#fu*XyGEbgXiaAq+3R5Rk6D>2TEJv3m3`{kM=kAD&|ZeVv5Z9MBL*!jaG^m9 z8W0A4!G)Ic3wh?5(RBxXJW7}BZW$C4nYz0ANwoG=y!pE%&GjcFt2Yp4fm6in!UABC zCm`$h>Ddo$t)thjJSoho<1#YBNy+IkRs67ugy>pUNN#mub59$1s~@(u{@B=toulvK zZHT_VuWf$c-1t8DcH&~;mH41UAUBnnksh6Ut@i%n?51e-(=w2|{&}Eh0$gZ5iJuyn z3VTLZOB$hzq5WwmXr09o*s-{X+?dSPyPf62Y6d8bxrRlcLc*OOc%jF7h0`pEbQ?0u zIhdq}hGAGxOG(s62RjE?t6Q8oc;bZIQDvAdD6a&KV=({7=!m}cDGQi!e9Gtv+ z|K-hF&#pG!FD<=v=hpM)YmZoALY!x?tvN}E7&NiMA{wx}bVy|nLonFxS ztnFfMjh7uhCMYg5EE)b1G1@MUXRJ*Q8td&hR8!DZRnRg7T^$u?7fm-eZ4a!zH^IP% zV(Le;Bn3MLhByXAzyKph8rw50-k)2MQP~Qe6i|uX1N+WB_nID+=GF+gnJgNY;zbX1 z4~g(#!W_LQukdJWB-f9dNJ&f!Nv=&Ud)D;yefRjv{D-AQ(3boSrWXOcu$6-}*aF4N zh{`T3(5zco*j$_vjrC4Fz48haW&Mo&9nQI#E7|KEwKYBgrJ+{Fst(Bsg`FKEhzj)T z=N0i+X)G))lZL0wO>VmylN>etP^N)#+}!moqzn=%u#}Z~AdWGzHn#rS-2QuG^RMNl zuaE9`$o|=0+D>E59{64p!$Y7-g9GJ2AOZThSCl;qfVaL2z1%V$Y)Sesz zLv3KNlpZG7hUlZ?=6v4D;JB6>ZksbQP(}Dd{PkH$9+jrfBS>>WI}x!&ZWio)=!< zi)e}^S>QuF0;@C1V3u^IAcue^W1V1Hbj`SvXwuugjescd=Mru}6 zIJcww-P`_A(8KBJ8@hYk@kEUk5a?>%Mm`6AdDoIA-t71$v_9B zv-V>CkMp0*?rbwjJo7zCY$?S*>44jI>nEk(-HR~rE5%lN6pJ<_{H}{Y7jtDp#+USI za74^KJZ(=%EBy$Vg`5AKT+S*gw)7ud1W9El7^TnC@l1zQcW`1<%Akc^? zU}as+yx3H9r6#W?FSS6x6~;#-gcBk`QZEoig9_?U&^YypiN;35dbemyf!D6K^bO3yV;7b| z^$xMf@YtF0O;2-*i!RB_nvoD+u(tX8%Gx)uu!yCW_}gMgQ?En8)!#ESTMr)f=I34$ z#+LCInaS+3WKLB^?4<-oabiTl)tU!gZ(#h^mk(g9Au+Y_Cmc7o|J(qZyACgn-xe1? zzJAu9pI(&|nJJ9O%H$O0CzL+C{%n3qv<+yBq5k>Hn)vIB2Oa#7cwum&FeD`@JhkcK z&4q~-sCa?VHnBvGfCQRX!WXw+j(3fwh6vdnk#W8;^=Y;FQMpmBp)8NE{D{10HwM$5 z#PMQAIR(-Td ze=9#eg;Skgd8w#AC4$fJAW>0%2@&xvH(K8Hy?^=qb$Cdmxvmw)1%KsobAR`{EMX2K zIP6V(Z%_XS^eG^%M!oMrPjUxd5u&~h3?kO*KOro=zP<{+F`$YhpTPu6`2~WcOY#K7 zotC`;;8DNe4^Ke$l6H%)q~uDEyWs3tUU(YV*BzxTs!`kk{C7 zzp~`2C(8faaosbDn&oB?wL}=9%RJEX*PSM=z zq_xc%8)w*5QbW1wc)00%VU2Ntwp2)2gSQ;x6B!0mkQ^z{>IEJiSC%+E7sUu(74TwI9+c3o{!Fv*7t}&x6zzNKL{CSl(qsSQ3;c z=jOL3#zlQS6Cm9T`KyG`u0id`)bN_Ob%>+74`3c0A%ui5 zIMt%HZ%~~jUi$`C{@vhwL+!&@R(>!!frR5S$$~UaaaLSKVR}<$!sW|lk6+yHUz+`d zM9PSR{X?=KL-k{Q1HeZXD9PVwe3Fw?DhSO?49m*mmE|T@+-P{XG!N4)q3q<#+S<3x z^*=@j=Sz}Hx#Z}S5PlLpp(eY2xOY;#xc$CuoKH`Rz(&NAc?Ge#V}0WjeG_S+Nqk7- zdq-R^YAEIvFx}|ze?E_ub&+2IbGk!NK?1&HBX}o3mPN{N0tidY z+)kbfh?D+GzwnFv@t^#{ZIZVK5|c{#{e?dG<1hRoKWH~1{*NcpC%{M2JK?clXQj{o z&&QQb(emc<;@V*U*u6W?nj2dh>TZ{nT)uhZ+11PUgo51q`kRj)cBBi6EcKkV&zPP+ zqJ8>+2J|AS?AKB|pbaHY>Ibwn4(RBBj*6n5?P*JpkM>jrZ5)ih5iY<~-%o@WGt`65gmNrr8pDYSbL+xALOA~1_z*!xOipdiWyp`U-R~IdnVy{xFHCRD zPl@NIMYA(&Gc#+`kjR2uG^C)XA+NPEGPLmeW#6r)$MqG>rD;_hT6`D|Dh$Jzp5ZJk zD;CcY5O|5icmXvri6PAA7gc3mtjW9Fa_#9*-^{`Sr1Bs@hAuqVPW|>_^RLCxwHswO zqX@A+_EaY`ti7?94Tw?by7+kpCdKB|72UMc#Cx02Tnv07g1OKevbeb2+dE!U)y$1d z2_mwB2pqa!BF!g}?w=gR$c>~Y<)oCrK0AoVt}g$vz4d=SeEe_NKaxbpe{FpD6B5gi zq}l-dMPEky<{|Tz$;wX(Nz07RO=P4MrB%Ov+CM-00j%@tCX{r31@C%w{?nbhM~SqA zWLkW32)|fZ(DA%Ww73b~MsM!5#S-J#_*gbErYgI7Zfx=Gt3D2i8-t08#j|ddHZ~R3 z)14>`*TD41)Ei|tLZAfQiH0-B8eA|qDu3vN+>rzF2am`p!dy|UgWA?-tlciSc&NL& zsW_pvTw!j4zZD_eJ2Z`zR+v-(ZG!<`BtKU_nr~QsT1nf}wvqnf2e+O?1aZwYtt_>z zVk3C3pTB`U!3Vb<5in#YGY_I?puZpUQsZp|;l6j1GmFdMFz=jT_J7uUaf*a;;Z@E74`i!;}EQafd& zqNuNWMDM~OU2V{kJz;5m%GyoC8LjQ+t>%GIbpxF%e;seKE{0+PyEtJnew+k`Fe4^2 zFFvmzzMwF^_(oY1D4IUG^0@VOTlb5BfsT>)pxQJzKl*MS1}jXAEKZIhM;K(>*FE;~ zY4?M>ukK!ZoS#z0rpJf*M+aeXk~nZT4<2K5`hF3RAh<2u8F>U6o1=X{PMnY zx~}v(Cq(FO=8rM;ch>Zta?kQW{^CqldUXX7D)|rff)+#(N2on=c zNe%`{kfZqhB_-)KQ^}iglKnt^ZUZwX2;8SmARL* zVhZzEC3z7=Sz$SKxtF_M4z8_!2AjJ9xvZ@}RyLqG^V8FNt(ly>q`;J{kdy*;X8VJ- zwdD`XP+u{*T%T7DMdJc;0*}gXX?nCWD|-8)FVZ(E3LVAs<+fDcdw%U%m@_%Ti7KS? zpIv=MvhnxU@v=T;a%$gc1^EMq<*n%s({udHaS-A1 zX}qlHjCe*o4IAX+?1Oj4@{KkrFf$$ll|ng5Ke_wtKa-d(c` z^!-1^-ovYj?S1q|*|U=|;5onduC>>!oyp8((D}^s?584B|1qA5;1~TNz`jnZ zlC=KQ1o%bPW*Cr@vaHbx_YK0AJQ42)a~3hcgSj?*YwYa6rIY;^`@4pkK@gv~aIB@T zB)5F9{~UOYlcKU>)v4(T#Vne?!7l5ATP#es+nH^(HUG)dYOA%=ZYS;`me`0JXyF%R zD+#6qN-e?A;Rk(l0vM7Yt~{6@9Lx=YP_Af6WL!{8qB1E}ot~gfObSj+iOfk1&xsAq zj0#Q-lg0(}RZ?bvgc%UTQNk%fKEY~sNVIQ6oFE!Tf?sT^BsEQzo)(yq8kmtAQB<8? z*IC{>)N$d)>HDu9PtQ++VH3RGe}kfn>{>*V6xiYk1VV#X2di`>*Khad$vsW`O( zGX6&Hy?#Ia>C>nG11_XB$R2`RB%F~%cz(gBybPJYYmk`mpSN#UE}g$uky~Gx(O8*W zSD9R2mRLVfcV_D8?C)#;f#BygNMZQ!H>3?NYyP}`@nK;?X=-3vQA9~mMDgk7)1T%( ze*W;++R~qoZ;fR~U)cj!i<3>u_Y&1c?N{h6$ryJY++6cO?W53K$JJ&*>@{Y&~%+6P5XDE}RMWISopqwsKGr$BLq@v4I-ZCXU zK+Oz_fIVLFaBjHTH%cvtj`WLDvD7N4NGyzv^Gk@~$Hn_4Ci%lMHZ4Pe3|UQi4aXag zU+TYl=fcA$cg824P0zmju(bFGG5&t zS=i41z5;Y>{#=;-?ZxQK^~;Z&8wN6xN`i$EKBg?T8OO&?Y-hx=G2$H9VYhvgq0L@* ziyc(Ey`Hv**#c%{c1q3olXqYPUq{)Y5naP>l*2Ilu8go1!8`NMzKKKySu=HdPE zy7KPy=#spIs+!#P+PwDaoTf{s?!KQ~`~A!R1EE$QKmO;#8t4g#+&h6^)cDfz1W3`ItBar65(ke&Pa*3j)xu3GIEofVVw zVtC@k!`D)Gf0;E~V&dhx1LDvQ{jzE2-tTtrhh~D`?K6h}=AW$HcRBeS_7q!i!IP_| zh!VY3X}(eMobX6*NEH!DTm_+QMR`KOrQ_$vAHR5XZ?v<0AWRi!Z$`5}LKS&Sk5;q{ zk34_%YHIl2uXR>C=$VoT7>bzT8fc#>eC1C1;Z9gf1S$x zVd?XV=Hu+l;_aJ{2Txq+?>*ad>{Lrr_u$Ek^|i-JitEpuzS!K*k(`j#)p_E^g*!QM zdG6+Po4pR^+wE+2yHfUf+W$gx+~wl1i)y;f-g>_?)xfn0^DurAG}1#JN(%__md6U!C5icGdryr%eEMSK`OwL8Nl_{8j^36= z&J-(p06+9t>+vT~UyZ$(d~koHsj?}AD+?1SR05@!3+s6Q`6sBJ)k_F?9)0ra<=E@_ znT6$r72p@63R^uM5rcS;AsKijOEL}zlgH@HR@zgvbP&3(o(Klj7mW?@g5)KcCBGv1 zg-c=LbSu_%>OKA;Vv96kOrMq}VhN1*=p%`;9>`Y^3O)e?I~s5#$tig}z7*`&?m@yA z;02J$cLjj|d1VQ$i$6kL1*ld{3~jL1@)t-D`>^!;DwOeA`UHX-j9Sm0PFy^Dt-tq7 zXXo+ertYp|r=bWyMP+kqbKi-sq0FR$>f*Yq=dU+cwflJo&>^&SKh0vhz2!~^>OLoT z16S8Wu5?o`4`UCik&A8ki#>J}BR6jcHs4biql_=iC~dFrxiEP3&gF+s?mvI_ zXyV1Q=@-x6zj`@80RvXSZ#0uo*#j)V?^eL!@aEkTw6Ox4@bvo+Gqb^zvGKfQau27y~pVQ+kF=Kj6s7k|Ciee6tWL4A5$k;*@Y=PvWI;dq%d z>89Qc3ntTw!*P_don&J75HT&-pB1VC(U#e8ta<3xm8TPWGOUDr zN13ZB$J0^n?Goba8Y*%L^>b12sgN2h@%0Kwj?F77sDrqdYgZrlbzjU%EQ^$;WT}gD z!b^(ds|%tlj@9Q*L&Wsc0oFUZkfMUzH( z$)o79M8B}gl;VrWFFd~U7~-#lrBG*8dyG7a<;gxd`0L{*6EL9m%bhzT_wNnQ&dfuE#tIRqp@-pDY{{L- znX9ux!vts|zrqs&9}t&X{7Jw;zeQ3Tsk>;Rjog4seWN^Melf_TBE6zhjP?2bik|LU zJ%kBGS|^18I?N+xkOUd~kMz$1PZNsPhU0Zc0R0yNJ{|K5$@>s32?!%83@oDo6F~UW z8o;~s8$@BP;}_h`n%_TYzN{>wcv=7--_`8&{LLHp2L{e{_nd8SKUGuP)!YATV`E=M zans4}3zdaO(-YFq4PH9k`zu5tri5nIj zl2RDKcNaPvI$Q6twBBcFXJGGS;_PTjb+L5wabfd31tP92TooT1nUN5imz7ynSa`I# zxwpUX+{u#{Po27a{P=~wzH@!OL;bx&g9E>w95~n2aiY0-prNt1y0X2zq`4roN+pf} zJDV>nknSpUvh{H=XE<5;xLC7Yt=MjsY#)kxFDLX_&$)f;}+!WDruJvv1}XAuk7N*DQa2`(`0K zp(KP89m7q4O4liYsXYyS9d(@rDFp#63FQ|%=Ur60A8kyb7~pqD4t;NQWV?;Q4hy?| zj^0P;d{d^_+(%&tG3rc(jbE^X6#9_`IEq8)N`+@&gfOB!rL3>M=g!%i!`Fu|9lzL+ zUkj^UiV?-;kge50dzyn!MqKXYp=;2O`}K?I(Z|obntPz^u#_DD*5 zo#=zdhi=~)xqfr_?AdFbEqzxnUSF8ifaC>uSM`D<;i26CrWQ|Kx)8XK$Uz>d4+2r} zS-U{quphnx1)GTL_y=#1KEHU57}v9;=_9PaA8>{{S@&D(`PD}lGl-U`>rHTQ1tR2Q zJ->tk3>`r65CskS3n&&E<{GGI^!dXg3_uu3bDbdm4JsY20=anT_=UTg zn_GdHnbT*kb#)DO_nZS*+S>>Fdd?T;)^@iY?`!W*OUQ0-=)QOga&q&MVzR-4-Co^E zv!a=7H8tII#N>WG8&5sLX?2a6+4HfBz?CKMY(2WtZdYeR~qp`(q7v$c_^%|h=3$W_p8clI^BEu z=B3B4#^+`xmzFh9R|*QP|MxOddjHg{LKHL+LWv@uq3YD1tBBt(asG({2S27Imu1Wh zbO{Jx$uC{Fv9k30rw{-6{OSK)TmA3JSBqzQuVuuRg!(1XjCc$Sv8Rd9{Rr3f2*=UT z$IVp0wwHU^h+Ql>9u9mzrXp6A8n4bsjn6O2sm@I;QTm2Luu6<~Ofn-Ootuy(jVsTo zN{`J+j>=An%1MsQVLOYwOgVf@3Dc14wukPt-`#A7t?4#1v#qAa-y4|!U~Ik#no^ls z|6u8`&CX??8{H6cpWQhYtN=THu!CQ?OF)FHOlIpF>?R5GR;J35OH<04N}H|>UcGwe z)`_lD1({_$rr6z{Zob>hZjYt2frF67FG(%AGI(ulMVhk~VQmj1eSWne zOehc$1!9rd>Q5j#YaKX9Ai^FLc?AQ^N+jciby~~s25p(7bpyi4f27AR{1Bjuxx@Q0 zwi}K?zo@4P!yNMq43hE}=5Q%I$ot1vBR`@Ep?51Pd_jb;rBr@VW&bnouyK>zu^p0nMZgHSmK4Ac$P zolUjJ2K&#K7SwNFI`xoxsJb&vfthhS|k2Uo*R<)NG)+R+~L(2iIk*KesKYMuZ<>YG(ESVu}7_#sn4@(0Ll%dw{3bIZwfFl@e)DSbd`d^D*2h^Aa2h(2~ z&6h>+u}*)86h!%0b3IL%-iBTZ*FdS4?Ap}_(7O;U*ih{X3SxZt@b?;|)vx@y^yVYv zQ^;LZ0kjalQ=qE}*XA&TYVPN5A#peIb2j8V?DKLp@bWTa(u};ktvE~@9?h6RH{*Dl z`??=yagRV9KYx(}Btmk1pgMu2FWW}su-DykE5&*n)#hgxo9(XlJKdn}J=6qq`q|O( zX9{&E)pNf)%g|e3&V`W;ft?@f%qdHrH)GIMPJ8GzMi z8QY)N0rhVRv)+F66FM^#hWA_f3t+;%VSe>*a^r6iPGo(4LGjk|s|PRW&uHZf%r5@6 z3c?pnK7$sGrSK{&lXc{75W!2DHO=A&C_kuKSetzN{`$4MeSJf)7H(D|mKv_P7fS$jVNH4;C~FZ?#Q_<4Q-R>vqV3mLfP zkeLfbMK1j{1M!xcKV~%$AdLptxUiXe0a#xCYaV(xK>2qV$lmpNc6JSt;wMHX13eW? z3m)B+O+VxjObe1TgRT<%BHQxE|Bb?^ke&H|L0@&v+tnmVY8)>yT9lZdT-D!xsit%w zRFW-c#tWRo7>*$xX8tq-F3ZB-ZV$t1H{EjYf4Q|$-i~;!JV5Ux9^Nzy>REk*~`;!-a}ss5=LTz_yvk#PV$KSxj;7_1g+~& z(Xx-<0OVOZY_Ww3t#+|n2LqzVFY1DXgSAM00aZLmelg1%fzspj-@e+wFGd&>jpZq^ z#Zf3kL?y~zBs65*#o-EYab(m&>vZH=!imF#9~l+f0fb@Yi%ifuidQsWV1@euL@;tdxT4vPKa1U=g};{mFy-FP@FQotT)NnuLnAi^#w= zxiT~Jc@|RpVa%+}y&dkUOXOV+NRo?keCgg0{cV zT2yD3Mh5En&(rT#pFWwocIgoWPD7E6?xunK)Dks6oMp1?`3T?HP++|qnm^L4w!7NyaCg|@N!{)3w43R6z}J1RkLwOkx9#rE zJKUfPBxQ%I)ix)KZH~4(ok950cDi_MccJZYas1iIZnM4PHmI3EaoXkRuoDXUIhp=s zYqitG>}LlQCijDZ`OhY1KO0-`we+&~5PJv`f?`VJ^Nu(6KD_Z{4BB*#ytsDl)`{b1 zYAYI2!c$dzl?43t0##B(T60y~{cDfLM_%2z@u;n_Cr*{fcjUY7quTDYcDAI!n--FZ z(CJt1cXk{2`iKYokBy zYsmLM@Cynv1ac52Wn_6q0~Wuq&IQS-69<6L|uIuS+?1#!cowdDHxpgri$sJXljipU;fvPO` zXkYz+%vI`Z#ipBj8gDT+*koYxgNgMvTbKRL9CL<0#W&bP63-3I4@^!Ej8Bk3xkaVi zCjiRzi|9g;w^-yY5qnDlxw26Ikl3J@gy491*wUghbCb%7lFP~=xGU#qPjmlZ|AkX0 zuADt}edyGUOTXSfee&Aiz?DKlD>ngg-3tI}a>q>K)@)IjFBJz_| zY00XzC`oLXAR6ibz(^D&CGg`C1+i(O6bYm`82H%l2G^K#kV}A)6MXLcjU}jeN3?Q4 z2(SJJ*2`;4f1GW-m?Tb53Cb?Xse_o1Wym;K{TobSYajj_S|>oD*ZbE?ry9?5t;72^QEE6&||i<{*ZSI1xI?gyFleGIqV97PCIB#}w+2Z25)s?!<*=4u8!!{?%He2g$rj|dO+w7${8`Ig47v>@rvsIDGq~fef zSdtt+cKYf$SWb+M+Ky`; z+LOmGu3x&{T-}-$o~#xqB1GzBS-iKghr?bwfu|5e?X6pndwb6`)U-9#w%)t-NCR=r z^UI{>jD;pb64l3mYBpbmFXmK>A#$uBgB1xc{s@mZS`-uBB_yfjjNlYiqE@FW@0qKZZBzw?VOMfjDl4+uQD za3WTuwelANu~7a#N;xF14?ls*VJ(9pS_2L#DRNjF5mBIKhf6G*V%TwyL}LFuCHwGXzZ;iYAnsDX{TGn3K7ZH$< zn^4$O(W_*rVq__$iPe<7RDS5=x?SP++07@t)Tlaa2Bj~0iicnSq4P{mV)vz1ZY;23_0k|_=Jkq7Zq zLA=l)UWiHJ#ap9sk6|C1pv1(y-v?w9cHzrmX7r~E=7RScRl2VlE zS)qCPF=cJV9RoE3gLQ)g=qy^<9iPEFQ@x7gAmZ2aIkoyr*lc1P0N_GH)*v!OYW=LM5C=CkTq{bGF+44oDY7Y7D$To!p4AdHk}ki6QGl^gSa z$rpwGgghN4#C{}>LE6IlcLT!YM=)@KgX7iM)VZ@)yE{&Fx1DTn=z|q;Go+|gwznMZ zDaxv@Ep5+FDNhc|JDT5?8lIjIlvJ157|ab%kfl^5)^KcjE(SES9TvZA+I8^zeHNRI z9JZL#_c(bUbYmHK2(5V{CxO7lSIm%w%OZ2)vs%jPhq_MPK6_*M!ox?G9^E>B``X!S z7y5s_+&y%@{nV+3{(+;%j#YGalpi}*+0$Lq*HPKkR^HiE+}cvw-d^5WlU37P)Y4yf z0!mw-X&pM(@$0pdw;o;`d479h^2zMmXY&)!=H9(tS%4;J(`!&&`NPtmkRY)1=7Z1< zuwvM3cc$#7iR{I4hV1m|OACb63k+X`vFmSe=^k$yf}+z%e^w+x%@ABr3&OD=mJ;}d zQao!*f0t*}sd=$cqNI$NyvfNqC=j~#@o%Vc_xkDkobW=4vw~wQqnQXC4lo?{c{}X& zu-}eaG}>)7#=@#It-V)!&t2>~-BsP*T;5ojUzr@4 zEEg(-EHT$xs0xazEUmqK_VVzp2N#Z?Qwf!3yG^Y2n)^6&B14jj3Ts-LduoriUAlNv zGrx>2%!pj5WCid-4R+v{Sk+>2tYwoB!5CZ6gzkHDph`i=f=?JZw~-Y!E%KM$t+BCL<8E8_^`Gxw*v86V^3e7J$|_d zA>7;1(A(W|qQ0`TsiwQW;#hIk(W-*hr0|@=l#;@P;z+-!?6ACWK@^19LsKoWvtNWX zJW3j7yw$+?r^AQ8+iUdwVe2iHt~;E34$%3=J_0ECK$VE7q5yaQ01tnmyO`;~^`i$U z{X){?GYhkdYAc$0I!|6YcVp!4=s3jHkGy&{_IC2s%)7S>P}L2_%#>zkdhz|#;^NH8 z{LJe7`;T)oYY=s*S@<#wi{;smP|Xqz=zTT^3+LYl?qKUf<;In7NFOl1QdRBblfx$JiGI6(6}NQ1Nyku_gv>?1Yh2AT6!wjw2j zXV~zgXtE?uSgK!CVQ^}hI=3_;zagu-wY0INqNyUUB0VlOQmF=KkkG@|pUxM1Z~|DO zNJ)5UT6url$;)T1-n}(^^}@}rw!ScBw8cIv<6UO%6naBVD}=E5%QjXiC3J z?+#o3VBrWAhWEQc9J0tp1QmD`F4AaDc&NKFiWeCzicCO0D2VH*Vs@7Qj4q8(uP+57vs`*(C6 z$MSa`yiVY3TKa2xLX#j#NfM?-isOdP+yJ_vn*(ad0%`sL@5*0`?>;6evtmSPYQMzh z+J4AhMEtJ&ff~O~tz<qJymv7y@@!;~%)t1`!g0uoDOH4C& zGTLQ)c$c}!UI!i{-~{*`pzcCtOGR1z*)ta=CubKImXQNU2Pp{Im4y{j1j9rNuVxjp z_3^+`t^P;y-Y~ZM{Ng=}iyyT7qDtm4KB3BZ3m-LeALgbPAo^~g<8(*UiPrjo zmb(7-`u>)huDar;f|QctteWh&f=Eeh2rnXx7p`O|6*QU1!B^%i2%!fG?FAmjK9;+j zjiHkBX6QwD(CE7(CO??jZl}=px^s^({j4}5E4JL;FAVzVN#c?vvDwPx+=$G=*xd4z z;)>Lg!uZ0>u&iW7VvIN{N)(~?RflpzLtyaKp**#U9TLI`RdH1j5Ox(16X72j=^qj1 z2QmL@STzUw1O@ZMRN^S8x2fcZ1hRr;kjn27NI&52vct*hM+=)RHr@t4e)dw4hqSe| zAM=a6#!xYD@y~&#GZCo%Kx$l2>PslbLv(Y1h7M@5{MYK@ALZ$_q5Qa5X<9*Y`NHhS zW#|jG0$pAHn0hgrACn&^ii`D6s4HzKExHkLQKtt5fQ7D%z`BPPCpFXzA;1?dfgnX|8FiEU3y#$c~mr$XH^DyTFg?>u%`e zy3fJ!7mEFUC;P+BeqQqYtjf~-%A%~2)`s?xk!K)w0bXql4I;J*!Hd_wgb2pE^tb%N z!w+=8mgHBbKco5>uoDVF<1NMnAB^XOs|6{~+A^(D2p&j3h~-KC}8e z^|94mid_GG4WtBY;VcllK<*->{4cI)-NZVt@zVS!V$UbED4t)NnO?egbELcdB(ybb zZ|-Yv>}@&PT~pRkm|2sTSe74K91ht=Yte)oHDlAv z7%V%E{Xr)PG&0_5ZSjM(;}(1G{WPwjm%x-IFlX_t*djZg#7W>s;mJHCk-`XQd{&lT z(OllzQ`dW{^~9~Sx2_IeztDU6Wb?`6jROPq{XI3^Ek!L&g-uOGjZMXke`yu$#lJ2czZvYM4i_dSs59S8%&)8h zxqmJ}p47xLG;2%rjfxY;)Rs2B2X%ev3)I-TdiHKiU|cX;87+!D+jVAQ=;r=!2`9KJOyMcI+8G0kz3pg7`9(UFd=`TOE*a2Pb>e*FWk~bY;`)o zS6*Nb5o(2{7~Zd?X1x@~J4sPX@(b|79IMvkw{S4|6Zk~!H3<_L`K|s}ICsV|Bz%?im$@K1!+X2A?)fU8vGAo8{4vaQ(OrVNiGbQdGKkCULiy8GUh z$5r|Dd=IJZZYRsFP#NCV?q^%@a(W){U_ca;fv3=lD{~Ub!8qd;{P4uv(dqXS^Yc@hh3VyasPge<@!jhM zRH$cC10Uz#EWUp=JAHpT$Tf%pF4wITv(1)r=OAc3%rN0_o&Bn-+8}iTYGlCxC-RHo zcL{#UQ9dydeo?0eE)i|N{sa|zmIwubF5#IW`EkApVdA*{o}q1*p58aQ+H?3H_0?w;v6n<$H=9dvZuZBI3H_OxY*Sn`_U z#>UFFs^Z$7u9I(GLuB|044{(a5kLmtF6I<7`%nC8k0${k`PGt(E!9LBSVS%!I)1hA z>ikCp<{-WiyxKwdc}axv1S1S{tUv4c)rw#^kz5y(clECm&vW-n zM2L=tp~vh$%r(DhG@lk1R~HsnX5VQZ-Wurz(^g#{Ejd6s|F=s)s7o}@JvLH6YKPAIIHB}fF;u(}Ij*AwAs(fS$u1vvK$au0q zUzwaAq!x$8DiRaJ)3Z{FYpYtD>$}1Kb+Yfm<)Pab&)kIi*f%cTgV=_Q&;qNij<#E% zS1AP=<3=(gnZ|5}8IR*EuBd3$@%se|^8DI=HHsOPAWVu5h#z@80miF^Wr*zh12P#Q z&#^wgHHs4#BZyCpfm*do&=(S7IKg_>Sk@WF2#fN88j*!lZ)e}X*Ni?G1AQJ!`GxW# z>xx?*-W=|2>FQp(mE-N=KGb=VdBQ_&4I99-x zcsa8u22SpVu0F;d3~O%|l_wXf)8ewT)AC_C{PfWnv{uy$Q{Ac-f7Ip{>FvZ6lkyk2 z8g;@K03qk=$klq9z*DS)7y2mxH98|ROu(%Jk&}=l2>Z1nSdT%7)7Zc-e8jR?yZ$BQ z@5fcG{MF|dF8+_?!mVoe>lU6Qne=s@M zKlmGdAx()$cF;iJB?`~RXhSRK|0{lp1SkzMa1o*13#*IM%folZ&-PzF)-cd~w5z4M zySAXIEV&{-svtHX338P9ZvISro|gsN?T{CB56$&3o#n*8eEI&vN3Whdn;d^WIsWYJ z^~?A2(#z>i0@FQI^F6MXd)y%#*ZH7_yP+4ukj^^d$uaTfLzz<>f!t9X>>`WdMpPvf zbr#m1Jlft@(b85>*N|CR5noW5P+S&Yl&VUJQzS&oqr;?O!2(4HUlqzzDSYHmEyT}F za@*?(?Ng%|5iApq7sy{%NnTzJ5!MBzFTX6#d}_>Ti1JW}`#|}* znwi-(fOm1_&)G%DJO1r_@6{l8RU|tuMw;~K{^;!dhuOI`=y+0J*bu^0#&W{4!_wcr zd^h`k>11<%3_Cc2E{_*SpXoevyybYfUx>n89K}?`@zv4%&=61mFq#ZXnur~RA_~vf zisg3D8NBEFzdH%p-BOX6lpzvVIhpy!diZH zB3KLZKdpc95B(#>uv5Rz70C{sKr{tP^drJ5h-Tb4&_cUL-f*x!y!!lZz)=6A{v56b zA9dG+7-?Nl77-^2Utvgz=;%+R{Dnwq6deun7gXYf-yoe0A-wPjY*t{o`UlBN>_mM% zmLP`$mU1AhL1eFKhzRPrnU&GuS3{?-bhaFCs5;hE0mTg4iy^W;G%MII3hX2d2R~P1 zj@3R7tG%vvhHj;W^$#DteEjq^j3>|DLg?o6@yQ2wMq6w8RKj=4cgg`b>LGWU zfd|6~ipKl!%{e?%AHEq|V(BZh69{b?{?4o*IxmC;Yvj;mSxkOpdPzn}OHF%sOaGbU z7q6eYbL0G-yT9JK*flgz+tXd%mJyf$9vRzh6tkb~jemr69xs1uQ3NpP5yCL?@q{&| zyDT%K3^I;kK&!8rmkUrRFWM_y#a15gJwFSrftUZ7*L;~@{QUIpOC=*XoE04(YCD4{r%sfgf&6vXF^KYIS~&TxKWo{An2&X5;J<#biH6~|-;gWgLO2RREB zG)aJqSWFT4+4%}>`2u?(%a+S^@|Dn}zIMK*o2`!gXnttZ5z8OUsoU*o`&}5ube5@? zz=9oU=Nsg}jbX^cJQZoOr1JFA`jXmH-KQ^}yqFi3M%(LTx5btUyc;vv);zJZOzNeS z3&JDSsih_Lw{JX{eZR0UzoY>pGXfUp@FF)56kUg=Cnz5uB?fBcGDa9a>LZEEt72w1 z(1AmbkON5P|3$n*X*;lnLA6*ga3P}*LYN>3g&G3Uq{|phbeRY+A^FAdk_aOyyxv-c zsMizR@R9tL4R?rs7b^fd7cB`L$&r4F5UezHa3Ro0fk;M1k>8Tn!AQcv8wQ+<_uz}* zIfzj-(9NKrXq@AK0;JcK*;xZ%*C0Dst3Sgk7?K@Or1bK_8W^b-A)Wy|M}*B8Y^2!u zytIJSX`KlRL5)_yIPRK|*F-1?lHi*858yAJn^}UagiGh|_O=gUA2Bq=&Q2_i4M`95 z4dc26I9u}V4|`G#Xgs?A^=psrJsf{9{PNM0S5L;?K6&=$>F68q_&k3)b@lB1;*_J1 zjq7IWbdowFH?g3mpuVZ3g>LRmJLGM;m16L{wcT!ag?o6WBrSm*8Re;B8gsl% zxkC5A^pv8hnYF3+A7|dLT|Rv?m=zw*jZp_gf*GkvXsi8RvW=NDEysNf*?9q#Br?04?G8jXin4Q5g^5ODsp*?2!#&4I!_Qxu!JRr?*@1QWE{Xu%3S@)I#|$= zYd8yu#GgC>&Vpt}TGx_prHoC`q#BI*CE>+^99Rl(Kv=tE*2_!!zvq_(Pz%@6Cs-tc z@1A(nQGPw_-*626EB;M_!|?zG^2UNghfr~~SJv^1KcdU(QhjmQBzkXvh=c((Iu^lT z1^;^RiX#qN0)Aori}YtmcF+y9C`LI-y2UT(#=tTjAd4}=TCUMYB&lIQ3^sZ%=|nvK zA$T?x7gpxyRwrK0+`0jED$dqcw$)a&mliap#T7>crAW9D9IC|Aoatuf9>5K#E~z_p z;@6uuA3t~u-8UwI-;t-UN5|fdjZTh_Oy9Zkq_Mm`)KATItbngjxwV#G&@g~9VbqTm!<~Nl`MOXlcBTuE}KJ} ztxUE$8vX1D{Z^zjRftdciRytUMo27EEph-SwV$t(e^Ok|1eCFzT!Qkpg-K-!Mwpxx zmX}pQ6sATsKo;J8sL!dFd&-qQAhW6I?Jia!Z7Mdpa zlqx(>Ww0bkG$ho6IZkH7m0Gg>Eue5Z7y6aB?RRlK>_NBj6>~zNRm8Om52xQOy?eL( zep2)B(i4Ue(|$MA1~M0RIlAtl3M{x{OP<(*BQj=4%vmAs(sX$O-5ozv159XAly$0Bub)P~8!&TTy-xp$5YiI0Zqh z&o8is_mjdGA51c+5A23HzK;G*RGvaN(6SnqpX9=s2%knm8Ql^LBAQx{!43S9Amc@` zz6eIh69Z4cmqflOV4@Ycdh2eqM<;(_LIMRPAHhezp!oy?CZIy&ukgX-VdTYiq8vmm z5@h%QB+;}!9TX^~zaI`DKf;{k7lNfBXCE=8`Md&10%C-C#fkhloe&A!MKaSL=lg57 zKruF6f$$~yg$W>xL@=0Z2&my(_=p5CDgc81H0{d){wavJ4cr@cD?|9l%sb8SYvao_^>O;e6%JgTs0h4bp4Q7VND^l*Adl2Ro9L-eA zT@+jkKenwPJ~CtK-G?`mny2?(s(m9A-l1}C*twxwsJzd+RVZG45thAlc?dg1##3B8 ze`9K5ez5Iqpo=KPQ=TA;AM85STG|lC3zpL)p0AR( z4rsy_OqMM>H6rI!|CQ&@=jP^qo1XbFIlcULYH8|?X7u*Bz+T{KNVogN2~2-n3l7_y z73HIbKNFn4Yy%JKUI(gyv*pj$_PZ!92i=$!ERG$QFR0JHKELpg!!hKej*rI|$A_WZL!v_{ zK!$TZFYC97`)}FwkOI8!G}6pbTd#tOJ?w`N9)R0)?Jlgx;q` zGyr6smkWZ+J9j;)6$UKAiQ~}G8>uSqz zw_`zhaE6;eDpE&=rxxT_9j$6@sqW~n>Md5~DO>_6+ilG@n_2I&r5L+P zSTcO$S+J)(jIM+*FqRQl;3NrC#=n_dnR>I>nBNpa4*~r-TAe=rd}eYQB=XAW%`r72 zMCmSvOr?|EXWl%Y?x^TixCE)4WvTu#Cz|_mqcZ}WxN=v2p&btvwrq1I?SPxh9;(*? z8f%{mbH9`KVJgeaL&cUCXOv&NbZ>fkX=+;Yb_Obdp=w~LAlTIMJ8K;PwJ3$G(6VYiRsWJKq=N@Yxy*eftd7#1RnkBi7oO(-nP zsTv%Bbo+^=`4vbVT1KndujXRl=o@~K=a(G%!0OM*v;K`=L?}vuL4GBDeDGYKUvvz} zVuD{1VG>>>Lt%vrQ0wZtlad$lyMCavh_x{AixGxc4&WEaBJbfJ`Gv<7Kd~ftFafy< z1N2GYZV~2sF^X_7mcj^R-OB;DusJU2rV>_ zuIOnw`RwlV2u^5}Pq@?pD%kk=Q6;K?C_jrh+vQ4AXaEk=jk_Z7bd4P6Hneo zK*X0@KqxDuySDe%ncInhNirvCxT_*BFs(MFLgo&g8GXbSOdn&qry&gr{aNp@Hvie$ zVwa8mE_>Gl)F76;BB$c&IjCLpa{8U-_4MK!*iJ3Jo?Lh{rFs2!@#U-8SJ0*L)$Fqe z<05wv%bMf3&((I9gY90&Bik(uw;ID=>bBF>^PmUI#z#Pth?yZ$ZdiC=Qc`42azbuq zdT~`{)48*kUQbLefq6<--{vcKgyIUEg2Ie<0-kUfggRr%3tK$?(KJn-0%yUTRD&^? z`go#mbx$}kfsZhdOvDnLsM-PRZmnMllZ%Gr@JfIW?Jia{`h=y|kUaUeR ze$nykE^NUW@zql^y4E0SQL@Cnn@QgSGZ2=XxM0P4P&}tfVaT#{dykT;25Q26DB9m>Qt;rg2S)%jUyk}`Sy>iwRsGqtr{dAYUmu?0~P zSxGSk>9NJ}>b#`jtSD(>h%iRMR0q)He$M_Jdp?9Gc^zT69;8wCx;pH0G21~g+F^TS zr}dHT=B8WCEw@-&Y&NspV&=5d)?vG~^FB9s1G=A`pO_+%Q2fOXV!3-zxNk&JY;k2` zmBLdQ&Wlp}N8Y|M{QTiWI6EZNQyJ(a^FGXE+xRNP;V(ueJ4!l3yn_{M3t2YQ55P6$)GjI|l^0LU)#!cvghi&W~m0%7;Zc($a1pJbs6VZf>RR17h0bY_{5?%~Ac{)A@f5Zsm z?YI1bR*CV1EmA3ohg>I%5yD6g>W(2UvXS2n2t!9veSWoQ6U%db%<&wBQ0j(0zxW2= zr}d%JpW`|;sj*efDylB0QegYa_YQI8&qqQyUM+24hz?D7VV1i%t zk*JdQbxQzC-lz621^l(fFT4VDX7m(D2Wfx&P*<= zDr_pxsVU8>&QB=IjV?-8=OidnBm826y+Z?C)yT3Bh9H z=M%E2GL39wBm;swkuK+NoPH!k9q!AO$-#H@yt<8eTkl z9WRaneihDv3C=~cy9euP+VV0>Vk44O@(7-f$lbxi{Gi#P?FSG1xNqO4U57RwFxX;Z zvBTD3AJyB6#i9BNJ^cd(AsJBxS>Xk#>a6UPqP)!V?2PjK+^Y7L-g|dPrl)2>RVEYd z31$IX@DHx@1d&wY$v^UoWics&|BYYt6FN&2DSSzO;dusM60u(^H?`7}ppSr8yXGbJ zXMh(El1&h-m|vnbFaf*H>_#5*?F28SF=F_}V2j}TcdZ_+XLX?A#~8NwG2ZY|`)rf^ z64h}r!sxdMvlTqv@Q}m6ZvgEnghV6B#XDjBi?nD`kw*Ofu>oGJ<*vei<-*6+1!QnW z0+c`)3t8RuKOwDq83Z(1LBjzMO9{c2uwF)1YrF^WNAP|le4+cW&JIBSy-1Wp#1|pT zi6t|#iX$lu$xZ05Th+kocotd^YMzh2xqSAhgk`qh*c7*|m8YHR;Kv znJFcyu>~>8)DS@=G)O`T`{IajX>?q0N_u!!QEXX;GDq$iETsiXJ!LX)d6a)#QF2X^ zA}_#M5$LLvd8?{RTb~TS>TesA(*lF(!D6QD+|Z3@<1=r@W>V$JAs!03Q-Jp&2Ghh_ z;L7VLXjV|AVV+7QJLt;!8_=F0BRoUmC{Vb_k_6DWQwwj8T`r3|Dr!I~@eK9u+b*I6fy97uQTo9Q8=s90o1s}u$yqW(e zgyAeel@z`hUJ${!HV(!dUlwgqgfkkrY#m-!lMCmshY^$!3t<3o9l!V(xFy0PyiWf9 z1BrV461BFVTppZAIHSohOIYgaj9_pD3@>cI<@etZ#z%fVUT22Vaq(4v!X5;m&VP+h zA-qUPSI7K<%!S8$!@`-ol=ccbUH}&IE4VUHhUBkq*$Wdu8xDZO;DY3UWhoe-(3+QU z=@Q0dr2S$I9IcUwFlj_Cn&=!)h-D;s@oM+$M5is|d&56RJUr+v0sMlLM}nBB8vu7g zI>q4a1ar;8s%Cy=1>DDz^P`Vno;!7=wV|u3w6VIXv#EKo>)23V?}gs(^X<(iI$BN+ z_WwF`;?gN7nAv%%xv~RXJTU>u0p3c9S8%W}Dl4&|tFh-q$C=ECe5so}#9JN0QJ?5M z_Y4vVpS;Zs&rx{>hcZJVlyMOH^>ln{^5twsaH`59NJ^2?4|=nWnF4!O7()@{B$m^p zY2oQt&)x!;kl0b+Z|@7v)*xqpp#{r%ucPHw3xgjF_iZ|K=!XNwTMpaqHnsi5)OxqE z{T@q?Bd#n%cb_8+A47)EA$Om{uFS*E-iN5P15VU^RG0lu)V);79xCM*C(18W$Gt8t z2WTFLJ())sJTs1%BI1LaiK&eAkByNhWJPC{rj(XuR_CTymlihGRdhC29_y&mL z@7BoV>)E;4WoS{iti=;S3eWaOFipVFDM$poS}6?Qer24<$A_q9Oek!@%!T2_9$QR` z{uWCayv6(V&P6W)@*|!Azep7)WHd->bPAE+024TX__)#R{4K)d9<5Z>tl%7E*#A}8 zCJfFWbQEik)QLz;7G{myZji<6wQH?i3!dZ+0}w-d2!l4>ZeSS;FH-SF-WkHkjQ7KK z!v!~dB+!G!uh#Mmpn)X~BZCDx-V)bG(He+fD13+XWF5cADg~z_4=-rZC?pj{eV`>X z+OF4}Ns#gB+P{vt=QU8^L6l>ujhE8!#`s1>(f+-c2#^#PIyRav@$hXnwTI@t;{)kyzA`cOZV>F96sK024u9H z4y~8eiK>+Ir>~8TO%9Jv+`jNAj1{f|lQKhDU)47H;@#-@)a&OnW%0!dH(8)lpyvTE z#$j)k0iA8=CA8#-oQ1_HWh$Rgk%ONYYP=hGy6$nL?y@)k(Rkmc1IF9T?DtWi4+Y1L zEwtx}Y&c>tID@OmR=~61@+{bV3$DPDBZj<43znZbLudvLFHdO8%e7!}Eqyr9J=uyc zwDN^jvkVr|?(#rdfSMbgtjI`KW~N2vmO@%zUU@}fRb6RgLv>euZC`84!12DJyVoDR z9)Ann85W?P9JC%Q69$`dgGss1v684>lrEJ2r-Ze!U=}hr?M& zF(xD(Y|;M$Wcle#+2l3x)$~6i)(~`B%P^d!1w<$HNZE(>6UHUrmssa&`Tfd1>gIq# zw)C`R{kiV;h}R3cVd782cMiWxsN6)92$H`@V@DP+LJh#$1%5~2n@6SghyW5$43G~C zG8q@vAR=*UYT?Ekmo`4UJ32c0=JCkO(UCXMj95Vn3iF2APtlL=jg3A>{JtEU z>M89|(gFi0GCI_hJIHX};|_{6+nB+z@$q#M_?U7%4$!IKMBZk*{|6)U?GU)-;Cz_o z?<5Uy43JR+K%fUvr4oCHffV>T_@U*wogd$tE3^f9&6hgx1097yRFRBANN@^Y?gklE zQUzV1=BUGY;nBjFguukY?nM&-O>{9`t{N9v;Lvp>_h`gxJOK z!WOX%qL2`sa178#4)P;Dm)uWI@P6$I8gdU&_$5(}18)i8OA2%pxj|eUzddwYNK5=m zF&3#9UJ~1HIsLc{*+yDZGd4IQhp%pEK}O-$gfUI$sKtosbNX-dbuc3Qwa>N=UV`HF zp&)vvXhk;svy&KNeldyU7CrgvuMB(ew>TP#Jo4WsAf2^FD$Ei5qLyC}zECF$30zn& z;|Bn?#Pfi+I`s@t#pmL`4t@(iGa#w8#x59#3MTp6qhcz!UN-@B<5P&=vB?+D zCQsIMg?cI^6q&n$5435s+U4SAzyPn4(?K`8gKow<9ZhyR82>^w*yG~mB#H`%gJk4* zNqnXvGdUnNPMjPsOo;GOLCf+W&p;JR1y=4TXtpSfj)f`&vczbh<*x*yeS z*ABc>%dehs8*UF{3*laxMdW>ki;!2qmz1Oc2 z0rK?}_zIxV<3j6=!u*nSIojZsZRM8F&(0ge>q!s`O&>;f|7_RZ;>qjt*z#x4NcX@ppfj}ow3EC^TgA|w1_YDyZxiSzW?0ovYyAt&bSKqp zuZ#IUSMz-?Mtdo)6i%>zR77xcRA_oiOin>saZzeVUzNUh|>{}-hE#hNE6eDx=2RjbpPN!Cb;H|&9rc)$U`FTO*3ds=ddR0!CQ z*1x)h2z(0uQ375qzu$U+|55m2e%A$Q=w$8&esvVD<5!0m!kOe0CL2EDukgV{4If>q z#rk;5b+UN9{Rh7KD$#WM58gvMh|x!kKbGUfDS)K*Fudl)EQ3#(Fl)nCU&+-jicz!% z3dzv%3&-f_`w0Ak#9W?VgF(WJKYrbUx=UON|L)gw@of|Q5*IJ$Ulw!IRey9=|-%Gn5_)?Wz-FWl6;u)sG&&7=H5l$>>`^ z7;T@vzH{L&bRL(`g6S4~`-60geQpMOs3wQq+@L}xSDBoco1a-yoLhmnWd&8``ITkx zF{7*?r?xn+2^x08D9^2{E^4kSYCc-t1|i>-MfGI`N2|(Pj#fYkB_}B5AHm9_Vnf3H*+&HOYnkPgoQ2fw zav}x_8G^7K8>N=Of4y!HxZz`n1CaQGl@#p3KLL*c{36<7*8?GcNrW-EfHN^ch{19d zRV9K`omF**lDva;uC~8PMiad<2d%(d-5K#YeoDTp10oanwt660jbsMnd#~2nW?9%y1J(ae#xo8 zs+cW7A>x`%R+2pZtZdxAeUA@{`N!qe>$l#!cJrNg-+%GBxdTrh{L}BBd+EUZ z2Uq!GkxwMPg4_rsZqpb3^^?DS{IOp=_Pr;5_?@48|GPi_(GMQ~;~!pr<jtQ-sq2wGYLi zaDjJsbLSzBX#1@8)57p;FeiRyZ&oE+xvnhdez%|XkWY^mpn0?!p22CNq@4^66a`na z37O^%8~8Pt?q=p7vVG2VQ)YGoK6Z<7xd2cj4vBE`J1F8{6ZbU}q;X7%*2259an^RX zfzueKxqv&Zi6?lifBm^rGY>R2jh8!yr{NdHEfpMUI#h5+*dPyao3XaR6tDHY`zy>P z-oATphK>Hctne8s_zqt@eR}=&k%K3H`SaiX?59sX`NXgI z!u>Z-Jw5l*i6e&>=Z~H`_S&2L)s$bI@{2dZi4$khn+pqXvCR7$r{6xgu(WXU+{xoh z3n$Jk>h}=u@Ne|j7tfu3{rs6X{(k1n#W(+Uaq0Y(i{c{PrkhQIUg&ntgmiv ztZ#*!%R`H*3T0|LhxNxs@FpyYAqlD4&4&t=->z*r>Y%sK`L*V4aUm#8XbyQ{c2ms$ ziZIY+P7>6?>R86}m|yk?($>xlW_C6OB)ak3_@%p=%vu-cW+F^KS1Q%0rVCErD-GvP zR4~L<^qe-ohH(cSPS|f!M`+uoxN9MtXn0$U4()DRvuOa`ugo50#WtC(JDujxgx_SA zL=7g|G1I+#R=ad){Aj&tguel$WL6D38WzWty2Ji1SRXjZw;XDE5?6j%hn9f4gha;; zVQn@%QOdL`0BhxIgmt0*^;1*61GD?FEFG;&U~IGgErZL%8_d35+g(}R4X$_Y+}-^0 ztBqT?*Kgihz4`h5YwzDUe(dz2mtTG1;46Q9e(vClM;A^nomsl@=F-KpOBc>Ay}NY& z($dm}x0WvOcNGFio`3tF7cPBp>GFq{E`4A%-wL4l)gBZ$VSA4N!ZnZS{+2iq-q(R#>>pXqybExSH=-9b*h{^c zWoPc^Trjk?Og}L>t?(w)`+B+_$oY>77DTp(5t0D5wd&!KM(4^r)`!Cpq=K89x~p$V z<4FJ7+-;gveA#mTCU6Uc+q^7Zy1ZxN_kjY1n|e{1CiIlzR+_(a#2QDxqy3TL!3GE` zT}#vVz(7@mHjMOn7i_ zdGp?V;Yoadb$fMvN09PI`tZxOhB5jqwQU^I7MQVN=`O9gmXvUU21ICq}>6hm2&6jU;;j7Hl^oh~KfMRyOxoyYD(rB+>i> zKGZw2H z8bd!WwUA`?PSQ!J1t2%4i5Y%V=4&FQJrhtcD6a=-Z3vP%U4!72LLbeX%o6^eM8!6| z+3F4x__;~@)?RCLh+nbX9HbgJt_W9hoo@N#tXY1c*yK+5)reB)Uy)vKU%lY%bblqt zOtUn_hK?8?n%rpd%-IybI}d@kDc>=qI?M0^`7ECR-xpSwmX!TSgvubGuDI8{S=fxSec<(PDc>4P$wLG`Um9K96)# ztRJ#k1{e>^S#Lk|Z?XIVZxdEh^XnL%QY6MDXiZ)<{=uW0cJ7IxOu}3^ILlc#5Y|8`OG~F)!WzBDq4WL$q(F%z{G*+s^7$TSH z(uk8s5}M~w5N_lKGInYWM`O|>5}Pt_9MU~L<~L?~#QY6zr(U{OV1Iu7wUOafjHMk- z3O9}qyoF7E9p1*CDz+t!Z6N5{lMFY$Yir{`7cGD>qbCUI-4XAnjP==>rNU2Ulj$?q6p zXq5`n!106s;9rvc9Q^7OOoDL8P&Xq?fh>Zz6|3Y4TXB~vSPArLIIr4sqr%bk9;Rz@ zcZrgLB4)J#z!&={<$>SW(}sc)TGVY;wqeVc%*q!ecIus0e&g+g?bIh%RQW;t$eep7z)n<5%BrN4SpmJkAZS21 zukHl=QdOXn(nNYAsB0X`cTZh2!P|nyc10+iN==M}--ezkMxRb;vg3}@WXY?Q0EFg3 zPm~z8mY+(6lR+zlI5-W_oai8UgI_t^T-#aP9=%5h7eyRRM>m-`%l8r;;e6(y{?xQm zbFgyoTO&5GHMWf99&e`LSz7AOmcKXtZrnP*dTS|Qk4mH{ri^9zm0zj64DR;oV}!N{ zo(q{=V#tr??UOB)h;qi6J^8u+a3L_9eDF)>muVj67eyRFws+C99pt`1$1ePS&84R; zkE{KtSl>HzS~E}Ow?47qp~a(67dwnAAOa1s)A-ek;Kngagmx(3=-{ApY2Nn?2>LfA zhlKbY4@*rDp55fEFu-h?9_?D=a~k|XqynFC4S}AZ z<18JTVJ9y~Q-%$UCCn1Fnts`x>Hx)qax-6Hxh@4KI!yh8#oi)y*-kF70egP-tP!H%H)|E=PWf#bJl1>P`MeeRhI zv;I_l$eXp=`Y10~x7K1i@{i%(bSDb|u=YX!S{L(P42z{JoACh?)^HBFB7@mP{&jj7 z$zG+_`<s9Pqyz*k!Pz&_a0vTc`Z{`EKAjl3mBvZ68wvJosjDlGE*~b?))hw% z-T6cHvK$gr-a!gfvp5v+By&-M38IGFU{g9W+WWddn8$q-TX~vGA6?8sKztX;(jxnr zyU`-mI!w}Bls%3~G*1N!e$oV~Q@~<<%|Zy1UhZEG(GrHj1ug}|0KrZ?Gm$&B+*}!m z2?|C8jrJ5tld;!*>=HJOurvjfr&tL8XFQM+R%=zk{mVg>Y6;SBaw*dV=8hu3nmWaryES0W9@Ka6>yIGNzpjky$#rG(_wR<1&BWZ9 zQ{g&;(2g*Q^;gl9K9(if1P-14GHNR1TfsT|w z6;(pxH&p+(!^=@AzA!1FDGQnKYjM&5kp65a*!!|t&EA$NTPi@>jSPhk6+n|>3CAoE zbg}ceebe&^RjADJc(+kwDIms1y)#sjOT(wl%GE4;>uKbVdJe8q9;Hg{a&%{UlgLi< zD_33^$@qKejfVGzSnXH|Q&$o)Um+zuyQgNzqfQVvaSA;s1%V-r`&ZYEKtmDy3Sksz z?_Z}7Ix&>fNw=tTRz*1Zot&P9P|j>o9F4Wvn}rPcmEUA)w*T9DvV~30vDBz;%+OHD zeX52ij{dJ(0G8H$!t$9p-L724V z$1-Dn1Kt?J3Tc-D!qaFWF9W_l(QyMIG_2F!Z;l+Nh;qm<8sW}e_?e?|;HW}empCtE zZOA5dw_FgPD@iqyWwXTjZfZ7CMYnwx->^F$Cq$r@^Vh7Ng3N4tw-bMurc_Nl1EE> zZvHmluHe51UfqjNAa*`qQJ8d!cp@H9ywhNrZS%S|hN70Y+E&EF% zAf3t3gg;JcYTD$QMAE5St&4MWG|#H5>^#djM^Q5GGfenxn?M~mNH+h&wDN0;9hY0H zHJ9TKX7jtwZiHN=L35?{IsE0M{%XxFcFY3T5l2c?qr`bHCd9#Mp8B(CbabN-kQndtU zbDBrQ<^(9wN?$k{0qApE>+APx5dNjloKjduVc7eXx>(SZ?zI$5}I7W z{@#Byr@4tdRC2xaT<#%TrZZ8`O{q({;wb4!9&1wgr4VOu{>)YrwJ4}>>N0ix8030l nO=lrW*s&ZdZ`3?9>4vHqtR$M~%Ce5;$48-&4J`XJvlIUXi*f$q literal 0 HcmV?d00001 diff --git a/SD/gcode/cubes.ngc b/SD/gcode/cubes.ngc new file mode 100644 index 0000000..bfa9f5f --- /dev/null +++ b/SD/gcode/cubes.ngc @@ -0,0 +1,11874 @@ +% +;Cubes + +;Created by +;Generated by gcodetools from Inkscape. +G21 (All units in mm) + +(Start cutting path id: path6320) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3680.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3760.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6320) + + +(Start cutting path id: path6318) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3836.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3764.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3764.000000 Y343.017990 Z0.000000 +G01 X3836.000000 Y320.218090 Z0.000000 +G01 X3836.000000 Y331.547390 Z0.000000 +G01 X3764.000000 Y354.347290 Z0.000000 +G01 X3764.000000 Y365.676690 Z0.000000 +G01 X3836.000000 Y342.876790 Z0.000000 +G01 X3836.000000 Y354.206090 Z0.000000 +G01 X3764.000000 Y377.005990 Z0.000000 +G01 X3764.000000 Y388.335390 Z0.000000 +G01 X3836.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6318) + + +(Start cutting path id: path6312) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3756.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3684.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3684.000000 Y261.037990 Z0.000000 +G01 X3756.000000 Y238.238090 Z0.000000 +G01 X3756.000000 Y249.567490 Z0.000000 +G01 X3684.000000 Y272.367390 Z0.000000 +G01 X3684.000000 Y283.696690 Z0.000000 +G01 X3756.000000 Y260.896790 Z0.000000 +G01 X3756.000000 Y272.226190 Z0.000000 +G01 X3684.000000 Y295.026090 Z0.000000 +G01 X3684.000000 Y306.355390 Z0.000000 +G01 X3756.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6312) + + +(Start cutting path id: path6314) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3684.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3756.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3782.666700 Y323.244190 Z0.000000 +G01 X3710.666700 Y300.444290 Z0.000000 +G01 X3737.333300 Y291.999890 Z0.000000 +G01 X3809.333300 Y314.799790 Z0.000000 +G01 X3836.000000 Y306.355390 Z0.000000 +G01 X3764.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6314) + + +(Start cutting path id: path6316) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3680.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3680.000000 Y361.436490 Z0.000000 F200.000000 +G01 X3700.000000 Y367.769790 Z0.000000 +G01 X3700.000000 Y316.787690 Z0.000000 +G01 X3720.000000 Y323.120990 Z0.000000 +G01 X3720.000000 Y374.103090 Z0.000000 +G01 X3740.000000 Y380.436390 Z0.000000 +G01 X3740.000000 Y329.454290 Z0.000000 +G01 X3760.000000 Y335.787590 Z0.000000 +G01 X3760.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6316) + + +(Start cutting path id: path6260) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3676.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3604.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3604.000000 Y343.017990 Z0.000000 +G01 X3676.000000 Y320.218090 Z0.000000 +G01 X3676.000000 Y331.547390 Z0.000000 +G01 X3604.000000 Y354.347290 Z0.000000 +G01 X3604.000000 Y365.676690 Z0.000000 +G01 X3676.000000 Y342.876790 Z0.000000 +G01 X3676.000000 Y354.206090 Z0.000000 +G01 X3604.000000 Y377.005990 Z0.000000 +G01 X3604.000000 Y388.335390 Z0.000000 +G01 X3676.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6260) + + +(Start cutting path id: path6262) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3520.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3600.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6262) + + +(Start cutting path id: path6256) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3524.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3596.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3622.666700 Y323.244190 Z0.000000 +G01 X3550.666700 Y300.444290 Z0.000000 +G01 X3577.333300 Y291.999890 Z0.000000 +G01 X3649.333300 Y314.799790 Z0.000000 +G01 X3676.000000 Y306.355390 Z0.000000 +G01 X3604.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6256) + + +(Start cutting path id: path6310) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3600.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3600.000000 Y279.456490 Z0.000000 F200.000000 +G01 X3620.000000 Y285.789790 Z0.000000 +G01 X3620.000000 Y234.807790 Z0.000000 +G01 X3640.000000 Y241.141090 Z0.000000 +G01 X3640.000000 Y292.123090 Z0.000000 +G01 X3660.000000 Y298.456390 Z0.000000 +G01 X3660.000000 Y247.474390 Z0.000000 +G01 X3680.000000 Y253.807690 Z0.000000 +G01 X3680.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6310) + + +(Start cutting path id: path6308) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3604.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3676.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3702.666700 Y241.264290 Z0.000000 +G01 X3630.666700 Y218.464390 Z0.000000 +G01 X3657.333300 Y210.019970 Z0.000000 +G01 X3729.333300 Y232.819890 Z0.000000 +G01 X3756.000000 Y224.375490 Z0.000000 +G01 X3684.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6308) + + +(Start cutting path id: path6306) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3676.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3604.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3604.000000 Y179.058040 Z0.000000 +G01 X3676.000000 Y156.258160 Z0.000000 +G01 X3676.000000 Y167.587510 Z0.000000 +G01 X3604.000000 Y190.387390 Z0.000000 +G01 X3604.000000 Y201.716740 Z0.000000 +G01 X3676.000000 Y178.916860 Z0.000000 +G01 X3676.000000 Y190.246210 Z0.000000 +G01 X3604.000000 Y213.046090 Z0.000000 +G01 X3604.000000 Y224.375390 Z0.000000 +G01 X3676.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6306) + + +(Start cutting path id: path6254) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3596.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3524.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3524.000000 Y261.037990 Z0.000000 +G01 X3596.000000 Y238.238090 Z0.000000 +G01 X3596.000000 Y249.567490 Z0.000000 +G01 X3524.000000 Y272.367390 Z0.000000 +G01 X3524.000000 Y283.696690 Z0.000000 +G01 X3596.000000 Y260.896790 Z0.000000 +G01 X3596.000000 Y272.226190 Z0.000000 +G01 X3524.000000 Y295.026090 Z0.000000 +G01 X3524.000000 Y306.355390 Z0.000000 +G01 X3596.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6254) + + +(Start cutting path id: path6258) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3520.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3520.000000 Y361.436490 Z0.000000 F200.000000 +G01 X3540.000000 Y367.769790 Z0.000000 +G01 X3540.000000 Y316.787690 Z0.000000 +G01 X3560.000000 Y323.120990 Z0.000000 +G01 X3560.000000 Y374.103090 Z0.000000 +G01 X3580.000000 Y380.436390 Z0.000000 +G01 X3580.000000 Y329.454290 Z0.000000 +G01 X3600.000000 Y335.787590 Z0.000000 +G01 X3600.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6258) + + +(Start cutting path id: path6202) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3516.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3444.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3444.000000 Y343.017990 Z0.000000 +G01 X3516.000000 Y320.218090 Z0.000000 +G01 X3516.000000 Y331.547390 Z0.000000 +G01 X3444.000000 Y354.347290 Z0.000000 +G01 X3444.000000 Y365.676690 Z0.000000 +G01 X3516.000000 Y342.876790 Z0.000000 +G01 X3516.000000 Y354.206090 Z0.000000 +G01 X3444.000000 Y377.005990 Z0.000000 +G01 X3444.000000 Y388.335390 Z0.000000 +G01 X3516.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6202) + + +(Start cutting path id: path6204) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3360.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3440.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6204) + + +(Start cutting path id: path6198) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3364.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3436.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3462.666700 Y323.244190 Z0.000000 +G01 X3390.666700 Y300.444290 Z0.000000 +G01 X3417.333300 Y291.999890 Z0.000000 +G01 X3489.333300 Y314.799790 Z0.000000 +G01 X3516.000000 Y306.355390 Z0.000000 +G01 X3444.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6198) + + +(Start cutting path id: path6252) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3440.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3440.000000 Y279.456490 Z0.000000 F200.000000 +G01 X3460.000000 Y285.789790 Z0.000000 +G01 X3460.000000 Y234.807790 Z0.000000 +G01 X3480.000000 Y241.141090 Z0.000000 +G01 X3480.000000 Y292.123090 Z0.000000 +G01 X3500.000000 Y298.456390 Z0.000000 +G01 X3500.000000 Y247.474390 Z0.000000 +G01 X3520.000000 Y253.807690 Z0.000000 +G01 X3520.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6252) + + +(Start cutting path id: path6250) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3444.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3516.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3542.666700 Y241.264290 Z0.000000 +G01 X3470.666700 Y218.464390 Z0.000000 +G01 X3497.333300 Y210.019970 Z0.000000 +G01 X3569.333300 Y232.819890 Z0.000000 +G01 X3596.000000 Y224.375490 Z0.000000 +G01 X3524.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6250) + + +(Start cutting path id: path6304) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3520.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3520.000000 Y197.476570 Z0.000000 F200.000000 +G01 X3540.000000 Y203.809870 Z0.000000 +G01 X3540.000000 Y152.827780 Z0.000000 +G01 X3560.000000 Y159.161080 Z0.000000 +G01 X3560.000000 Y210.143170 Z0.000000 +G01 X3580.000000 Y216.476490 Z0.000000 +G01 X3580.000000 Y165.494380 Z0.000000 +G01 X3600.000000 Y171.827680 Z0.000000 +G01 X3600.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6304) + + +(Start cutting path id: path6302) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3524.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3596.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3622.666700 Y159.284290 Z0.000000 +G01 X3550.666700 Y136.484410 Z0.000000 +G01 X3577.333300 Y128.040010 Z0.000000 +G01 X3649.333300 Y150.839890 Z0.000000 +G01 X3676.000000 Y142.395480 Z0.000000 +G01 X3604.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6302) + + +(Start cutting path id: path6300) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3596.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3524.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3524.000000 Y97.078080 Z0.000000 +G01 X3596.000000 Y74.278200 Z0.000000 +G01 X3596.000000 Y85.607550 Z0.000000 +G01 X3524.000000 Y108.407430 Z0.000000 +G01 X3524.000000 Y119.736790 Z0.000000 +G01 X3596.000000 Y96.936910 Z0.000000 +G01 X3596.000000 Y108.266260 Z0.000000 +G01 X3524.000000 Y131.066140 Z0.000000 +G01 X3524.000000 Y142.395480 Z0.000000 +G01 X3596.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6300) + + +(Start cutting path id: path6248) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3516.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3444.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3444.000000 Y179.058040 Z0.000000 +G01 X3516.000000 Y156.258160 Z0.000000 +G01 X3516.000000 Y167.587510 Z0.000000 +G01 X3444.000000 Y190.387390 Z0.000000 +G01 X3444.000000 Y201.716740 Z0.000000 +G01 X3516.000000 Y178.916860 Z0.000000 +G01 X3516.000000 Y190.246210 Z0.000000 +G01 X3444.000000 Y213.046090 Z0.000000 +G01 X3444.000000 Y224.375390 Z0.000000 +G01 X3516.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6248) + + +(Start cutting path id: path6196) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3436.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3364.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3364.000000 Y261.037990 Z0.000000 +G01 X3436.000000 Y238.238090 Z0.000000 +G01 X3436.000000 Y249.567490 Z0.000000 +G01 X3364.000000 Y272.367390 Z0.000000 +G01 X3364.000000 Y283.696690 Z0.000000 +G01 X3436.000000 Y260.896790 Z0.000000 +G01 X3436.000000 Y272.226190 Z0.000000 +G01 X3364.000000 Y295.026090 Z0.000000 +G01 X3364.000000 Y306.355390 Z0.000000 +G01 X3436.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6196) + + +(Start cutting path id: path6200) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3360.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3360.000000 Y361.436490 Z0.000000 F200.000000 +G01 X3380.000000 Y367.769790 Z0.000000 +G01 X3380.000000 Y316.787690 Z0.000000 +G01 X3400.000000 Y323.120990 Z0.000000 +G01 X3400.000000 Y374.103090 Z0.000000 +G01 X3420.000000 Y380.436390 Z0.000000 +G01 X3420.000000 Y329.454290 Z0.000000 +G01 X3440.000000 Y335.787590 Z0.000000 +G01 X3440.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6200) + + +(Start cutting path id: path6144) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3356.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3284.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3284.000000 Y343.017990 Z0.000000 +G01 X3356.000000 Y320.218090 Z0.000000 +G01 X3356.000000 Y331.547390 Z0.000000 +G01 X3284.000000 Y354.347290 Z0.000000 +G01 X3284.000000 Y365.676690 Z0.000000 +G01 X3356.000000 Y342.876790 Z0.000000 +G01 X3356.000000 Y354.206090 Z0.000000 +G01 X3284.000000 Y377.005990 Z0.000000 +G01 X3284.000000 Y388.335390 Z0.000000 +G01 X3356.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6144) + + +(Start cutting path id: path6146) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3200.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3280.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6146) + + +(Start cutting path id: path6140) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3204.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3276.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3302.666700 Y323.244190 Z0.000000 +G01 X3230.666700 Y300.444290 Z0.000000 +G01 X3257.333300 Y291.999890 Z0.000000 +G01 X3329.333300 Y314.799790 Z0.000000 +G01 X3356.000000 Y306.355390 Z0.000000 +G01 X3284.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6140) + + +(Start cutting path id: path6194) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3280.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3280.000000 Y279.456490 Z0.000000 F200.000000 +G01 X3300.000000 Y285.789790 Z0.000000 +G01 X3300.000000 Y234.807790 Z0.000000 +G01 X3320.000000 Y241.141090 Z0.000000 +G01 X3320.000000 Y292.123090 Z0.000000 +G01 X3340.000000 Y298.456390 Z0.000000 +G01 X3340.000000 Y247.474390 Z0.000000 +G01 X3360.000000 Y253.807690 Z0.000000 +G01 X3360.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6194) + + +(Start cutting path id: path6192) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3284.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3356.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3382.666700 Y241.264290 Z0.000000 +G01 X3310.666700 Y218.464390 Z0.000000 +G01 X3337.333300 Y210.019970 Z0.000000 +G01 X3409.333300 Y232.819890 Z0.000000 +G01 X3436.000000 Y224.375490 Z0.000000 +G01 X3364.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6192) + + +(Start cutting path id: path6246) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3360.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3360.000000 Y197.476570 Z0.000000 F200.000000 +G01 X3380.000000 Y203.809870 Z0.000000 +G01 X3380.000000 Y152.827780 Z0.000000 +G01 X3400.000000 Y159.161080 Z0.000000 +G01 X3400.000000 Y210.143170 Z0.000000 +G01 X3420.000000 Y216.476490 Z0.000000 +G01 X3420.000000 Y165.494380 Z0.000000 +G01 X3440.000000 Y171.827680 Z0.000000 +G01 X3440.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6246) + + +(Start cutting path id: path6244) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3364.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3436.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3462.666700 Y159.284290 Z0.000000 +G01 X3390.666700 Y136.484410 Z0.000000 +G01 X3417.333300 Y128.040010 Z0.000000 +G01 X3489.333300 Y150.839890 Z0.000000 +G01 X3516.000000 Y142.395480 Z0.000000 +G01 X3444.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6244) + + +(Start cutting path id: path6298) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3440.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3440.000000 Y115.496610 Z0.000000 F200.000000 +G01 X3460.000000 Y121.829910 Z0.000000 +G01 X3460.000000 Y70.847830 Z0.000000 +G01 X3480.000000 Y77.181130 Z0.000000 +G01 X3480.000000 Y128.163210 Z0.000000 +G01 X3500.000000 Y134.496510 Z0.000000 +G01 X3500.000000 Y83.514430 Z0.000000 +G01 X3520.000000 Y89.847730 Z0.000000 +G01 X3520.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6298) + + +(Start cutting path id: path6296) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3444.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3516.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3542.666700 Y77.304330 Z0.000000 +G01 X3470.666700 Y54.504450 Z0.000000 +G01 X3497.333300 Y46.060050 Z0.000000 +G01 X3569.333300 Y68.859930 Z0.000000 +G01 X3596.000000 Y60.415530 Z0.000000 +G01 X3524.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6296) + + +(Start cutting path id: path6294) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3516.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3444.000000 Y3.768770 Z0.000000 F200.000000 +G01 X3444.000000 Y15.098120 Z0.000000 +G01 X3516.000000 Y-7.701760 Z0.000000 +G01 X3516.000000 Y3.627590 Z0.000000 +G01 X3444.000000 Y26.427470 Z0.000000 +G01 X3444.000000 Y37.756830 Z0.000000 +G01 X3516.000000 Y14.956950 Z0.000000 +G01 X3516.000000 Y26.286300 Z0.000000 +G01 X3444.000000 Y49.086180 Z0.000000 +G01 X3444.000000 Y60.415530 Z0.000000 +G01 X3516.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6294) + + +(Start cutting path id: path6242) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3436.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3364.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3364.000000 Y97.078080 Z0.000000 +G01 X3436.000000 Y74.278200 Z0.000000 +G01 X3436.000000 Y85.607550 Z0.000000 +G01 X3364.000000 Y108.407430 Z0.000000 +G01 X3364.000000 Y119.736790 Z0.000000 +G01 X3436.000000 Y96.936910 Z0.000000 +G01 X3436.000000 Y108.266260 Z0.000000 +G01 X3364.000000 Y131.066140 Z0.000000 +G01 X3364.000000 Y142.395480 Z0.000000 +G01 X3436.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6242) + + +(Start cutting path id: path6190) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3356.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3284.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3284.000000 Y179.058040 Z0.000000 +G01 X3356.000000 Y156.258160 Z0.000000 +G01 X3356.000000 Y167.587510 Z0.000000 +G01 X3284.000000 Y190.387390 Z0.000000 +G01 X3284.000000 Y201.716740 Z0.000000 +G01 X3356.000000 Y178.916860 Z0.000000 +G01 X3356.000000 Y190.246210 Z0.000000 +G01 X3284.000000 Y213.046090 Z0.000000 +G01 X3284.000000 Y224.375390 Z0.000000 +G01 X3356.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6190) + + +(Start cutting path id: path6138) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3276.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3204.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3204.000000 Y261.037990 Z0.000000 +G01 X3276.000000 Y238.238090 Z0.000000 +G01 X3276.000000 Y249.567490 Z0.000000 +G01 X3204.000000 Y272.367390 Z0.000000 +G01 X3204.000000 Y283.696690 Z0.000000 +G01 X3276.000000 Y260.896790 Z0.000000 +G01 X3276.000000 Y272.226190 Z0.000000 +G01 X3204.000000 Y295.026090 Z0.000000 +G01 X3204.000000 Y306.355390 Z0.000000 +G01 X3276.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6138) + + +(Start cutting path id: path6142) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3200.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3200.000000 Y361.436490 Z0.000000 F200.000000 +G01 X3220.000000 Y367.769790 Z0.000000 +G01 X3220.000000 Y316.787690 Z0.000000 +G01 X3240.000000 Y323.120990 Z0.000000 +G01 X3240.000000 Y374.103090 Z0.000000 +G01 X3260.000000 Y380.436390 Z0.000000 +G01 X3260.000000 Y329.454290 Z0.000000 +G01 X3280.000000 Y335.787590 Z0.000000 +G01 X3280.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6142) + + +(Start cutting path id: path6086) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3196.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3124.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3124.000000 Y343.017990 Z0.000000 +G01 X3196.000000 Y320.218090 Z0.000000 +G01 X3196.000000 Y331.547390 Z0.000000 +G01 X3124.000000 Y354.347290 Z0.000000 +G01 X3124.000000 Y365.676690 Z0.000000 +G01 X3196.000000 Y342.876790 Z0.000000 +G01 X3196.000000 Y354.206090 Z0.000000 +G01 X3124.000000 Y377.005990 Z0.000000 +G01 X3124.000000 Y388.335390 Z0.000000 +G01 X3196.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6086) + + +(Start cutting path id: path6088) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3040.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3120.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6088) + + +(Start cutting path id: path6082) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3044.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3116.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3142.666700 Y323.244190 Z0.000000 +G01 X3070.666700 Y300.444290 Z0.000000 +G01 X3097.333300 Y291.999890 Z0.000000 +G01 X3169.333300 Y314.799790 Z0.000000 +G01 X3196.000000 Y306.355390 Z0.000000 +G01 X3124.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6082) + + +(Start cutting path id: path6136) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3120.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3120.000000 Y279.456490 Z0.000000 F200.000000 +G01 X3140.000000 Y285.789790 Z0.000000 +G01 X3140.000000 Y234.807790 Z0.000000 +G01 X3160.000000 Y241.141090 Z0.000000 +G01 X3160.000000 Y292.123090 Z0.000000 +G01 X3180.000000 Y298.456390 Z0.000000 +G01 X3180.000000 Y247.474390 Z0.000000 +G01 X3200.000000 Y253.807690 Z0.000000 +G01 X3200.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6136) + + +(Start cutting path id: path6134) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3124.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3196.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3222.666700 Y241.264290 Z0.000000 +G01 X3150.666700 Y218.464390 Z0.000000 +G01 X3177.333300 Y210.019970 Z0.000000 +G01 X3249.333300 Y232.819890 Z0.000000 +G01 X3276.000000 Y224.375490 Z0.000000 +G01 X3204.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6134) + + +(Start cutting path id: path6188) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3200.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3200.000000 Y197.476570 Z0.000000 F200.000000 +G01 X3220.000000 Y203.809870 Z0.000000 +G01 X3220.000000 Y152.827780 Z0.000000 +G01 X3240.000000 Y159.161080 Z0.000000 +G01 X3240.000000 Y210.143170 Z0.000000 +G01 X3260.000000 Y216.476490 Z0.000000 +G01 X3260.000000 Y165.494380 Z0.000000 +G01 X3280.000000 Y171.827680 Z0.000000 +G01 X3280.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6188) + + +(Start cutting path id: path6186) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3204.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3276.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3302.666700 Y159.284290 Z0.000000 +G01 X3230.666700 Y136.484410 Z0.000000 +G01 X3257.333300 Y128.040010 Z0.000000 +G01 X3329.333300 Y150.839890 Z0.000000 +G01 X3356.000000 Y142.395480 Z0.000000 +G01 X3284.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6186) + + +(Start cutting path id: path6240) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3280.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3280.000000 Y115.496610 Z0.000000 F200.000000 +G01 X3300.000000 Y121.829910 Z0.000000 +G01 X3300.000000 Y70.847830 Z0.000000 +G01 X3320.000000 Y77.181130 Z0.000000 +G01 X3320.000000 Y128.163210 Z0.000000 +G01 X3340.000000 Y134.496510 Z0.000000 +G01 X3340.000000 Y83.514430 Z0.000000 +G01 X3360.000000 Y89.847730 Z0.000000 +G01 X3360.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6240) + + +(Start cutting path id: path6238) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3284.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3356.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3382.666700 Y77.304330 Z0.000000 +G01 X3310.666700 Y54.504450 Z0.000000 +G01 X3337.333300 Y46.060050 Z0.000000 +G01 X3409.333300 Y68.859930 Z0.000000 +G01 X3436.000000 Y60.415530 Z0.000000 +G01 X3364.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6238) + + +(Start cutting path id: path6292) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3360.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3360.000000 Y33.516650 Z0.000000 F200.000000 +G01 X3380.000000 Y39.849950 Z0.000000 +G01 X3380.000000 Y-11.132130 Z0.000000 +G01 X3400.000000 Y-4.798830 Z0.000000 +G01 X3400.000000 Y46.183250 Z0.000000 +G01 X3420.000000 Y52.516550 Z0.000000 +G01 X3420.000000 Y1.534470 Z0.000000 +G01 X3440.000000 Y7.867770 Z0.000000 +G01 X3440.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6292) + + +(Start cutting path id: path6290) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3364.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3436.000000 Y3.768770 Z0.000000 F200.000000 +G01 X3462.666700 Y-4.675630 Z0.000000 +G01 X3390.666700 Y-27.475510 Z0.000000 +G01 X3417.333300 Y-35.919910 Z0.000000 +G01 X3489.333300 Y-13.120030 Z0.000000 +G01 X3516.000000 Y-21.564430 Z0.000000 +G01 X3444.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6290) + + +(Start cutting path id: path6288) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3436.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3364.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X3364.000000 Y-66.881830 Z0.000000 +G01 X3436.000000 Y-89.681710 Z0.000000 +G01 X3436.000000 Y-78.352360 Z0.000000 +G01 X3364.000000 Y-55.552480 Z0.000000 +G01 X3364.000000 Y-44.223130 Z0.000000 +G01 X3436.000000 Y-67.023010 Z0.000000 +G01 X3436.000000 Y-55.693660 Z0.000000 +G01 X3364.000000 Y-32.893780 Z0.000000 +G01 X3364.000000 Y-21.564430 Z0.000000 +G01 X3436.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6288) + + +(Start cutting path id: path6236) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3356.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3284.000000 Y3.768770 Z0.000000 F200.000000 +G01 X3284.000000 Y15.098120 Z0.000000 +G01 X3356.000000 Y-7.701760 Z0.000000 +G01 X3356.000000 Y3.627590 Z0.000000 +G01 X3284.000000 Y26.427470 Z0.000000 +G01 X3284.000000 Y37.756830 Z0.000000 +G01 X3356.000000 Y14.956950 Z0.000000 +G01 X3356.000000 Y26.286300 Z0.000000 +G01 X3284.000000 Y49.086180 Z0.000000 +G01 X3284.000000 Y60.415530 Z0.000000 +G01 X3356.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6236) + + +(Start cutting path id: path6184) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3276.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3204.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3204.000000 Y97.078080 Z0.000000 +G01 X3276.000000 Y74.278200 Z0.000000 +G01 X3276.000000 Y85.607550 Z0.000000 +G01 X3204.000000 Y108.407430 Z0.000000 +G01 X3204.000000 Y119.736790 Z0.000000 +G01 X3276.000000 Y96.936910 Z0.000000 +G01 X3276.000000 Y108.266260 Z0.000000 +G01 X3204.000000 Y131.066140 Z0.000000 +G01 X3204.000000 Y142.395480 Z0.000000 +G01 X3276.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6184) + + +(Start cutting path id: path6132) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3196.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3124.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3124.000000 Y179.058040 Z0.000000 +G01 X3196.000000 Y156.258160 Z0.000000 +G01 X3196.000000 Y167.587510 Z0.000000 +G01 X3124.000000 Y190.387390 Z0.000000 +G01 X3124.000000 Y201.716740 Z0.000000 +G01 X3196.000000 Y178.916860 Z0.000000 +G01 X3196.000000 Y190.246210 Z0.000000 +G01 X3124.000000 Y213.046090 Z0.000000 +G01 X3124.000000 Y224.375390 Z0.000000 +G01 X3196.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6132) + + +(Start cutting path id: path6080) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3116.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3044.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3044.000000 Y261.037990 Z0.000000 +G01 X3116.000000 Y238.238090 Z0.000000 +G01 X3116.000000 Y249.567490 Z0.000000 +G01 X3044.000000 Y272.367390 Z0.000000 +G01 X3044.000000 Y283.696690 Z0.000000 +G01 X3116.000000 Y260.896790 Z0.000000 +G01 X3116.000000 Y272.226190 Z0.000000 +G01 X3044.000000 Y295.026090 Z0.000000 +G01 X3044.000000 Y306.355390 Z0.000000 +G01 X3116.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6080) + + +(Start cutting path id: path6084) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3040.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3040.000000 Y361.436490 Z0.000000 F200.000000 +G01 X3060.000000 Y367.769790 Z0.000000 +G01 X3060.000000 Y316.787690 Z0.000000 +G01 X3080.000000 Y323.120990 Z0.000000 +G01 X3080.000000 Y374.103090 Z0.000000 +G01 X3100.000000 Y380.436390 Z0.000000 +G01 X3100.000000 Y329.454290 Z0.000000 +G01 X3120.000000 Y335.787590 Z0.000000 +G01 X3120.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6084) + + +(Start cutting path id: path6028) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3036.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2964.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2964.000000 Y343.017990 Z0.000000 +G01 X3036.000000 Y320.218090 Z0.000000 +G01 X3036.000000 Y331.547390 Z0.000000 +G01 X2964.000000 Y354.347290 Z0.000000 +G01 X2964.000000 Y365.676690 Z0.000000 +G01 X3036.000000 Y342.876790 Z0.000000 +G01 X3036.000000 Y354.206090 Z0.000000 +G01 X2964.000000 Y377.005990 Z0.000000 +G01 X2964.000000 Y388.335390 Z0.000000 +G01 X3036.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6028) + + +(Start cutting path id: path6030) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2880.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2960.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6030) + + +(Start cutting path id: path6024) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2884.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2956.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2982.666700 Y323.244190 Z0.000000 +G01 X2910.666700 Y300.444290 Z0.000000 +G01 X2937.333300 Y291.999890 Z0.000000 +G01 X3009.333300 Y314.799790 Z0.000000 +G01 X3036.000000 Y306.355390 Z0.000000 +G01 X2964.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6024) + + +(Start cutting path id: path6078) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2960.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2960.000000 Y279.456490 Z0.000000 F200.000000 +G01 X2980.000000 Y285.789790 Z0.000000 +G01 X2980.000000 Y234.807790 Z0.000000 +G01 X3000.000000 Y241.141090 Z0.000000 +G01 X3000.000000 Y292.123090 Z0.000000 +G01 X3020.000000 Y298.456390 Z0.000000 +G01 X3020.000000 Y247.474390 Z0.000000 +G01 X3040.000000 Y253.807690 Z0.000000 +G01 X3040.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6078) + + +(Start cutting path id: path6076) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2964.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3036.000000 Y249.708690 Z0.000000 F200.000000 +G01 X3062.666700 Y241.264290 Z0.000000 +G01 X2990.666700 Y218.464390 Z0.000000 +G01 X3017.333300 Y210.019970 Z0.000000 +G01 X3089.333300 Y232.819890 Z0.000000 +G01 X3116.000000 Y224.375490 Z0.000000 +G01 X3044.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6076) + + +(Start cutting path id: path6130) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3040.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3040.000000 Y197.476570 Z0.000000 F200.000000 +G01 X3060.000000 Y203.809870 Z0.000000 +G01 X3060.000000 Y152.827780 Z0.000000 +G01 X3080.000000 Y159.161080 Z0.000000 +G01 X3080.000000 Y210.143170 Z0.000000 +G01 X3100.000000 Y216.476490 Z0.000000 +G01 X3100.000000 Y165.494380 Z0.000000 +G01 X3120.000000 Y171.827680 Z0.000000 +G01 X3120.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6130) + + +(Start cutting path id: path6128) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3044.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3116.000000 Y167.728680 Z0.000000 F200.000000 +G01 X3142.666700 Y159.284290 Z0.000000 +G01 X3070.666700 Y136.484410 Z0.000000 +G01 X3097.333300 Y128.040010 Z0.000000 +G01 X3169.333300 Y150.839890 Z0.000000 +G01 X3196.000000 Y142.395480 Z0.000000 +G01 X3124.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6128) + + +(Start cutting path id: path6182) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3120.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3120.000000 Y115.496610 Z0.000000 F200.000000 +G01 X3140.000000 Y121.829910 Z0.000000 +G01 X3140.000000 Y70.847830 Z0.000000 +G01 X3160.000000 Y77.181130 Z0.000000 +G01 X3160.000000 Y128.163210 Z0.000000 +G01 X3180.000000 Y134.496510 Z0.000000 +G01 X3180.000000 Y83.514430 Z0.000000 +G01 X3200.000000 Y89.847730 Z0.000000 +G01 X3200.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6182) + + +(Start cutting path id: path6180) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3124.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3196.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3222.666700 Y77.304330 Z0.000000 +G01 X3150.666700 Y54.504450 Z0.000000 +G01 X3177.333300 Y46.060050 Z0.000000 +G01 X3249.333300 Y68.859930 Z0.000000 +G01 X3276.000000 Y60.415530 Z0.000000 +G01 X3204.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6180) + + +(Start cutting path id: path6234) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3200.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3200.000000 Y33.516650 Z0.000000 F200.000000 +G01 X3220.000000 Y39.849950 Z0.000000 +G01 X3220.000000 Y-11.132130 Z0.000000 +G01 X3240.000000 Y-4.798830 Z0.000000 +G01 X3240.000000 Y46.183250 Z0.000000 +G01 X3260.000000 Y52.516550 Z0.000000 +G01 X3260.000000 Y1.534470 Z0.000000 +G01 X3280.000000 Y7.867770 Z0.000000 +G01 X3280.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6234) + + +(Start cutting path id: path6232) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3204.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3276.000000 Y3.768770 Z0.000000 F200.000000 +G01 X3302.666700 Y-4.675630 Z0.000000 +G01 X3230.666700 Y-27.475510 Z0.000000 +G01 X3257.333300 Y-35.919910 Z0.000000 +G01 X3329.333300 Y-13.120030 Z0.000000 +G01 X3356.000000 Y-21.564430 Z0.000000 +G01 X3284.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6232) + + +(Start cutting path id: path6286) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3280.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3280.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X3300.000000 Y-42.130010 Z0.000000 +G01 X3300.000000 Y-93.112090 Z0.000000 +G01 X3320.000000 Y-86.778790 Z0.000000 +G01 X3320.000000 Y-35.796710 Z0.000000 +G01 X3340.000000 Y-29.463410 Z0.000000 +G01 X3340.000000 Y-80.445490 Z0.000000 +G01 X3360.000000 Y-74.112190 Z0.000000 +G01 X3360.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6286) + + +(Start cutting path id: path6284) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3284.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3356.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X3382.666700 Y-86.655590 Z0.000000 +G01 X3310.666700 Y-109.455470 Z0.000000 +G01 X3337.333300 Y-117.899870 Z0.000000 +G01 X3409.333300 Y-95.099990 Z0.000000 +G01 X3436.000000 Y-103.544380 Z0.000000 +G01 X3364.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6284) + + +(Start cutting path id: path6282) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3356.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3284.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X3284.000000 Y-148.861790 Z0.000000 +G01 X3356.000000 Y-171.661670 Z0.000000 +G01 X3356.000000 Y-160.332320 Z0.000000 +G01 X3284.000000 Y-137.532440 Z0.000000 +G01 X3284.000000 Y-126.203090 Z0.000000 +G01 X3356.000000 Y-149.002970 Z0.000000 +G01 X3356.000000 Y-137.673620 Z0.000000 +G01 X3284.000000 Y-114.873740 Z0.000000 +G01 X3284.000000 Y-103.544380 Z0.000000 +G01 X3356.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6282) + + +(Start cutting path id: path6230) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3276.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3204.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X3204.000000 Y-66.881830 Z0.000000 +G01 X3276.000000 Y-89.681710 Z0.000000 +G01 X3276.000000 Y-78.352360 Z0.000000 +G01 X3204.000000 Y-55.552480 Z0.000000 +G01 X3204.000000 Y-44.223130 Z0.000000 +G01 X3276.000000 Y-67.023010 Z0.000000 +G01 X3276.000000 Y-55.693660 Z0.000000 +G01 X3204.000000 Y-32.893780 Z0.000000 +G01 X3204.000000 Y-21.564430 Z0.000000 +G01 X3276.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6230) + + +(Start cutting path id: path6178) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3196.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3124.000000 Y3.768770 Z0.000000 F200.000000 +G01 X3124.000000 Y15.098120 Z0.000000 +G01 X3196.000000 Y-7.701760 Z0.000000 +G01 X3196.000000 Y3.627590 Z0.000000 +G01 X3124.000000 Y26.427470 Z0.000000 +G01 X3124.000000 Y37.756830 Z0.000000 +G01 X3196.000000 Y14.956950 Z0.000000 +G01 X3196.000000 Y26.286300 Z0.000000 +G01 X3124.000000 Y49.086180 Z0.000000 +G01 X3124.000000 Y60.415530 Z0.000000 +G01 X3196.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6178) + + +(Start cutting path id: path6126) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3116.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3044.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3044.000000 Y97.078080 Z0.000000 +G01 X3116.000000 Y74.278200 Z0.000000 +G01 X3116.000000 Y85.607550 Z0.000000 +G01 X3044.000000 Y108.407430 Z0.000000 +G01 X3044.000000 Y119.736790 Z0.000000 +G01 X3116.000000 Y96.936910 Z0.000000 +G01 X3116.000000 Y108.266260 Z0.000000 +G01 X3044.000000 Y131.066140 Z0.000000 +G01 X3044.000000 Y142.395480 Z0.000000 +G01 X3116.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6126) + + +(Start cutting path id: path6074) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3036.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2964.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2964.000000 Y179.058040 Z0.000000 +G01 X3036.000000 Y156.258160 Z0.000000 +G01 X3036.000000 Y167.587510 Z0.000000 +G01 X2964.000000 Y190.387390 Z0.000000 +G01 X2964.000000 Y201.716740 Z0.000000 +G01 X3036.000000 Y178.916860 Z0.000000 +G01 X3036.000000 Y190.246210 Z0.000000 +G01 X2964.000000 Y213.046090 Z0.000000 +G01 X2964.000000 Y224.375390 Z0.000000 +G01 X3036.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6074) + + +(Start cutting path id: path6022) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2956.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2884.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2884.000000 Y261.037990 Z0.000000 +G01 X2956.000000 Y238.238090 Z0.000000 +G01 X2956.000000 Y249.567490 Z0.000000 +G01 X2884.000000 Y272.367390 Z0.000000 +G01 X2884.000000 Y283.696690 Z0.000000 +G01 X2956.000000 Y260.896790 Z0.000000 +G01 X2956.000000 Y272.226190 Z0.000000 +G01 X2884.000000 Y295.026090 Z0.000000 +G01 X2884.000000 Y306.355390 Z0.000000 +G01 X2956.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6022) + + +(Start cutting path id: path6026) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2880.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2880.000000 Y361.436490 Z0.000000 F200.000000 +G01 X2900.000000 Y367.769790 Z0.000000 +G01 X2900.000000 Y316.787690 Z0.000000 +G01 X2920.000000 Y323.120990 Z0.000000 +G01 X2920.000000 Y374.103090 Z0.000000 +G01 X2940.000000 Y380.436390 Z0.000000 +G01 X2940.000000 Y329.454290 Z0.000000 +G01 X2960.000000 Y335.787590 Z0.000000 +G01 X2960.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6026) + + +(Start cutting path id: path5970) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2876.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2804.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2804.000000 Y343.017990 Z0.000000 +G01 X2876.000000 Y320.218090 Z0.000000 +G01 X2876.000000 Y331.547390 Z0.000000 +G01 X2804.000000 Y354.347290 Z0.000000 +G01 X2804.000000 Y365.676690 Z0.000000 +G01 X2876.000000 Y342.876790 Z0.000000 +G01 X2876.000000 Y354.206090 Z0.000000 +G01 X2804.000000 Y377.005990 Z0.000000 +G01 X2804.000000 Y388.335390 Z0.000000 +G01 X2876.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5970) + + +(Start cutting path id: path5972) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2720.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5972) + + +(Start cutting path id: path5966) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2724.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2796.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2822.666700 Y323.244190 Z0.000000 +G01 X2750.666700 Y300.444290 Z0.000000 +G01 X2777.333300 Y291.999890 Z0.000000 +G01 X2849.333300 Y314.799790 Z0.000000 +G01 X2876.000000 Y306.355390 Z0.000000 +G01 X2804.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5966) + + +(Start cutting path id: path6020) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2800.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y279.456490 Z0.000000 F200.000000 +G01 X2820.000000 Y285.789790 Z0.000000 +G01 X2820.000000 Y234.807790 Z0.000000 +G01 X2840.000000 Y241.141090 Z0.000000 +G01 X2840.000000 Y292.123090 Z0.000000 +G01 X2860.000000 Y298.456390 Z0.000000 +G01 X2860.000000 Y247.474390 Z0.000000 +G01 X2880.000000 Y253.807690 Z0.000000 +G01 X2880.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6020) + + +(Start cutting path id: path6018) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2804.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2876.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2902.666700 Y241.264290 Z0.000000 +G01 X2830.666700 Y218.464390 Z0.000000 +G01 X2857.333300 Y210.019970 Z0.000000 +G01 X2929.333300 Y232.819890 Z0.000000 +G01 X2956.000000 Y224.375490 Z0.000000 +G01 X2884.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6018) + + +(Start cutting path id: path6072) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2880.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2880.000000 Y197.476570 Z0.000000 F200.000000 +G01 X2900.000000 Y203.809870 Z0.000000 +G01 X2900.000000 Y152.827780 Z0.000000 +G01 X2920.000000 Y159.161080 Z0.000000 +G01 X2920.000000 Y210.143170 Z0.000000 +G01 X2940.000000 Y216.476490 Z0.000000 +G01 X2940.000000 Y165.494380 Z0.000000 +G01 X2960.000000 Y171.827680 Z0.000000 +G01 X2960.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6072) + + +(Start cutting path id: path6070) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2884.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2956.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2982.666700 Y159.284290 Z0.000000 +G01 X2910.666700 Y136.484410 Z0.000000 +G01 X2937.333300 Y128.040010 Z0.000000 +G01 X3009.333300 Y150.839890 Z0.000000 +G01 X3036.000000 Y142.395480 Z0.000000 +G01 X2964.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6070) + + +(Start cutting path id: path6124) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2960.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2960.000000 Y115.496610 Z0.000000 F200.000000 +G01 X2980.000000 Y121.829910 Z0.000000 +G01 X2980.000000 Y70.847830 Z0.000000 +G01 X3000.000000 Y77.181130 Z0.000000 +G01 X3000.000000 Y128.163210 Z0.000000 +G01 X3020.000000 Y134.496510 Z0.000000 +G01 X3020.000000 Y83.514430 Z0.000000 +G01 X3040.000000 Y89.847730 Z0.000000 +G01 X3040.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6124) + + +(Start cutting path id: path6122) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2964.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3036.000000 Y85.748730 Z0.000000 F200.000000 +G01 X3062.666700 Y77.304330 Z0.000000 +G01 X2990.666700 Y54.504450 Z0.000000 +G01 X3017.333300 Y46.060050 Z0.000000 +G01 X3089.333300 Y68.859930 Z0.000000 +G01 X3116.000000 Y60.415530 Z0.000000 +G01 X3044.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6122) + + +(Start cutting path id: path6176) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3040.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3040.000000 Y33.516650 Z0.000000 F200.000000 +G01 X3060.000000 Y39.849950 Z0.000000 +G01 X3060.000000 Y-11.132130 Z0.000000 +G01 X3080.000000 Y-4.798830 Z0.000000 +G01 X3080.000000 Y46.183250 Z0.000000 +G01 X3100.000000 Y52.516550 Z0.000000 +G01 X3100.000000 Y1.534470 Z0.000000 +G01 X3120.000000 Y7.867770 Z0.000000 +G01 X3120.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6176) + + +(Start cutting path id: path6174) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3044.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3116.000000 Y3.768770 Z0.000000 F200.000000 +G01 X3142.666700 Y-4.675630 Z0.000000 +G01 X3070.666700 Y-27.475510 Z0.000000 +G01 X3097.333300 Y-35.919910 Z0.000000 +G01 X3169.333300 Y-13.120030 Z0.000000 +G01 X3196.000000 Y-21.564430 Z0.000000 +G01 X3124.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6174) + + +(Start cutting path id: path6228) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3120.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3120.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X3140.000000 Y-42.130010 Z0.000000 +G01 X3140.000000 Y-93.112090 Z0.000000 +G01 X3160.000000 Y-86.778790 Z0.000000 +G01 X3160.000000 Y-35.796710 Z0.000000 +G01 X3180.000000 Y-29.463410 Z0.000000 +G01 X3180.000000 Y-80.445490 Z0.000000 +G01 X3200.000000 Y-74.112190 Z0.000000 +G01 X3200.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6228) + + +(Start cutting path id: path6226) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3124.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3196.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X3222.666700 Y-86.655590 Z0.000000 +G01 X3150.666700 Y-109.455470 Z0.000000 +G01 X3177.333300 Y-117.899870 Z0.000000 +G01 X3249.333300 Y-95.099990 Z0.000000 +G01 X3276.000000 Y-103.544380 Z0.000000 +G01 X3204.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6226) + + +(Start cutting path id: path6280) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3200.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3200.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X3220.000000 Y-124.109960 Z0.000000 +G01 X3220.000000 Y-175.092050 Z0.000000 +G01 X3240.000000 Y-168.758750 Z0.000000 +G01 X3240.000000 Y-117.776660 Z0.000000 +G01 X3260.000000 Y-111.443360 Z0.000000 +G01 X3260.000000 Y-162.425450 Z0.000000 +G01 X3280.000000 Y-156.092150 Z0.000000 +G01 X3280.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6280) + + +(Start cutting path id: path6278) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3204.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3276.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X3302.666700 Y-168.635550 Z0.000000 +G01 X3230.666700 Y-191.435430 Z0.000000 +G01 X3257.333300 Y-199.879820 Z0.000000 +G01 X3329.333300 Y-177.079940 Z0.000000 +G01 X3356.000000 Y-185.524340 Z0.000000 +G01 X3284.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6278) + + +(Start cutting path id: path6276) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3276.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3204.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X3204.000000 Y-230.841800 Z0.000000 +G01 X3276.000000 Y-253.641600 Z0.000000 +G01 X3276.000000 Y-242.312300 Z0.000000 +G01 X3204.000000 Y-219.512400 Z0.000000 +G01 X3204.000000 Y-208.183100 Z0.000000 +G01 X3276.000000 Y-230.982900 Z0.000000 +G01 X3276.000000 Y-219.653600 Z0.000000 +G01 X3204.000000 Y-196.853700 Z0.000000 +G01 X3204.000000 Y-185.524340 Z0.000000 +G01 X3276.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6276) + + +(Start cutting path id: path6224) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3196.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3124.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X3124.000000 Y-148.861790 Z0.000000 +G01 X3196.000000 Y-171.661670 Z0.000000 +G01 X3196.000000 Y-160.332320 Z0.000000 +G01 X3124.000000 Y-137.532440 Z0.000000 +G01 X3124.000000 Y-126.203090 Z0.000000 +G01 X3196.000000 Y-149.002970 Z0.000000 +G01 X3196.000000 Y-137.673620 Z0.000000 +G01 X3124.000000 Y-114.873740 Z0.000000 +G01 X3124.000000 Y-103.544380 Z0.000000 +G01 X3196.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6224) + + +(Start cutting path id: path6172) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3116.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3044.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X3044.000000 Y-66.881830 Z0.000000 +G01 X3116.000000 Y-89.681710 Z0.000000 +G01 X3116.000000 Y-78.352360 Z0.000000 +G01 X3044.000000 Y-55.552480 Z0.000000 +G01 X3044.000000 Y-44.223130 Z0.000000 +G01 X3116.000000 Y-67.023010 Z0.000000 +G01 X3116.000000 Y-55.693660 Z0.000000 +G01 X3044.000000 Y-32.893780 Z0.000000 +G01 X3044.000000 Y-21.564430 Z0.000000 +G01 X3116.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6172) + + +(Start cutting path id: path6120) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3036.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2964.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2964.000000 Y15.098120 Z0.000000 +G01 X3036.000000 Y-7.701760 Z0.000000 +G01 X3036.000000 Y3.627590 Z0.000000 +G01 X2964.000000 Y26.427470 Z0.000000 +G01 X2964.000000 Y37.756830 Z0.000000 +G01 X3036.000000 Y14.956950 Z0.000000 +G01 X3036.000000 Y26.286300 Z0.000000 +G01 X2964.000000 Y49.086180 Z0.000000 +G01 X2964.000000 Y60.415530 Z0.000000 +G01 X3036.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6120) + + +(Start cutting path id: path6068) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2956.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2884.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2884.000000 Y97.078080 Z0.000000 +G01 X2956.000000 Y74.278200 Z0.000000 +G01 X2956.000000 Y85.607550 Z0.000000 +G01 X2884.000000 Y108.407430 Z0.000000 +G01 X2884.000000 Y119.736790 Z0.000000 +G01 X2956.000000 Y96.936910 Z0.000000 +G01 X2956.000000 Y108.266260 Z0.000000 +G01 X2884.000000 Y131.066140 Z0.000000 +G01 X2884.000000 Y142.395480 Z0.000000 +G01 X2956.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6068) + + +(Start cutting path id: path6016) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2876.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2804.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2804.000000 Y179.058040 Z0.000000 +G01 X2876.000000 Y156.258160 Z0.000000 +G01 X2876.000000 Y167.587510 Z0.000000 +G01 X2804.000000 Y190.387390 Z0.000000 +G01 X2804.000000 Y201.716740 Z0.000000 +G01 X2876.000000 Y178.916860 Z0.000000 +G01 X2876.000000 Y190.246210 Z0.000000 +G01 X2804.000000 Y213.046090 Z0.000000 +G01 X2804.000000 Y224.375390 Z0.000000 +G01 X2876.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6016) + + +(Start cutting path id: path5964) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2796.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2724.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2724.000000 Y261.037990 Z0.000000 +G01 X2796.000000 Y238.238090 Z0.000000 +G01 X2796.000000 Y249.567490 Z0.000000 +G01 X2724.000000 Y272.367390 Z0.000000 +G01 X2724.000000 Y283.696690 Z0.000000 +G01 X2796.000000 Y260.896790 Z0.000000 +G01 X2796.000000 Y272.226190 Z0.000000 +G01 X2724.000000 Y295.026090 Z0.000000 +G01 X2724.000000 Y306.355390 Z0.000000 +G01 X2796.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5964) + + +(Start cutting path id: path5968) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2720.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2720.000000 Y361.436490 Z0.000000 F200.000000 +G01 X2740.000000 Y367.769790 Z0.000000 +G01 X2740.000000 Y316.787690 Z0.000000 +G01 X2760.000000 Y323.120990 Z0.000000 +G01 X2760.000000 Y374.103090 Z0.000000 +G01 X2780.000000 Y380.436390 Z0.000000 +G01 X2780.000000 Y329.454290 Z0.000000 +G01 X2800.000000 Y335.787590 Z0.000000 +G01 X2800.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5968) + + +(Start cutting path id: path5912) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2716.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2644.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2644.000000 Y343.017990 Z0.000000 +G01 X2716.000000 Y320.218090 Z0.000000 +G01 X2716.000000 Y331.547390 Z0.000000 +G01 X2644.000000 Y354.347290 Z0.000000 +G01 X2644.000000 Y365.676690 Z0.000000 +G01 X2716.000000 Y342.876790 Z0.000000 +G01 X2716.000000 Y354.206090 Z0.000000 +G01 X2644.000000 Y377.005990 Z0.000000 +G01 X2644.000000 Y388.335390 Z0.000000 +G01 X2716.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5912) + + +(Start cutting path id: path5914) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2560.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2640.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5914) + + +(Start cutting path id: path5908) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2564.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2636.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2662.666700 Y323.244190 Z0.000000 +G01 X2590.666700 Y300.444290 Z0.000000 +G01 X2617.333300 Y291.999890 Z0.000000 +G01 X2689.333300 Y314.799790 Z0.000000 +G01 X2716.000000 Y306.355390 Z0.000000 +G01 X2644.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5908) + + +(Start cutting path id: path5962) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2640.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2640.000000 Y279.456490 Z0.000000 F200.000000 +G01 X2660.000000 Y285.789790 Z0.000000 +G01 X2660.000000 Y234.807790 Z0.000000 +G01 X2680.000000 Y241.141090 Z0.000000 +G01 X2680.000000 Y292.123090 Z0.000000 +G01 X2700.000000 Y298.456390 Z0.000000 +G01 X2700.000000 Y247.474390 Z0.000000 +G01 X2720.000000 Y253.807690 Z0.000000 +G01 X2720.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5962) + + +(Start cutting path id: path5960) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2644.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2716.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2742.666700 Y241.264290 Z0.000000 +G01 X2670.666700 Y218.464390 Z0.000000 +G01 X2697.333300 Y210.019970 Z0.000000 +G01 X2769.333300 Y232.819890 Z0.000000 +G01 X2796.000000 Y224.375490 Z0.000000 +G01 X2724.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5960) + + +(Start cutting path id: path6014) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2720.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2720.000000 Y197.476570 Z0.000000 F200.000000 +G01 X2740.000000 Y203.809870 Z0.000000 +G01 X2740.000000 Y152.827780 Z0.000000 +G01 X2760.000000 Y159.161080 Z0.000000 +G01 X2760.000000 Y210.143170 Z0.000000 +G01 X2780.000000 Y216.476490 Z0.000000 +G01 X2780.000000 Y165.494380 Z0.000000 +G01 X2800.000000 Y171.827680 Z0.000000 +G01 X2800.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6014) + + +(Start cutting path id: path6012) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2724.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2796.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2822.666700 Y159.284290 Z0.000000 +G01 X2750.666700 Y136.484410 Z0.000000 +G01 X2777.333300 Y128.040010 Z0.000000 +G01 X2849.333300 Y150.839890 Z0.000000 +G01 X2876.000000 Y142.395480 Z0.000000 +G01 X2804.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6012) + + +(Start cutting path id: path6066) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2800.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y115.496610 Z0.000000 F200.000000 +G01 X2820.000000 Y121.829910 Z0.000000 +G01 X2820.000000 Y70.847830 Z0.000000 +G01 X2840.000000 Y77.181130 Z0.000000 +G01 X2840.000000 Y128.163210 Z0.000000 +G01 X2860.000000 Y134.496510 Z0.000000 +G01 X2860.000000 Y83.514430 Z0.000000 +G01 X2880.000000 Y89.847730 Z0.000000 +G01 X2880.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6066) + + +(Start cutting path id: path6064) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2804.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2876.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2902.666700 Y77.304330 Z0.000000 +G01 X2830.666700 Y54.504450 Z0.000000 +G01 X2857.333300 Y46.060050 Z0.000000 +G01 X2929.333300 Y68.859930 Z0.000000 +G01 X2956.000000 Y60.415530 Z0.000000 +G01 X2884.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6064) + + +(Start cutting path id: path6118) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2880.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2880.000000 Y33.516650 Z0.000000 F200.000000 +G01 X2900.000000 Y39.849950 Z0.000000 +G01 X2900.000000 Y-11.132130 Z0.000000 +G01 X2920.000000 Y-4.798830 Z0.000000 +G01 X2920.000000 Y46.183250 Z0.000000 +G01 X2940.000000 Y52.516550 Z0.000000 +G01 X2940.000000 Y1.534470 Z0.000000 +G01 X2960.000000 Y7.867770 Z0.000000 +G01 X2960.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6118) + + +(Start cutting path id: path6116) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2884.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2956.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2982.666700 Y-4.675630 Z0.000000 +G01 X2910.666700 Y-27.475510 Z0.000000 +G01 X2937.333300 Y-35.919910 Z0.000000 +G01 X3009.333300 Y-13.120030 Z0.000000 +G01 X3036.000000 Y-21.564430 Z0.000000 +G01 X2964.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6116) + + +(Start cutting path id: path6170) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2960.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2960.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X2980.000000 Y-42.130010 Z0.000000 +G01 X2980.000000 Y-93.112090 Z0.000000 +G01 X3000.000000 Y-86.778790 Z0.000000 +G01 X3000.000000 Y-35.796710 Z0.000000 +G01 X3020.000000 Y-29.463410 Z0.000000 +G01 X3020.000000 Y-80.445490 Z0.000000 +G01 X3040.000000 Y-74.112190 Z0.000000 +G01 X3040.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6170) + + +(Start cutting path id: path6168) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2964.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3036.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X3062.666700 Y-86.655590 Z0.000000 +G01 X2990.666700 Y-109.455470 Z0.000000 +G01 X3017.333300 Y-117.899870 Z0.000000 +G01 X3089.333300 Y-95.099990 Z0.000000 +G01 X3116.000000 Y-103.544380 Z0.000000 +G01 X3044.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6168) + + +(Start cutting path id: path6222) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3040.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3040.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X3060.000000 Y-124.109960 Z0.000000 +G01 X3060.000000 Y-175.092050 Z0.000000 +G01 X3080.000000 Y-168.758750 Z0.000000 +G01 X3080.000000 Y-117.776660 Z0.000000 +G01 X3100.000000 Y-111.443360 Z0.000000 +G01 X3100.000000 Y-162.425450 Z0.000000 +G01 X3120.000000 Y-156.092150 Z0.000000 +G01 X3120.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6222) + + +(Start cutting path id: path6220) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3044.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3116.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X3142.666700 Y-168.635550 Z0.000000 +G01 X3070.666700 Y-191.435430 Z0.000000 +G01 X3097.333300 Y-199.879820 Z0.000000 +G01 X3169.333300 Y-177.079940 Z0.000000 +G01 X3196.000000 Y-185.524340 Z0.000000 +G01 X3124.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6220) + + +(Start cutting path id: path6274) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3120.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3120.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X3140.000000 Y-206.089900 Z0.000000 +G01 X3140.000000 Y-257.072000 Z0.000000 +G01 X3160.000000 Y-250.738700 Z0.000000 +G01 X3160.000000 Y-199.756620 Z0.000000 +G01 X3180.000000 Y-193.423320 Z0.000000 +G01 X3180.000000 Y-244.405400 Z0.000000 +G01 X3200.000000 Y-238.072100 Z0.000000 +G01 X3200.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6274) + + +(Start cutting path id: path6272) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3124.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3196.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X3222.666700 Y-250.615500 Z0.000000 +G01 X3150.666700 Y-273.415400 Z0.000000 +G01 X3177.333300 Y-281.859800 Z0.000000 +G01 X3249.333300 Y-259.059900 Z0.000000 +G01 X3276.000000 Y-267.504300 Z0.000000 +G01 X3204.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6272) + + +(Start cutting path id: path6270) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3196.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3124.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X3124.000000 Y-312.821700 Z0.000000 +G01 X3196.000000 Y-335.621600 Z0.000000 +G01 X3196.000000 Y-324.292200 Z0.000000 +G01 X3124.000000 Y-301.492400 Z0.000000 +G01 X3124.000000 Y-290.163000 Z0.000000 +G01 X3196.000000 Y-312.962900 Z0.000000 +G01 X3196.000000 Y-301.633500 Z0.000000 +G01 X3124.000000 Y-278.833700 Z0.000000 +G01 X3124.000000 Y-267.504300 Z0.000000 +G01 X3196.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6270) + + +(Start cutting path id: path6218) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3116.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3044.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X3044.000000 Y-230.841800 Z0.000000 +G01 X3116.000000 Y-253.641600 Z0.000000 +G01 X3116.000000 Y-242.312300 Z0.000000 +G01 X3044.000000 Y-219.512400 Z0.000000 +G01 X3044.000000 Y-208.183100 Z0.000000 +G01 X3116.000000 Y-230.982900 Z0.000000 +G01 X3116.000000 Y-219.653600 Z0.000000 +G01 X3044.000000 Y-196.853700 Z0.000000 +G01 X3044.000000 Y-185.524340 Z0.000000 +G01 X3116.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6218) + + +(Start cutting path id: path6166) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3036.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2964.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2964.000000 Y-148.861790 Z0.000000 +G01 X3036.000000 Y-171.661670 Z0.000000 +G01 X3036.000000 Y-160.332320 Z0.000000 +G01 X2964.000000 Y-137.532440 Z0.000000 +G01 X2964.000000 Y-126.203090 Z0.000000 +G01 X3036.000000 Y-149.002970 Z0.000000 +G01 X3036.000000 Y-137.673620 Z0.000000 +G01 X2964.000000 Y-114.873740 Z0.000000 +G01 X2964.000000 Y-103.544380 Z0.000000 +G01 X3036.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6166) + + +(Start cutting path id: path6114) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2956.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2884.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2884.000000 Y-66.881830 Z0.000000 +G01 X2956.000000 Y-89.681710 Z0.000000 +G01 X2956.000000 Y-78.352360 Z0.000000 +G01 X2884.000000 Y-55.552480 Z0.000000 +G01 X2884.000000 Y-44.223130 Z0.000000 +G01 X2956.000000 Y-67.023010 Z0.000000 +G01 X2956.000000 Y-55.693660 Z0.000000 +G01 X2884.000000 Y-32.893780 Z0.000000 +G01 X2884.000000 Y-21.564430 Z0.000000 +G01 X2956.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6114) + + +(Start cutting path id: path6062) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2876.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2804.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2804.000000 Y15.098120 Z0.000000 +G01 X2876.000000 Y-7.701760 Z0.000000 +G01 X2876.000000 Y3.627590 Z0.000000 +G01 X2804.000000 Y26.427470 Z0.000000 +G01 X2804.000000 Y37.756830 Z0.000000 +G01 X2876.000000 Y14.956950 Z0.000000 +G01 X2876.000000 Y26.286300 Z0.000000 +G01 X2804.000000 Y49.086180 Z0.000000 +G01 X2804.000000 Y60.415530 Z0.000000 +G01 X2876.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6062) + + +(Start cutting path id: path6010) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2796.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2724.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2724.000000 Y97.078080 Z0.000000 +G01 X2796.000000 Y74.278200 Z0.000000 +G01 X2796.000000 Y85.607550 Z0.000000 +G01 X2724.000000 Y108.407430 Z0.000000 +G01 X2724.000000 Y119.736790 Z0.000000 +G01 X2796.000000 Y96.936910 Z0.000000 +G01 X2796.000000 Y108.266260 Z0.000000 +G01 X2724.000000 Y131.066140 Z0.000000 +G01 X2724.000000 Y142.395480 Z0.000000 +G01 X2796.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6010) + + +(Start cutting path id: path5958) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2716.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2644.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2644.000000 Y179.058040 Z0.000000 +G01 X2716.000000 Y156.258160 Z0.000000 +G01 X2716.000000 Y167.587510 Z0.000000 +G01 X2644.000000 Y190.387390 Z0.000000 +G01 X2644.000000 Y201.716740 Z0.000000 +G01 X2716.000000 Y178.916860 Z0.000000 +G01 X2716.000000 Y190.246210 Z0.000000 +G01 X2644.000000 Y213.046090 Z0.000000 +G01 X2644.000000 Y224.375390 Z0.000000 +G01 X2716.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5958) + + +(Start cutting path id: path5906) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2636.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2564.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2564.000000 Y261.037990 Z0.000000 +G01 X2636.000000 Y238.238090 Z0.000000 +G01 X2636.000000 Y249.567490 Z0.000000 +G01 X2564.000000 Y272.367390 Z0.000000 +G01 X2564.000000 Y283.696690 Z0.000000 +G01 X2636.000000 Y260.896790 Z0.000000 +G01 X2636.000000 Y272.226190 Z0.000000 +G01 X2564.000000 Y295.026090 Z0.000000 +G01 X2564.000000 Y306.355390 Z0.000000 +G01 X2636.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5906) + + +(Start cutting path id: path5910) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2560.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2560.000000 Y361.436490 Z0.000000 F200.000000 +G01 X2580.000000 Y367.769790 Z0.000000 +G01 X2580.000000 Y316.787690 Z0.000000 +G01 X2600.000000 Y323.120990 Z0.000000 +G01 X2600.000000 Y374.103090 Z0.000000 +G01 X2620.000000 Y380.436390 Z0.000000 +G01 X2620.000000 Y329.454290 Z0.000000 +G01 X2640.000000 Y335.787590 Z0.000000 +G01 X2640.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5910) + + +(Start cutting path id: path5854) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2556.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2484.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2484.000000 Y343.017990 Z0.000000 +G01 X2556.000000 Y320.218090 Z0.000000 +G01 X2556.000000 Y331.547390 Z0.000000 +G01 X2484.000000 Y354.347290 Z0.000000 +G01 X2484.000000 Y365.676690 Z0.000000 +G01 X2556.000000 Y342.876790 Z0.000000 +G01 X2556.000000 Y354.206090 Z0.000000 +G01 X2484.000000 Y377.005990 Z0.000000 +G01 X2484.000000 Y388.335390 Z0.000000 +G01 X2556.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5854) + + +(Start cutting path id: path5856) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2480.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5856) + + +(Start cutting path id: path5850) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2404.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2476.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2502.666700 Y323.244190 Z0.000000 +G01 X2430.666700 Y300.444290 Z0.000000 +G01 X2457.333300 Y291.999890 Z0.000000 +G01 X2529.333300 Y314.799790 Z0.000000 +G01 X2556.000000 Y306.355390 Z0.000000 +G01 X2484.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5850) + + +(Start cutting path id: path5904) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2480.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2480.000000 Y279.456490 Z0.000000 F200.000000 +G01 X2500.000000 Y285.789790 Z0.000000 +G01 X2500.000000 Y234.807790 Z0.000000 +G01 X2520.000000 Y241.141090 Z0.000000 +G01 X2520.000000 Y292.123090 Z0.000000 +G01 X2540.000000 Y298.456390 Z0.000000 +G01 X2540.000000 Y247.474390 Z0.000000 +G01 X2560.000000 Y253.807690 Z0.000000 +G01 X2560.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5904) + + +(Start cutting path id: path5902) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2484.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2556.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2582.666700 Y241.264290 Z0.000000 +G01 X2510.666700 Y218.464390 Z0.000000 +G01 X2537.333300 Y210.019970 Z0.000000 +G01 X2609.333300 Y232.819890 Z0.000000 +G01 X2636.000000 Y224.375490 Z0.000000 +G01 X2564.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5902) + + +(Start cutting path id: path5956) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2560.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2560.000000 Y197.476570 Z0.000000 F200.000000 +G01 X2580.000000 Y203.809870 Z0.000000 +G01 X2580.000000 Y152.827780 Z0.000000 +G01 X2600.000000 Y159.161080 Z0.000000 +G01 X2600.000000 Y210.143170 Z0.000000 +G01 X2620.000000 Y216.476490 Z0.000000 +G01 X2620.000000 Y165.494380 Z0.000000 +G01 X2640.000000 Y171.827680 Z0.000000 +G01 X2640.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5956) + + +(Start cutting path id: path5954) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2564.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2636.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2662.666700 Y159.284290 Z0.000000 +G01 X2590.666700 Y136.484410 Z0.000000 +G01 X2617.333300 Y128.040010 Z0.000000 +G01 X2689.333300 Y150.839890 Z0.000000 +G01 X2716.000000 Y142.395480 Z0.000000 +G01 X2644.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5954) + + +(Start cutting path id: path6008) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2640.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2640.000000 Y115.496610 Z0.000000 F200.000000 +G01 X2660.000000 Y121.829910 Z0.000000 +G01 X2660.000000 Y70.847830 Z0.000000 +G01 X2680.000000 Y77.181130 Z0.000000 +G01 X2680.000000 Y128.163210 Z0.000000 +G01 X2700.000000 Y134.496510 Z0.000000 +G01 X2700.000000 Y83.514430 Z0.000000 +G01 X2720.000000 Y89.847730 Z0.000000 +G01 X2720.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6008) + + +(Start cutting path id: path6006) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2644.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2716.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2742.666700 Y77.304330 Z0.000000 +G01 X2670.666700 Y54.504450 Z0.000000 +G01 X2697.333300 Y46.060050 Z0.000000 +G01 X2769.333300 Y68.859930 Z0.000000 +G01 X2796.000000 Y60.415530 Z0.000000 +G01 X2724.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6006) + + +(Start cutting path id: path6060) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2720.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2720.000000 Y33.516650 Z0.000000 F200.000000 +G01 X2740.000000 Y39.849950 Z0.000000 +G01 X2740.000000 Y-11.132130 Z0.000000 +G01 X2760.000000 Y-4.798830 Z0.000000 +G01 X2760.000000 Y46.183250 Z0.000000 +G01 X2780.000000 Y52.516550 Z0.000000 +G01 X2780.000000 Y1.534470 Z0.000000 +G01 X2800.000000 Y7.867770 Z0.000000 +G01 X2800.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6060) + + +(Start cutting path id: path6058) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2724.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2796.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2822.666700 Y-4.675630 Z0.000000 +G01 X2750.666700 Y-27.475510 Z0.000000 +G01 X2777.333300 Y-35.919910 Z0.000000 +G01 X2849.333300 Y-13.120030 Z0.000000 +G01 X2876.000000 Y-21.564430 Z0.000000 +G01 X2804.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6058) + + +(Start cutting path id: path6112) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2800.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X2820.000000 Y-42.130010 Z0.000000 +G01 X2820.000000 Y-93.112090 Z0.000000 +G01 X2840.000000 Y-86.778790 Z0.000000 +G01 X2840.000000 Y-35.796710 Z0.000000 +G01 X2860.000000 Y-29.463410 Z0.000000 +G01 X2860.000000 Y-80.445490 Z0.000000 +G01 X2880.000000 Y-74.112190 Z0.000000 +G01 X2880.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6112) + + +(Start cutting path id: path6110) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2804.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2876.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2902.666700 Y-86.655590 Z0.000000 +G01 X2830.666700 Y-109.455470 Z0.000000 +G01 X2857.333300 Y-117.899870 Z0.000000 +G01 X2929.333300 Y-95.099990 Z0.000000 +G01 X2956.000000 Y-103.544380 Z0.000000 +G01 X2884.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6110) + + +(Start cutting path id: path6164) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2880.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2880.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X2900.000000 Y-124.109960 Z0.000000 +G01 X2900.000000 Y-175.092050 Z0.000000 +G01 X2920.000000 Y-168.758750 Z0.000000 +G01 X2920.000000 Y-117.776660 Z0.000000 +G01 X2940.000000 Y-111.443360 Z0.000000 +G01 X2940.000000 Y-162.425450 Z0.000000 +G01 X2960.000000 Y-156.092150 Z0.000000 +G01 X2960.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6164) + + +(Start cutting path id: path6162) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2884.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2956.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2982.666700 Y-168.635550 Z0.000000 +G01 X2910.666700 Y-191.435430 Z0.000000 +G01 X2937.333300 Y-199.879820 Z0.000000 +G01 X3009.333300 Y-177.079940 Z0.000000 +G01 X3036.000000 Y-185.524340 Z0.000000 +G01 X2964.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6162) + + +(Start cutting path id: path6216) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2960.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2960.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X2980.000000 Y-206.089900 Z0.000000 +G01 X2980.000000 Y-257.072000 Z0.000000 +G01 X3000.000000 Y-250.738700 Z0.000000 +G01 X3000.000000 Y-199.756620 Z0.000000 +G01 X3020.000000 Y-193.423320 Z0.000000 +G01 X3020.000000 Y-244.405400 Z0.000000 +G01 X3040.000000 Y-238.072100 Z0.000000 +G01 X3040.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6216) + + +(Start cutting path id: path6214) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2964.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3036.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X3062.666700 Y-250.615500 Z0.000000 +G01 X2990.666700 Y-273.415400 Z0.000000 +G01 X3017.333300 Y-281.859800 Z0.000000 +G01 X3089.333300 Y-259.059900 Z0.000000 +G01 X3116.000000 Y-267.504300 Z0.000000 +G01 X3044.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6214) + + +(Start cutting path id: path6268) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3040.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3040.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X3060.000000 Y-288.069900 Z0.000000 +G01 X3060.000000 Y-339.052000 Z0.000000 +G01 X3080.000000 Y-332.718700 Z0.000000 +G01 X3080.000000 Y-281.736600 Z0.000000 +G01 X3100.000000 Y-275.403300 Z0.000000 +G01 X3100.000000 Y-326.385400 Z0.000000 +G01 X3120.000000 Y-320.052100 Z0.000000 +G01 X3120.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6268) + + +(Start cutting path id: path6266) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3044.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3116.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X3142.666700 Y-332.595500 Z0.000000 +G01 X3070.666700 Y-355.395300 Z0.000000 +G01 X3097.333300 Y-363.839700 Z0.000000 +G01 X3169.333300 Y-341.039900 Z0.000000 +G01 X3196.000000 Y-349.484300 Z0.000000 +G01 X3124.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6266) + + +(Start cutting path id: path6264) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3040.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3120.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6264) + + +(Start cutting path id: path6212) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3036.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2964.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2964.000000 Y-312.821700 Z0.000000 +G01 X3036.000000 Y-335.621600 Z0.000000 +G01 X3036.000000 Y-324.292200 Z0.000000 +G01 X2964.000000 Y-301.492400 Z0.000000 +G01 X2964.000000 Y-290.163000 Z0.000000 +G01 X3036.000000 Y-312.962900 Z0.000000 +G01 X3036.000000 Y-301.633500 Z0.000000 +G01 X2964.000000 Y-278.833700 Z0.000000 +G01 X2964.000000 Y-267.504300 Z0.000000 +G01 X3036.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6212) + + +(Start cutting path id: path6160) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2956.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2884.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2884.000000 Y-230.841800 Z0.000000 +G01 X2956.000000 Y-253.641600 Z0.000000 +G01 X2956.000000 Y-242.312300 Z0.000000 +G01 X2884.000000 Y-219.512400 Z0.000000 +G01 X2884.000000 Y-208.183100 Z0.000000 +G01 X2956.000000 Y-230.982900 Z0.000000 +G01 X2956.000000 Y-219.653600 Z0.000000 +G01 X2884.000000 Y-196.853700 Z0.000000 +G01 X2884.000000 Y-185.524340 Z0.000000 +G01 X2956.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6160) + + +(Start cutting path id: path6108) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2876.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2804.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2804.000000 Y-148.861790 Z0.000000 +G01 X2876.000000 Y-171.661670 Z0.000000 +G01 X2876.000000 Y-160.332320 Z0.000000 +G01 X2804.000000 Y-137.532440 Z0.000000 +G01 X2804.000000 Y-126.203090 Z0.000000 +G01 X2876.000000 Y-149.002970 Z0.000000 +G01 X2876.000000 Y-137.673620 Z0.000000 +G01 X2804.000000 Y-114.873740 Z0.000000 +G01 X2804.000000 Y-103.544380 Z0.000000 +G01 X2876.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6108) + + +(Start cutting path id: path6056) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2796.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2724.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2724.000000 Y-66.881830 Z0.000000 +G01 X2796.000000 Y-89.681710 Z0.000000 +G01 X2796.000000 Y-78.352360 Z0.000000 +G01 X2724.000000 Y-55.552480 Z0.000000 +G01 X2724.000000 Y-44.223130 Z0.000000 +G01 X2796.000000 Y-67.023010 Z0.000000 +G01 X2796.000000 Y-55.693660 Z0.000000 +G01 X2724.000000 Y-32.893780 Z0.000000 +G01 X2724.000000 Y-21.564430 Z0.000000 +G01 X2796.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6056) + + +(Start cutting path id: path6004) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2716.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2644.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2644.000000 Y15.098120 Z0.000000 +G01 X2716.000000 Y-7.701760 Z0.000000 +G01 X2716.000000 Y3.627590 Z0.000000 +G01 X2644.000000 Y26.427470 Z0.000000 +G01 X2644.000000 Y37.756830 Z0.000000 +G01 X2716.000000 Y14.956950 Z0.000000 +G01 X2716.000000 Y26.286300 Z0.000000 +G01 X2644.000000 Y49.086180 Z0.000000 +G01 X2644.000000 Y60.415530 Z0.000000 +G01 X2716.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6004) + + +(Start cutting path id: path5952) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2636.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2564.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2564.000000 Y97.078080 Z0.000000 +G01 X2636.000000 Y74.278200 Z0.000000 +G01 X2636.000000 Y85.607550 Z0.000000 +G01 X2564.000000 Y108.407430 Z0.000000 +G01 X2564.000000 Y119.736790 Z0.000000 +G01 X2636.000000 Y96.936910 Z0.000000 +G01 X2636.000000 Y108.266260 Z0.000000 +G01 X2564.000000 Y131.066140 Z0.000000 +G01 X2564.000000 Y142.395480 Z0.000000 +G01 X2636.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5952) + + +(Start cutting path id: path5900) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2556.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2484.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2484.000000 Y179.058040 Z0.000000 +G01 X2556.000000 Y156.258160 Z0.000000 +G01 X2556.000000 Y167.587510 Z0.000000 +G01 X2484.000000 Y190.387390 Z0.000000 +G01 X2484.000000 Y201.716740 Z0.000000 +G01 X2556.000000 Y178.916860 Z0.000000 +G01 X2556.000000 Y190.246210 Z0.000000 +G01 X2484.000000 Y213.046090 Z0.000000 +G01 X2484.000000 Y224.375390 Z0.000000 +G01 X2556.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5900) + + +(Start cutting path id: path5848) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2476.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2404.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2404.000000 Y261.037990 Z0.000000 +G01 X2476.000000 Y238.238090 Z0.000000 +G01 X2476.000000 Y249.567490 Z0.000000 +G01 X2404.000000 Y272.367390 Z0.000000 +G01 X2404.000000 Y283.696690 Z0.000000 +G01 X2476.000000 Y260.896790 Z0.000000 +G01 X2476.000000 Y272.226190 Z0.000000 +G01 X2404.000000 Y295.026090 Z0.000000 +G01 X2404.000000 Y306.355390 Z0.000000 +G01 X2476.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5848) + + +(Start cutting path id: path5852) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2400.000000 Y361.436490 Z0.000000 F200.000000 +G01 X2420.000000 Y367.769790 Z0.000000 +G01 X2420.000000 Y316.787690 Z0.000000 +G01 X2440.000000 Y323.120990 Z0.000000 +G01 X2440.000000 Y374.103090 Z0.000000 +G01 X2460.000000 Y380.436390 Z0.000000 +G01 X2460.000000 Y329.454290 Z0.000000 +G01 X2480.000000 Y335.787590 Z0.000000 +G01 X2480.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5852) + + +(Start cutting path id: path5796) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2396.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2324.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2324.000000 Y343.017990 Z0.000000 +G01 X2396.000000 Y320.218090 Z0.000000 +G01 X2396.000000 Y331.547390 Z0.000000 +G01 X2324.000000 Y354.347290 Z0.000000 +G01 X2324.000000 Y365.676690 Z0.000000 +G01 X2396.000000 Y342.876790 Z0.000000 +G01 X2396.000000 Y354.206090 Z0.000000 +G01 X2324.000000 Y377.005990 Z0.000000 +G01 X2324.000000 Y388.335390 Z0.000000 +G01 X2396.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5796) + + +(Start cutting path id: path5798) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2240.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2320.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5798) + + +(Start cutting path id: path5792) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2244.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2316.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2342.666700 Y323.244190 Z0.000000 +G01 X2270.666700 Y300.444290 Z0.000000 +G01 X2297.333300 Y291.999890 Z0.000000 +G01 X2369.333300 Y314.799790 Z0.000000 +G01 X2396.000000 Y306.355390 Z0.000000 +G01 X2324.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5792) + + +(Start cutting path id: path5846) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2320.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2320.000000 Y279.456490 Z0.000000 F200.000000 +G01 X2340.000000 Y285.789790 Z0.000000 +G01 X2340.000000 Y234.807790 Z0.000000 +G01 X2360.000000 Y241.141090 Z0.000000 +G01 X2360.000000 Y292.123090 Z0.000000 +G01 X2380.000000 Y298.456390 Z0.000000 +G01 X2380.000000 Y247.474390 Z0.000000 +G01 X2400.000000 Y253.807690 Z0.000000 +G01 X2400.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5846) + + +(Start cutting path id: path5844) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2324.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2396.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2422.666700 Y241.264290 Z0.000000 +G01 X2350.666700 Y218.464390 Z0.000000 +G01 X2377.333300 Y210.019970 Z0.000000 +G01 X2449.333300 Y232.819890 Z0.000000 +G01 X2476.000000 Y224.375490 Z0.000000 +G01 X2404.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5844) + + +(Start cutting path id: path5898) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2400.000000 Y197.476570 Z0.000000 F200.000000 +G01 X2420.000000 Y203.809870 Z0.000000 +G01 X2420.000000 Y152.827780 Z0.000000 +G01 X2440.000000 Y159.161080 Z0.000000 +G01 X2440.000000 Y210.143170 Z0.000000 +G01 X2460.000000 Y216.476490 Z0.000000 +G01 X2460.000000 Y165.494380 Z0.000000 +G01 X2480.000000 Y171.827680 Z0.000000 +G01 X2480.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5898) + + +(Start cutting path id: path5896) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2404.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2476.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2502.666700 Y159.284290 Z0.000000 +G01 X2430.666700 Y136.484410 Z0.000000 +G01 X2457.333300 Y128.040010 Z0.000000 +G01 X2529.333300 Y150.839890 Z0.000000 +G01 X2556.000000 Y142.395480 Z0.000000 +G01 X2484.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5896) + + +(Start cutting path id: path5950) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2480.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2480.000000 Y115.496610 Z0.000000 F200.000000 +G01 X2500.000000 Y121.829910 Z0.000000 +G01 X2500.000000 Y70.847830 Z0.000000 +G01 X2520.000000 Y77.181130 Z0.000000 +G01 X2520.000000 Y128.163210 Z0.000000 +G01 X2540.000000 Y134.496510 Z0.000000 +G01 X2540.000000 Y83.514430 Z0.000000 +G01 X2560.000000 Y89.847730 Z0.000000 +G01 X2560.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5950) + + +(Start cutting path id: path5948) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2484.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2556.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2582.666700 Y77.304330 Z0.000000 +G01 X2510.666700 Y54.504450 Z0.000000 +G01 X2537.333300 Y46.060050 Z0.000000 +G01 X2609.333300 Y68.859930 Z0.000000 +G01 X2636.000000 Y60.415530 Z0.000000 +G01 X2564.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5948) + + +(Start cutting path id: path6002) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2560.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2560.000000 Y33.516650 Z0.000000 F200.000000 +G01 X2580.000000 Y39.849950 Z0.000000 +G01 X2580.000000 Y-11.132130 Z0.000000 +G01 X2600.000000 Y-4.798830 Z0.000000 +G01 X2600.000000 Y46.183250 Z0.000000 +G01 X2620.000000 Y52.516550 Z0.000000 +G01 X2620.000000 Y1.534470 Z0.000000 +G01 X2640.000000 Y7.867770 Z0.000000 +G01 X2640.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6002) + + +(Start cutting path id: path6000) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2564.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2636.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2662.666700 Y-4.675630 Z0.000000 +G01 X2590.666700 Y-27.475510 Z0.000000 +G01 X2617.333300 Y-35.919910 Z0.000000 +G01 X2689.333300 Y-13.120030 Z0.000000 +G01 X2716.000000 Y-21.564430 Z0.000000 +G01 X2644.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6000) + + +(Start cutting path id: path6054) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2640.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2640.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X2660.000000 Y-42.130010 Z0.000000 +G01 X2660.000000 Y-93.112090 Z0.000000 +G01 X2680.000000 Y-86.778790 Z0.000000 +G01 X2680.000000 Y-35.796710 Z0.000000 +G01 X2700.000000 Y-29.463410 Z0.000000 +G01 X2700.000000 Y-80.445490 Z0.000000 +G01 X2720.000000 Y-74.112190 Z0.000000 +G01 X2720.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6054) + + +(Start cutting path id: path6052) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2644.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2716.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2742.666700 Y-86.655590 Z0.000000 +G01 X2670.666700 Y-109.455470 Z0.000000 +G01 X2697.333300 Y-117.899870 Z0.000000 +G01 X2769.333300 Y-95.099990 Z0.000000 +G01 X2796.000000 Y-103.544380 Z0.000000 +G01 X2724.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6052) + + +(Start cutting path id: path6106) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2720.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2720.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X2740.000000 Y-124.109960 Z0.000000 +G01 X2740.000000 Y-175.092050 Z0.000000 +G01 X2760.000000 Y-168.758750 Z0.000000 +G01 X2760.000000 Y-117.776660 Z0.000000 +G01 X2780.000000 Y-111.443360 Z0.000000 +G01 X2780.000000 Y-162.425450 Z0.000000 +G01 X2800.000000 Y-156.092150 Z0.000000 +G01 X2800.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6106) + + +(Start cutting path id: path6104) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2724.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2796.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2822.666700 Y-168.635550 Z0.000000 +G01 X2750.666700 Y-191.435430 Z0.000000 +G01 X2777.333300 Y-199.879820 Z0.000000 +G01 X2849.333300 Y-177.079940 Z0.000000 +G01 X2876.000000 Y-185.524340 Z0.000000 +G01 X2804.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6104) + + +(Start cutting path id: path6158) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2800.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X2820.000000 Y-206.089900 Z0.000000 +G01 X2820.000000 Y-257.072000 Z0.000000 +G01 X2840.000000 Y-250.738700 Z0.000000 +G01 X2840.000000 Y-199.756620 Z0.000000 +G01 X2860.000000 Y-193.423320 Z0.000000 +G01 X2860.000000 Y-244.405400 Z0.000000 +G01 X2880.000000 Y-238.072100 Z0.000000 +G01 X2880.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6158) + + +(Start cutting path id: path6156) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2804.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2876.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2902.666700 Y-250.615500 Z0.000000 +G01 X2830.666700 Y-273.415400 Z0.000000 +G01 X2857.333300 Y-281.859800 Z0.000000 +G01 X2929.333300 Y-259.059900 Z0.000000 +G01 X2956.000000 Y-267.504300 Z0.000000 +G01 X2884.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6156) + + +(Start cutting path id: path6210) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2880.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2880.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X2900.000000 Y-288.069900 Z0.000000 +G01 X2900.000000 Y-339.052000 Z0.000000 +G01 X2920.000000 Y-332.718700 Z0.000000 +G01 X2920.000000 Y-281.736600 Z0.000000 +G01 X2940.000000 Y-275.403300 Z0.000000 +G01 X2940.000000 Y-326.385400 Z0.000000 +G01 X2960.000000 Y-320.052100 Z0.000000 +G01 X2960.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6210) + + +(Start cutting path id: path6208) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2884.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2956.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2982.666700 Y-332.595500 Z0.000000 +G01 X2910.666700 Y-355.395300 Z0.000000 +G01 X2937.333300 Y-363.839700 Z0.000000 +G01 X3009.333300 Y-341.039900 Z0.000000 +G01 X3036.000000 Y-349.484300 Z0.000000 +G01 X2964.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6208) + + +(Start cutting path id: path6206) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2880.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2960.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6206) + + +(Start cutting path id: path6154) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2876.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2804.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2804.000000 Y-312.821700 Z0.000000 +G01 X2876.000000 Y-335.621600 Z0.000000 +G01 X2876.000000 Y-324.292200 Z0.000000 +G01 X2804.000000 Y-301.492400 Z0.000000 +G01 X2804.000000 Y-290.163000 Z0.000000 +G01 X2876.000000 Y-312.962900 Z0.000000 +G01 X2876.000000 Y-301.633500 Z0.000000 +G01 X2804.000000 Y-278.833700 Z0.000000 +G01 X2804.000000 Y-267.504300 Z0.000000 +G01 X2876.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6154) + + +(Start cutting path id: path6102) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2796.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2724.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2724.000000 Y-230.841800 Z0.000000 +G01 X2796.000000 Y-253.641600 Z0.000000 +G01 X2796.000000 Y-242.312300 Z0.000000 +G01 X2724.000000 Y-219.512400 Z0.000000 +G01 X2724.000000 Y-208.183100 Z0.000000 +G01 X2796.000000 Y-230.982900 Z0.000000 +G01 X2796.000000 Y-219.653600 Z0.000000 +G01 X2724.000000 Y-196.853700 Z0.000000 +G01 X2724.000000 Y-185.524340 Z0.000000 +G01 X2796.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6102) + + +(Start cutting path id: path6050) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2716.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2644.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2644.000000 Y-148.861790 Z0.000000 +G01 X2716.000000 Y-171.661670 Z0.000000 +G01 X2716.000000 Y-160.332320 Z0.000000 +G01 X2644.000000 Y-137.532440 Z0.000000 +G01 X2644.000000 Y-126.203090 Z0.000000 +G01 X2716.000000 Y-149.002970 Z0.000000 +G01 X2716.000000 Y-137.673620 Z0.000000 +G01 X2644.000000 Y-114.873740 Z0.000000 +G01 X2644.000000 Y-103.544380 Z0.000000 +G01 X2716.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6050) + + +(Start cutting path id: path5998) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2636.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2564.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2564.000000 Y-66.881830 Z0.000000 +G01 X2636.000000 Y-89.681710 Z0.000000 +G01 X2636.000000 Y-78.352360 Z0.000000 +G01 X2564.000000 Y-55.552480 Z0.000000 +G01 X2564.000000 Y-44.223130 Z0.000000 +G01 X2636.000000 Y-67.023010 Z0.000000 +G01 X2636.000000 Y-55.693660 Z0.000000 +G01 X2564.000000 Y-32.893780 Z0.000000 +G01 X2564.000000 Y-21.564430 Z0.000000 +G01 X2636.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5998) + + +(Start cutting path id: path5946) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2556.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2484.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2484.000000 Y15.098120 Z0.000000 +G01 X2556.000000 Y-7.701760 Z0.000000 +G01 X2556.000000 Y3.627590 Z0.000000 +G01 X2484.000000 Y26.427470 Z0.000000 +G01 X2484.000000 Y37.756830 Z0.000000 +G01 X2556.000000 Y14.956950 Z0.000000 +G01 X2556.000000 Y26.286300 Z0.000000 +G01 X2484.000000 Y49.086180 Z0.000000 +G01 X2484.000000 Y60.415530 Z0.000000 +G01 X2556.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5946) + + +(Start cutting path id: path5894) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2476.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2404.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2404.000000 Y97.078080 Z0.000000 +G01 X2476.000000 Y74.278200 Z0.000000 +G01 X2476.000000 Y85.607550 Z0.000000 +G01 X2404.000000 Y108.407430 Z0.000000 +G01 X2404.000000 Y119.736790 Z0.000000 +G01 X2476.000000 Y96.936910 Z0.000000 +G01 X2476.000000 Y108.266260 Z0.000000 +G01 X2404.000000 Y131.066140 Z0.000000 +G01 X2404.000000 Y142.395480 Z0.000000 +G01 X2476.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5894) + + +(Start cutting path id: path5842) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2396.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2324.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2324.000000 Y179.058040 Z0.000000 +G01 X2396.000000 Y156.258160 Z0.000000 +G01 X2396.000000 Y167.587510 Z0.000000 +G01 X2324.000000 Y190.387390 Z0.000000 +G01 X2324.000000 Y201.716740 Z0.000000 +G01 X2396.000000 Y178.916860 Z0.000000 +G01 X2396.000000 Y190.246210 Z0.000000 +G01 X2324.000000 Y213.046090 Z0.000000 +G01 X2324.000000 Y224.375390 Z0.000000 +G01 X2396.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5842) + + +(Start cutting path id: path5790) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2316.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2244.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2244.000000 Y261.037990 Z0.000000 +G01 X2316.000000 Y238.238090 Z0.000000 +G01 X2316.000000 Y249.567490 Z0.000000 +G01 X2244.000000 Y272.367390 Z0.000000 +G01 X2244.000000 Y283.696690 Z0.000000 +G01 X2316.000000 Y260.896790 Z0.000000 +G01 X2316.000000 Y272.226190 Z0.000000 +G01 X2244.000000 Y295.026090 Z0.000000 +G01 X2244.000000 Y306.355390 Z0.000000 +G01 X2316.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5790) + + +(Start cutting path id: path5794) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2240.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2240.000000 Y361.436490 Z0.000000 F200.000000 +G01 X2260.000000 Y367.769790 Z0.000000 +G01 X2260.000000 Y316.787690 Z0.000000 +G01 X2280.000000 Y323.120990 Z0.000000 +G01 X2280.000000 Y374.103090 Z0.000000 +G01 X2300.000000 Y380.436390 Z0.000000 +G01 X2300.000000 Y329.454290 Z0.000000 +G01 X2320.000000 Y335.787590 Z0.000000 +G01 X2320.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5794) + + +(Start cutting path id: path5738) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2236.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2164.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2164.000000 Y343.017990 Z0.000000 +G01 X2236.000000 Y320.218090 Z0.000000 +G01 X2236.000000 Y331.547390 Z0.000000 +G01 X2164.000000 Y354.347290 Z0.000000 +G01 X2164.000000 Y365.676690 Z0.000000 +G01 X2236.000000 Y342.876790 Z0.000000 +G01 X2236.000000 Y354.206090 Z0.000000 +G01 X2164.000000 Y377.005990 Z0.000000 +G01 X2164.000000 Y388.335390 Z0.000000 +G01 X2236.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5738) + + +(Start cutting path id: path5740) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2080.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2160.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5740) + + +(Start cutting path id: path5734) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2084.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2156.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2182.666700 Y323.244190 Z0.000000 +G01 X2110.666700 Y300.444290 Z0.000000 +G01 X2137.333300 Y291.999890 Z0.000000 +G01 X2209.333300 Y314.799790 Z0.000000 +G01 X2236.000000 Y306.355390 Z0.000000 +G01 X2164.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5734) + + +(Start cutting path id: path5788) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2160.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2160.000000 Y279.456490 Z0.000000 F200.000000 +G01 X2180.000000 Y285.789790 Z0.000000 +G01 X2180.000000 Y234.807790 Z0.000000 +G01 X2200.000000 Y241.141090 Z0.000000 +G01 X2200.000000 Y292.123090 Z0.000000 +G01 X2220.000000 Y298.456390 Z0.000000 +G01 X2220.000000 Y247.474390 Z0.000000 +G01 X2240.000000 Y253.807690 Z0.000000 +G01 X2240.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5788) + + +(Start cutting path id: path5786) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2164.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2236.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2262.666700 Y241.264290 Z0.000000 +G01 X2190.666700 Y218.464390 Z0.000000 +G01 X2217.333300 Y210.019970 Z0.000000 +G01 X2289.333300 Y232.819890 Z0.000000 +G01 X2316.000000 Y224.375490 Z0.000000 +G01 X2244.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5786) + + +(Start cutting path id: path5840) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2240.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2240.000000 Y197.476570 Z0.000000 F200.000000 +G01 X2260.000000 Y203.809870 Z0.000000 +G01 X2260.000000 Y152.827780 Z0.000000 +G01 X2280.000000 Y159.161080 Z0.000000 +G01 X2280.000000 Y210.143170 Z0.000000 +G01 X2300.000000 Y216.476490 Z0.000000 +G01 X2300.000000 Y165.494380 Z0.000000 +G01 X2320.000000 Y171.827680 Z0.000000 +G01 X2320.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5840) + + +(Start cutting path id: path5838) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2244.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2316.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2342.666700 Y159.284290 Z0.000000 +G01 X2270.666700 Y136.484410 Z0.000000 +G01 X2297.333300 Y128.040010 Z0.000000 +G01 X2369.333300 Y150.839890 Z0.000000 +G01 X2396.000000 Y142.395480 Z0.000000 +G01 X2324.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5838) + + +(Start cutting path id: path5892) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2320.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2320.000000 Y115.496610 Z0.000000 F200.000000 +G01 X2340.000000 Y121.829910 Z0.000000 +G01 X2340.000000 Y70.847830 Z0.000000 +G01 X2360.000000 Y77.181130 Z0.000000 +G01 X2360.000000 Y128.163210 Z0.000000 +G01 X2380.000000 Y134.496510 Z0.000000 +G01 X2380.000000 Y83.514430 Z0.000000 +G01 X2400.000000 Y89.847730 Z0.000000 +G01 X2400.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5892) + + +(Start cutting path id: path5890) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2324.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2396.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2422.666700 Y77.304330 Z0.000000 +G01 X2350.666700 Y54.504450 Z0.000000 +G01 X2377.333300 Y46.060050 Z0.000000 +G01 X2449.333300 Y68.859930 Z0.000000 +G01 X2476.000000 Y60.415530 Z0.000000 +G01 X2404.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5890) + + +(Start cutting path id: path5944) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2400.000000 Y33.516650 Z0.000000 F200.000000 +G01 X2420.000000 Y39.849950 Z0.000000 +G01 X2420.000000 Y-11.132130 Z0.000000 +G01 X2440.000000 Y-4.798830 Z0.000000 +G01 X2440.000000 Y46.183250 Z0.000000 +G01 X2460.000000 Y52.516550 Z0.000000 +G01 X2460.000000 Y1.534470 Z0.000000 +G01 X2480.000000 Y7.867770 Z0.000000 +G01 X2480.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5944) + + +(Start cutting path id: path5942) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2404.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2476.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2502.666700 Y-4.675630 Z0.000000 +G01 X2430.666700 Y-27.475510 Z0.000000 +G01 X2457.333300 Y-35.919910 Z0.000000 +G01 X2529.333300 Y-13.120030 Z0.000000 +G01 X2556.000000 Y-21.564430 Z0.000000 +G01 X2484.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5942) + + +(Start cutting path id: path5996) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2480.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2480.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X2500.000000 Y-42.130010 Z0.000000 +G01 X2500.000000 Y-93.112090 Z0.000000 +G01 X2520.000000 Y-86.778790 Z0.000000 +G01 X2520.000000 Y-35.796710 Z0.000000 +G01 X2540.000000 Y-29.463410 Z0.000000 +G01 X2540.000000 Y-80.445490 Z0.000000 +G01 X2560.000000 Y-74.112190 Z0.000000 +G01 X2560.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5996) + + +(Start cutting path id: path5994) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2484.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2556.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2582.666700 Y-86.655590 Z0.000000 +G01 X2510.666700 Y-109.455470 Z0.000000 +G01 X2537.333300 Y-117.899870 Z0.000000 +G01 X2609.333300 Y-95.099990 Z0.000000 +G01 X2636.000000 Y-103.544380 Z0.000000 +G01 X2564.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5994) + + +(Start cutting path id: path6048) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2560.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2560.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X2580.000000 Y-124.109960 Z0.000000 +G01 X2580.000000 Y-175.092050 Z0.000000 +G01 X2600.000000 Y-168.758750 Z0.000000 +G01 X2600.000000 Y-117.776660 Z0.000000 +G01 X2620.000000 Y-111.443360 Z0.000000 +G01 X2620.000000 Y-162.425450 Z0.000000 +G01 X2640.000000 Y-156.092150 Z0.000000 +G01 X2640.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6048) + + +(Start cutting path id: path6046) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2564.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2636.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2662.666700 Y-168.635550 Z0.000000 +G01 X2590.666700 Y-191.435430 Z0.000000 +G01 X2617.333300 Y-199.879820 Z0.000000 +G01 X2689.333300 Y-177.079940 Z0.000000 +G01 X2716.000000 Y-185.524340 Z0.000000 +G01 X2644.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6046) + + +(Start cutting path id: path6100) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2640.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2640.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X2660.000000 Y-206.089900 Z0.000000 +G01 X2660.000000 Y-257.072000 Z0.000000 +G01 X2680.000000 Y-250.738700 Z0.000000 +G01 X2680.000000 Y-199.756620 Z0.000000 +G01 X2700.000000 Y-193.423320 Z0.000000 +G01 X2700.000000 Y-244.405400 Z0.000000 +G01 X2720.000000 Y-238.072100 Z0.000000 +G01 X2720.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6100) + + +(Start cutting path id: path6098) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2644.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2716.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2742.666700 Y-250.615500 Z0.000000 +G01 X2670.666700 Y-273.415400 Z0.000000 +G01 X2697.333300 Y-281.859800 Z0.000000 +G01 X2769.333300 Y-259.059900 Z0.000000 +G01 X2796.000000 Y-267.504300 Z0.000000 +G01 X2724.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6098) + + +(Start cutting path id: path6152) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2720.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2720.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X2740.000000 Y-288.069900 Z0.000000 +G01 X2740.000000 Y-339.052000 Z0.000000 +G01 X2760.000000 Y-332.718700 Z0.000000 +G01 X2760.000000 Y-281.736600 Z0.000000 +G01 X2780.000000 Y-275.403300 Z0.000000 +G01 X2780.000000 Y-326.385400 Z0.000000 +G01 X2800.000000 Y-320.052100 Z0.000000 +G01 X2800.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6152) + + +(Start cutting path id: path6150) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2724.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2796.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2822.666700 Y-332.595500 Z0.000000 +G01 X2750.666700 Y-355.395300 Z0.000000 +G01 X2777.333300 Y-363.839700 Z0.000000 +G01 X2849.333300 Y-341.039900 Z0.000000 +G01 X2876.000000 Y-349.484300 Z0.000000 +G01 X2804.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6150) + + +(Start cutting path id: path6148) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2720.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6148) + + +(Start cutting path id: path6096) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2716.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2644.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2644.000000 Y-312.821700 Z0.000000 +G01 X2716.000000 Y-335.621600 Z0.000000 +G01 X2716.000000 Y-324.292200 Z0.000000 +G01 X2644.000000 Y-301.492400 Z0.000000 +G01 X2644.000000 Y-290.163000 Z0.000000 +G01 X2716.000000 Y-312.962900 Z0.000000 +G01 X2716.000000 Y-301.633500 Z0.000000 +G01 X2644.000000 Y-278.833700 Z0.000000 +G01 X2644.000000 Y-267.504300 Z0.000000 +G01 X2716.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6096) + + +(Start cutting path id: path6044) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2636.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2564.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2564.000000 Y-230.841800 Z0.000000 +G01 X2636.000000 Y-253.641600 Z0.000000 +G01 X2636.000000 Y-242.312300 Z0.000000 +G01 X2564.000000 Y-219.512400 Z0.000000 +G01 X2564.000000 Y-208.183100 Z0.000000 +G01 X2636.000000 Y-230.982900 Z0.000000 +G01 X2636.000000 Y-219.653600 Z0.000000 +G01 X2564.000000 Y-196.853700 Z0.000000 +G01 X2564.000000 Y-185.524340 Z0.000000 +G01 X2636.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6044) + + +(Start cutting path id: path5992) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2556.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2484.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2484.000000 Y-148.861790 Z0.000000 +G01 X2556.000000 Y-171.661670 Z0.000000 +G01 X2556.000000 Y-160.332320 Z0.000000 +G01 X2484.000000 Y-137.532440 Z0.000000 +G01 X2484.000000 Y-126.203090 Z0.000000 +G01 X2556.000000 Y-149.002970 Z0.000000 +G01 X2556.000000 Y-137.673620 Z0.000000 +G01 X2484.000000 Y-114.873740 Z0.000000 +G01 X2484.000000 Y-103.544380 Z0.000000 +G01 X2556.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5992) + + +(Start cutting path id: path5940) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2476.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2404.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2404.000000 Y-66.881830 Z0.000000 +G01 X2476.000000 Y-89.681710 Z0.000000 +G01 X2476.000000 Y-78.352360 Z0.000000 +G01 X2404.000000 Y-55.552480 Z0.000000 +G01 X2404.000000 Y-44.223130 Z0.000000 +G01 X2476.000000 Y-67.023010 Z0.000000 +G01 X2476.000000 Y-55.693660 Z0.000000 +G01 X2404.000000 Y-32.893780 Z0.000000 +G01 X2404.000000 Y-21.564430 Z0.000000 +G01 X2476.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5940) + + +(Start cutting path id: path5888) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2396.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2324.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2324.000000 Y15.098120 Z0.000000 +G01 X2396.000000 Y-7.701760 Z0.000000 +G01 X2396.000000 Y3.627590 Z0.000000 +G01 X2324.000000 Y26.427470 Z0.000000 +G01 X2324.000000 Y37.756830 Z0.000000 +G01 X2396.000000 Y14.956950 Z0.000000 +G01 X2396.000000 Y26.286300 Z0.000000 +G01 X2324.000000 Y49.086180 Z0.000000 +G01 X2324.000000 Y60.415530 Z0.000000 +G01 X2396.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5888) + + +(Start cutting path id: path5836) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2316.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2244.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2244.000000 Y97.078080 Z0.000000 +G01 X2316.000000 Y74.278200 Z0.000000 +G01 X2316.000000 Y85.607550 Z0.000000 +G01 X2244.000000 Y108.407430 Z0.000000 +G01 X2244.000000 Y119.736790 Z0.000000 +G01 X2316.000000 Y96.936910 Z0.000000 +G01 X2316.000000 Y108.266260 Z0.000000 +G01 X2244.000000 Y131.066140 Z0.000000 +G01 X2244.000000 Y142.395480 Z0.000000 +G01 X2316.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5836) + + +(Start cutting path id: path5784) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2236.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2164.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2164.000000 Y179.058040 Z0.000000 +G01 X2236.000000 Y156.258160 Z0.000000 +G01 X2236.000000 Y167.587510 Z0.000000 +G01 X2164.000000 Y190.387390 Z0.000000 +G01 X2164.000000 Y201.716740 Z0.000000 +G01 X2236.000000 Y178.916860 Z0.000000 +G01 X2236.000000 Y190.246210 Z0.000000 +G01 X2164.000000 Y213.046090 Z0.000000 +G01 X2164.000000 Y224.375390 Z0.000000 +G01 X2236.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5784) + + +(Start cutting path id: path5732) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2156.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2084.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2084.000000 Y261.037990 Z0.000000 +G01 X2156.000000 Y238.238090 Z0.000000 +G01 X2156.000000 Y249.567490 Z0.000000 +G01 X2084.000000 Y272.367390 Z0.000000 +G01 X2084.000000 Y283.696690 Z0.000000 +G01 X2156.000000 Y260.896790 Z0.000000 +G01 X2156.000000 Y272.226190 Z0.000000 +G01 X2084.000000 Y295.026090 Z0.000000 +G01 X2084.000000 Y306.355390 Z0.000000 +G01 X2156.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5732) + + +(Start cutting path id: path5736) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2080.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2080.000000 Y361.436490 Z0.000000 F200.000000 +G01 X2100.000000 Y367.769790 Z0.000000 +G01 X2100.000000 Y316.787690 Z0.000000 +G01 X2120.000000 Y323.120990 Z0.000000 +G01 X2120.000000 Y374.103090 Z0.000000 +G01 X2140.000000 Y380.436390 Z0.000000 +G01 X2140.000000 Y329.454290 Z0.000000 +G01 X2160.000000 Y335.787590 Z0.000000 +G01 X2160.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5736) + + +(Start cutting path id: path5680) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2076.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2004.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2004.000000 Y343.017990 Z0.000000 +G01 X2076.000000 Y320.218090 Z0.000000 +G01 X2076.000000 Y331.547390 Z0.000000 +G01 X2004.000000 Y354.347290 Z0.000000 +G01 X2004.000000 Y365.676690 Z0.000000 +G01 X2076.000000 Y342.876790 Z0.000000 +G01 X2076.000000 Y354.206090 Z0.000000 +G01 X2004.000000 Y377.005990 Z0.000000 +G01 X2004.000000 Y388.335390 Z0.000000 +G01 X2076.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5680) + + +(Start cutting path id: path5682) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1920.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5682) + + +(Start cutting path id: path5676) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1924.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1996.000000 Y331.688590 Z0.000000 F200.000000 +G01 X2022.666700 Y323.244190 Z0.000000 +G01 X1950.666700 Y300.444290 Z0.000000 +G01 X1977.333300 Y291.999890 Z0.000000 +G01 X2049.333300 Y314.799790 Z0.000000 +G01 X2076.000000 Y306.355390 Z0.000000 +G01 X2004.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5676) + + +(Start cutting path id: path5730) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2000.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y279.456490 Z0.000000 F200.000000 +G01 X2020.000000 Y285.789790 Z0.000000 +G01 X2020.000000 Y234.807790 Z0.000000 +G01 X2040.000000 Y241.141090 Z0.000000 +G01 X2040.000000 Y292.123090 Z0.000000 +G01 X2060.000000 Y298.456390 Z0.000000 +G01 X2060.000000 Y247.474390 Z0.000000 +G01 X2080.000000 Y253.807690 Z0.000000 +G01 X2080.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5730) + + +(Start cutting path id: path5728) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2004.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2076.000000 Y249.708690 Z0.000000 F200.000000 +G01 X2102.666700 Y241.264290 Z0.000000 +G01 X2030.666700 Y218.464390 Z0.000000 +G01 X2057.333300 Y210.019970 Z0.000000 +G01 X2129.333300 Y232.819890 Z0.000000 +G01 X2156.000000 Y224.375490 Z0.000000 +G01 X2084.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5728) + + +(Start cutting path id: path5782) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2080.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2080.000000 Y197.476570 Z0.000000 F200.000000 +G01 X2100.000000 Y203.809870 Z0.000000 +G01 X2100.000000 Y152.827780 Z0.000000 +G01 X2120.000000 Y159.161080 Z0.000000 +G01 X2120.000000 Y210.143170 Z0.000000 +G01 X2140.000000 Y216.476490 Z0.000000 +G01 X2140.000000 Y165.494380 Z0.000000 +G01 X2160.000000 Y171.827680 Z0.000000 +G01 X2160.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5782) + + +(Start cutting path id: path5780) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2084.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2156.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2182.666700 Y159.284290 Z0.000000 +G01 X2110.666700 Y136.484410 Z0.000000 +G01 X2137.333300 Y128.040010 Z0.000000 +G01 X2209.333300 Y150.839890 Z0.000000 +G01 X2236.000000 Y142.395480 Z0.000000 +G01 X2164.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5780) + + +(Start cutting path id: path5834) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2160.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2160.000000 Y115.496610 Z0.000000 F200.000000 +G01 X2180.000000 Y121.829910 Z0.000000 +G01 X2180.000000 Y70.847830 Z0.000000 +G01 X2200.000000 Y77.181130 Z0.000000 +G01 X2200.000000 Y128.163210 Z0.000000 +G01 X2220.000000 Y134.496510 Z0.000000 +G01 X2220.000000 Y83.514430 Z0.000000 +G01 X2240.000000 Y89.847730 Z0.000000 +G01 X2240.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5834) + + +(Start cutting path id: path5832) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2164.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2236.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2262.666700 Y77.304330 Z0.000000 +G01 X2190.666700 Y54.504450 Z0.000000 +G01 X2217.333300 Y46.060050 Z0.000000 +G01 X2289.333300 Y68.859930 Z0.000000 +G01 X2316.000000 Y60.415530 Z0.000000 +G01 X2244.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5832) + + +(Start cutting path id: path5886) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2240.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2240.000000 Y33.516650 Z0.000000 F200.000000 +G01 X2260.000000 Y39.849950 Z0.000000 +G01 X2260.000000 Y-11.132130 Z0.000000 +G01 X2280.000000 Y-4.798830 Z0.000000 +G01 X2280.000000 Y46.183250 Z0.000000 +G01 X2300.000000 Y52.516550 Z0.000000 +G01 X2300.000000 Y1.534470 Z0.000000 +G01 X2320.000000 Y7.867770 Z0.000000 +G01 X2320.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5886) + + +(Start cutting path id: path5884) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2244.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2316.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2342.666700 Y-4.675630 Z0.000000 +G01 X2270.666700 Y-27.475510 Z0.000000 +G01 X2297.333300 Y-35.919910 Z0.000000 +G01 X2369.333300 Y-13.120030 Z0.000000 +G01 X2396.000000 Y-21.564430 Z0.000000 +G01 X2324.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5884) + + +(Start cutting path id: path5938) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2320.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2320.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X2340.000000 Y-42.130010 Z0.000000 +G01 X2340.000000 Y-93.112090 Z0.000000 +G01 X2360.000000 Y-86.778790 Z0.000000 +G01 X2360.000000 Y-35.796710 Z0.000000 +G01 X2380.000000 Y-29.463410 Z0.000000 +G01 X2380.000000 Y-80.445490 Z0.000000 +G01 X2400.000000 Y-74.112190 Z0.000000 +G01 X2400.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5938) + + +(Start cutting path id: path5936) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2324.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2396.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2422.666700 Y-86.655590 Z0.000000 +G01 X2350.666700 Y-109.455470 Z0.000000 +G01 X2377.333300 Y-117.899870 Z0.000000 +G01 X2449.333300 Y-95.099990 Z0.000000 +G01 X2476.000000 Y-103.544380 Z0.000000 +G01 X2404.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5936) + + +(Start cutting path id: path5990) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2400.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X2420.000000 Y-124.109960 Z0.000000 +G01 X2420.000000 Y-175.092050 Z0.000000 +G01 X2440.000000 Y-168.758750 Z0.000000 +G01 X2440.000000 Y-117.776660 Z0.000000 +G01 X2460.000000 Y-111.443360 Z0.000000 +G01 X2460.000000 Y-162.425450 Z0.000000 +G01 X2480.000000 Y-156.092150 Z0.000000 +G01 X2480.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5990) + + +(Start cutting path id: path5988) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2404.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2476.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2502.666700 Y-168.635550 Z0.000000 +G01 X2430.666700 Y-191.435430 Z0.000000 +G01 X2457.333300 Y-199.879820 Z0.000000 +G01 X2529.333300 Y-177.079940 Z0.000000 +G01 X2556.000000 Y-185.524340 Z0.000000 +G01 X2484.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5988) + + +(Start cutting path id: path6042) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2480.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2480.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X2500.000000 Y-206.089900 Z0.000000 +G01 X2500.000000 Y-257.072000 Z0.000000 +G01 X2520.000000 Y-250.738700 Z0.000000 +G01 X2520.000000 Y-199.756620 Z0.000000 +G01 X2540.000000 Y-193.423320 Z0.000000 +G01 X2540.000000 Y-244.405400 Z0.000000 +G01 X2560.000000 Y-238.072100 Z0.000000 +G01 X2560.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6042) + + +(Start cutting path id: path6040) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2484.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2556.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2582.666700 Y-250.615500 Z0.000000 +G01 X2510.666700 Y-273.415400 Z0.000000 +G01 X2537.333300 Y-281.859800 Z0.000000 +G01 X2609.333300 Y-259.059900 Z0.000000 +G01 X2636.000000 Y-267.504300 Z0.000000 +G01 X2564.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6040) + + +(Start cutting path id: path6094) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2560.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2560.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X2580.000000 Y-288.069900 Z0.000000 +G01 X2580.000000 Y-339.052000 Z0.000000 +G01 X2600.000000 Y-332.718700 Z0.000000 +G01 X2600.000000 Y-281.736600 Z0.000000 +G01 X2620.000000 Y-275.403300 Z0.000000 +G01 X2620.000000 Y-326.385400 Z0.000000 +G01 X2640.000000 Y-320.052100 Z0.000000 +G01 X2640.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6094) + + +(Start cutting path id: path6092) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2564.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2636.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2662.666700 Y-332.595500 Z0.000000 +G01 X2590.666700 Y-355.395300 Z0.000000 +G01 X2617.333300 Y-363.839700 Z0.000000 +G01 X2689.333300 Y-341.039900 Z0.000000 +G01 X2716.000000 Y-349.484300 Z0.000000 +G01 X2644.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6092) + + +(Start cutting path id: path6090) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2560.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2640.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6090) + + +(Start cutting path id: path6038) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2556.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2484.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2484.000000 Y-312.821700 Z0.000000 +G01 X2556.000000 Y-335.621600 Z0.000000 +G01 X2556.000000 Y-324.292200 Z0.000000 +G01 X2484.000000 Y-301.492400 Z0.000000 +G01 X2484.000000 Y-290.163000 Z0.000000 +G01 X2556.000000 Y-312.962900 Z0.000000 +G01 X2556.000000 Y-301.633500 Z0.000000 +G01 X2484.000000 Y-278.833700 Z0.000000 +G01 X2484.000000 Y-267.504300 Z0.000000 +G01 X2556.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6038) + + +(Start cutting path id: path5986) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2476.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2404.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2404.000000 Y-230.841800 Z0.000000 +G01 X2476.000000 Y-253.641600 Z0.000000 +G01 X2476.000000 Y-242.312300 Z0.000000 +G01 X2404.000000 Y-219.512400 Z0.000000 +G01 X2404.000000 Y-208.183100 Z0.000000 +G01 X2476.000000 Y-230.982900 Z0.000000 +G01 X2476.000000 Y-219.653600 Z0.000000 +G01 X2404.000000 Y-196.853700 Z0.000000 +G01 X2404.000000 Y-185.524340 Z0.000000 +G01 X2476.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5986) + + +(Start cutting path id: path5934) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2396.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2324.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2324.000000 Y-148.861790 Z0.000000 +G01 X2396.000000 Y-171.661670 Z0.000000 +G01 X2396.000000 Y-160.332320 Z0.000000 +G01 X2324.000000 Y-137.532440 Z0.000000 +G01 X2324.000000 Y-126.203090 Z0.000000 +G01 X2396.000000 Y-149.002970 Z0.000000 +G01 X2396.000000 Y-137.673620 Z0.000000 +G01 X2324.000000 Y-114.873740 Z0.000000 +G01 X2324.000000 Y-103.544380 Z0.000000 +G01 X2396.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5934) + + +(Start cutting path id: path5882) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2316.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2244.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2244.000000 Y-66.881830 Z0.000000 +G01 X2316.000000 Y-89.681710 Z0.000000 +G01 X2316.000000 Y-78.352360 Z0.000000 +G01 X2244.000000 Y-55.552480 Z0.000000 +G01 X2244.000000 Y-44.223130 Z0.000000 +G01 X2316.000000 Y-67.023010 Z0.000000 +G01 X2316.000000 Y-55.693660 Z0.000000 +G01 X2244.000000 Y-32.893780 Z0.000000 +G01 X2244.000000 Y-21.564430 Z0.000000 +G01 X2316.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5882) + + +(Start cutting path id: path5830) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2236.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2164.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2164.000000 Y15.098120 Z0.000000 +G01 X2236.000000 Y-7.701760 Z0.000000 +G01 X2236.000000 Y3.627590 Z0.000000 +G01 X2164.000000 Y26.427470 Z0.000000 +G01 X2164.000000 Y37.756830 Z0.000000 +G01 X2236.000000 Y14.956950 Z0.000000 +G01 X2236.000000 Y26.286300 Z0.000000 +G01 X2164.000000 Y49.086180 Z0.000000 +G01 X2164.000000 Y60.415530 Z0.000000 +G01 X2236.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5830) + + +(Start cutting path id: path5778) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2156.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2084.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2084.000000 Y97.078080 Z0.000000 +G01 X2156.000000 Y74.278200 Z0.000000 +G01 X2156.000000 Y85.607550 Z0.000000 +G01 X2084.000000 Y108.407430 Z0.000000 +G01 X2084.000000 Y119.736790 Z0.000000 +G01 X2156.000000 Y96.936910 Z0.000000 +G01 X2156.000000 Y108.266260 Z0.000000 +G01 X2084.000000 Y131.066140 Z0.000000 +G01 X2084.000000 Y142.395480 Z0.000000 +G01 X2156.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5778) + + +(Start cutting path id: path5726) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2076.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2004.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2004.000000 Y179.058040 Z0.000000 +G01 X2076.000000 Y156.258160 Z0.000000 +G01 X2076.000000 Y167.587510 Z0.000000 +G01 X2004.000000 Y190.387390 Z0.000000 +G01 X2004.000000 Y201.716740 Z0.000000 +G01 X2076.000000 Y178.916860 Z0.000000 +G01 X2076.000000 Y190.246210 Z0.000000 +G01 X2004.000000 Y213.046090 Z0.000000 +G01 X2004.000000 Y224.375390 Z0.000000 +G01 X2076.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5726) + + +(Start cutting path id: path5674) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1996.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1924.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1924.000000 Y261.037990 Z0.000000 +G01 X1996.000000 Y238.238090 Z0.000000 +G01 X1996.000000 Y249.567490 Z0.000000 +G01 X1924.000000 Y272.367390 Z0.000000 +G01 X1924.000000 Y283.696690 Z0.000000 +G01 X1996.000000 Y260.896790 Z0.000000 +G01 X1996.000000 Y272.226190 Z0.000000 +G01 X1924.000000 Y295.026090 Z0.000000 +G01 X1924.000000 Y306.355390 Z0.000000 +G01 X1996.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5674) + + +(Start cutting path id: path5678) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1920.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1920.000000 Y361.436490 Z0.000000 F200.000000 +G01 X1940.000000 Y367.769790 Z0.000000 +G01 X1940.000000 Y316.787690 Z0.000000 +G01 X1960.000000 Y323.120990 Z0.000000 +G01 X1960.000000 Y374.103090 Z0.000000 +G01 X1980.000000 Y380.436390 Z0.000000 +G01 X1980.000000 Y329.454290 Z0.000000 +G01 X2000.000000 Y335.787590 Z0.000000 +G01 X2000.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5678) + + +(Start cutting path id: path5622) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1916.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1844.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1844.000000 Y343.017990 Z0.000000 +G01 X1916.000000 Y320.218090 Z0.000000 +G01 X1916.000000 Y331.547390 Z0.000000 +G01 X1844.000000 Y354.347290 Z0.000000 +G01 X1844.000000 Y365.676690 Z0.000000 +G01 X1916.000000 Y342.876790 Z0.000000 +G01 X1916.000000 Y354.206090 Z0.000000 +G01 X1844.000000 Y377.005990 Z0.000000 +G01 X1844.000000 Y388.335390 Z0.000000 +G01 X1916.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5622) + + +(Start cutting path id: path5624) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1760.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1840.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5624) + + +(Start cutting path id: path5618) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1764.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1836.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1862.666700 Y323.244190 Z0.000000 +G01 X1790.666700 Y300.444290 Z0.000000 +G01 X1817.333300 Y291.999890 Z0.000000 +G01 X1889.333300 Y314.799790 Z0.000000 +G01 X1916.000000 Y306.355390 Z0.000000 +G01 X1844.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5618) + + +(Start cutting path id: path5672) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1840.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1840.000000 Y279.456490 Z0.000000 F200.000000 +G01 X1860.000000 Y285.789790 Z0.000000 +G01 X1860.000000 Y234.807790 Z0.000000 +G01 X1880.000000 Y241.141090 Z0.000000 +G01 X1880.000000 Y292.123090 Z0.000000 +G01 X1900.000000 Y298.456390 Z0.000000 +G01 X1900.000000 Y247.474390 Z0.000000 +G01 X1920.000000 Y253.807690 Z0.000000 +G01 X1920.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5672) + + +(Start cutting path id: path5670) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1844.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1916.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1942.666700 Y241.264290 Z0.000000 +G01 X1870.666700 Y218.464390 Z0.000000 +G01 X1897.333300 Y210.019970 Z0.000000 +G01 X1969.333300 Y232.819890 Z0.000000 +G01 X1996.000000 Y224.375490 Z0.000000 +G01 X1924.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5670) + + +(Start cutting path id: path5724) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1920.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1920.000000 Y197.476570 Z0.000000 F200.000000 +G01 X1940.000000 Y203.809870 Z0.000000 +G01 X1940.000000 Y152.827780 Z0.000000 +G01 X1960.000000 Y159.161080 Z0.000000 +G01 X1960.000000 Y210.143170 Z0.000000 +G01 X1980.000000 Y216.476490 Z0.000000 +G01 X1980.000000 Y165.494380 Z0.000000 +G01 X2000.000000 Y171.827680 Z0.000000 +G01 X2000.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5724) + + +(Start cutting path id: path5722) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1924.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1996.000000 Y167.728680 Z0.000000 F200.000000 +G01 X2022.666700 Y159.284290 Z0.000000 +G01 X1950.666700 Y136.484410 Z0.000000 +G01 X1977.333300 Y128.040010 Z0.000000 +G01 X2049.333300 Y150.839890 Z0.000000 +G01 X2076.000000 Y142.395480 Z0.000000 +G01 X2004.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5722) + + +(Start cutting path id: path5776) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2000.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y115.496610 Z0.000000 F200.000000 +G01 X2020.000000 Y121.829910 Z0.000000 +G01 X2020.000000 Y70.847830 Z0.000000 +G01 X2040.000000 Y77.181130 Z0.000000 +G01 X2040.000000 Y128.163210 Z0.000000 +G01 X2060.000000 Y134.496510 Z0.000000 +G01 X2060.000000 Y83.514430 Z0.000000 +G01 X2080.000000 Y89.847730 Z0.000000 +G01 X2080.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5776) + + +(Start cutting path id: path5774) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2004.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2076.000000 Y85.748730 Z0.000000 F200.000000 +G01 X2102.666700 Y77.304330 Z0.000000 +G01 X2030.666700 Y54.504450 Z0.000000 +G01 X2057.333300 Y46.060050 Z0.000000 +G01 X2129.333300 Y68.859930 Z0.000000 +G01 X2156.000000 Y60.415530 Z0.000000 +G01 X2084.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5774) + + +(Start cutting path id: path5828) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2080.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2080.000000 Y33.516650 Z0.000000 F200.000000 +G01 X2100.000000 Y39.849950 Z0.000000 +G01 X2100.000000 Y-11.132130 Z0.000000 +G01 X2120.000000 Y-4.798830 Z0.000000 +G01 X2120.000000 Y46.183250 Z0.000000 +G01 X2140.000000 Y52.516550 Z0.000000 +G01 X2140.000000 Y1.534470 Z0.000000 +G01 X2160.000000 Y7.867770 Z0.000000 +G01 X2160.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5828) + + +(Start cutting path id: path5826) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2084.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2156.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2182.666700 Y-4.675630 Z0.000000 +G01 X2110.666700 Y-27.475510 Z0.000000 +G01 X2137.333300 Y-35.919910 Z0.000000 +G01 X2209.333300 Y-13.120030 Z0.000000 +G01 X2236.000000 Y-21.564430 Z0.000000 +G01 X2164.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5826) + + +(Start cutting path id: path5880) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2160.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2160.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X2180.000000 Y-42.130010 Z0.000000 +G01 X2180.000000 Y-93.112090 Z0.000000 +G01 X2200.000000 Y-86.778790 Z0.000000 +G01 X2200.000000 Y-35.796710 Z0.000000 +G01 X2220.000000 Y-29.463410 Z0.000000 +G01 X2220.000000 Y-80.445490 Z0.000000 +G01 X2240.000000 Y-74.112190 Z0.000000 +G01 X2240.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5880) + + +(Start cutting path id: path5878) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2164.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2236.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2262.666700 Y-86.655590 Z0.000000 +G01 X2190.666700 Y-109.455470 Z0.000000 +G01 X2217.333300 Y-117.899870 Z0.000000 +G01 X2289.333300 Y-95.099990 Z0.000000 +G01 X2316.000000 Y-103.544380 Z0.000000 +G01 X2244.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5878) + + +(Start cutting path id: path5932) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2240.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2240.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X2260.000000 Y-124.109960 Z0.000000 +G01 X2260.000000 Y-175.092050 Z0.000000 +G01 X2280.000000 Y-168.758750 Z0.000000 +G01 X2280.000000 Y-117.776660 Z0.000000 +G01 X2300.000000 Y-111.443360 Z0.000000 +G01 X2300.000000 Y-162.425450 Z0.000000 +G01 X2320.000000 Y-156.092150 Z0.000000 +G01 X2320.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5932) + + +(Start cutting path id: path5930) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2244.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2316.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2342.666700 Y-168.635550 Z0.000000 +G01 X2270.666700 Y-191.435430 Z0.000000 +G01 X2297.333300 Y-199.879820 Z0.000000 +G01 X2369.333300 Y-177.079940 Z0.000000 +G01 X2396.000000 Y-185.524340 Z0.000000 +G01 X2324.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5930) + + +(Start cutting path id: path5984) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2320.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2320.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X2340.000000 Y-206.089900 Z0.000000 +G01 X2340.000000 Y-257.072000 Z0.000000 +G01 X2360.000000 Y-250.738700 Z0.000000 +G01 X2360.000000 Y-199.756620 Z0.000000 +G01 X2380.000000 Y-193.423320 Z0.000000 +G01 X2380.000000 Y-244.405400 Z0.000000 +G01 X2400.000000 Y-238.072100 Z0.000000 +G01 X2400.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5984) + + +(Start cutting path id: path5982) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2324.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2396.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2422.666700 Y-250.615500 Z0.000000 +G01 X2350.666700 Y-273.415400 Z0.000000 +G01 X2377.333300 Y-281.859800 Z0.000000 +G01 X2449.333300 Y-259.059900 Z0.000000 +G01 X2476.000000 Y-267.504300 Z0.000000 +G01 X2404.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5982) + + +(Start cutting path id: path6036) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2400.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X2420.000000 Y-288.069900 Z0.000000 +G01 X2420.000000 Y-339.052000 Z0.000000 +G01 X2440.000000 Y-332.718700 Z0.000000 +G01 X2440.000000 Y-281.736600 Z0.000000 +G01 X2460.000000 Y-275.403300 Z0.000000 +G01 X2460.000000 Y-326.385400 Z0.000000 +G01 X2480.000000 Y-320.052100 Z0.000000 +G01 X2480.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6036) + + +(Start cutting path id: path6034) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2404.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2476.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2502.666700 Y-332.595500 Z0.000000 +G01 X2430.666700 Y-355.395300 Z0.000000 +G01 X2457.333300 Y-363.839700 Z0.000000 +G01 X2529.333300 Y-341.039900 Z0.000000 +G01 X2556.000000 Y-349.484300 Z0.000000 +G01 X2484.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6034) + + +(Start cutting path id: path6032) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2480.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path6032) + + +(Start cutting path id: path5980) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2396.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2324.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2324.000000 Y-312.821700 Z0.000000 +G01 X2396.000000 Y-335.621600 Z0.000000 +G01 X2396.000000 Y-324.292200 Z0.000000 +G01 X2324.000000 Y-301.492400 Z0.000000 +G01 X2324.000000 Y-290.163000 Z0.000000 +G01 X2396.000000 Y-312.962900 Z0.000000 +G01 X2396.000000 Y-301.633500 Z0.000000 +G01 X2324.000000 Y-278.833700 Z0.000000 +G01 X2324.000000 Y-267.504300 Z0.000000 +G01 X2396.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5980) + + +(Start cutting path id: path5928) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2316.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2244.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2244.000000 Y-230.841800 Z0.000000 +G01 X2316.000000 Y-253.641600 Z0.000000 +G01 X2316.000000 Y-242.312300 Z0.000000 +G01 X2244.000000 Y-219.512400 Z0.000000 +G01 X2244.000000 Y-208.183100 Z0.000000 +G01 X2316.000000 Y-230.982900 Z0.000000 +G01 X2316.000000 Y-219.653600 Z0.000000 +G01 X2244.000000 Y-196.853700 Z0.000000 +G01 X2244.000000 Y-185.524340 Z0.000000 +G01 X2316.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5928) + + +(Start cutting path id: path5876) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2236.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2164.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2164.000000 Y-148.861790 Z0.000000 +G01 X2236.000000 Y-171.661670 Z0.000000 +G01 X2236.000000 Y-160.332320 Z0.000000 +G01 X2164.000000 Y-137.532440 Z0.000000 +G01 X2164.000000 Y-126.203090 Z0.000000 +G01 X2236.000000 Y-149.002970 Z0.000000 +G01 X2236.000000 Y-137.673620 Z0.000000 +G01 X2164.000000 Y-114.873740 Z0.000000 +G01 X2164.000000 Y-103.544380 Z0.000000 +G01 X2236.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5876) + + +(Start cutting path id: path5824) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2156.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2084.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2084.000000 Y-66.881830 Z0.000000 +G01 X2156.000000 Y-89.681710 Z0.000000 +G01 X2156.000000 Y-78.352360 Z0.000000 +G01 X2084.000000 Y-55.552480 Z0.000000 +G01 X2084.000000 Y-44.223130 Z0.000000 +G01 X2156.000000 Y-67.023010 Z0.000000 +G01 X2156.000000 Y-55.693660 Z0.000000 +G01 X2084.000000 Y-32.893780 Z0.000000 +G01 X2084.000000 Y-21.564430 Z0.000000 +G01 X2156.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5824) + + +(Start cutting path id: path5772) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2076.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2004.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2004.000000 Y15.098120 Z0.000000 +G01 X2076.000000 Y-7.701760 Z0.000000 +G01 X2076.000000 Y3.627590 Z0.000000 +G01 X2004.000000 Y26.427470 Z0.000000 +G01 X2004.000000 Y37.756830 Z0.000000 +G01 X2076.000000 Y14.956950 Z0.000000 +G01 X2076.000000 Y26.286300 Z0.000000 +G01 X2004.000000 Y49.086180 Z0.000000 +G01 X2004.000000 Y60.415530 Z0.000000 +G01 X2076.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5772) + + +(Start cutting path id: path5720) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1996.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1924.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1924.000000 Y97.078080 Z0.000000 +G01 X1996.000000 Y74.278200 Z0.000000 +G01 X1996.000000 Y85.607550 Z0.000000 +G01 X1924.000000 Y108.407430 Z0.000000 +G01 X1924.000000 Y119.736790 Z0.000000 +G01 X1996.000000 Y96.936910 Z0.000000 +G01 X1996.000000 Y108.266260 Z0.000000 +G01 X1924.000000 Y131.066140 Z0.000000 +G01 X1924.000000 Y142.395480 Z0.000000 +G01 X1996.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5720) + + +(Start cutting path id: path5668) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1916.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1844.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1844.000000 Y179.058040 Z0.000000 +G01 X1916.000000 Y156.258160 Z0.000000 +G01 X1916.000000 Y167.587510 Z0.000000 +G01 X1844.000000 Y190.387390 Z0.000000 +G01 X1844.000000 Y201.716740 Z0.000000 +G01 X1916.000000 Y178.916860 Z0.000000 +G01 X1916.000000 Y190.246210 Z0.000000 +G01 X1844.000000 Y213.046090 Z0.000000 +G01 X1844.000000 Y224.375390 Z0.000000 +G01 X1916.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5668) + + +(Start cutting path id: path5616) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1836.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1764.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1764.000000 Y261.037990 Z0.000000 +G01 X1836.000000 Y238.238090 Z0.000000 +G01 X1836.000000 Y249.567490 Z0.000000 +G01 X1764.000000 Y272.367390 Z0.000000 +G01 X1764.000000 Y283.696690 Z0.000000 +G01 X1836.000000 Y260.896790 Z0.000000 +G01 X1836.000000 Y272.226190 Z0.000000 +G01 X1764.000000 Y295.026090 Z0.000000 +G01 X1764.000000 Y306.355390 Z0.000000 +G01 X1836.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5616) + + +(Start cutting path id: path5620) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1760.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1760.000000 Y361.436490 Z0.000000 F200.000000 +G01 X1780.000000 Y367.769790 Z0.000000 +G01 X1780.000000 Y316.787690 Z0.000000 +G01 X1800.000000 Y323.120990 Z0.000000 +G01 X1800.000000 Y374.103090 Z0.000000 +G01 X1820.000000 Y380.436390 Z0.000000 +G01 X1820.000000 Y329.454290 Z0.000000 +G01 X1840.000000 Y335.787590 Z0.000000 +G01 X1840.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5620) + + +(Start cutting path id: path5564) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1756.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1684.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1684.000000 Y343.017990 Z0.000000 +G01 X1756.000000 Y320.218090 Z0.000000 +G01 X1756.000000 Y331.547390 Z0.000000 +G01 X1684.000000 Y354.347290 Z0.000000 +G01 X1684.000000 Y365.676690 Z0.000000 +G01 X1756.000000 Y342.876790 Z0.000000 +G01 X1756.000000 Y354.206090 Z0.000000 +G01 X1684.000000 Y377.005990 Z0.000000 +G01 X1684.000000 Y388.335390 Z0.000000 +G01 X1756.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5564) + + +(Start cutting path id: path5566) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1680.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5566) + + +(Start cutting path id: path5560) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1604.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1676.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1702.666700 Y323.244190 Z0.000000 +G01 X1630.666700 Y300.444290 Z0.000000 +G01 X1657.333300 Y291.999890 Z0.000000 +G01 X1729.333300 Y314.799790 Z0.000000 +G01 X1756.000000 Y306.355390 Z0.000000 +G01 X1684.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5560) + + +(Start cutting path id: path5614) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1680.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1680.000000 Y279.456490 Z0.000000 F200.000000 +G01 X1700.000000 Y285.789790 Z0.000000 +G01 X1700.000000 Y234.807790 Z0.000000 +G01 X1720.000000 Y241.141090 Z0.000000 +G01 X1720.000000 Y292.123090 Z0.000000 +G01 X1740.000000 Y298.456390 Z0.000000 +G01 X1740.000000 Y247.474390 Z0.000000 +G01 X1760.000000 Y253.807690 Z0.000000 +G01 X1760.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5614) + + +(Start cutting path id: path5612) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1684.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1756.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1782.666700 Y241.264290 Z0.000000 +G01 X1710.666700 Y218.464390 Z0.000000 +G01 X1737.333300 Y210.019970 Z0.000000 +G01 X1809.333300 Y232.819890 Z0.000000 +G01 X1836.000000 Y224.375490 Z0.000000 +G01 X1764.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5612) + + +(Start cutting path id: path5666) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1760.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1760.000000 Y197.476570 Z0.000000 F200.000000 +G01 X1780.000000 Y203.809870 Z0.000000 +G01 X1780.000000 Y152.827780 Z0.000000 +G01 X1800.000000 Y159.161080 Z0.000000 +G01 X1800.000000 Y210.143170 Z0.000000 +G01 X1820.000000 Y216.476490 Z0.000000 +G01 X1820.000000 Y165.494380 Z0.000000 +G01 X1840.000000 Y171.827680 Z0.000000 +G01 X1840.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5666) + + +(Start cutting path id: path5664) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1764.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1836.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1862.666700 Y159.284290 Z0.000000 +G01 X1790.666700 Y136.484410 Z0.000000 +G01 X1817.333300 Y128.040010 Z0.000000 +G01 X1889.333300 Y150.839890 Z0.000000 +G01 X1916.000000 Y142.395480 Z0.000000 +G01 X1844.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5664) + + +(Start cutting path id: path5718) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1840.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1840.000000 Y115.496610 Z0.000000 F200.000000 +G01 X1860.000000 Y121.829910 Z0.000000 +G01 X1860.000000 Y70.847830 Z0.000000 +G01 X1880.000000 Y77.181130 Z0.000000 +G01 X1880.000000 Y128.163210 Z0.000000 +G01 X1900.000000 Y134.496510 Z0.000000 +G01 X1900.000000 Y83.514430 Z0.000000 +G01 X1920.000000 Y89.847730 Z0.000000 +G01 X1920.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5718) + + +(Start cutting path id: path5716) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1844.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1916.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1942.666700 Y77.304330 Z0.000000 +G01 X1870.666700 Y54.504450 Z0.000000 +G01 X1897.333300 Y46.060050 Z0.000000 +G01 X1969.333300 Y68.859930 Z0.000000 +G01 X1996.000000 Y60.415530 Z0.000000 +G01 X1924.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5716) + + +(Start cutting path id: path5770) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1920.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1920.000000 Y33.516650 Z0.000000 F200.000000 +G01 X1940.000000 Y39.849950 Z0.000000 +G01 X1940.000000 Y-11.132130 Z0.000000 +G01 X1960.000000 Y-4.798830 Z0.000000 +G01 X1960.000000 Y46.183250 Z0.000000 +G01 X1980.000000 Y52.516550 Z0.000000 +G01 X1980.000000 Y1.534470 Z0.000000 +G01 X2000.000000 Y7.867770 Z0.000000 +G01 X2000.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5770) + + +(Start cutting path id: path5768) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1924.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1996.000000 Y3.768770 Z0.000000 F200.000000 +G01 X2022.666700 Y-4.675630 Z0.000000 +G01 X1950.666700 Y-27.475510 Z0.000000 +G01 X1977.333300 Y-35.919910 Z0.000000 +G01 X2049.333300 Y-13.120030 Z0.000000 +G01 X2076.000000 Y-21.564430 Z0.000000 +G01 X2004.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5768) + + +(Start cutting path id: path5822) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2000.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X2020.000000 Y-42.130010 Z0.000000 +G01 X2020.000000 Y-93.112090 Z0.000000 +G01 X2040.000000 Y-86.778790 Z0.000000 +G01 X2040.000000 Y-35.796710 Z0.000000 +G01 X2060.000000 Y-29.463410 Z0.000000 +G01 X2060.000000 Y-80.445490 Z0.000000 +G01 X2080.000000 Y-74.112190 Z0.000000 +G01 X2080.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5822) + + +(Start cutting path id: path5820) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2004.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2076.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X2102.666700 Y-86.655590 Z0.000000 +G01 X2030.666700 Y-109.455470 Z0.000000 +G01 X2057.333300 Y-117.899870 Z0.000000 +G01 X2129.333300 Y-95.099990 Z0.000000 +G01 X2156.000000 Y-103.544380 Z0.000000 +G01 X2084.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5820) + + +(Start cutting path id: path5874) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2080.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2080.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X2100.000000 Y-124.109960 Z0.000000 +G01 X2100.000000 Y-175.092050 Z0.000000 +G01 X2120.000000 Y-168.758750 Z0.000000 +G01 X2120.000000 Y-117.776660 Z0.000000 +G01 X2140.000000 Y-111.443360 Z0.000000 +G01 X2140.000000 Y-162.425450 Z0.000000 +G01 X2160.000000 Y-156.092150 Z0.000000 +G01 X2160.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5874) + + +(Start cutting path id: path5872) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2084.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2156.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2182.666700 Y-168.635550 Z0.000000 +G01 X2110.666700 Y-191.435430 Z0.000000 +G01 X2137.333300 Y-199.879820 Z0.000000 +G01 X2209.333300 Y-177.079940 Z0.000000 +G01 X2236.000000 Y-185.524340 Z0.000000 +G01 X2164.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5872) + + +(Start cutting path id: path5926) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2160.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2160.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X2180.000000 Y-206.089900 Z0.000000 +G01 X2180.000000 Y-257.072000 Z0.000000 +G01 X2200.000000 Y-250.738700 Z0.000000 +G01 X2200.000000 Y-199.756620 Z0.000000 +G01 X2220.000000 Y-193.423320 Z0.000000 +G01 X2220.000000 Y-244.405400 Z0.000000 +G01 X2240.000000 Y-238.072100 Z0.000000 +G01 X2240.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5926) + + +(Start cutting path id: path5924) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2164.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2236.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2262.666700 Y-250.615500 Z0.000000 +G01 X2190.666700 Y-273.415400 Z0.000000 +G01 X2217.333300 Y-281.859800 Z0.000000 +G01 X2289.333300 Y-259.059900 Z0.000000 +G01 X2316.000000 Y-267.504300 Z0.000000 +G01 X2244.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5924) + + +(Start cutting path id: path5978) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2240.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2240.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X2260.000000 Y-288.069900 Z0.000000 +G01 X2260.000000 Y-339.052000 Z0.000000 +G01 X2280.000000 Y-332.718700 Z0.000000 +G01 X2280.000000 Y-281.736600 Z0.000000 +G01 X2300.000000 Y-275.403300 Z0.000000 +G01 X2300.000000 Y-326.385400 Z0.000000 +G01 X2320.000000 Y-320.052100 Z0.000000 +G01 X2320.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5978) + + +(Start cutting path id: path5976) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2244.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2316.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2342.666700 Y-332.595500 Z0.000000 +G01 X2270.666700 Y-355.395300 Z0.000000 +G01 X2297.333300 Y-363.839700 Z0.000000 +G01 X2369.333300 Y-341.039900 Z0.000000 +G01 X2396.000000 Y-349.484300 Z0.000000 +G01 X2324.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5976) + + +(Start cutting path id: path5974) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2240.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2320.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5974) + + +(Start cutting path id: path5922) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2236.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2164.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2164.000000 Y-312.821700 Z0.000000 +G01 X2236.000000 Y-335.621600 Z0.000000 +G01 X2236.000000 Y-324.292200 Z0.000000 +G01 X2164.000000 Y-301.492400 Z0.000000 +G01 X2164.000000 Y-290.163000 Z0.000000 +G01 X2236.000000 Y-312.962900 Z0.000000 +G01 X2236.000000 Y-301.633500 Z0.000000 +G01 X2164.000000 Y-278.833700 Z0.000000 +G01 X2164.000000 Y-267.504300 Z0.000000 +G01 X2236.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5922) + + +(Start cutting path id: path5870) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2156.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2084.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2084.000000 Y-230.841800 Z0.000000 +G01 X2156.000000 Y-253.641600 Z0.000000 +G01 X2156.000000 Y-242.312300 Z0.000000 +G01 X2084.000000 Y-219.512400 Z0.000000 +G01 X2084.000000 Y-208.183100 Z0.000000 +G01 X2156.000000 Y-230.982900 Z0.000000 +G01 X2156.000000 Y-219.653600 Z0.000000 +G01 X2084.000000 Y-196.853700 Z0.000000 +G01 X2084.000000 Y-185.524340 Z0.000000 +G01 X2156.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5870) + + +(Start cutting path id: path5818) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2076.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2004.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2004.000000 Y-148.861790 Z0.000000 +G01 X2076.000000 Y-171.661670 Z0.000000 +G01 X2076.000000 Y-160.332320 Z0.000000 +G01 X2004.000000 Y-137.532440 Z0.000000 +G01 X2004.000000 Y-126.203090 Z0.000000 +G01 X2076.000000 Y-149.002970 Z0.000000 +G01 X2076.000000 Y-137.673620 Z0.000000 +G01 X2004.000000 Y-114.873740 Z0.000000 +G01 X2004.000000 Y-103.544380 Z0.000000 +G01 X2076.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5818) + + +(Start cutting path id: path5766) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1996.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1924.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1924.000000 Y-66.881830 Z0.000000 +G01 X1996.000000 Y-89.681710 Z0.000000 +G01 X1996.000000 Y-78.352360 Z0.000000 +G01 X1924.000000 Y-55.552480 Z0.000000 +G01 X1924.000000 Y-44.223130 Z0.000000 +G01 X1996.000000 Y-67.023010 Z0.000000 +G01 X1996.000000 Y-55.693660 Z0.000000 +G01 X1924.000000 Y-32.893780 Z0.000000 +G01 X1924.000000 Y-21.564430 Z0.000000 +G01 X1996.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5766) + + +(Start cutting path id: path5714) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1916.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1844.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1844.000000 Y15.098120 Z0.000000 +G01 X1916.000000 Y-7.701760 Z0.000000 +G01 X1916.000000 Y3.627590 Z0.000000 +G01 X1844.000000 Y26.427470 Z0.000000 +G01 X1844.000000 Y37.756830 Z0.000000 +G01 X1916.000000 Y14.956950 Z0.000000 +G01 X1916.000000 Y26.286300 Z0.000000 +G01 X1844.000000 Y49.086180 Z0.000000 +G01 X1844.000000 Y60.415530 Z0.000000 +G01 X1916.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5714) + + +(Start cutting path id: path5662) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1836.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1764.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1764.000000 Y97.078080 Z0.000000 +G01 X1836.000000 Y74.278200 Z0.000000 +G01 X1836.000000 Y85.607550 Z0.000000 +G01 X1764.000000 Y108.407430 Z0.000000 +G01 X1764.000000 Y119.736790 Z0.000000 +G01 X1836.000000 Y96.936910 Z0.000000 +G01 X1836.000000 Y108.266260 Z0.000000 +G01 X1764.000000 Y131.066140 Z0.000000 +G01 X1764.000000 Y142.395480 Z0.000000 +G01 X1836.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5662) + + +(Start cutting path id: path5610) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1756.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1684.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1684.000000 Y179.058040 Z0.000000 +G01 X1756.000000 Y156.258160 Z0.000000 +G01 X1756.000000 Y167.587510 Z0.000000 +G01 X1684.000000 Y190.387390 Z0.000000 +G01 X1684.000000 Y201.716740 Z0.000000 +G01 X1756.000000 Y178.916860 Z0.000000 +G01 X1756.000000 Y190.246210 Z0.000000 +G01 X1684.000000 Y213.046090 Z0.000000 +G01 X1684.000000 Y224.375390 Z0.000000 +G01 X1756.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5610) + + +(Start cutting path id: path5558) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1676.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1604.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1604.000000 Y261.037990 Z0.000000 +G01 X1676.000000 Y238.238090 Z0.000000 +G01 X1676.000000 Y249.567490 Z0.000000 +G01 X1604.000000 Y272.367390 Z0.000000 +G01 X1604.000000 Y283.696690 Z0.000000 +G01 X1676.000000 Y260.896790 Z0.000000 +G01 X1676.000000 Y272.226190 Z0.000000 +G01 X1604.000000 Y295.026090 Z0.000000 +G01 X1604.000000 Y306.355390 Z0.000000 +G01 X1676.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5558) + + +(Start cutting path id: path5562) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1600.000000 Y361.436490 Z0.000000 F200.000000 +G01 X1620.000000 Y367.769790 Z0.000000 +G01 X1620.000000 Y316.787690 Z0.000000 +G01 X1640.000000 Y323.120990 Z0.000000 +G01 X1640.000000 Y374.103090 Z0.000000 +G01 X1660.000000 Y380.436390 Z0.000000 +G01 X1660.000000 Y329.454290 Z0.000000 +G01 X1680.000000 Y335.787590 Z0.000000 +G01 X1680.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5562) + + +(Start cutting path id: path5506) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1596.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1524.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1524.000000 Y343.017990 Z0.000000 +G01 X1596.000000 Y320.218090 Z0.000000 +G01 X1596.000000 Y331.547390 Z0.000000 +G01 X1524.000000 Y354.347290 Z0.000000 +G01 X1524.000000 Y365.676690 Z0.000000 +G01 X1596.000000 Y342.876790 Z0.000000 +G01 X1596.000000 Y354.206090 Z0.000000 +G01 X1524.000000 Y377.005990 Z0.000000 +G01 X1524.000000 Y388.335390 Z0.000000 +G01 X1596.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5506) + + +(Start cutting path id: path5508) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1440.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1520.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5508) + + +(Start cutting path id: path5502) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1444.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1516.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1542.666700 Y323.244190 Z0.000000 +G01 X1470.666700 Y300.444290 Z0.000000 +G01 X1497.333300 Y291.999890 Z0.000000 +G01 X1569.333300 Y314.799790 Z0.000000 +G01 X1596.000000 Y306.355390 Z0.000000 +G01 X1524.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5502) + + +(Start cutting path id: path5556) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1520.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1520.000000 Y279.456490 Z0.000000 F200.000000 +G01 X1540.000000 Y285.789790 Z0.000000 +G01 X1540.000000 Y234.807790 Z0.000000 +G01 X1560.000000 Y241.141090 Z0.000000 +G01 X1560.000000 Y292.123090 Z0.000000 +G01 X1580.000000 Y298.456390 Z0.000000 +G01 X1580.000000 Y247.474390 Z0.000000 +G01 X1600.000000 Y253.807690 Z0.000000 +G01 X1600.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5556) + + +(Start cutting path id: path5554) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1524.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1596.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1622.666700 Y241.264290 Z0.000000 +G01 X1550.666700 Y218.464390 Z0.000000 +G01 X1577.333300 Y210.019970 Z0.000000 +G01 X1649.333300 Y232.819890 Z0.000000 +G01 X1676.000000 Y224.375490 Z0.000000 +G01 X1604.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5554) + + +(Start cutting path id: path5608) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1600.000000 Y197.476570 Z0.000000 F200.000000 +G01 X1620.000000 Y203.809870 Z0.000000 +G01 X1620.000000 Y152.827780 Z0.000000 +G01 X1640.000000 Y159.161080 Z0.000000 +G01 X1640.000000 Y210.143170 Z0.000000 +G01 X1660.000000 Y216.476490 Z0.000000 +G01 X1660.000000 Y165.494380 Z0.000000 +G01 X1680.000000 Y171.827680 Z0.000000 +G01 X1680.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5608) + + +(Start cutting path id: path5606) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1604.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1676.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1702.666700 Y159.284290 Z0.000000 +G01 X1630.666700 Y136.484410 Z0.000000 +G01 X1657.333300 Y128.040010 Z0.000000 +G01 X1729.333300 Y150.839890 Z0.000000 +G01 X1756.000000 Y142.395480 Z0.000000 +G01 X1684.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5606) + + +(Start cutting path id: path5660) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1680.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1680.000000 Y115.496610 Z0.000000 F200.000000 +G01 X1700.000000 Y121.829910 Z0.000000 +G01 X1700.000000 Y70.847830 Z0.000000 +G01 X1720.000000 Y77.181130 Z0.000000 +G01 X1720.000000 Y128.163210 Z0.000000 +G01 X1740.000000 Y134.496510 Z0.000000 +G01 X1740.000000 Y83.514430 Z0.000000 +G01 X1760.000000 Y89.847730 Z0.000000 +G01 X1760.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5660) + + +(Start cutting path id: path5658) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1684.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1756.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1782.666700 Y77.304330 Z0.000000 +G01 X1710.666700 Y54.504450 Z0.000000 +G01 X1737.333300 Y46.060050 Z0.000000 +G01 X1809.333300 Y68.859930 Z0.000000 +G01 X1836.000000 Y60.415530 Z0.000000 +G01 X1764.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5658) + + +(Start cutting path id: path5712) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1760.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1760.000000 Y33.516650 Z0.000000 F200.000000 +G01 X1780.000000 Y39.849950 Z0.000000 +G01 X1780.000000 Y-11.132130 Z0.000000 +G01 X1800.000000 Y-4.798830 Z0.000000 +G01 X1800.000000 Y46.183250 Z0.000000 +G01 X1820.000000 Y52.516550 Z0.000000 +G01 X1820.000000 Y1.534470 Z0.000000 +G01 X1840.000000 Y7.867770 Z0.000000 +G01 X1840.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5712) + + +(Start cutting path id: path5710) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1764.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1836.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1862.666700 Y-4.675630 Z0.000000 +G01 X1790.666700 Y-27.475510 Z0.000000 +G01 X1817.333300 Y-35.919910 Z0.000000 +G01 X1889.333300 Y-13.120030 Z0.000000 +G01 X1916.000000 Y-21.564430 Z0.000000 +G01 X1844.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5710) + + +(Start cutting path id: path5764) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1840.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1840.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X1860.000000 Y-42.130010 Z0.000000 +G01 X1860.000000 Y-93.112090 Z0.000000 +G01 X1880.000000 Y-86.778790 Z0.000000 +G01 X1880.000000 Y-35.796710 Z0.000000 +G01 X1900.000000 Y-29.463410 Z0.000000 +G01 X1900.000000 Y-80.445490 Z0.000000 +G01 X1920.000000 Y-74.112190 Z0.000000 +G01 X1920.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5764) + + +(Start cutting path id: path5762) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1844.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1916.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1942.666700 Y-86.655590 Z0.000000 +G01 X1870.666700 Y-109.455470 Z0.000000 +G01 X1897.333300 Y-117.899870 Z0.000000 +G01 X1969.333300 Y-95.099990 Z0.000000 +G01 X1996.000000 Y-103.544380 Z0.000000 +G01 X1924.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5762) + + +(Start cutting path id: path5816) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1920.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1920.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X1940.000000 Y-124.109960 Z0.000000 +G01 X1940.000000 Y-175.092050 Z0.000000 +G01 X1960.000000 Y-168.758750 Z0.000000 +G01 X1960.000000 Y-117.776660 Z0.000000 +G01 X1980.000000 Y-111.443360 Z0.000000 +G01 X1980.000000 Y-162.425450 Z0.000000 +G01 X2000.000000 Y-156.092150 Z0.000000 +G01 X2000.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5816) + + +(Start cutting path id: path5814) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1924.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1996.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X2022.666700 Y-168.635550 Z0.000000 +G01 X1950.666700 Y-191.435430 Z0.000000 +G01 X1977.333300 Y-199.879820 Z0.000000 +G01 X2049.333300 Y-177.079940 Z0.000000 +G01 X2076.000000 Y-185.524340 Z0.000000 +G01 X2004.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5814) + + +(Start cutting path id: path5868) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2000.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X2020.000000 Y-206.089900 Z0.000000 +G01 X2020.000000 Y-257.072000 Z0.000000 +G01 X2040.000000 Y-250.738700 Z0.000000 +G01 X2040.000000 Y-199.756620 Z0.000000 +G01 X2060.000000 Y-193.423320 Z0.000000 +G01 X2060.000000 Y-244.405400 Z0.000000 +G01 X2080.000000 Y-238.072100 Z0.000000 +G01 X2080.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5868) + + +(Start cutting path id: path5866) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2004.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2076.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X2102.666700 Y-250.615500 Z0.000000 +G01 X2030.666700 Y-273.415400 Z0.000000 +G01 X2057.333300 Y-281.859800 Z0.000000 +G01 X2129.333300 Y-259.059900 Z0.000000 +G01 X2156.000000 Y-267.504300 Z0.000000 +G01 X2084.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5866) + + +(Start cutting path id: path5920) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2080.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2080.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X2100.000000 Y-288.069900 Z0.000000 +G01 X2100.000000 Y-339.052000 Z0.000000 +G01 X2120.000000 Y-332.718700 Z0.000000 +G01 X2120.000000 Y-281.736600 Z0.000000 +G01 X2140.000000 Y-275.403300 Z0.000000 +G01 X2140.000000 Y-326.385400 Z0.000000 +G01 X2160.000000 Y-320.052100 Z0.000000 +G01 X2160.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5920) + + +(Start cutting path id: path5918) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2084.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2156.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2182.666700 Y-332.595500 Z0.000000 +G01 X2110.666700 Y-355.395300 Z0.000000 +G01 X2137.333300 Y-363.839700 Z0.000000 +G01 X2209.333300 Y-341.039900 Z0.000000 +G01 X2236.000000 Y-349.484300 Z0.000000 +G01 X2164.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5918) + + +(Start cutting path id: path5916) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2080.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2160.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5916) + + +(Start cutting path id: path5864) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2076.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2004.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2004.000000 Y-312.821700 Z0.000000 +G01 X2076.000000 Y-335.621600 Z0.000000 +G01 X2076.000000 Y-324.292200 Z0.000000 +G01 X2004.000000 Y-301.492400 Z0.000000 +G01 X2004.000000 Y-290.163000 Z0.000000 +G01 X2076.000000 Y-312.962900 Z0.000000 +G01 X2076.000000 Y-301.633500 Z0.000000 +G01 X2004.000000 Y-278.833700 Z0.000000 +G01 X2004.000000 Y-267.504300 Z0.000000 +G01 X2076.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5864) + + +(Start cutting path id: path5812) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1996.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1924.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1924.000000 Y-230.841800 Z0.000000 +G01 X1996.000000 Y-253.641600 Z0.000000 +G01 X1996.000000 Y-242.312300 Z0.000000 +G01 X1924.000000 Y-219.512400 Z0.000000 +G01 X1924.000000 Y-208.183100 Z0.000000 +G01 X1996.000000 Y-230.982900 Z0.000000 +G01 X1996.000000 Y-219.653600 Z0.000000 +G01 X1924.000000 Y-196.853700 Z0.000000 +G01 X1924.000000 Y-185.524340 Z0.000000 +G01 X1996.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5812) + + +(Start cutting path id: path5760) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1916.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1844.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1844.000000 Y-148.861790 Z0.000000 +G01 X1916.000000 Y-171.661670 Z0.000000 +G01 X1916.000000 Y-160.332320 Z0.000000 +G01 X1844.000000 Y-137.532440 Z0.000000 +G01 X1844.000000 Y-126.203090 Z0.000000 +G01 X1916.000000 Y-149.002970 Z0.000000 +G01 X1916.000000 Y-137.673620 Z0.000000 +G01 X1844.000000 Y-114.873740 Z0.000000 +G01 X1844.000000 Y-103.544380 Z0.000000 +G01 X1916.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5760) + + +(Start cutting path id: path5708) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1836.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1764.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1764.000000 Y-66.881830 Z0.000000 +G01 X1836.000000 Y-89.681710 Z0.000000 +G01 X1836.000000 Y-78.352360 Z0.000000 +G01 X1764.000000 Y-55.552480 Z0.000000 +G01 X1764.000000 Y-44.223130 Z0.000000 +G01 X1836.000000 Y-67.023010 Z0.000000 +G01 X1836.000000 Y-55.693660 Z0.000000 +G01 X1764.000000 Y-32.893780 Z0.000000 +G01 X1764.000000 Y-21.564430 Z0.000000 +G01 X1836.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5708) + + +(Start cutting path id: path5656) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1756.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1684.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1684.000000 Y15.098120 Z0.000000 +G01 X1756.000000 Y-7.701760 Z0.000000 +G01 X1756.000000 Y3.627590 Z0.000000 +G01 X1684.000000 Y26.427470 Z0.000000 +G01 X1684.000000 Y37.756830 Z0.000000 +G01 X1756.000000 Y14.956950 Z0.000000 +G01 X1756.000000 Y26.286300 Z0.000000 +G01 X1684.000000 Y49.086180 Z0.000000 +G01 X1684.000000 Y60.415530 Z0.000000 +G01 X1756.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5656) + + +(Start cutting path id: path5604) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1676.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1604.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1604.000000 Y97.078080 Z0.000000 +G01 X1676.000000 Y74.278200 Z0.000000 +G01 X1676.000000 Y85.607550 Z0.000000 +G01 X1604.000000 Y108.407430 Z0.000000 +G01 X1604.000000 Y119.736790 Z0.000000 +G01 X1676.000000 Y96.936910 Z0.000000 +G01 X1676.000000 Y108.266260 Z0.000000 +G01 X1604.000000 Y131.066140 Z0.000000 +G01 X1604.000000 Y142.395480 Z0.000000 +G01 X1676.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5604) + + +(Start cutting path id: path5552) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1596.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1524.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1524.000000 Y179.058040 Z0.000000 +G01 X1596.000000 Y156.258160 Z0.000000 +G01 X1596.000000 Y167.587510 Z0.000000 +G01 X1524.000000 Y190.387390 Z0.000000 +G01 X1524.000000 Y201.716740 Z0.000000 +G01 X1596.000000 Y178.916860 Z0.000000 +G01 X1596.000000 Y190.246210 Z0.000000 +G01 X1524.000000 Y213.046090 Z0.000000 +G01 X1524.000000 Y224.375390 Z0.000000 +G01 X1596.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5552) + + +(Start cutting path id: path5500) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1516.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1444.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1444.000000 Y261.037990 Z0.000000 +G01 X1516.000000 Y238.238090 Z0.000000 +G01 X1516.000000 Y249.567490 Z0.000000 +G01 X1444.000000 Y272.367390 Z0.000000 +G01 X1444.000000 Y283.696690 Z0.000000 +G01 X1516.000000 Y260.896790 Z0.000000 +G01 X1516.000000 Y272.226190 Z0.000000 +G01 X1444.000000 Y295.026090 Z0.000000 +G01 X1444.000000 Y306.355390 Z0.000000 +G01 X1516.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5500) + + +(Start cutting path id: path5504) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1440.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1440.000000 Y361.436490 Z0.000000 F200.000000 +G01 X1460.000000 Y367.769790 Z0.000000 +G01 X1460.000000 Y316.787690 Z0.000000 +G01 X1480.000000 Y323.120990 Z0.000000 +G01 X1480.000000 Y374.103090 Z0.000000 +G01 X1500.000000 Y380.436390 Z0.000000 +G01 X1500.000000 Y329.454290 Z0.000000 +G01 X1520.000000 Y335.787590 Z0.000000 +G01 X1520.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5504) + + +(Start cutting path id: path5448) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1436.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1364.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1364.000000 Y343.017990 Z0.000000 +G01 X1436.000000 Y320.218090 Z0.000000 +G01 X1436.000000 Y331.547390 Z0.000000 +G01 X1364.000000 Y354.347290 Z0.000000 +G01 X1364.000000 Y365.676690 Z0.000000 +G01 X1436.000000 Y342.876790 Z0.000000 +G01 X1436.000000 Y354.206090 Z0.000000 +G01 X1364.000000 Y377.005990 Z0.000000 +G01 X1364.000000 Y388.335390 Z0.000000 +G01 X1436.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5448) + + +(Start cutting path id: path5450) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1280.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1360.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5450) + + +(Start cutting path id: path5444) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1284.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1356.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1382.666700 Y323.244190 Z0.000000 +G01 X1310.666700 Y300.444290 Z0.000000 +G01 X1337.333300 Y291.999890 Z0.000000 +G01 X1409.333300 Y314.799790 Z0.000000 +G01 X1436.000000 Y306.355390 Z0.000000 +G01 X1364.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5444) + + +(Start cutting path id: path5498) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1360.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1360.000000 Y279.456490 Z0.000000 F200.000000 +G01 X1380.000000 Y285.789790 Z0.000000 +G01 X1380.000000 Y234.807790 Z0.000000 +G01 X1400.000000 Y241.141090 Z0.000000 +G01 X1400.000000 Y292.123090 Z0.000000 +G01 X1420.000000 Y298.456390 Z0.000000 +G01 X1420.000000 Y247.474390 Z0.000000 +G01 X1440.000000 Y253.807690 Z0.000000 +G01 X1440.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5498) + + +(Start cutting path id: path5496) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1364.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1436.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1462.666700 Y241.264290 Z0.000000 +G01 X1390.666700 Y218.464390 Z0.000000 +G01 X1417.333300 Y210.019970 Z0.000000 +G01 X1489.333300 Y232.819890 Z0.000000 +G01 X1516.000000 Y224.375490 Z0.000000 +G01 X1444.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5496) + + +(Start cutting path id: path5550) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1440.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1440.000000 Y197.476570 Z0.000000 F200.000000 +G01 X1460.000000 Y203.809870 Z0.000000 +G01 X1460.000000 Y152.827780 Z0.000000 +G01 X1480.000000 Y159.161080 Z0.000000 +G01 X1480.000000 Y210.143170 Z0.000000 +G01 X1500.000000 Y216.476490 Z0.000000 +G01 X1500.000000 Y165.494380 Z0.000000 +G01 X1520.000000 Y171.827680 Z0.000000 +G01 X1520.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5550) + + +(Start cutting path id: path5548) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1444.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1516.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1542.666700 Y159.284290 Z0.000000 +G01 X1470.666700 Y136.484410 Z0.000000 +G01 X1497.333300 Y128.040010 Z0.000000 +G01 X1569.333300 Y150.839890 Z0.000000 +G01 X1596.000000 Y142.395480 Z0.000000 +G01 X1524.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5548) + + +(Start cutting path id: path5602) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1520.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1520.000000 Y115.496610 Z0.000000 F200.000000 +G01 X1540.000000 Y121.829910 Z0.000000 +G01 X1540.000000 Y70.847830 Z0.000000 +G01 X1560.000000 Y77.181130 Z0.000000 +G01 X1560.000000 Y128.163210 Z0.000000 +G01 X1580.000000 Y134.496510 Z0.000000 +G01 X1580.000000 Y83.514430 Z0.000000 +G01 X1600.000000 Y89.847730 Z0.000000 +G01 X1600.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5602) + + +(Start cutting path id: path5600) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1524.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1596.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1622.666700 Y77.304330 Z0.000000 +G01 X1550.666700 Y54.504450 Z0.000000 +G01 X1577.333300 Y46.060050 Z0.000000 +G01 X1649.333300 Y68.859930 Z0.000000 +G01 X1676.000000 Y60.415530 Z0.000000 +G01 X1604.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5600) + + +(Start cutting path id: path5654) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1600.000000 Y33.516650 Z0.000000 F200.000000 +G01 X1620.000000 Y39.849950 Z0.000000 +G01 X1620.000000 Y-11.132130 Z0.000000 +G01 X1640.000000 Y-4.798830 Z0.000000 +G01 X1640.000000 Y46.183250 Z0.000000 +G01 X1660.000000 Y52.516550 Z0.000000 +G01 X1660.000000 Y1.534470 Z0.000000 +G01 X1680.000000 Y7.867770 Z0.000000 +G01 X1680.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5654) + + +(Start cutting path id: path5652) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1604.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1676.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1702.666700 Y-4.675630 Z0.000000 +G01 X1630.666700 Y-27.475510 Z0.000000 +G01 X1657.333300 Y-35.919910 Z0.000000 +G01 X1729.333300 Y-13.120030 Z0.000000 +G01 X1756.000000 Y-21.564430 Z0.000000 +G01 X1684.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5652) + + +(Start cutting path id: path5706) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1680.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1680.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X1700.000000 Y-42.130010 Z0.000000 +G01 X1700.000000 Y-93.112090 Z0.000000 +G01 X1720.000000 Y-86.778790 Z0.000000 +G01 X1720.000000 Y-35.796710 Z0.000000 +G01 X1740.000000 Y-29.463410 Z0.000000 +G01 X1740.000000 Y-80.445490 Z0.000000 +G01 X1760.000000 Y-74.112190 Z0.000000 +G01 X1760.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5706) + + +(Start cutting path id: path5704) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1684.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1756.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1782.666700 Y-86.655590 Z0.000000 +G01 X1710.666700 Y-109.455470 Z0.000000 +G01 X1737.333300 Y-117.899870 Z0.000000 +G01 X1809.333300 Y-95.099990 Z0.000000 +G01 X1836.000000 Y-103.544380 Z0.000000 +G01 X1764.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5704) + + +(Start cutting path id: path5758) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1760.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1760.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X1780.000000 Y-124.109960 Z0.000000 +G01 X1780.000000 Y-175.092050 Z0.000000 +G01 X1800.000000 Y-168.758750 Z0.000000 +G01 X1800.000000 Y-117.776660 Z0.000000 +G01 X1820.000000 Y-111.443360 Z0.000000 +G01 X1820.000000 Y-162.425450 Z0.000000 +G01 X1840.000000 Y-156.092150 Z0.000000 +G01 X1840.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5758) + + +(Start cutting path id: path5756) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1764.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1836.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1862.666700 Y-168.635550 Z0.000000 +G01 X1790.666700 Y-191.435430 Z0.000000 +G01 X1817.333300 Y-199.879820 Z0.000000 +G01 X1889.333300 Y-177.079940 Z0.000000 +G01 X1916.000000 Y-185.524340 Z0.000000 +G01 X1844.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5756) + + +(Start cutting path id: path5810) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1840.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1840.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X1860.000000 Y-206.089900 Z0.000000 +G01 X1860.000000 Y-257.072000 Z0.000000 +G01 X1880.000000 Y-250.738700 Z0.000000 +G01 X1880.000000 Y-199.756620 Z0.000000 +G01 X1900.000000 Y-193.423320 Z0.000000 +G01 X1900.000000 Y-244.405400 Z0.000000 +G01 X1920.000000 Y-238.072100 Z0.000000 +G01 X1920.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5810) + + +(Start cutting path id: path5808) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1844.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1916.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1942.666700 Y-250.615500 Z0.000000 +G01 X1870.666700 Y-273.415400 Z0.000000 +G01 X1897.333300 Y-281.859800 Z0.000000 +G01 X1969.333300 Y-259.059900 Z0.000000 +G01 X1996.000000 Y-267.504300 Z0.000000 +G01 X1924.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5808) + + +(Start cutting path id: path5862) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1920.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1920.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X1940.000000 Y-288.069900 Z0.000000 +G01 X1940.000000 Y-339.052000 Z0.000000 +G01 X1960.000000 Y-332.718700 Z0.000000 +G01 X1960.000000 Y-281.736600 Z0.000000 +G01 X1980.000000 Y-275.403300 Z0.000000 +G01 X1980.000000 Y-326.385400 Z0.000000 +G01 X2000.000000 Y-320.052100 Z0.000000 +G01 X2000.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5862) + + +(Start cutting path id: path5860) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1924.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1996.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X2022.666700 Y-332.595500 Z0.000000 +G01 X1950.666700 Y-355.395300 Z0.000000 +G01 X1977.333300 Y-363.839700 Z0.000000 +G01 X2049.333300 Y-341.039900 Z0.000000 +G01 X2076.000000 Y-349.484300 Z0.000000 +G01 X2004.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5860) + + +(Start cutting path id: path5858) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1920.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5858) + + +(Start cutting path id: path5806) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1916.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1844.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1844.000000 Y-312.821700 Z0.000000 +G01 X1916.000000 Y-335.621600 Z0.000000 +G01 X1916.000000 Y-324.292200 Z0.000000 +G01 X1844.000000 Y-301.492400 Z0.000000 +G01 X1844.000000 Y-290.163000 Z0.000000 +G01 X1916.000000 Y-312.962900 Z0.000000 +G01 X1916.000000 Y-301.633500 Z0.000000 +G01 X1844.000000 Y-278.833700 Z0.000000 +G01 X1844.000000 Y-267.504300 Z0.000000 +G01 X1916.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5806) + + +(Start cutting path id: path5754) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1836.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1764.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1764.000000 Y-230.841800 Z0.000000 +G01 X1836.000000 Y-253.641600 Z0.000000 +G01 X1836.000000 Y-242.312300 Z0.000000 +G01 X1764.000000 Y-219.512400 Z0.000000 +G01 X1764.000000 Y-208.183100 Z0.000000 +G01 X1836.000000 Y-230.982900 Z0.000000 +G01 X1836.000000 Y-219.653600 Z0.000000 +G01 X1764.000000 Y-196.853700 Z0.000000 +G01 X1764.000000 Y-185.524340 Z0.000000 +G01 X1836.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5754) + + +(Start cutting path id: path5702) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1756.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1684.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1684.000000 Y-148.861790 Z0.000000 +G01 X1756.000000 Y-171.661670 Z0.000000 +G01 X1756.000000 Y-160.332320 Z0.000000 +G01 X1684.000000 Y-137.532440 Z0.000000 +G01 X1684.000000 Y-126.203090 Z0.000000 +G01 X1756.000000 Y-149.002970 Z0.000000 +G01 X1756.000000 Y-137.673620 Z0.000000 +G01 X1684.000000 Y-114.873740 Z0.000000 +G01 X1684.000000 Y-103.544380 Z0.000000 +G01 X1756.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5702) + + +(Start cutting path id: path5650) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1676.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1604.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1604.000000 Y-66.881830 Z0.000000 +G01 X1676.000000 Y-89.681710 Z0.000000 +G01 X1676.000000 Y-78.352360 Z0.000000 +G01 X1604.000000 Y-55.552480 Z0.000000 +G01 X1604.000000 Y-44.223130 Z0.000000 +G01 X1676.000000 Y-67.023010 Z0.000000 +G01 X1676.000000 Y-55.693660 Z0.000000 +G01 X1604.000000 Y-32.893780 Z0.000000 +G01 X1604.000000 Y-21.564430 Z0.000000 +G01 X1676.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5650) + + +(Start cutting path id: path5598) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1596.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1524.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1524.000000 Y15.098120 Z0.000000 +G01 X1596.000000 Y-7.701760 Z0.000000 +G01 X1596.000000 Y3.627590 Z0.000000 +G01 X1524.000000 Y26.427470 Z0.000000 +G01 X1524.000000 Y37.756830 Z0.000000 +G01 X1596.000000 Y14.956950 Z0.000000 +G01 X1596.000000 Y26.286300 Z0.000000 +G01 X1524.000000 Y49.086180 Z0.000000 +G01 X1524.000000 Y60.415530 Z0.000000 +G01 X1596.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5598) + + +(Start cutting path id: path5546) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1516.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1444.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1444.000000 Y97.078080 Z0.000000 +G01 X1516.000000 Y74.278200 Z0.000000 +G01 X1516.000000 Y85.607550 Z0.000000 +G01 X1444.000000 Y108.407430 Z0.000000 +G01 X1444.000000 Y119.736790 Z0.000000 +G01 X1516.000000 Y96.936910 Z0.000000 +G01 X1516.000000 Y108.266260 Z0.000000 +G01 X1444.000000 Y131.066140 Z0.000000 +G01 X1444.000000 Y142.395480 Z0.000000 +G01 X1516.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5546) + + +(Start cutting path id: path5494) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1436.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1364.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1364.000000 Y179.058040 Z0.000000 +G01 X1436.000000 Y156.258160 Z0.000000 +G01 X1436.000000 Y167.587510 Z0.000000 +G01 X1364.000000 Y190.387390 Z0.000000 +G01 X1364.000000 Y201.716740 Z0.000000 +G01 X1436.000000 Y178.916860 Z0.000000 +G01 X1436.000000 Y190.246210 Z0.000000 +G01 X1364.000000 Y213.046090 Z0.000000 +G01 X1364.000000 Y224.375390 Z0.000000 +G01 X1436.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5494) + + +(Start cutting path id: path5442) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1356.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1284.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1284.000000 Y261.037990 Z0.000000 +G01 X1356.000000 Y238.238090 Z0.000000 +G01 X1356.000000 Y249.567490 Z0.000000 +G01 X1284.000000 Y272.367390 Z0.000000 +G01 X1284.000000 Y283.696690 Z0.000000 +G01 X1356.000000 Y260.896790 Z0.000000 +G01 X1356.000000 Y272.226190 Z0.000000 +G01 X1284.000000 Y295.026090 Z0.000000 +G01 X1284.000000 Y306.355390 Z0.000000 +G01 X1356.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5442) + + +(Start cutting path id: path5446) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1280.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1280.000000 Y361.436490 Z0.000000 F200.000000 +G01 X1300.000000 Y367.769790 Z0.000000 +G01 X1300.000000 Y316.787690 Z0.000000 +G01 X1320.000000 Y323.120990 Z0.000000 +G01 X1320.000000 Y374.103090 Z0.000000 +G01 X1340.000000 Y380.436390 Z0.000000 +G01 X1340.000000 Y329.454290 Z0.000000 +G01 X1360.000000 Y335.787590 Z0.000000 +G01 X1360.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5446) + + +(Start cutting path id: path5390) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1276.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1204.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1204.000000 Y343.017990 Z0.000000 +G01 X1276.000000 Y320.218090 Z0.000000 +G01 X1276.000000 Y331.547390 Z0.000000 +G01 X1204.000000 Y354.347290 Z0.000000 +G01 X1204.000000 Y365.676690 Z0.000000 +G01 X1276.000000 Y342.876790 Z0.000000 +G01 X1276.000000 Y354.206090 Z0.000000 +G01 X1204.000000 Y377.005990 Z0.000000 +G01 X1204.000000 Y388.335390 Z0.000000 +G01 X1276.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5390) + + +(Start cutting path id: path5392) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1120.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5392) + + +(Start cutting path id: path5386) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1124.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1196.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1222.666700 Y323.244190 Z0.000000 +G01 X1150.666700 Y300.444290 Z0.000000 +G01 X1177.333300 Y291.999890 Z0.000000 +G01 X1249.333300 Y314.799790 Z0.000000 +G01 X1276.000000 Y306.355390 Z0.000000 +G01 X1204.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5386) + + +(Start cutting path id: path5440) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1200.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y279.456490 Z0.000000 F200.000000 +G01 X1220.000000 Y285.789790 Z0.000000 +G01 X1220.000000 Y234.807790 Z0.000000 +G01 X1240.000000 Y241.141090 Z0.000000 +G01 X1240.000000 Y292.123090 Z0.000000 +G01 X1260.000000 Y298.456390 Z0.000000 +G01 X1260.000000 Y247.474390 Z0.000000 +G01 X1280.000000 Y253.807690 Z0.000000 +G01 X1280.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5440) + + +(Start cutting path id: path5438) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1204.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1276.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1302.666700 Y241.264290 Z0.000000 +G01 X1230.666700 Y218.464390 Z0.000000 +G01 X1257.333300 Y210.019970 Z0.000000 +G01 X1329.333300 Y232.819890 Z0.000000 +G01 X1356.000000 Y224.375490 Z0.000000 +G01 X1284.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5438) + + +(Start cutting path id: path5492) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1280.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1280.000000 Y197.476570 Z0.000000 F200.000000 +G01 X1300.000000 Y203.809870 Z0.000000 +G01 X1300.000000 Y152.827780 Z0.000000 +G01 X1320.000000 Y159.161080 Z0.000000 +G01 X1320.000000 Y210.143170 Z0.000000 +G01 X1340.000000 Y216.476490 Z0.000000 +G01 X1340.000000 Y165.494380 Z0.000000 +G01 X1360.000000 Y171.827680 Z0.000000 +G01 X1360.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5492) + + +(Start cutting path id: path5490) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1284.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1356.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1382.666700 Y159.284290 Z0.000000 +G01 X1310.666700 Y136.484410 Z0.000000 +G01 X1337.333300 Y128.040010 Z0.000000 +G01 X1409.333300 Y150.839890 Z0.000000 +G01 X1436.000000 Y142.395480 Z0.000000 +G01 X1364.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5490) + + +(Start cutting path id: path5544) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1360.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1360.000000 Y115.496610 Z0.000000 F200.000000 +G01 X1380.000000 Y121.829910 Z0.000000 +G01 X1380.000000 Y70.847830 Z0.000000 +G01 X1400.000000 Y77.181130 Z0.000000 +G01 X1400.000000 Y128.163210 Z0.000000 +G01 X1420.000000 Y134.496510 Z0.000000 +G01 X1420.000000 Y83.514430 Z0.000000 +G01 X1440.000000 Y89.847730 Z0.000000 +G01 X1440.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5544) + + +(Start cutting path id: path5542) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1364.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1436.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1462.666700 Y77.304330 Z0.000000 +G01 X1390.666700 Y54.504450 Z0.000000 +G01 X1417.333300 Y46.060050 Z0.000000 +G01 X1489.333300 Y68.859930 Z0.000000 +G01 X1516.000000 Y60.415530 Z0.000000 +G01 X1444.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5542) + + +(Start cutting path id: path5596) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1440.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1440.000000 Y33.516650 Z0.000000 F200.000000 +G01 X1460.000000 Y39.849950 Z0.000000 +G01 X1460.000000 Y-11.132130 Z0.000000 +G01 X1480.000000 Y-4.798830 Z0.000000 +G01 X1480.000000 Y46.183250 Z0.000000 +G01 X1500.000000 Y52.516550 Z0.000000 +G01 X1500.000000 Y1.534470 Z0.000000 +G01 X1520.000000 Y7.867770 Z0.000000 +G01 X1520.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5596) + + +(Start cutting path id: path5594) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1444.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1516.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1542.666700 Y-4.675630 Z0.000000 +G01 X1470.666700 Y-27.475510 Z0.000000 +G01 X1497.333300 Y-35.919910 Z0.000000 +G01 X1569.333300 Y-13.120030 Z0.000000 +G01 X1596.000000 Y-21.564430 Z0.000000 +G01 X1524.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5594) + + +(Start cutting path id: path5648) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1520.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1520.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X1540.000000 Y-42.130010 Z0.000000 +G01 X1540.000000 Y-93.112090 Z0.000000 +G01 X1560.000000 Y-86.778790 Z0.000000 +G01 X1560.000000 Y-35.796710 Z0.000000 +G01 X1580.000000 Y-29.463410 Z0.000000 +G01 X1580.000000 Y-80.445490 Z0.000000 +G01 X1600.000000 Y-74.112190 Z0.000000 +G01 X1600.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5648) + + +(Start cutting path id: path5646) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1524.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1596.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1622.666700 Y-86.655590 Z0.000000 +G01 X1550.666700 Y-109.455470 Z0.000000 +G01 X1577.333300 Y-117.899870 Z0.000000 +G01 X1649.333300 Y-95.099990 Z0.000000 +G01 X1676.000000 Y-103.544380 Z0.000000 +G01 X1604.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5646) + + +(Start cutting path id: path5700) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1600.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X1620.000000 Y-124.109960 Z0.000000 +G01 X1620.000000 Y-175.092050 Z0.000000 +G01 X1640.000000 Y-168.758750 Z0.000000 +G01 X1640.000000 Y-117.776660 Z0.000000 +G01 X1660.000000 Y-111.443360 Z0.000000 +G01 X1660.000000 Y-162.425450 Z0.000000 +G01 X1680.000000 Y-156.092150 Z0.000000 +G01 X1680.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5700) + + +(Start cutting path id: path5698) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1604.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1676.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1702.666700 Y-168.635550 Z0.000000 +G01 X1630.666700 Y-191.435430 Z0.000000 +G01 X1657.333300 Y-199.879820 Z0.000000 +G01 X1729.333300 Y-177.079940 Z0.000000 +G01 X1756.000000 Y-185.524340 Z0.000000 +G01 X1684.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5698) + + +(Start cutting path id: path5752) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1680.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1680.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X1700.000000 Y-206.089900 Z0.000000 +G01 X1700.000000 Y-257.072000 Z0.000000 +G01 X1720.000000 Y-250.738700 Z0.000000 +G01 X1720.000000 Y-199.756620 Z0.000000 +G01 X1740.000000 Y-193.423320 Z0.000000 +G01 X1740.000000 Y-244.405400 Z0.000000 +G01 X1760.000000 Y-238.072100 Z0.000000 +G01 X1760.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5752) + + +(Start cutting path id: path5750) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1684.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1756.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1782.666700 Y-250.615500 Z0.000000 +G01 X1710.666700 Y-273.415400 Z0.000000 +G01 X1737.333300 Y-281.859800 Z0.000000 +G01 X1809.333300 Y-259.059900 Z0.000000 +G01 X1836.000000 Y-267.504300 Z0.000000 +G01 X1764.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5750) + + +(Start cutting path id: path5804) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1760.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1760.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X1780.000000 Y-288.069900 Z0.000000 +G01 X1780.000000 Y-339.052000 Z0.000000 +G01 X1800.000000 Y-332.718700 Z0.000000 +G01 X1800.000000 Y-281.736600 Z0.000000 +G01 X1820.000000 Y-275.403300 Z0.000000 +G01 X1820.000000 Y-326.385400 Z0.000000 +G01 X1840.000000 Y-320.052100 Z0.000000 +G01 X1840.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5804) + + +(Start cutting path id: path5802) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1764.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1836.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1862.666700 Y-332.595500 Z0.000000 +G01 X1790.666700 Y-355.395300 Z0.000000 +G01 X1817.333300 Y-363.839700 Z0.000000 +G01 X1889.333300 Y-341.039900 Z0.000000 +G01 X1916.000000 Y-349.484300 Z0.000000 +G01 X1844.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5802) + + +(Start cutting path id: path5800) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1760.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1840.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5800) + + +(Start cutting path id: path5748) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1756.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1684.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1684.000000 Y-312.821700 Z0.000000 +G01 X1756.000000 Y-335.621600 Z0.000000 +G01 X1756.000000 Y-324.292200 Z0.000000 +G01 X1684.000000 Y-301.492400 Z0.000000 +G01 X1684.000000 Y-290.163000 Z0.000000 +G01 X1756.000000 Y-312.962900 Z0.000000 +G01 X1756.000000 Y-301.633500 Z0.000000 +G01 X1684.000000 Y-278.833700 Z0.000000 +G01 X1684.000000 Y-267.504300 Z0.000000 +G01 X1756.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5748) + + +(Start cutting path id: path5696) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1676.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1604.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1604.000000 Y-230.841800 Z0.000000 +G01 X1676.000000 Y-253.641600 Z0.000000 +G01 X1676.000000 Y-242.312300 Z0.000000 +G01 X1604.000000 Y-219.512400 Z0.000000 +G01 X1604.000000 Y-208.183100 Z0.000000 +G01 X1676.000000 Y-230.982900 Z0.000000 +G01 X1676.000000 Y-219.653600 Z0.000000 +G01 X1604.000000 Y-196.853700 Z0.000000 +G01 X1604.000000 Y-185.524340 Z0.000000 +G01 X1676.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5696) + + +(Start cutting path id: path5644) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1596.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1524.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1524.000000 Y-148.861790 Z0.000000 +G01 X1596.000000 Y-171.661670 Z0.000000 +G01 X1596.000000 Y-160.332320 Z0.000000 +G01 X1524.000000 Y-137.532440 Z0.000000 +G01 X1524.000000 Y-126.203090 Z0.000000 +G01 X1596.000000 Y-149.002970 Z0.000000 +G01 X1596.000000 Y-137.673620 Z0.000000 +G01 X1524.000000 Y-114.873740 Z0.000000 +G01 X1524.000000 Y-103.544380 Z0.000000 +G01 X1596.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5644) + + +(Start cutting path id: path5592) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1516.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1444.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1444.000000 Y-66.881830 Z0.000000 +G01 X1516.000000 Y-89.681710 Z0.000000 +G01 X1516.000000 Y-78.352360 Z0.000000 +G01 X1444.000000 Y-55.552480 Z0.000000 +G01 X1444.000000 Y-44.223130 Z0.000000 +G01 X1516.000000 Y-67.023010 Z0.000000 +G01 X1516.000000 Y-55.693660 Z0.000000 +G01 X1444.000000 Y-32.893780 Z0.000000 +G01 X1444.000000 Y-21.564430 Z0.000000 +G01 X1516.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5592) + + +(Start cutting path id: path5540) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1436.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1364.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1364.000000 Y15.098120 Z0.000000 +G01 X1436.000000 Y-7.701760 Z0.000000 +G01 X1436.000000 Y3.627590 Z0.000000 +G01 X1364.000000 Y26.427470 Z0.000000 +G01 X1364.000000 Y37.756830 Z0.000000 +G01 X1436.000000 Y14.956950 Z0.000000 +G01 X1436.000000 Y26.286300 Z0.000000 +G01 X1364.000000 Y49.086180 Z0.000000 +G01 X1364.000000 Y60.415530 Z0.000000 +G01 X1436.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5540) + + +(Start cutting path id: path5488) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1356.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1284.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1284.000000 Y97.078080 Z0.000000 +G01 X1356.000000 Y74.278200 Z0.000000 +G01 X1356.000000 Y85.607550 Z0.000000 +G01 X1284.000000 Y108.407430 Z0.000000 +G01 X1284.000000 Y119.736790 Z0.000000 +G01 X1356.000000 Y96.936910 Z0.000000 +G01 X1356.000000 Y108.266260 Z0.000000 +G01 X1284.000000 Y131.066140 Z0.000000 +G01 X1284.000000 Y142.395480 Z0.000000 +G01 X1356.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5488) + + +(Start cutting path id: path5436) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1276.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1204.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1204.000000 Y179.058040 Z0.000000 +G01 X1276.000000 Y156.258160 Z0.000000 +G01 X1276.000000 Y167.587510 Z0.000000 +G01 X1204.000000 Y190.387390 Z0.000000 +G01 X1204.000000 Y201.716740 Z0.000000 +G01 X1276.000000 Y178.916860 Z0.000000 +G01 X1276.000000 Y190.246210 Z0.000000 +G01 X1204.000000 Y213.046090 Z0.000000 +G01 X1204.000000 Y224.375390 Z0.000000 +G01 X1276.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5436) + + +(Start cutting path id: path5384) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1196.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1124.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1124.000000 Y261.037990 Z0.000000 +G01 X1196.000000 Y238.238090 Z0.000000 +G01 X1196.000000 Y249.567490 Z0.000000 +G01 X1124.000000 Y272.367390 Z0.000000 +G01 X1124.000000 Y283.696690 Z0.000000 +G01 X1196.000000 Y260.896790 Z0.000000 +G01 X1196.000000 Y272.226190 Z0.000000 +G01 X1124.000000 Y295.026090 Z0.000000 +G01 X1124.000000 Y306.355390 Z0.000000 +G01 X1196.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5384) + + +(Start cutting path id: path5388) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1120.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1120.000000 Y361.436490 Z0.000000 F200.000000 +G01 X1140.000000 Y367.769790 Z0.000000 +G01 X1140.000000 Y316.787690 Z0.000000 +G01 X1160.000000 Y323.120990 Z0.000000 +G01 X1160.000000 Y374.103090 Z0.000000 +G01 X1180.000000 Y380.436390 Z0.000000 +G01 X1180.000000 Y329.454290 Z0.000000 +G01 X1200.000000 Y335.787590 Z0.000000 +G01 X1200.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5388) + + +(Start cutting path id: path5332) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1116.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1044.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1044.000000 Y343.017990 Z0.000000 +G01 X1116.000000 Y320.218090 Z0.000000 +G01 X1116.000000 Y331.547390 Z0.000000 +G01 X1044.000000 Y354.347290 Z0.000000 +G01 X1044.000000 Y365.676690 Z0.000000 +G01 X1116.000000 Y342.876790 Z0.000000 +G01 X1116.000000 Y354.206090 Z0.000000 +G01 X1044.000000 Y377.005990 Z0.000000 +G01 X1044.000000 Y388.335390 Z0.000000 +G01 X1116.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5332) + + +(Start cutting path id: path5334) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X960.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1040.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5334) + + +(Start cutting path id: path5328) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X964.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1036.000000 Y331.688590 Z0.000000 F200.000000 +G01 X1062.666700 Y323.244190 Z0.000000 +G01 X990.666670 Y300.444290 Z0.000000 +G01 X1017.333300 Y291.999890 Z0.000000 +G01 X1089.333300 Y314.799790 Z0.000000 +G01 X1116.000000 Y306.355390 Z0.000000 +G01 X1044.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5328) + + +(Start cutting path id: path5382) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1040.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1040.000000 Y279.456490 Z0.000000 F200.000000 +G01 X1060.000000 Y285.789790 Z0.000000 +G01 X1060.000000 Y234.807790 Z0.000000 +G01 X1080.000000 Y241.141090 Z0.000000 +G01 X1080.000000 Y292.123090 Z0.000000 +G01 X1100.000000 Y298.456390 Z0.000000 +G01 X1100.000000 Y247.474390 Z0.000000 +G01 X1120.000000 Y253.807690 Z0.000000 +G01 X1120.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5382) + + +(Start cutting path id: path5380) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1044.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1116.000000 Y249.708690 Z0.000000 F200.000000 +G01 X1142.666700 Y241.264290 Z0.000000 +G01 X1070.666700 Y218.464390 Z0.000000 +G01 X1097.333300 Y210.019970 Z0.000000 +G01 X1169.333300 Y232.819890 Z0.000000 +G01 X1196.000000 Y224.375490 Z0.000000 +G01 X1124.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5380) + + +(Start cutting path id: path5434) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1120.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1120.000000 Y197.476570 Z0.000000 F200.000000 +G01 X1140.000000 Y203.809870 Z0.000000 +G01 X1140.000000 Y152.827780 Z0.000000 +G01 X1160.000000 Y159.161080 Z0.000000 +G01 X1160.000000 Y210.143170 Z0.000000 +G01 X1180.000000 Y216.476490 Z0.000000 +G01 X1180.000000 Y165.494380 Z0.000000 +G01 X1200.000000 Y171.827680 Z0.000000 +G01 X1200.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5434) + + +(Start cutting path id: path5432) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1124.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1196.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1222.666700 Y159.284290 Z0.000000 +G01 X1150.666700 Y136.484410 Z0.000000 +G01 X1177.333300 Y128.040010 Z0.000000 +G01 X1249.333300 Y150.839890 Z0.000000 +G01 X1276.000000 Y142.395480 Z0.000000 +G01 X1204.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5432) + + +(Start cutting path id: path5486) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1200.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y115.496610 Z0.000000 F200.000000 +G01 X1220.000000 Y121.829910 Z0.000000 +G01 X1220.000000 Y70.847830 Z0.000000 +G01 X1240.000000 Y77.181130 Z0.000000 +G01 X1240.000000 Y128.163210 Z0.000000 +G01 X1260.000000 Y134.496510 Z0.000000 +G01 X1260.000000 Y83.514430 Z0.000000 +G01 X1280.000000 Y89.847730 Z0.000000 +G01 X1280.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5486) + + +(Start cutting path id: path5484) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1204.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1276.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1302.666700 Y77.304330 Z0.000000 +G01 X1230.666700 Y54.504450 Z0.000000 +G01 X1257.333300 Y46.060050 Z0.000000 +G01 X1329.333300 Y68.859930 Z0.000000 +G01 X1356.000000 Y60.415530 Z0.000000 +G01 X1284.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5484) + + +(Start cutting path id: path5538) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1280.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1280.000000 Y33.516650 Z0.000000 F200.000000 +G01 X1300.000000 Y39.849950 Z0.000000 +G01 X1300.000000 Y-11.132130 Z0.000000 +G01 X1320.000000 Y-4.798830 Z0.000000 +G01 X1320.000000 Y46.183250 Z0.000000 +G01 X1340.000000 Y52.516550 Z0.000000 +G01 X1340.000000 Y1.534470 Z0.000000 +G01 X1360.000000 Y7.867770 Z0.000000 +G01 X1360.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5538) + + +(Start cutting path id: path5536) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1284.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1356.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1382.666700 Y-4.675630 Z0.000000 +G01 X1310.666700 Y-27.475510 Z0.000000 +G01 X1337.333300 Y-35.919910 Z0.000000 +G01 X1409.333300 Y-13.120030 Z0.000000 +G01 X1436.000000 Y-21.564430 Z0.000000 +G01 X1364.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5536) + + +(Start cutting path id: path5590) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1360.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1360.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X1380.000000 Y-42.130010 Z0.000000 +G01 X1380.000000 Y-93.112090 Z0.000000 +G01 X1400.000000 Y-86.778790 Z0.000000 +G01 X1400.000000 Y-35.796710 Z0.000000 +G01 X1420.000000 Y-29.463410 Z0.000000 +G01 X1420.000000 Y-80.445490 Z0.000000 +G01 X1440.000000 Y-74.112190 Z0.000000 +G01 X1440.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5590) + + +(Start cutting path id: path5588) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1364.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1436.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1462.666700 Y-86.655590 Z0.000000 +G01 X1390.666700 Y-109.455470 Z0.000000 +G01 X1417.333300 Y-117.899870 Z0.000000 +G01 X1489.333300 Y-95.099990 Z0.000000 +G01 X1516.000000 Y-103.544380 Z0.000000 +G01 X1444.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5588) + + +(Start cutting path id: path5642) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1440.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1440.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X1460.000000 Y-124.109960 Z0.000000 +G01 X1460.000000 Y-175.092050 Z0.000000 +G01 X1480.000000 Y-168.758750 Z0.000000 +G01 X1480.000000 Y-117.776660 Z0.000000 +G01 X1500.000000 Y-111.443360 Z0.000000 +G01 X1500.000000 Y-162.425450 Z0.000000 +G01 X1520.000000 Y-156.092150 Z0.000000 +G01 X1520.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5642) + + +(Start cutting path id: path5640) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1444.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1516.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1542.666700 Y-168.635550 Z0.000000 +G01 X1470.666700 Y-191.435430 Z0.000000 +G01 X1497.333300 Y-199.879820 Z0.000000 +G01 X1569.333300 Y-177.079940 Z0.000000 +G01 X1596.000000 Y-185.524340 Z0.000000 +G01 X1524.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5640) + + +(Start cutting path id: path5694) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1520.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1520.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X1540.000000 Y-206.089900 Z0.000000 +G01 X1540.000000 Y-257.072000 Z0.000000 +G01 X1560.000000 Y-250.738700 Z0.000000 +G01 X1560.000000 Y-199.756620 Z0.000000 +G01 X1580.000000 Y-193.423320 Z0.000000 +G01 X1580.000000 Y-244.405400 Z0.000000 +G01 X1600.000000 Y-238.072100 Z0.000000 +G01 X1600.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5694) + + +(Start cutting path id: path5692) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1524.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1596.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1622.666700 Y-250.615500 Z0.000000 +G01 X1550.666700 Y-273.415400 Z0.000000 +G01 X1577.333300 Y-281.859800 Z0.000000 +G01 X1649.333300 Y-259.059900 Z0.000000 +G01 X1676.000000 Y-267.504300 Z0.000000 +G01 X1604.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5692) + + +(Start cutting path id: path5746) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1600.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X1620.000000 Y-288.069900 Z0.000000 +G01 X1620.000000 Y-339.052000 Z0.000000 +G01 X1640.000000 Y-332.718700 Z0.000000 +G01 X1640.000000 Y-281.736600 Z0.000000 +G01 X1660.000000 Y-275.403300 Z0.000000 +G01 X1660.000000 Y-326.385400 Z0.000000 +G01 X1680.000000 Y-320.052100 Z0.000000 +G01 X1680.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5746) + + +(Start cutting path id: path5744) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1604.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1676.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1702.666700 Y-332.595500 Z0.000000 +G01 X1630.666700 Y-355.395300 Z0.000000 +G01 X1657.333300 Y-363.839700 Z0.000000 +G01 X1729.333300 Y-341.039900 Z0.000000 +G01 X1756.000000 Y-349.484300 Z0.000000 +G01 X1684.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5744) + + +(Start cutting path id: path5742) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1680.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5742) + + +(Start cutting path id: path5690) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1596.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1524.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1524.000000 Y-312.821700 Z0.000000 +G01 X1596.000000 Y-335.621600 Z0.000000 +G01 X1596.000000 Y-324.292200 Z0.000000 +G01 X1524.000000 Y-301.492400 Z0.000000 +G01 X1524.000000 Y-290.163000 Z0.000000 +G01 X1596.000000 Y-312.962900 Z0.000000 +G01 X1596.000000 Y-301.633500 Z0.000000 +G01 X1524.000000 Y-278.833700 Z0.000000 +G01 X1524.000000 Y-267.504300 Z0.000000 +G01 X1596.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5690) + + +(Start cutting path id: path5638) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1516.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1444.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1444.000000 Y-230.841800 Z0.000000 +G01 X1516.000000 Y-253.641600 Z0.000000 +G01 X1516.000000 Y-242.312300 Z0.000000 +G01 X1444.000000 Y-219.512400 Z0.000000 +G01 X1444.000000 Y-208.183100 Z0.000000 +G01 X1516.000000 Y-230.982900 Z0.000000 +G01 X1516.000000 Y-219.653600 Z0.000000 +G01 X1444.000000 Y-196.853700 Z0.000000 +G01 X1444.000000 Y-185.524340 Z0.000000 +G01 X1516.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5638) + + +(Start cutting path id: path5586) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1436.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1364.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1364.000000 Y-148.861790 Z0.000000 +G01 X1436.000000 Y-171.661670 Z0.000000 +G01 X1436.000000 Y-160.332320 Z0.000000 +G01 X1364.000000 Y-137.532440 Z0.000000 +G01 X1364.000000 Y-126.203090 Z0.000000 +G01 X1436.000000 Y-149.002970 Z0.000000 +G01 X1436.000000 Y-137.673620 Z0.000000 +G01 X1364.000000 Y-114.873740 Z0.000000 +G01 X1364.000000 Y-103.544380 Z0.000000 +G01 X1436.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5586) + + +(Start cutting path id: path5534) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1356.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1284.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1284.000000 Y-66.881830 Z0.000000 +G01 X1356.000000 Y-89.681710 Z0.000000 +G01 X1356.000000 Y-78.352360 Z0.000000 +G01 X1284.000000 Y-55.552480 Z0.000000 +G01 X1284.000000 Y-44.223130 Z0.000000 +G01 X1356.000000 Y-67.023010 Z0.000000 +G01 X1356.000000 Y-55.693660 Z0.000000 +G01 X1284.000000 Y-32.893780 Z0.000000 +G01 X1284.000000 Y-21.564430 Z0.000000 +G01 X1356.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5534) + + +(Start cutting path id: path5482) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1276.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1204.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1204.000000 Y15.098120 Z0.000000 +G01 X1276.000000 Y-7.701760 Z0.000000 +G01 X1276.000000 Y3.627590 Z0.000000 +G01 X1204.000000 Y26.427470 Z0.000000 +G01 X1204.000000 Y37.756830 Z0.000000 +G01 X1276.000000 Y14.956950 Z0.000000 +G01 X1276.000000 Y26.286300 Z0.000000 +G01 X1204.000000 Y49.086180 Z0.000000 +G01 X1204.000000 Y60.415530 Z0.000000 +G01 X1276.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5482) + + +(Start cutting path id: path5430) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1196.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1124.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1124.000000 Y97.078080 Z0.000000 +G01 X1196.000000 Y74.278200 Z0.000000 +G01 X1196.000000 Y85.607550 Z0.000000 +G01 X1124.000000 Y108.407430 Z0.000000 +G01 X1124.000000 Y119.736790 Z0.000000 +G01 X1196.000000 Y96.936910 Z0.000000 +G01 X1196.000000 Y108.266260 Z0.000000 +G01 X1124.000000 Y131.066140 Z0.000000 +G01 X1124.000000 Y142.395480 Z0.000000 +G01 X1196.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5430) + + +(Start cutting path id: path5378) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1116.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1044.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1044.000000 Y179.058040 Z0.000000 +G01 X1116.000000 Y156.258160 Z0.000000 +G01 X1116.000000 Y167.587510 Z0.000000 +G01 X1044.000000 Y190.387390 Z0.000000 +G01 X1044.000000 Y201.716740 Z0.000000 +G01 X1116.000000 Y178.916860 Z0.000000 +G01 X1116.000000 Y190.246210 Z0.000000 +G01 X1044.000000 Y213.046090 Z0.000000 +G01 X1044.000000 Y224.375390 Z0.000000 +G01 X1116.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5378) + + +(Start cutting path id: path5326) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1036.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X964.000000 Y249.708690 Z0.000000 F200.000000 +G01 X964.000000 Y261.037990 Z0.000000 +G01 X1036.000000 Y238.238090 Z0.000000 +G01 X1036.000000 Y249.567490 Z0.000000 +G01 X964.000000 Y272.367390 Z0.000000 +G01 X964.000000 Y283.696690 Z0.000000 +G01 X1036.000000 Y260.896790 Z0.000000 +G01 X1036.000000 Y272.226190 Z0.000000 +G01 X964.000000 Y295.026090 Z0.000000 +G01 X964.000000 Y306.355390 Z0.000000 +G01 X1036.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5326) + + +(Start cutting path id: path5330) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X960.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X960.000000 Y361.436490 Z0.000000 F200.000000 +G01 X980.000000 Y367.769790 Z0.000000 +G01 X980.000000 Y316.787690 Z0.000000 +G01 X1000.000000 Y323.120990 Z0.000000 +G01 X1000.000000 Y374.103090 Z0.000000 +G01 X1020.000000 Y380.436390 Z0.000000 +G01 X1020.000000 Y329.454290 Z0.000000 +G01 X1040.000000 Y335.787590 Z0.000000 +G01 X1040.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5330) + + +(Start cutting path id: path5274) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X956.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X884.000000 Y331.688590 Z0.000000 F200.000000 +G01 X884.000000 Y343.017990 Z0.000000 +G01 X956.000000 Y320.218090 Z0.000000 +G01 X956.000000 Y331.547390 Z0.000000 +G01 X884.000000 Y354.347290 Z0.000000 +G01 X884.000000 Y365.676690 Z0.000000 +G01 X956.000000 Y342.876790 Z0.000000 +G01 X956.000000 Y354.206090 Z0.000000 +G01 X884.000000 Y377.005990 Z0.000000 +G01 X884.000000 Y388.335390 Z0.000000 +G01 X956.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5274) + + +(Start cutting path id: path5276) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X880.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5276) + + +(Start cutting path id: path5270) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X804.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X876.000000 Y331.688590 Z0.000000 F200.000000 +G01 X902.666670 Y323.244190 Z0.000000 +G01 X830.666670 Y300.444290 Z0.000000 +G01 X857.333330 Y291.999890 Z0.000000 +G01 X929.333330 Y314.799790 Z0.000000 +G01 X956.000000 Y306.355390 Z0.000000 +G01 X884.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5270) + + +(Start cutting path id: path5324) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X880.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X880.000000 Y279.456490 Z0.000000 F200.000000 +G01 X900.000000 Y285.789790 Z0.000000 +G01 X900.000000 Y234.807790 Z0.000000 +G01 X920.000000 Y241.141090 Z0.000000 +G01 X920.000000 Y292.123090 Z0.000000 +G01 X940.000000 Y298.456390 Z0.000000 +G01 X940.000000 Y247.474390 Z0.000000 +G01 X960.000000 Y253.807690 Z0.000000 +G01 X960.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5324) + + +(Start cutting path id: path5322) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X884.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X956.000000 Y249.708690 Z0.000000 F200.000000 +G01 X982.666670 Y241.264290 Z0.000000 +G01 X910.666670 Y218.464390 Z0.000000 +G01 X937.333330 Y210.019970 Z0.000000 +G01 X1009.333300 Y232.819890 Z0.000000 +G01 X1036.000000 Y224.375490 Z0.000000 +G01 X964.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5322) + + +(Start cutting path id: path5376) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X960.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X960.000000 Y197.476570 Z0.000000 F200.000000 +G01 X980.000000 Y203.809870 Z0.000000 +G01 X980.000000 Y152.827780 Z0.000000 +G01 X1000.000000 Y159.161080 Z0.000000 +G01 X1000.000000 Y210.143170 Z0.000000 +G01 X1020.000000 Y216.476490 Z0.000000 +G01 X1020.000000 Y165.494380 Z0.000000 +G01 X1040.000000 Y171.827680 Z0.000000 +G01 X1040.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5376) + + +(Start cutting path id: path5374) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X964.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1036.000000 Y167.728680 Z0.000000 F200.000000 +G01 X1062.666700 Y159.284290 Z0.000000 +G01 X990.666670 Y136.484410 Z0.000000 +G01 X1017.333300 Y128.040010 Z0.000000 +G01 X1089.333300 Y150.839890 Z0.000000 +G01 X1116.000000 Y142.395480 Z0.000000 +G01 X1044.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5374) + + +(Start cutting path id: path5428) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1040.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1040.000000 Y115.496610 Z0.000000 F200.000000 +G01 X1060.000000 Y121.829910 Z0.000000 +G01 X1060.000000 Y70.847830 Z0.000000 +G01 X1080.000000 Y77.181130 Z0.000000 +G01 X1080.000000 Y128.163210 Z0.000000 +G01 X1100.000000 Y134.496510 Z0.000000 +G01 X1100.000000 Y83.514430 Z0.000000 +G01 X1120.000000 Y89.847730 Z0.000000 +G01 X1120.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5428) + + +(Start cutting path id: path5426) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1044.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1116.000000 Y85.748730 Z0.000000 F200.000000 +G01 X1142.666700 Y77.304330 Z0.000000 +G01 X1070.666700 Y54.504450 Z0.000000 +G01 X1097.333300 Y46.060050 Z0.000000 +G01 X1169.333300 Y68.859930 Z0.000000 +G01 X1196.000000 Y60.415530 Z0.000000 +G01 X1124.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5426) + + +(Start cutting path id: path5480) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1120.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1120.000000 Y33.516650 Z0.000000 F200.000000 +G01 X1140.000000 Y39.849950 Z0.000000 +G01 X1140.000000 Y-11.132130 Z0.000000 +G01 X1160.000000 Y-4.798830 Z0.000000 +G01 X1160.000000 Y46.183250 Z0.000000 +G01 X1180.000000 Y52.516550 Z0.000000 +G01 X1180.000000 Y1.534470 Z0.000000 +G01 X1200.000000 Y7.867770 Z0.000000 +G01 X1200.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5480) + + +(Start cutting path id: path5478) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1124.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1196.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1222.666700 Y-4.675630 Z0.000000 +G01 X1150.666700 Y-27.475510 Z0.000000 +G01 X1177.333300 Y-35.919910 Z0.000000 +G01 X1249.333300 Y-13.120030 Z0.000000 +G01 X1276.000000 Y-21.564430 Z0.000000 +G01 X1204.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5478) + + +(Start cutting path id: path5532) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1200.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X1220.000000 Y-42.130010 Z0.000000 +G01 X1220.000000 Y-93.112090 Z0.000000 +G01 X1240.000000 Y-86.778790 Z0.000000 +G01 X1240.000000 Y-35.796710 Z0.000000 +G01 X1260.000000 Y-29.463410 Z0.000000 +G01 X1260.000000 Y-80.445490 Z0.000000 +G01 X1280.000000 Y-74.112190 Z0.000000 +G01 X1280.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5532) + + +(Start cutting path id: path5530) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1204.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1276.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1302.666700 Y-86.655590 Z0.000000 +G01 X1230.666700 Y-109.455470 Z0.000000 +G01 X1257.333300 Y-117.899870 Z0.000000 +G01 X1329.333300 Y-95.099990 Z0.000000 +G01 X1356.000000 Y-103.544380 Z0.000000 +G01 X1284.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5530) + + +(Start cutting path id: path5584) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1280.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1280.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X1300.000000 Y-124.109960 Z0.000000 +G01 X1300.000000 Y-175.092050 Z0.000000 +G01 X1320.000000 Y-168.758750 Z0.000000 +G01 X1320.000000 Y-117.776660 Z0.000000 +G01 X1340.000000 Y-111.443360 Z0.000000 +G01 X1340.000000 Y-162.425450 Z0.000000 +G01 X1360.000000 Y-156.092150 Z0.000000 +G01 X1360.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5584) + + +(Start cutting path id: path5582) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1284.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1356.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1382.666700 Y-168.635550 Z0.000000 +G01 X1310.666700 Y-191.435430 Z0.000000 +G01 X1337.333300 Y-199.879820 Z0.000000 +G01 X1409.333300 Y-177.079940 Z0.000000 +G01 X1436.000000 Y-185.524340 Z0.000000 +G01 X1364.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5582) + + +(Start cutting path id: path5636) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1360.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1360.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X1380.000000 Y-206.089900 Z0.000000 +G01 X1380.000000 Y-257.072000 Z0.000000 +G01 X1400.000000 Y-250.738700 Z0.000000 +G01 X1400.000000 Y-199.756620 Z0.000000 +G01 X1420.000000 Y-193.423320 Z0.000000 +G01 X1420.000000 Y-244.405400 Z0.000000 +G01 X1440.000000 Y-238.072100 Z0.000000 +G01 X1440.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5636) + + +(Start cutting path id: path5634) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1364.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1436.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1462.666700 Y-250.615500 Z0.000000 +G01 X1390.666700 Y-273.415400 Z0.000000 +G01 X1417.333300 Y-281.859800 Z0.000000 +G01 X1489.333300 Y-259.059900 Z0.000000 +G01 X1516.000000 Y-267.504300 Z0.000000 +G01 X1444.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5634) + + +(Start cutting path id: path5688) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1440.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1440.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X1460.000000 Y-288.069900 Z0.000000 +G01 X1460.000000 Y-339.052000 Z0.000000 +G01 X1480.000000 Y-332.718700 Z0.000000 +G01 X1480.000000 Y-281.736600 Z0.000000 +G01 X1500.000000 Y-275.403300 Z0.000000 +G01 X1500.000000 Y-326.385400 Z0.000000 +G01 X1520.000000 Y-320.052100 Z0.000000 +G01 X1520.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5688) + + +(Start cutting path id: path5686) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1444.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1516.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1542.666700 Y-332.595500 Z0.000000 +G01 X1470.666700 Y-355.395300 Z0.000000 +G01 X1497.333300 Y-363.839700 Z0.000000 +G01 X1569.333300 Y-341.039900 Z0.000000 +G01 X1596.000000 Y-349.484300 Z0.000000 +G01 X1524.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5686) + + +(Start cutting path id: path5684) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1440.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1520.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5684) + + +(Start cutting path id: path5632) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1436.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1364.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1364.000000 Y-312.821700 Z0.000000 +G01 X1436.000000 Y-335.621600 Z0.000000 +G01 X1436.000000 Y-324.292200 Z0.000000 +G01 X1364.000000 Y-301.492400 Z0.000000 +G01 X1364.000000 Y-290.163000 Z0.000000 +G01 X1436.000000 Y-312.962900 Z0.000000 +G01 X1436.000000 Y-301.633500 Z0.000000 +G01 X1364.000000 Y-278.833700 Z0.000000 +G01 X1364.000000 Y-267.504300 Z0.000000 +G01 X1436.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5632) + + +(Start cutting path id: path5580) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1356.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1284.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1284.000000 Y-230.841800 Z0.000000 +G01 X1356.000000 Y-253.641600 Z0.000000 +G01 X1356.000000 Y-242.312300 Z0.000000 +G01 X1284.000000 Y-219.512400 Z0.000000 +G01 X1284.000000 Y-208.183100 Z0.000000 +G01 X1356.000000 Y-230.982900 Z0.000000 +G01 X1356.000000 Y-219.653600 Z0.000000 +G01 X1284.000000 Y-196.853700 Z0.000000 +G01 X1284.000000 Y-185.524340 Z0.000000 +G01 X1356.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5580) + + +(Start cutting path id: path5528) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1276.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1204.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1204.000000 Y-148.861790 Z0.000000 +G01 X1276.000000 Y-171.661670 Z0.000000 +G01 X1276.000000 Y-160.332320 Z0.000000 +G01 X1204.000000 Y-137.532440 Z0.000000 +G01 X1204.000000 Y-126.203090 Z0.000000 +G01 X1276.000000 Y-149.002970 Z0.000000 +G01 X1276.000000 Y-137.673620 Z0.000000 +G01 X1204.000000 Y-114.873740 Z0.000000 +G01 X1204.000000 Y-103.544380 Z0.000000 +G01 X1276.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5528) + + +(Start cutting path id: path5476) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1196.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1124.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1124.000000 Y-66.881830 Z0.000000 +G01 X1196.000000 Y-89.681710 Z0.000000 +G01 X1196.000000 Y-78.352360 Z0.000000 +G01 X1124.000000 Y-55.552480 Z0.000000 +G01 X1124.000000 Y-44.223130 Z0.000000 +G01 X1196.000000 Y-67.023010 Z0.000000 +G01 X1196.000000 Y-55.693660 Z0.000000 +G01 X1124.000000 Y-32.893780 Z0.000000 +G01 X1124.000000 Y-21.564430 Z0.000000 +G01 X1196.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5476) + + +(Start cutting path id: path5424) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1116.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1044.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1044.000000 Y15.098120 Z0.000000 +G01 X1116.000000 Y-7.701760 Z0.000000 +G01 X1116.000000 Y3.627590 Z0.000000 +G01 X1044.000000 Y26.427470 Z0.000000 +G01 X1044.000000 Y37.756830 Z0.000000 +G01 X1116.000000 Y14.956950 Z0.000000 +G01 X1116.000000 Y26.286300 Z0.000000 +G01 X1044.000000 Y49.086180 Z0.000000 +G01 X1044.000000 Y60.415530 Z0.000000 +G01 X1116.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5424) + + +(Start cutting path id: path5372) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1036.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X964.000000 Y85.748730 Z0.000000 F200.000000 +G01 X964.000000 Y97.078080 Z0.000000 +G01 X1036.000000 Y74.278200 Z0.000000 +G01 X1036.000000 Y85.607550 Z0.000000 +G01 X964.000000 Y108.407430 Z0.000000 +G01 X964.000000 Y119.736790 Z0.000000 +G01 X1036.000000 Y96.936910 Z0.000000 +G01 X1036.000000 Y108.266260 Z0.000000 +G01 X964.000000 Y131.066140 Z0.000000 +G01 X964.000000 Y142.395480 Z0.000000 +G01 X1036.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5372) + + +(Start cutting path id: path5320) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X956.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X884.000000 Y167.728680 Z0.000000 F200.000000 +G01 X884.000000 Y179.058040 Z0.000000 +G01 X956.000000 Y156.258160 Z0.000000 +G01 X956.000000 Y167.587510 Z0.000000 +G01 X884.000000 Y190.387390 Z0.000000 +G01 X884.000000 Y201.716740 Z0.000000 +G01 X956.000000 Y178.916860 Z0.000000 +G01 X956.000000 Y190.246210 Z0.000000 +G01 X884.000000 Y213.046090 Z0.000000 +G01 X884.000000 Y224.375390 Z0.000000 +G01 X956.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5320) + + +(Start cutting path id: path5268) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X876.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X804.000000 Y249.708690 Z0.000000 F200.000000 +G01 X804.000000 Y261.037990 Z0.000000 +G01 X876.000000 Y238.238090 Z0.000000 +G01 X876.000000 Y249.567490 Z0.000000 +G01 X804.000000 Y272.367390 Z0.000000 +G01 X804.000000 Y283.696690 Z0.000000 +G01 X876.000000 Y260.896790 Z0.000000 +G01 X876.000000 Y272.226190 Z0.000000 +G01 X804.000000 Y295.026090 Z0.000000 +G01 X804.000000 Y306.355390 Z0.000000 +G01 X876.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5268) + + +(Start cutting path id: path5272) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X800.000000 Y361.436490 Z0.000000 F200.000000 +G01 X820.000000 Y367.769790 Z0.000000 +G01 X820.000000 Y316.787690 Z0.000000 +G01 X840.000000 Y323.120990 Z0.000000 +G01 X840.000000 Y374.103090 Z0.000000 +G01 X860.000000 Y380.436390 Z0.000000 +G01 X860.000000 Y329.454290 Z0.000000 +G01 X880.000000 Y335.787590 Z0.000000 +G01 X880.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5272) + + +(Start cutting path id: path5216) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X796.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X724.000000 Y331.688590 Z0.000000 F200.000000 +G01 X724.000000 Y343.017990 Z0.000000 +G01 X796.000000 Y320.218090 Z0.000000 +G01 X796.000000 Y331.547390 Z0.000000 +G01 X724.000000 Y354.347290 Z0.000000 +G01 X724.000000 Y365.676690 Z0.000000 +G01 X796.000000 Y342.876790 Z0.000000 +G01 X796.000000 Y354.206090 Z0.000000 +G01 X724.000000 Y377.005990 Z0.000000 +G01 X724.000000 Y388.335390 Z0.000000 +G01 X796.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5216) + + +(Start cutting path id: path5218) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X640.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X720.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5218) + + +(Start cutting path id: path5212) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X644.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X716.000000 Y331.688590 Z0.000000 F200.000000 +G01 X742.666670 Y323.244190 Z0.000000 +G01 X670.666670 Y300.444290 Z0.000000 +G01 X697.333330 Y291.999890 Z0.000000 +G01 X769.333330 Y314.799790 Z0.000000 +G01 X796.000000 Y306.355390 Z0.000000 +G01 X724.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5212) + + +(Start cutting path id: path5266) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X720.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X720.000000 Y279.456490 Z0.000000 F200.000000 +G01 X740.000000 Y285.789790 Z0.000000 +G01 X740.000000 Y234.807790 Z0.000000 +G01 X760.000000 Y241.141090 Z0.000000 +G01 X760.000000 Y292.123090 Z0.000000 +G01 X780.000000 Y298.456390 Z0.000000 +G01 X780.000000 Y247.474390 Z0.000000 +G01 X800.000000 Y253.807690 Z0.000000 +G01 X800.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5266) + + +(Start cutting path id: path5264) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X724.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X796.000000 Y249.708690 Z0.000000 F200.000000 +G01 X822.666670 Y241.264290 Z0.000000 +G01 X750.666670 Y218.464390 Z0.000000 +G01 X777.333330 Y210.019970 Z0.000000 +G01 X849.333330 Y232.819890 Z0.000000 +G01 X876.000000 Y224.375490 Z0.000000 +G01 X804.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5264) + + +(Start cutting path id: path5318) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X800.000000 Y197.476570 Z0.000000 F200.000000 +G01 X820.000000 Y203.809870 Z0.000000 +G01 X820.000000 Y152.827780 Z0.000000 +G01 X840.000000 Y159.161080 Z0.000000 +G01 X840.000000 Y210.143170 Z0.000000 +G01 X860.000000 Y216.476490 Z0.000000 +G01 X860.000000 Y165.494380 Z0.000000 +G01 X880.000000 Y171.827680 Z0.000000 +G01 X880.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5318) + + +(Start cutting path id: path5316) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X804.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X876.000000 Y167.728680 Z0.000000 F200.000000 +G01 X902.666670 Y159.284290 Z0.000000 +G01 X830.666670 Y136.484410 Z0.000000 +G01 X857.333330 Y128.040010 Z0.000000 +G01 X929.333330 Y150.839890 Z0.000000 +G01 X956.000000 Y142.395480 Z0.000000 +G01 X884.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5316) + + +(Start cutting path id: path5370) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X880.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X880.000000 Y115.496610 Z0.000000 F200.000000 +G01 X900.000000 Y121.829910 Z0.000000 +G01 X900.000000 Y70.847830 Z0.000000 +G01 X920.000000 Y77.181130 Z0.000000 +G01 X920.000000 Y128.163210 Z0.000000 +G01 X940.000000 Y134.496510 Z0.000000 +G01 X940.000000 Y83.514430 Z0.000000 +G01 X960.000000 Y89.847730 Z0.000000 +G01 X960.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5370) + + +(Start cutting path id: path5368) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X884.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X956.000000 Y85.748730 Z0.000000 F200.000000 +G01 X982.666670 Y77.304330 Z0.000000 +G01 X910.666670 Y54.504450 Z0.000000 +G01 X937.333330 Y46.060050 Z0.000000 +G01 X1009.333300 Y68.859930 Z0.000000 +G01 X1036.000000 Y60.415530 Z0.000000 +G01 X964.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5368) + + +(Start cutting path id: path5422) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X960.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X960.000000 Y33.516650 Z0.000000 F200.000000 +G01 X980.000000 Y39.849950 Z0.000000 +G01 X980.000000 Y-11.132130 Z0.000000 +G01 X1000.000000 Y-4.798830 Z0.000000 +G01 X1000.000000 Y46.183250 Z0.000000 +G01 X1020.000000 Y52.516550 Z0.000000 +G01 X1020.000000 Y1.534470 Z0.000000 +G01 X1040.000000 Y7.867770 Z0.000000 +G01 X1040.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5422) + + +(Start cutting path id: path5420) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X964.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1036.000000 Y3.768770 Z0.000000 F200.000000 +G01 X1062.666700 Y-4.675630 Z0.000000 +G01 X990.666670 Y-27.475510 Z0.000000 +G01 X1017.333300 Y-35.919910 Z0.000000 +G01 X1089.333300 Y-13.120030 Z0.000000 +G01 X1116.000000 Y-21.564430 Z0.000000 +G01 X1044.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5420) + + +(Start cutting path id: path5474) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1040.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1040.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X1060.000000 Y-42.130010 Z0.000000 +G01 X1060.000000 Y-93.112090 Z0.000000 +G01 X1080.000000 Y-86.778790 Z0.000000 +G01 X1080.000000 Y-35.796710 Z0.000000 +G01 X1100.000000 Y-29.463410 Z0.000000 +G01 X1100.000000 Y-80.445490 Z0.000000 +G01 X1120.000000 Y-74.112190 Z0.000000 +G01 X1120.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5474) + + +(Start cutting path id: path5472) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1044.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1116.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X1142.666700 Y-86.655590 Z0.000000 +G01 X1070.666700 Y-109.455470 Z0.000000 +G01 X1097.333300 Y-117.899870 Z0.000000 +G01 X1169.333300 Y-95.099990 Z0.000000 +G01 X1196.000000 Y-103.544380 Z0.000000 +G01 X1124.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5472) + + +(Start cutting path id: path5526) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1120.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1120.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X1140.000000 Y-124.109960 Z0.000000 +G01 X1140.000000 Y-175.092050 Z0.000000 +G01 X1160.000000 Y-168.758750 Z0.000000 +G01 X1160.000000 Y-117.776660 Z0.000000 +G01 X1180.000000 Y-111.443360 Z0.000000 +G01 X1180.000000 Y-162.425450 Z0.000000 +G01 X1200.000000 Y-156.092150 Z0.000000 +G01 X1200.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5526) + + +(Start cutting path id: path5524) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1124.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1196.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1222.666700 Y-168.635550 Z0.000000 +G01 X1150.666700 Y-191.435430 Z0.000000 +G01 X1177.333300 Y-199.879820 Z0.000000 +G01 X1249.333300 Y-177.079940 Z0.000000 +G01 X1276.000000 Y-185.524340 Z0.000000 +G01 X1204.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5524) + + +(Start cutting path id: path5578) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1200.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X1220.000000 Y-206.089900 Z0.000000 +G01 X1220.000000 Y-257.072000 Z0.000000 +G01 X1240.000000 Y-250.738700 Z0.000000 +G01 X1240.000000 Y-199.756620 Z0.000000 +G01 X1260.000000 Y-193.423320 Z0.000000 +G01 X1260.000000 Y-244.405400 Z0.000000 +G01 X1280.000000 Y-238.072100 Z0.000000 +G01 X1280.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5578) + + +(Start cutting path id: path5576) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1204.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1276.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1302.666700 Y-250.615500 Z0.000000 +G01 X1230.666700 Y-273.415400 Z0.000000 +G01 X1257.333300 Y-281.859800 Z0.000000 +G01 X1329.333300 Y-259.059900 Z0.000000 +G01 X1356.000000 Y-267.504300 Z0.000000 +G01 X1284.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5576) + + +(Start cutting path id: path5630) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1280.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1280.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X1300.000000 Y-288.069900 Z0.000000 +G01 X1300.000000 Y-339.052000 Z0.000000 +G01 X1320.000000 Y-332.718700 Z0.000000 +G01 X1320.000000 Y-281.736600 Z0.000000 +G01 X1340.000000 Y-275.403300 Z0.000000 +G01 X1340.000000 Y-326.385400 Z0.000000 +G01 X1360.000000 Y-320.052100 Z0.000000 +G01 X1360.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5630) + + +(Start cutting path id: path5628) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1284.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1356.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1382.666700 Y-332.595500 Z0.000000 +G01 X1310.666700 Y-355.395300 Z0.000000 +G01 X1337.333300 Y-363.839700 Z0.000000 +G01 X1409.333300 Y-341.039900 Z0.000000 +G01 X1436.000000 Y-349.484300 Z0.000000 +G01 X1364.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5628) + + +(Start cutting path id: path5626) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1280.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1360.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5626) + + +(Start cutting path id: path5574) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1276.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1204.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1204.000000 Y-312.821700 Z0.000000 +G01 X1276.000000 Y-335.621600 Z0.000000 +G01 X1276.000000 Y-324.292200 Z0.000000 +G01 X1204.000000 Y-301.492400 Z0.000000 +G01 X1204.000000 Y-290.163000 Z0.000000 +G01 X1276.000000 Y-312.962900 Z0.000000 +G01 X1276.000000 Y-301.633500 Z0.000000 +G01 X1204.000000 Y-278.833700 Z0.000000 +G01 X1204.000000 Y-267.504300 Z0.000000 +G01 X1276.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5574) + + +(Start cutting path id: path5522) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1196.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1124.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1124.000000 Y-230.841800 Z0.000000 +G01 X1196.000000 Y-253.641600 Z0.000000 +G01 X1196.000000 Y-242.312300 Z0.000000 +G01 X1124.000000 Y-219.512400 Z0.000000 +G01 X1124.000000 Y-208.183100 Z0.000000 +G01 X1196.000000 Y-230.982900 Z0.000000 +G01 X1196.000000 Y-219.653600 Z0.000000 +G01 X1124.000000 Y-196.853700 Z0.000000 +G01 X1124.000000 Y-185.524340 Z0.000000 +G01 X1196.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5522) + + +(Start cutting path id: path5470) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1116.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1044.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1044.000000 Y-148.861790 Z0.000000 +G01 X1116.000000 Y-171.661670 Z0.000000 +G01 X1116.000000 Y-160.332320 Z0.000000 +G01 X1044.000000 Y-137.532440 Z0.000000 +G01 X1044.000000 Y-126.203090 Z0.000000 +G01 X1116.000000 Y-149.002970 Z0.000000 +G01 X1116.000000 Y-137.673620 Z0.000000 +G01 X1044.000000 Y-114.873740 Z0.000000 +G01 X1044.000000 Y-103.544380 Z0.000000 +G01 X1116.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5470) + + +(Start cutting path id: path5418) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1036.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X964.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X964.000000 Y-66.881830 Z0.000000 +G01 X1036.000000 Y-89.681710 Z0.000000 +G01 X1036.000000 Y-78.352360 Z0.000000 +G01 X964.000000 Y-55.552480 Z0.000000 +G01 X964.000000 Y-44.223130 Z0.000000 +G01 X1036.000000 Y-67.023010 Z0.000000 +G01 X1036.000000 Y-55.693660 Z0.000000 +G01 X964.000000 Y-32.893780 Z0.000000 +G01 X964.000000 Y-21.564430 Z0.000000 +G01 X1036.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5418) + + +(Start cutting path id: path5366) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X956.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X884.000000 Y3.768770 Z0.000000 F200.000000 +G01 X884.000000 Y15.098120 Z0.000000 +G01 X956.000000 Y-7.701760 Z0.000000 +G01 X956.000000 Y3.627590 Z0.000000 +G01 X884.000000 Y26.427470 Z0.000000 +G01 X884.000000 Y37.756830 Z0.000000 +G01 X956.000000 Y14.956950 Z0.000000 +G01 X956.000000 Y26.286300 Z0.000000 +G01 X884.000000 Y49.086180 Z0.000000 +G01 X884.000000 Y60.415530 Z0.000000 +G01 X956.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5366) + + +(Start cutting path id: path5314) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X876.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X804.000000 Y85.748730 Z0.000000 F200.000000 +G01 X804.000000 Y97.078080 Z0.000000 +G01 X876.000000 Y74.278200 Z0.000000 +G01 X876.000000 Y85.607550 Z0.000000 +G01 X804.000000 Y108.407430 Z0.000000 +G01 X804.000000 Y119.736790 Z0.000000 +G01 X876.000000 Y96.936910 Z0.000000 +G01 X876.000000 Y108.266260 Z0.000000 +G01 X804.000000 Y131.066140 Z0.000000 +G01 X804.000000 Y142.395480 Z0.000000 +G01 X876.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5314) + + +(Start cutting path id: path5262) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X796.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X724.000000 Y167.728680 Z0.000000 F200.000000 +G01 X724.000000 Y179.058040 Z0.000000 +G01 X796.000000 Y156.258160 Z0.000000 +G01 X796.000000 Y167.587510 Z0.000000 +G01 X724.000000 Y190.387390 Z0.000000 +G01 X724.000000 Y201.716740 Z0.000000 +G01 X796.000000 Y178.916860 Z0.000000 +G01 X796.000000 Y190.246210 Z0.000000 +G01 X724.000000 Y213.046090 Z0.000000 +G01 X724.000000 Y224.375390 Z0.000000 +G01 X796.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5262) + + +(Start cutting path id: path5210) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X716.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X644.000000 Y249.708690 Z0.000000 F200.000000 +G01 X644.000000 Y261.037990 Z0.000000 +G01 X716.000000 Y238.238090 Z0.000000 +G01 X716.000000 Y249.567490 Z0.000000 +G01 X644.000000 Y272.367390 Z0.000000 +G01 X644.000000 Y283.696690 Z0.000000 +G01 X716.000000 Y260.896790 Z0.000000 +G01 X716.000000 Y272.226190 Z0.000000 +G01 X644.000000 Y295.026090 Z0.000000 +G01 X644.000000 Y306.355390 Z0.000000 +G01 X716.000000 Y283.555490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5210) + + +(Start cutting path id: path5214) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X640.000000 Y310.454390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X640.000000 Y361.436490 Z0.000000 F200.000000 +G01 X660.000000 Y367.769790 Z0.000000 +G01 X660.000000 Y316.787690 Z0.000000 +G01 X680.000000 Y323.120990 Z0.000000 +G01 X680.000000 Y374.103090 Z0.000000 +G01 X700.000000 Y380.436390 Z0.000000 +G01 X700.000000 Y329.454290 Z0.000000 +G01 X720.000000 Y335.787590 Z0.000000 +G01 X720.000000 Y386.769690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5214) + + +(Start cutting path id: path5206) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X564.000000 Y226.908790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X636.000000 Y249.708690 Z0.000000 F200.000000 +G01 X662.666670 Y241.264290 Z0.000000 +G01 X590.666670 Y218.464390 Z0.000000 +G01 X617.333330 Y210.019970 Z0.000000 +G01 X689.333330 Y232.819890 Z0.000000 +G01 X716.000000 Y224.375490 Z0.000000 +G01 X644.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5206) + + +(Start cutting path id: path5260) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X640.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X640.000000 Y197.476570 Z0.000000 F200.000000 +G01 X660.000000 Y203.809870 Z0.000000 +G01 X660.000000 Y152.827780 Z0.000000 +G01 X680.000000 Y159.161080 Z0.000000 +G01 X680.000000 Y210.143170 Z0.000000 +G01 X700.000000 Y216.476490 Z0.000000 +G01 X700.000000 Y165.494380 Z0.000000 +G01 X720.000000 Y171.827680 Z0.000000 +G01 X720.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5260) + + +(Start cutting path id: path5258) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X644.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X716.000000 Y167.728680 Z0.000000 F200.000000 +G01 X742.666670 Y159.284290 Z0.000000 +G01 X670.666670 Y136.484410 Z0.000000 +G01 X697.333330 Y128.040010 Z0.000000 +G01 X769.333330 Y150.839890 Z0.000000 +G01 X796.000000 Y142.395480 Z0.000000 +G01 X724.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5258) + + +(Start cutting path id: path5312) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X720.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X720.000000 Y115.496610 Z0.000000 F200.000000 +G01 X740.000000 Y121.829910 Z0.000000 +G01 X740.000000 Y70.847830 Z0.000000 +G01 X760.000000 Y77.181130 Z0.000000 +G01 X760.000000 Y128.163210 Z0.000000 +G01 X780.000000 Y134.496510 Z0.000000 +G01 X780.000000 Y83.514430 Z0.000000 +G01 X800.000000 Y89.847730 Z0.000000 +G01 X800.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5312) + + +(Start cutting path id: path5310) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X724.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X796.000000 Y85.748730 Z0.000000 F200.000000 +G01 X822.666670 Y77.304330 Z0.000000 +G01 X750.666670 Y54.504450 Z0.000000 +G01 X777.333330 Y46.060050 Z0.000000 +G01 X849.333330 Y68.859930 Z0.000000 +G01 X876.000000 Y60.415530 Z0.000000 +G01 X804.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5310) + + +(Start cutting path id: path5364) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X800.000000 Y33.516650 Z0.000000 F200.000000 +G01 X820.000000 Y39.849950 Z0.000000 +G01 X820.000000 Y-11.132130 Z0.000000 +G01 X840.000000 Y-4.798830 Z0.000000 +G01 X840.000000 Y46.183250 Z0.000000 +G01 X860.000000 Y52.516550 Z0.000000 +G01 X860.000000 Y1.534470 Z0.000000 +G01 X880.000000 Y7.867770 Z0.000000 +G01 X880.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5364) + + +(Start cutting path id: path5362) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X804.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X876.000000 Y3.768770 Z0.000000 F200.000000 +G01 X902.666670 Y-4.675630 Z0.000000 +G01 X830.666670 Y-27.475510 Z0.000000 +G01 X857.333330 Y-35.919910 Z0.000000 +G01 X929.333330 Y-13.120030 Z0.000000 +G01 X956.000000 Y-21.564430 Z0.000000 +G01 X884.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5362) + + +(Start cutting path id: path5416) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X880.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X880.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X900.000000 Y-42.130010 Z0.000000 +G01 X900.000000 Y-93.112090 Z0.000000 +G01 X920.000000 Y-86.778790 Z0.000000 +G01 X920.000000 Y-35.796710 Z0.000000 +G01 X940.000000 Y-29.463410 Z0.000000 +G01 X940.000000 Y-80.445490 Z0.000000 +G01 X960.000000 Y-74.112190 Z0.000000 +G01 X960.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5416) + + +(Start cutting path id: path5414) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X884.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X956.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X982.666670 Y-86.655590 Z0.000000 +G01 X910.666670 Y-109.455470 Z0.000000 +G01 X937.333330 Y-117.899870 Z0.000000 +G01 X1009.333300 Y-95.099990 Z0.000000 +G01 X1036.000000 Y-103.544380 Z0.000000 +G01 X964.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5414) + + +(Start cutting path id: path5468) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X960.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X960.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X980.000000 Y-124.109960 Z0.000000 +G01 X980.000000 Y-175.092050 Z0.000000 +G01 X1000.000000 Y-168.758750 Z0.000000 +G01 X1000.000000 Y-117.776660 Z0.000000 +G01 X1020.000000 Y-111.443360 Z0.000000 +G01 X1020.000000 Y-162.425450 Z0.000000 +G01 X1040.000000 Y-156.092150 Z0.000000 +G01 X1040.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5468) + + +(Start cutting path id: path5466) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X964.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1036.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X1062.666700 Y-168.635550 Z0.000000 +G01 X990.666670 Y-191.435430 Z0.000000 +G01 X1017.333300 Y-199.879820 Z0.000000 +G01 X1089.333300 Y-177.079940 Z0.000000 +G01 X1116.000000 Y-185.524340 Z0.000000 +G01 X1044.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5466) + + +(Start cutting path id: path5520) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1040.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1040.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X1060.000000 Y-206.089900 Z0.000000 +G01 X1060.000000 Y-257.072000 Z0.000000 +G01 X1080.000000 Y-250.738700 Z0.000000 +G01 X1080.000000 Y-199.756620 Z0.000000 +G01 X1100.000000 Y-193.423320 Z0.000000 +G01 X1100.000000 Y-244.405400 Z0.000000 +G01 X1120.000000 Y-238.072100 Z0.000000 +G01 X1120.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5520) + + +(Start cutting path id: path5518) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1044.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1116.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X1142.666700 Y-250.615500 Z0.000000 +G01 X1070.666700 Y-273.415400 Z0.000000 +G01 X1097.333300 Y-281.859800 Z0.000000 +G01 X1169.333300 Y-259.059900 Z0.000000 +G01 X1196.000000 Y-267.504300 Z0.000000 +G01 X1124.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5518) + + +(Start cutting path id: path5572) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1120.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1120.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X1140.000000 Y-288.069900 Z0.000000 +G01 X1140.000000 Y-339.052000 Z0.000000 +G01 X1160.000000 Y-332.718700 Z0.000000 +G01 X1160.000000 Y-281.736600 Z0.000000 +G01 X1180.000000 Y-275.403300 Z0.000000 +G01 X1180.000000 Y-326.385400 Z0.000000 +G01 X1200.000000 Y-320.052100 Z0.000000 +G01 X1200.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5572) + + +(Start cutting path id: path5570) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1124.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1196.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1222.666700 Y-332.595500 Z0.000000 +G01 X1150.666700 Y-355.395300 Z0.000000 +G01 X1177.333300 Y-363.839700 Z0.000000 +G01 X1249.333300 Y-341.039900 Z0.000000 +G01 X1276.000000 Y-349.484300 Z0.000000 +G01 X1204.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5570) + + +(Start cutting path id: path5568) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1120.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5568) + + +(Start cutting path id: path5516) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1116.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1044.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1044.000000 Y-312.821700 Z0.000000 +G01 X1116.000000 Y-335.621600 Z0.000000 +G01 X1116.000000 Y-324.292200 Z0.000000 +G01 X1044.000000 Y-301.492400 Z0.000000 +G01 X1044.000000 Y-290.163000 Z0.000000 +G01 X1116.000000 Y-312.962900 Z0.000000 +G01 X1116.000000 Y-301.633500 Z0.000000 +G01 X1044.000000 Y-278.833700 Z0.000000 +G01 X1044.000000 Y-267.504300 Z0.000000 +G01 X1116.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5516) + + +(Start cutting path id: path5464) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1036.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X964.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X964.000000 Y-230.841800 Z0.000000 +G01 X1036.000000 Y-253.641600 Z0.000000 +G01 X1036.000000 Y-242.312300 Z0.000000 +G01 X964.000000 Y-219.512400 Z0.000000 +G01 X964.000000 Y-208.183100 Z0.000000 +G01 X1036.000000 Y-230.982900 Z0.000000 +G01 X1036.000000 Y-219.653600 Z0.000000 +G01 X964.000000 Y-196.853700 Z0.000000 +G01 X964.000000 Y-185.524340 Z0.000000 +G01 X1036.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5464) + + +(Start cutting path id: path5412) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X956.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X884.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X884.000000 Y-148.861790 Z0.000000 +G01 X956.000000 Y-171.661670 Z0.000000 +G01 X956.000000 Y-160.332320 Z0.000000 +G01 X884.000000 Y-137.532440 Z0.000000 +G01 X884.000000 Y-126.203090 Z0.000000 +G01 X956.000000 Y-149.002970 Z0.000000 +G01 X956.000000 Y-137.673620 Z0.000000 +G01 X884.000000 Y-114.873740 Z0.000000 +G01 X884.000000 Y-103.544380 Z0.000000 +G01 X956.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5412) + + +(Start cutting path id: path5360) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X876.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X804.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X804.000000 Y-66.881830 Z0.000000 +G01 X876.000000 Y-89.681710 Z0.000000 +G01 X876.000000 Y-78.352360 Z0.000000 +G01 X804.000000 Y-55.552480 Z0.000000 +G01 X804.000000 Y-44.223130 Z0.000000 +G01 X876.000000 Y-67.023010 Z0.000000 +G01 X876.000000 Y-55.693660 Z0.000000 +G01 X804.000000 Y-32.893780 Z0.000000 +G01 X804.000000 Y-21.564430 Z0.000000 +G01 X876.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5360) + + +(Start cutting path id: path5308) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X796.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X724.000000 Y3.768770 Z0.000000 F200.000000 +G01 X724.000000 Y15.098120 Z0.000000 +G01 X796.000000 Y-7.701760 Z0.000000 +G01 X796.000000 Y3.627590 Z0.000000 +G01 X724.000000 Y26.427470 Z0.000000 +G01 X724.000000 Y37.756830 Z0.000000 +G01 X796.000000 Y14.956950 Z0.000000 +G01 X796.000000 Y26.286300 Z0.000000 +G01 X724.000000 Y49.086180 Z0.000000 +G01 X724.000000 Y60.415530 Z0.000000 +G01 X796.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5308) + + +(Start cutting path id: path5256) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X716.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X644.000000 Y85.748730 Z0.000000 F200.000000 +G01 X644.000000 Y97.078080 Z0.000000 +G01 X716.000000 Y74.278200 Z0.000000 +G01 X716.000000 Y85.607550 Z0.000000 +G01 X644.000000 Y108.407430 Z0.000000 +G01 X644.000000 Y119.736790 Z0.000000 +G01 X716.000000 Y96.936910 Z0.000000 +G01 X716.000000 Y108.266260 Z0.000000 +G01 X644.000000 Y131.066140 Z0.000000 +G01 X644.000000 Y142.395480 Z0.000000 +G01 X716.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5256) + + +(Start cutting path id: path5204) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X636.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X564.000000 Y167.728680 Z0.000000 F200.000000 +G01 X564.000000 Y179.058040 Z0.000000 +G01 X636.000000 Y156.258160 Z0.000000 +G01 X636.000000 Y167.587510 Z0.000000 +G01 X564.000000 Y190.387390 Z0.000000 +G01 X564.000000 Y201.716740 Z0.000000 +G01 X636.000000 Y178.916860 Z0.000000 +G01 X636.000000 Y190.246210 Z0.000000 +G01 X564.000000 Y213.046090 Z0.000000 +G01 X564.000000 Y224.375390 Z0.000000 +G01 X636.000000 Y201.575560 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5204) + + +(Start cutting path id: path5208) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X560.000000 Y228.474490 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X560.000000 Y279.456490 Z0.000000 F200.000000 +G01 X580.000000 Y285.789790 Z0.000000 +G01 X580.000000 Y234.807790 Z0.000000 +G01 X600.000000 Y241.141090 Z0.000000 +G01 X600.000000 Y292.123090 Z0.000000 +G01 X620.000000 Y298.456390 Z0.000000 +G01 X620.000000 Y247.474390 Z0.000000 +G01 X640.000000 Y253.807690 Z0.000000 +G01 X640.000000 Y304.789690 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5208) + + +(Start cutting path id: path5200) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X484.000000 Y144.928800 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X556.000000 Y167.728680 Z0.000000 F200.000000 +G01 X582.666670 Y159.284290 Z0.000000 +G01 X510.666670 Y136.484410 Z0.000000 +G01 X537.333330 Y128.040010 Z0.000000 +G01 X609.333330 Y150.839890 Z0.000000 +G01 X636.000000 Y142.395480 Z0.000000 +G01 X564.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5200) + + +(Start cutting path id: path5254) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X560.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X560.000000 Y115.496610 Z0.000000 F200.000000 +G01 X580.000000 Y121.829910 Z0.000000 +G01 X580.000000 Y70.847830 Z0.000000 +G01 X600.000000 Y77.181130 Z0.000000 +G01 X600.000000 Y128.163210 Z0.000000 +G01 X620.000000 Y134.496510 Z0.000000 +G01 X620.000000 Y83.514430 Z0.000000 +G01 X640.000000 Y89.847730 Z0.000000 +G01 X640.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5254) + + +(Start cutting path id: path5252) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X564.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X636.000000 Y85.748730 Z0.000000 F200.000000 +G01 X662.666670 Y77.304330 Z0.000000 +G01 X590.666670 Y54.504450 Z0.000000 +G01 X617.333330 Y46.060050 Z0.000000 +G01 X689.333330 Y68.859930 Z0.000000 +G01 X716.000000 Y60.415530 Z0.000000 +G01 X644.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5252) + + +(Start cutting path id: path5306) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X640.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X640.000000 Y33.516650 Z0.000000 F200.000000 +G01 X660.000000 Y39.849950 Z0.000000 +G01 X660.000000 Y-11.132130 Z0.000000 +G01 X680.000000 Y-4.798830 Z0.000000 +G01 X680.000000 Y46.183250 Z0.000000 +G01 X700.000000 Y52.516550 Z0.000000 +G01 X700.000000 Y1.534470 Z0.000000 +G01 X720.000000 Y7.867770 Z0.000000 +G01 X720.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5306) + + +(Start cutting path id: path5304) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X644.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X716.000000 Y3.768770 Z0.000000 F200.000000 +G01 X742.666670 Y-4.675630 Z0.000000 +G01 X670.666670 Y-27.475510 Z0.000000 +G01 X697.333330 Y-35.919910 Z0.000000 +G01 X769.333330 Y-13.120030 Z0.000000 +G01 X796.000000 Y-21.564430 Z0.000000 +G01 X724.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5304) + + +(Start cutting path id: path5358) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X720.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X720.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X740.000000 Y-42.130010 Z0.000000 +G01 X740.000000 Y-93.112090 Z0.000000 +G01 X760.000000 Y-86.778790 Z0.000000 +G01 X760.000000 Y-35.796710 Z0.000000 +G01 X780.000000 Y-29.463410 Z0.000000 +G01 X780.000000 Y-80.445490 Z0.000000 +G01 X800.000000 Y-74.112190 Z0.000000 +G01 X800.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5358) + + +(Start cutting path id: path5356) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X724.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X796.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X822.666670 Y-86.655590 Z0.000000 +G01 X750.666670 Y-109.455470 Z0.000000 +G01 X777.333330 Y-117.899870 Z0.000000 +G01 X849.333330 Y-95.099990 Z0.000000 +G01 X876.000000 Y-103.544380 Z0.000000 +G01 X804.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5356) + + +(Start cutting path id: path5410) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X800.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X820.000000 Y-124.109960 Z0.000000 +G01 X820.000000 Y-175.092050 Z0.000000 +G01 X840.000000 Y-168.758750 Z0.000000 +G01 X840.000000 Y-117.776660 Z0.000000 +G01 X860.000000 Y-111.443360 Z0.000000 +G01 X860.000000 Y-162.425450 Z0.000000 +G01 X880.000000 Y-156.092150 Z0.000000 +G01 X880.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5410) + + +(Start cutting path id: path5408) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X804.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X876.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X902.666670 Y-168.635550 Z0.000000 +G01 X830.666670 Y-191.435430 Z0.000000 +G01 X857.333330 Y-199.879820 Z0.000000 +G01 X929.333330 Y-177.079940 Z0.000000 +G01 X956.000000 Y-185.524340 Z0.000000 +G01 X884.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5408) + + +(Start cutting path id: path5462) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X880.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X880.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X900.000000 Y-206.089900 Z0.000000 +G01 X900.000000 Y-257.072000 Z0.000000 +G01 X920.000000 Y-250.738700 Z0.000000 +G01 X920.000000 Y-199.756620 Z0.000000 +G01 X940.000000 Y-193.423320 Z0.000000 +G01 X940.000000 Y-244.405400 Z0.000000 +G01 X960.000000 Y-238.072100 Z0.000000 +G01 X960.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5462) + + +(Start cutting path id: path5460) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X884.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X956.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X982.666670 Y-250.615500 Z0.000000 +G01 X910.666670 Y-273.415400 Z0.000000 +G01 X937.333330 Y-281.859800 Z0.000000 +G01 X1009.333300 Y-259.059900 Z0.000000 +G01 X1036.000000 Y-267.504300 Z0.000000 +G01 X964.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5460) + + +(Start cutting path id: path5514) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X960.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X960.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X980.000000 Y-288.069900 Z0.000000 +G01 X980.000000 Y-339.052000 Z0.000000 +G01 X1000.000000 Y-332.718700 Z0.000000 +G01 X1000.000000 Y-281.736600 Z0.000000 +G01 X1020.000000 Y-275.403300 Z0.000000 +G01 X1020.000000 Y-326.385400 Z0.000000 +G01 X1040.000000 Y-320.052100 Z0.000000 +G01 X1040.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5514) + + +(Start cutting path id: path5512) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X964.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1036.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X1062.666700 Y-332.595500 Z0.000000 +G01 X990.666670 Y-355.395300 Z0.000000 +G01 X1017.333300 Y-363.839700 Z0.000000 +G01 X1089.333300 Y-341.039900 Z0.000000 +G01 X1116.000000 Y-349.484300 Z0.000000 +G01 X1044.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5512) + + +(Start cutting path id: path5510) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X960.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1040.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5510) + + +(Start cutting path id: path5458) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X956.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X884.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X884.000000 Y-312.821700 Z0.000000 +G01 X956.000000 Y-335.621600 Z0.000000 +G01 X956.000000 Y-324.292200 Z0.000000 +G01 X884.000000 Y-301.492400 Z0.000000 +G01 X884.000000 Y-290.163000 Z0.000000 +G01 X956.000000 Y-312.962900 Z0.000000 +G01 X956.000000 Y-301.633500 Z0.000000 +G01 X884.000000 Y-278.833700 Z0.000000 +G01 X884.000000 Y-267.504300 Z0.000000 +G01 X956.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5458) + + +(Start cutting path id: path5406) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X876.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X804.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X804.000000 Y-230.841800 Z0.000000 +G01 X876.000000 Y-253.641600 Z0.000000 +G01 X876.000000 Y-242.312300 Z0.000000 +G01 X804.000000 Y-219.512400 Z0.000000 +G01 X804.000000 Y-208.183100 Z0.000000 +G01 X876.000000 Y-230.982900 Z0.000000 +G01 X876.000000 Y-219.653600 Z0.000000 +G01 X804.000000 Y-196.853700 Z0.000000 +G01 X804.000000 Y-185.524340 Z0.000000 +G01 X876.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5406) + + +(Start cutting path id: path5354) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X796.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X724.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X724.000000 Y-148.861790 Z0.000000 +G01 X796.000000 Y-171.661670 Z0.000000 +G01 X796.000000 Y-160.332320 Z0.000000 +G01 X724.000000 Y-137.532440 Z0.000000 +G01 X724.000000 Y-126.203090 Z0.000000 +G01 X796.000000 Y-149.002970 Z0.000000 +G01 X796.000000 Y-137.673620 Z0.000000 +G01 X724.000000 Y-114.873740 Z0.000000 +G01 X724.000000 Y-103.544380 Z0.000000 +G01 X796.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5354) + + +(Start cutting path id: path5302) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X716.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X644.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X644.000000 Y-66.881830 Z0.000000 +G01 X716.000000 Y-89.681710 Z0.000000 +G01 X716.000000 Y-78.352360 Z0.000000 +G01 X644.000000 Y-55.552480 Z0.000000 +G01 X644.000000 Y-44.223130 Z0.000000 +G01 X716.000000 Y-67.023010 Z0.000000 +G01 X716.000000 Y-55.693660 Z0.000000 +G01 X644.000000 Y-32.893780 Z0.000000 +G01 X644.000000 Y-21.564430 Z0.000000 +G01 X716.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5302) + + +(Start cutting path id: path5250) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X636.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X564.000000 Y3.768770 Z0.000000 F200.000000 +G01 X564.000000 Y15.098120 Z0.000000 +G01 X636.000000 Y-7.701760 Z0.000000 +G01 X636.000000 Y3.627590 Z0.000000 +G01 X564.000000 Y26.427470 Z0.000000 +G01 X564.000000 Y37.756830 Z0.000000 +G01 X636.000000 Y14.956950 Z0.000000 +G01 X636.000000 Y26.286300 Z0.000000 +G01 X564.000000 Y49.086180 Z0.000000 +G01 X564.000000 Y60.415530 Z0.000000 +G01 X636.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5250) + + +(Start cutting path id: path5198) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X556.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X484.000000 Y85.748730 Z0.000000 F200.000000 +G01 X484.000000 Y97.078080 Z0.000000 +G01 X556.000000 Y74.278200 Z0.000000 +G01 X556.000000 Y85.607550 Z0.000000 +G01 X484.000000 Y108.407430 Z0.000000 +G01 X484.000000 Y119.736790 Z0.000000 +G01 X556.000000 Y96.936910 Z0.000000 +G01 X556.000000 Y108.266260 Z0.000000 +G01 X484.000000 Y131.066140 Z0.000000 +G01 X484.000000 Y142.395480 Z0.000000 +G01 X556.000000 Y119.595600 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5198) + + +(Start cutting path id: path5202) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X480.000000 Y146.494480 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X480.000000 Y197.476570 Z0.000000 F200.000000 +G01 X500.000000 Y203.809870 Z0.000000 +G01 X500.000000 Y152.827780 Z0.000000 +G01 X520.000000 Y159.161080 Z0.000000 +G01 X520.000000 Y210.143170 Z0.000000 +G01 X540.000000 Y216.476490 Z0.000000 +G01 X540.000000 Y165.494380 Z0.000000 +G01 X560.000000 Y171.827680 Z0.000000 +G01 X560.000000 Y222.809790 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5202) + + +(Start cutting path id: path5194) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X404.000000 Y62.948850 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X476.000000 Y85.748730 Z0.000000 F200.000000 +G01 X502.666670 Y77.304330 Z0.000000 +G01 X430.666670 Y54.504450 Z0.000000 +G01 X457.333330 Y46.060050 Z0.000000 +G01 X529.333330 Y68.859930 Z0.000000 +G01 X556.000000 Y60.415530 Z0.000000 +G01 X484.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5194) + + +(Start cutting path id: path5248) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X480.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X480.000000 Y33.516650 Z0.000000 F200.000000 +G01 X500.000000 Y39.849950 Z0.000000 +G01 X500.000000 Y-11.132130 Z0.000000 +G01 X520.000000 Y-4.798830 Z0.000000 +G01 X520.000000 Y46.183250 Z0.000000 +G01 X540.000000 Y52.516550 Z0.000000 +G01 X540.000000 Y1.534470 Z0.000000 +G01 X560.000000 Y7.867770 Z0.000000 +G01 X560.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5248) + + +(Start cutting path id: path5246) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X484.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X556.000000 Y3.768770 Z0.000000 F200.000000 +G01 X582.666670 Y-4.675630 Z0.000000 +G01 X510.666670 Y-27.475510 Z0.000000 +G01 X537.333330 Y-35.919910 Z0.000000 +G01 X609.333330 Y-13.120030 Z0.000000 +G01 X636.000000 Y-21.564430 Z0.000000 +G01 X564.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5246) + + +(Start cutting path id: path5300) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X560.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X560.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X580.000000 Y-42.130010 Z0.000000 +G01 X580.000000 Y-93.112090 Z0.000000 +G01 X600.000000 Y-86.778790 Z0.000000 +G01 X600.000000 Y-35.796710 Z0.000000 +G01 X620.000000 Y-29.463410 Z0.000000 +G01 X620.000000 Y-80.445490 Z0.000000 +G01 X640.000000 Y-74.112190 Z0.000000 +G01 X640.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5300) + + +(Start cutting path id: path5298) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X564.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X636.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X662.666670 Y-86.655590 Z0.000000 +G01 X590.666670 Y-109.455470 Z0.000000 +G01 X617.333330 Y-117.899870 Z0.000000 +G01 X689.333330 Y-95.099990 Z0.000000 +G01 X716.000000 Y-103.544380 Z0.000000 +G01 X644.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5298) + + +(Start cutting path id: path5352) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X640.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X640.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X660.000000 Y-124.109960 Z0.000000 +G01 X660.000000 Y-175.092050 Z0.000000 +G01 X680.000000 Y-168.758750 Z0.000000 +G01 X680.000000 Y-117.776660 Z0.000000 +G01 X700.000000 Y-111.443360 Z0.000000 +G01 X700.000000 Y-162.425450 Z0.000000 +G01 X720.000000 Y-156.092150 Z0.000000 +G01 X720.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5352) + + +(Start cutting path id: path5350) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X644.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X716.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X742.666670 Y-168.635550 Z0.000000 +G01 X670.666670 Y-191.435430 Z0.000000 +G01 X697.333330 Y-199.879820 Z0.000000 +G01 X769.333330 Y-177.079940 Z0.000000 +G01 X796.000000 Y-185.524340 Z0.000000 +G01 X724.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5350) + + +(Start cutting path id: path5404) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X720.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X720.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X740.000000 Y-206.089900 Z0.000000 +G01 X740.000000 Y-257.072000 Z0.000000 +G01 X760.000000 Y-250.738700 Z0.000000 +G01 X760.000000 Y-199.756620 Z0.000000 +G01 X780.000000 Y-193.423320 Z0.000000 +G01 X780.000000 Y-244.405400 Z0.000000 +G01 X800.000000 Y-238.072100 Z0.000000 +G01 X800.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5404) + + +(Start cutting path id: path5402) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X724.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X796.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X822.666670 Y-250.615500 Z0.000000 +G01 X750.666670 Y-273.415400 Z0.000000 +G01 X777.333330 Y-281.859800 Z0.000000 +G01 X849.333330 Y-259.059900 Z0.000000 +G01 X876.000000 Y-267.504300 Z0.000000 +G01 X804.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5402) + + +(Start cutting path id: path5456) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X800.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X820.000000 Y-288.069900 Z0.000000 +G01 X820.000000 Y-339.052000 Z0.000000 +G01 X840.000000 Y-332.718700 Z0.000000 +G01 X840.000000 Y-281.736600 Z0.000000 +G01 X860.000000 Y-275.403300 Z0.000000 +G01 X860.000000 Y-326.385400 Z0.000000 +G01 X880.000000 Y-320.052100 Z0.000000 +G01 X880.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5456) + + +(Start cutting path id: path5454) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X804.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X876.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X902.666670 Y-332.595500 Z0.000000 +G01 X830.666670 Y-355.395300 Z0.000000 +G01 X857.333330 Y-363.839700 Z0.000000 +G01 X929.333330 Y-341.039900 Z0.000000 +G01 X956.000000 Y-349.484300 Z0.000000 +G01 X884.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5454) + + +(Start cutting path id: path5452) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X880.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5452) + + +(Start cutting path id: path5400) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X796.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X724.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X724.000000 Y-312.821700 Z0.000000 +G01 X796.000000 Y-335.621600 Z0.000000 +G01 X796.000000 Y-324.292200 Z0.000000 +G01 X724.000000 Y-301.492400 Z0.000000 +G01 X724.000000 Y-290.163000 Z0.000000 +G01 X796.000000 Y-312.962900 Z0.000000 +G01 X796.000000 Y-301.633500 Z0.000000 +G01 X724.000000 Y-278.833700 Z0.000000 +G01 X724.000000 Y-267.504300 Z0.000000 +G01 X796.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5400) + + +(Start cutting path id: path5348) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X716.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X644.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X644.000000 Y-230.841800 Z0.000000 +G01 X716.000000 Y-253.641600 Z0.000000 +G01 X716.000000 Y-242.312300 Z0.000000 +G01 X644.000000 Y-219.512400 Z0.000000 +G01 X644.000000 Y-208.183100 Z0.000000 +G01 X716.000000 Y-230.982900 Z0.000000 +G01 X716.000000 Y-219.653600 Z0.000000 +G01 X644.000000 Y-196.853700 Z0.000000 +G01 X644.000000 Y-185.524340 Z0.000000 +G01 X716.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5348) + + +(Start cutting path id: path5296) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X636.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X564.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X564.000000 Y-148.861790 Z0.000000 +G01 X636.000000 Y-171.661670 Z0.000000 +G01 X636.000000 Y-160.332320 Z0.000000 +G01 X564.000000 Y-137.532440 Z0.000000 +G01 X564.000000 Y-126.203090 Z0.000000 +G01 X636.000000 Y-149.002970 Z0.000000 +G01 X636.000000 Y-137.673620 Z0.000000 +G01 X564.000000 Y-114.873740 Z0.000000 +G01 X564.000000 Y-103.544380 Z0.000000 +G01 X636.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5296) + + +(Start cutting path id: path5244) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X556.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X484.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X484.000000 Y-66.881830 Z0.000000 +G01 X556.000000 Y-89.681710 Z0.000000 +G01 X556.000000 Y-78.352360 Z0.000000 +G01 X484.000000 Y-55.552480 Z0.000000 +G01 X484.000000 Y-44.223130 Z0.000000 +G01 X556.000000 Y-67.023010 Z0.000000 +G01 X556.000000 Y-55.693660 Z0.000000 +G01 X484.000000 Y-32.893780 Z0.000000 +G01 X484.000000 Y-21.564430 Z0.000000 +G01 X556.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5244) + + +(Start cutting path id: path5192) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X476.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X404.000000 Y3.768770 Z0.000000 F200.000000 +G01 X404.000000 Y15.098120 Z0.000000 +G01 X476.000000 Y-7.701760 Z0.000000 +G01 X476.000000 Y3.627590 Z0.000000 +G01 X404.000000 Y26.427470 Z0.000000 +G01 X404.000000 Y37.756830 Z0.000000 +G01 X476.000000 Y14.956950 Z0.000000 +G01 X476.000000 Y26.286300 Z0.000000 +G01 X404.000000 Y49.086180 Z0.000000 +G01 X404.000000 Y60.415530 Z0.000000 +G01 X476.000000 Y37.615650 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5192) + + +(Start cutting path id: path5196) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X400.000000 Y64.514530 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X400.000000 Y115.496610 Z0.000000 F200.000000 +G01 X420.000000 Y121.829910 Z0.000000 +G01 X420.000000 Y70.847830 Z0.000000 +G01 X440.000000 Y77.181130 Z0.000000 +G01 X440.000000 Y128.163210 Z0.000000 +G01 X460.000000 Y134.496510 Z0.000000 +G01 X460.000000 Y83.514430 Z0.000000 +G01 X480.000000 Y89.847730 Z0.000000 +G01 X480.000000 Y140.829810 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5196) + + +(Start cutting path id: path5188) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X324.000000 Y-19.031110 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X396.000000 Y3.768770 Z0.000000 F200.000000 +G01 X422.666670 Y-4.675630 Z0.000000 +G01 X350.666670 Y-27.475510 Z0.000000 +G01 X377.333330 Y-35.919910 Z0.000000 +G01 X449.333330 Y-13.120030 Z0.000000 +G01 X476.000000 Y-21.564430 Z0.000000 +G01 X404.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5188) + + +(Start cutting path id: path5242) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X400.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X400.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X420.000000 Y-42.130010 Z0.000000 +G01 X420.000000 Y-93.112090 Z0.000000 +G01 X440.000000 Y-86.778790 Z0.000000 +G01 X440.000000 Y-35.796710 Z0.000000 +G01 X460.000000 Y-29.463410 Z0.000000 +G01 X460.000000 Y-80.445490 Z0.000000 +G01 X480.000000 Y-74.112190 Z0.000000 +G01 X480.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5242) + + +(Start cutting path id: path5240) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X404.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X476.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X502.666670 Y-86.655590 Z0.000000 +G01 X430.666670 Y-109.455470 Z0.000000 +G01 X457.333330 Y-117.899870 Z0.000000 +G01 X529.333330 Y-95.099990 Z0.000000 +G01 X556.000000 Y-103.544380 Z0.000000 +G01 X484.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5240) + + +(Start cutting path id: path5294) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X480.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X480.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X500.000000 Y-124.109960 Z0.000000 +G01 X500.000000 Y-175.092050 Z0.000000 +G01 X520.000000 Y-168.758750 Z0.000000 +G01 X520.000000 Y-117.776660 Z0.000000 +G01 X540.000000 Y-111.443360 Z0.000000 +G01 X540.000000 Y-162.425450 Z0.000000 +G01 X560.000000 Y-156.092150 Z0.000000 +G01 X560.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5294) + + +(Start cutting path id: path5292) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X484.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X556.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X582.666670 Y-168.635550 Z0.000000 +G01 X510.666670 Y-191.435430 Z0.000000 +G01 X537.333330 Y-199.879820 Z0.000000 +G01 X609.333330 Y-177.079940 Z0.000000 +G01 X636.000000 Y-185.524340 Z0.000000 +G01 X564.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5292) + + +(Start cutting path id: path5346) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X560.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X560.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X580.000000 Y-206.089900 Z0.000000 +G01 X580.000000 Y-257.072000 Z0.000000 +G01 X600.000000 Y-250.738700 Z0.000000 +G01 X600.000000 Y-199.756620 Z0.000000 +G01 X620.000000 Y-193.423320 Z0.000000 +G01 X620.000000 Y-244.405400 Z0.000000 +G01 X640.000000 Y-238.072100 Z0.000000 +G01 X640.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5346) + + +(Start cutting path id: path5344) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X564.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X636.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X662.666670 Y-250.615500 Z0.000000 +G01 X590.666670 Y-273.415400 Z0.000000 +G01 X617.333330 Y-281.859800 Z0.000000 +G01 X689.333330 Y-259.059900 Z0.000000 +G01 X716.000000 Y-267.504300 Z0.000000 +G01 X644.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5344) + + +(Start cutting path id: path5398) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X640.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X640.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X660.000000 Y-288.069900 Z0.000000 +G01 X660.000000 Y-339.052000 Z0.000000 +G01 X680.000000 Y-332.718700 Z0.000000 +G01 X680.000000 Y-281.736600 Z0.000000 +G01 X700.000000 Y-275.403300 Z0.000000 +G01 X700.000000 Y-326.385400 Z0.000000 +G01 X720.000000 Y-320.052100 Z0.000000 +G01 X720.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5398) + + +(Start cutting path id: path5396) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X644.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X716.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X742.666670 Y-332.595500 Z0.000000 +G01 X670.666670 Y-355.395300 Z0.000000 +G01 X697.333330 Y-363.839700 Z0.000000 +G01 X769.333330 Y-341.039900 Z0.000000 +G01 X796.000000 Y-349.484300 Z0.000000 +G01 X724.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5396) + + +(Start cutting path id: path5394) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X640.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X720.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5394) + + +(Start cutting path id: path5342) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X636.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X564.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X564.000000 Y-312.821700 Z0.000000 +G01 X636.000000 Y-335.621600 Z0.000000 +G01 X636.000000 Y-324.292200 Z0.000000 +G01 X564.000000 Y-301.492400 Z0.000000 +G01 X564.000000 Y-290.163000 Z0.000000 +G01 X636.000000 Y-312.962900 Z0.000000 +G01 X636.000000 Y-301.633500 Z0.000000 +G01 X564.000000 Y-278.833700 Z0.000000 +G01 X564.000000 Y-267.504300 Z0.000000 +G01 X636.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5342) + + +(Start cutting path id: path5290) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X556.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X484.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X484.000000 Y-230.841800 Z0.000000 +G01 X556.000000 Y-253.641600 Z0.000000 +G01 X556.000000 Y-242.312300 Z0.000000 +G01 X484.000000 Y-219.512400 Z0.000000 +G01 X484.000000 Y-208.183100 Z0.000000 +G01 X556.000000 Y-230.982900 Z0.000000 +G01 X556.000000 Y-219.653600 Z0.000000 +G01 X484.000000 Y-196.853700 Z0.000000 +G01 X484.000000 Y-185.524340 Z0.000000 +G01 X556.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5290) + + +(Start cutting path id: path5238) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X476.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X404.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X404.000000 Y-148.861790 Z0.000000 +G01 X476.000000 Y-171.661670 Z0.000000 +G01 X476.000000 Y-160.332320 Z0.000000 +G01 X404.000000 Y-137.532440 Z0.000000 +G01 X404.000000 Y-126.203090 Z0.000000 +G01 X476.000000 Y-149.002970 Z0.000000 +G01 X476.000000 Y-137.673620 Z0.000000 +G01 X404.000000 Y-114.873740 Z0.000000 +G01 X404.000000 Y-103.544380 Z0.000000 +G01 X476.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5238) + + +(Start cutting path id: path5186) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X396.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X324.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X324.000000 Y-66.881830 Z0.000000 +G01 X396.000000 Y-89.681710 Z0.000000 +G01 X396.000000 Y-78.352360 Z0.000000 +G01 X324.000000 Y-55.552480 Z0.000000 +G01 X324.000000 Y-44.223130 Z0.000000 +G01 X396.000000 Y-67.023010 Z0.000000 +G01 X396.000000 Y-55.693660 Z0.000000 +G01 X324.000000 Y-32.893780 Z0.000000 +G01 X324.000000 Y-21.564430 Z0.000000 +G01 X396.000000 Y-44.364310 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5186) + + +(Start cutting path id: path5190) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X320.000000 Y-17.465430 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X320.000000 Y33.516650 Z0.000000 F200.000000 +G01 X340.000000 Y39.849950 Z0.000000 +G01 X340.000000 Y-11.132130 Z0.000000 +G01 X360.000000 Y-4.798830 Z0.000000 +G01 X360.000000 Y46.183250 Z0.000000 +G01 X380.000000 Y52.516550 Z0.000000 +G01 X380.000000 Y1.534470 Z0.000000 +G01 X400.000000 Y7.867770 Z0.000000 +G01 X400.000000 Y58.849850 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5190) + + +(Start cutting path id: path5182) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X244.000000 Y-101.011060 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X316.000000 Y-78.211180 Z0.000000 F200.000000 +G01 X342.666670 Y-86.655590 Z0.000000 +G01 X270.666670 Y-109.455470 Z0.000000 +G01 X297.333330 Y-117.899870 Z0.000000 +G01 X369.333330 Y-95.099990 Z0.000000 +G01 X396.000000 Y-103.544380 Z0.000000 +G01 X324.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5182) + + +(Start cutting path id: path5236) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X320.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X320.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X340.000000 Y-124.109960 Z0.000000 +G01 X340.000000 Y-175.092050 Z0.000000 +G01 X360.000000 Y-168.758750 Z0.000000 +G01 X360.000000 Y-117.776660 Z0.000000 +G01 X380.000000 Y-111.443360 Z0.000000 +G01 X380.000000 Y-162.425450 Z0.000000 +G01 X400.000000 Y-156.092150 Z0.000000 +G01 X400.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5236) + + +(Start cutting path id: path5234) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X324.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X396.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X422.666670 Y-168.635550 Z0.000000 +G01 X350.666670 Y-191.435430 Z0.000000 +G01 X377.333330 Y-199.879820 Z0.000000 +G01 X449.333330 Y-177.079940 Z0.000000 +G01 X476.000000 Y-185.524340 Z0.000000 +G01 X404.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5234) + + +(Start cutting path id: path5288) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X400.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X400.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X420.000000 Y-206.089900 Z0.000000 +G01 X420.000000 Y-257.072000 Z0.000000 +G01 X440.000000 Y-250.738700 Z0.000000 +G01 X440.000000 Y-199.756620 Z0.000000 +G01 X460.000000 Y-193.423320 Z0.000000 +G01 X460.000000 Y-244.405400 Z0.000000 +G01 X480.000000 Y-238.072100 Z0.000000 +G01 X480.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5288) + + +(Start cutting path id: path5286) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X404.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X476.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X502.666670 Y-250.615500 Z0.000000 +G01 X430.666670 Y-273.415400 Z0.000000 +G01 X457.333330 Y-281.859800 Z0.000000 +G01 X529.333330 Y-259.059900 Z0.000000 +G01 X556.000000 Y-267.504300 Z0.000000 +G01 X484.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5286) + + +(Start cutting path id: path5340) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X480.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X480.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X500.000000 Y-288.069900 Z0.000000 +G01 X500.000000 Y-339.052000 Z0.000000 +G01 X520.000000 Y-332.718700 Z0.000000 +G01 X520.000000 Y-281.736600 Z0.000000 +G01 X540.000000 Y-275.403300 Z0.000000 +G01 X540.000000 Y-326.385400 Z0.000000 +G01 X560.000000 Y-320.052100 Z0.000000 +G01 X560.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5340) + + +(Start cutting path id: path5338) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X484.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X556.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X582.666670 Y-332.595500 Z0.000000 +G01 X510.666670 Y-355.395300 Z0.000000 +G01 X537.333330 Y-363.839700 Z0.000000 +G01 X609.333330 Y-341.039900 Z0.000000 +G01 X636.000000 Y-349.484300 Z0.000000 +G01 X564.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5338) + + +(Start cutting path id: path5336) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X480.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X560.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5336) + + +(Start cutting path id: path5284) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X476.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X404.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X404.000000 Y-312.821700 Z0.000000 +G01 X476.000000 Y-335.621600 Z0.000000 +G01 X476.000000 Y-324.292200 Z0.000000 +G01 X404.000000 Y-301.492400 Z0.000000 +G01 X404.000000 Y-290.163000 Z0.000000 +G01 X476.000000 Y-312.962900 Z0.000000 +G01 X476.000000 Y-301.633500 Z0.000000 +G01 X404.000000 Y-278.833700 Z0.000000 +G01 X404.000000 Y-267.504300 Z0.000000 +G01 X476.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5284) + + +(Start cutting path id: path5232) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X396.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X324.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X324.000000 Y-230.841800 Z0.000000 +G01 X396.000000 Y-253.641600 Z0.000000 +G01 X396.000000 Y-242.312300 Z0.000000 +G01 X324.000000 Y-219.512400 Z0.000000 +G01 X324.000000 Y-208.183100 Z0.000000 +G01 X396.000000 Y-230.982900 Z0.000000 +G01 X396.000000 Y-219.653600 Z0.000000 +G01 X324.000000 Y-196.853700 Z0.000000 +G01 X324.000000 Y-185.524340 Z0.000000 +G01 X396.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5232) + + +(Start cutting path id: path5180) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X316.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X244.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X244.000000 Y-148.861790 Z0.000000 +G01 X316.000000 Y-171.661670 Z0.000000 +G01 X316.000000 Y-160.332320 Z0.000000 +G01 X244.000000 Y-137.532440 Z0.000000 +G01 X244.000000 Y-126.203090 Z0.000000 +G01 X316.000000 Y-149.002970 Z0.000000 +G01 X316.000000 Y-137.673620 Z0.000000 +G01 X244.000000 Y-114.873740 Z0.000000 +G01 X244.000000 Y-103.544380 Z0.000000 +G01 X316.000000 Y-126.344260 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5180) + + +(Start cutting path id: path5184) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X240.000000 Y-99.445390 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X240.000000 Y-48.463310 Z0.000000 F200.000000 +G01 X260.000000 Y-42.130010 Z0.000000 +G01 X260.000000 Y-93.112090 Z0.000000 +G01 X280.000000 Y-86.778790 Z0.000000 +G01 X280.000000 Y-35.796710 Z0.000000 +G01 X300.000000 Y-29.463410 Z0.000000 +G01 X300.000000 Y-80.445490 Z0.000000 +G01 X320.000000 Y-74.112190 Z0.000000 +G01 X320.000000 Y-23.130110 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5184) + + +(Start cutting path id: path5176) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X164.000000 Y-182.991020 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X236.000000 Y-160.191140 Z0.000000 F200.000000 +G01 X262.666670 Y-168.635550 Z0.000000 +G01 X190.666670 Y-191.435430 Z0.000000 +G01 X217.333330 Y-199.879820 Z0.000000 +G01 X289.333330 Y-177.079940 Z0.000000 +G01 X316.000000 Y-185.524340 Z0.000000 +G01 X244.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5176) + + +(Start cutting path id: path5230) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X240.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X240.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X260.000000 Y-206.089900 Z0.000000 +G01 X260.000000 Y-257.072000 Z0.000000 +G01 X280.000000 Y-250.738700 Z0.000000 +G01 X280.000000 Y-199.756620 Z0.000000 +G01 X300.000000 Y-193.423320 Z0.000000 +G01 X300.000000 Y-244.405400 Z0.000000 +G01 X320.000000 Y-238.072100 Z0.000000 +G01 X320.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5230) + + +(Start cutting path id: path5228) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X244.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X316.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X342.666670 Y-250.615500 Z0.000000 +G01 X270.666670 Y-273.415400 Z0.000000 +G01 X297.333330 Y-281.859800 Z0.000000 +G01 X369.333330 Y-259.059900 Z0.000000 +G01 X396.000000 Y-267.504300 Z0.000000 +G01 X324.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5228) + + +(Start cutting path id: path5282) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X320.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X320.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X340.000000 Y-288.069900 Z0.000000 +G01 X340.000000 Y-339.052000 Z0.000000 +G01 X360.000000 Y-332.718700 Z0.000000 +G01 X360.000000 Y-281.736600 Z0.000000 +G01 X380.000000 Y-275.403300 Z0.000000 +G01 X380.000000 Y-326.385400 Z0.000000 +G01 X400.000000 Y-320.052100 Z0.000000 +G01 X400.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5282) + + +(Start cutting path id: path5280) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X324.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X396.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X422.666670 Y-332.595500 Z0.000000 +G01 X350.666670 Y-355.395300 Z0.000000 +G01 X377.333330 Y-363.839700 Z0.000000 +G01 X449.333330 Y-341.039900 Z0.000000 +G01 X476.000000 Y-349.484300 Z0.000000 +G01 X404.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5280) + + +(Start cutting path id: path5278) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X320.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X400.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5278) + + +(Start cutting path id: path5226) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X316.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X244.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X244.000000 Y-312.821700 Z0.000000 +G01 X316.000000 Y-335.621600 Z0.000000 +G01 X316.000000 Y-324.292200 Z0.000000 +G01 X244.000000 Y-301.492400 Z0.000000 +G01 X244.000000 Y-290.163000 Z0.000000 +G01 X316.000000 Y-312.962900 Z0.000000 +G01 X316.000000 Y-301.633500 Z0.000000 +G01 X244.000000 Y-278.833700 Z0.000000 +G01 X244.000000 Y-267.504300 Z0.000000 +G01 X316.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5226) + + +(Start cutting path id: path5174) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X236.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X164.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X164.000000 Y-230.841800 Z0.000000 +G01 X236.000000 Y-253.641600 Z0.000000 +G01 X236.000000 Y-242.312300 Z0.000000 +G01 X164.000000 Y-219.512400 Z0.000000 +G01 X164.000000 Y-208.183100 Z0.000000 +G01 X236.000000 Y-230.982900 Z0.000000 +G01 X236.000000 Y-219.653600 Z0.000000 +G01 X164.000000 Y-196.853700 Z0.000000 +G01 X164.000000 Y-185.524340 Z0.000000 +G01 X236.000000 Y-208.324200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5174) + + +(Start cutting path id: path5178) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X160.000000 Y-181.425350 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X160.000000 Y-130.443260 Z0.000000 F200.000000 +G01 X180.000000 Y-124.109960 Z0.000000 +G01 X180.000000 Y-175.092050 Z0.000000 +G01 X200.000000 Y-168.758750 Z0.000000 +G01 X200.000000 Y-117.776660 Z0.000000 +G01 X220.000000 Y-111.443360 Z0.000000 +G01 X220.000000 Y-162.425450 Z0.000000 +G01 X240.000000 Y-156.092150 Z0.000000 +G01 X240.000000 Y-105.110060 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5178) + + +(Start cutting path id: path5170) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X84.000000 Y-264.971000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X156.000000 Y-242.171100 Z0.000000 F200.000000 +G01 X182.666670 Y-250.615500 Z0.000000 +G01 X110.666670 Y-273.415400 Z0.000000 +G01 X137.333330 Y-281.859800 Z0.000000 +G01 X209.333330 Y-259.059900 Z0.000000 +G01 X236.000000 Y-267.504300 Z0.000000 +G01 X164.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5170) + + +(Start cutting path id: path5224) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X160.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X160.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X180.000000 Y-288.069900 Z0.000000 +G01 X180.000000 Y-339.052000 Z0.000000 +G01 X200.000000 Y-332.718700 Z0.000000 +G01 X200.000000 Y-281.736600 Z0.000000 +G01 X220.000000 Y-275.403300 Z0.000000 +G01 X220.000000 Y-326.385400 Z0.000000 +G01 X240.000000 Y-320.052100 Z0.000000 +G01 X240.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5224) + + +(Start cutting path id: path5222) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X164.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X236.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X262.666670 Y-332.595500 Z0.000000 +G01 X190.666670 Y-355.395300 Z0.000000 +G01 X217.333330 Y-363.839700 Z0.000000 +G01 X289.333330 Y-341.039900 Z0.000000 +G01 X316.000000 Y-349.484300 Z0.000000 +G01 X244.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5222) + + +(Start cutting path id: path5220) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X160.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X240.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5220) + + +(Start cutting path id: path5168) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X156.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X84.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X84.000000 Y-312.821700 Z0.000000 +G01 X156.000000 Y-335.621600 Z0.000000 +G01 X156.000000 Y-324.292200 Z0.000000 +G01 X84.000000 Y-301.492400 Z0.000000 +G01 X84.000000 Y-290.163000 Z0.000000 +G01 X156.000000 Y-312.962900 Z0.000000 +G01 X156.000000 Y-301.633500 Z0.000000 +G01 X84.000000 Y-278.833700 Z0.000000 +G01 X84.000000 Y-267.504300 Z0.000000 +G01 X156.000000 Y-290.304200 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5168) + + +(Start cutting path id: path5172) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X80.000000 Y-263.405300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X80.000000 Y-212.423200 Z0.000000 F200.000000 +G01 X100.000000 Y-206.089900 Z0.000000 +G01 X100.000000 Y-257.072000 Z0.000000 +G01 X120.000000 Y-250.738700 Z0.000000 +G01 X120.000000 Y-199.756620 Z0.000000 +G01 X140.000000 Y-193.423320 Z0.000000 +G01 X140.000000 Y-244.405400 Z0.000000 +G01 X160.000000 Y-238.072100 Z0.000000 +G01 X160.000000 Y-187.090020 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5172) + + +(Start cutting path id: path5164) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X4.000000 Y-346.950900 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X76.000000 Y-324.151100 Z0.000000 F200.000000 +G01 X102.666670 Y-332.595500 Z0.000000 +G01 X30.666667 Y-355.395300 Z0.000000 +G01 X57.333333 Y-363.839700 Z0.000000 +G01 X129.333330 Y-341.039900 Z0.000000 +G01 X156.000000 Y-349.484300 Z0.000000 +G01 X84.000000 Y-372.284100 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5164) + + +(Start cutting path id: path5162) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X0.000000 Y-348.217600 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X80.000000 Y-373.550800 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5162) + + +(Start cutting path id: path5166) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X0.000000 Y-345.385300 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X0.000000 Y-294.403200 Z0.000000 F200.000000 +G01 X20.000000 Y-288.069900 Z0.000000 +G01 X20.000000 Y-339.052000 Z0.000000 +G01 X40.000000 Y-332.718700 Z0.000000 +G01 X40.000000 Y-281.736600 Z0.000000 +G01 X60.000000 Y-275.403300 Z0.000000 +G01 X60.000000 Y-326.385400 Z0.000000 +G01 X80.000000 Y-320.052100 Z0.000000 +G01 X80.000000 Y-269.070000 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path5166) + + +(Footer) +M5 +G00 X0.0000 Y0.0000 +M2 +(Using default footer. To add your own footer create file "footer" in the output dir.) +(end) +% \ No newline at end of file diff --git a/SD/gcode/op-art-1.ngc b/SD/gcode/op-art-1.ngc new file mode 100644 index 0000000..e9703fe --- /dev/null +++ b/SD/gcode/op-art-1.ngc @@ -0,0 +1,1521 @@ +% +(Header) +(Generated by gcodetools from Inkscape.) +(Using default header. To add your own header create file "header" in the output dir.) +M3 +(Header end.) +G21 (All units in mm) + +(Start cutting path id: path172) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X0.000000 Y5.000000 +G00 X0.000000 Y0.000000 +G00 X3400.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3000.000000 Y0.000000 Z0.000000 F200.000000 +G01 X3200.000000 Y-346.410160 Z0.000000 +G01 X3400.000000 Y0.000000 Z0.000000 +G01 X3352.000001 Y0.000000 Z0.000000 +G01 X3024.000000 Y-41.569218 Z0.000000 +G01 X3224.000000 Y-304.840940 Z0.000000 +G01 X3352.000001 Y0.000000 Z0.000000 +G01 X3312.640002 Y-4.988306 Z0.000000 +G01 X3048.000000 Y-73.161825 Z0.000000 +G01 X3239.360000 Y-268.260030 Z0.000000 +G01 X3312.640002 Y-4.988306 Z0.000000 +G01 X3280.883200 Y-13.169128 Z0.000000 +G01 X3070.963200 Y-96.573609 Z0.000000 +G01 X3248.153600 Y-236.667420 Z0.000000 +G01 X3280.883200 Y-13.169128 Z0.000000 +G01 X3255.692800 Y-23.177666 Z0.000000 +G01 X3092.226050 Y-113.384870 Z0.000000 +G01 X3252.081150 Y-209.847630 Z0.000000 +G01 X3255.692800 Y-23.177666 Z0.000000 +G01 X3236.076790 Y-34.002529 Z0.000000 +G01 X3111.408660 Y-124.960400 Z0.000000 +G01 X3252.514550 Y-187.447230 Z0.000000 +G01 X3236.076790 Y-34.002529 Z0.000000 +G01 X3221.116620 Y-44.917473 Z0.000000 +G01 X3128.341370 Y-132.458820 Z0.000000 +G01 X3250.542020 Y-169.033870 Z0.000000 +G01 X3221.116620 Y-44.917473 Z0.000000 +G01 X3209.983590 Y-55.422435 Z0.000000 +G01 X3143.005440 Y-136.847820 Z0.000000 +G01 X3247.010970 Y-154.139900 Z0.000000 +G01 X3209.983590 Y-55.422435 Z0.000000 +G01 X3201.946210 Y-65.193481 Z0.000000 +G01 X3155.486110 Y-138.922870 Z0.000000 +G01 X3242.567690 Y-142.293810 Z0.000000 +G01 X3201.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path172) + + +(Start cutting path id: path168) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3000.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3400.000000 Y0.000000 Z0.000000 F200.000000 +G01 X3200.000000 Y346.410160 Z0.000000 +G01 X3000.000000 Y0.000000 Z0.000000 +G01 X3047.999999 Y0.000000 Z0.000000 +G01 X3376.000000 Y41.569218 Z0.000000 +G01 X3176.000000 Y304.840940 Z0.000000 +G01 X3047.999999 Y0.000000 Z0.000000 +G01 X3087.359998 Y4.988306 Z0.000000 +G01 X3352.000000 Y73.161825 Z0.000000 +G01 X3160.640000 Y268.260030 Z0.000000 +G01 X3087.359998 Y4.988306 Z0.000000 +G01 X3119.116800 Y13.169128 Z0.000000 +G01 X3329.036800 Y96.573609 Z0.000000 +G01 X3151.846400 Y236.667420 Z0.000000 +G01 X3119.116800 Y13.169128 Z0.000000 +G01 X3144.307200 Y23.177666 Z0.000000 +G01 X3307.773950 Y113.384870 Z0.000000 +G01 X3147.918850 Y209.847630 Z0.000000 +G01 X3144.307200 Y23.177666 Z0.000000 +G01 X3163.923210 Y34.002529 Z0.000000 +G01 X3288.591340 Y124.960400 Z0.000000 +G01 X3147.485450 Y187.447230 Z0.000000 +G01 X3163.923210 Y34.002529 Z0.000000 +G01 X3178.883380 Y44.917473 Z0.000000 +G01 X3271.658630 Y132.458820 Z0.000000 +G01 X3149.457980 Y169.033870 Z0.000000 +G01 X3178.883380 Y44.917473 Z0.000000 +G01 X3190.016410 Y55.422435 Z0.000000 +G01 X3256.994560 Y136.847820 Z0.000000 +G01 X3152.989030 Y154.139900 Z0.000000 +G01 X3190.016410 Y55.422435 Z0.000000 +G01 X3198.053790 Y65.193481 Z0.000000 +G01 X3244.513890 Y138.922870 Z0.000000 +G01 X3157.432310 Y142.293810 Z0.000000 +G01 X3198.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path168) + + +(Start cutting path id: path156) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3000.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2600.000000 Y0.000000 Z0.000000 F200.000000 +G01 X2800.000000 Y-346.410160 Z0.000000 +G01 X3000.000000 Y0.000000 Z0.000000 +G01 X2952.000001 Y0.000000 Z0.000000 +G01 X2624.000000 Y-41.569218 Z0.000000 +G01 X2824.000000 Y-304.840940 Z0.000000 +G01 X2952.000001 Y0.000000 Z0.000000 +G01 X2912.640002 Y-4.988306 Z0.000000 +G01 X2648.000000 Y-73.161825 Z0.000000 +G01 X2839.360000 Y-268.260030 Z0.000000 +G01 X2912.640002 Y-4.988306 Z0.000000 +G01 X2880.883200 Y-13.169128 Z0.000000 +G01 X2670.963200 Y-96.573609 Z0.000000 +G01 X2848.153600 Y-236.667420 Z0.000000 +G01 X2880.883200 Y-13.169128 Z0.000000 +G01 X2855.692800 Y-23.177666 Z0.000000 +G01 X2692.226050 Y-113.384870 Z0.000000 +G01 X2852.081150 Y-209.847630 Z0.000000 +G01 X2855.692800 Y-23.177666 Z0.000000 +G01 X2836.076790 Y-34.002529 Z0.000000 +G01 X2711.408660 Y-124.960400 Z0.000000 +G01 X2852.514550 Y-187.447230 Z0.000000 +G01 X2836.076790 Y-34.002529 Z0.000000 +G01 X2821.116620 Y-44.917473 Z0.000000 +G01 X2728.341370 Y-132.458820 Z0.000000 +G01 X2850.542020 Y-169.033870 Z0.000000 +G01 X2821.116620 Y-44.917473 Z0.000000 +G01 X2809.983590 Y-55.422435 Z0.000000 +G01 X2743.005440 Y-136.847820 Z0.000000 +G01 X2847.010970 Y-154.139900 Z0.000000 +G01 X2809.983590 Y-55.422435 Z0.000000 +G01 X2801.946210 Y-65.193481 Z0.000000 +G01 X2755.486110 Y-138.922870 Z0.000000 +G01 X2842.567690 Y-142.293810 Z0.000000 +G01 X2801.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path156) + + +(Start cutting path id: path152) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2600.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3000.000000 Y0.000000 Z0.000000 F200.000000 +G01 X2800.000000 Y346.410160 Z0.000000 +G01 X2600.000000 Y0.000000 Z0.000000 +G01 X2647.999999 Y0.000000 Z0.000000 +G01 X2976.000000 Y41.569218 Z0.000000 +G01 X2776.000000 Y304.840940 Z0.000000 +G01 X2647.999999 Y0.000000 Z0.000000 +G01 X2687.359998 Y4.988306 Z0.000000 +G01 X2952.000000 Y73.161825 Z0.000000 +G01 X2760.640000 Y268.260030 Z0.000000 +G01 X2687.359998 Y4.988306 Z0.000000 +G01 X2719.116800 Y13.169128 Z0.000000 +G01 X2929.036800 Y96.573609 Z0.000000 +G01 X2751.846400 Y236.667420 Z0.000000 +G01 X2719.116800 Y13.169128 Z0.000000 +G01 X2744.307200 Y23.177666 Z0.000000 +G01 X2907.773950 Y113.384870 Z0.000000 +G01 X2747.918850 Y209.847630 Z0.000000 +G01 X2744.307200 Y23.177666 Z0.000000 +G01 X2763.923210 Y34.002529 Z0.000000 +G01 X2888.591340 Y124.960400 Z0.000000 +G01 X2747.485450 Y187.447230 Z0.000000 +G01 X2763.923210 Y34.002529 Z0.000000 +G01 X2778.883380 Y44.917473 Z0.000000 +G01 X2871.658630 Y132.458820 Z0.000000 +G01 X2749.457980 Y169.033870 Z0.000000 +G01 X2778.883380 Y44.917473 Z0.000000 +G01 X2790.016410 Y55.422435 Z0.000000 +G01 X2856.994560 Y136.847820 Z0.000000 +G01 X2752.989030 Y154.139900 Z0.000000 +G01 X2790.016410 Y55.422435 Z0.000000 +G01 X2798.053790 Y65.193481 Z0.000000 +G01 X2844.513890 Y138.922870 Z0.000000 +G01 X2757.432310 Y142.293810 Z0.000000 +G01 X2798.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path152) + + +(Start cutting path id: path140) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2600.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2200.000000 Y0.000000 Z0.000000 F200.000000 +G01 X2400.000000 Y-346.410160 Z0.000000 +G01 X2600.000000 Y0.000000 Z0.000000 +G01 X2552.000001 Y0.000000 Z0.000000 +G01 X2224.000000 Y-41.569218 Z0.000000 +G01 X2424.000000 Y-304.840940 Z0.000000 +G01 X2552.000001 Y0.000000 Z0.000000 +G01 X2512.640002 Y-4.988306 Z0.000000 +G01 X2248.000000 Y-73.161825 Z0.000000 +G01 X2439.360000 Y-268.260030 Z0.000000 +G01 X2512.640002 Y-4.988306 Z0.000000 +G01 X2480.883200 Y-13.169128 Z0.000000 +G01 X2270.963200 Y-96.573609 Z0.000000 +G01 X2448.153600 Y-236.667420 Z0.000000 +G01 X2480.883200 Y-13.169128 Z0.000000 +G01 X2455.692800 Y-23.177666 Z0.000000 +G01 X2292.226050 Y-113.384870 Z0.000000 +G01 X2452.081150 Y-209.847630 Z0.000000 +G01 X2455.692800 Y-23.177666 Z0.000000 +G01 X2436.076790 Y-34.002529 Z0.000000 +G01 X2311.408660 Y-124.960400 Z0.000000 +G01 X2452.514550 Y-187.447230 Z0.000000 +G01 X2436.076790 Y-34.002529 Z0.000000 +G01 X2421.116620 Y-44.917473 Z0.000000 +G01 X2328.341370 Y-132.458820 Z0.000000 +G01 X2450.542020 Y-169.033870 Z0.000000 +G01 X2421.116620 Y-44.917473 Z0.000000 +G01 X2409.983590 Y-55.422435 Z0.000000 +G01 X2343.005440 Y-136.847820 Z0.000000 +G01 X2447.010970 Y-154.139900 Z0.000000 +G01 X2409.983590 Y-55.422435 Z0.000000 +G01 X2401.946210 Y-65.193481 Z0.000000 +G01 X2355.486110 Y-138.922870 Z0.000000 +G01 X2442.567690 Y-142.293810 Z0.000000 +G01 X2401.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path140) + + +(Start cutting path id: path136) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2200.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2600.000000 Y0.000000 Z0.000000 F200.000000 +G01 X2400.000000 Y346.410160 Z0.000000 +G01 X2200.000000 Y0.000000 Z0.000000 +G01 X2247.999999 Y0.000000 Z0.000000 +G01 X2576.000000 Y41.569218 Z0.000000 +G01 X2376.000000 Y304.840940 Z0.000000 +G01 X2247.999999 Y0.000000 Z0.000000 +G01 X2287.359998 Y4.988306 Z0.000000 +G01 X2552.000000 Y73.161825 Z0.000000 +G01 X2360.640000 Y268.260030 Z0.000000 +G01 X2287.359998 Y4.988306 Z0.000000 +G01 X2319.116800 Y13.169128 Z0.000000 +G01 X2529.036800 Y96.573609 Z0.000000 +G01 X2351.846400 Y236.667420 Z0.000000 +G01 X2319.116800 Y13.169128 Z0.000000 +G01 X2344.307200 Y23.177666 Z0.000000 +G01 X2507.773950 Y113.384870 Z0.000000 +G01 X2347.918850 Y209.847630 Z0.000000 +G01 X2344.307200 Y23.177666 Z0.000000 +G01 X2363.923210 Y34.002529 Z0.000000 +G01 X2488.591340 Y124.960400 Z0.000000 +G01 X2347.485450 Y187.447230 Z0.000000 +G01 X2363.923210 Y34.002529 Z0.000000 +G01 X2378.883380 Y44.917473 Z0.000000 +G01 X2471.658630 Y132.458820 Z0.000000 +G01 X2349.457980 Y169.033870 Z0.000000 +G01 X2378.883380 Y44.917473 Z0.000000 +G01 X2390.016410 Y55.422435 Z0.000000 +G01 X2456.994560 Y136.847820 Z0.000000 +G01 X2352.989030 Y154.139900 Z0.000000 +G01 X2390.016410 Y55.422435 Z0.000000 +G01 X2398.053790 Y65.193481 Z0.000000 +G01 X2444.513890 Y138.922870 Z0.000000 +G01 X2357.432310 Y142.293810 Z0.000000 +G01 X2398.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path136) + + +(Start cutting path id: path124) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2200.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1800.000000 Y0.000000 Z0.000000 F200.000000 +G01 X2000.000000 Y-346.410160 Z0.000000 +G01 X2200.000000 Y0.000000 Z0.000000 +G01 X2152.000001 Y0.000000 Z0.000000 +G01 X1824.000000 Y-41.569218 Z0.000000 +G01 X2024.000000 Y-304.840940 Z0.000000 +G01 X2152.000001 Y0.000000 Z0.000000 +G01 X2112.640002 Y-4.988306 Z0.000000 +G01 X1848.000000 Y-73.161825 Z0.000000 +G01 X2039.360000 Y-268.260030 Z0.000000 +G01 X2112.640002 Y-4.988306 Z0.000000 +G01 X2080.883200 Y-13.169128 Z0.000000 +G01 X1870.963200 Y-96.573609 Z0.000000 +G01 X2048.153600 Y-236.667420 Z0.000000 +G01 X2080.883200 Y-13.169128 Z0.000000 +G01 X2055.692800 Y-23.177666 Z0.000000 +G01 X1892.226050 Y-113.384870 Z0.000000 +G01 X2052.081150 Y-209.847630 Z0.000000 +G01 X2055.692800 Y-23.177666 Z0.000000 +G01 X2036.076790 Y-34.002529 Z0.000000 +G01 X1911.408660 Y-124.960400 Z0.000000 +G01 X2052.514550 Y-187.447230 Z0.000000 +G01 X2036.076790 Y-34.002529 Z0.000000 +G01 X2021.116620 Y-44.917473 Z0.000000 +G01 X1928.341370 Y-132.458820 Z0.000000 +G01 X2050.542020 Y-169.033870 Z0.000000 +G01 X2021.116620 Y-44.917473 Z0.000000 +G01 X2009.983590 Y-55.422435 Z0.000000 +G01 X1943.005440 Y-136.847820 Z0.000000 +G01 X2047.010970 Y-154.139900 Z0.000000 +G01 X2009.983590 Y-55.422435 Z0.000000 +G01 X2001.946210 Y-65.193481 Z0.000000 +G01 X1955.486110 Y-138.922870 Z0.000000 +G01 X2042.567690 Y-142.293810 Z0.000000 +G01 X2001.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path124) + + +(Start cutting path id: path120) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1800.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2200.000000 Y0.000000 Z0.000000 F200.000000 +G01 X2000.000000 Y346.410160 Z0.000000 +G01 X1800.000000 Y0.000000 Z0.000000 +G01 X1847.999999 Y0.000000 Z0.000000 +G01 X2176.000000 Y41.569218 Z0.000000 +G01 X1976.000000 Y304.840940 Z0.000000 +G01 X1847.999999 Y0.000000 Z0.000000 +G01 X1887.359998 Y4.988306 Z0.000000 +G01 X2152.000000 Y73.161825 Z0.000000 +G01 X1960.640000 Y268.260030 Z0.000000 +G01 X1887.359998 Y4.988306 Z0.000000 +G01 X1919.116800 Y13.169128 Z0.000000 +G01 X2129.036800 Y96.573609 Z0.000000 +G01 X1951.846400 Y236.667420 Z0.000000 +G01 X1919.116800 Y13.169128 Z0.000000 +G01 X1944.307200 Y23.177666 Z0.000000 +G01 X2107.773950 Y113.384870 Z0.000000 +G01 X1947.918850 Y209.847630 Z0.000000 +G01 X1944.307200 Y23.177666 Z0.000000 +G01 X1963.923210 Y34.002529 Z0.000000 +G01 X2088.591340 Y124.960400 Z0.000000 +G01 X1947.485450 Y187.447230 Z0.000000 +G01 X1963.923210 Y34.002529 Z0.000000 +G01 X1978.883380 Y44.917473 Z0.000000 +G01 X2071.658630 Y132.458820 Z0.000000 +G01 X1949.457980 Y169.033870 Z0.000000 +G01 X1978.883380 Y44.917473 Z0.000000 +G01 X1990.016410 Y55.422435 Z0.000000 +G01 X2056.994560 Y136.847820 Z0.000000 +G01 X1952.989030 Y154.139900 Z0.000000 +G01 X1990.016410 Y55.422435 Z0.000000 +G01 X1998.053790 Y65.193481 Z0.000000 +G01 X2044.513890 Y138.922870 Z0.000000 +G01 X1957.432310 Y142.293810 Z0.000000 +G01 X1998.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path120) + + +(Start cutting path id: path108) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1800.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1400.000000 Y0.000000 Z0.000000 F200.000000 +G01 X1600.000000 Y-346.410160 Z0.000000 +G01 X1800.000000 Y0.000000 Z0.000000 +G01 X1752.000001 Y0.000000 Z0.000000 +G01 X1424.000000 Y-41.569218 Z0.000000 +G01 X1624.000000 Y-304.840940 Z0.000000 +G01 X1752.000001 Y0.000000 Z0.000000 +G01 X1712.640002 Y-4.988306 Z0.000000 +G01 X1448.000000 Y-73.161825 Z0.000000 +G01 X1639.360000 Y-268.260030 Z0.000000 +G01 X1712.640002 Y-4.988306 Z0.000000 +G01 X1680.883200 Y-13.169128 Z0.000000 +G01 X1470.963200 Y-96.573609 Z0.000000 +G01 X1648.153600 Y-236.667420 Z0.000000 +G01 X1680.883200 Y-13.169128 Z0.000000 +G01 X1655.692800 Y-23.177666 Z0.000000 +G01 X1492.226050 Y-113.384870 Z0.000000 +G01 X1652.081150 Y-209.847630 Z0.000000 +G01 X1655.692800 Y-23.177666 Z0.000000 +G01 X1636.076790 Y-34.002529 Z0.000000 +G01 X1511.408660 Y-124.960400 Z0.000000 +G01 X1652.514550 Y-187.447230 Z0.000000 +G01 X1636.076790 Y-34.002529 Z0.000000 +G01 X1621.116620 Y-44.917473 Z0.000000 +G01 X1528.341370 Y-132.458820 Z0.000000 +G01 X1650.542020 Y-169.033870 Z0.000000 +G01 X1621.116620 Y-44.917473 Z0.000000 +G01 X1609.983590 Y-55.422435 Z0.000000 +G01 X1543.005440 Y-136.847820 Z0.000000 +G01 X1647.010970 Y-154.139900 Z0.000000 +G01 X1609.983590 Y-55.422435 Z0.000000 +G01 X1601.946210 Y-65.193481 Z0.000000 +G01 X1555.486110 Y-138.922870 Z0.000000 +G01 X1642.567690 Y-142.293810 Z0.000000 +G01 X1601.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path108) + + +(Start cutting path id: path104) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1400.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1800.000000 Y0.000000 Z0.000000 F200.000000 +G01 X1600.000000 Y346.410160 Z0.000000 +G01 X1400.000000 Y0.000000 Z0.000000 +G01 X1447.999999 Y0.000000 Z0.000000 +G01 X1776.000000 Y41.569218 Z0.000000 +G01 X1576.000000 Y304.840940 Z0.000000 +G01 X1447.999999 Y0.000000 Z0.000000 +G01 X1487.359998 Y4.988306 Z0.000000 +G01 X1752.000000 Y73.161825 Z0.000000 +G01 X1560.640000 Y268.260030 Z0.000000 +G01 X1487.359998 Y4.988306 Z0.000000 +G01 X1519.116800 Y13.169128 Z0.000000 +G01 X1729.036800 Y96.573609 Z0.000000 +G01 X1551.846400 Y236.667420 Z0.000000 +G01 X1519.116800 Y13.169128 Z0.000000 +G01 X1544.307200 Y23.177666 Z0.000000 +G01 X1707.773950 Y113.384870 Z0.000000 +G01 X1547.918850 Y209.847630 Z0.000000 +G01 X1544.307200 Y23.177666 Z0.000000 +G01 X1563.923210 Y34.002529 Z0.000000 +G01 X1688.591340 Y124.960400 Z0.000000 +G01 X1547.485450 Y187.447230 Z0.000000 +G01 X1563.923210 Y34.002529 Z0.000000 +G01 X1578.883380 Y44.917473 Z0.000000 +G01 X1671.658630 Y132.458820 Z0.000000 +G01 X1549.457980 Y169.033870 Z0.000000 +G01 X1578.883380 Y44.917473 Z0.000000 +G01 X1590.016410 Y55.422435 Z0.000000 +G01 X1656.994560 Y136.847820 Z0.000000 +G01 X1552.989030 Y154.139900 Z0.000000 +G01 X1590.016410 Y55.422435 Z0.000000 +G01 X1598.053790 Y65.193481 Z0.000000 +G01 X1644.513890 Y138.922870 Z0.000000 +G01 X1557.432310 Y142.293810 Z0.000000 +G01 X1598.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path104) + + +(Start cutting path id: path92) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1400.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1000.000000 Y0.000000 Z0.000000 F200.000000 +G01 X1200.000000 Y-346.410160 Z0.000000 +G01 X1400.000000 Y0.000000 Z0.000000 +G01 X1352.000001 Y0.000000 Z0.000000 +G01 X1024.000000 Y-41.569218 Z0.000000 +G01 X1224.000000 Y-304.840940 Z0.000000 +G01 X1352.000001 Y0.000000 Z0.000000 +G01 X1312.640002 Y-4.988306 Z0.000000 +G01 X1048.000000 Y-73.161825 Z0.000000 +G01 X1239.360000 Y-268.260030 Z0.000000 +G01 X1312.640002 Y-4.988306 Z0.000000 +G01 X1280.883200 Y-13.169128 Z0.000000 +G01 X1070.963200 Y-96.573609 Z0.000000 +G01 X1248.153600 Y-236.667420 Z0.000000 +G01 X1280.883200 Y-13.169128 Z0.000000 +G01 X1255.692800 Y-23.177666 Z0.000000 +G01 X1092.226050 Y-113.384870 Z0.000000 +G01 X1252.081150 Y-209.847630 Z0.000000 +G01 X1255.692800 Y-23.177666 Z0.000000 +G01 X1236.076790 Y-34.002529 Z0.000000 +G01 X1111.408660 Y-124.960400 Z0.000000 +G01 X1252.514550 Y-187.447230 Z0.000000 +G01 X1236.076790 Y-34.002529 Z0.000000 +G01 X1221.116620 Y-44.917473 Z0.000000 +G01 X1128.341370 Y-132.458820 Z0.000000 +G01 X1250.542020 Y-169.033870 Z0.000000 +G01 X1221.116620 Y-44.917473 Z0.000000 +G01 X1209.983590 Y-55.422435 Z0.000000 +G01 X1143.005440 Y-136.847820 Z0.000000 +G01 X1247.010970 Y-154.139900 Z0.000000 +G01 X1209.983590 Y-55.422435 Z0.000000 +G01 X1201.946210 Y-65.193481 Z0.000000 +G01 X1155.486110 Y-138.922870 Z0.000000 +G01 X1242.567690 Y-142.293810 Z0.000000 +G01 X1201.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path92) + + +(Start cutting path id: path88) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1000.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1400.000000 Y0.000000 Z0.000000 F200.000000 +G01 X1200.000000 Y346.410160 Z0.000000 +G01 X1000.000000 Y0.000000 Z0.000000 +G01 X1047.999999 Y0.000000 Z0.000000 +G01 X1376.000000 Y41.569218 Z0.000000 +G01 X1176.000000 Y304.840940 Z0.000000 +G01 X1047.999999 Y0.000000 Z0.000000 +G01 X1087.359998 Y4.988306 Z0.000000 +G01 X1352.000000 Y73.161825 Z0.000000 +G01 X1160.640000 Y268.260030 Z0.000000 +G01 X1087.359998 Y4.988306 Z0.000000 +G01 X1119.116800 Y13.169128 Z0.000000 +G01 X1329.036800 Y96.573609 Z0.000000 +G01 X1151.846400 Y236.667420 Z0.000000 +G01 X1119.116800 Y13.169128 Z0.000000 +G01 X1144.307200 Y23.177666 Z0.000000 +G01 X1307.773950 Y113.384870 Z0.000000 +G01 X1147.918850 Y209.847630 Z0.000000 +G01 X1144.307200 Y23.177666 Z0.000000 +G01 X1163.923210 Y34.002529 Z0.000000 +G01 X1288.591340 Y124.960400 Z0.000000 +G01 X1147.485450 Y187.447230 Z0.000000 +G01 X1163.923210 Y34.002529 Z0.000000 +G01 X1178.883380 Y44.917473 Z0.000000 +G01 X1271.658630 Y132.458820 Z0.000000 +G01 X1149.457980 Y169.033870 Z0.000000 +G01 X1178.883380 Y44.917473 Z0.000000 +G01 X1190.016410 Y55.422435 Z0.000000 +G01 X1256.994560 Y136.847820 Z0.000000 +G01 X1152.989030 Y154.139900 Z0.000000 +G01 X1190.016410 Y55.422435 Z0.000000 +G01 X1198.053790 Y65.193481 Z0.000000 +G01 X1244.513890 Y138.922870 Z0.000000 +G01 X1157.432310 Y142.293810 Z0.000000 +G01 X1198.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path88) + + +(Start cutting path id: path76) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1000.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X600.000000 Y0.000000 Z0.000000 F200.000000 +G01 X800.000000 Y-346.410160 Z0.000000 +G01 X1000.000000 Y0.000000 Z0.000000 +G01 X952.000001 Y0.000000 Z0.000000 +G01 X624.000000 Y-41.569218 Z0.000000 +G01 X824.000000 Y-304.840940 Z0.000000 +G01 X952.000001 Y0.000000 Z0.000000 +G01 X912.640002 Y-4.988306 Z0.000000 +G01 X648.000000 Y-73.161825 Z0.000000 +G01 X839.360000 Y-268.260030 Z0.000000 +G01 X912.640002 Y-4.988306 Z0.000000 +G01 X880.883200 Y-13.169128 Z0.000000 +G01 X670.963200 Y-96.573609 Z0.000000 +G01 X848.153600 Y-236.667420 Z0.000000 +G01 X880.883200 Y-13.169128 Z0.000000 +G01 X855.692800 Y-23.177666 Z0.000000 +G01 X692.226050 Y-113.384870 Z0.000000 +G01 X852.081150 Y-209.847630 Z0.000000 +G01 X855.692800 Y-23.177666 Z0.000000 +G01 X836.076790 Y-34.002529 Z0.000000 +G01 X711.408660 Y-124.960400 Z0.000000 +G01 X852.514550 Y-187.447230 Z0.000000 +G01 X836.076790 Y-34.002529 Z0.000000 +G01 X821.116620 Y-44.917473 Z0.000000 +G01 X728.341370 Y-132.458820 Z0.000000 +G01 X850.542020 Y-169.033870 Z0.000000 +G01 X821.116620 Y-44.917473 Z0.000000 +G01 X809.983590 Y-55.422435 Z0.000000 +G01 X743.005440 Y-136.847820 Z0.000000 +G01 X847.010970 Y-154.139900 Z0.000000 +G01 X809.983590 Y-55.422435 Z0.000000 +G01 X801.946210 Y-65.193481 Z0.000000 +G01 X755.486110 Y-138.922870 Z0.000000 +G01 X842.567690 Y-142.293810 Z0.000000 +G01 X801.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path76) + + +(Start cutting path id: path72) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X600.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1000.000000 Y0.000000 Z0.000000 F200.000000 +G01 X800.000000 Y346.410160 Z0.000000 +G01 X600.000000 Y0.000000 Z0.000000 +G01 X647.999999 Y0.000000 Z0.000000 +G01 X976.000000 Y41.569218 Z0.000000 +G01 X776.000000 Y304.840940 Z0.000000 +G01 X647.999999 Y0.000000 Z0.000000 +G01 X687.359998 Y4.988306 Z0.000000 +G01 X952.000000 Y73.161825 Z0.000000 +G01 X760.640000 Y268.260030 Z0.000000 +G01 X687.359998 Y4.988306 Z0.000000 +G01 X719.116800 Y13.169128 Z0.000000 +G01 X929.036800 Y96.573609 Z0.000000 +G01 X751.846400 Y236.667420 Z0.000000 +G01 X719.116800 Y13.169128 Z0.000000 +G01 X744.307200 Y23.177666 Z0.000000 +G01 X907.773950 Y113.384870 Z0.000000 +G01 X747.918850 Y209.847630 Z0.000000 +G01 X744.307200 Y23.177666 Z0.000000 +G01 X763.923210 Y34.002529 Z0.000000 +G01 X888.591340 Y124.960400 Z0.000000 +G01 X747.485450 Y187.447230 Z0.000000 +G01 X763.923210 Y34.002529 Z0.000000 +G01 X778.883380 Y44.917473 Z0.000000 +G01 X871.658630 Y132.458820 Z0.000000 +G01 X749.457980 Y169.033870 Z0.000000 +G01 X778.883380 Y44.917473 Z0.000000 +G01 X790.016410 Y55.422435 Z0.000000 +G01 X856.994560 Y136.847820 Z0.000000 +G01 X752.989030 Y154.139900 Z0.000000 +G01 X790.016410 Y55.422435 Z0.000000 +G01 X798.053790 Y65.193481 Z0.000000 +G01 X844.513890 Y138.922870 Z0.000000 +G01 X757.432310 Y142.293810 Z0.000000 +G01 X798.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path72) + + +(Start cutting path id: path60) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X600.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X200.000000 Y0.000000 Z0.000000 F200.000000 +G01 X400.000000 Y-346.410160 Z0.000000 +G01 X600.000000 Y0.000000 Z0.000000 +G01 X552.000001 Y0.000000 Z0.000000 +G01 X224.000000 Y-41.569218 Z0.000000 +G01 X424.000000 Y-304.840940 Z0.000000 +G01 X552.000001 Y0.000000 Z0.000000 +G01 X512.640002 Y-4.988306 Z0.000000 +G01 X248.000000 Y-73.161825 Z0.000000 +G01 X439.360000 Y-268.260030 Z0.000000 +G01 X512.640002 Y-4.988306 Z0.000000 +G01 X480.883200 Y-13.169128 Z0.000000 +G01 X270.963200 Y-96.573609 Z0.000000 +G01 X448.153600 Y-236.667420 Z0.000000 +G01 X480.883200 Y-13.169128 Z0.000000 +G01 X455.692800 Y-23.177666 Z0.000000 +G01 X292.226050 Y-113.384870 Z0.000000 +G01 X452.081150 Y-209.847630 Z0.000000 +G01 X455.692800 Y-23.177666 Z0.000000 +G01 X436.076790 Y-34.002529 Z0.000000 +G01 X311.408660 Y-124.960400 Z0.000000 +G01 X452.514550 Y-187.447230 Z0.000000 +G01 X436.076790 Y-34.002529 Z0.000000 +G01 X421.116620 Y-44.917473 Z0.000000 +G01 X328.341370 Y-132.458820 Z0.000000 +G01 X450.542020 Y-169.033870 Z0.000000 +G01 X421.116620 Y-44.917473 Z0.000000 +G01 X409.983590 Y-55.422435 Z0.000000 +G01 X343.005440 Y-136.847820 Z0.000000 +G01 X447.010970 Y-154.139900 Z0.000000 +G01 X409.983590 Y-55.422435 Z0.000000 +G01 X401.946210 Y-65.193481 Z0.000000 +G01 X355.486110 Y-138.922870 Z0.000000 +G01 X442.567690 Y-142.293810 Z0.000000 +G01 X401.946210 Y-65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path60) + + +(Start cutting path id: path56) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X200.000000 Y0.000000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X600.000000 Y0.000000 Z0.000000 F200.000000 +G01 X400.000000 Y346.410160 Z0.000000 +G01 X200.000000 Y0.000000 Z0.000000 +G01 X247.999999 Y0.000000 Z0.000000 +G01 X576.000000 Y41.569218 Z0.000000 +G01 X376.000000 Y304.840940 Z0.000000 +G01 X247.999999 Y0.000000 Z0.000000 +G01 X287.359998 Y4.988306 Z0.000000 +G01 X552.000000 Y73.161825 Z0.000000 +G01 X360.640000 Y268.260030 Z0.000000 +G01 X287.359998 Y4.988306 Z0.000000 +G01 X319.116800 Y13.169128 Z0.000000 +G01 X529.036800 Y96.573609 Z0.000000 +G01 X351.846400 Y236.667420 Z0.000000 +G01 X319.116800 Y13.169128 Z0.000000 +G01 X344.307200 Y23.177666 Z0.000000 +G01 X507.773950 Y113.384870 Z0.000000 +G01 X347.918850 Y209.847630 Z0.000000 +G01 X344.307200 Y23.177666 Z0.000000 +G01 X363.923210 Y34.002529 Z0.000000 +G01 X488.591340 Y124.960400 Z0.000000 +G01 X347.485450 Y187.447230 Z0.000000 +G01 X363.923210 Y34.002529 Z0.000000 +G01 X378.883380 Y44.917473 Z0.000000 +G01 X471.658630 Y132.458820 Z0.000000 +G01 X349.457980 Y169.033870 Z0.000000 +G01 X378.883380 Y44.917473 Z0.000000 +G01 X390.016410 Y55.422435 Z0.000000 +G01 X456.994560 Y136.847820 Z0.000000 +G01 X352.989030 Y154.139900 Z0.000000 +G01 X390.016410 Y55.422435 Z0.000000 +G01 X398.053790 Y65.193481 Z0.000000 +G01 X444.513890 Y138.922870 Z0.000000 +G01 X357.432310 Y142.293810 Z0.000000 +G01 X398.053790 Y65.193481 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path56) + + +(Start cutting path id: path64) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X400.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X800.000000 Y346.410200 Z0.000000 F200.000000 +G01 X600.000000 Y0.000040 Z0.000000 +G01 X400.000000 Y346.410200 Z0.000000 +G01 X447.999999 Y346.410200 Z0.000000 +G01 X776.000000 Y304.840982 Z0.000000 +G01 X576.000000 Y41.569260 Z0.000000 +G01 X447.999999 Y346.410200 Z0.000000 +G01 X487.359998 Y341.421894 Z0.000000 +G01 X752.000000 Y273.248375 Z0.000000 +G01 X560.640000 Y78.150170 Z0.000000 +G01 X487.359998 Y341.421894 Z0.000000 +G01 X519.116800 Y333.241072 Z0.000000 +G01 X729.036800 Y249.836591 Z0.000000 +G01 X551.846400 Y109.742780 Z0.000000 +G01 X519.116800 Y333.241072 Z0.000000 +G01 X544.307200 Y323.232534 Z0.000000 +G01 X707.773950 Y233.025330 Z0.000000 +G01 X547.918850 Y136.562570 Z0.000000 +G01 X544.307200 Y323.232534 Z0.000000 +G01 X563.923210 Y312.407671 Z0.000000 +G01 X688.591340 Y221.449800 Z0.000000 +G01 X547.485450 Y158.962970 Z0.000000 +G01 X563.923210 Y312.407671 Z0.000000 +G01 X578.883380 Y301.492727 Z0.000000 +G01 X671.658630 Y213.951380 Z0.000000 +G01 X549.457980 Y177.376330 Z0.000000 +G01 X578.883380 Y301.492727 Z0.000000 +G01 X590.016410 Y290.987765 Z0.000000 +G01 X656.994560 Y209.562380 Z0.000000 +G01 X552.989030 Y192.270300 Z0.000000 +G01 X590.016410 Y290.987765 Z0.000000 +G01 X598.053790 Y281.216719 Z0.000000 +G01 X644.513890 Y207.487330 Z0.000000 +G01 X557.432310 Y204.116390 Z0.000000 +G01 X598.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path64) + + +(Start cutting path id: path80) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y346.410200 Z0.000000 F200.000000 +G01 X1000.000000 Y0.000040 Z0.000000 +G01 X800.000000 Y346.410200 Z0.000000 +G01 X847.999999 Y346.410200 Z0.000000 +G01 X1176.000000 Y304.840982 Z0.000000 +G01 X976.000000 Y41.569260 Z0.000000 +G01 X847.999999 Y346.410200 Z0.000000 +G01 X887.359998 Y341.421894 Z0.000000 +G01 X1152.000000 Y273.248375 Z0.000000 +G01 X960.640000 Y78.150170 Z0.000000 +G01 X887.359998 Y341.421894 Z0.000000 +G01 X919.116800 Y333.241072 Z0.000000 +G01 X1129.036800 Y249.836591 Z0.000000 +G01 X951.846400 Y109.742780 Z0.000000 +G01 X919.116800 Y333.241072 Z0.000000 +G01 X944.307200 Y323.232534 Z0.000000 +G01 X1107.773950 Y233.025330 Z0.000000 +G01 X947.918850 Y136.562570 Z0.000000 +G01 X944.307200 Y323.232534 Z0.000000 +G01 X963.923210 Y312.407671 Z0.000000 +G01 X1088.591340 Y221.449800 Z0.000000 +G01 X947.485450 Y158.962970 Z0.000000 +G01 X963.923210 Y312.407671 Z0.000000 +G01 X978.883380 Y301.492727 Z0.000000 +G01 X1071.658630 Y213.951380 Z0.000000 +G01 X949.457980 Y177.376330 Z0.000000 +G01 X978.883380 Y301.492727 Z0.000000 +G01 X990.016410 Y290.987765 Z0.000000 +G01 X1056.994560 Y209.562380 Z0.000000 +G01 X952.989030 Y192.270300 Z0.000000 +G01 X990.016410 Y290.987765 Z0.000000 +G01 X998.053790 Y281.216719 Z0.000000 +G01 X1044.513890 Y207.487330 Z0.000000 +G01 X957.432310 Y204.116390 Z0.000000 +G01 X998.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path80) + + +(Start cutting path id: path96) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1200.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1600.000000 Y346.410200 Z0.000000 F200.000000 +G01 X1400.000000 Y0.000040 Z0.000000 +G01 X1200.000000 Y346.410200 Z0.000000 +G01 X1247.999999 Y346.410200 Z0.000000 +G01 X1576.000000 Y304.840982 Z0.000000 +G01 X1376.000000 Y41.569260 Z0.000000 +G01 X1247.999999 Y346.410200 Z0.000000 +G01 X1287.359998 Y341.421894 Z0.000000 +G01 X1552.000000 Y273.248375 Z0.000000 +G01 X1360.640000 Y78.150170 Z0.000000 +G01 X1287.359998 Y341.421894 Z0.000000 +G01 X1319.116800 Y333.241072 Z0.000000 +G01 X1529.036800 Y249.836591 Z0.000000 +G01 X1351.846400 Y109.742780 Z0.000000 +G01 X1319.116800 Y333.241072 Z0.000000 +G01 X1344.307200 Y323.232534 Z0.000000 +G01 X1507.773950 Y233.025330 Z0.000000 +G01 X1347.918850 Y136.562570 Z0.000000 +G01 X1344.307200 Y323.232534 Z0.000000 +G01 X1363.923210 Y312.407671 Z0.000000 +G01 X1488.591340 Y221.449800 Z0.000000 +G01 X1347.485450 Y158.962970 Z0.000000 +G01 X1363.923210 Y312.407671 Z0.000000 +G01 X1378.883380 Y301.492727 Z0.000000 +G01 X1471.658630 Y213.951380 Z0.000000 +G01 X1349.457980 Y177.376330 Z0.000000 +G01 X1378.883380 Y301.492727 Z0.000000 +G01 X1390.016410 Y290.987765 Z0.000000 +G01 X1456.994560 Y209.562380 Z0.000000 +G01 X1352.989030 Y192.270300 Z0.000000 +G01 X1390.016410 Y290.987765 Z0.000000 +G01 X1398.053790 Y281.216719 Z0.000000 +G01 X1444.513890 Y207.487330 Z0.000000 +G01 X1357.432310 Y204.116390 Z0.000000 +G01 X1398.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path96) + + +(Start cutting path id: path112) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y346.410200 Z0.000000 F200.000000 +G01 X1800.000000 Y0.000040 Z0.000000 +G01 X1600.000000 Y346.410200 Z0.000000 +G01 X1647.999999 Y346.410200 Z0.000000 +G01 X1976.000000 Y304.840982 Z0.000000 +G01 X1776.000000 Y41.569260 Z0.000000 +G01 X1647.999999 Y346.410200 Z0.000000 +G01 X1687.359998 Y341.421894 Z0.000000 +G01 X1952.000000 Y273.248375 Z0.000000 +G01 X1760.640000 Y78.150170 Z0.000000 +G01 X1687.359998 Y341.421894 Z0.000000 +G01 X1719.116800 Y333.241072 Z0.000000 +G01 X1929.036800 Y249.836591 Z0.000000 +G01 X1751.846400 Y109.742780 Z0.000000 +G01 X1719.116800 Y333.241072 Z0.000000 +G01 X1744.307200 Y323.232534 Z0.000000 +G01 X1907.773950 Y233.025330 Z0.000000 +G01 X1747.918850 Y136.562570 Z0.000000 +G01 X1744.307200 Y323.232534 Z0.000000 +G01 X1763.923210 Y312.407671 Z0.000000 +G01 X1888.591340 Y221.449800 Z0.000000 +G01 X1747.485450 Y158.962970 Z0.000000 +G01 X1763.923210 Y312.407671 Z0.000000 +G01 X1778.883380 Y301.492727 Z0.000000 +G01 X1871.658630 Y213.951380 Z0.000000 +G01 X1749.457980 Y177.376330 Z0.000000 +G01 X1778.883380 Y301.492727 Z0.000000 +G01 X1790.016410 Y290.987765 Z0.000000 +G01 X1856.994560 Y209.562380 Z0.000000 +G01 X1752.989030 Y192.270300 Z0.000000 +G01 X1790.016410 Y290.987765 Z0.000000 +G01 X1798.053790 Y281.216719 Z0.000000 +G01 X1844.513890 Y207.487330 Z0.000000 +G01 X1757.432310 Y204.116390 Z0.000000 +G01 X1798.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path112) + + +(Start cutting path id: path128) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2000.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2400.000000 Y346.410200 Z0.000000 F200.000000 +G01 X2200.000000 Y0.000040 Z0.000000 +G01 X2000.000000 Y346.410200 Z0.000000 +G01 X2047.999999 Y346.410200 Z0.000000 +G01 X2376.000000 Y304.840982 Z0.000000 +G01 X2176.000000 Y41.569260 Z0.000000 +G01 X2047.999999 Y346.410200 Z0.000000 +G01 X2087.359998 Y341.421894 Z0.000000 +G01 X2352.000000 Y273.248375 Z0.000000 +G01 X2160.640000 Y78.150170 Z0.000000 +G01 X2087.359998 Y341.421894 Z0.000000 +G01 X2119.116800 Y333.241072 Z0.000000 +G01 X2329.036800 Y249.836591 Z0.000000 +G01 X2151.846400 Y109.742780 Z0.000000 +G01 X2119.116800 Y333.241072 Z0.000000 +G01 X2144.307200 Y323.232534 Z0.000000 +G01 X2307.773950 Y233.025330 Z0.000000 +G01 X2147.918850 Y136.562570 Z0.000000 +G01 X2144.307200 Y323.232534 Z0.000000 +G01 X2163.923210 Y312.407671 Z0.000000 +G01 X2288.591340 Y221.449800 Z0.000000 +G01 X2147.485450 Y158.962970 Z0.000000 +G01 X2163.923210 Y312.407671 Z0.000000 +G01 X2178.883380 Y301.492727 Z0.000000 +G01 X2271.658630 Y213.951380 Z0.000000 +G01 X2149.457980 Y177.376330 Z0.000000 +G01 X2178.883380 Y301.492727 Z0.000000 +G01 X2190.016410 Y290.987765 Z0.000000 +G01 X2256.994560 Y209.562380 Z0.000000 +G01 X2152.989030 Y192.270300 Z0.000000 +G01 X2190.016410 Y290.987765 Z0.000000 +G01 X2198.053790 Y281.216719 Z0.000000 +G01 X2244.513890 Y207.487330 Z0.000000 +G01 X2157.432310 Y204.116390 Z0.000000 +G01 X2198.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path128) + + +(Start cutting path id: path144) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y346.410200 Z0.000000 F200.000000 +G01 X2600.000000 Y0.000040 Z0.000000 +G01 X2400.000000 Y346.410200 Z0.000000 +G01 X2447.999999 Y346.410200 Z0.000000 +G01 X2776.000000 Y304.840982 Z0.000000 +G01 X2576.000000 Y41.569260 Z0.000000 +G01 X2447.999999 Y346.410200 Z0.000000 +G01 X2487.359998 Y341.421894 Z0.000000 +G01 X2752.000000 Y273.248375 Z0.000000 +G01 X2560.640000 Y78.150170 Z0.000000 +G01 X2487.359998 Y341.421894 Z0.000000 +G01 X2519.116800 Y333.241072 Z0.000000 +G01 X2729.036800 Y249.836591 Z0.000000 +G01 X2551.846400 Y109.742780 Z0.000000 +G01 X2519.116800 Y333.241072 Z0.000000 +G01 X2544.307200 Y323.232534 Z0.000000 +G01 X2707.773950 Y233.025330 Z0.000000 +G01 X2547.918850 Y136.562570 Z0.000000 +G01 X2544.307200 Y323.232534 Z0.000000 +G01 X2563.923210 Y312.407671 Z0.000000 +G01 X2688.591340 Y221.449800 Z0.000000 +G01 X2547.485450 Y158.962970 Z0.000000 +G01 X2563.923210 Y312.407671 Z0.000000 +G01 X2578.883380 Y301.492727 Z0.000000 +G01 X2671.658630 Y213.951380 Z0.000000 +G01 X2549.457980 Y177.376330 Z0.000000 +G01 X2578.883380 Y301.492727 Z0.000000 +G01 X2590.016410 Y290.987765 Z0.000000 +G01 X2656.994560 Y209.562380 Z0.000000 +G01 X2552.989030 Y192.270300 Z0.000000 +G01 X2590.016410 Y290.987765 Z0.000000 +G01 X2598.053790 Y281.216719 Z0.000000 +G01 X2644.513890 Y207.487330 Z0.000000 +G01 X2557.432310 Y204.116390 Z0.000000 +G01 X2598.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path144) + + +(Start cutting path id: path160) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2800.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3200.000000 Y346.410200 Z0.000000 F200.000000 +G01 X3000.000000 Y0.000040 Z0.000000 +G01 X2800.000000 Y346.410200 Z0.000000 +G01 X2847.999999 Y346.410200 Z0.000000 +G01 X3176.000000 Y304.840982 Z0.000000 +G01 X2976.000000 Y41.569260 Z0.000000 +G01 X2847.999999 Y346.410200 Z0.000000 +G01 X2887.359998 Y341.421894 Z0.000000 +G01 X3152.000000 Y273.248375 Z0.000000 +G01 X2960.640000 Y78.150170 Z0.000000 +G01 X2887.359998 Y341.421894 Z0.000000 +G01 X2919.116800 Y333.241072 Z0.000000 +G01 X3129.036800 Y249.836591 Z0.000000 +G01 X2951.846400 Y109.742780 Z0.000000 +G01 X2919.116800 Y333.241072 Z0.000000 +G01 X2944.307200 Y323.232534 Z0.000000 +G01 X3107.773950 Y233.025330 Z0.000000 +G01 X2947.918850 Y136.562570 Z0.000000 +G01 X2944.307200 Y323.232534 Z0.000000 +G01 X2963.923210 Y312.407671 Z0.000000 +G01 X3088.591340 Y221.449800 Z0.000000 +G01 X2947.485450 Y158.962970 Z0.000000 +G01 X2963.923210 Y312.407671 Z0.000000 +G01 X2978.883380 Y301.492727 Z0.000000 +G01 X3071.658630 Y213.951380 Z0.000000 +G01 X2949.457980 Y177.376330 Z0.000000 +G01 X2978.883380 Y301.492727 Z0.000000 +G01 X2990.016410 Y290.987765 Z0.000000 +G01 X3056.994560 Y209.562380 Z0.000000 +G01 X2952.989030 Y192.270300 Z0.000000 +G01 X2990.016410 Y290.987765 Z0.000000 +G01 X2998.053790 Y281.216719 Z0.000000 +G01 X3044.513890 Y207.487330 Z0.000000 +G01 X2957.432310 Y204.116390 Z0.000000 +G01 X2998.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path160) + + +(Start cutting path id: path148) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2800.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2400.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X2600.000000 Y0.000160 Z0.000000 +G01 X2800.000000 Y-346.410000 Z0.000000 +G01 X2752.000001 Y-346.410000 Z0.000000 +G01 X2424.000000 Y-304.840782 Z0.000000 +G01 X2624.000000 Y-41.569060 Z0.000000 +G01 X2752.000001 Y-346.410000 Z0.000000 +G01 X2712.640002 Y-341.421694 Z0.000000 +G01 X2448.000000 Y-273.248175 Z0.000000 +G01 X2639.360000 Y-78.149970 Z0.000000 +G01 X2712.640002 Y-341.421694 Z0.000000 +G01 X2680.883200 Y-333.240872 Z0.000000 +G01 X2470.963200 Y-249.836391 Z0.000000 +G01 X2648.153600 Y-109.742580 Z0.000000 +G01 X2680.883200 Y-333.240872 Z0.000000 +G01 X2655.692800 Y-323.232334 Z0.000000 +G01 X2492.226050 Y-233.025130 Z0.000000 +G01 X2652.081150 Y-136.562370 Z0.000000 +G01 X2655.692800 Y-323.232334 Z0.000000 +G01 X2636.076790 Y-312.407471 Z0.000000 +G01 X2511.408660 Y-221.449600 Z0.000000 +G01 X2652.514550 Y-158.962770 Z0.000000 +G01 X2636.076790 Y-312.407471 Z0.000000 +G01 X2621.116620 Y-301.492527 Z0.000000 +G01 X2528.341370 Y-213.951180 Z0.000000 +G01 X2650.542020 Y-177.376130 Z0.000000 +G01 X2621.116620 Y-301.492527 Z0.000000 +G01 X2609.983590 Y-290.987565 Z0.000000 +G01 X2543.005440 Y-209.562180 Z0.000000 +G01 X2647.010970 Y-192.270100 Z0.000000 +G01 X2609.983590 Y-290.987565 Z0.000000 +G01 X2601.946210 Y-281.216519 Z0.000000 +G01 X2555.486110 Y-207.487130 Z0.000000 +G01 X2642.567690 Y-204.116190 Z0.000000 +G01 X2601.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path148) + + +(Start cutting path id: path132) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2400.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2000.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X2200.000000 Y0.000160 Z0.000000 +G01 X2400.000000 Y-346.410000 Z0.000000 +G01 X2352.000001 Y-346.410000 Z0.000000 +G01 X2024.000000 Y-304.840782 Z0.000000 +G01 X2224.000000 Y-41.569060 Z0.000000 +G01 X2352.000001 Y-346.410000 Z0.000000 +G01 X2312.640002 Y-341.421694 Z0.000000 +G01 X2048.000000 Y-273.248175 Z0.000000 +G01 X2239.360000 Y-78.149970 Z0.000000 +G01 X2312.640002 Y-341.421694 Z0.000000 +G01 X2280.883200 Y-333.240872 Z0.000000 +G01 X2070.963200 Y-249.836391 Z0.000000 +G01 X2248.153600 Y-109.742580 Z0.000000 +G01 X2280.883200 Y-333.240872 Z0.000000 +G01 X2255.692800 Y-323.232334 Z0.000000 +G01 X2092.226050 Y-233.025130 Z0.000000 +G01 X2252.081150 Y-136.562370 Z0.000000 +G01 X2255.692800 Y-323.232334 Z0.000000 +G01 X2236.076790 Y-312.407471 Z0.000000 +G01 X2111.408660 Y-221.449600 Z0.000000 +G01 X2252.514550 Y-158.962770 Z0.000000 +G01 X2236.076790 Y-312.407471 Z0.000000 +G01 X2221.116620 Y-301.492527 Z0.000000 +G01 X2128.341370 Y-213.951180 Z0.000000 +G01 X2250.542020 Y-177.376130 Z0.000000 +G01 X2221.116620 Y-301.492527 Z0.000000 +G01 X2209.983590 Y-290.987565 Z0.000000 +G01 X2143.005440 Y-209.562180 Z0.000000 +G01 X2247.010970 Y-192.270100 Z0.000000 +G01 X2209.983590 Y-290.987565 Z0.000000 +G01 X2201.946210 Y-281.216519 Z0.000000 +G01 X2155.486110 Y-207.487130 Z0.000000 +G01 X2242.567690 Y-204.116190 Z0.000000 +G01 X2201.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path132) + + +(Start cutting path id: path116) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X2000.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1600.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X1800.000000 Y0.000160 Z0.000000 +G01 X2000.000000 Y-346.410000 Z0.000000 +G01 X1952.000001 Y-346.410000 Z0.000000 +G01 X1624.000000 Y-304.840782 Z0.000000 +G01 X1824.000000 Y-41.569060 Z0.000000 +G01 X1952.000001 Y-346.410000 Z0.000000 +G01 X1912.640002 Y-341.421694 Z0.000000 +G01 X1648.000000 Y-273.248175 Z0.000000 +G01 X1839.360000 Y-78.149970 Z0.000000 +G01 X1912.640002 Y-341.421694 Z0.000000 +G01 X1880.883200 Y-333.240872 Z0.000000 +G01 X1670.963200 Y-249.836391 Z0.000000 +G01 X1848.153600 Y-109.742580 Z0.000000 +G01 X1880.883200 Y-333.240872 Z0.000000 +G01 X1855.692800 Y-323.232334 Z0.000000 +G01 X1692.226050 Y-233.025130 Z0.000000 +G01 X1852.081150 Y-136.562370 Z0.000000 +G01 X1855.692800 Y-323.232334 Z0.000000 +G01 X1836.076790 Y-312.407471 Z0.000000 +G01 X1711.408660 Y-221.449600 Z0.000000 +G01 X1852.514550 Y-158.962770 Z0.000000 +G01 X1836.076790 Y-312.407471 Z0.000000 +G01 X1821.116620 Y-301.492527 Z0.000000 +G01 X1728.341370 Y-213.951180 Z0.000000 +G01 X1850.542020 Y-177.376130 Z0.000000 +G01 X1821.116620 Y-301.492527 Z0.000000 +G01 X1809.983590 Y-290.987565 Z0.000000 +G01 X1743.005440 Y-209.562180 Z0.000000 +G01 X1847.010970 Y-192.270100 Z0.000000 +G01 X1809.983590 Y-290.987565 Z0.000000 +G01 X1801.946210 Y-281.216519 Z0.000000 +G01 X1755.486110 Y-207.487130 Z0.000000 +G01 X1842.567690 Y-204.116190 Z0.000000 +G01 X1801.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path116) + + +(Start cutting path id: path100) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1600.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X1200.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X1400.000000 Y0.000160 Z0.000000 +G01 X1600.000000 Y-346.410000 Z0.000000 +G01 X1552.000001 Y-346.410000 Z0.000000 +G01 X1224.000000 Y-304.840782 Z0.000000 +G01 X1424.000000 Y-41.569060 Z0.000000 +G01 X1552.000001 Y-346.410000 Z0.000000 +G01 X1512.640002 Y-341.421694 Z0.000000 +G01 X1248.000000 Y-273.248175 Z0.000000 +G01 X1439.360000 Y-78.149970 Z0.000000 +G01 X1512.640002 Y-341.421694 Z0.000000 +G01 X1480.883200 Y-333.240872 Z0.000000 +G01 X1270.963200 Y-249.836391 Z0.000000 +G01 X1448.153600 Y-109.742580 Z0.000000 +G01 X1480.883200 Y-333.240872 Z0.000000 +G01 X1455.692800 Y-323.232334 Z0.000000 +G01 X1292.226050 Y-233.025130 Z0.000000 +G01 X1452.081150 Y-136.562370 Z0.000000 +G01 X1455.692800 Y-323.232334 Z0.000000 +G01 X1436.076790 Y-312.407471 Z0.000000 +G01 X1311.408660 Y-221.449600 Z0.000000 +G01 X1452.514550 Y-158.962770 Z0.000000 +G01 X1436.076790 Y-312.407471 Z0.000000 +G01 X1421.116620 Y-301.492527 Z0.000000 +G01 X1328.341370 Y-213.951180 Z0.000000 +G01 X1450.542020 Y-177.376130 Z0.000000 +G01 X1421.116620 Y-301.492527 Z0.000000 +G01 X1409.983590 Y-290.987565 Z0.000000 +G01 X1343.005440 Y-209.562180 Z0.000000 +G01 X1447.010970 Y-192.270100 Z0.000000 +G01 X1409.983590 Y-290.987565 Z0.000000 +G01 X1401.946210 Y-281.216519 Z0.000000 +G01 X1355.486110 Y-207.487130 Z0.000000 +G01 X1442.567690 Y-204.116190 Z0.000000 +G01 X1401.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path100) + + +(Start cutting path id: path84) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X1200.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X800.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X1000.000000 Y0.000160 Z0.000000 +G01 X1200.000000 Y-346.410000 Z0.000000 +G01 X1152.000001 Y-346.410000 Z0.000000 +G01 X824.000000 Y-304.840782 Z0.000000 +G01 X1024.000000 Y-41.569060 Z0.000000 +G01 X1152.000001 Y-346.410000 Z0.000000 +G01 X1112.640002 Y-341.421694 Z0.000000 +G01 X848.000000 Y-273.248175 Z0.000000 +G01 X1039.360000 Y-78.149970 Z0.000000 +G01 X1112.640002 Y-341.421694 Z0.000000 +G01 X1080.883200 Y-333.240872 Z0.000000 +G01 X870.963200 Y-249.836391 Z0.000000 +G01 X1048.153600 Y-109.742580 Z0.000000 +G01 X1080.883200 Y-333.240872 Z0.000000 +G01 X1055.692800 Y-323.232334 Z0.000000 +G01 X892.226050 Y-233.025130 Z0.000000 +G01 X1052.081150 Y-136.562370 Z0.000000 +G01 X1055.692800 Y-323.232334 Z0.000000 +G01 X1036.076790 Y-312.407471 Z0.000000 +G01 X911.408660 Y-221.449600 Z0.000000 +G01 X1052.514550 Y-158.962770 Z0.000000 +G01 X1036.076790 Y-312.407471 Z0.000000 +G01 X1021.116620 Y-301.492527 Z0.000000 +G01 X928.341370 Y-213.951180 Z0.000000 +G01 X1050.542020 Y-177.376130 Z0.000000 +G01 X1021.116620 Y-301.492527 Z0.000000 +G01 X1009.983590 Y-290.987565 Z0.000000 +G01 X943.005440 Y-209.562180 Z0.000000 +G01 X1047.010970 Y-192.270100 Z0.000000 +G01 X1009.983590 Y-290.987565 Z0.000000 +G01 X1001.946210 Y-281.216519 Z0.000000 +G01 X955.486110 Y-207.487130 Z0.000000 +G01 X1042.567690 Y-204.116190 Z0.000000 +G01 X1001.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path84) + + +(Start cutting path id: path68) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X800.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X400.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X600.000000 Y0.000160 Z0.000000 +G01 X800.000000 Y-346.410000 Z0.000000 +G01 X752.000001 Y-346.410000 Z0.000000 +G01 X424.000000 Y-304.840782 Z0.000000 +G01 X624.000000 Y-41.569060 Z0.000000 +G01 X752.000001 Y-346.410000 Z0.000000 +G01 X712.640002 Y-341.421694 Z0.000000 +G01 X448.000000 Y-273.248175 Z0.000000 +G01 X639.360000 Y-78.149970 Z0.000000 +G01 X712.640002 Y-341.421694 Z0.000000 +G01 X680.883200 Y-333.240872 Z0.000000 +G01 X470.963200 Y-249.836391 Z0.000000 +G01 X648.153600 Y-109.742580 Z0.000000 +G01 X680.883200 Y-333.240872 Z0.000000 +G01 X655.692800 Y-323.232334 Z0.000000 +G01 X492.226050 Y-233.025130 Z0.000000 +G01 X652.081150 Y-136.562370 Z0.000000 +G01 X655.692800 Y-323.232334 Z0.000000 +G01 X636.076790 Y-312.407471 Z0.000000 +G01 X511.408660 Y-221.449600 Z0.000000 +G01 X652.514550 Y-158.962770 Z0.000000 +G01 X636.076790 Y-312.407471 Z0.000000 +G01 X621.116620 Y-301.492527 Z0.000000 +G01 X528.341370 Y-213.951180 Z0.000000 +G01 X650.542020 Y-177.376130 Z0.000000 +G01 X621.116620 Y-301.492527 Z0.000000 +G01 X609.983590 Y-290.987565 Z0.000000 +G01 X543.005440 Y-209.562180 Z0.000000 +G01 X647.010970 Y-192.270100 Z0.000000 +G01 X609.983590 Y-290.987565 Z0.000000 +G01 X601.946210 Y-281.216519 Z0.000000 +G01 X555.486110 Y-207.487130 Z0.000000 +G01 X642.567690 Y-204.116190 Z0.000000 +G01 X601.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path68) + + +(Start cutting path id: path52) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X400.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X0.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X200.000000 Y0.000160 Z0.000000 +G01 X400.000000 Y-346.410000 Z0.000000 +G01 X352.000001 Y-346.410000 Z0.000000 +G01 X24.000000 Y-304.840782 Z0.000000 +G01 X224.000000 Y-41.569060 Z0.000000 +G01 X352.000001 Y-346.410000 Z0.000000 +G01 X312.640002 Y-341.421694 Z0.000000 +G01 X48.000000 Y-273.248175 Z0.000000 +G01 X239.360000 Y-78.149970 Z0.000000 +G01 X312.640002 Y-341.421694 Z0.000000 +G01 X280.883200 Y-333.240872 Z0.000000 +G01 X70.963200 Y-249.836391 Z0.000000 +G01 X248.153600 Y-109.742580 Z0.000000 +G01 X280.883200 Y-333.240872 Z0.000000 +G01 X255.692800 Y-323.232334 Z0.000000 +G01 X92.226050 Y-233.025130 Z0.000000 +G01 X252.081150 Y-136.562370 Z0.000000 +G01 X255.692800 Y-323.232334 Z0.000000 +G01 X236.076790 Y-312.407471 Z0.000000 +G01 X111.408660 Y-221.449600 Z0.000000 +G01 X252.514550 Y-158.962770 Z0.000000 +G01 X236.076790 Y-312.407471 Z0.000000 +G01 X221.116620 Y-301.492527 Z0.000000 +G01 X128.341370 Y-213.951180 Z0.000000 +G01 X250.542020 Y-177.376130 Z0.000000 +G01 X221.116620 Y-301.492527 Z0.000000 +G01 X209.983590 Y-290.987565 Z0.000000 +G01 X143.005440 Y-209.562180 Z0.000000 +G01 X247.010970 Y-192.270100 Z0.000000 +G01 X209.983590 Y-290.987565 Z0.000000 +G01 X201.946210 Y-281.216519 Z0.000000 +G01 X155.486110 Y-207.487130 Z0.000000 +G01 X242.567690 Y-204.116190 Z0.000000 +G01 X201.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path52) + + +(Start cutting path id: path2999) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X0.000000 Y346.410200 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X400.000000 Y346.410200 Z0.000000 F200.000000 +G01 X200.000000 Y0.000040 Z0.000000 +G01 X0.000000 Y346.410200 Z0.000000 +G01 X47.999999 Y346.410200 Z0.000000 +G01 X376.000000 Y304.840982 Z0.000000 +G01 X176.000000 Y41.569260 Z0.000000 +G01 X47.999999 Y346.410200 Z0.000000 +G01 X87.359998 Y341.421894 Z0.000000 +G01 X352.000000 Y273.248375 Z0.000000 +G01 X160.640000 Y78.150170 Z0.000000 +G01 X87.359998 Y341.421894 Z0.000000 +G01 X119.116800 Y333.241072 Z0.000000 +G01 X329.036800 Y249.836591 Z0.000000 +G01 X151.846400 Y109.742780 Z0.000000 +G01 X119.116800 Y333.241072 Z0.000000 +G01 X144.307200 Y323.232534 Z0.000000 +G01 X307.773950 Y233.025330 Z0.000000 +G01 X147.918850 Y136.562570 Z0.000000 +G01 X144.307200 Y323.232534 Z0.000000 +G01 X163.923210 Y312.407671 Z0.000000 +G01 X288.591340 Y221.449800 Z0.000000 +G01 X147.485450 Y158.962970 Z0.000000 +G01 X163.923210 Y312.407671 Z0.000000 +G01 X178.883380 Y301.492727 Z0.000000 +G01 X271.658630 Y213.951380 Z0.000000 +G01 X149.457980 Y177.376330 Z0.000000 +G01 X178.883380 Y301.492727 Z0.000000 +G01 X190.016410 Y290.987765 Z0.000000 +G01 X256.994560 Y209.562380 Z0.000000 +G01 X152.989030 Y192.270300 Z0.000000 +G01 X190.016410 Y290.987765 Z0.000000 +G01 X198.053790 Y281.216719 Z0.000000 +G01 X244.513890 Y207.487330 Z0.000000 +G01 X157.432310 Y204.116390 Z0.000000 +G01 X198.053790 Y281.216719 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path2999) + + +(Start cutting path id: path164) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3200.000000 Y-346.410000 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X2800.000000 Y-346.410000 Z0.000000 F200.000000 +G01 X3000.000000 Y0.000160 Z0.000000 +G01 X3200.000000 Y-346.410000 Z0.000000 +G01 X3152.000001 Y-346.410000 Z0.000000 +G01 X2824.000000 Y-304.840782 Z0.000000 +G01 X3024.000000 Y-41.569060 Z0.000000 +G01 X3152.000001 Y-346.410000 Z0.000000 +G01 X3112.640002 Y-341.421694 Z0.000000 +G01 X2848.000000 Y-273.248175 Z0.000000 +G01 X3039.360000 Y-78.149970 Z0.000000 +G01 X3112.640002 Y-341.421694 Z0.000000 +G01 X3080.883200 Y-333.240872 Z0.000000 +G01 X2870.963200 Y-249.836391 Z0.000000 +G01 X3048.153600 Y-109.742580 Z0.000000 +G01 X3080.883200 Y-333.240872 Z0.000000 +G01 X3055.692800 Y-323.232334 Z0.000000 +G01 X2892.226050 Y-233.025130 Z0.000000 +G01 X3052.081150 Y-136.562370 Z0.000000 +G01 X3055.692800 Y-323.232334 Z0.000000 +G01 X3036.076790 Y-312.407471 Z0.000000 +G01 X2911.408660 Y-221.449600 Z0.000000 +G01 X3052.514550 Y-158.962770 Z0.000000 +G01 X3036.076790 Y-312.407471 Z0.000000 +G01 X3021.116620 Y-301.492527 Z0.000000 +G01 X2928.341370 Y-213.951180 Z0.000000 +G01 X3050.542020 Y-177.376130 Z0.000000 +G01 X3021.116620 Y-301.492527 Z0.000000 +G01 X3009.983590 Y-290.987565 Z0.000000 +G01 X2943.005440 Y-209.562180 Z0.000000 +G01 X3047.010970 Y-192.270100 Z0.000000 +G01 X3009.983590 Y-290.987565 Z0.000000 +G01 X3001.946210 Y-281.216519 Z0.000000 +G01 X2955.486110 Y-207.487130 Z0.000000 +G01 X3042.567690 Y-204.116190 Z0.000000 +G01 X3001.946210 Y-281.216519 Z0.000000 +M300 S145 (G00 Z5.000000) + +(End cutting path id: path164) + + +(Footer) +M5 +G00 X0.0000 Y0.0000 +M2 +(Using default footer. To add your own footer create file "footer" in the output dir.) +(end) +% \ No newline at end of file diff --git a/SD/gcode/test.ngc b/SD/gcode/test.ngc new file mode 100644 index 0000000..cbd6e16 --- /dev/null +++ b/SD/gcode/test.ngc @@ -0,0 +1,50 @@ +% +;Short Test + +;Created by Terence Golla +;Generated by gcodetools from Inkscape. +G21 (All units in mm) + +/M01 ;Normally would stop + +(Start cutting path id: path6320) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3680.000000 Y364.268890 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3760.000000 Y389.602090 Z0.000000 F200.000000 +M300 S145 (G00 Z5.000000) + +M01 ;Dummy Change Pen Here... +(End cutting path id: path6320) + + +(Start cutting path id: path6318) +(Change tool to Cylindrical cutter) + +M300 S145 (G00 Z5.000000) +G00 X3836.000000 Y308.888790 + +M300 S125 (G01 Z0.000000 F100.0(Penetrate) +G01 X3764.000000 Y331.688590 Z0.000000 F200.000000 +G01 X3764.000000 Y343.017990 Z0.000000 +G01 X3836.000000 Y320.218090 Z0.000000 +G01 X3836.000000 Y331.547390 Z0.000000 +G01 X3764.000000 Y354.347290 Z0.000000 +G01 X3764.000000 Y365.676690 Z0.000000 +G01 X3836.000000 Y342.876790 Z0.000000 +G01 X3836.000000 Y354.206090 Z0.000000 +G01 X3764.000000 Y377.005990 Z0.000000 +G01 X3764.000000 Y388.335390 Z0.000000 +G01 X3836.000000 Y365.535490 Z0.000000 +M300 S145 (G00 Z5.000000) + +(Footer) +M5 +G00 X0.0000 Y0.0000 +M2 +(Using default footer. To add your own footer create file "footer" in the output dir.) +(end) +% \ No newline at end of file From e394caa2899f45b1c3de33dccd498160ef2956c4 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Fri, 27 May 2022 15:03:08 -0500 Subject: [PATCH 34/39] Completed Configuration.md documentation. --- Configuration.md | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/Configuration.md b/Configuration.md index 960242d..6acd121 100644 --- a/Configuration.md +++ b/Configuration.md @@ -16,13 +16,37 @@ Based on the time of this release it is highly unlikely that you are using versi Depending on the mounting/orentation of your Arduino you may need to adjust the ```TFT_ROTATION``` directive which sets the display screen rotation. The code is optimized for landscape (wide) mode. 1 is landscape mode, with the USB jack at the top left, while rotation 3 is also landscape, but with the USB jack at the bottom right. The default setting is 3. -//TODO: Complete Section and check list... +If you are not using the TFT touch screen (```ADAFRUIT_TFT_TOUCH_SHIELD true``` ) you will need to set ```SERVO_PIN``` to either 9 or 10. + +At this point you can compile and load the SphereBot software on to your Arduino. he following step calibrate the pen's up/down movement. + +Based on the orentation of your servo you may need to set the ```REVERSE_SERVO``` directive. + +To determine if you have the correct setting connect through the USB with the serial monitor (this will reset the Arduino) and on the touch screen select USB mode. Note: If the screen remains white and fails to display the splash screen, etc. you may have forgot to copy the folders under the SD folder on to your SD card. + +When connected you should receive 'Ready'. Now type a M300 command to move the pen up/down. For example, M300 S145 should move the pen up and M300 S125 should move the pen down. If this is not the case and the pen moves in opposite directions you will need to change the true/false value of ```REVERSE_SERVO```. + +You will need to set the ```MIN_PEN_POSITION``` directive. This setting prevents damage to the pen servo by limiting the down direction. Determine the best setting by sending M300 commands that progressively move the pen down until movement is hindered. For example, M300 S110, M300 S100, M300 M90... The default setting is 100. + +You will need to set the ```MAX_PEN_POSITION``` directive. This setting prevents damage to the pen servo by limiting the up direction. Determine the best setting by sending M300 commands that progressively move the pen up until movement is hindered. For example, M300 S155, M300 S160, M300 M165... The default setting is 160. + +You will need to set the ```DEFAULT_PEN_UP_POSITION``` directive. This is the default pen up position used when drawing on an object. This setting can later be adjusted with the M303 command. With a pen in the holder, mount different objects and using M300 commands adjust the pen such that it is away from the object on average 10mm. + +You will need to set the ```DEFAULT_PEN_DOWN_POSITION``` directive. This is the default pen down position used when drawing on an object. This setting can later be adjusted with the M304 command. With a pen in the holder, mount different objects and using M300 commands adjust the pen such that it sets on the object with some tension in the pen spring arm. ### Minimun Configuration Check List -1. ```ADAFRUIT_TFT_TOUCH_SHIELD``` set to false if not using TFT touch shield. -2. ```ADAFRUIT_MOTOR_SHIELD_VERSION``` set to one if using version 1 motor shield. +1. ```ADAFRUIT_TFT_TOUCH_SHIELD``` set to false if not using a TFT touch shield (Orginal hardware configuration with Uno and Adafruit motor shield). +2. ```ADAFRUIT_MOTOR_SHIELD_VERSION``` set to one if using the version 1 motor shield. 3. ```TFT_ROTATION``` may need to be altered based on mounting/orentation of your Arduino. +4. If you are configuring for the orginal hardware configuration (no TFT touch shield) you will need to set ```SERVO_PIN``` to either 9 or 10. +5. Load SphereBot software on to your Arduino so you can make the following pen calibrations. +5. Confirm the up/down movement of the pen using gcode command M300 S145 (up) and M300 S125 (down). If the movement is opposite change the true/false value of ```REVERSE_SERVO```. +6. Determine the ```MIN_PEN_POSITION``` setting by sending M300 commands that progressively move the pen down until movement is hindered. For example, M300 S110, M300 S100, M300 M90... +7. Determine the ```MAX_PEN_POSITION``` setting by sending M300 commands that progressively move the pen up until movement is hindered. For example, M300 S155, M300 S160, M300 M165... +8. Determine the ```DEFAULT_PEN_UP_POSITION``` setting by placing a pen in the holder, mounting different objects and using M300 commands to adjust the pen such that it away from the object on average 10mm. +9. Determine the ```DEFAULT_PEN_DOWN_POSITION``` setting by placing a pen in the holder, mounting different objects and using M300 commands to adjust the pen such that it sets on the object with some tension in the pen spring arm. +10. Once you complete the pen calibrations reload the SphereBot software on to your Arduino. ## DEBUG @@ -84,7 +108,7 @@ The ```PEN_AXIS_PORT``` directive sets the pen arm stepper motor port. Port 1 is The ```ROTATION_AXIS_PORT``` directive sets the rotation stepper motor port. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default setting is 2. Note: M1 and M3 should have the same colored pairs of wires, as should M2 and M4. ## SERVO_PIN -The ```SERVO_PIN``` directive sets the servo pin. Port 1 is the M1 & M2 terminals. Port 2 is the M3 & M4 terminals. The default setting is 6 when using the TFT touch shield and can be either 9 or 10 in the original configuration. If you are adding the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch board you will need to solder a 3-pin right-angle male header to the break out area of the motor shield facing the edge with pin 1 wired to ground, pin 2 wired to +5V and pin 3 wired to digital pin 6 of the Arduino. +The ```SERVO_PIN``` directive sets the servo pin. The default setting is 6 when using the TFT touch shield and can be either 9 or 10 in the original configuration. If you are adding the Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch board you will need to solder a 3-pin right-angle male header to the break out area of the motor shield facing the edge with pin 1 wired to ground, pin 2 wired to +5V and pin 3 wired to digital pin 6 of the Arduino. ## REVERSE_SERVO true The ```REVERSE_SERVO``` directive sets a boolean true/false that sets the up/down direction of the servo base on which side it is mounted. The default setting is true. @@ -116,7 +140,6 @@ The ```DEFAULT_PEN_DOWN_POSITION``` directive sets the default pen down position ## DEFAULT_PEN_FEEDRATE The ```DEFAULT_PEN_FEEDRATE``` directive sets the default pen feedrate in degrees/second necessary should G-Code not contain feedrate. This is the default setting used prior to saving values to the EEPROM. The default setting is 200.0. -// The default preset Pen feedrate in degrees/second. Use perset feedrate if not zero. ## DEFAULT_PRESET_PEN_FEEDRATE The ```DEFAULT_PRESET_PEN_FEEDRATE``` directive sets the default preset pen feedrate in degrees/second used only if not set to zero. This is the default setting used prior to saving values to the EEPROM. The default setting is 0.0. From 07ec2755a603ae3a834de1dc66d0296e9ffe119a Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Fri, 27 May 2022 15:03:45 -0500 Subject: [PATCH 35/39] Completed Configuration.md documentation. --- Configuration.h | 2 +- README.md | 10 ++++++++-- SphereBot.ino | 8 ++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Configuration.h b/Configuration.h index c186593..3abfa70 100644 --- a/Configuration.h +++ b/Configuration.h @@ -101,7 +101,7 @@ // Default pen up/down positions. #define DEFAULT_PEN_UP_POSITION 145 -#define DEFAULT_PEN_DOWN_POSITION 115 +#define DEFAULT_PEN_DOWN_POSITION 125 // The default Pen feedrate in degrees/second. Necessary should G-Code not contain feedrate. #define DEFAULT_PEN_FEEDRATE 200.0 diff --git a/README.md b/README.md index 17c96a4..1f6abfb 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,13 @@ ### https://github.com/tgolla/SphereBot Arduino Firmware for use with the Adafruit Motor Shield v2 and 2.8" TFT Touch Shield for Arduino w/Capacitive Touch. -This fork takes on a large number of changes including adding additional custom G-Code commands, a touchscreen control, SD card reader support and audio alerts. Many of these features are being actively developed such that additional documentation can be found in the G-Code.md file and comments in both the SphereBot.ino and configuration.h files. +This fork takes on a large number of changes including adding additional custom G-Code commands, a touchscreen control, SD card reader support and audio alerts. Many of these features are being actively developed. Additional documentation can be found in the G-Code.md and Configuration.md files along with comments in both the SphereBot.ino and configuration.h files. The version 1.9 prerelease is missing the follow features. + +- Version 2.0 release setup notes including wiring (images/diagrams) for servo pin 6 and the piezo buzzer. +- Implementation of the piezo buzzer alert. +- Complete comprehensive build documentation which will be released on Thingiverse (https://www.thingiverse.com/). +- InkScape documentation stepping through creating gcode with the gcodetools along with using some of new the advanced Mxxx commands. +- A conplete set of gcode files and images for printing. Please do not fork this code just to have a copy unless you plan on making meaningful contributions which could be merged back in as GitHub forks are overused, abused, and misused. Forks are not meant to be used to keep a copy of the code in your personal repository. More information on the proper use of forks can be found at… @@ -12,7 +18,7 @@ https://docs.github.com/en/github/getting-started-with-github/fork-a-repo Instead clone the project and create a personal branch in which you can store your modification to configuration.h. In this way you can pull updates to master and merge them into your branch without losing your specific configuration. -I ask this because this project currently has 52 forks of which maybe 5 are not exact copies of the orginal project. +I ask this because this project currently has 52 forks of which maybe 5 are not exact copies of the orginal project and for those looking for usefull code branches searching all of these forks can be daunting. # jinschoi/SphereBot Fork README ### https://github.com/jinschoi/SphereBot diff --git a/SphereBot.ino b/SphereBot.ino index e739315..6152258 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -142,9 +142,6 @@ in the "Configuration.h" file. #include -#define DEFAULT_PATH_SIZE 16 -char path[DEFAULT_FILE_NAME_SIZE + DEFAULT_PATH_SIZE]; - byte minPenPosition; byte maxPenPosition; byte penUpPosition; @@ -256,6 +253,9 @@ Adafruit_FT6206 ts = Adafruit_FT6206(); int currentDisplayLineCursor; int currentTextSize; + +#define DEFAULT_PATH_SIZE 16 +char path[DEFAULT_FILE_NAME_SIZE + DEFAULT_PATH_SIZE]; #endif void setup() @@ -303,7 +303,7 @@ void setup() tft.print("An EggBot Clone"); tft.setCursor(10, 10 + (8 * 5) + 2 + (8 * 2) + 4); tft.setTextSize(1); - tft.print("v1.2"); + tft.print("v1.9"); delay(SPLASH_SCREEN_DELAY); tft.fillScreen(ILI9341_WHITE); From 86c61282e94517c8868a00c23f4031aabbc758e1 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Fri, 27 May 2022 21:22:52 -0500 Subject: [PATCH 36/39] Corrected typo. --- G-Code.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/G-Code.md b/G-Code.md index dc9bb15..1da22b2 100644 --- a/G-Code.md +++ b/G-Code.md @@ -75,7 +75,7 @@ The M310 command allows you to override the XY feed rates set in your G-Code fil ### M311 The M311 command allows you to override the Z (pen movement) feed rates set in your G-Code file with a preset value. If set to 0 the feed rate is initialized with the default feed rate and is set through the M300 Fxxx or G0, G1, G2 & G3 codes with only Z values by Fxxx. The preference is to set this value as can be unique to either the SphereBot or object being drawn on and prevents the pen from crashing down an egg for example. -### M#12 +### M312 The M312 command sets the pen up federate multiplier. This command allows the SphereBot to move off the object at a faster rate. One means the pen will go up at the same speed (degrees/second) as it goes down. Each increase by one will logarithmically double the pen up speed. ### Using M3xx commands. @@ -92,3 +92,15 @@ Although you can easily modify the beginning of each G-Code file with the correc The M999 command is for debugging and can be useful when determining things like pen up/down settings, feed rates and G-Code interpretation behavior. This code is optionally configured in the configuration.h file and it should be noted that in an Arduino Uno configuration the code consumes a large portion of dynamic memory. For those wanting to try their hand at generating G-Code for the SphereBot there is a solution. InkScape v1.0 comes prepackages with the Gcodetools extension. I go into the process of converting a drawing into a line drawing and then G-Code using this extension elsewhere in the documentation. + +## References + +The following are just a few sources of information on G-Code. + +https://www.autodesk.com/products/fusion-360/blog/cnc-programming-fundamentals-g-code/ + +http://www.machinekit.io/docs/gcode/overview/ + +https://www.reprap.org/wiki/G-code + +https://howtomechatronics.com/tutorials/g-code-explained-list-of-most-important-g-code-commands/ \ No newline at end of file From ca4464c49703aa043e2d8a2508121cf26f9eaf9e Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sat, 28 May 2022 07:58:46 -0500 Subject: [PATCH 37/39] Updating documentation for release. --- G-Code.md | 16 ++++++++-------- Inkscape.md | 2 ++ SphereBot.ino | 15 +++++++++------ 3 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 Inkscape.md diff --git a/G-Code.md b/G-Code.md index 1da22b2..5d22c09 100644 --- a/G-Code.md +++ b/G-Code.md @@ -13,7 +13,7 @@ The jinschoi/SphereBot fork (https://github.com/jinschoi/SphereBot) of the Spher M301 - Set the minimum pen position. M302 - Set the maximum pen position. - M303 - Sset the pen up position have been added. + M303 - Set the pen up position. M500 - Save the pen settings to the Arduino EEPROM. M501 - Load the pen settings from the Arduino EEPROM. M501 - Reset the pen settings to the firmware defaults. @@ -23,9 +23,9 @@ The tgolla/SphereBot fork (https://github.com/tgolla/SphereBot) adds the followi M304 - Sets the pen down position needed for new MZ mode. M305 - Sets the G-Code responsible for operating the pen servo. - P0 - M300 sets the pen height. P1 - G0, G1, G2 & G3 Z parameter - is responsible for setting the pen height. P2 - Automatically - detects which code is responsible for setting the pen height. + P0 - M300 commands set the pen height. + P1 - G0, G1, G2 & G3 the Z parameter is responsible for setting the pen height. + P2 - Automatically detects which code is responsible for setting the pen height. M306 - Sets the M300 height adjustment. P0 - Off, P1 - Preset, P2 - Calculated M307 - Sets the Z height adjustment. P0 - Off, P1 - Preset, P2 - Calculated M308 - Sets the M300 pen up preset value. S values less than the value @@ -45,15 +45,15 @@ The tgolla/SphereBot fork (https://github.com/tgolla/SphereBot) adds the followi In an Arduino Uno configuration do not add unless necessary as the code consumes a large portion of dynamic memory. -As stated, these commands have been added to eliminate the need to modify G-Code files for a specific SphereBot by allowing you to preconfigure the software such that it can automatically adjust the pen up/down defined in the G-Code file. +As stated, these commands have been added to eliminate the need to modify G-Code files for a specific SphereBot by allowing you to preconfigure the software such that it can automatically adjust the pen up/down movement defined in the G-Code file. ### M304 -The M304 command sets the pen down position. This command is used in conjunction with the M303 command that sets the pen up position. These commands allow you to adjust the pen to up/down positions specific to your SphereBot. The commands work in conjunction with the MZ mode command (M305) and the M330 and Z height adjustment commands (M306, M307). +The M304 command sets the pen down position. This command is used in conjunction with the M303 command that sets the pen up position. These commands allow you to adjust the pen to up/down positions specific to your SphereBot. The commands work in conjunction with the MZ mode command (M305) and the M300 and Z height adjustment commands (M306, M307). ### M305 -The M305 command sets the MZ mode. The MZ mode setting determines how the software interprets the G-Code file. The mode can be set to one of three settings. When set to M mode (P0) the M300 command is responsible for setting the height of the pen. This is the same behavior found in past versions of the software code. When using this mode it may be necessary for you to manually modify a G-Code file to set the S word value. +The M305 command sets the MZ mode. The MZ mode setting determines how the software interprets the G-Code file. The mode can be set to one of three settings. When set to M mode (P0) the M300 command is responsible for setting the height of the pen. This is the same behavior found in past versions of the software code. When using this mode it may be necessary for you to manually modify a G-Code file to set the S word value to you SphereBot's specific up/down pen heights. -When set to Z mode the Z parameter in the G0, G1, G2 or G3 command is responsible for setting for setting the height of the pen. +When set to Z mode (P1) the Z parameter in the G0, G1, G2 or G3 commands is responsible for setting for setting the height of the pen. When set to Auto mode (P2) the mode is set to the appropriate M or Z mode based on which command is first detected in the G-Code file. For example, if a G0, G1, G2 or G3 command with a Z parameter is read first the mode is set to Z. But if an M300 command is read first the mode is set to M. diff --git a/Inkscape.md b/Inkscape.md new file mode 100644 index 0000000..536eaba --- /dev/null +++ b/Inkscape.md @@ -0,0 +1,2 @@ +# Creating G-Code Files with Inkscape +The following is a tutorial outlining the steps of converting a SphereBot SVG template (3200x800) into gcode. The tutorial also discusses some of the challenges and solutions provided with some of the newer Mxxx commands of moving gcode between different SphereBots. \ No newline at end of file diff --git a/SphereBot.ino b/SphereBot.ino index 6152258..9a77388 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -890,7 +890,7 @@ void processCommand() if (gCodeNumber >= 0 && gCodeNumber <= 3) // G0, G1, G2, G3 { // If MZ active mode equals auto and a Z coordinate exist - // set the MZ active mode to Z. + // (is found first) set the MZ active mode to Z. if (mzActiveMode == Auto && GCode.HasWord('Z')) mzActiveMode = Z; @@ -1086,7 +1086,7 @@ void processCommand() case 300: // M300 - Set pen (servo) position. // If MZ active mode equals auto and a M300 command exist - // set the MZ active mode to M. + // (is found first) set the MZ active mode to M. if (mzActiveMode == Auto) mzActiveMode = M; @@ -1152,15 +1152,18 @@ void processCommand() break; // M305 - Sets the G-Code responsible for operating the pen servo. - // P0 - M300 sets the pen height. P1 - G0, G1, G2 & G3 Z parameter is - // responsible for setting the pen height. P2 - Automatically detects - // which code is responsible for setting the pen height. + // P0 - M300 commands set the pen height. + // P1 - G0, G1, G2 & G3 the Z parameter is responsible for setting + // the pen height. + // P2 - Automatically detects which code is responsible for setting + // the pen height. case 305: if (GCode.HasWord('P')) { mzMode = GCode.GetWordValue('P'); - if (mzMode > Auto) + // Protection from the value of P being anything other than 0, 1, or 2. + if (mzMode > Auto) mzMode = M; mzActiveMode = mzMode; From c1f80d7b297c8224f805fa70371e84e70e4ee9e6 Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sat, 28 May 2022 10:31:08 -0500 Subject: [PATCH 38/39] M300 presetPenFeedrate bug, document corrections --- SphereBot.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SphereBot.ino b/SphereBot.ino index 9a77388..70c949f 100644 --- a/SphereBot.ino +++ b/SphereBot.ino @@ -1092,7 +1092,7 @@ void processCommand() if (mzActiveMode == M) { - if (GCode.HasWord('F')) + if (GCode.HasWord('F') && presetPenFeedrate <= 0) { penFeedrate = GCode.GetWordValue('F'); } @@ -1198,7 +1198,7 @@ void processCommand() } break; - // M308 - Sets the M300 pen up preset value. + // M308 - Sets the M300 pen up preset threshold value. // S values less than the value move the pen down. case 308: if (GCode.HasWord('P')) @@ -1310,14 +1310,14 @@ void processCommand() print("M308 P"); print(mAdjustPreset); - print(" ;M308 Pxxx - M Adjust Preset: "); + print(" ;M308 Pxxx - M Adjust Preset Threshold: "); print(mAdjustPreset); print(" M Adjust Calculated: "); println(mAdjustCalculated); print("M309 P"); print(zAdjustPreset); - print(" ;M309 Pxxx - Z Adjust Preset: "); + print(" ;M309 Pxxx - Z Adjust Preset Threshold: "); print(zAdjustPreset); print(" Z Adjust Calculated: "); println(zAdjustCalculated); From 82177cd4c71b036571fb0dfecd99c883a7f6499e Mon Sep 17 00:00:00 2001 From: Terence Golla Date: Sat, 28 May 2022 10:40:25 -0500 Subject: [PATCH 39/39] Finished correcting documantation for release. --- G-Code.md | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/G-Code.md b/G-Code.md index 5d22c09..10255e8 100644 --- a/G-Code.md +++ b/G-Code.md @@ -28,9 +28,9 @@ The tgolla/SphereBot fork (https://github.com/tgolla/SphereBot) adds the followi P2 - Automatically detects which code is responsible for setting the pen height. M306 - Sets the M300 height adjustment. P0 - Off, P1 - Preset, P2 - Calculated M307 - Sets the Z height adjustment. P0 - Off, P1 - Preset, P2 - Calculated - M308 - Sets the M300 pen up preset value. S values less than the value + M308 - Sets the M300 pen up preset value. Sxxx values less than the value move the pen down. - M309 - Sets the Z pen up preset value. Z values less than the value + M309 - Sets the Z pen up preset value. Zxxx values less than the value move the pen down. M310 - Sets the XY feedrate preset value. If zero feedrate is initalized with default value and set through G0, G1, G2 & G3 codes with X or Y values @@ -57,23 +57,41 @@ When set to Z mode (P1) the Z parameter in the G0, G1, G2 or G3 commands is resp When set to Auto mode (P2) the mode is set to the appropriate M or Z mode based on which command is first detected in the G-Code file. For example, if a G0, G1, G2 or G3 command with a Z parameter is read first the mode is set to Z. But if an M300 command is read first the mode is set to M. -### M306 & M307 -The M306 and M307 commands determine how the respective M300 command or G0, G1, G2 or G3 command Z parameter pen height value is interpreted. +### M306 +The M306 command determine how the M300 command pen height value (Sxxx) is interpreted (adjusted). -- If set to Off (P0) the value provided by the command or parameter is used as the absolute pen height. -- If set to Preset (P1) the pen up preset (M308 or M309) value is used to determine if the pen position is set to the pen up (M304) or pen down (M303) value. +- If set to Off (P0) the Sxxx value provided by the M300 is used to set the pen height. This mode is emulates the behavior of past code. +- If set to Preset (P1) the pen up preset threshold value (M308) is used to determine if the pen position is set to the pen up value (M304) or pen down value (M303). -For example, if the value provided is greater than or equal to the preset value, the pen position is set to the pen up value (M304) and if it is less than the pen position is set to the pen down value (M303). +For example, if the value provided is greater than or equal to the preset threshold value, the pen position is set to the pen up value (M304) and if it is less than the preset threshold value, the pen position is set to the pen down value (M303). + +- If set to Calculated (P2) the calculated value is determined by assuming the first height position value (Sxxx) read is the value used to determine if the pen should be positioned up or down. + +For example, if the first pen command (M300 S145) value is 145, all subsequent command values equal and greater than will position the pen to the pen up value (M304). Those less than will position the pen to the pen down value (M304). + +### M307 +The M307 command determine how the G0, G1, G2 or G3 command Z parameter (Zxxx) is interpreted (adjusted). + +- If set to Off (P0) the Zxxx value provided by the Z parameter is used to set the pen height. +- If set to Preset (P1) the pen up preset threshold value (M309) is used to determine if the pen position is set to the pen up value (M304) or pen down value (M303). + +For example, if the value provided is greater than or equal to the preset threshold value, the pen position is set to the pen up value (M304) and if it is less than the preset threshold value, the pen position is set to the pen down value (M303). - If set to Calculated (P2) the calculated value is determined by assuming the first height position value read is the value used to determine if the pen should be positioned up or down. -For example, if the first pen position value is 5, all values 5 equal and greater than will position the pen at the pen up value (M304). Those less than will position the pen at the pen down value (M304). - +For example, if the first pen command (Z05) value is 5, all subsequent command values equal and greater than will position the pen to the pen up value (M304). Those less than will position the pen to the pen down value (M304). + +### 308 +The M308 command sets the M300 pen up preset threshold value. When M306 is set to Preset (M306 P1) Sxxx values greater than or equal to the value move the pen up to the to the pen up value (M304). Sxxx values less than the value move the pen down (M303). + +### 309 +The M309 command sets the Z parameter pen up preset threshold value. When M307 is set to Preset (M307 P1) Zxxx values greater than or equal to the value move the pen up to the to the pen up value (M304). Zxxx values less than the value move the pen down (M303). + ### M310 -The M310 command allows you to override the XY feed rates set in your G-Code file with a preset value. If set to 0 the feed rate is initialized with the default feed rate and is set through G0, G1, G2 & G3 codes with X or Y values by Fxxx. +The M310 command allows you to override the XY feed rates set in your G-Code file with a preset value. If set to 0 the feed rate is initialized with the default feed rate and is set through G0, G1, G2 & G3 codes with X or Y values by Fxxx. The preference is to set this value to get the optimum speed from your SphereBot. ### M311 -The M311 command allows you to override the Z (pen movement) feed rates set in your G-Code file with a preset value. If set to 0 the feed rate is initialized with the default feed rate and is set through the M300 Fxxx or G0, G1, G2 & G3 codes with only Z values by Fxxx. The preference is to set this value as can be unique to either the SphereBot or object being drawn on and prevents the pen from crashing down an egg for example. +The M311 command allows you to override the pen movement feed rates set in your G-Code file with a preset value. If set to 0 the feed rate is initialized with the default feed rate and can be changed through the M300 or G0, G1, G2 & G3 codes with only Z values feedrate setting (Fxxx). The preference is to set this value as can be unique to either the SphereBot or object being drawn on and prevents the pen from crashing down an egg. ### M312 The M312 command sets the pen up federate multiplier. This command allows the SphereBot to move off the object at a faster rate. One means the pen will go up at the same speed (degrees/second) as it goes down. Each increase by one will logarithmically double the pen up speed. @@ -83,15 +101,13 @@ Using a file to preset the M301 through M312 values and saving the configuration - For example, the commands M305 P0 and M306 P0 would configure the SphereBot to operate as it has with past software releases requiring specific G-Code files to be customized for the specific SphereBot. -- Executing the commands M305 P2, M306 P2 and M307 P2 would configure the SphereBot to its most versatile setting where there should be no need to customize a G-Code file. - -Both scenarios assume you have set M304 and M303 to the correct heights. +- Executing the commands M305 P2, M306 P2 and M307 P2, setting the M303 and M304 pen heights for you SphereBot along with the M310 and M311 preset feed rates would configure the SphereBot to its most versatile setting where there should be no need to customize a G-Code file. -Although you can easily modify the beginning of each G-Code file with the correct M301 through M312 codes for it to work best it is recommended that you instead create multiple scenario setting files. For example, one for small eggs, one for large eggs and one for ping pong balls. +Although you can easily modify the beginning of each G-Code file with the correct M301 through M312 codes for it to work best it is recommended that you instead create multiple scenario setting files. For example, one for small eggs, one for large eggs and one for ping pong balls specific to old SphereBot files with Mxxx commands or newer InkScape files with Z parameters. The M999 command is for debugging and can be useful when determining things like pen up/down settings, feed rates and G-Code interpretation behavior. This code is optionally configured in the configuration.h file and it should be noted that in an Arduino Uno configuration the code consumes a large portion of dynamic memory. -For those wanting to try their hand at generating G-Code for the SphereBot there is a solution. InkScape v1.0 comes prepackages with the Gcodetools extension. I go into the process of converting a drawing into a line drawing and then G-Code using this extension elsewhere in the documentation. +For those wanting to try their hand at generating G-Code for the SphereBot there is a solution. InkScape v1.0 comes prepackages with the Gcodetools extension. I go into the process of converting a drawing into a line drawing and then G-Code using this extension in the ```Inkscape.md``` documentation. ## References