Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 120 → Rev 121

/PIC Stuff/PIC_27J13/buffer.h
File deleted
\ No newline at end of file
/PIC Stuff/PIC_27J13/buffer.c
File deleted
/PIC Stuff/PIC_27J13/led_driver.h
File deleted
\ No newline at end of file
/PIC Stuff/PIC_27J13/led_driver.c
File deleted
\ No newline at end of file
/PIC Stuff/PIC_27J13/18f27j13.lkr
0,0 → 1,79
// File: 18f27j13_g.lkr
// Generic linker script for the PIC18F27J13 processor
 
#DEFINE _CODEEND _DEBUGCODESTART - 1
#DEFINE _CEND _CODEEND + _DEBUGCODELEN
#DEFINE _DATAEND _DEBUGDATASTART - 1
#DEFINE _DEND _DATAEND + _DEBUGDATALEN
 
LIBPATH .
 
#IFDEF _CRUNTIME
#IFDEF _EXTENDEDMODE
FILES c018i_e.o
FILES clib_e.lib
FILES p18f27j13_e.lib
 
#ELSE
FILES c018i.o
FILES clib.lib
FILES p18f27j13.lib
#FI
 
#FI
 
#IFDEF _DEBUGCODESTART
CODEPAGE NAME=page START=0x0 END=_CODEEND
CODEPAGE NAME=debug START=_DEBUGCODESTART END=_CEND PROTECTED
#ELSE
CODEPAGE NAME=page START=0x0 END=0x1FFF7
#FI
 
CODEPAGE NAME=config START=0x1FFF8 END=0x1FFFF PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
 
#IFDEF _EXTENDEDMODE
DATABANK NAME=gpre START=0x0 END=0x5F
#ELSE
ACCESSBANK NAME=accessram START=0x0 END=0x5F
#FI
 
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=gpr4 START=0x400 END=0x4FF
DATABANK NAME=gpr5 START=0x500 END=0x5FF
DATABANK NAME=gpr6 START=0x600 END=0x6FF
DATABANK NAME=gpr7 START=0x700 END=0x7FF
DATABANK NAME=gpr8 START=0x800 END=0x8FF
 
//DATABANK NAME=gpr9 START=0x900 END=0x9FF
//DATABANK NAME=gpr10 START=0xA00 END=0xAFF
//DATABANK NAME=gpr11 START=0xB00 END=0xBFF
//DATABANK NAME=gpr12 START=0xC00 END=0xCFF
 
// Large (1024b) buffer allocated in RAM for LCD (replaces gpr9-12)
DATABANK NAME=LCD_BUFFER START=0x900 END=0xCFF
SECTION NAME=LCD_BUFFER RAM=LCD_BUFFER
 
#IFDEF _DEBUGDATASTART
DATABANK NAME=gpr13 START=0xD00 END=_DATAEND
DATABANK NAME=dbgspr START=_DEBUGDATASTART END=_DEND PROTECTED
#ELSE //no debug
DATABANK NAME=gpr13 START=0xD00 END=0xDFF
#FI
 
DATABANK NAME=gpr14 START=0xE00 END=0xEAF
DATABANK NAME=sfr14 START=0xEB0 END=0xEFF PROTECTED
DATABANK NAME=sfr15 START=0xF00 END=0xF5F PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
 
#IFDEF _CRUNTIME
SECTION NAME=CONFIG ROM=config
#IFDEF _DEBUGDATASTART
STACK SIZE=0x100 RAM=gpr12
#ELSE
STACK SIZE=0x100 RAM=gpr13
#FI
#FI
/PIC Stuff/PIC_27J13/Adafruit_GFX.c
0,0 → 1,509
#include "maindefs.h"
#include "Adafruit_GFX.h"
#include "glcdfont.c"
#include "oled_ssd1306.h"
#include "oled_ssd1331.h"
#include <string.h>
#include <stdio.h>
 
static GFX_DATA gfx_data;
 
void GFX_Init(int w, int h) {
gfx_data._width = gfx_data.WIDTH = w;
gfx_data._height = gfx_data.HEIGHT = h;
gfx_data.rotation = 0;
gfx_data.cursor_x = gfx_data.cursor_y = 0;
gfx_data.textsize = 1;
gfx_data.textcolor = gfx_data.textbgcolor = 0xFFFF;
gfx_data.wrap = 1;
}
 
int GFX_Abs(int i) {
if (i < 0)
return -i;
else
return i;
}
 
void GFX_Swap(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
 
void GFX_drawLine(int x0, int y0, int x1, int y1, unsigned int color) {
#ifdef GFX_SSD1306
int dx, dy, err, ystep;
int steep = GFX_Abs(y1 - y0) > GFX_Abs(x1 - x0);
if (steep) {
GFX_Swap(&x0, &y0);
GFX_Swap(&x1, &y1);
}
 
if (x0 > x1) {
GFX_Swap(&x0, &x1);
GFX_Swap(&y0, &y1);
}
 
dx = x1 - x0;
dy = GFX_Abs(y1 - y0);
 
err = dx / 2;
 
if (y0 < y1) {
ystep = 1;
} else {
ystep = -1;
}
 
for (; x0 <= x1; x0++) {
 
if (steep) {
SSD1306_Draw_Pixel(y0, x0, color);
} else {
SSD1306_Draw_Pixel(x0, y0, color);
}
err -= dy;
if (err < 0) {
y0 += ystep;
err += dx;
}
}
#endif
#ifdef GFX_SSD1331
SSD1331_Draw_Line(x0, y0, x1, y1, color);
#endif
}
 
void GFX_drawFastVLine(int x, int y, int h, unsigned int color) {
GFX_drawLine(x, y, x, y + h - 1, color);
}
 
void GFX_drawFastHLine(int x, int y, int w, unsigned int color) {
GFX_drawLine(x, y, x + w - 1, y, color);
}
 
void GFX_drawRect(int x, int y, int w, int h, unsigned int color) {
#ifdef GFX_SSD1306
GFX_drawFastHLine(x, y, w, color);
GFX_drawFastHLine(x, y + h, w, color);
GFX_drawFastVLine(x, y, h, color);
GFX_drawFastVLine(x + w, y, h, color);
#endif
#ifdef GFX_SSD1331
SSD1331_Draw_Rect(x, y, x + w, y + h, color);
#endif
}
 
void GFX_fillRect(int x, int y, int w, int h, unsigned int color) {
#ifdef GFX_SSD1306
int i;
for (i = x; i < x + w; i++) {
GFX_drawFastVLine(i, y, h, color);
}
#endif
#ifdef GFX_SSD1331
SSD1331_Fill_Rect(x, y, x + w, y + h, color);
#endif
}
 
void GFX_fillScreen(unsigned int color) {
GFX_fillRect(0, 0, gfx_data._width, gfx_data._height, color);
}
 
void GFX_clearScreen() {
#ifdef GFX_SSD1306
GFX_fillScreen(SSD1306_BLACK);
#endif
#ifdef GFX_SSD1331
SSD1331_Clear_Display();
#endif
}
 
void GFX_drawCircle(int x0, int y0, int r, unsigned int color) {
int f = 1 - r;
int ddF_x = 1;
int ddF_y = -2 * r;
int x = 0;
int y = r;
 
#ifdef GFX_SSD1306
SSD1306_Draw_Pixel(x0, y0 + r, color);
SSD1306_Draw_Pixel(x0, y0 - r, color);
SSD1306_Draw_Pixel(x0 + r, y0, color);
SSD1306_Draw_Pixel(x0 - r, y0, color);
#endif
#ifdef GFX_SSD1331
SSD1331_Draw_Pixel(x0, y0 + r, color);
SSD1331_Draw_Pixel(x0, y0 - r, color);
SSD1331_Draw_Pixel(x0 + r, y0, color);
SSD1331_Draw_Pixel(x0 - r, y0, color);
#endif
 
while (x < y) {
if (f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
 
#ifdef GFX_SSD1306
SSD1306_Draw_Pixel(x0 + x, y0 + y, color);
SSD1306_Draw_Pixel(x0 - x, y0 + y, color);
SSD1306_Draw_Pixel(x0 + x, y0 - y, color);
SSD1306_Draw_Pixel(x0 - x, y0 - y, color);
SSD1306_Draw_Pixel(x0 + y, y0 + x, color);
SSD1306_Draw_Pixel(x0 - y, y0 + x, color);
SSD1306_Draw_Pixel(x0 + y, y0 - x, color);
SSD1306_Draw_Pixel(x0 - y, y0 - x, color);
#endif
#ifdef GFX_SSD1331
SSD1331_Draw_Pixel(x0 + x, y0 + y, color);
SSD1331_Draw_Pixel(x0 - x, y0 + y, color);
SSD1331_Draw_Pixel(x0 + x, y0 - y, color);
SSD1331_Draw_Pixel(x0 - x, y0 - y, color);
SSD1331_Draw_Pixel(x0 + y, y0 + x, color);
SSD1331_Draw_Pixel(x0 - y, y0 + x, color);
SSD1331_Draw_Pixel(x0 + y, y0 - x, color);
SSD1331_Draw_Pixel(x0 - y, y0 - x, color);
#endif
}
}
 
void GFX_drawCircleHelper(int x0, int y0, int r, unsigned char cornername, unsigned int color) {
int f = 1 - r;
int ddF_x = 1;
int ddF_y = -2 * r;
int x = 0;
int y = r;
 
while (x < y) {
if (f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
#ifdef GFX_SSD1306
if (cornername & 0x4) {
SSD1306_Draw_Pixel(x0 + x, y0 + y, color);
SSD1306_Draw_Pixel(x0 + y, y0 + x, color);
}
if (cornername & 0x2) {
SSD1306_Draw_Pixel(x0 + x, y0 - y, color);
SSD1306_Draw_Pixel(x0 + y, y0 - x, color);
}
if (cornername & 0x8) {
SSD1306_Draw_Pixel(x0 - y, y0 + x, color);
SSD1306_Draw_Pixel(x0 - x, y0 + y, color);
}
if (cornername & 0x1) {
SSD1306_Draw_Pixel(x0 - y, y0 - x, color);
SSD1306_Draw_Pixel(x0 - x, y0 - y, color);
}
#endif
#ifdef GFX_SSD1331
if (cornername & 0x4) {
SSD1331_Draw_Pixel(x0 + x, y0 + y, color);
SSD1331_Draw_Pixel(x0 + y, y0 + x, color);
}
if (cornername & 0x2) {
SSD1331_Draw_Pixel(x0 + x, y0 - y, color);
SSD1331_Draw_Pixel(x0 + y, y0 - x, color);
}
if (cornername & 0x8) {
SSD1331_Draw_Pixel(x0 - y, y0 + x, color);
SSD1331_Draw_Pixel(x0 - x, y0 + y, color);
}
if (cornername & 0x1) {
SSD1331_Draw_Pixel(x0 - y, y0 - x, color);
SSD1331_Draw_Pixel(x0 - x, y0 - y, color);
}
#endif
}
}
 
void GFX_fillCircle(int x0, int y0, int r, unsigned int color) {
GFX_drawFastVLine(x0, y0 - r, 2 * r + 1, color);
GFX_fillCircleHelper(x0, y0, r, 3, 0, color);
}
 
void GFX_fillCircleHelper(int x0, int y0, int r, unsigned char cornername, int delta, unsigned int color) {
int f = 1 - r;
int ddF_x = 1;
int ddF_y = -2 * r;
int x = 0;
int y = r;
 
while (x < y) {
if (f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
 
if (cornername & 0x1) {
GFX_drawFastVLine(x0 + x, y0 - y, 2 * y + 1 + delta, color);
GFX_drawFastVLine(x0 + y, y0 - x, 2 * x + 1 + delta, color);
}
if (cornername & 0x2) {
GFX_drawFastVLine(x0 - x, y0 - y, 2 * y + 1 + delta, color);
GFX_drawFastVLine(x0 - y, y0 - x, 2 * x + 1 + delta, color);
}
}
}
 
void GFX_drawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color) {
GFX_drawLine(x0, y0, x1, y1, color);
GFX_drawLine(x1, y1, x2, y2, color);
GFX_drawLine(x2, y2, x0, y0, color);
}
 
void GFX_fillTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color) {
int a, b, y, last;
int dx01 = x1 - x0;
int dy01 = y1 - y0;
int dx02 = x2 - x0;
int dy02 = y2 - y0;
int dx12 = x2 - x1;
int dy12 = y2 - y1;
int sa = 0;
int sb = 0;
 
// Sort coordinates by Y order (y2 >= y1 >= y0)
if (y0 > y1) {
GFX_Swap(&y0, &y1);
GFX_Swap(&x0, &x1);
}
if (y1 > y2) {
GFX_Swap(&y2, &y1);
GFX_Swap(&x2, &x1);
}
if (y0 > y1) {
GFX_Swap(&y0, &y1);
GFX_Swap(&x0, &x1);
}
 
if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing
a = b = x0;
if (x1 < a) a = x1;
else if (x1 > b) b = x1;
if (x2 < a) a = x2;
else if (x2 > b) b = x2;
GFX_drawFastHLine(a, y0, b - a + 1, color);
return;
}
 
// For upper part of triangle, find scanline crossings for segments
// 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
// is included here (and second loop will be skipped, avoiding a /0
// error there), otherwise scanline y1 is skipped here and handled
// in the second loop...which also avoids a /0 error here if y0=y1
// (flat-topped triangle).
if (y1 == y2) last = y1; // Include y1 scanline
else last = y1 - 1; // Skip it
 
for (y = y0; y <= last; y++) {
a = x0 + sa / dy01;
b = x0 + sb / dy02;
sa += dx01;
sb += dx02;
/* longhand:
a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
*/
if (a > b) GFX_Swap(&a, &b);
GFX_drawFastHLine(a, y, b - a + 1, color);
}
 
// For lower part of triangle, find scanline crossings for segments
// 0-2 and 1-2. This loop is skipped if y1=y2.
sa = dx12 * (y - y1);
sb = dx02 * (y - y0);
for (; y <= y2; y++) {
a = x1 + sa / dy12;
b = x0 + sb / dy02;
sa += dx12;
sb += dx02;
/* longhand:
a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
*/
if (a > b) GFX_Swap(&a, &b);
GFX_drawFastHLine(a, y, b - a + 1, color);
}
}
 
void GFX_drawRoundRect(int x, int y, int w, int h, int r, unsigned int color) {
// smarter version
GFX_drawFastHLine(x + r, y, w - 2 * r, color); // Top
GFX_drawFastHLine(x + r, y + h - 1, w - 2 * r, color); // Bottom
GFX_drawFastVLine(x, y + r, h - 2 * r, color); // Left
GFX_drawFastVLine(x + w - 1, y + r, h - 2 * r, color); // Right
 
// draw four corners
GFX_drawCircleHelper(x + r, y + r, r, 1, color);
GFX_drawCircleHelper(x + w - r - 1, y + r, r, 2, color);
GFX_drawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color);
GFX_drawCircleHelper(x + r, y + h - r - 1, r, 8, color);
}
 
void GFX_fillRoundRect(int x, int y, int w, int h, int r, unsigned int color) {
// smarter version
GFX_fillRect(x + r, y, w - 2 * r, h, color);
 
// draw four corners
GFX_fillCircleHelper(x + w - r - 1, y + r, r, 1, h - 2 * r - 1, color);
GFX_fillCircleHelper(x + r, y + r, r, 2, h - 2 * r - 1, color);
}
 
void GFX_drawBitmap(int x, int y, const unsigned char* bitmap, int w, int h, unsigned int color) {
int i, j;
for (j = 0; j < h; j++) {
for (i = 0; i < w; i++) {
if (bitmap[i + (j / 8) * w] & (j % 8)) {
#ifdef GFX_SSD1306
SSD1306_Draw_Pixel(x + i, y + j, color);
#endif
#ifdef GFX_SSD1331
SSD1331_Draw_Pixel(x + i, y + j, color);
#endif
}
}
}
}
 
void GFX_drawChar(int x, int y, unsigned char c, unsigned int color, unsigned int bg, unsigned char size) {
int i, j;
unsigned int line;
 
if ((x >= gfx_data._width) || // Clip right
(y >= gfx_data._height) || // Clip bottom
((x + 5 * size - 1) < 0) || // Clip left
((y + 8 * size - 1) < 0)) // Clip top
return;
 
for (i = 0; i < 6; i++) {
if (i == 5)
line = 0x0;
else
line = font[(c * 5) + i];
for (j = 0; j < 8; j++) {
if (line & 0x1) {
if (size == 1) {// default size
#ifdef GFX_SSD1306
SSD1306_Draw_Pixel(x + i, y + j, color);
#endif
#ifdef GFX_SSD1331
SSD1331_Draw_Pixel(x + i, y + j, color);
#endif
} else { // big size
GFX_fillRect(x + (i * size), y + (j * size), size, size, color);
}
} else if (bg != color) {
if (size == 1) { // default size
#ifdef GFX_SSD1306
SSD1306_Draw_Pixel(x + i, y + j, bg);
#endif
#ifdef GFX_SSD1331
SSD1331_Draw_Pixel(x + i, y + j, bg);
#endif
} else { // big size
GFX_fillRect(x + i*size, y + j*size, size, size, bg);
}
}
line >>= 1;
}
}
}
 
void GFX_write(unsigned char c) {
if (c == '\n') {
gfx_data.cursor_y += gfx_data.textsize * 8;
gfx_data.cursor_x = 0;
} else if (c == '\r') {
// skip em
} else {
GFX_drawChar(gfx_data.cursor_x, gfx_data.cursor_y, c, gfx_data.textcolor, gfx_data.textbgcolor, gfx_data.textsize);
gfx_data.cursor_x += gfx_data.textsize * 6;
if (gfx_data.wrap && (gfx_data.cursor_x > (gfx_data._width - gfx_data.textsize * 6))) {
gfx_data.cursor_y += gfx_data.textsize * 8;
gfx_data.cursor_x = 0;
}
}
}
 
void GFX_writeString(const rom char *fmt, ...) {
unsigned char i, len;
va_list args;
va_start(args, fmt);
vsprintf((char *) gfx_data.buffer, fmt, args);
va_end(args);
len = strlen((char *) gfx_data.buffer);
for (i = 0; i < len; i++) {
GFX_write(gfx_data.buffer[i]);
}
}
 
void GFX_setCursor(int x, int y) {
gfx_data.cursor_x = x;
gfx_data.cursor_y = y;
}
 
void GFX_setTextColor(unsigned int c) {
// for 'transparent' background, we'll set the bg
// to the same as fg instead of using a flag
gfx_data.textcolor = c;
gfx_data.textbgcolor = c;
}
 
void GFX_setTextColorBG(unsigned int c, unsigned int bg) {
gfx_data.textcolor = c;
gfx_data.textbgcolor = bg;
}
 
void GFX_setTextSize(unsigned char s) {
gfx_data.textsize = (s > 0) ? s : 1;
}
 
void GFX_setTextWrap(unsigned char w) {
gfx_data.wrap = w;
}
 
void GFX_setRotation(unsigned char x) {
x %= 4; // cant be higher than 3
gfx_data.rotation = x;
switch (x) {
case 0:
case 2:
gfx_data._width = gfx_data.WIDTH;
gfx_data._height = gfx_data.HEIGHT;
break;
case 1:
case 3:
gfx_data._width = gfx_data.HEIGHT;
gfx_data._height = gfx_data.WIDTH;
break;
}
}
 
unsigned char GFX_getRotation() {
gfx_data.rotation %= 4;
return gfx_data.rotation;
}
 
int GFX_height() {
return gfx_data._height;
}
 
int GFX_width() {
return gfx_data._width;
}
/PIC Stuff/PIC_27J13/Adafruit_GFX.h
0,0 → 1,58
#ifndef ADAFRUIT_GFX_H
#define ADAFRUIT_GFX_H
 
#define GFX_STRING_BUFFER_SIZE 150
 
typedef struct __GFX_DATA {
unsigned char buffer[GFX_STRING_BUFFER_SIZE];
int WIDTH, HEIGHT; // raw display size
int _width, _height; // size depending on rotation
int cursor_x, cursor_y;
unsigned int textcolor, textbgcolor;
unsigned char textsize;
unsigned char rotation;
unsigned char wrap; // If set, wrap text at right side
} GFX_DATA;
 
int GFX_Abs(int i);
void GFX_Swap(int *a, int *b);
 
void GFX_Init(int w, int h);
void GFX_drawLine(int x0, int y0, int x1, int y1, unsigned int color);
void GFX_drawFastVLine(int x, int y, int h, unsigned int color);
void GFX_drawFastHLine(int x, int y, int w, unsigned int color);
void GFX_drawRect(int x, int y, int w, int h, unsigned int color);
void GFX_fillRect(int x, int y, int w, int h, unsigned int color);
void GFX_fillScreen(unsigned int color);
void GFX_clearScreen(void);
 
void GFX_drawCircle(int x0, int y0, int r, unsigned int color);
void GFX_drawCircleHelper(int x0, int y0, int r, unsigned char cornername, unsigned int color);
void GFX_fillCircle(int x0, int y0, int r, unsigned int color);
void GFX_fillCircleHelper(int x0, int y0, int r, unsigned char cornername, int delta, unsigned int color);
 
void GFX_drawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color);
void GFX_fillTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color);
void GFX_drawRoundRect(int x0, int y0, int w, int h, int radius, unsigned int color);
void GFX_fillRoundRect(int x0, int y0, int w, int h, int radius, unsigned int color);
 
void GFX_drawBitmap(int x, int y, const unsigned char *bitmap, int w, int h, unsigned int color);
void GFX_drawChar(int x, int y, unsigned char c, unsigned int color, unsigned int bg, unsigned char size);
 
void GFX_write(unsigned char c);
void GFX_writeString(const rom char *fmt, ...);
 
void GFX_setCursor(int x, int y);
void GFX_setTextColor(unsigned int c);
void GFX_setTextColorBG(unsigned int c, unsigned int bg);
void GFX_setTextSize(unsigned char s);
void GFX_setTextWrap(unsigned char w);
 
void GFX_setRotation(unsigned char r);
unsigned char GFX_getRotation(void);
 
int GFX_height(void);
int GFX_width(void);
 
#endif /* ADAFRUIT_GFX_H */
 
/PIC Stuff/PIC_27J13/adc.c
1,5 → 1,3
#include "maindefs.h"
#include "msg_queues.h"
#include "adc.h"
#include <adc.h>
 
/PIC Stuff/PIC_27J13/build/default/production/Adafruit_GFX.o.d
0,0 → 1,14
build/default/production/Adafruit_GFX.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/glcdfont.c \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
 
/PIC Stuff/PIC_27J13/build/default/production/glcdfont.o.d
0,0 → 1,3
build/default/production/glcdfont.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/glcdfont.c \
 
/PIC Stuff/PIC_27J13/build/default/production/i2c.o.d
0,0 → 1,10
build/default/production/i2c.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
 
/PIC Stuff/PIC_27J13/build/default/production/interrupts.o.d
3,6 → 3,7
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
/PIC Stuff/PIC_27J13/build/default/production/led_backpack.o.d
0,0 → 1,5
build/default/production/led_backpack.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/led_backpack.c \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/led_backpack.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \
 
/PIC Stuff/PIC_27J13/build/default/production/main.o.d
2,9 → 2,16
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/main.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/nfc.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/led_backpack.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/usart.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
/PIC Stuff/PIC_27J13/build/default/production/nfc.o.d
0,0 → 1,14
build/default/production/nfc.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/nfc.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/nfc.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/PIC Stuff/PIC_27J13/build/default/production/oled_ssd1306.o.d
0,0 → 1,15
build/default/production/oled_ssd1306.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/PIC Stuff/PIC_27J13/build/default/production/oled_ssd1331.o.d
0,0 → 1,15
build/default/production/oled_ssd1331.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/PIC Stuff/PIC_27J13/build/default/production/spi.o.d
0,0 → 1,10
build/default/production/spi.o : \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
 
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.hex
1,520 → 1,2852
:020000040000FA
:0600000056EF0FF01200A4
:020006000000F8
:060008003DEF0CF01200B8
:060000008CEF57F0120026
:020006001200E6
:060008007BEF53F0120033
:02000E001200DE
:020010001200DC
:06001800B4EF0CF0120031
:02001E004BECA9
:1000200005F0FB0EDBCFF3FFDB06F35000090AE01F
:1000300099EC05F0FA0E04EC06F0F3E1151CF1E181
:10004000010E01D0000E7AEF05F04BEC05F03B0EEF
:10005000E12402E3E168E652E16E010EDB6A020E82
:10006000DB6AF90EDBCFF6FFFA0EDBCFF7FFFB0EF4
:10007000DBCFF8FF0800F550DF6EDF5002E19EEFA6
:1000800004F0250EDF5C02E091EF04F0030EDB6A62
:10009000040EDB6A050EDB6A060EDB6A070EDB6AFE
:1000A000B3EC04F02D0EDF5C0CE02B0EDF5C09E0FE
:1000B000200EDF5C06E0230EDF5C03E0300EDF5C29
:1000C0001AE1DF50300A14E0130A0FE0030A0AE0D5
:1000D0000B0A05E0060AE4E1030EDB80E1D7030E1C
:1000E000DB82DED7030EDB84DBD7030EDB86D8D7BB
:1000F000030EDB88D5D72A0EDF5C1BE1AFEC04F0E2
:10010000FDEC04F010E0030EDB8008680968130EB4
:10011000DBCF0DF0140EDBCF0EF0BFEC0EF0040EB3
:1001200006C0DBFF03D0130EE6EC04F0B3EC04F0E2
:100130000BD0090EDB6A54EC05F003E0C8EC05F0C7
:10014000FAD7090EE6EC04F0030EDBB0DB982E0EB6
:10015000DF5C1BE1B3EC04F02A0EDF5C0BE1AFECDB
:1001600004F0FDEC04F003E1130E38EC05F0B3EC01
:1001700004F00BD0090EDB6A54EC05F003E0C8EC88
:1001800005F0FAD7090E38EC05F0680EDF5C07E1E0
:10019000B3EC04F0680EDF5C1DE1030E18D0740EA2
:1001A000DF5C17E07A0EDF5C14E0480EDF5C06E0EF
:1001B000540EDF5C03E05A0EDF5C02E1020E07D052
:1001C0006C0EDF5C03E06A0EDF5C04E1010E8BEC79
:1001D00005F0C9DBDF506E0A01E17FD31E0A01E1A1
:1001E00092D1200A01E18FD13F0A01E149D11A0AD7
:1001F00001E146D10D0A01E143D1200A01E140D1DC
:100200003A0A01E13DD1200A01E13AD1260A01E191
:1002100035D10D0A01E132D11A0A01E1D9D0200A03
:100220004AE0300A1FE0460A0EE0250A01E083D3C7
:10023000D950F90FE96EFF0EDA20EA6E010EEE5E7C
:10024000000EEE5AEE5A99EC05F0250EE66E95DB9F
:1002500003E1151C01E169D395EC05F001E26BD3D4
:10026000DB2A69D3080EDB6A040EDB50010806E2C4
:10027000040EDB045DEC05F0DB508BDB080EDB507D
:1002800009E0030EDB50010B05E172DB01E04DD309
:10029000080EDB6A64DBEFCFDFFF0DEC06F003E155
:1002A000151C01E142D395EC05F001E3DB2A60DB8C
:1002B00001E141D33AD3070EDB5002080FE1D9EC3C
:1002C00005F0030EA0EC05F00E0EEECFDBFF0F0ED7
:1002D000EECFDBFF100EEECFDBFF20D0F70EDBCF33
:1002E00017F0F80EDBCF18F0020E175E000E185A4A
:1002F000F70E17C0DBFFF80E18C0DBFF17C0E9FFD1
:1003000018C0EAFF90EC05F0166A0E0E14C0DBFF71
:100310000F0E15C0DBFF100E16C0DBFF0E0EDBCF7D
:10032000E6FF0F0EDBCFE6FF100EDBCFE6FF9AEC09
:100330000EF0E552E552E552130E07C0DBFF140E36
:1003400008C0DBFF060EDB5005E0130ED4EC05F011
:1003500001E26ADBF8EC05F002E2130E37DBBBECDE
:1003600005F006E0040ED4EC05F002E2050E2EDBEB
:10037000030EDBB005D0FCDA01E0D7D2080EDB6A51
:10038000090EDB6A0E0EDBCFF6FF0F0EDBCFF7FF99
:10039000100EDBCFF8FF0800F550DF6EDF5014E0E1
:1003A000FEEC05F011E20DEC06F003E1151C01E195
:1003B000BCD2BBDB01E3DB2A090EDB2AD9500E0FCE
:1003C000E96E000ECBDBE7D7D3DA01E1B4D2ADD2D0
:1003D000C6DA110EEECFDBFF120EEDCFDBFF110EF2
:1003E000DBCFE6FF120EDBCFE6FF8CEC0EF0E55222
:1003F000E552130EF3CFDBFF140EF4CFDBFF060E36
:10040000DB5004E0130ED0DB01E20EDBF8EC05F06C
:1004100002E2130EDBDAAFDB05E0040EC5DB02E21D
:10042000050ED4DA030EDBB005D0A2DA01E07DD2EE
:10043000080EDB6A090EDB6A110EDBCFE9FF120E34
:10044000DBCFEAFFEFCFDFFFDF5014E0D7DB12E2B4
:10045000E4DB03E1151C01E168D267DB01E3DB2A81
:10046000090EDB2A110EDB2ADBCFE9FF120EE8E3CF
:10047000DB2AE6D77DDA01E15ED257D2030EDB8EAE
:10048000070EDB0410E195DB040E5ADB0A0EEECFFB
:10049000DBFF0B0EEECFDBFF0C0EEECFDBFF0D0E06
:1004A000EECFDBFF6CD0070EDB5003082CE1030E10
:1004B000DBAE0DD0B2DA020E76DAEFCF14F0156AA9
:1004C000166A176A14AE39D01568166835D0F70E5B
:1004D000DBCF15F0F80EDBCF16F0020E155E000E26
:1004E000165AF70E15C0DBFFF80E16C0DBFF15C05D
:1004F000E9FF16C0EAFFEFCF14F00A0E14C0DBFFCD
:100500000B0EDB6A38D0070EDB50020809E1030E40
:10051000DBAE04D059DB16AE10D00ED055DB0DD0BB
:10052000030EDBAE12D079DA020E3DDAF9DA166A82
:10053000176A15AE02D016681768E2DA0C0E16C0FC
:10054000DBFF0D0E17C0DBFF1AD0F70EDBCF16F066
:10055000F80EDBCF17F0020E165E000E175AF70EDC
:1005600016C0DBFFF80E17C0DBFF16C0E9FF17C08F
:10057000EAFFD6DAC5DA0C0EDB6A0D0EDB6A060E70
:10058000DB5005E1010EF36E050EF3CFDBFF150E18
:10059000DB6A160EDB6AD950370F146E000EDA20B4
:1005A000156E390E14C0DBFF3A0E15C0DBFF380E96
:1005B000DB6A080EDB6A0A0EAEDADF50780A12E058
:1005C000200A10E0280A0CE0200A0AE03F0A06E0B0
:1005D0000D0A02E0200A08E1020E05D0080E03D041
:1005E000080EDF26100E97DA030EDBBE02D0DB9278
:1005F000DB94DB50800B24E08ADAD890030EEB50BA
:10060000000A08E6000EEE5C000EEE58000EEE58F2
:10061000000EEE5815E213DA0B680C680D680E68D0
:1006200054EC0EF00A0E02C0DBFF0B0E03C0DBFF22
:100630000C0E04C0DBFF0D0E05C0DBFF2D0E08D035
:10064000030EDBA202D02B0E03D0DBA408D0200EB9
:10065000F36E170EF3CFDBFF150EDB2A02D0170E59
:10066000DB6A050EDB5003E1B7D901E189D0E40E66
:10067000146E1E0E156E000E166E070EDBCF17F0F1
:10068000186A196A1A6A17C00BF018C00CF019C062
:100690000DF01AC00EF0D3D9ECEC0EF01450022479
:1006A000F36E15500320F46E16500420F86EF4CF4C
:1006B000F7FFF3CFF6FF0800090EF5CFDBFF580E6A
:1006C000DF5C0FE1610EF36E090E7BD90AE3200EA9
:1006D000146E090EDBCFE7FF1450E75E090EE7CF7B
:1006E000DBFF070EDBCF14F0156A166A176A0FDA04
:1006F00014C00BF015C00CF016C00DF017C00EF0B2
:10070000EECF06F0EECF07F0EECF08F0EFCF09F016
:10071000ECEC0EF009C0EDFF08C0EDFF07C0EDFFE7
:1007200006C0EFFF390EDBCFE9FFDB063A0EDBCF69
:10073000EAFF01E2DB06090EDBCFEFFF150EDB2A35
:100740004BD995E1030EDBA61DD06F0EDF5C06E1F1
:10075000C1D918E3150EDB285BDA14D0780EDF5C04
:1007600009E0580EDF5C06E0620EDF5C03E0420E3B
:10077000DF5C08E1020EF36E160EF3CFDBFF02D052
:10078000150EDB6A030EDB50100B0EE0040EDBCF00
:1007900014F0050EDB50D880145406E2060EDB5030
:1007A00003E1040EDB5034DA95D90AE2050EDBCF03
:1007B000E7FF150EDB50E75E050EE7CFDBFF02D04B
:1007C000050EDB6A040EDBCF14F0160E45D9D88077
:1007D000145414E2160EDBCFE6FF150EDBCFE6FF56
:1007E000040EDBCFE6FF050EDB50E552E75CE55279
:1007F000D880E754E552D880E7545FD9030EDB5028
:10080000010B0BE1080EDB5008E0B2D801E08DD0FF
:10081000080EDB50BED8080EDB6A170EDB5007E06F
:1008200088D9170EF1D903E1151C01E17ED0160E0F
:10083000DB5016E07ED9300EE66E9FD802E1151C23
:1008400074E077D9DFCFE6FF12EC0EF0E552E55207
:10085000E552F4CF15F00001F31C02E1151C65E030
:10086000050EDBCF14F0160EDB50D880145409E2CD
:10087000050EDBCFE7FF160EDB50E75E050EE7CF78
:10088000DBFF300EE66E050ECBD94FE1390EDB2AC9
:10089000DBCFE9FF3A0E01E3DB2ADBCFEAFF090EEB
:1008A000EFCFDBFFDB500EE044D9090EADD902E1FA
:1008B000151C3BE0390EDB2ADBCFE9FF3A0EEDE3F6
:1008C000DB2AEBD755D831E1160EDBCFE6FF080E59
:1008D000C3D8E552E7245DD82ED0070EDB50030ABB
:1008E0001CE0010A14E0030A07E07BD9DBCFEEFF2E
:1008F000020EDBCFEDFF1FD0F5D8196A17AE02D07C
:10090000186819682CD8BCD819C0EEFF14D0EAD8E2
:1009100017BE186824D8B4D80ED063D9DBCFEFFF48
:100920000AD07BD905E1151C03E1F368F46810D007
:10093000FCD801E3DB2A79D93AEF00F0010EDBCFD6
:1009400014F0020EDBCF15F014C0F3FF15C0F4FF56
:100950003B0EE15C02E2E16AE552E16ECBD029D9BF
:10096000020EA0EF05F061D90800F550DF6E12000D
:10097000200EE66E080E10EF06F012EC0EF0E552B7
:10098000E552E552F3CF14F0F4CF15F00001F31C5B
:100990001200146E156AD950010F4DD91450EE266D
:1009A0001550ED221200185E000E195AF70E18C0ED
:1009B000DBFFF80E19C0DBFF18C0E9FF19C0EAFF22
:1009C0001200DBCFF4FFF350F45C1200DB50E76E53
:1009D000040EE7CFDBFF12000A0EDBCF14F00B0E84
:1009E000DBCF15F00C0EDBCF16F00D0EDBCF17F0C2
:1009F00014501510161017101200130EEECFDBFF57
:100A0000140EEDCFDBFF130EDBCF14F0140EDBCF93
:100A100015F00001800E15141200F70EDBCF18F050
:100A2000F80EDBCF19F01200050EDB50E66ED95040
:100A3000130F01D9E552E750EE6EED6A12000A0E6F
:100A4000DBCF06F00B0EDBCF07F00C0EDBCF08F090
:100A50000D0EDBCF09F01200DBCFE6FF150EDBCF6A
:100A6000E6FF050EDB50E552E724E552E7241200CD
:100A7000DB50CED8010EF36E060EF3CFDBFF120073
:100A8000EE50EFCFEAFFE96E16C0EEFF17C0EEFFA3
:100A900018C0EEFF1200D9CFE6FFDACFE6FFE1CFB4
:100AA000D9FFE2CFDAFF1200DFCFE6FFE66A34ECCF
:100AB0000FF0E552E552F3501200E76E080EE7CF53
:100AC000DBFF1200EECF14F0EECF15F0EFCF16F0F3
:100AD000176A1200050EDBCF14F0150EDB50D8801C
:100AE00014541200010EDBCF16F0020EDBCF17F00C
:100AF000186A1200E552E5CFDAFFE7CFD9FF1200FE
:100B00000A0E14C0DBFF0B0E15C0DBFF1200D9501C
:100B10000A0F1BEF06F0F36E070EF3CFDBFF120098
:100B2000EECF14F0EFCF15F01200010EDB2A020E0B
:100B30001200FC0EDBCFE6FFFD0EDBCFE6FF12005E
:100B4000145E000E155AF70E14C0DBFFF80E15C028
:100B5000DBFF14C0E9FF15C0EAFF1200DA20EA6EDD
:100B6000EF2AEECFF6FF000EEF22EECFF7FFEF22D7
:100B7000EECFF8FF1200040EDBCFE6FF130EDB50C2
:100B8000E552E75C9ADFDB5004DF060EDB50120013
:100B9000090EDB500A0DF350DF24D00FE76E090E6B
:100BA000E7CFDBFFB3EF04F0DB50F36E050EE1EFB0
:100BB00004F0F70EDBCF14F0F80EDBCF15F01200C7
:100BC000DFCFE6FFBDEF04F028DF030EECDE62EFBF
:100BD00005F00FEC00F0E552E552E552E552000950
:100BE0001200BDDEEE50EFCFEAFFE96E010E1200FB
:100BF000130EDB50F36E040EE1EF04F0040EDB5035
:100C0000F36E090EE1EF04F0DBCFE6FFBDEF04F079
:100C1000E76E050EE7CFDBFF12008BDFE0EF05F09C
:100C2000DBCFE6FF86DFE9EF05F0D950F90FE96E7B
:100C3000FF0EAEEF05F0E96E000EDA20EA6E12004C
:100C40000001A06BA16BA26BA36BE56BE46BE66B81
:100C5000010EE76FE86BEB6BEC6BE96B230EEA6F51
:100C60009D8612000001110EE66F94869488C76A73
:100C7000C66AC56AF00EC6140809C66E770EC86E3D
:100C8000C78EC68A1200D9CFE6FFE1CFD9FFE65260
:100C9000FD0EDB50156AE850151035E0DF6ADF50B5
:100CA000146E156AFD0EDB50000115AE02D0D8900F
:100CB00003D0145C000E155819E2DF50E76EFB0EEE
:100CC000DBCFE9FFFC0EDBCFEAFFE750E926000EA1
:100CD000EA22EF50E66EDF50EA6A600FE96E000E1E
:100CE000EA22E552E750EF6EDF2AD9D7FD0EDB503E
:100CF0000001A06FFE0EDB50E96FA26B050EE76FDF
:100D0000200EEA6FC580E552E552E7CFD9FF120009
:100D1000D9CFE6FFE1CFD9FFFD0EDB50156AE850D1
:100D200015100DE0FD0EDB500001A06FFE0EDB5034
:100D3000E96FA26B050EE76F210EEA6FC580E552E1
:100D4000E7CFD9FF1200D9CFE6FFE1CFD9FFE652B6
:100D5000FC0EDB50146E156AE850151012E1FD0E02
:100D6000DB50DF6ED9CFE6FFDACFE6FF010EE66E8D
:100D7000FE0EDB50E66E87DFE552E552E552E552A6
:100D800010D0FD0EDB500001606FFC0EDB50A06F39
:100D9000FE0EDB50E96FA26B050EE76F220EEA6FC5
:100DA000C580E552E552E7CFD9FF1200D9CFE6FF63
:100DB000E1CFD9FF0001100EE66F94869488FE0EF5
:100DC000DB50146E156AD890143615361450C86E60
:100DD000C76AC66AC56AF00EC6140E09C66EC78E0B
:100DE000C580C68AE552E7CFD9FF12000001E6515F
:100DF000146E156A110E141804E1155002E10BEF80
:100E000007F0E651146E156A100E141803E1155020
:100E100001E188D912000001EA51146E156A200E12
:100E2000141853E1155051E1E751146E156A070E7D
:100E3000141801E1155017E0050E141801E11550C2
:100E400006E0010E141801E115503EE01200070EF5
:100E5000E76FE951146E156AD89014361536000EF6
:100E60001410C96E1200C550400B01E0010E146E43
:100E7000156AE850151021E1A251146E156AA051AF
:100E8000000115AE02D0D89003D0145C000E1558A6
:100E90000BE20001A251EA6A600FE96E000EEA223D
:100EA000EF50C96EA22B12000001010EE76FC5843E
:100EB000230EEA6F300EE86F1200010EE76FC58453
:100EC000230EEA6F310EE86F1200EA51146E156AB4
:100ED000210E141871E115506FE1E751146E156A77
:100EE0000B0E141801E115505FE00A0E141801E111
:100EF000155056E0030E141801E115502DE0080EB0
:100F0000141801E1155017E0050E141801E11550F1
:100F100006E0010E141801E115504DE01200080E14
:100F2000E76FE951146E156AD89014361536010E24
:100F30001410C96E1200C550400B01E0010E146E72
:100F4000156AE85015102CE0010EE76FC584230EDA
:100F5000EA6F330EE86F1200C950E66EA251EA6ADA
:100F6000600FE96E000EEA22E552E750EF6EA22B09
:100F7000A251146E156AA051000115AE02D0D8908E
:100F800003D0145C000E155805E200010A0EE76F4D
:100F9000C59A04D000010B0EE76FC58AC588120000
:100FA000030EE76FC5861200010EE76FC584230E9E
:100FB000EA6F320EE86F1200EA51146E156A220EC3
:100FC000141801E0AED0155001E0ABD0E751146E1B
:100FD000156A0B0E141801E1155001E19BD00A0EA1
:100FE000141801E1155001E191D0030E141801E12C
:100FF000155068E0080E141801E1155052E0060E75
:10100000141801E1155041E0090E141801E11550C2
:1010100028E0070E141801E1155016E0050E14180B
:1010200001E1155007E0010E141801E1155001E12E
:1010300078D01200070EE76FE951146E156AD89048
:1010400014361536000E2AD0C550400B01E0010EB3
:10105000146E156AE850151011E16051C96E090E41
:101060000BD0C550400B01E0010E146E156AE8501C
:10107000151004E1C582060EE76F1200010EE76F3E
:10108000C584230EEA6F310E1BD0080EE76FE951BD
:10109000146E156AD89014361536010E1410C96EE8
:1010A0001200C550400B01E0010E146E156AE850A5
:1010B00015102CE0010EE76FC584230EEA6F330E86
:1010C000E86F1200C950E66EA251EA6A600FE96E3D
:1010D000000EEA22E552E750EF6EA22BA251146EE9
:1010E000156AA051000115AE02D0D89003D0145C4F
:1010F000000E155805E200010A0EE76FC59A04D0EC
:1011000000010B0EE76FC58AC5881200030EE76F5A
:10111000C5861200010EE76FC584230EEA6F320EFA
:10112000E86F1200D9CFE6FFE1CFD9FF040EE12628
:10113000010EDB6A020EDB6A030EDB6AC650400B4F
:1011400001E0010E146E156A010E14180CE1155021
:101150000AE1C69C0001010EE76FF36E030EF3CFA8
:10116000DBFF360EE86FC750010B146E156A010ED7
:10117000141807E1155005E1C950DF6EDE52010E6B
:10118000DD6E030EDB50156AE850151001E005D145
:101190000001E751146E156A030E141801E1155091
:1011A00001E17CD0040E141801E1155044E0020E58
:1011B000141801E1155017E0010E141801E0EDD0EC
:1011C000155001E0EAD0C750080B01E0010E146E83
:1011D000156A010E141801E0E0D0155001E0DDD0D1
:1011E000A16B020E98D0C750100B01E0010E146ED7
:1011F000156A010E141804E1155002E1010E8BD09E
:10120000010EDB50156AE850151001E1C6D0C75039
:10121000200B01E0010E156AE850151001E0B9D06D
:10122000C750040B01E0010E156AE850151001E0EB
:10123000ADD0030E70D0EC51146E156A1450151019
:101240000DE1EB51E66E46D9E552000924E00001BC
:10125000A451C96E010EE56FEC6F18D0E551146E04
:10126000156AE451000115AE02D0D89003D0145C89
:10127000000E155810E20001E551EA6AA40FE96E6C
:10128000000EEA22EF50C96EE52B010EF36E020E3E
:10129000F3CFDBFF82D00001EC6B3CD0C750100BCA
:1012A00001E0010E146E156A010E141836E1155096
:1012B00034E1010EDB50156AE850151029E0C750E3
:1012C000200B01E0010E146E156A010E14181DE1C9
:1012D00015501BE1DF50E66EA351EA6A600FE96E1C
:1012E000000EEA22E552E750EF6EA351146E156A24
:1012F0003F0E141804E1155002E1A36B01D0A32B9B
:10130000A12BDF50EB6F340E02D0010E370EE86FC9
:10131000A151A027010EE76F40D0010EDB50156AE6
:10132000E85015103AE0C750200B01E0010E146E92
:10133000156A010E14181DE115501BE1DF50E66E11
:10134000A351EA6A600FE96E000EEA22E552E75007
:10135000EF6EA351146E156A3F0E141804E1155078
:1013600002E1A36B01D0A32BA12BDF50EB6F340E56
:1013700013D0C750040B01E0010E146E156A010E64
:10138000141807E1155005E1A151A027040EE76FDD
:1013900052D7010EE76F370EE86F010EDB50176A68
:1013A000E850171008E1020EDB50196AE8501910D6
:1013B00002E1000E01D0010E156AE850151009E097
:1013C000C650100B01E0010E156AE850151001E13E
:1013D000C688040EE15C02E2E16AE552E16EE55284
:1013E000E7CFD9FF12000001E651146E156A110E05
:1013F00014181BE1155019E1EA51166E176A230EF5
:1014000016180AE1175008E1A051186E196A185011
:10141000191002E0000E01D0010E146E156AE8509A
:10142000151001E0000CE8511200100EE66FE850B4
:1014300018E0E751166E176A010E16180AE11750E8
:1014400008E1A051186E196A1850191002E0000E38
:1014500001D0010E146E156AE850151001E0000C61
:10146000E8511200D9CFE6FFE1CFD9FFE652DF6A9B
:101470000001A051146E156A1450151025E0A251F8
:10148000EA6A600FE96E000EEA22EF50E66EDF5066
:10149000E76EFD0EDBCFE9FFFE0EDBCFEAFFE75084
:1014A000E926000EEA22E552E750EF6EDF2AA2514C
:1014B000146E156A3F0E141804E1155002E1A26B78
:1014C00001D0A22BA007D4D7DF50E552E552E7CFD9
:1014D000D9FF1200D9CFE6FFE1CFD9FFE652DF6A8C
:1014E000FE0EDB50146E156ABB0E141801E1155088
:1014F0000BE0AA0E141811E115500FE10001410E86
:10150000A46F010EE46F08D00001310EA46F320EFB
:10151000A56F020EE46F010EDF6EDF50E552E5525B
:06152000E7CFD9FF120025
:0A152600949C948E7E96190EB06E10
:10153000AD84AD98AC8EAD9CAC9CAD9AAC889D88CA
:101540009D8A0E01406B416B426B1200D9CFE6FFC2
:10155000E1CFD9FFE6529E50200B01E0010E156A43
:10156000E85015102EE00E014251146E156A3F0E20
:10157000141810E115500EE1AD9A4E0EE66E1E0ED7
:10158000E66E000EE66E5FD8E552E552E552AF50CA
:10159000DF6E17D0AF50E66E4151EA6A000FE96E78
:1015A0000E0EEA22E552E750EF6E4151146E156AB5
:1015B0003F0E141804E1155002E1416B01D0412B9C
:1015C000422BAC50020B01E0010E146E156A010EA5
:1015D00014180FE115500DE1AC98AC88AD9A3D0E92
:1015E000E66E1E0EE66E000EE66E2DD8E552E55252
:1015F000E552E552E552E7CFD9FF12000E018351C3
:10160000146E156A8451166E176A1650141802E18A
:10161000175015180AE08351EA6A430FE96E0E0E5F
:10162000EA22EF50AE6E832B1200AD50020B01E0A8
:10163000010E146E156AE8501510F7E0AD9A0E0110
:10164000836B846B1200D9CFE6FFE1CFD9FF020E86
:10165000E126AD50200B01E0010E156AE85015108F
:10166000F8E1D950FC0F146EFF0EDA20156E14C08D
:10167000DEFFDD6EDECFE6FFDDCFE6FFFC0EDBCF6B
:10168000E6FFFD0EDBCFE6FFFE0EDBCFE6FF430EEF
:10169000E66E0E0EE66ECEEC0DF0146E070EE15EF9
:1016A0001450430EE66E0E0EE66E8CEC0EF0E55214
:1016B000E552F3CF84FE0E01010E836F4351AE6EEF
:1016C000AD8A020EE15C02E2E16AE552E16EE552AA
:1016D000E7CFD9FF1200D9CFE6FFE1CFD9FFE6521D
:1016E000AD50200B01E0010E156AE8501510F8E12D
:1016F000FC0EDB500E01846F010E836FDF6ADF503A
:10170000146E156AFC0EDB50000115AE02D0D890A5
:1017100003D0145C000E155819E2DF50E76EFD0E81
:10172000DBCFE9FFFE0EDBCFEAFFE750E926000E34
:10173000EA22EFCF14F0156ADF50EA6A430FE96E30
:101740000E0EEA2214C0EFFFDF2AD9D70E01435153
:10175000AE6EAD8AE552E552E7CFD9FF1200D9CF80
:10176000E6FFE1CFD9FFE652DF6A0E014251146E67
:10177000156A1450151025E04051EA6A000FE96E11
:101780000E0EEA22EF50E66EDF50E76EFD0EDBCF65
:10179000E9FFFE0EDBCFEAFFE750E926000EEA2262
:1017A000E552E750EF6EDF2A4051146E156A3F0E86
:1017B000141804E1155002E1406B01D0402B4207A0
:0E17C000D4D7DF50E552E552E7CFD9FF120033
:0217CE009F8AF0
:1017D0009F889F861200D08EF28EF28C1200F250FB
:1017E000800B01E0010E176AE850171002E0000EAE
:1017F00001D0010E156AF36E15C0F4FF1200F2500D
:10180000400B01E0010E176AE850171002E0000ECD
:1018100001D0010E156AF36E15C0F4FF1200F250EC
:10182000400B01E0010E146E156A010E141802E15E
:10183000155004E0D4DFF350F41002E0F36A02D054
:10184000010EF36EF46A1200EADFF3CF16F0F4CF64
:1018500017F0F350F41004E1C2DFF350F41002E08B
:10186000000E01D0010E156AE850151003E0010EBC
:10187000F36E01D0F36AF46A1200DACFE4FFE2CF2C
:10188000DAFFE9CFE4FFEACFE4FFF6CFE4FFF7CFDA
:10189000E4FFF8CFE4FFF5CFE4FFF3CFE4FFF4CFAC
:1018A000E4FFFACFE4FFFBCFE4FF00EE00F0140EFC
:1018B000E80403E3EECFE4FFFBD700EE14F0070EDD
:1018C000E80403E3EECFE4FFFBD7E6529E50200B83
:1018D00001E0010E1B6E1C6AE8501C1004E0A6EC2F
:1018E0000AF09E9A19D09E50100B01E0010E1B6E5B
:1018F0001C6AE8501C1004E0FEEC0AF09E980CD024
:101900009E50080B01E0010E1B6E1C6AE8501C1073
:1019100003E0F6EC06F09E96E55200EE1AF0070E94
:10192000E80403E3E5CFEDFFFBD700EE13F0140E60
:10193000E80403E3E5CFEDFFFBD7E5CFFBFFE5CF01
:10194000FAFFE5CFF4FFE5CFF3FFE5CFF5FFE5CFF5
:10195000F8FFE5CFF7FFE5CFF6FFE5CFEAFFE5CFEC
:10196000E9FFE5CFDAFF1100D8CFE4FFE0CFE4FFD5
:10197000E46EDACFE4FFE652E552E5CFDAFFE55058
:0A198000E5CFE0FFE5CFD8FF10002F
:06198A00D9CFE6FFE1CF1A
:10199000D9FF6F0EE126DF6A010EDB6A020EDB6AF9
:1019A000D950030FE96EDACFEAFF410EEE6E530E07
:1019B000EE6E440EEE6E460EEE6E310EEE6E320E92
:1019C000EE6E330EEE6EEE6A8F0ED3147009D36E88
:1019D000FC0ED3140009D36E0F0148691F0E496F26
:1019E00093EC0AF020EC06F0EBEC0BF0E7EC0BF0DC
:1019F0002B0EE66E1E0EE66E000EE66E23EC0BF06E
:101A0000E552E552E552300EE66ED6EC06F0E552B0
:101A10009490949294948B908B928B94F3EC09F025
:101A2000E76E020EE7CFDBFFDB50146E156AE8505D
:101A30001510F4E0020EDBCFE6FFE66A270EE66E35
:101A40001E0EE66E000EE66E23EC0BF0146E050E15
:101A5000E15E1450D9500B0FE66E000EDA20E66EF0
:101A600032EC0AF0E552E552E76E010EE7CFDBFFFC
:101A7000DBCFE6FFE66A230EE66E1E0EE66E000E74
:101A8000E66E23EC0BF0146E050EE15E1450DF6A77
:101A9000DF50146E156A010EDB50000115AE02D046
:101AA000D89003D0145C000E15581DE2D9500B0FCE
:101AB000146EDACF15F0DF500F011424E96E000E1A
:101AC000DA20EA6EEF50E66EE66A270EE66E1E0E2C
:101AD000E66E000EE66E23EC0BF0166E050EE15E70
:101AE0001650DF2AD5D7200EE66E1E0EE66E000ECB
:0E1AF000E66E23EC0BF0E552E552E5528FD77F
:021AFE00060ED2
:101B0000F66E000EF76E000EF86E00010900F5503B
:101B1000F26F0900F550F36F03E1F26701D03DD099
:101B20000900F550ED6F0900F550EE6F0900F55012
:101B3000EF6F09000900F550E96E0900F550EA6EF3
:101B4000090009000900F550F06F0900F550F16F28
:101B500009000900F6CFF4F0F7CFF5F0F8CFF6F072
:101B6000EDC0F6FFEEC0F7FFEFC0F8FF0001F05345
:101B700002E1F15307E00900F550EE6EF007F8E2DC
:101B8000F107F9D7F4C0F6FFF5C0F7FFF6C0F8FF8C
:0C1B90000001F207000EF35BBFD712004B
:041B9C00D9CFE6FFB8
:101BA000DACFE6FFE1CFD9FFE2CFDAFFE652E65225
:101BB000F70EDBCFE6FFF80EDBCFE6FFF90EDBCF4B
:101BC000E6FFFA0EDBCFE6FFFB0EDBCFE6FFD950D8
:101BD000FC0FE66EFF0EDA20E66E25EC00F0146EC8
:101BE000070EE15C02E2E16AE552E16E1450F3CFC8
:101BF000DEFFF4CFDDFFFC0EDBCFE9FFFD0EDBCF18
:101C0000EAFFEF6ADECF14F0DDCF15F014C0F3FF6A
:101C100015C0F4FFE552E552E552E5CFDAFFE7CF14
:041C2000D9FF1200D6
:0C1C2400D9CFE6FFDACFE6FFE1CFD9FF11
:101C3000E2CFDAFFFB0EDBCF14F0FC0EDBCF15F0AA
:101C40000001800E15141AE1FB0EDBCFE9FFFC0E3C
:101C5000DBCFEAFFEECFF3FFEDCFF4FFEE2A000E6D
:101C6000EF22F3CFE9FFF4CFEAFFFD0EDBCFEFFF6A
:101C7000EF50156AF36E15C0F4FF10D0FB0EDB5069
:101C8000FE0806E1FD0EDBCFE6FF64EC0FF005D0A9
:101C9000FD0EDBCFE6FF07EC00F0E552E552E5CFA5
:081CA000DAFFE7CFD9FF1200C3
:081CA80006500B02F3CF02F01D
:101CB000F4CF03F00C02F3500326000EF420046E60
:101CC00006500D02F3500426000EF420056E065057
:101CD0000E02F350052607500B02F3500326F45072
:101CE0000422000E052207500C02F3500426F45083
:101CF000052207500D02F350052608500B02F35041
:101D00000426F450052208500C02F3500526095011
:081D10000B02F350052612003E
:081D1800FE0EE3CFE9FFFF0E10
:101D2000E3CFEAFFF36AF46AEE5203E0F34AF42ADF
:101D3000FBD71200FF0EE3CFF8FFE552FF0EE3CF13
:101D4000F7FFE552FF0EE3CFF6FFE552E66AE66ADB
:101D5000E66A0900F55209E0FD0EE32A05E1FE0EF0
:101D6000E32A02E1FF0EE32AF4D7FD0EE3CF07F0EA
:0E1D7000FE0EE3CF08F0FF0EE3CF09F01200E5
:021D7E0009C09A
:101D800013F008C012F008500D02F4CF07F0F3CFA3
:101D900006F009500E02F4CF09F0F3CF08F00D025F
:101DA000F3500726F4500822E86A092212500E0266
:101DB000F3500726F4500822E86A09220EAEE5EF38
:101DC0000EF01250085E1350095A13AE000C0D505D
:081DD000085E0E50095A000CD8
:081DD800056A046A036A026A4D
:101DE000200EE76ED89006360736083609360236DA
:101DF0000336043605360B50025C0C5003580D5068
:101E000004580E50055809E30B50025E0C50035A5B
:101E10000D50045A0E50055A062AE72EE4D7120038
:101E20000D0A0025642000255820000D0A42656730
:101E3000696E2050726F6772616D0D0A00554152D4
:101E400054313A206F76657272756E0D0A005541F5
:101E50005254313A20627566666572206F766572FB
:071E6000666C6F770D0A00AC
:081E6800F36AF46AFF0EE124A5
:101E7000E96EFF0EE220EA6EED6607D02F0EEF64EA
:0C1E800004D03A0EEF6001D0F32A1200EB
:041E8C00B00EF36E33
:101E900000EE00F00E0E01D81200EA6002D0EE6AE9
:0C1EA000FCD7F350E9601200EE6AFCD79A
:041EAC001DEE00F037
:101EB0002DEE00F0F86A019C7FEC0DF008EC00F0CC
:081EC000C5EC0CF0FBD7120089
:081EC800FF0EE350ADBA04D097
:101ED000B06AAC8EAD8A949CADA2FED7AE6EF36EA6
:041EE000F46A12008E
:0C1EE40030313233343536373839616222
:051EF00063646566005B
:02001000FEFFF1
:06001800F2EF53F01200AC
:02001E000300DD
:100020009CAF0000C5010000100000008DAF000073
:10003000D50100000F00000010000000A90E000014
:0400400002000000BA
:0C004400400EE66EE66A600EE66EE66AAC
:10005000F9EC14F0E552E552E552E5521200D9CF21
:10006000E6FFE1CFD9FF250EE1268A9C010EE66E60
:100070002DEC57F0E5528A8CAE0EDF6EDE52A00EEC
:10008000DD6E720EF36E020EF3CFDBFFA10EF36E88
:10009000030EF3CFDBFF040EDB6AA20EF36E050E38
:1000A000F3CFDBFF060EDB6AA40EF36E070EF3CF71
:1000B000DBFFA80EF36E080EF3CFDBFF3F0EF36EEF
:1000C000090EF3CFDBFFAD0EF36E0A0EF3CFDBFFAD
:1000D0008E0EF36E0B0EF3CFDBFFB00EF36E0C0E35
:1000E000F3CFDBFF0B0EF36E0D0EF3CFDBFFB10E84
:1000F000F36E0E0EF3CFDBFF310EF36E0F0EF3CF68
:10010000DBFFB30EF36E100EF3CFDBFFF00EF36EDA
:10011000110EF3CFDBFF8A0EF36E120EF3CFDBFF6F
:10012000640EF36E130EF3CFDBFF8B0EF36E140E23
:10013000F3CFDBFF780EF36E150EF3CFDBFF8A0EE5
:10014000F36E160EF3CFDBFF640EF36E170EF3CFD4
:10015000DBFFBB0EF36E180EF3CFDBFF3A0EF36E30
:10016000190EF3CFDBFFBE0EF36E1A0EF3CFDBFFDB
:100170003E0EF36E1B0EF3CFDBFF870EF36E1C0EED
:10018000F3CFDBFF060EF36E1D0EF3CFDBFF810E08
:10019000F36E1E0EF3CFDBFF910EF36E1F0EF3CF47
:1001A000DBFF820EF36E200EF3CFDBFF500EF36EFB
:1001B000210EF3CFDBFF830EF36E220EF3CFDBFFB6
:1001C0007D0EF36E230EF3CFDBFFAF0EF36E240E26
:1001D000F3CFDBFF8A9A250EE66EE66AD9CFE6FFFB
:1001E000DACFE6FFE7EC50F0E552E552E552E55292
:1001F000250EE15C02E2E16AE552E16EE552E7CFED
:10020000D9FF1200D9CFE6FFE1CFD9FF060EE126D4
:10021000FD0EDBCF02F0FE0EDBCF03F0D8900350D3
:1002200004E6600E025C000E035810E2FB0EDBCF0A
:1002300004F0FC0EDBCF05F0D890055004E6400E2C
:10024000045C000E055802E2000E01D0010E006EA3
:10025000016AE85001102BE1150EDF6EFD0EDB5038
:10026000E76E010EE7CFDBFF5F0EF36E020EF3CFFA
:10027000DBFF750EF36E030EF3CFDBFFFB0EDB50DF
:10028000E76E040EE7CFDBFF3F0EF36E050EF3CFF4
:10029000DBFF8A9A060EE66EE66AD9CFE6FFDACF72
:1002A000E6FFE7EC50F0E552E552E552E552060E66
:1002B000E15C02E2E16AE552E16EE552E7CFD9FF87
:1002C00012001200D9CFE6FFE1CFD9FF8A9A010EC2
:1002D000E66EE66AD950FE0FE66EFF0EDA20E66E95
:1002E000E7EC50F0E552E552E552E552E552E7CF32
:1002F000D9FF1200D9CFE6FFE1CFD9FF8A8A010EDC
:10030000E66EE66AD950FE0FE66EFF0EDA20E66E64
:10031000E7EC50F0E552E552E552E552E552E7CF01
:10032000D9FF1200D9CFE6FFE1CFD9FF020EE126B7
:10033000FA0EDBCF01F001C000F0016A0050DF6E61
:10034000F90EDB50E76E010EE7CFDBFFFD0EDBCFD2
:1003500006F0FE0EDBCF07F00001800E071423E14C
:10036000FD0EDBCF08F0FE0EDBCF09F008C0E6FF84
:1003700009C0E6FF4EEC29F0E552E7CF09F0E5525F
:10038000E7CF08F0F3CF0AF0F4CF0BF00950F418E0
:10039000E8AE02D00B3404D00A50085C0B50095868
:1003A00002E2000E01D0010E046E056AE85005104D
:1003B0000CE1FB0EDBCF0CF0FC0EDBCF0DF00001EF
:1003C000800E0D1402E1000E01D0010E026E036AD0
:1003D000E850031023E1FB0EDBCF0EF0FC0EDBCF69
:1003E0000FF00EC0E6FF0FC0E6FF49EC29F0E55222
:1003F000E7CF0FF0E552E7CF0EF0F3CF10F0F4CFD8
:1004000011F00F50F418E8AE02D0113404D010509F
:100410000E5C11500F5802E2000E01D0010E006E6A
:10042000016AE850011001E08FD044EC29F0006E21
:10043000016A030E001801E1015042E0020E0018AB
:1004400001E1015029E0010E00185FE101505DE17A
:10045000D950FB0FE66EFF0EDA20E66ED950FD0F85
:10046000E66EFF0EDA20E66E46EC15F0E552E55238
:10047000E552E552FD0EDBCF00F0FE0EDBCF01F0C2
:10048000600ED8800056000E01560006015AFD0E7F
:1004900000C0DBFFFE0E37D0FD0EDBCF00F0FE0EFE
:1004A000DBCF01F0600ED8800056000E015600062A
:1004B000015AFD0E00C0DBFFFE0E01C0DBFF12D0B3
:1004C000D950FB0FE66EFF0EDA20E66ED950FD0F15
:1004D000E66EFF0EDA20E66E46EC15F0E552E552C8
:1004E000E552E552FB0EDBCF00F0FC0EDBCF01F056
:1004F000400ED8800056000E01560006015AFB0E31
:1005000000C0DBFFFC0E01C0DBFFFB0EDBCFE6FF14
:10051000FC0EDBCFE6FFFD0EDBCFE6FFFE0EDBCFF2
:10052000E6FF70DEE552E552E552E5528A8A020E98
:10053000E66EE66AD9CFE6FFDACFE6FFE7EC50F0E9
:10054000E552E552E552E552020EE15C02E2E16A53
:10055000E552E16EE552E7CFD9FF1200D9CFE6FFB1
:10056000E1CFD9FF080EE12644EC29F0006E016AC4
:10057000030E001801E1015001E18DD0020E0018B8
:1005800001E1015050E0010E001801E0CED0015011
:1005900001E0CBD0D950FB0FE66EFF0EDA20E66EFD
:1005A000D950FD0FE66EFF0EDA20E66E46EC15F030
:1005B000E552E552E552E552D950F70FE66EFF0ECF
:1005C000DA20E66ED950F90FE66EFF0EDA20E66EFD
:1005D00046EC15F0E552E552E552E552FD0EDBCF53
:1005E00000F0FE0EDBCF01F0600ED8800056000E4A
:1005F00001560006015AFD0E00C0DBFFFE0E01C0D1
:10060000DBFFF90EDBCF00F0FA0EDBCF01F0600E5E
:10061000D8800056000E01560006015AF90E00C09F
:10062000DBFFFA0E80D0FD0EDBCF00F0FE0EDBCF3D
:1006300001F0600ED8800056000E01560006015AE7
:10064000FD0E00C0DBFFFE0E01C0DBFFFB0EDBCFAB
:1006500000F0FC0EDBCF01F0400ED8800056000EFB
:1006600001560006015AFB0E00C0DBFFFC0E01C064
:10067000DBFFF90EDBCF00F0FA0EDBCF01F0600EEE
:10068000D8800056000E01560006015AF90E00C02F
:10069000DBFFFA0E35D0D950FB0FE66EFF0EDA20E5
:1006A000E66ED950FD0FE66EFF0EDA20E66E46ECE0
:1006B00015F0E552E552E552E552D950F70FE66ED6
:1006C000FF0EDA20E66ED950F90FE66EFF0EDA2043
:1006D000E66E46EC15F0E552E552E552E552FB0EAA
:1006E000DBCF00F0FC0EDBCF01F0400ED8800056CF
:1006F000000E01560006015AFB0E00C0DBFFFC0E87
:1007000001C0DBFFF70EDBCF00F0F80EDBCF01F00E
:10071000400ED8800056000E01560006015AF70E12
:1007200000C0DBFFF80E01C0DBFFFB0EDBCF02F0E9
:10073000FC0EDBCF03F0D890035004E6400E025CC1
:10074000000E03580EE3F70EDBCF04F0F80EDBCFFC
:1007500005F0D890055004E6400E045C000E0558E4
:1007600002E2000E01D0010E006E016AE850011095
:1007700001E00CD1FD0EDBCF02F0FE0EDBCF03F06B
:10078000D890035004E6600E025C000E03580EE39E
:10079000F90EDBCF04F0FA0EDBCF05F0D890055050
:1007A00004E6600E045C000E055802E2000E01D063
:1007B000010E006E016AE850011001E0E7D0FD0E65
:1007C000DBCF00F0FE0EDBCF01F0D890015004E645
:1007D000600E005C000E015807E35F0EF36EFD0E25
:1007E000F3CFDBFFFE0EDB6AFB0EDBCF00F0FC0E6F
:1007F000DBCF01F0D890015004E6400E005C000E03
:10080000015807E33F0EF36EFB0EF3CFDBFFFC0E48
:10081000DB6AF90EDBCF00F0FA0EDBCF01F0D890E7
:10082000015004E6600E005C000E015807E35F0E05
:10083000F36EF90EF3CFDBFFFA0EDB6AF70EDBCFB8
:1008400000F0F80EDBCF01F0D890015004E6400E26
:10085000005C000E015807E33F0EF36EF70EF3CF76
:10086000DBFFF80EDB6AFD0EDBCF00F0FE0EDBCF08
:1008700001F00001800E011404E0FD0EDB6AFE0EA3
:10088000DB6AFB0EDBCF00F0FC0EDBCF01F0800E4D
:10089000011404E0FB0EDB6AFC0EDB6AF90EDBCF11
:1008A00000F0FA0EDBCF01F0800E011404E0F90E27
:1008B000DB6AFA0EDB6AF70EDBCF00F0F80EDBCF57
:1008C00001F0800E011404E0F70EDB6AF80EDB6A1B
:1008D000210EDF6EFD0EDB50E76E010EE7CFDBFF72
:1008E000FB0EDB50E76E020EE7CFDBFFF90EDB50AD
:1008F000E76E030EE7CFDBFFF70EDB50E76E040E6B
:10090000E7CFDBFFF50EDBCF00F0F60EDBCF01F01B
:100910000150016AE830E830E8301F0B006ED890D3
:1009200000360136050E00C0DBFFF50EDBCF00F010
:10093000F60EDBCF01F0050ED89001320032E8044C
:10094000FBE13F0E0016000E0116060E00C0DBFF95
:10095000F50EDBCF00F0F60EDBCF01F0D8900036BD
:1009600001363F0E0016000E0116070E00C0DBFF19
:100970008A9A080EE66EE66AD9CFE6FFDACFE6FF7E
:10098000E7EC50F0E552E552E552E552080EE15C25
:1009900002E2E16AE552E16EE552E7CFD9FF1200CB
:1009A000D9CFE6FFE1CFD9FF150EE12644EC29F0BF
:1009B000006E016A030E001801E1015001E1B6D09A
:1009C000020E001801E1015073E0010E001801E170
:1009D00001502FE0005001E0E7D0015001E0E4D0E9
:1009E000FD0EDBCF1FF0FE0EDBCF20F00D0E1FC083
:1009F000DBFF0E0E20C0DBFFFB0EDBCF1FF0FC0E7B
:100A0000DBCF20F00F0E1FC0DBFF100E20C0DBFF7E
:100A1000F90EDBCF1FF0FA0EDBCF20F0110E1FC056
:100A2000DBFF120E20C0DBFFF70EDBCF1FF0F80E4E
:100A300036D0F70EDBCF00F0F80EDBCF01F0600E02
:100A4000D8800056000E01560006015A0D0E00C057
:100A5000DBFF0E0E01C0DBFFFD0EDBCF1FF0FE0E35
:100A6000DBCF20F00F0E1FC0DBFF100E20C0DBFF1E
:100A7000FB0EDBCF00F0FC0EDBCF01F0600ED88068
:100A80000056000E01560006015A110E00C0DBFF91
:100A9000120E01C0DBFFF90EDBCF1FF0FA0EDBCF29
:100AA00020F0130E1FC0DBFF140E20C0DBFF7CD034
:100AB000F90EDBCF00F0FA0EDBCF01F0600ED8802C
:100AC0000056000E01560006015A0D0E00C0DBFF55
:100AD0000E0E01C0DBFFF70EDBCF00F0F80EDBCF10
:100AE00001F0400ED8800056000E01560006015A53
:100AF0000F0E00C0DBFF100E01C0DBFFFD0EDBCFD1
:100B000000F0FE0EDBCF01F0600ED8800056000E24
:100B100001560006015A110E00C0DBFF120E01C083
:100B2000DBFFFB0EDBCF00F0FC0E2FD0FB0EDBCF8C
:100B30001FF0FC0EDBCF20F00D0E1FC0DBFF0E0EF2
:100B400020C0DBFFF90EDBCF00F0FA0EDBCF01F0A7
:100B5000400ED8800056000E01560006015A0F0EB6
:100B600000C0DBFF100E01C0DBFFF70EDBCF1FF074
:100B7000F80EDBCF20F0110E1FC0DBFF120E20C0DD
:100B8000DBFFFD0EDBCF00F0FE0EDBCF01F0400EF1
:100B9000D8800056000E01560006015A130E00C000
:100BA000DBFF140E01C0DBFF0F0EDBCF02F0100ED7
:100BB000DBCF03F0D890035004E6400E025C000E39
:100BC00003580EE3130EDBCF04F0140EDBCF05F059
:100BD000D890055004E6400E045C000E055802E271
:100BE000000E01D0010E006E016AE850011001E014
:100BF00019D10D0EDBCF02F00E0EDBCF03F0D89033
:100C0000035004E6600E025C000E03580EE3110E62
:100C1000DBCF04F0120EDBCF05F0D890055004E6D0
:100C2000600E045C000E055802E2000E01D0010EB9
:100C3000006E016AE850011001E0F4D00D0EDBCF28
:100C400000F00E0EDBCF01F0D890015004E6600EEC
:100C5000005C000E015807E35F0EF36E0D0EF3CF3C
:100C6000DBFF0E0EDB6A0F0EDBCF00F0100EDBCFCA
:100C700001F0D890015004E6400E005C000E0158CF
:100C800007E33F0EF36E0F0EF3CFDBFF100EDB6AB0
:100C9000110EDBCF00F0120EDBCF01F0D890015027
:100CA00004E6600E005C000E015807E35F0EF36E71
:100CB000110EF3CFDBFF120EDB6A130EDBCF00F059
:100CC000140EDBCF01F0D890015004E6400E005C1A
:100CD000000E015807E33F0EF36E130EF3CFDBFF58
:100CE000140EDB6A0D0EDBCF00F00E0EDBCF01F031
:100CF0000001800E011404E00D0EDB6A0E0EDB6AAB
:100D00000F0EDBCF00F0100EDBCF01F0800E0114D0
:100D100004E00F0EDB6A100EDB6A110EDBCF00F071
:100D2000120EDBCF01F0800E011404E0110EDB6A1D
:100D3000120EDB6A130EDBCF00F0140EDBCF01F0D6
:100D4000800E011404E0130EDB6A140EDB6A260E1B
:100D5000DF6E010EDB6A220EF36E020EF3CFDBFFB5
:100D60000D0EDB50E76E030EE7CFDBFF0F0EDB50FF
:100D7000E76E040EE7CFDBFF110EDB50E76E050ECA
:100D8000E7CFDBFF130EDB50E76E060EE7CFDBFF8E
:100D9000F50EDBCF00F0F60EDBCF01F00150016A5B
:100DA000E830E830E8301F0B006ED890003601368E
:100DB000070E00C0DBFFF50EDBCF00F0F60EDBCF39
:100DC00001F0050ED89001320032E804FBE13F0E3D
:100DD0000016000E0116080E00C0DBFFF50EDBCF7B
:100DE00000F0F60EDBCF01F0D890003601363F0E52
:100DF0000016000E0116090E00C0DBFF0A0EDB6AAA
:100E00000B0EDB6A0C0EDB6A8A9A0D0EE66EE66A42
:100E1000D9CFE6FFDACFE6FFE7EC50F0E552E55236
:100E2000E552E552150EE15C02E2E16AE552E16E3F
:100E3000E552E7CFD9FF1200D9CFE6FFE1CFD9FFC6
:100E4000150EE12644EC29F0006E016A030E00182D
:100E500001E1015001E1B6D0020E001801E101509C
:100E600073E0010E001801E101502FE0005001E095
:100E7000E7D0015001E0E4D0FD0EDBCF1FF0FE0E05
:100E8000DBCF20F00D0E1FC0DBFF0E0E20C0DBFFFE
:100E9000FB0EDBCF1FF0FC0EDBCF20F00F0E1FC0D0
:100EA000DBFF100E20C0DBFFF90EDBCF1FF0FA0EC8
:100EB000DBCF20F0110E1FC0DBFF120E20C0DBFFC6
:100EC000F70EDBCF1FF0F80E36D0F70EDBCF00F0B9
:100ED000F80EDBCF01F0600ED8800056000E0156F0
:100EE0000006015A0D0E00C0DBFF0E0E01C0DBFF35
:100EF000FD0EDBCF1FF0FE0EDBCF20F00F0E1FC06C
:100F0000DBFF100E20C0DBFFFB0EDBCF00F0FC0E82
:100F1000DBCF01F0600ED8800056000E01560006AF
:100F2000015A110E00C0DBFF120E01C0DBFFF90EEB
:100F3000DBCF1FF0FA0EDBCF20F0130E1FC0DBFF5C
:100F4000140E20C0DBFF7CD0F90EDBCF00F0FA0ED0
:100F5000DBCF01F0600ED8800056000E015600066F
:100F6000015A0D0E00C0DBFF0E0E01C0DBFFF70EB5
:100F7000DBCF00F0F80EDBCF01F0400ED88000563A
:100F8000000E01560006015A0F0E00C0DBFF100EC6
:100F900001C0DBFFFD0EDBCF00F0FE0EDBCF01F06A
:100FA000600ED8800056000E01560006015A110E40
:100FB00000C0DBFF120E01C0DBFFFB0EDBCF00F039
:100FC000FC0E2FD0FB0EDBCF1FF0FC0EDBCF20F092
:100FD0000D0E1FC0DBFF0E0E20C0DBFFF90EDBCFB6
:100FE00000F0FA0EDBCF01F0400ED8800056000E64
:100FF00001560006015A0F0E00C0DBFF100E01C0A3
:10100000DBFFF70EDBCF1FF0F80EDBCF20F0110E69
:101010001FC0DBFF120E20C0DBFFFD0EDBCF00F098
:10102000FE0EDBCF01F0400ED8800056000E0156B8
:101030000006015A130E00C0DBFF140E01C0DBFFD7
:101040000F0EDBCF02F0100EDBCF03F0D890035071
:1010500004E6400E025C000E03580EE3130EDBCFD5
:1010600004F0140EDBCF05F0D890055004E6400ED6
:10107000045C000E055802E2000E01D0010E006E65
:10108000016AE850011001E04FD10D0EDBCF02F0F4
:101090000E0EDBCF03F0D890035004E6600E025C26
:1010A000000E03580EE3110EDBCF04F0120EDBCF5F
:1010B00005F0D890055004E6600E045C000E05585B
:1010C00002E2000E01D0010E006E016AE85001102C
:1010D00001E02AD10D0EDBCF00F00E0EDBCF01F0C8
:1010E000D890015004E6600E005C000E015807E342
:1010F0005F0EF36E0D0EF3CFDBFF0E0EDB6A0F0EED
:10110000DBCF00F0100EDBCF01F0D890015004E6E9
:10111000400E005C000E015807E33F0EF36E0F0E09
:10112000F3CFDBFF100EDB6A110EDBCF00F0120EE7
:10113000DBCF01F0D890015004E6600E005C000E99
:10114000015807E35F0EF36E110EF3CFDBFF120EB3
:10115000DB6A130EDBCF00F0140EDBCF01F0D8906A
:10116000015004E6400E005C000E015807E33F0EFC
:10117000F36E130EF3CFDBFF140EDB6A0D0EDBCF25
:1011800000F00E0EDBCF01F00001800E011404E030
:101190000D0EDB6A0E0EDB6A0F0EDBCF00F0100EB9
:1011A000DBCF01F0800E011404E00F0EDB6A100E9D
:1011B000DB6A110EDBCF00F0120EDBCF01F0800EE8
:1011C000011404E0110EDB6A120EDB6A130EDBCF92
:1011D00000F0140EDBCF01F0800E011404E0130EBA
:1011E000DB6A140EDB6A260EDF6EDE52010EDD6E48
:1011F000220EF36E020EF3CFDBFF0D0EDB50E76E17
:10120000030EE7CFDBFF0F0EDB50E76E040EE7CFD8
:10121000DBFF110EDB50E76E050EE7CFDBFF130E91
:10122000DB50E76E060EE7CFDBFFF50EDBCF00F0FD
:10123000F60EDBCF01F00150016AE830E830E8300B
:101240001F0B006ED89000360136070E00C0DBFF82
:10125000F50EDBCF00F0F60EDBCF01F0050ED890D7
:1012600001320032E804FBE13F0E0016000E0116C9
:10127000080E00C0DBFFF50EDBCF00F0F60EDBCF73
:1012800001F0D890003601363F0E0016000E011610
:10129000090E00C0DBFFF50EDBCF00F0F60EDBCF52
:1012A00001F00150016AE830E830E8301F0B006EB1
:1012B000D890003601360A0E00C0DBFFF50EDBCFFA
:1012C00000F0F60EDBCF01F0050ED89001320032AF
:1012D000E804FBE13F0E0016000E01160B0E00C0E5
:1012E000DBFFF50EDBCF00F0F60EDBCF01F0D89080
:1012F000003601363F0E0016000E01160C0E00C01F
:10130000DBFF8A9A0D0EE66EE66AD9CFE6FFDACFEA
:10131000E6FFE7EC50F0E552E552E552E552040EE7
:10132000E66E6CEC57F0E552150EE15C02E2E16A04
:10133000E552E16EE552E7CFD9FF1200D9CFE6FFC3
:10134000E1CFD9FF050EE126250EDF6E010EDB6A27
:10135000020EDB6A5F0EF36E030EF3CFDBFF3F0E70
:10136000F36E040EF3CFDBFF8A9A050EE66EE66A93
:10137000D9CFE6FFDACFE6FFE7EC50F0E552E552D1
:10138000E552E552040EE66E6CEC57F0E552050EA0
:10139000E15C02E2E16AE552E16EE552E7CFD9FF96
:1013A0001200D9CFE6FFE1CFD9FF020EE126FE0EF3
:1013B000DB50006E016A030ED89001320032E8045F
:1013C000FBE100C0DEFF01C0DDFFD9CFE9FFDACFCE
:1013D000EAFF060ED890EE36ED36E806FBE1FD0E8C
:1013E000DB50006E016AD89001320032D890013291
:1013F0000032D9CFE9FFDACFEAFF0050EE120150F8
:10140000ED12D9CFE9FFDACFEAFF050ED890EE361C
:10141000ED36E806FBE1FC0EDB50006E016A030EC0
:10142000D89001320032E804FBE1D9CFE9FFDACFEE
:10143000EAFF0050EE120150ED12DECF00F0DDCFDA
:1014400001F000C0F3FF01C0F4FF020EE15C02E214
:10145000E16AE552E16EE552E7CFD9FF1200D9CF3C
:10146000E6FFE1CFD9FF040EE126C2EC16F0DE6AFA
:10147000DD6ADECF00F0DDCF01F000C0E6FF01C085
:10148000E6FF4EEC29F0E552E7CF01F0E552E7CF59
:1014900000F0F3CF02F0F4CF03F00206000E035A7F
:1014A00001500318E8AE02D0033404D00250005CAF
:1014B0000350015826E2FD0EDBCFE6FFFE0EDBCF28
:1014C000E6FF49EC29F0F3CF00F0F4CF01F000067D
:1014D000000E015A00C0E6FF01C0E6FFDECFE6FFC6
:1014E000DDCFE6FFE66EE66AE66EE66A7EEC15F0B4
:1014F000026E0A0EE15E0250060EDE26000EDD22AE
:10150000B8D7020EDB6A030EDB6A020EDBCF00F0F7
:10151000030EDBCF01F000C0E6FF01C0E6FF49EC9F
:1015200029F0E552E7CF01F0E552E7CF00F0F3CF25
:1015300002F0F4CF03F00206000E035A0150031824
:10154000E8AE02D0033404D00250005C03500158CE
:101550002DE2FD0EDBCFE6FFFE0EDBCFE6FF020E37
:10156000DBCFE6FF030EDBCFE6FF4EEC29F0F3CF37
:1015700000F0F4CF01F00006000E015A00C0E6FFB3
:1015800001C0E6FFE66EE66AE66EE66A7EEC15F0FE
:10159000026E0A0EE15E0250D950020FE96EDACFF8
:1015A000EAFF060EEE26000EED22AFD7C2EC16F0D3
:1015B000DE6ADD6ADECF00F0DDCF01F000C0E6FFBD
:1015C00001C0E6FF4EEC29F0E552E7CF01F0E5520D
:1015D000E7CF00F0F3CF02F0F4CF03F00206000EE5
:1015E000035A01500318E8AE02D0033404D002506D
:1015F000005C0350015831E2FD0EDBCFE6FFFE0E2A
:10160000DBCFE6FF49EC29F0F3CF00F0F4CF01F097
:101610000006000E015A00C0E6FF01C0E6FFDECF63
:10162000E6FFDDCFE6FFE66EE66A4EEC29F0F3CF8B
:1016300002F0F4CF03F00206000E035A02C0E6FFE8
:1016400003C0E6FF7EEC15F0046E0A0EE15E045066
:10165000060EDE26000EDD22ADD7020EDB6A030E7B
:10166000DB6A020EDBCF00F0030EDBCF01F000C01F
:10167000E6FF01C0E6FF49EC29F0E552E7CF01F0B3
:10168000E552E7CF00F0F3CF02F0F4CF03F002060B
:10169000000E035A01500318E8AE02D0033404D000
:1016A0000250005C035001582EE2FD0EDBCFE6FF36
:1016B000FE0EDBCFE6FF020EDBCFE6FF030EDBCF35
:1016C000E6FF000EE66EE66AE66EE66A4EEC29F08C
:1016D000F3CF00F0F4CF01F00006000E015A00C075
:1016E000E6FF01C0E6FF7EEC15F0026E0A0EE15E39
:1016F0000250D950020FE96EDACFEAFF060EEE264D
:10170000000EED22AED7C2EC16F0DE6ADD6ADECF47
:1017100000F0DDCF01F000C0E6FF01C0E6FF4EECB7
:1017200029F0E552E7CF01F0E552E7CF00F0F3CF23
:1017300002F0F4CF03F00206000E035A0150031822
:10174000E8AE02D0033404D00250005C03500158CC
:1017500027E2FD0EDBCFE6FFFE0EDBCFE6FF000E3D
:10176000E66EE66ADECFE6FFDDCFE6FF49EC29F064
:10177000F3CF00F0F4CF01F00006000E015A00C0D4
:10178000E6FF01C0E6FFE66EE66A7EEC15F0026E4B
:101790000A0EE15E0250060EDE26000EDD22B7D7ED
:1017A000020EDB6A030EDB6A020EDBCF00F0030ED3
:1017B000DBCF01F000C0E6FF01C0E6FF49EC29F0F5
:1017C000E552E7CF01F0E552E7CF00F0F3CF02F0AA
:1017D000F4CF03F00206000E035A01500318E8AEDE
:1017E00002D0033404D00250005C0350015838E2A8
:1017F000FD0EDBCFE6FFFE0EDBCFE6FF020EDBCFFA
:10180000E6FF030EDBCFE6FF4EEC29F0F3CF00F04E
:10181000F4CF01F00006000E015A00C0E6FF01C03F
:10182000E6FF49EC29F0F3CF02F0F4CF03F0020613
:10183000000E035A02C0E6FF03C0E6FFE66EE66A4A
:101840007EEC15F0046E0A0EE15E0450D950020FD2
:10185000E96EDACFEAFF060EEE26000EED22A4D7DF
:10186000C2EC16F0DE6ADD6ADECF00F0DDCF01F0FB
:1018700000C0E6FF01C0E6FF4EEC29F0E552E7CFDD
:1018800001F0E552E7CF00F0F3CF02F0F4CF03F020
:101890000206000E035A01500318E8AE02D00334CA
:1018A00004D00250005C0350015832E2FD0EDBCF41
:1018B000E6FFFE0EDBCFE6FF000EE66EE66ADECF49
:1018C000E6FFDDCFE6FF49EC29F0F3CF00F0F4CFDF
:1018D00001F00006000E015A00C0E6FF01C0E6FF5D
:1018E0004EEC29F0F3CF02F0F4CF03F00206000E25
:1018F000035A02C0E6FF03C0E6FF7EEC15F0046E5B
:101900000A0EE15E0450060EDE26000EDD22ACD784
:10191000020EDB6A030EDB6A020EDBCF00F0030E61
:10192000DBCF01F000C0E6FF01C0E6FF49EC29F083
:10193000E552E7CF01F0E552E7CF00F0F3CF02F038
:10194000F4CF03F00206000E035A01500318E8AE6C
:1019500002D0033404D00250005C0350015839E235
:10196000FD0EDBCFE6FFFE0EDBCFE6FF020EDBCF88
:10197000E6FF030EDBCFE6FF000EE66EE66A49ECFB
:1019800029F0F3CF00F0F4CF01F00006000E015A69
:1019900000C0E6FF01C0E6FF4EEC29F0F3CF02F0F5
:1019A000F4CF03F00206000E035A02C0E6FF03C0A4
:1019B000E6FF7EEC15F0046E0A0EE15E0450D9508D
:1019C000020FE96EDACFEAFF060EEE26000EED22D8
:1019D000A3D7040EE15C02E2E16AE552E16EE55252
:1019E000E7CFD9FF1200D9CFE6FFE1CFD9FF020E32
:1019F000E126C2EC16F049EC29F0F3CF00F0F4CF69
:101A000001F0F3CFE6FFF4CFE6FF4EEC29F0E5520C
:101A1000E7CF01F0E552E7CF00F0F3CF02F0F4CFCB
:101A200003F00150F418E8AE02D0033404D00250A1
:101A3000005C0350015801E39ED0DE6ADD6ADECF10
:101A400000F0DDCF01F000C0E6FF01C0E6FF49EC89
:101A500029F0E552E7CF01F0E552E7CF00F0F3CFF0
:101A600002F0F4CF03F00206000E035A01500318EF
:101A7000E8AE02D0033404D00250005C0350015899
:101A800001E317D1FD0EDBCFE6FFFE0EDBCFE6FF55
:101A9000DECFE6FFDDCFE6FFDECFE6FFDDCFE6FF00
:101AA00049EC29F0F3CF02F0F4CF03F00206000E68
:101AB000035A020E246E256A02C01FF003C020F0F4
:101AC0003FEC55F01FC002F020C003F0DECF04F061
:101AD000DDCF05F0020E246E256A04C01FF005C09C
:101AE00020F03FEC55F01FC004F020C005F01F505F
:101AF000025C006E20500358016E00C0E6FFE66EE7
:101B00004EEC29F0F3CF08F0F4CF09F00806000EF0
:101B1000095A020E246E256A08C01FF009C020F081
:101B20003FEC55F01FC008F020C009F0DECF0AF0EE
:101B3000DDCF0BF0020E246E256A0AC01FF00BC029
:101B400020F03FEC55F01FC00AF020C00BF01F50F2
:101B5000085C066E20500958076E06C0E6FFE66E68
:101B60001EEC16F00C6E0A0EE15E0C50060EDE2620
:101B7000000EDD2264D7DE6ADD6ADECF00F0DDCF45
:101B800001F000C0E6FF01C0E6FF4EEC29F0E5528F
:101B9000E7CF01F0E552E7CF00F0F3CF02F0F4CF4A
:101BA00003F00206000E035A01500318E8AE02D0FB
:101BB000033404D00250005C0350015801E379D093
:101BC000FD0EDBCFE6FFFE0EDBCFE6FFDECFE6FF4E
:101BD000DDCFE6FFDECFE6FFDDCFE6FF49EC29F003
:101BE000F3CF02F0F4CF03F00206000E035A020E08
:101BF000246E256A02C01FF003C020F03FEC55F0B0
:101C00001FC002F020C003F0DECF04F0DDCF05F0EE
:101C1000020E246E256A04C01FF005C020F03FECC0
:101C200055F01FC004F020C005F01F50025C006E8C
:101C300020500358016E00C0E6FFE66E4EEC29F01E
:101C4000F3CF08F0F4CF09F00806000E095A020E8F
:101C5000246E256A08C01FF009C020F03FEC55F043
:101C60001FC008F020C009F0DECF0AF0DDCF0BF076
:101C7000020E246E256A0AC01FF00BC020F03FEC54
:101C800055F01FC00AF020C00BF01F50085C066E14
:101C900020500958076E06C0E6FFE66E1EEC16F0EF
:101CA0000C6E0A0EE15E0C50060EDE26000EDD22E2
:101CB00064D7020EE15C02E2E16AE552E16EE552B0
:101CC000E7CFD9FF1200D9CFE6FFE1CFD9FF020E4F
:101CD000E126C2EC16F049EC29F0F3CF00F0F4CF86
:101CE00001F0F3CFE6FFF4CFE6FF4EEC29F0E5522A
:101CF000E7CF01F0E552E7CF00F0F3CF02F0F4CFE9
:101D000003F00150F418E8AE02D0033404D00250BE
:101D1000005C0350015801E30BD149EC29F0F3CFEB
:101D200000F0F4CF01F00006000E015A00C0DEFF03
:101D300001C0DDFFDECF00F0DDCF01F0013401E3B3
:101D400002D200500608000E015401E3FCD1FD0E42
:101D5000DBCFE6FFFE0EDBCFE6FFDECFE6FFDDCF1B
:101D6000E6FFDECFE6FFDDCFE6FF49EC29F0F3CF5B
:101D700002F0F4CF03F00206000E035A020E246EA6
:101D8000256A02C01FF003C020F03FEC55F01FC0D1
:101D900002F020C003F0DECF04F0DDCF05F0020E2C
:101DA000246E256A04C01FF005C020F03FEC55F0FA
:101DB0001FC004F020C005F01F50025C006E2050D0
:101DC0000358016E00C0E6FFE66E4EEC29F0F3CF3B
:101DD00008F0F4CF09F00806000E095A020E246E2E
:101DE000256A08C01FF009C020F03FEC55F01FC065
:101DF00008F020C009F0DECF0AF0DDCF0BF0020EB4
:101E0000246E256A0AC01FF00BC020F03FEC55F08D
:101E10001FC00AF020C00BF01F50085C066E205057
:101E20000958076E06C0E6FFE66E60EC16F00C6E11
:101E30000A0EE15E0C50FB0EDBCFE6FFFC0EDBCFA3
:101E4000E6FFDECFE6FFDDCFE6FFDECFE6FFDDCF4C
:101E5000E6FF49EC29F0F3CF02F0F4CF03F00206DD
:101E6000000E035A020E246E256A02C01FF003C042
:101E700020F03FEC55F01FC002F020C003F0DECF91
:101E800004F0DDCF05F0020E246E256A04C01FF0B9
:101E900005C020F03FEC55F01FC004F020C005F055
:101EA0001F50025C006E20500358016E00C0E6FF18
:101EB000E66E4EEC29F0F3CF08F0F4CF09F00806F7
:101EC000000E095A020E246E256A08C01FF009C0D0
:101ED00020F03FEC55F01FC008F020C009F0DECF25
:101EE0000AF0DDCF0BF0020E246E256A0AC01FF047
:101EF0000BC020F03FEC55F01FC00AF020C00BF0E3
:101F00001F50085C066E20500958076E06C0E6FF99
:101F1000E66E1EEC16F00C6E0A0EE15E0C50D9CF88
:101F2000E9FFDACFEAFF060EEE5E000EED5A02D7A9
:101F30004EEC29F0F3CF00F0F4CF01F00006000ED4
:101F4000015A00C0DEFF01C0DDFFDECF00F0DDCFB3
:101F500001F0013401E3F7D000500608000E0154EF
:101F600001E3F1D0FD0EDBCFE6FFFE0EDBCFE6FF97
:101F7000DECFE6FFDDCFE6FFDECFE6FFDDCFE6FF1B
:101F800049EC29F0F3CF02F0F4CF03F00206000E83
:101F9000035A020E246E256A02C01FF003C020F00F
:101FA0003FEC55F01FC002F020C003F0DECF04F07C
:101FB000DDCF05F0020E246E256A04C01FF005C0B7
:101FC00020F03FEC55F01FC004F020C005F01F507A
:101FD000025C006E20500358016E00C0E6FFE66E02
:101FE0004EEC29F0F3CF08F0F4CF09F00806000E0C
:101FF000095A020E246E256A08C01FF009C020F09D
:102000003FEC55F01FC008F020C009F0DECF0AF009
:10201000DDCF0BF0020E246E256A0AC01FF00BC044
:1020200020F03FEC55F01FC00AF020C00BF01F500D
:10203000085C066E20500958076E06C0E6FFE66E83
:1020400060EC16F00C6E0A0EE15E0C50FB0EDBCF5E
:10205000E6FFFC0EDBCFE6FFDECFE6FFDDCFE6FFDF
:10206000DECFE6FFDDCFE6FF49EC29F0F3CF02F04B
:10207000F4CF03F00206000E035A020E246E256A06
:1020800002C01FF003C020F03FEC55F01FC002F06B
:1020900020C003F0DECF04F0DDCF05F0020E246E89
:1020A000256A04C01FF005C020F03FEC55F01FC0AA
:1020B00004F020C005F01F50025C006E2050035851
:1020C000016E00C0E6FFE66E4EEC29F0F3CF08F09B
:1020D000F4CF09F00806000E095A020E246E256A94
:1020E00008C01FF009C020F03FEC55F01FC008F0F9
:1020F00020C009F0DECF0AF0DDCF0BF0020E246E17
:10210000256A0AC01FF00BC020F03FEC55F01FC03D
:102110000AF020C00BF01F50085C066E20500958D2
:10212000076E06C0E6FFE66E1EEC16F00C6E0A0E99
:10213000E15E0C50D9CFE9FFDACFEAFF060EEE5E82
:10214000000EED5A02D7020EE15C02E2E16AE552AE
:10215000E16EE552E7CFD9FF1200D9CFE6FFE1CF1C
:10216000D9FF040EE126DE6ADD6ADECF00F0DDCFA6
:1021700001F000C0E6FF01C0E6FF4EEC29F0E55299
:10218000E7CF01F0E552E7CF00F0F3CF04F0F4CF52
:1021900005F00406000E055AFD0EDB500424026E05
:1021A000FE0EDB500520036E0250005C0350015808
:1021B00071E2020EDB6A030EDB6A020EDBCF00F077
:1021C000030EDBCF01F000C0E6FF01C0E6FF49ECE3
:1021D00029F0E552E7CF01F0E552E7CF00F0F3CF69
:1021E00004F0F4CF05F00406000E055AFD0EDB5096
:1021F0000424026EFE0EDB500520036E0250005CCC
:102200000350015832E2FB0EDBCFE6FFFC0EDBCFC2
:10221000E6FFFD0EDBCFE6FFFE0EDBCFE6FF020E94
:10222000DBCFE6FF030EDBCFE6FFDECFE6FFDDCF41
:10223000E6FFC4EC16F0006E080EE15E0050FD0EE5
:10224000DBCF00F0FE0EDBCF01F0010ED8900036A0
:102250000136E806FBE1D950020FE96EDACFEAFF5A
:102260000050EE260150ED22A8D7FD0EDBCF00F086
:10227000FE0EDBCF01F0010ED89000360136E806E5
:10228000FBE1D9CFE9FFDACFEAFF0050EE2601509B
:10229000ED226BD7040EE15C02E2E16AE552E16EE9
:1022A000E552E7CFD9FF1200D9CFE6FFE1CFD9FF42
:1022B000020EE126FD0EDB50DF6EDF50006E016A7C
:1022C000E66E01C0E6FF4EEC29F0E552E7CF01F0E3
:1022D000E552E7CF00F0F3CF02F0F4CF03F00206AF
:1022E000000E035A01500318E8AE02D0033404D0A4
:1022F0000250005C035001585EE2FD0EDB50E76EB9
:10230000010EE7CFDBFFDB50006E016AE66E01C015
:10231000E6FF49EC29F0E552E7CF01F0E552E7CFBF
:1023200000F0F3CF02F0F4CF03F00206000E035AE0
:1023300001500318E8AE02D0033404D00250005C10
:10234000035001582AE2FB0EDBCFE6FFFC0EDBCF89
:10235000E6FFFD0EDBCFE6FFFE0EDBCFE6FF010E54
:10236000DBCFE6FFE66ADFCFE6FFE66A8DEC1BF027
:10237000006E080EE15E0050020E1F6E206AFD0E18
:10238000DBCF24F0FE0EDBCF25F092EC55F0010EF2
:10239000DBCFE7FF1D50E726B3D7020E1F6E206A82
:1023A000FD0EDBCF24F0FE0EDBCF25F092EC55F0D6
:1023B0001D50DF2682D7020EE15C02E2E16AE5529F
:1023C000E16EE552E7CFD9FF1200D9CFE6FFE1CFAA
:1023D000D9FF0C0EE126DE6AF80EDD6E4EEC29F018
:1023E000F3CF00F0F4CF01F0020E246E256AF3CF94
:1023F0001FF0F4CF20F03FEC55F01FC000F020C0DC
:1024000001F0040E1FC0DBFF050E20C0DBFF49EC0E
:1024100029F0060EF3CFDBFF070EF4CFDBFF080E2B
:10242000DB6A090EDB6A4EEC29F00A0EF3CFDBFF04
:102430000B0EF4CFDBFFC2EC16F0020EDB6A030ECC
:10244000DB6A020EDBCF00F0030EDBCF01F00134BC
:1024500004E200500F08000E015456E3DECFE6FF01
:10246000DDCFE6FF060EDBCFE6FF070EDBCFE6FF94
:102470000A0EDBCFE6FF0B0EDBCFE6FF060EDBCF4F
:10248000E6FF070EDBCFE6FF080EDBCFE6FF090E07
:10249000DBCFE6FF080EDBCFE6FF090EDBCFE6FF62
:1024A000040EDBCFE6FF050EDBCFE6FFD1EC1DF01F
:1024B000006E0E0EE15E0050D950060FE96EDACFC5
:1024C000EAFF040EEE5E000EED5AD950080FE96ED9
:1024D000DACFEAFF040EEE26000EED22D9500A0FE5
:1024E000E96EDACFEAFF040EEE5E000EED5A640EDE
:1024F000DE26000EDD22D950020FE96EDACFEAFFA8
:10250000EE2A000EED229DD70C0EE15C02E2E16A9C
:10251000E552E16EE552E7CFD9FF1200D9CFE6FFD1
:10252000E1CFD9FF0E0EE126640EDE6EDD6AC2EC4D
:1025300016F0040EDB6A050EDB6A040EDBCF00F03A
:10254000050EDBCF01F0013404E200500408000E58
:10255000015401E290D0060EDB6A070EDB6A080E1A
:10256000DB6A090EDB6A4EEC29F00A0EF3CFDBFFC3
:102570000B0EF4CFDBFF49EC29F00C0EF3CFDBFFA1
:102580000D0EF4CFDBFF020EDB6A030EDB6A020ED8
:10259000DBCF00F0030EDBCF01F0013404E200508A
:1025A0001808000E01545AE3DECFE6FFDDCFE6FF48
:1025B000050EE66EE66A0C0EDBCFE6FF0D0EDBCFF6
:1025C000E6FF0A0EDBCFE6FF0B0EDBCFE6FF080EC1
:1025D000DBCFE6FF090EDBCFE6FF060EDBCFE6FF23
:1025E000070EDBCFE6FF55EC22F0006E0C0EE15E2D
:1025F0000050D950060FE96EDACFEAFF020EEE2640
:10260000000EED22D950080FE96EDACFEAFF030E73
:10261000EE26000EED22D9500A0FE96EDACFEAFF5E
:10262000040EEE5E000EED5AD9500C0FE96EDACFB3
:10263000EAFF060EEE5E000EED5AD9CFE9FFDACFC3
:10264000EAFF4C0EEE26040EED22D950020FE96E81
:10265000DACFEAFFEE2A000EED2299D7640EDE26CD
:10266000000EDD22D950040FE96EDACFEAFFEE2A20
:10267000000EED2262D70E0EE15C02E2E16AE55245
:10268000E16EE552E7CFD9FF1200C2EC16F0E66822
:10269000E668080EE66EE66A3C0EE66EE66A4E0EE8
:1026A000E66EE66A0A0EE66EE66A190EE66EE66AFF
:1026B00077EC24F0006E0C0EE15E0050E66AF80E36
:1026C000E66E280EE66EE66A5A0EE66EE66A3C0E86
:1026D000E66EE66A2A0EE66EE66A140EE66EE66AB4
:1026E0002A0EE66EE66A45EC1EF0006E0E0EE15E06
:1026F0000050640EE66E2DEC57F0E552E668E66891
:10270000080EE66EE66A3C0EE66EE66A4E0EE66E71
:10271000E66A5A0EE66EE66A190EE66EE66A77EC2F
:1027200024F0006E0C0EE15E0050E00EE66E070E27
:10273000E66E050EE66EE66A2D0EE66EE66A140E8D
:10274000E66EE66A620EE66EE66A270EE66EE66AF8
:1027500077EC24F0006E0C0EE15E0050E00EE66EA9
:10276000070EE66E050EE66EE66A2D0EE66EE66A6A
:10277000140EE66EE66A620EE66EE66A450EE66ED8
:10278000E66A77EC24F0006E0C0EE15E0050640EF9
:10279000E66E2DEC57F0E5521F0EE66EE66A280E47
:1027A000E66EE66A5A0EE66EE66A3C0EE66EE66A8B
:1027B0002A0EE66EE66A140EE66EE66A2A0EE66EEB
:1027C000E66A45EC1EF0006E0E0EE15E0050640EEF
:1027D000E66E2DEC57F0E552E66AF80EE66E050E51
:1027E000E66EE66A2D0EE66EE66A140EE66EE66AA0
:1027F000620EE66EE66A270EE66EE66A77EC24F075
:10280000006E0C0EE15E0050E66AF80EE66E050EF4
:10281000E66EE66A2D0EE66EE66A140EE66EE66A6F
:10282000620EE66EE66A450EE66EE66A77EC24F026
:10283000006E0C0EE15E0050E00EE66E070EE66ED6
:10284000280EE66EE66A5A0EE66EE66A3C0EE66E04
:10285000E66A2A0EE66EE66A140EE66EE66A2A0E4E
:10286000E66EE66A45EC1EF0006E0E0EE15E00506C
:102870001200D9CFE6FFE1CFD9FF060EE126000E08
:10288000E66EE66AE66EE66A02EC01F0E552E552B3
:10289000E552E552020EDB6A030EDB6A020EDBCF65
:1028A00000F0030EDBCF01F0400E005C000E01587B
:1028B00001E395D0040EDB6A050EDB6A040EDBCF64
:1028C00000F0050EDBCF01F0600E005C000E015839
:1028D00001E37ED0D950020FE96EDACFEAFF370E5E
:1028E000D880EE54000EED5402E2DF6828D0D950B3
:1028F000020FE96EDACFEAFF2F0ED880EE54000EF9
:10290000ED5402E2DF6A39D0D950020FE96EDACF16
:10291000EAFF270ED880EE54000EED5403E2070EB6
:10292000DF6E3AD0D950020FE96EDACFEAFF1F0E00
:10293000D880EE54000EED5405E2070EDF6E010E56
:10294000DB6831D0D950020FE96EDACFEAFF170EFB
:10295000D880EE54000EED5403E2F80EDF6E21D065
:10296000D950020FE96EDACFEAFF0F0ED880EE548D
:10297000000EED5405E2F80EDF6EDE521F0E0ED093
:10298000D950020FE96EDACFEAFF070ED880EE5475
:10299000000EED5405E2DF68DE52E00EDD6E03D07E
:1029A000DF6A010EDB6A8A8A020EE66EE66AD9CF1A
:1029B000E6FFDACFE6FFE7EC50F0E552E552E552EC
:1029C000E552040EDB2A050E01E278D7DB2A76D722
:1029D000020EDB2A030E01E261D7DB2A5FD7060E67
:1029E000E15C02E2E16AE552E16EE552E7CFD9FF30
:0229F0001200D3
:0E29F200D9CFE6FFE1CFD9FFFD0EDBCF96FE79
:102A0000FE0EDBCF97FE96CE9AFE97CE9BFEFB0E78
:102A1000DBCF98FEFC0EDBCF99FE98CE9CFE99CEC4
:102A20009DFE0E01A76B000EA06FA16B9E6F9F6BAA
:102A3000010EA66FA469A569A269A369A86FE552F2
:102A4000E7CFD9FF1200D9CFE6FFE1CFD9FFFE0EC5
:102A5000DBCF01F0800E01140BE0FD0EDBCF00F0A8
:102A6000FE0EDBCF01F0006C011E000E012206D02D
:102A7000FD0EDBCF00F0FE0EDBCF01F000C0F3FF58
:102A800001C0F4FFE552E7CFD9FF1200D9CFE6FF2E
:102A9000E1CFD9FF020EE126FD0EDBCFE9FFFE0EEE
:102AA000DBCFEAFFEECFDEFFEDCFDDFFFB0EDBCFAE
:102AB000E9FFFC0EDBCFEAFFEECF00F0EFCF01F035
:102AC000FD0EDBCFE9FFFE0EDBCFEAFF00C0EEFF1D
:102AD00001C0EDFFFB0EDBCFE9FFFC0EDBCFEAFF11
:102AE000DECFEEFFDDCFEDFF020EE15C02E2E16A38
:102AF000E552E16EE552E7CFD9FF1200D9CFE6FFEC
:102B0000E1CFD9FFF50EDBCFE6FFF60EDBCFE6FF18
:102B1000F70EDBCFE6FFF80EDBCFE6FFF90EDBCFDB
:102B2000E6FFFA0EDBCFE6FFFB0EDBCFE6FFFC0E87
:102B3000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FFD1
:102B4000AEEC02F0006E0A0EE15E0050E552E7CFF7
:102B5000D9FF1200D9CFE6FFE1CFD9FFF70EDBCFC7
:102B6000E6FFF80EDBCFE6FFF90EDBCF02F0FA0E40
:102B7000DBCF03F0FB0EDB500224006EFC0EDB50BB
:102B80000320016E0006000E015A00C0E6FF01C0DE
:102B9000E6FFFD0EDBCFE6FFFE0EDBCFE6FFFB0E12
:102BA000DBCFE6FFFC0EDBCFE6FFFD0EDBCFE6FF63
:102BB000FE0EDBCFE6FFA2DF046E0A0EE15E0450DC
:102BC000E552E7CFD9FF1200D9CFE6FFE1CFD9FF19
:102BD000F70EDBCFE6FFF80EDBCFE6FFFB0EDBCF19
:102BE000E6FFFC0EDBCFE6FFF90EDBCF02F0FA0EBC
:102BF000DBCF03F0FD0EDB500224006EFE0EDB5037
:102C00000320016E0006000E015A00C0E6FF01C05D
:102C1000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E93
:102C2000DBCFE6FFFE0EDBCFE6FF68DF046E0A0EA9
:102C3000E15E0450E552E7CFD9FF1200D9CFE6FF9D
:102C4000E1CFD9FFF50EDBCFE6FFF60EDBCFE6FFD7
:102C5000F70EDBCF02F0F80EDBCF03F0FB0EDB50FC
:102C60000224006EFC0EDB500320016E00C0E6FF64
:102C7000E66EF90EDBCF06F0FA0EDBCF07F0FD0EA5
:102C8000DB500624046EFE0EDB500720056E04C0E8
:102C9000E6FFE66EFB0EDBCFE6FFFC0EDBCFE6FFCA
:102CA000FD0EDBCFE6FFFE0EDBCFE6FFD0EC04F03F
:102CB000086E0A0EE15E0850E552E7CFD9FF120018
:102CC000D9CFE6FFE1CFD9FFF50EDBCFE6FFF60E59
:102CD000DBCFE6FFF70EDBCF02F0F80EDBCF03F021
:102CE000FB0EDB500224006EFC0EDB500320016E55
:102CF00000C0E6FFE66EF90EDBCF06F0FA0EDBCF82
:102D000007F0FD0EDB500624046EFE0EDB5007209C
:102D1000056E04C0E6FFE66EFB0EDBCFE6FFFC0EA1
:102D2000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FFDF
:102D30001CEC07F0086E0A0EE15E0850E552E7CF82
:102D4000D9FF1200D9CFE6FFE1CFD9FFFD0EDBCFCF
:102D5000E6FFFE0EDBCFE6FF9CCEE6FF9DCEE6FF54
:102D60009ACEE6FF9BCEE6FF000EE66EE66AE66EC2
:102D7000E66AA6DF006E0A0EE15E0050E552E7CF7C
:102D8000D9FF12009EEF09F0D9CFE6FFE1CFD9FFBE
:102D90000A0EE126F90EDBCF00F0FA0EDBCF01F0D0
:102DA000010ED8800056000E015600C0DEFF01C0A3
:102DB000DDFF010EF36E020EF3CFDBFF030EDB6AC5
:102DC000FE0E1F6E2068F90EDBCF24F0FA0EDBCF6B
:102DD00025F065EC55F0040E1DC0DBFF050E1EC08E
:102DE000DBFF060EDB6A070EDB6AF90EDBCF1FF096
:102DF000FA0EDBCF20F0080E1FC0DBFF090E20C04B
:102E0000DBFFF70EDBCFE6FFF80EDBCFE6FFF90EB8
:102E1000DBCF02F0FA0EDBCF03F0FB0EDB50022417
:102E2000006EFC0EDB500320016E00C0E6FFE66E74
:102E3000FD0EDBCFE6FFFE0EDBCFE6FF92EC01F0EE
:102E4000046E060EE15E0450F70EDBCFE6FFF80ECF
:102E5000DBCFE6FFFB0EDBCF02F0FC0EDBCF03F097
:102E6000F90EDB50025C006EFA0EDB500358016E67
:102E700000C0E6FFE66EFD0EDBCFE6FFFE0EDBCF09
:102E8000E6FF92EC01F0046E060EE15E0450F70ED0
:102E9000DBCFE6FFF80EDBCFE6FFFB0EDBCFE6FF76
:102EA000FC0EDBCFE6FFF90EDBCF02F0FA0EDBCF34
:102EB00003F0FD0EDB500224006EFE0EDB500320FB
:102EC000016E00C0E6FFE66E92EC01F0046E060EA5
:102ED000E15E0450F70EDBCFE6FFF80EDBCFE6FF36
:102EE000FB0EDBCFE6FFFC0EDBCFE6FFFD0EDBCFFC
:102EF00002F0FE0EDBCF03F0F90EDB50025C006E39
:102F0000FA0EDB500358016E00C0E6FFE66E92EC4D
:102F100001F0046E060EE15E0450060EDBCF00F0F9
:102F2000070EDBCF01F0080EDBCF02F0090EDBCF7E
:102F300003F001500318E8AE02D0033404D002506D
:102F4000005C0350015801E3B1D1DECF00F0DDCFCA
:102F500001F00001800E01141CE1080EDB06090ED1
:102F600001E2DB06D950040FE96EDACFEAFF020E68
:102F7000EE26000EED22040EDBCF00F0050EDBCFB7
:102F800001F0D9CFE9FFDACFEAFF0050EE26015079
:102F9000ED22060EDB2A070E01E3DB2AD950020FD1
:102FA000E96EDACFEAFF020EEE26000EED22020EE7
:102FB000DBCF00F0030EDBCF01F0D9CFE9FFDACF92
:102FC000EAFF0050EE260150ED22F70EDBCFE6FFC0
:102FD000F80EDBCFE6FF080EDBCF02F0090EDBCFE9
:102FE00003F0FB0EDB500224006EFC0EDB500320CE
:102FF000016E00C0E6FFE66E060EDBCF06F0070EA0
:10300000DBCF07F0FD0EDB500624046EFE0EDB5016
:103010000720056E04C0E6FFE66E92EC01F0086E34
:10302000060EE15E0850F70EDBCFE6FFF80EDBCFB1
:10303000E6FF080EDBCF02F0090EDBCF03F0FB0E3C
:10304000DB500224006EFC0EDB500320016E00C03A
:10305000E6FFE66EFD0EDBCF06F0FE0EDBCF07F0DF
:10306000060EDB50065C046E070EDB500758056E3B
:1030700004C0E6FFE66E92EC01F0086E060EE15E1B
:103080000850F70EDBCFE6FFF80EDBCFE6FFFB0EB6
:10309000DBCF02F0FC0EDBCF03F0080EDB50025C4E
:1030A000006E090EDB500358016E00C0E6FFE66EAD
:1030B000060EDBCF06F0070EDBCF07F0FD0EDB5070
:1030C0000624046EFE0EDB500720056E04C0E6FFEA
:1030D000E66E92EC01F0086E060EE15E0850F70E07
:1030E000DBCFE6FFF80EDBCFE6FFFB0EDBCF02F017
:1030F000FC0EDBCF03F0080EDB50025C006E090E05
:10310000DB500358016E00C0E6FFE66EFD0EDBCF1C
:1031100006F0FE0EDBCF07F0060EDB50065C046EF9
:10312000070EDB500758056E04C0E6FFE66E92EC12
:1031300001F0086E060EE15E0850F70EDBCFE6FFE9
:10314000F80EDBCFE6FF060EDBCF02F0070EDBCF7B
:1031500003F0FB0EDB500224006EFC0EDB5003205C
:10316000016E00C0E6FFE66E080EDBCF06F0090E2A
:10317000DBCF07F0FD0EDB500624046EFE0EDB50A5
:103180000720056E04C0E6FFE66E92EC01F0086EC3
:10319000060EE15E0850F70EDBCFE6FFF80EDBCF40
:1031A000E6FF060EDBCF02F0070EDBCF03F0FB0ECF
:1031B000DB500224006EFC0EDB500320016E00C0C9
:1031C000E6FFE66EFD0EDBCF06F0FE0EDBCF07F06E
:1031D000080EDB50065C046E090EDB500758056EC6
:1031E00004C0E6FFE66E92EC01F0086E060EE15EAA
:1031F0000850F70EDBCFE6FFF80EDBCFE6FFFB0E45
:10320000DBCF02F0FC0EDBCF03F0060EDB50025CDE
:10321000006E070EDB500358016E00C0E6FFE66E3D
:10322000080EDBCF06F0090EDBCF07F0FD0EDB50FA
:103230000624046EFE0EDB500720056E04C0E6FF78
:10324000E66E92EC01F0086E060EE15E0850F70E95
:10325000DBCFE6FFF80EDBCFE6FFFB0EDBCF02F0A5
:10326000FC0EDBCF03F0060EDB50025C006E070E97
:10327000DB500358016E00C0E6FFE66EFD0EDBCFAB
:1032800006F0FE0EDBCF07F0080EDB50065C046E86
:10329000090EDB500758056E04C0E6FFE66E92EC9F
:1032A00001F0086E060EE15E085037D60A0EE15CAA
:1032B00002E2E16AE552E16EE552E7CFD9FF120082
:1032C000D9CFE6FFE1CFD9FF0A0EE126F90EDBCF19
:1032D00000F0FA0EDBCF01F0010ED8800056000E90
:1032E000015600C0DEFF01C0DDFF010EF36E020ECD
:1032F000F3CFDBFF030EDB6AFE0E1F6E2068F90EB4
:10330000DBCF24F0FA0EDBCF25F065EC55F0040E90
:103310001DC0DBFF050E1EC0DBFF060EDB6A070EBD
:10332000DB6AF90EDBCF1FF0FA0EDBCF20F0080EC0
:103330001FC0DBFF090E20C0DBFF060EDBCF00F055
:10334000070EDBCF01F0080EDBCF02F0090EDBCF5A
:1033500003F001500318E8AE02D0033404D0025049
:10336000005C0350015801E3CED1DECF00F0DDCF89
:1033700001F00001800E01141CE1080EDB06090EAD
:1033800001E2DB06D950040FE96EDACFEAFF020E44
:10339000EE26000EED22040EDBCF00F0050EDBCF93
:1033A00001F0D9CFE9FFDACFEAFF0050EE26015055
:1033B000ED22060EDB2A070E01E3DB2AD950020FAD
:1033C000E96EDACFEAFF020EEE26000EED22020EC3
:1033D000DBCF00F0030EDBCF01F0D9CFE9FFDACF6E
:1033E000EAFF0050EE260150ED22F80EDB50006E91
:1033F000016AE850040B5CE0F60EDBCFE6FFF70E47
:10340000DBCFE6FF080EDBCF02F0090EDBCF03F0C7
:10341000FB0EDB500224006EFC0EDB500320016E1D
:1034200000C0E6FFE66E060EDBCF06F0070EDBCF30
:1034300007F0FD0EDB500624046EFE0EDB50072065
:10344000056E04C0E6FFE66E92EC01F0086E060E13
:10345000E15E0850F60EDBCFE6FFF70EDBCFE6FFAE
:10346000060EDBCF02F0070EDBCF03F0FB0EDB50C6
:103470000224006EFC0EDB500320016E00C0E6FF4C
:10348000E66E080EDBCF06F0090EDBCF07F0FD0E6F
:10349000DB500624046EFE0EDB500720056E04C0D0
:1034A000E6FFE66E92EC01F0086E060EE15E085053
:1034B000F80EDB50006E016AE850020B5CE0F60E7D
:1034C000DBCFE6FFF70EDBCFE6FFFB0EDBCF02F034
:1034D000FC0EDBCF03F0080EDB50025C006E090E21
:1034E000DB500358016E00C0E6FFE66E060EDBCF30
:1034F00006F0070EDBCF07F0FD0EDB500624046E4E
:10350000FE0EDB500720056E04C0E6FFE66E92EC6F
:1035100001F0086E060EE15E0850F60EDBCFE6FF06
:10352000F70EDBCFE6FFFB0EDBCF02F0FC0EDBCFAE
:1035300003F0060EDB50025C006E070EDB500358F2
:10354000016E00C0E6FFE66E080EDBCF06F0090E46
:10355000DBCF07F0FD0EDB500624046EFE0EDB50C1
:103560000720056E04C0E6FFE66E92EC01F0086EDF
:10357000060EE15E0850F80EDB50006E016AE8505E
:10358000080B5CE0F60EDBCFE6FFF70EDBCFE6FFC5
:10359000060EDBCF02F0070EDBCF03F0FB0EDB5095
:1035A0000224006EFC0EDB500320016E00C0E6FF1B
:1035B000E66EFD0EDBCF06F0FE0EDBCF07F0080E49
:1035C000DB50065C046E090EDB500758056E04C024
:1035D000E6FFE66E92EC01F0086E060EE15E085022
:1035E000F60EDBCFE6FFF70EDBCFE6FF080EDBCFF4
:1035F00002F0090EDBCF03F0FB0EDB500224006E5D
:10360000FC0EDB500320016E00C0E6FFE66EFD0EEF
:10361000DBCF06F0FE0EDBCF07F0060EDB50065CBC
:10362000046E070EDB500758056E04C0E6FFE66E19
:1036300092EC01F0086E060EE15E0850F80EDB50C9
:10364000006E016AE850010B01E177D6F60EDBCF80
:10365000E6FFF70EDBCFE6FFFB0EDBCF02F0FC0E42
:10366000DBCF03F0060EDB50025C006E070EDB5072
:103670000358016E00C0E6FFE66EFD0EDBCF06F0DC
:10368000FE0EDBCF07F0080EDB50065C046E090E61
:10369000DB500758056E04C0E6FFE66E92EC01F0C1
:1036A000086E060EE15E0850F60EDBCFE6FFF70E61
:1036B000DBCFE6FFFB0EDBCF02F0FC0EDBCF03F02F
:1036C000080EDB50025C006E090EDB500358016EE1
:1036D00000C0E6FFE66EFD0EDBCF06F0FE0EDBCF90
:1036E00007F0060EDB50065C046E070EDB50075831
:1036F000056E04C0E6FFE66E92EC01F0086E060E61
:10370000E15E08501AD60A0EE15C02E2E16AE55277
:10371000E16EE552E7CFD9FF1200D9CFE6FFE1CF46
:10372000D9FFF70EDBCFE6FFF80EDBCFE6FF020E88
:103730001F6E206AF90EDBCF24F0FA0EDBCF25F0E6
:1037400065EC55F01DC000F01EC001F0010E002612
:10375000000E012200C0E6FF01C0E6FFFB0EDBCF3A
:1037600004F0FC0EDBCF05F0F90EDB50045C026EBA
:10377000FA0EDB500558036E02C0E6FFE66EFD0E42
:10378000DBCFE6FFFE0EDBCFE6FFAAEC15F0066E00
:10379000080EE15E0650F70EDBCFE6FFF80EDBCF3A
:1037A000E6FF000EE66EE66A030EE66EF90EDBCF6C
:1037B000E6FFFA0EDBCFE6FFFB0EDBCFE6FFFC0EEB
:1037C000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FF35
:1037D00008D8006E0B0EE15E0050E552E7CFD9FF2E
:1037E0001200D9CFE6FFE1CFD9FF0A0EE126F90E8C
:1037F000DBCF00F0FA0EDBCF01F0010ED8800056CF
:10380000000E015600C0DEFF01C0DDFF010EF36EA9
:10381000020EF3CFDBFF030EDB6AFE0E1F6E206885
:10382000F90EDBCF24F0FA0EDBCF25F065EC55F076
:10383000040E1DC0DBFF050E1EC0DBFF060EDB6A9B
:10384000070EDB6AF90EDBCF1FF0FA0EDBCF20F09C
:10385000080E1FC0DBFF090E20C0DBFF060EDBCF0A
:1038600000F0070EDBCF01F0080EDBCF02F0090EEF
:10387000DBCF03F001500318E8AE02D0033404D0CC
:103880000250005C0350015801E381D1DECF00F00B
:10389000DDCF01F00001800E01141CE1080EDB06F3
:1038A000090E01E2DB06D950040FE96EDACFEAFF18
:1038B000020EEE26000EED22040EDBCF00F0050E08
:1038C000DBCF01F0D9CFE9FFDACFEAFF0050EE26D7
:1038D0000150ED22060EDB2A070E01E3DB2AD95048
:1038E000020FE96EDACFEAFF020EEE26000EED229D
:1038F000020EDBCF00F0030EDBCF01F0D9CFE9FFE2
:10390000DACFEAFF0050EE260150ED22F80EDB5030
:10391000006E016AE850010B01E198D0F40EDBCF94
:10392000E6FFF50EDBCFE6FF020E1F6E206A080EE3
:10393000DBCF24F0090EDBCF25F065EC55F01DC080
:1039400002F01EC003F0010E0226000E0322F60E46
:10395000DB500224006EF70EDB500320016E00C026
:10396000E6FFE66EFB0EDBCF06F0FC0EDBCF07F0CA
:10397000080EDB50065C046E090EDB500758056E1E
:1039800004C0E6FFE66E060EDBCF0AF0070EDBCFC3
:103990000BF0FD0EDB500A24086EFE0EDB500B20F0
:1039A000096E08C0E6FFE66EAAEC15F00C6E080E74
:1039B000E15E0C50F40EDBCFE6FFF50EDBCFE6FF49
:1039C000020E1F6E206A060EDBCF24F0070EDBCF3F
:1039D00025F065EC55F01DC002F01EC003F0010E8D
:1039E0000226000E0322F60EDB500224006EF70EB4
:1039F000DB500320016E00C0E6FFE66EFB0EDBCF5E
:103A000006F0FC0EDBCF07F0060EDB50065C046E02
:103A1000070EDB500758056E04C0E6FFE66E080E81
:103A2000DBCF0AF0090EDBCF0BF0FD0EDB500A24D2
:103A3000086EFE0EDB500B20096E08C0E6FFE66E36
:103A4000AAEC15F00C6E080EE15E0C50F80EDB507F
:103A5000006E016AE850020B01E100D7F40EDBCFE3
:103A6000E6FFF50EDBCFE6FF020E1F6E206A080EA2
:103A7000DBCF24F0090EDBCF25F065EC55F01DC03F
:103A800002F01EC003F0010E0226000E0322F60E05
:103A9000DB500224006EF70EDB500320016E00C0E5
:103AA000E6FFE66EFB0EDBCF06F0FC0EDBCF07F089
:103AB000080EDB50065C046E090EDB500758056EDD
:103AC00004C0E6FFE66EFD0EDBCF0AF0FE0EDBCF94
:103AD0000BF0060EDB500A5C086E070EDB500B582D
:103AE000096E08C0E6FFE66EAAEC15F00C6E080E33
:103AF000E15E0C50F40EDBCFE6FFF50EDBCFE6FF08
:103B0000020E1F6E206A060EDBCF24F0070EDBCFFD
:103B100025F065EC55F01DC002F01EC003F0010E4B
:103B20000226000E0322F60EDB500224006EF70E72
:103B3000DB500320016E00C0E6FFE66EFB0EDBCF1C
:103B400006F0FC0EDBCF07F0060EDB50065C046EC1
:103B5000070EDB500758056E04C0E6FFE66EFD0E4B
:103B6000DBCF0AF0FE0EDBCF0BF0080EDB500A5C59
:103B7000086E090EDB500B58096E08C0E6FFE66EB2
:103B8000AAEC15F00C6E080EE15E0C5067D60A0E1A
:103B9000E15C02E2E16AE552E16EE552E7CFD9FF6E
:103BA0001200D9CFE6FFE1CFD9FFF10EDBCFE6FF60
:103BB000F20EDBCFE6FFF70EDBCFE6FFF80EDBCF32
:103BC000E6FFF90EDBCFE6FFFA0EDBCFE6FFFB0EDA
:103BD000DBCFE6FFFC0EDBCFE6FFFD0EDBCFE6FF23
:103BE000FE0EDBCFE6FF7EEC15F0006E0A0EE15E06
:103BF0000050F10EDBCFE6FFF20EDBCFE6FFF30E57
:103C0000DBCFE6FFF40EDBCFE6FFF50EDBCFE6FF02
:103C1000F60EDBCFE6FFF70EDBCFE6FFF80EDBCFCD
:103C2000E6FFF90EDBCFE6FFFA0EDBCFE6FF7EEC18
:103C300015F0006E0A0EE15E0050F10EDBCFE6FFDC
:103C4000F20EDBCFE6FFFB0EDBCFE6FFFC0EDBCF99
:103C5000E6FFFD0EDBCFE6FFFE0EDBCFE6FFF30E49
:103C6000DBCFE6FFF40EDBCFE6FFF50EDBCFE6FFA2
:103C7000F60EDBCFE6FF7EEC15F0006E0A0EE15E7D
:103C80000050E552E7CFD9FF1200D9CFE6FFE1CFD0
:103C9000D9FF180EE126F90EDBCF02F0FA0EDBCFCA
:103CA00003F0FD0EDB50025C006EFE0EDB5003588D
:103CB000016E080E00C0DBFF090E01C0DBFFF70E2E
:103CC000DBCF02F0F80EDBCF03F0FB0EDB50025C23
:103CD000006EFC0EDB500358016E0A0E00C0DBFFC5
:103CE0000B0E01C0DBFFF50EDBCF02F0F60EDBCFD3
:103CF00003F0FD0EDB50025C006EFE0EDB5003583D
:103D0000016E0C0E00C0DBFF0D0E01C0DBFFF30ED9
:103D1000DBCF02F0F40EDBCF03F0FB0EDB50025CD6
:103D2000006EFC0EDB500358016E0E0E00C0DBFF70
:103D30000F0E01C0DBFFF50EDBCF02F0F60EDBCF7E
:103D400003F0F90EDB50025C006EFA0EDB500358F4
:103D5000016E100E00C0DBFF110E01C0DBFFF30E81
:103D6000DBCF02F0F40EDBCF03F0F70EDB50025C8A
:103D7000006EF80EDB500358016E120E00C0DBFF20
:103D8000130E01C0DBFF140EDB6A150EDB6A160E84
:103D9000DB6A170EDB6AFB0EDBCF00F0FC0EDBCF1D
:103DA00001F0F70EDBCF02F0F80EDBCF03F003508B
:103DB0000118E8AE02D0013404D00050025C01507A
:103DC000035824E2D950F70FE66EFF0EDA20E66EB4
:103DD000D950FB0FE66EFF0EDA20E66E46EC15F0CA
:103DE000E552E552E552E552D950F90FE66EFF0E65
:103DF000DA20E66ED950FD0FE66EFF0EDA20E66E91
:103E000046EC15F0E552E552E552E552F70EDBCFF0
:103E100000F0F80EDBCF01F0F30EDBCF02F0F40E72
:103E2000DBCF03F003500118E8AE02D0013404D018
:103E30000050025C0150035824E2D950F70FE66E9F
:103E4000FF0EDA20E66ED950F30FE66EFF0EDA2091
:103E5000E66E46EC15F0E552E552E552E552D950D2
:103E6000F90FE66EFF0EDA20E66ED950F50FE66E1A
:103E7000FF0EDA20E66E46EC15F0E552E552E5520B
:103E8000E552FB0EDBCF00F0FC0EDBCF01F0F70EAE
:103E9000DBCF02F0F80EDBCF03F003500118E8AEE1
:103EA00002D0013404D00050025C0150035824E2D7
:103EB000D950F70FE66EFF0EDA20E66ED950FB0FF1
:103EC000E66EFF0EDA20E66E46EC15F0E552E5529E
:103ED000E552E552D950F90FE66EFF0EDA20E66E94
:103EE000D950FD0FE66EFF0EDA20E66E46EC15F0B7
:103EF000E552E552E552E552FB0EDBCF00F0FC0E39
:103F0000DBCF01F0F30EDB50001801E0BCD0F40E63
:103F1000DB50011801E0B7D0FD0EDBCF1FF0FE0E25
:103F2000DBCF20F0020E1FC0DBFF030E20C0DBFF43
:103F30001FC0DEFF20C0DDFFF90EDBCF00F0FA0E60
:103F4000DBCF01F0DECF02F0DDCF03F0015003182C
:103F5000E8AE02D0033404D00250005C0350015894
:103F600006E2F90EDBCFDEFFDBCFDDFF23D0F90E5B
:103F7000DBCF00F0FA0EDBCF01F0020EDBCF02F058
:103F8000030EDBCF03F003500118E8AE02D001347A
:103F900004D00050025C015003580CE2F90EDBCF54
:103FA0001FF0FA0EDBCF20F0020E1FC0DBFF030E66
:103FB00020C0DBFFF50EDBCF00F0F60EDBCF01F00B
:103FC000DECF02F0DDCF03F001500318E8AE02D0DF
:103FD000033404D00250005C0350015806E2F50E91
:103FE000DBCFDEFFDBCFDDFF23D0F50EDBCF00F034
:103FF000F60EDBCF01F0020EDBCF02F0030EDBCFBB
:1040000003F003500118E8AE02D0013404D0005090
:10401000025C015003580CE2F50EDBCF1FF0F60EE8
:10402000DBCF20F0020E1FC0DBFF030E20C0DBFF42
:10403000F10EDBCFE6FFF20EDBCFE6FF020EDBCFA9
:1040400002F0030EDBCF03F0DE50025C006EDD50A9
:104050000358016E010E0026000E012200C0E6FF8B
:1040600001C0E6FFFB0EDBCFE6FFFC0EDBCFE6FF79
:10407000DECFE6FFDDCFE6FFE4EC15F0046E080EC0
:10408000E15E045008D2F70EDBCF00F0F80EDBCF74
:1040900001F0F30EDB50001811E1F40EDB500118B3
:1040A0000DE1F70EDBCF1FF0F80EDBCF20F0060E90
:1040B0001FC0DBFF070E20C0DBFF0FD0F70EDBCFEA
:1040C00000F0F80EDBCF01F00006000E015A060EDC
:1040D00000C0DBFF070E01C0DBFFFB0EDBCF1FF0D4
:1040E000FC0EDBCF20F0040E1FC0DBFF050E20C04E
:1040F000DBFF040EDBCF00F0050EDBCF01F0060E78
:10410000DBCF02F0070EDBCF03F003500118E8AE5F
:1041100002D0013404D00050025C0150035801E287
:10412000B1D0FD0EDBCF02F0FE0EDBCF03F0140E9C
:10413000DBCF1FF0150EDBCF20F00A0EDBCF24F013
:104140000B0EDBCF25F03FEC55F002501F24006E24
:1041500003502020016E00C0DEFFDD6EFD0EDBCFC0
:1041600002F0FE0EDBCF03F0160EDBCF1FF0170EB2
:10417000DBCF20F00E0EDBCF24F00F0EDBCF25F0CF
:104180003FEC55F002501F24006E03502020016EBA
:10419000020E00C0DBFF030E01C0DBFF080EDBCF09
:1041A00000F0090EDBCF01F0D950140FE96EDACF21
:1041B000EAFF0050EE260150ED220C0EDBCF00F09E
:1041C0000D0EDBCF01F0D950160FE96EDACFEAFF02
:1041D0000050EE260150ED22DECF00F0DDCF01F0E1
:1041E000020EDBCF02F0030EDBCF03F00350011809
:1041F000E8AE02D0013404D00050025C01500358F4
:1042000010E2D950020FE66E000EDA20E66ED9CF2A
:10421000E6FFDACFE6FF46EC15F0E552E552E5524F
:10422000E552F10EDBCFE6FFF20EDBCFE6FF020E2A
:10423000DBCF02F0030EDBCF03F0DE50025C006E3A
:10424000DD500358016E010E0026000E012200C051
:10425000E6FF01C0E6FF040EDBCFE6FF050EDBCF75
:10426000E6FFDECFE6FFDDCFE6FFE4EC15F0046EFF
:10427000080EE15E0450040EDB2A050E01E239D778
:10428000DB2A37D7040EDBCF02F0050EDBCF03F0BD
:10429000F70EDB50025C006EF80EDB500358016E27
:1042A000100EDBCF1FF0110EDBCF20F000C024F08A
:1042B00001C025F065EC55F0140E1DC0DBFF150E96
:1042C0001EC0DBFF040EDBCF02F0050EDBCF03F0D8
:1042D000FB0EDB50025C006EFC0EDB500358016EDF
:1042E0000C0EDBCF1FF00D0EDBCF20F000C024F052
:1042F00001C025F065EC55F0160E1DC0DBFF170E52
:104300001EC0DBFF040EDBCF00F0050EDBCF01F09B
:10431000F30EDBCF02F0F40EDBCF03F003500118F5
:10432000E8AE02D0013404D00050025C01500358C2
:1043300001E2B1D0F90EDBCF02F0FA0EDBCF03F0D1
:10434000140EDBCF1FF0150EDBCF20F0120EDBCFEB
:1043500024F0130EDBCF25F03FEC55F002501F2464
:10436000006E03502020016E00C0DEFFDD6EFD0EEA
:10437000DBCF02F0FE0EDBCF03F0160EDBCF1FF01B
:10438000170EDBCF20F00E0EDBCF24F00F0EDBCFAD
:1043900025F03FEC55F002501F24006E0350202002
:1043A000016E020E00C0DBFF030E01C0DBFF100E2A
:1043B000DBCF00F0110EDBCF01F0D950140FE96E06
:1043C000DACFEAFF0050EE260150ED220C0EDBCFD3
:1043D00000F00D0EDBCF01F0D950160FE96EDACFE9
:1043E000EAFF0050EE260150ED22DECF00F0DDCFD7
:1043F00001F0020EDBCF02F0030EDBCF03F003501F
:104400000118E8AE02D0013404D00050025C015023
:10441000035810E2D950020FE66E000EDA20E66E65
:10442000D9CFE6FFDACFE6FF46EC15F0E552E552CC
:10443000E552E552F10EDBCFE6FFF20EDBCFE6FFF1
:10444000020EDBCF02F0030EDBCF03F0DE50025C86
:10445000006EDD500358016E010E0026000E012291
:1044600000C0E6FF01C0E6FF040EDBCFE6FF050E4D
:10447000DBCFE6FFDECFE6FFDDCFE6FFE4EC15F0B5
:10448000046E080EE15E0450040EDB2A050E01E204
:1044900039D7DB2A37D7180EE15C02E2E16AE55230
:1044A000E16EE552E7CFD9FF1200D9CFE6FFE1CFA9
:1044B000D9FFF30EDBCFE6FFF40EDBCFE6FFF90EFC
:1044C000DBCF02F0FA0EDBCF03F0020E1F6E206A84
:1044D000F50EDBCF24F0F60EDBCF25F065EC55F0C2
:1044E0001D50025C006E1E500358016E00C0E6FFB6
:1044F000E66EFB0EDBCFE6FFFC0EDBCFE6FFF50E34
:10450000DBCF06F0F60EDBCF07F0FD0EDB50062406
:10451000046EFE0EDB500720056E04C0E6FFE66E5B
:10452000E4EC15F0086E080EE15E0850F30EDBCFE8
:10453000E6FFF40EDBCFE6FFF90EDBCF02F0FA0E5A
:10454000DBCF03F0020E1F6E206AF50EDBCF24F0E6
:10455000F60EDBCF25F065EC55F01D50025C006EC9
:104560001E500358016E00C0E6FFE66EF70EDBCF6B
:1045700006F0F80EDBCF07F0FB0EDB500624046ECE
:10458000FC0EDB500720056E0406000E055A04C021
:10459000E6FF05C0E6FFF50EDBCF0AF0F60EDBCF37
:1045A0000BF0FD0EDB500A24086EFE0EDB500B20D4
:1045B000096E08C0E6FFE66EE4EC15F00C6E080E1E
:1045C000E15E0C50F30EDBCFE6FFF40EDBCFE6FF2F
:1045D000F70EDBCF02F0F80EDBCF03F0020E1F6EFA
:1045E000206AF50EDBCF24F0F60EDBCF25F065EC6C
:1045F00055F01D50025C006E1E500358016E00C045
:10460000E6FFE66EF50EDBCF06F0F60EDBCF07F029
:10461000FB0EDB500624046EFC0EDB500720056EFB
:1046200004C0E6FFE66EFD0EDBCFE6FFFE0EDBCF3D
:10463000E6FFAAEC15F0086E080EE15E0850F30ED6
:10464000DBCFE6FFF40EDBCFE6FFF70EDBCF02F0A9
:10465000F80EDBCF03F0020E1F6E206AF50EDBCFE3
:1046600024F0F60EDBCF25F065EC55F01D50025C12
:10467000006E1E500358016E00C0E6FFE66EF50E98
:10468000DBCF06F0F60EDBCF07F0FB0EDB50062487
:10469000046EFC0EDB500720056E04C0E6FFE66EDC
:1046A000F90EDBCF0AF0FA0EDBCF0BF0FD0EDB507C
:1046B0000A24086EFE0EDB500B20096E0806000E61
:1046C000095A08C0E6FF09C0E6FFAAEC15F00C6E17
:1046D000080EE15E0C50F30EDBCFE6FFF40EDBCFED
:1046E000E6FF010EE66EF50EDBCFE6FFF60EDBCF42
:1046F000E6FFF50EDBCF02F0F60EDBCF03F0FB0E8C
:10470000DB500224006EFC0EDB500320016E00C063
:10471000E6FFE66EF50EDBCF06F0F60EDBCF07F018
:10472000FD0EDB500624046EFE0EDB500720056EE6
:1047300004C0E6FFE66E60EC19F0086E090EE15E5B
:104740000850F30EDBCFE6FFF40EDBCFE6FF020EE0
:10475000E66EF50EDBCFE6FFF60EDBCFE6FFF50EDD
:10476000DBCF02F0F60EDBCF03F0FB0EDB500224B2
:10477000006EFC0EDB500320016E00C0E6FFE66E0B
:10478000F90EDBCF08F0FA0EDBCF09F0FD0EDB509F
:104790000824066EFE0EDB500920076EF50EDB5076
:1047A000065C046EF60EDB500758056E0406000E1C
:1047B000055A04C0E6FF05C0E6FF60EC19F00A6E7A
:1047C000090EE15E0A50F30EDBCFE6FFF40EDBCFFD
:1047D000E6FF040EE66EF50EDBCFE6FFF60EDBCF4E
:1047E000E6FFF70EDBCF04F0F80EDBCF05F0FB0E93
:1047F000DB500424026EFC0EDB500520036EF50E28
:10480000DB50025C006EF60EDB500358016E0006B2
:10481000000E015A00C0E6FF01C0E6FFF90EDBCF33
:104820000AF0FA0EDBCF0BF0FD0EDB500A24086E07
:10483000FE0EDB500B20096EF50EDB50085C066E99
:10484000F60EDB500958076E0606000E075A06C022
:10485000E6FF07C0E6FF60EC19F00C6E090EE15EA2
:104860000C50F30EDBCFE6FFF40EDBCFE6FF080EB5
:10487000E66EF50EDBCFE6FFF60EDBCFE6FFF70EBA
:10488000DBCF04F0F80EDBCF05F0FB0EDB50042489
:10489000026EFC0EDB500520036EF50EDB50025C51
:1048A000006EF60EDB500358016E0006000E015A32
:1048B00000C0E6FF01C0E6FFF50EDBCF08F0F60E04
:1048C000DBCF09F0FD0EDB500824066EFE0EDB5038
:1048D0000920076E06C0E6FFE66E60EC19F00A6E6E
:1048E000090EE15E0A50E552E7CFD9FF1200D9CF99
:1048F000E6FFE1CFD9FFF30EDBCFE6FFF40EDBCF0F
:10490000E6FFF70EDBCFE6FFF80EDBCFE6FFF90E92
:10491000DBCF02F0FA0EDBCF03F0020E1F6E206A2F
:10492000F50EDBCF24F0F60EDBCF25F065EC55F06D
:104930001D50025C006E1E500358016E00C0E6FF61
:10494000E66EFB0EDBCFE6FFFC0EDBCFE6FFF50EDF
:10495000DBCF06F0F60EDBCF07F0FD0EDB500624B2
:10496000046EFE0EDB500720056E04C0E6FFE66E07
:1049700060EC16F0086E0A0EE15E0850F30EDBCF15
:10498000E6FFF40EDBCFE6FFF70EDBCF02F0F80E0A
:10499000DBCF03F0020E1F6E206AF50EDBCF24F092
:1049A000F60EDBCF25F065EC55F01D50025C006E75
:1049B0001E500358016E0006000E015A00C0E6FFAB
:1049C00001C0E6FF010EE66EF50EDBCFE6FFF60E48
:1049D000DBCFE6FFF50EDBCF06F0F60EDBCF07F000
:1049E000FB0EDB500624046EFC0EDB500720056E28
:1049F00004C0E6FFE66EF90EDBCF0CF0FA0EDBCF5B
:104A00000DF0FD0EDB500C240A6EFE0EDB500D2067
:104A10000B6EF50EDB500A5C086EF60EDB500B5881
:104A2000096E0806000E095A08C0E6FF09C0E6FF35
:104A3000F1EC1BF00E6E0B0EE15E0E50F30EDBCFB1
:104A4000E6FFF40EDBCFE6FFF70EDBCF02F0F80E49
:104A5000DBCF03F0020E1F6E206AF50EDBCF24F0D1
:104A6000F60EDBCF25F065EC55F01D50025C006EB4
:104A70001E500358016E0006000E015A00C0E6FFEA
:104A800001C0E6FF020EE66EF50EDBCFE6FFF60E86
:104A9000DBCFE6FFF50EDBCF06F0F60EDBCF07F03F
:104AA000FB0EDB500624046EFC0EDB500720056E67
:104AB00004C0E6FFE66EF50EDBCF0AF0F60EDBCFA4
:104AC0000BF0FD0EDB500A24086EFE0EDB500B20AF
:104AD000096E08C0E6FFE66EF1EC1BF00C6E0B0EE3
:104AE000E15E0C50E552E7CFD9FF1200D9CFE6FFC7
:104AF000E1CFD9FF040EE126020EDB6A030EDB6A6A
:104B0000020EDBCF00F0030EDBCF01F0F50EDBCFA2
:104B100002F0F60EDBCF03F001500318E8AE02D02E
:104B2000033404D00250005C0350015801E393D0D9
:104B3000DE6ADD6ADECF00F0DDCF01F0F70EDBCFFD
:104B400002F0F80EDBCF03F001500318E8AE02D0FC
:104B5000033404D00250005C0350015875E2020E89
:104B6000DBCF08F0030EDBCF09F0080E246E256AB8
:104B700008C01FF009C020F03FEC55F01BC008F042
:104B80001CC009F0DECF04F0DDCF05F0080E066E84
:104B9000076A020EDBCF1FF0030EDBCF20F006C04A
:104BA00024F007C025F03FEC55F0F70EDBCF24F0E2
:104BB000F80EDBCF25F065EC55F004501D24026E95
:104BC00005501E20036EF90EDB500224E96EFA0E2A
:104BD000DB500320EA6EEF5000010814016AE85030
:104BE00001102CE0F30EDBCFE6FFF40EDBCFE6FF87
:104BF000020EDBCF02F0030EDBCF03F0FB0EDB5027
:104C00000224006EFC0EDB500320016E00C0E6FFA4
:104C1000E66EFD0EDBCF06F0FE0EDBCF07F0DE50BA
:104C20000624046EDD500720056E04C0E6FFE66E24
:104C300092EC01F0086E060EE15E0850DF2A010ECC
:104C400001E278D7DB2A76D7020EDB2A030E01E2D7
:104C500057D7DB2A55D7040EE15C02E2E16AE55240
:104C6000E16EE552E7CFD9FF1200D9CFE6FFE1CFE1
:104C7000D9FF060EE126FD0EDBCF06F0FE0EDBCFE0
:104C800007F00E0107509B19E8AE02D09B3504D007
:104C90009A51065C9B51075813E2FB0EDBCF08F0DC
:104CA000FC0EDBCF09F009509D19E8AE02D09D350E
:104CB00004D09C51085C9D51095802E2000E01D0BD
:104CC000010E046E056AE850051022E1FD0EDBCFEF
:104CD0000CF0FE0EDBCF0DF0F50EDB500E6E0F6A02
:104CE000050E1F6E206A0EC024F00FC025F065EC83
:104CF00055F00C501D240A6E0D501E200B6E0A0636
:104D0000000E0B5A0001800E0B1402E1000E01D0C0
:104D1000010E026E036AE850031022E1FB0EDBCFA6
:104D200012F0FC0EDBCF13F0F50EDB50146E156A9B
:104D3000080E1F6E206A14C024F015C025F065EC23
:104D400055F012501D24106E13501E20116E1006C7
:104D5000000E115A0001800E111402E1000E01D064
:104D6000010E016AE850011001E024D1DE6ADD6A1B
:104D7000DECF00F0DDCF01F0D890015004E6060E42
:104D8000005C000E015801E315D1D9CFE9FFDACF5D
:104D9000EAFF050EEE1807E1ED5005E1040EDB6AAF
:104DA000050EDB6A2FD01D0E006E980E016E000EF0
:104DB000026EDECF06F0DDCF07F0FA0EDB50050DF8
:104DC000F3500624036EF4500720046E056A04BEF7
:104DD000056800500324F36E01500420F46E025065
:104DE0000520F86EF4CFF7FFF3CFF6FF0800F5507B
:104DF000E66ED950040FE96EDACFEAFFE552E750CC
:104E0000EE6EED6A020EDB6A030EDB6A020EDBCF8A
:104E100000F0030EDBCF01F0D890015004E6080E3D
:104E2000005C000E015801E3BFD0040EDB50010B03
:104E300013E0F50EDB50006E016A010E001807E169
:104E4000015005E1F80EDBCFE6FFF90E21D0F80E98
:104E5000DBCFE6FFF90E49D0F60EDBCF00F0F70E00
:104E6000DBCF01F0F80EDB50001803E1F90EDB5048
:104E7000011801E184D0F50EDB50006E016A010ECD
:104E800000182FE101502DE1F60EDBCFE6FFF70E03
:104E9000DBCFE6FF020EDBCF02F0030EDBCF03F029
:104EA000FB0EDB500224006EFC0EDB500320016E73
:104EB00000C0E6FFE66EFD0EDBCF06F0FE0EDBCF98
:104EC00007F0DE500624046EDD500720056E04C096
:104ED000E6FFE66E92EC01F0086E060EE15E085009
:104EE0004ED0F60EDBCFE6FFF70EDBCFE6FFF50E7A
:104EF000DBCFE6FFE66ADBCFE6FFE66AFB0EDBCF41
:104F000002F0FC0EDBCF03F0F50EDB50046E056AF9
:104F1000020EDBCF1FF0030EDBCF20F004C024F025
:104F200005C025F065EC55F002501D24006E0350BD
:104F30001E20016E00C0E6FFE66EFD0EDBCF08F01E
:104F4000FE0EDBCF09F0F50EDB500A6E0B6A1F6E0A
:104F50000BC020F0DECF24F0DDCF25F065EC55F05E
:104F600008501D24066E09501E20076E06C0E6FF7D
:104F7000E66E60EC16F00C6E0A0EE15E0C50D95035
:104F8000040FE96EDACFEAFF010E0F0B06E0EC52D8
:104F9000D890ED32EF32E806FAE1020EDB2A030E7A
:104FA00001E234D7DB2A32D7DF2A010E01E2E0D654
:104FB000DB2ADED6060EE15C02E2E16AE552E16E32
:104FC000E552E7CFD9FF1200D9CFE6FFE1CFD9FFF5
:104FD000FE0EDB50006E016A0A0E001804E101505B
:104FE00002E10E014CD0FE0EDB50006E016A0D0E88
:104FF000001802E101504BE00E01A651E66EA4CE6E
:10500000E6FFA5CEE6FFA2CEE6FFA3CEE6FFFE0EAC
:10501000DB50E66EA0CEE6FFA1CEE6FF9ECEE6FF19
:105020009FCEE6FF22DE006E0A0EE15E00500E010A
:10503000A651060DF3509E27F4509F23A851026EEF
:10504000036A0250031013E0A651060DF3509A5D57
:10505000046EF4509B59056EE8509F19E8AE02D0DB
:105060009F3504D09E51045C9F51055802E3000E09
:1050700001D0010E006E016AE850011008E0A6514F
:10508000080DF350A027F450A1239E6B9F6BE552AF
:10509000E7CFD9FF1200D9CFE6FFE1CFD9FF040E49
:1050A000E126D950FC0F006EFF0EDA20016E020ED1
:1050B00000C0DBFF030E01C0DBFF020EDBCFE6FF0B
:1050C000030EDBCFE6FFFC0EDBCFE6FFFD0EDBCFF2
:1050D000E6FFFE0EDBCFE6FF000EE66E0E0EE66E7E
:1050E0004BEC56F0006E070EE15E0050000EE66ECF
:1050F0000E0EE66E48EC54F0E552E552010EF3CF89
:10510000DBFFDF6ADF50006E016A010EDB50000139
:1051100001AE02D0D89003D0005C000E01580CE222
:10512000DF50EA6A000FE96E0E0EEA22EF50E66EDB
:105130004BDFE552DF2AE6D7040EE15C02E2E16ACA
:10514000E552E16EE552E7CFD9FF1200D9CFE6FF75
:10515000E1CFD9FFFD0EDBCF9EFEFE0EDBCF9FFE23
:10516000FB0EDBCFA0FEFC0EDBCFA1FEE552E7CFAE
:10517000D9FF1200D9CFE6FFE1CFD9FFFD0EDBCF7B
:10518000A2FEFE0EDBCFA3FEFD0EDBCFA4FEFE0EC5
:10519000DBCFA5FEE552E7CFD9FF1200D9CFE6FF5E
:1051A000E1CFD9FFFD0EDBCFA2FEFE0EDBCFA3FECB
:1051B000FB0EDBCFA4FEFC0EDBCFA5FEE552E7CF56
:1051C000D9FF1200D9CFE6FFE1CFD9FFFE0EDB50A9
:1051D000026E036A033408E202500008000E035412
:1051E00003E2FE0EDB5001D0010E006E016AE8CF33
:1051F000A6FEE552E7CFD9FF1200D9CFE6FFE1CFF7
:10520000D9FFFE0EDB500E01A86FE552E7CFD9FFA4
:105210001200D9CFE6FFE1CFD9FFFE0EDBCFE7FFCB
:10522000030EE716FE0EE7CFDBFFDB500E01A76F84
:10523000FE0EDB50006E016A010E001801E1015004
:1052400017E0030E001801E1015012E0005001E1E7
:10525000015005E0020E001813E1015011E196CE55
:105260009AFE97CE9BFE98CE9CFE99CE9DFE08D0CE
:1052700098CE9AFE99CE9BFE96CE9CFE97CE9DFE32
:10528000E552E7CFD9FF12000E01030EA717A75171
:1052900012009CCEF3FF9DCEF4FF12009ACEF3FFD6
:0652A0009BCEF4FF12009A
:0A52A600200EE66EE66A800EE66E4A
:1052B000E66AF9EC14F0E552E552E552E5521200C7
:1052C000D9CFE6FFE1CFD9FF8A9C010EE66E2DEC27
:1052D00057F0E5528A8CAE0EE66E79D8E552D50EBF
:1052E000E66E75D8E552800EE66E71D8E552A80ECE
:1052F000E66E6DD8E5521F0EE66E69D8E552D30E04
:10530000E66E65D8E552E66A62D8E552400EE66E72
:105310005ED8E5528D0EE66E5AD8E552FE0EDB5091
:10532000006E016A010E001804E1015002E1100E46
:1053300001D0140EE66E4BD8E552200EE66E47D82B
:10534000E552E66A44D8E552A10EE66E40D8E55231
:10535000C80EE66E3CD8E552DA0EE66E38D8E55255
:10536000020EE66E34D8E552810EE66E30D8E55274
:105370008F0EE66E2CD8E552D90EE66E28D8E5528F
:10538000FE0EDB50006E016A010E001804E10150B0
:1053900002E1220E01D0F10EE66E19D8E552DB0EC5
:1053A000E66E15D8E552400EE66E11D8E552A40E11
:1053B000E66E0DD8E552A60EE66E09D8E552AF0EA0
:1053C000E66E05D8E552E552E7CFD9FF1200D9CFF6
:1053D000E6FFE1CFD9FFE652FE0EDB50DF6E8A9A80
:1053E000010EE66EE66AD9CFE6FFDACFE6FFE7EC1C
:1053F00050F0E552E552E552E552E552E552E7CF6D
:10540000D9FF1200D9CFE6FFE1CFD9FFE652FE0E59
:10541000DB50DF6E8A8A010EE66EE66AD9CFE6FFC0
:10542000DACFE6FFE7EC50F0E552E552E552E552FF
:10543000E552E552E7CFD9FF1200E66A020EE66EAA
:10544000E66AFF0EE66E000EE66E2EEC54F0050ED8
:10545000E15E1200D9CFE6FFE1CFD9FFFE0EDB50AF
:10546000006E016AE850011002E0A70E01D0A60EFE
:10547000E66EADDFE552E552E7CFD9FF1200D9CF96
:10548000E6FFE1CFD9FF030EE126020EDB6AE66AF2
:105490009EDFE552100EE66E9ADFE552400EE66E94
:1054A00096DFE5528A8AE66A020EE66EFF0EE66E27
:1054B000000EE66EE7EC50F0E552E552E552E5529B
:1054C000030EE15C02E2E16AE552E16EE552E7CFEC
:1054D000D9FF1200D9CFE6FFE1CFD9FFFD0EDBCF18
:1054E00006F0FE0EDBCF07F00001800E071423E16B
:1054F000FD0EDBCF08F0FE0EDBCF09F008C0E6FFA3
:1055000009C0E6FF4EEC29F0E552E7CF09F0E5527D
:10551000E7CF08F0F3CF0AF0F4CF0BF00950F418FE
:10552000E8AE02D00B3404D00A50085C0B50095886
:1055300002E2000E01D0010E046E056AE85005106B
:105540000CE1FB0EDBCF0CF0FC0EDBCF0DF000010D
:10555000800E0D1402E1000E01D0010E026E036AEE
:10556000E850031023E1FB0EDBCF0EF0FC0EDBCF87
:105570000FF00EC0E6FF0FC0E6FF49EC29F0E55240
:10558000E7CF0FF0E552E7CF0EF0F3CF10F0F4CFF6
:1055900011F00F50F418E8AE02D0113404D01050BE
:1055A0000E5C11500F5802E2000E01D0010E006E89
:1055B000016AE850011001E0FED044EC29F0006ED1
:1055C000016A030E001801E1015042E0020E0018CA
:1055D00001E1015029E0010E00185FE101505DE199
:1055E000D950FB0FE66EFF0EDA20E66ED950FD0FA4
:1055F000E66EFF0EDA20E66E46EC15F0E552E55257
:10560000E552E552FD0EDBCF00F0FE0EDBCF01F0E0
:10561000800ED8800056000E01560006015AFD0E7D
:1056200000C0DBFFFE0E37D0FD0EDBCF00F0FE0E1C
:10563000DBCF01F0800ED8800056000E0156000628
:10564000015AFD0E00C0DBFFFE0E01C0DBFF12D0D1
:10565000D950FB0FE66EFF0EDA20E66ED950FD0F33
:10566000E66EFF0EDA20E66E46EC15F0E552E552E6
:10567000E552E552FB0EDBCF00F0FC0EDBCF01F074
:10568000200ED8800056000E01560006015AFB0E6F
:1056900000C0DBFFFC0E01C0DBFFD950F90FE96E43
:1056A000FF0EDA20EA6E010EEE1842E1ED5040E105
:1056B000FB0EDBCF03F0FC0EDBCF04F0080E246EF4
:1056C000256A03C01FF004C020F03FEC55F01BC05A
:1056D00003F01CC004F01B50B3EC57F0F3CF02F002
:1056E000FB0EDBCF00F0FC0EDBCF01F0080E246ECA
:1056F000256A00C01FF001C020F03FEC55F01FC02C
:1057000000F020C001F0070ED89000360136E80600
:10571000FBE1FD0EDB500024E96EFE0EDB500120A4
:10572000EA6EFF0EE926000EEA220250EF1243D085
:10573000FB0EDBCF04F0FC0EDBCF05F0080E246E71
:10574000256A04C01FF005C020F03FEC55F01BC0D7
:1057500004F01CC005F01B50B3EC57F0F3CF02F07F
:10576000F4CF03F0021E031EFB0EDBCF00F0FC0E95
:10577000DBCF01F0080E246E256A00C01FF001C0C7
:1057800020F03FEC55F01FC000F020C001F0070EE4
:10579000D89000360136E806FBE1FD0EDB50002410
:1057A000E96EFE0EDB500120EA6EFF0EE926000EC8
:1057B000EA220250EF16E552E7CFD9FF1200D9CF07
:1057C000E6FFE1CFD9FFE652010EE66EE2EC28F0EB
:1057D000E552010EE66EE66ABAEC28F0E552E552B3
:1057E000000EE66EE66AE66EE66AA6EC28F0E55282
:1057F000E552E552E552DF6ADF50006E016AD8904B
:10580000015004E6A80E005C000E01580FE2DF50C4
:10581000006E016A0A0E001802E1015005E0DF5037
:10582000E66EE4EC27F0E552DF2AE6D728DEE55203
:10583000E552E7CFD9FF1200D9CFE6FFE1CFD9FF7C
:10584000020EE126DE6ADD6ADECF00F0DDCF01F078
:1058500000C0E6FF01C0E6FF49EC29F0E552E7CFC2
:1058600001F0E552E7CF00F0F3CF02F0F4CF03F000
:105870000150F418E8AE02D0033404D00250005CAA
:105880000350015841E2010EE66EE66ADECFE6FF04
:10589000DDCFE6FF49EC29F0F3CF00F0F4CF01F0C3
:1058A000020E246E256AF3CF1FF0F4CF20F03FECF8
:1058B00055F01FC000F020C001F01FC0E6FF20C05F
:1058C000E6FF4EEC29F0F3CF02F0F4CF03F0020E26
:1058D000246E256AF3CF1FF0F4CF20F03FEC55F093
:1058E0001FC002F020C003F01FC0E6FF20C0E6FF8B
:1058F000C4EC16F0046E080EE15E0450C0DD020E2A
:10590000DE26000EDD22A0D7020EE15C02E2E16A93
:10591000E552E16EE552E7CFD9FF1200D9CFE6FF9D
:10592000E1CFD9FF020EE126DE6ADD6ADECF00F0AC
:10593000DDCF01F000C0E6FF01C0E6FF49EC29F031
:10594000E552E7CF01F0E552E7CF00F0F3CF02F0E8
:10595000F4CF03F0020E246E256AF3CF1FF0F4CFCC
:1059600020F03FEC55F01FC002F020C003F00150C2
:105970002018E8AE02D0033404D00250005C03507B
:10598000015847E2010EE66EE66A49EC29F0F3CFD2
:1059900002F0F4CF03F0020E1F6E206ADECF24F077
:1059A000DDCF25F065EC55F01D50025C006E1E50F9
:1059B0000358016E00C0E6FFE66E4EEC29F0F3CF0F
:1059C00006F0F4CF07F0020E1F6E206ADECF24F03F
:1059D000DDCF25F065EC55F01D50065C046E1E50C1
:1059E0000758056E04C0E6FFE66EDECFE6FFDDCFAA
:1059F000E6FFDECFE6FFDDCFE6FF1EEC16F0086E19
:105A00000A0EE15E08503BDD020EDE26000EDD22AE
:105A10008DD7020EE15C02E2E16AE552E16EE552E9
:105A2000E7CFD9FF1200D9CFE6FFE1CFD9FF030EB0
:105A3000E126010EDF6EDB6A020EDB6A010EDBCFB0
:105A400000F0020EDBCF01F000C0E6FF01C0E6FF70
:105A500049EC29F0E552E7CF01F0E552E7CF00F03D
:105A6000F3CF02F0F4CF03F0020E246E256AF3CFD9
:105A70001FF0F4CF20F03FEC55F01FC002F020C023
:105A800003F001502018E8AE02D0033404D00250D5
:105A9000005C035001586EE2DF50006E016A020E96
:105AA000246E256A00C01FF001C020F03FEC55F0C5
:105AB0001BC000F01CC001F01BC0E6FF1CC0E6FFCD
:105AC000010EDBCF04F0020EDBCF05F0D8900436D8
:105AD000053604C0E6FF05C0E6FF49EC29F0E552B3
:105AE000E7CF05F0E552E7CF04F00450F35C026E17
:105AF0000550F458036E02C0E6FFE66E010EDBCFE0
:105B000008F0020EDBCF09F0D8900836093608C03D
:105B1000E6FF09C0E6FF4EEC29F0E552E7CF09F0B9
:105B2000E552E7CF08F00850F35C066E0950F458D0
:105B3000076E06C0E6FFE66E010EDBCFE6FF020E43
:105B4000DBCFE6FF010EDBCFE6FF020EDBCFE6FF89
:105B500060EC16F00A6E0A0EE15E0A5090DCDF2A55
:105B6000D950010FE96EDACFEAFF030EEE26000EE0
:105B7000ED2264D7030EE15C02E2E16AE552E16ED8
:105B8000E552E7CFD9FF1200D9CFE6FFE1CFD9FF29
:105B9000040EE1264EEC29F0F3CF02F0F4CF03F02F
:105BA000F3CFE6FFF4CFE6FF49EC29F0E552E7CF6B
:105BB00003F0E552E7CF02F0F3CF04F0F4CF05F0A5
:105BC0000350F418E8AE02D0053404D00450025C4F
:105BD0000550035803E24EEC29F002D049EC29F0BD
:105BE000F3CF00F0F4CF01F0020EF3CFDBFF030E92
:105BF000F4CFDBFFDE6ADD6ADECF00F0DDCF01F03F
:105C0000020EDBCF02F0030EDBCF03F0020E246E98
:105C1000256A02C01FF003C020F03FEC55F01FC002
:105C200002F020C003F001502018E8AE02D0033487
:105C300004D00250005C0350015801E3B3D0010EC0
:105C4000E66EE66A49EC29F0F3CF02F0F4CF03F0F8
:105C5000020E246E256AF3CF1FF0F4CF20F03FEC44
:105C600055F01FC002F020C003F0DE501F24006E6C
:105C7000DD502020016E00C0E6FFE66E4EEC29F0FC
:105C8000F3CF06F0F4CF07F0020E246E256AF3CFAF
:105C90001FF0F4CF20F03FEC55F01FC006F020C0FD
:105CA00007F0DE501F24046EDD502020056E04C076
:105CB000E6FFE66E49EC29F0F3CF0AF0F4CF0BF0E3
:105CC000020E246E256AF3CF1FF0F4CF20F03FECD4
:105CD00055F01FC00AF020C00BF0DE501F24086EE4
:105CE000DD502020096E08C0E6FFE66E4EEC29F07C
:105CF000F3CF0EF0F4CF0FF0020E246E256AF3CF2F
:105D00001FF0F4CF20F03FEC55F01FC00EF020C084
:105D10000FF0DE501F5C0C6EDD5020580D6E0CC075
:105D2000E6FFE66E49EC29F0F3CF12F0F4CF13F062
:105D3000020E246E256AF3CF1FF0F4CF20F03FEC63
:105D400055F01FC012F020C013F0DE501F5C106E23
:105D5000DD502058116E10C0E6FFE66E4EEC29F0C3
:105D6000F3CF14F0F4CF15F0020E246E256AF3CFB2
:105D70001FF0F4CF20F03FEC55F01FC014F020C00E
:105D800015F01FC0E6FF20C0E6FFD1EC1DF0166E37
:105D90000E0EE15E16503FEC2AF0050EDE26000ED8
:105DA000DD222AD7040EE15C02E2E16AE552E16EEF
:105DB000E552E7CFD9FF1200D9CFE6FFE1CFD9FFF7
:105DC000050EE126010EDF6E4EEC29F0F3CF02F056
:105DD000F4CF03F0F3CFE6FFF4CFE6FF49EC29F070
:105DE000E552E7CF03F0E552E7CF02F0F3CF04F03E
:105DF000F4CF05F00350F418E8AE02D0053404D017
:105E00000450025C0550035803E24EEC29F002D026
:105E100049EC29F0F3CF00F0F4CF01F0030EF3CFFB
:105E2000DBFF040EF4CFDBFF020E006E016A030EEF
:105E3000DBCF1FF0040EDBCF20F000C024F001C048
:105E400025F03FEC55F0DE521FC0DEFF20C0DDFF25
:105E5000DD52010EDBCF00F0020EDBCF01F001348A
:105E600001E3D4D000500008000E015401E3CED06D
:105E7000010EE66EE66A49EC29F0F3CF02F0F4CFAA
:105E800003F0020E246E256AF3CF1FF0F4CF20F04A
:105E90003FEC55F01FC002F020C003F0010EDB50B4
:105EA0001F24006E020EDB502020016E00C0E6FFB2
:105EB000E66E4EEC29F0F3CF06F0F4CF07F0020EB9
:105EC000246E256AF3CF1FF0F4CF20F03FEC55F09D
:105ED0001FC006F020C007F0010EDB501F24046E27
:105EE000020EDB502020056E04C0E6FFE66E49EC92
:105EF00029F0F3CF0AF0F4CF0BF0020E246E256ADE
:105F0000F3CF1FF0F4CF20F03FEC55F01FC00AF0A4
:105F100020C00BF0010EDB501F24086E020EDB5078
:105F20002020096E08C0E6FFE66E4EEC29F0F3CFA4
:105F30000EF0F4CF0FF0020E246E256AF3CF1FF09F
:105F4000F4CF20F03FEC55F01FC00EF020C00FF052
:105F5000010EDB501F5C0C6E020EDB5020580D6EE4
:105F60000CC0E6FFE66E49EC29F0F3CF12F0F4CF57
:105F700013F0020E246E256AF3CF1FF0F4CF20F049
:105F80003FEC55F01FC012F020C013F0010EDB50A3
:105F90001F5C106E020EDB502058116E10C0E6FF21
:105FA000E66E4EEC29F0F3CF14F0F4CF15F0020EAC
:105FB000246E256AF3CF1FF0F4CF20F03FEC55F0AC
:105FC0001FC014F020C015F01FC0E6FF20C0E6FF80
:105FD00045EC1EF0166E0E0EE15E1650DF50006EA0
:105FE000016A010E001804E1015002E1DF6A02D0EB
:105FF000010EDF6E3FEC2AF0D950010FE96EDACFC7
:10600000EAFF050EEE5E000EED5A23D7050EE15CA9
:1060100002E2E16AE552E16EE552E7CFD9FF1200F4
:10602000D9CFE6FFE1CFD9FF020EE126DE6ADD6AB5
:10603000DECF00F0DDCF01F000C0E6FF01C0E6FFDB
:1060400049EC29F0E552E7CF01F0E552E7CF00F047
:10605000F3CF02F0F4CF03F0020E246E256AF3CFE3
:106060001FF0F4CF20F03FEC55F01FC002F020C02D
:1060700003F0020E025E000E035A01500318E8AE50
:1060800002D0033404D00250005C035001585FE298
:10609000010EE66EE66A49EC29F0F3CF00F0F4CF8A
:1060A00001F0040E246E256AF3CF1FF0F4CF20F028
:1060B0003FEC55F01FC000F020C001F01FC0E6FF0C
:1060C00020C0E6FF49EC29F0F3CF04F0F4CF05F04F
:1060D000020E1F6E206ADECF24F0DDCF25F065ECC6
:1060E00055F01D50045C026E1E500558036E02C030
:1060F000E6FFE66E4EEC29F0F3CF08F0F4CF09F09E
:10610000020E1F6E206ADECF24F0DDCF25F065EC95
:1061100055F01D50085C066E1E500958076E06C0EB
:10612000E6FFE66EDECFE6FFDDCFE6FFDECFE6FF81
:10613000DDCFE6FF55EC22F00A6E0C0EE15E0A5050
:106140003FEC2AF0020EDE26000EDD2271D7020E91
:10615000E15C02E2E16AE552E16EE552E7CFD9FF88
:106160001200D9CFE6FFE1CFD9FF030EE126010EE1
:10617000DF6EDB6A020EDB6A010EDBCF00F0020E7F
:10618000DBCF01F000C0E6FF01C0E6FF49EC29F0DB
:10619000E552E7CF01F0E552E7CF00F0F3CF02F090
:1061A000F4CF03F0020E246E256AF3CF1FF0F4CF74
:1061B00020F03FEC55F01FC002F020C003F0020EAB
:1061C000025E000E035A01500318E8AE02D00334F9
:1061D00004D00250005C0350015801E378D0DFCFB7
:1061E000E6FFE66A49EC29F0F3CF00F0F4CF01F0C6
:1061F000040E246E256AF3CF1FF0F4CF20F03FEC9D
:1062000055F01FC000F020C001F01FC0E6FF20C005
:10621000E6FF49EC29F0F3CF04F0F4CF05F0020ECD
:106220001F6E206A010EDBCF24F0020EDBCF25F0BB
:1062300065EC55F01D50045C026E1E500558036E4F
:1062400002C0E6FFE66E4EEC29F0F3CF08F0F4CF83
:1062500009F0020E1F6E206A010EDBCF24F0020E41
:10626000DBCF25F065EC55F01D50085C066E1E5026
:106270000958076E06C0E6FFE66E010EDBCFE6FFAB
:10628000020EDBCFE6FF010EDBCFE6FF020EDBCF17
:10629000E6FF77EC24F00A6E0C0EE15E0A50DF5048
:1062A000006E016A010E001804E1015002E1DF6A8C
:1062B00002D0010EDF6E3FEC2AF0D950010FE96EDB
:1062C000DACFEAFF020EEE26000EED2255D7030EBE
:1062D000E15C02E2E16AE552E16EE552E7CFD9FF07
:1062E0001200D9CFE6FFE1CFD9FF020EE126DE6A28
:1062F000DD6ADECF00F0DDCF01F000C0E6FF01C0B7
:10630000E6FF4EEC29F0E552E7CF01F0E552E7CF8A
:1063100000F0F3CF02F0F4CF03F00150F418E8AE30
:1063200002D0033404D00250005C0350015825E22F
:10633000010EE66EE66A49EC29F0F3CF00F0F4CFE7
:1063400001F00006000E015A00C0E6FF01C0E6FFA2
:10635000DECFE6FFDDCFE6FFE66EE66AE66EE66AD2
:106360007EEC15F0026E0A0EE15E02503FEC2AF060
:10637000040EDE26000EDD22BCD7DE6ADD6ADECF2B
:1063800000F0DDCF01F000C0E6FF01C0E6FF49EC00
:1063900029F0E552E7CF01F0E552E7CF00F0F3CF67
:1063A00002F0F4CF03F00150F418E8AE02D0033449
:1063B00004D00250005C0350015825E2010EE66E45
:1063C000E66ADECFE6FFDDCFE6FF4EEC29F0F3CF45
:1063D00000F0F4CF01F00006000E015A00C0E6FF05
:1063E00001C0E6FFE66EE66AE66EE66A7EEC15F050
:1063F000026E0A0EE15E02503FEC2AF0040EDE2629
:10640000000EDD22BCD7E6682DEC57F0E5521DECFE
:106410002AF0DE6ADD6ADECF00F0DDCF01F000C0D9
:10642000E6FF01C0E6FF4EEC29F0E552E7CF01F0B0
:10643000E552E7CF00F0F3CF02F0F4CF03F00150C4
:10644000F418E8AE02D0033404D00250005C0350CC
:10645000015826E2010EE66EE66A000EE66EE66A76
:10646000DECFE6FFDDCFE6FF49EC29F0F3CF00F009
:10647000F4CF01F00006000E015A00C0E6FF01C093
:10648000E6FFE66EE66A7EEC15F0026E0A0EE15E4D
:1064900002503FEC2AF0040EDE26000EDD22BBD7B0
:1064A00049EC29F0F3CF00F0F4CF01F00006000E24
:1064B000015A00C0DEFF01C0DDFFDECF00F0DDCFFE
:1064C00001F00001800E011434E1010EE66EE66A6F
:1064D000DECFE6FFDDCFE6FF4EEC29F0F3CF00F094
:1064E000F4CF01F00006000E015A00C0E6FF01C023
:1064F000E6FF49EC29F0F3CF02F0F4CF03F00206F7
:10650000000E035A02C0E6FF03C0E6FFE66EE66A2D
:106510007EEC15F0046E0A0EE15E04503FEC2AF0AA
:10652000D9CFE9FFDACFEAFF040EEE5E000EED5A96
:10653000C4D7E6682DEC57F0E5521DEC2AF04EEC7E
:1065400029F0F3CF00F0F4CF01F00006000E015A5D
:1065500000C0DEFF01C0DDFFDECF00F0DDCF01F0C7
:106560000001800E011435E1010EE66EE66A000EB0
:10657000E66EE66ADECFE6FFDDCFE6FF49EC29F006
:10658000F3CF00F0F4CF01F00006000E015A00C076
:10659000E6FF01C0E6FF4EEC29F0F3CF02F0F4CFA6
:1065A00003F00206000E035A02C0E6FF03C0E6FF36
:1065B0007EEC15F0046E0A0EE15E04503FEC2AF00A
:1065C000D9CFE9FFDACFEAFF040EEE5E000EED5AF6
:1065D000C3D749EC29F0F3CF00F0F4CF01F0000667
:1065E000000E015A00C0DEFF01C0DDFFDECF00F06B
:1065F000DDCF01F00001800E011435E1010EE66EE1
:10660000E66ADECFE6FFDDCFE6FF000EE66EE66A65
:1066100049EC29F0F3CF00F0F4CF01F00006000EB2
:10662000015A00C0E6FF01C0E6FF4EEC29F0F3CFAF
:1066300002F0F4CF03F00206000E035A02C0E6FF98
:1066400003C0E6FF7EEC15F0046E0A0EE15E045016
:106650003FEC2AF0D9CFE9FFDACFEAFF040EEE5E75
:10666000000EED5AC3D7E6682DEC57F0E5521DEC4D
:106670002AF0DE6ADD6ADECF00F0DDCF01F000C077
:10668000E6FF01C0E6FF49EC29F0E552E7CF01F053
:10669000E552E7CF00F0F3CF02F0F4CF03F0015062
:1066A000F418E8AE02D0033404D00250005C03506A
:1066B000015826E2010EE66EE66ADECFE6FFDDCF88
:1066C000E6FF000EE66EE66AE66EE66A4EEC29F03C
:1066D000F3CF00F0F4CF01F00006000E015A00C025
:1066E000E6FF01C0E6FF7EEC15F0026E0A0EE15EE9
:1066F00002503FEC2AF0040EDE26000EDD22BBD74E
:10670000DE6ADD6ADECF00F0DDCF01F000C0E6FF1B
:1067100001C0E6FF4EEC29F0E552E7CF01F0E5526B
:10672000E7CF00F0F3CF02F0F4CF03F00150F418FC
:10673000E8AE02D0033404D00250005C035001588C
:1067400030E2010EE66EE66A49EC29F0F3CF00F084
:10675000F4CF01F00006000E015A00C0E6FF01C0B0
:10676000E6FFDECFE6FFDDCFE6FFE66EE66A4EEC43
:1067700029F0F3CF02F0F4CF03F00206000E035A23
:1067800002C0E6FF03C0E6FF7EEC15F0046E0A0EC1
:10679000E15E04503FEC2AF0040EDE26000EDD22FE
:1067A000B1D7E6682DEC57F0E552020EE15C02E24B
:0E67B000E16AE552E16EE552E7CFD9FF120033
:0267BE009482C3
:1067C00094948B848B94010EE66EA8EC57F0E552FE
:1067D0008B8412000101140E856F010E866F140E5A
:1067E000876F010E886F040EE66E850EE66E010E51
:1067F000E66E86D8E552E552E552000901E1000C4B
:10680000080EE66E850EE66E010EE66E4DEC3BF070
:10681000E552E552E55201018C51026E036A150EF4
:10682000021801E1035002E0000E01D0010E006EDB
:10683000016AE8501200D9CFE6FFE1CFD9FF040E7C
:10684000E126DF6A010EDB6A020EDB6A030EDB6AF9
:106850000101020E856F010EE66E850EE66E010ED9
:10686000E66E4ED8E552E552E552000935E00C0ED1
:10687000E66E850EE66E010EE66E4DEC3BF0E552DF
:10688000E552E552080EE66EE66AD50EE66E010E9A
:10689000E66E850EE66E010EE66E56EC54F0026E64
:1068A000060EE15E0250006E016A00BE01680050F3
:1068B000011012E101018D51DF6E8E51E76E010E64
:1068C000E7CFDBFF8F51E76E020EE7CFDBFF905182
:1068D000E76E030EE7CFDBFFDECF1DF0DECF1EF04D
:1068E000DECF1FF0DDCF20F0DD52DD52040EE15C83
:1068F00002E2E16AE552E16EE552E7CFD9FF12000C
:10690000D9CFE6FFE1CFD9FF020EE126DE6ADD6ACC
:10691000FC0EDB50E66EFD0EDBCFE6FFFE0EDBCF9E
:10692000E6FF7EEC3BF0E552E552E55240EC3BF0F1
:10693000006E016A010E001801E1015013E0010E22
:10694000DE26000EDD22D9CFE9FFDACFEAFFE80E1E
:10695000D880EE54030EED5409E3010EE66EA8EC68
:1069600057F0E3D706EC3BF0000902E1000E01D03E
:10697000010E006E020EE15C02E2E16AE552E16E98
:106980000050E552E7CFD9FF1200D9CFE6FFE1CFA3
:10699000D9FFE652DF6A01014A0E856F010E866F4C
:1069A000FE0EDB50876F030EE66E850EE66E010E5F
:1069B000E66EA6DFE552E552E55200091DE040EC27
:1069C0003BF0006E016A010E0018F9E10150F7E199
:1069D000140EE66E850EE66E010EE66E4DEC3BF093
:1069E000E552E552E55201018D51006E016A010E3A
:1069F000001801E1015002E0000E3DD09251E66E18
:106A0000FA0EDBCFE9FFFB0EDBCFEAFFE552E750E2
:106A1000EF6EDF6ADF50006E016AFA0EDBCFE9FF2E
:106A2000FB0EDBCFEAFFEF50000101AE02D0D890A1
:106A300003D0005C000E01581DE2DF50EA6A0E0F21
:106A4000E96E000EEA22850EE926010EEA22EF50D9
:106A5000E66EDF50E76EFC0EDBCFE9FFFD0EDBCF0D
:106A6000EAFFE750E926000EEA22E552E750EF6E12
:106A7000DF2AD0D7010EE552E552E7CFD9FF120049
:106A8000D9CFE6FFE1CFD9FFE150FB0FE96EFF0E52
:106A9000DA20EA6E800EEE5C000EEE58000EEE5824
:106AA000000EEE5812E2FB0EDBCF02F0FC0EFD0EE4
:106AB000FE0E030E0216036A046A056A02500310F2
:106AC0000410051012E1010E13D0FB0EDBCF02F013
:106AD000FC0EFD0EFE0E0F0E0216036A046A056A16
:106AE000025003100410051002E0000E01D0010E48
:106AF000016AE850E552E7CFD9FF1200D9CFE6FF8F
:106B0000E1CFD9FFE150FB0FE96EFF0EDA20EA6E0C
:106B1000800EEE5C000EEE58000EEE58000EEE58A1
:106B20001DE2FB0EDBCF02F0FC0EDBCF03F0FD0E0F
:106B3000DBCF04F0FE0EDBCF05F0022A000E0322AD
:106B400004220522030E0216036A046A056A025033
:106B50000310041005101DE1010E1ED0FB0EDBCF4B
:106B600002F0FC0EDBCF03F0FD0EDBCF04F0FE0ED7
:106B7000DBCF05F0022A000E0322042205220F0EAD
:106B80000216036A046A056A025003100410051015
:106B900002E0000E01D0010E016AE850E552E7CF95
:106BA000D9FF1200D9CFE6FFE1CFD9FFE6520101AC
:106BB000400E856F010E866FF70EDB50026E036A82
:106BC000E850031002E0600E01D0610E006E016A11
:106BD000876FF80EDBCF88F1DF6ADF50006E016A45
:106BE000D890015004E6060E005C000E01581DE22C
:106BF000DF50E76EF50EDBCFE9FFF60EDBCFEAFFE5
:106C0000E750E926000EEA22EF50E66EDF50EA6A0E
:106C1000040FE96E000EEA22850EE926010EEA2233
:106C2000E552E750EF6EDF2AD8D7DF6ADF50006EFB
:106C3000016AFC0EDB50000101AE02D0D89003D0F7
:106C4000005C000E01581DE2DF50E76EFD0EDBCF49
:106C5000E9FFFE0EDBCFEAFFE750E926000EEA224D
:106C6000EF50E66EDF50EA6A0A0FE96E000EEA2284
:106C7000850EE926010EEA22E552E750EF6EDF2A83
:106C8000D5D7FC0EDBCF00F00A0E0024E66E850E91
:106C9000E66E010EE66E34DEE552E552E55200097D
:106CA00002E1000E0CD00C0EE66E850EE66E010EB3
:106CB000E66E4DEC3BF0E552E552E552010EE55231
:106CC000E552E7CFD9FF1200D9CFE6FFE1CFD9FFD8
:106CD000E6520101400E856F010E866F300E876F00
:106CE000FE0EDB50886F040EE66E850EE66E010E1A
:106CF000E66E06DEE552E552E552000912E01A0E94
:106D0000E66E850EE66E010EE66E4DEC3BF0E5524A
:106D1000E552E55201018D51006E016A00500110EB
:106D200002E0000E2AD0DF6ADF50006E016AD890C0
:106D3000015004E6100E005C000E01581DE2DF5009
:106D4000EA6A090FE96E000EEA22850EE926010EB5
:106D5000EA22EF50E66EDF50E76EFC0EDBCFE9FF74
:106D6000FD0EDBCFEAFFE750E926000EEA22E552EE
:106D7000E750EF6EDF2AD8D7010EE552E552E7CF94
:106D8000D9FF1200D9CFE6FFE1CFD9FFE6520101CA
:106D9000400E856F010E866FA00E876FFE0EDB50D2
:106DA000886FDF6ADF50006E016AD890015004E6F8
:106DB000100E005C000E01581DE2DF50E76EFC0E65
:106DC000DBCFE9FFFD0EDBCFEAFFE750E926000E3F
:106DD000EA22EF50E66EDF50EA6A040FE96E000E19
:106DE000EA22850EE926010EEA22E552E750EF6E0F
:106DF000DF2AD8D7140EE66E850EE66E010EE66E1B
:106E00007FDDE552E552E552000902E1000E0CD0AB
:106E10001A0EE66E850EE66E010EE66E4DEC3BF048
:106E2000E552E552E552010EE552E552E7CFD9FFB2
:106E30001200D9CFE6FFE1CFD9FF300EE126140EC4
:106E4000DF6EDE52010EDD6E030EF36E020EF3CF27
:106E5000DBFFE10EF36E030EF3CFDBFFF36E040EE8
:106E6000F3CFDBFFE10EF36E050EF3CFDBFF030E76
:106E7000F36E060EF3CFDBFFE10EF36E070EF3CFDA
:106E8000DBFF030EF36E080EF3CFDBFFE10EF36EB4
:106E9000090EF3CFDBFF030EF36E0A0EF3CFDBFF19
:106EA000E10EF36E0B0EF3CFDBFF030EF36E0C0E51
:106EB000F3CFDBFFE10EF36E0D0EF3CFDBFF030E1E
:106EC000F36E0E0EF3CFDBFFE10EF36E0F0EF3CF7A
:106ED000DBFF030EF36E100EF3CFDBFFE10EF36E5C
:106EE000110EF3CFDBFF030EF36E120EF3CFDBFFB9
:106EF000E10EF36E130EF3CFDBFF030EF36E140EF1
:106F0000F3CFDBFFE10EF36E150EF3CFDBFF030EC5
:106F1000F36E160EF3CFDBFFE10EF36E170EF3CF19
:106F2000DBFF030EF36E180EF3CFDBFFE10EF36E03
:106F3000190EF3CFDBFF030EF36E1A0EF3CFDBFF58
:106F4000E10EF36E1B0EF3CFDBFF030EF36E1C0E90
:106F5000F3CFDBFFE10EF36E1D0EF3CFDBFF030E6D
:106F6000F36E1E0EF3CFDBFFE10EF36E1F0EF3CFB9
:106F7000DBFFA00EF36E200EF3CFDBFFA10EF36E4E
:106F8000210EF3CFDBFFA20EF36E220EF3CFDBFF59
:106F9000A30EF36E230EF3CFDBFFA40EF36E240ECD
:106FA000F3CFDBFFA50EF36E250EF3CFDBFF780EDC
:106FB000F36E260EF3CFDBFF770EF36E270EF3CFC3
:106FC000DBFF880EF36E280EF3CFDBFFC10EF36EEE
:106FD000290EF3CFDBFF2A0EDB682B0EDB682C0EAD
:106FE000DB682D0EDB682E0EDB682F0EDB68D9CF39
:106FF000E6FFDACFE6FF010EE66EC4DEE552E552AB
:10700000E55200091CE0D950100FE66E000EDA20A0
:10701000E66E020EE66EB6DEE552E552E552000976
:107020000EE0D950200FE66E000EDA20E66E030E59
:10703000E66EA8DEE552E552E552000902E1000ED7
:1070400001D0010E006E300EE15C02E2E16AE55211
:10705000E16E0050E552E7CFD9FF1200D9CFE6FF2D
:10706000E1CFD9FF410EE126FB0EDBCFE6FFFC0EA0
:10707000DBCFE6FF48EC54F0E552E552F350DF6E0B
:10708000010EDB6A020EDB6A030EF36EDB6EDFCFEE
:1070900000F0050E0024E76E040EE7CFDBFFD10EF3
:1070A000F36E050EF3CFDBFF010EF36E060EF3CF8A
:1070B000DBFFDFCF00F0010E0024E76E070EE7CF05
:1070C000DBFF550EF36E080EF3CFDBFFFD0EDB503A
:1070D000E76E090EE7CFDBFF0A0EDB6A0B0EDB6AF9
:1070E0000C0EDB6A0D0EDB6A0E0EDB6A0F0EDB6A1E
:1070F000100EDB6A110EDB6A120EDB6A130EDB6AFE
:10710000140EDB6A150EDB6A160EDB6A170EDB6ADD
:10711000180EDB6A190EDB6A1A0EDB6A1B0EDB6ABD
:107120001C0EDB6A1D0EDB6A1E0EDB6A1F0EDB6A9D
:10713000200EDB6A210EDB6A220EDB6A230EDB6A7D
:10714000240EDB6A250EDB6A260EDB6A270EDB6A5D
:10715000280EDB6A290EDB6A2A0EDB6A2B0EDB6A3D
:107160002C0EDB6A2D0EDB6A2E0EDB6A2F0EDB6A1D
:10717000300EDB6AD30EF36E310EF3CFDBFFF70E6A
:10718000F36E320EF3CFDBFFD30EF36E330EF3CF7D
:10719000DBFFF70EF36E340EF3CFDBFFD30EF36E8F
:1071A000350EF3CFDBFFF70EF36E360EF3CFDBFFBA
:1071B0007F0EF36E370EF3CFDBFF070EF36E380E44
:1071C000F3CFDBFF880EF36E390EF3CFDBFF400EFB
:1071D000F36E3A0EF3CFDBFF3B0EDB683C0EDB6851
:1071E0003D0EDB683E0EDB683F0EDB68400EDB6861
:1071F000FE0EDB50026E036AD890035004E6010EC7
:10720000025C000E03580DE3FE0EDB50046E056AAF
:10721000053404E204500F08000E055402E3000E8A
:1072200001D0010E006E016AE850011001E0DFD1CB
:10723000DF50026E036AD890035004E6010E025C30
:10724000000E03580CE3DF50046E056A053404E2B7
:1072500004502608000E055402E3000E01D0010E72
:10726000006E016AE850011001E0C1D1DF50006EEC
:10727000016A013404E200500608000E015425E3BF
:10728000DFCFE6FFE66AFB0EDBCFE6FFFC0EDBCFCF
:10729000E6FFD9500A0FE66E000EDA20E66E03EC28
:1072A00054F0006E060EE15E0050D950010F006EE2
:1072B000DACF01F0DFCF02F0090E0224EA6AEA36E3
:1072C0000024E96EDA50EA223AD1DF50006E016AFA
:1072D000070E00181BE1015019E1DFCFE6FFE66A57
:1072E000FB0EDBCFE6FFFC0EDBCFE6FFD9500A0F2B
:1072F000E66E000EDA20E66E03EC54F0006E060E29
:10730000E15E0050FE0EF36E110EA9D0DF50026E4A
:10731000036A033404E202500708000E03540CE32E
:10732000DF50046E056A053407E204501608000EAB
:10733000055402E2000E01D0010E006E016AE85011
:10734000011046E0070EE66EE66AFB0EDBCFE6FFB5
:10735000FC0EDBCFE6FFD9500A0FE66E000EDA20F6
:10736000E66E03EC54F0006E060EE15E0050DF5056
:10737000006E016A070E005E000E015A00C0E6FFB3
:1073800001C0E6FF070EE76EFB0EDBCF02F0FC0E3E
:10739000DBCF03F0E7500226000E032202C0E6FF17
:1073A00003C0E6FFD950110FE66E000EDA20E66E3C
:1073B00003EC54F0046E060EE15E0450D950110F38
:1073C000006EDACF01F0DF50026E036A070EAED016
:1073D000DF50006E016A170E001844E1015042E1CF
:1073E000070EE66EE66AFB0EDBCFE6FFFC0EDBCF98
:1073F000E6FFD9500A0FE66E000EDA20E66E03ECC7
:1074000054F0006E060EE15E0050DF50006E016A1F
:10741000070E005E000E015A00C0E6FF01C0E6FF45
:10742000070EE76EFB0EDBCF02F0FC0EDBCF03F0A6
:10743000E7500226000E032202C0E6FF03C0E6FF6B
:10744000D950110FE66E000EDA20E66E03EC54F010
:10745000046E060EE15E0450FE0EF36E210EF3CFB5
:10746000DBFF6FD0070EE66EE66AFB0EDBCFE6FFB2
:10747000FC0EDBCFE6FFD9500A0FE66E000EDA20D5
:10748000E66E03EC54F0006E060EE15E0050100E46
:10749000E66EE66A070EE76EFB0EDBCF00F0FC0E31
:1074A000DBCF01F0E7500026000E012200C0E6FF0E
:1074B00001C0E6FFD950110FE66E000EDA20E66E2D
:1074C00003EC54F0026E060EE15E0250DF50006ED7
:1074D000016A180E005E000E015A00C0E6FF01C0EE
:1074E000E6FF170EE76EFB0EDBCF02F0FC0EDBCFE4
:1074F00003F0E7500226000E032202C0E6FF03C09D
:10750000E6FFD950210FE66E000EDA20E66E03EC9E
:1075100054F0046E060EE15E0450D950210F006E47
:10752000DACF01F0DF50026E036A160E025E000E23
:10753000035A00500224E96EDA500320EA6EFE0E70
:10754000EF6ED950010FE66E000EDA20E66EFE0EE9
:10755000DB50040DF350E66E15DCE552E552E552C2
:10756000000945E0D950110FE66E000EDA20E66EF4
:10757000FE0EDB50040DF3CF00F0F4CF01F0010E4E
:10758000F324E66EC2EC36F0E552E552E55200090E
:107590002EE0D950210FE66E000EDA20E66EFE0EC8
:1075A000DB50040DF3CF00F0F4CF01F0020EF32412
:1075B000E66EC2EC36F0E552E552E552000917E0FE
:1075C000D950310FE66E000EDA20E66EFE0EDB506B
:1075D000040DF3CF00F0F4CF01F0030EF324E66EB8
:1075E000C2EC36F0E552E552E552000902E1000E28
:1075F00001D0010E006E410EE15C02E2E16AE5524B
:10760000E16E0050E552E7CFD9FF1200D9CFE6FF77
:10761000E1CFD9FF070EE126060EE66ED9CFE6FFD1
:10762000DACFE6FF3AD8E552E552E552070EE66EAC
:10763000E66ADD0EE66E010EE66ED9CFE6FFDACF22
:10764000E6FF56EC54F0046E060EE15E0450026E46
:10765000036A02BE03680250031002E0000E01D06C
:10766000010E006E016AE850006E070EE15C02E256
:10767000E16AE552E16E0050E552E7CFD9FF120012
:107680008250020B01E0010E006E016A010E00182B
:1076900003E1015001E1000C010CD9CFE6FFE1CF7D
:1076A000D9FFE652EDDF006E016A010E0018FAE123
:1076B0000150F8E1FC0EDBCF00F0020E0024E66E74
:1076C000240EE66ECAEC42F0E552E5526AEC46F052
:1076D000DF6EDF50006E016AE8500110F7E0FD0E2A
:1076E000DBCFE6FFFE0EDBCFE6FFACEC46F0E5526B
:1076F000E552E552E552E7CFD9FF1200D9CFE6FFB8
:10770000E1CFD9FF4C0EE126060EF36E4B0EF3CF00
:10771000DBFFFC0EDB2AD30EF36E020EF3CFDBFF92
:10772000030EDB6A040EDB6A050EDB68FC0EDB5021
:10773000E76E060EE7CFDBFFFC0EDB50006E016A42
:10774000001E011E010E0026000E0122070E00C0C1
:10775000DBFFD40EF36E080EF3CFDBFFDE6ADD6ACB
:10776000DECF00F0DDCF01F0FC0EDB50026E036ACD
:107770000206000E035A01500318E8AE02D003348B
:1077800004D00250005C035001583AE2FD0EDBCFFA
:1077900001F0FE0EDBCF02F0DE500124E96EDD5079
:1077A0000220EA6EEF50006E020EDBCFE7FF0050C2
:1077B000E726020EE7CFDBFFFD0EDBCF02F0FE0E69
:1077C000DBCF03F0DE500224E96EDD500320EA6EC9
:1077D000EF50E66ED950030F006EDACF01F04B0E7A
:1077E000DB500024E96E000EDA20EA6EE552E75025
:1077F000EF6E4B0EDB2ADF2A010EB2E3DB2AB0D795
:10780000020EDB50026E036A021E031ED950030FE4
:10781000006EDACF01F04B0EDB500F010024E96E51
:10782000000EDA20EA6E02C0EFFF4B0EDB2AD950C1
:10783000030F006EDACF01F04B0EDB500024E96E2F
:10784000000EDA20EA6EEF6A4B0EDB2AD950030FE6
:10785000E66E000EDA20E66E4B0EDB50E66E240E6E
:10786000E66E84EC42F0E552E552E552E5524C0EEC
:10787000E15C02E2E16AE552E16EE552E7CFD9FF51
:027880001200F4
:0E7882007DEC41F0FB0EDBCFF3FFDB06F35095
:1078900000090AE0CBEC41F0FA0E36EC42F0F3E1DD
:1078A000011CF1E1010E01D0000EACEF41F07DECC6
:1078B00041F03B0EE12402E3E168E652E16E010E85
:1078C000DB6A020EDB6AF90EDBCFF6FFFA0EDBCFC6
:1078D000F7FFFB0EDBCFF8FF0800F550DF6EDF503F
:1078E00002E1D0EF40F0250EDF5C02E0C3EF40F094
:1078F000030EDB6A040EDB6A050EDB6A060EDB6A2A
:10790000070EDB6AE5EC40F02D0EDF5C0CE02B0E81
:10791000DF5C09E0200EDF5C06E0230EDF5C03E0A5
:10792000300EDF5C1AE1DF50300A14E0130A0FE07A
:10793000030A0AE00B0A05E0060AE4E1030EDB8015
:10794000E1D7030EDB82DED7030EDB84DBD7030E29
:10795000DB86D8D7030EDB88D5D72A0EDF5C1BE188
:10796000E1EC40F02FEC41F010E0030EDB801F68EB
:107970002068130EDBCF24F0140EDBCF25F065EC6E
:1079800055F0040E1DC0DBFF03D0130E18EC41F0C0
:10799000E5EC40F00BD0090EDB6A86EC41F003E029
:1079A000FAEC41F0FAD7090E18EC41F0030EDBB007
:1079B000DB982E0EDF5C1BE1E5EC40F02A0EDF5C6D
:1079C0000BE1E1EC40F02FEC41F003E1130E6AEC27
:1079D00041F0E5EC40F00BD0090EDB6A86EC41F09B
:1079E00003E0FAEC41F0FAD7090E6AEC41F0680EB8
:1079F000DF5C07E1E5EC40F0680EDF5C1DE1030EA3
:107A000018D0740EDF5C17E07A0EDF5C14E0480ECD
:107A1000DF5C06E0540EDF5C03E05A0EDF5C02E13F
:107A2000020E07D06C0EDF5C03E06A0EDF5C04E13F
:107A3000010EBDEC41F0C9DBDF506E0A01E17FD3DE
:107A40001E0A01E192D1200A01E18FD13F0A01E132
:107A500049D11A0A01E146D10D0A01E143D1200AB8
:107A600001E140D13A0A01E13DD1200A01E13AD1D8
:107A7000260A01E135D10D0A01E132D11A0A01E1EC
:107A8000D9D0200A4AE0300A1FE0460A0EE0250A53
:107A900001E083D3D950F90FE96EFF0EDA20EA6EC8
:107AA000010EEE5E000EEE5AEE5ACBEC41F0250EC2
:107AB000E66E95DB03E1011C01E169D3C7EC41F0FF
:107AC00001E26BD3DB2A69D3080EDB6A040EDB50BC
:107AD000010806E2040EDB048FEC41F0DB508BDB87
:107AE000080EDB5009E0030EDB50010B05E172DBF1
:107AF00001E04DD3080EDB6A64DBEFCFDFFF3FEC24
:107B000042F003E1011C01E142D3C7EC41F001E383
:107B1000DB2A60DB01E141D33AD3070EDB500208D8
:107B20000FE10BEC42F0030ED2EC41F00E0EEECF63
:107B3000DBFF0F0EEECFDBFF100EEECFDBFF20D012
:107B4000F70EDBCF03F0F80EDBCF04F0020E035E7E
:107B5000000E045AF70E03C0DBFFF80E04C0DBFF73
:107B600003C0E9FF04C0EAFFC2EC41F0026A0E0E56
:107B700000C0DBFF0F0E01C0DBFF100E02C0DBFFF9
:107B80000E0EDBCFE6FF0F0EDBCFE6FF100EDBCFD6
:107B9000E6FF81EC54F0E552E552E552130E1EC0AB
:107BA000DBFF140E1FC0DBFF060EDB5005E0130EDB
:107BB00006EC42F001E26ADB2AEC42F002E2130E2C
:107BC00037DBEDEC41F006E0040E06EC42F002E299
:107BD000050E2EDB030EDBB005D0FCDA01E0D7D2B8
:107BE000080EDB6A090EDB6A0E0EDBCFF6FF0F0E06
:107BF000DBCFF7FF100EDBCFF8FF0800F550DF6E8C
:107C0000DF5014E030EC42F011E23FEC42F003E1CF
:107C1000011C01E1BCD2BBDB01E3DB2A090EDB2A3C
:107C2000D9500E0FE96E000ECBDBE7D7D3DA01E1B6
:107C3000B4D2ADD2C6DA110EEECFDBFF120EEDCF0D
:107C4000DBFF110EDBCFE6FF120EDBCFE6FF48ECC9
:107C500054F0E552E552130EF3CFDBFF140EF4CFD0
:107C6000DBFF060EDB5004E0130ED0DB01E20EDB7F
:107C70002AEC42F002E2130EDBDAAFDB05E0040E81
:107C8000C5DB02E2050ED4DA030EDBB005D0A2DAC2
:107C900001E07DD2080EDB6A090EDB6A110EDBCF34
:107CA000E9FF120EDBCFEAFFEFCFDFFFDF5014E07A
:107CB000D7DB12E2E4DB03E1011C01E168D267DB00
:107CC00001E3DB2A090EDB2A110EDB2ADBCFE9FFF9
:107CD000120EE8E3DB2AE6D77DDA01E15ED257D265
:107CE000030EDB8E070EDB0410E195DB040E5ADB7E
:107CF0000A0EEECFDBFF0B0EEECFDBFF0C0EEECF4E
:107D0000DBFF0D0EEECFDBFF6CD0070EDB50030860
:107D10002CE1030EDBAE0DD0B2DA020E76DAEFCF35
:107D200000F0016A026A036A00AE39D00168026895
:107D300035D0F70EDBCF01F0F80EDBCF02F0020EEC
:107D4000015E000E025AF70E01C0DBFFF80E02C002
:107D5000DBFF01C0E9FF02C0EAFFEFCF00F00A0E2F
:107D600000C0DBFF0B0EDB6A38D0070EDB500208C9
:107D700009E1030EDBAE04D059DB02AE10D00ED009
:107D800055DB0DD0030EDBAE12D079DA020E3DDAF0
:107D9000F9DA026A036A01AE02D002680368E2DA25
:107DA0000C0E02C0DBFF0D0E03C0DBFF1AD0F70E76
:107DB000DBCF02F0F80EDBCF03F0020E025E000E06
:107DC000035AF70E02C0DBFFF80E03C0DBFF02C050
:107DD000E9FF03C0EAFFD6DAC5DA0C0EDB6A0D0E46
:107DE000DB6A060EDB5005E1010EF36E050EF3CFE4
:107DF000DBFF150EDB6A160EDB6AD950370F006EFB
:107E0000000EDA20016E390E00C0DBFF3A0E01C011
:107E1000DBFF380EDB6A080EDB6A0A0EAEDADF50D3
:107E2000780A12E0200A10E0280A0CE0200A0AE092
:107E30003F0A06E00D0A02E0200A08E1020E05D022
:107E4000080E03D0080EDF26100E97DA030EDBBEF5
:107E500002D0DB92DB94DB50800B24E08ADAD890EE
:107E6000030EEB50000A08E6000EEE5C000EEE5822
:107E7000000EEE58000EEE5815E213DA2268236861
:107E800024682568D1EC56F00A0E19C0DBFF0B0EF2
:107E90001AC0DBFF0C0E1BC0DBFF0D0E1CC0DBFF8E
:107EA0002D0E08D0030EDBA202D02B0E03D0DBA4D4
:107EB00008D0200EF36E170EF3CFDBFF150EDB2A72
:107EC00002D0170EDB6A050EDB5003E1B7D901E1E2
:107ED00089D07C0E006EAF0E016E000E026E070E92
:107EE000DBCF03F0046A056A066A03C022F004C00F
:107EF00023F005C024F006C025F0D3D909EC57F0D3
:107F000000501924F36E01501A20F46E02501B2009
:107F1000F86EF4CFF7FFF3CFF6FF0800090EF5CFA8
:107F2000DBFF580EDF5C0FE1610EF36E090E7BD9AB
:107F30000AE3200E006E090EDBCFE7FF0050E75E7C
:107F4000090EE7CFDBFF070EDBCF00F0016A026A04
:107F5000036A0FDA00C022F001C023F002C024F04F
:107F600003C025F0EECF1DF0EECF1EF0EECF1FF0D8
:107F7000EFCF20F009EC57F020C0EDFF1FC0EDFF60
:107F80001EC0EDFF1DC0EFFF390EDBCFE9FFDB06A2
:107F90003A0EDBCFEAFF01E2DB06090EDBCFEFFF93
:107FA000150EDB2A4BD995E1030EDBA61DD06F0E13
:107FB000DF5C06E1C1D918E3150EDB285BDA14D0CB
:107FC000780EDF5C09E0580EDF5C06E0620EDF5CD5
:107FD00003E0420EDF5C08E1020EF36E160EF3CFF3
:107FE000DBFF02D0150EDB6A030EDB50100B0EE038
:107FF000040EDBCF00F0050EDB50D880005406E203
:10800000060EDB5003E1040EDB5034DA95D90AE2A8
:10801000050EDBCFE7FF150EDB50E75E050EE7CF61
:10802000DBFF02D0050EDB6A040EDBCF00F0160E7C
:1080300045D9D880005414E2160EDBCFE6FF150EAA
:10804000DBCFE6FF040EDBCFE6FF050EDB50E5528B
:10805000E75CE552D880E754E552D880E7545FD911
:10806000030EDB50010B0BE1080EDB5008E0B2D829
:1080700001E08DD0080EDB50BED8080EDB6A170E6B
:10808000DB5007E088D9170EF1D903E1011C01E1AB
:108090007ED0160EDB5016E07ED9300EE66E9FD8ED
:1080A00002E1011C74E077D9DFCFE6FF8FEC56F0D8
:1080B000E552E552E552F4CF01F00001F31C02E174
:1080C000011C65E0050EDBCF00F0160EDB50D880FA
:1080D000005409E2050EDBCFE7FF160EDB50E75E2A
:1080E000050EE7CFDBFF300EE66E050ECBD94FE174
:1080F000390EDB2ADBCFE9FF3A0E01E3DB2ADBCFC7
:10810000EAFF090EEFCFDBFFDB500EE044D9090E8A
:10811000ADD902E1011C3BE0390EDB2ADBCFE9FFE0
:108120003A0EEDE3DB2AEBD755D831E1160EDBCF63
:10813000E6FF080EC3D8E552E7245DD82ED0070E1F
:10814000DB50030A1CE0010A14E0030A07E07BD9B4
:10815000DBCFEEFF020EDBCFEDFF1FD0F5D8056AB7
:1081600003AE02D0046805682CD8BCD805C0EEFF69
:1081700014D0EAD803BE046824D8B4D80ED063D98A
:10818000DBCFEFFF0AD07BD905E1011C03E1F368E7
:10819000F46810D0FCD801E3DB2A79D96CEF3CF00D
:1081A000010EDBCF00F0020EDBCF01F000C0F3FFC9
:1081B00001C0F4FF3B0EE15C02E2E16AE552E16ED0
:1081C000CBD029D9020ED2EF41F061D90800F55089
:1081D000DF6E1200200EE66E080E42EF42F08FECCA
:1081E00056F0E552E552E552F3CF00F0F4CF01F03E
:1081F0000001F31C1200006E016AD950010F4DD925
:108200000050EE260150ED221200045E000E055AC9
:10821000F70E04C0DBFFF80E05C0DBFF04C0E9FF6A
:1082200005C0EAFF1200DBCFF4FFF350F45C12004C
:10823000DB50E76E040EE7CFDBFF12000A0EDBCF48
:1082400000F00B0EDBCF01F00C0EDBCF02F00D0EB9
:10825000DBCF03F000500110021003101200130EC8
:10826000EECFDBFF140EEDCFDBFF130EDBCF00F004
:10827000140EDBCF01F00001800E01141200F70E86
:10828000DBCF04F0F80EDBCF05F01200050EDB505B
:10829000E66ED950130F01D9E552E750EE6EED6A44
:1082A00012000A0EDBCF1DF00B0EDBCF1EF00C0E02
:1082B000DBCF1FF00D0EDBCF20F01200DBCFE6FF8F
:1082C000150EDBCFE6FF050EDB50E552E724E55245
:1082D000E7241200DB50CED8010EF36E060EF3CF6A
:1082E000DBFF1200EE50EFCFEAFFE96E02C0EEFFB7
:1082F00003C0EEFF04C0EEFF1200D9CFE6FFDACFD5
:10830000E6FFE1CFD9FFE2CFDAFF1200DFCFE6FFD1
:10831000E66A5AEC57F0E552E552F3501200E76E68
:10832000080EE7CFDBFF1200EECF00F0EECF01F03A
:10833000EFCF02F0036A1200050EDBCF00F0150E3E
:10834000DB50D88000541200010EDBCF02F0020E89
:10835000DBCF03F0046A1200E552E5CFDAFFE7CF86
:10836000D9FF12000A0E00C0DBFF0B0E01C0DBFFBD
:108370001200D9500A0F4DEF42F0F36E070EF3CF03
:10838000DBFF1200EECF00F0EFCF01F01200010E84
:10839000DB2A020E1200FC0EDBCFE6FFFD0EDBCF68
:1083A000E6FF1200005E000E015AF70E00C0DBFF70
:1083B000F80E01C0DBFF00C0E9FF01C0EAFF1200B8
:1083C000DA20EA6EEF2AEECFF6FF000EEF22EECFB4
:1083D000F7FFEF22EECFF8FF1200040EDBCFE6FF2F
:1083E000130EDB50E552E75C9ADFDB5004DF060E2C
:1083F000DB501200090EDB500A0DF350DF24D00FC2
:10840000E76E090EE7CFDBFFE5EF40F0DB50F36EE0
:10841000050E13EF41F0F70EDBCF00F0F80EDBCFC7
:1084200001F01200DFCFE6FFEFEF40F028DF030E90
:10843000ECDE94EF41F041EC3CF0E552E552E552C0
:10844000E55200091200BDDEEE50EFCFEAFFE96E03
:10845000010E1200130EDB50F36E040E13EF41F009
:10846000040EDB50F36E090E13EF41F0DBCFE6FF95
:10847000EFEF40F0E76E050EE7CFDBFF12008BDF7A
:1084800012EF42F0DBCFE6FF86DF1BEF42F0D95060
:10849000F90FE96EFF0EE0EF41F0E96E000EDA2011
:0484A000EA6E12006E
:0C84A4000001A06BA16BA26BA36BE56B49
:1084B000E46BE66B010EE76FE86BEB6BEC6BE96B63
:1084C000230EEA6F9D861200D9CFE6FFE1CFD9FFD8
:1084D0000001110EE66F94869488C76AC66AC56A61
:1084E000F00EC6140809C66EFE0EDB50016AE85095
:1084F000011002E0740E01D01A0EC86EC78EC68A33
:10850000E552E7CFD9FF1200D9CFE6FFE1CFD9FF7F
:10851000E652FD0EDB50016AE850011036E0DF6ADA
:10852000DF50006E016AFD0EDB50000101AE02D08B
:10853000D89003D0005C000E015819E2DF50E76EBE
:10854000FB0EDBCFE9FFFC0EDBCFEAFFE750E926AD
:10855000000EEA22EF50E66EDF50EA6A600FE96E25
:10856000000EEA22E552E750EF6EDF2AD9D7FD0E62
:10857000DB500001A06FFE0EDB50E96FA26BA36B16
:10858000050EE76F200EEA6FC580E552E552E7CF92
:10859000D9FF1200D9CFE6FFE1CFD9FFFD0EDB50A6
:1085A000016AE85001100EE0FD0EDB500001A06FE3
:1085B000FE0EDB50E96FA26BA36B050EE76F210E79
:1085C000EA6FC580E552E7CFD9FF1200D9CFE6FFA9
:1085D000E1CFD9FFE652FC0EDB50006E016AE85095
:1085E000011012E1FD0EDB50DF6ED9CFE6FFDACFCE
:1085F000E6FF010EE66EFE0EDB50E66E85DFE5520D
:10860000E552E552E55211D0FD0EDB500001606FDE
:10861000FC0EDB50A06FFE0EDB50E96FA26BA36B6C
:10862000050EE76F220EEA6FC580E552E552E7CFEF
:10863000D9FF1200D9CFE6FFE1CFD9FF0001100E1C
:10864000E66F94869488FE0EDB50006E016AD89027
:10865000003601360050C86EC76AC66AC56AF00E99
:10866000C6140E09C66EC78EC580C68AE552E7CF0E
:10867000D9FF12000001E651006E016A110E0018C8
:1086800004E1015002E14FEF43F0E651006E016A50
:10869000100E001803E1015001E188D91200000119
:1086A000EA51006E016A200E001853E1015051E1B9
:1086B000E751006E016A070E001801E1015017E052
:1086C000050E001801E1015006E0010E001801E15D
:1086D00001503EE01200070EE76FE951006E016A9B
:1086E000D89000360136000E0010C96E1200C55039
:1086F000400B01E0010E006E016AE850011021E11B
:10870000A251006E016AA051000101AE02D0D890C2
:1087100003D0005C000E01580BE20001A251EA6A8E
:10872000600FE96E000EEA22EF50C96EA22B120014
:108730000001010EE76FC584230EEA6F300EE86F6B
:108740001200010EE76FC584230EEA6F310EE86F49
:108750001200EA51006E016A210E001871E1015009
:108760006FE1E751006E016A0B0E001801E1015044
:108770005FE00A0E001801E1015056E0030E0018F8
:1087800001E101502DE0080E001801E1015017E051
:10879000050E001801E1015006E0010E001801E18C
:1087A00001504DE01200080EE76FE951006E016ABA
:1087B000D89000360136010E0010C96E1200C55067
:1087C000400B01E0010E006E016AE85001102CE040
:1087D000010EE76FC584230EEA6F330EE86F1200B7
:1087E000C950E66EA351EA6A600FE96E000EEA22F4
:1087F000E552E750EF6EA32BA351006E016AA05122
:10880000000101AE02D0D89003D0005C000E0158E8
:1088100005E200010A0EE76FC59A04D000010B0EB5
:10882000E76FC58AC5881200030EE76FC586120080
:10883000010EE76FC584230EEA6F320EE86F120057
:10884000EA51006E016A220E001801E0AED001501C
:1088500001E0ABD0E751006E016A0B0E001801E198
:10886000015001E19BD00A0E001801E1015001E125
:1088700091D0030E001801E1015068E0080E0018C5
:1088800001E1015052E0060E001801E1015041E003
:10889000090E001801E1015028E0070E001801E15F
:1088A000015016E0050E001801E1015007E0010E2D
:1088B000001801E1015001E178D01200070EE76FC6
:1088C000E951006E016AD89000360136000E2AD0B8
:1088D000C550400B01E0010E006E016AE850011026
:1088E00011E16051C96E090E0BD0C550400B01E07B
:1088F000010E006E016AE850011004E1C582060E07
:10890000E76F1200010EE76FC584230EEA6F310E88
:108910001BD0080EE76FE951006E016AD89000364F
:108920000136010E0010C96E1200C550400B01E067
:10893000010E006E016AE85001102CE0010EE76F95
:10894000C584230EEA6F330EE86F1200C950E66E3D
:10895000A351EA6A600FE96E000EEA22E552E75081
:10896000EF6EA32BA351006E016AA051000101AE6E
:1089700002D0D89003D0005C000E015805E200013F
:108980000A0EE76FC59A04D000010B0EE76FC58A87
:10899000C5881200030EE76FC5861200010EE76F4F
:1089A000C584230EEA6F320EE86F1200D9CFE6FFBE
:1089B000E1CFD9FF040EE126010EDB6A020EDB6A6D
:1089C000030EDB6AC650400B01E0010E006E016A27
:1089D000010E001817E1015015E1220EE66EAA0EF5
:1089E000E66E000EE66EFFEC55F0E552E552E552FC
:1089F000C69C0001010EE76FF36E030EF3CFDBFFA1
:108A0000360EE86FC750010B006E016A010E0018A8
:108A100016E1015014E1C950DF6EC950E66EE66AF6
:108A2000010EE66EAA0EE66E000EE66EFFEC55F045
:108A3000006E050EE15E0050DE52010EDD6E030E8B
:108A4000DB50016AE850011001E01ED10001E7513E
:108A5000006E016A030E001801E1015001E17DD0B2
:108A6000040E001801E1015045E0020E001801E17A
:108A7000015017E0010E001801E006D1015001E09D
:108A800003D1C750080B01E0010E006E016A010E10
:108A9000001801E0F9D0015001E0F6D0A16B020E00
:108AA000A5D0C750100B01E0010E006E016A010E47
:108AB000001804E1015002E1010E98D0010EDB50D4
:108AC000016AE850011001E1DFD0C750200B01E03E
:108AD000010E006E016AE850011001E0C5D0C750D8
:108AE000040B01E0010E016AE850011001E0B9D069
:108AF000030E7CD0EC51006E016A005001100DE1B4
:108B0000EB51E66E61D9E552000924E00001A45161
:108B1000C96E010EE56FEC6F18D0E551006E016A69
:108B2000E451000101AE02D0D89003D0005C000EE9
:108B3000015810E20001E551EA6AA40FE96E000E47
:108B4000EA22EF50C96EE52B010EF36E020EF3CF51
:108B5000DBFF9AD00001EC6B48D0C750100B01E04E
:108B6000010E006E016A010E001842E1015040E161
:108B7000010EDB50016AE850011035E0C750200BB0
:108B800001E0010E006E016A010E00181DE10150A6
:108B90001BE1DF50E66EA351EA6A600FE96E000E3A
:108BA000EA22E552E750EF6EA351006E016A3F0ED4
:108BB000001804E1015002E1A36B01D0A32BA12B0B
:108BC000DF50EB6F340E0ED0E10EE66EA90EE66EAE
:108BD000000EE66EFFEC55F0E552E552E55200015D
:108BE000010E370EE86FA151A027010EE76F4CD0A0
:108BF000010EDB50016AE850011046E0C750200B1F
:108C000001E0010E006E016A010E00181DE1015025
:108C10001BE1DF50E66EA351EA6A600FE96E000EB9
:108C2000EA22E552E750EF6EA351006E016A3F0E53
:108C3000001804E1015002E1A36B01D0A32BA12B8A
:108C4000DF50EB6F340E1FD0C750040B01E0010E54
:108C5000006E016A010E001807E1015005E1A15103
:108C6000A027040EE76F46D7E10EE66EA90EE66E6A
:108C7000000EE66EFFEC55F0E552E552E5520001BC
:108C8000010EE76F370EE86F010EDB50036AE85004
:108C9000031008E1020EDB50056AE850051002E1FE
:108CA000000E01D0010E016AE850011009E0C65023
:108CB000100B01E0010E016AE850011001E1C688C5
:108CC000040EE15C02E2E16AE552E16EE552E7CFB3
:108CD000D9FF12000001E651006E016A110E001862
:108CE0001BE1015019E1EA51026E036A230E0218DA
:108CF0000AE1035008E1A051046E056A0450051012
:108D000002E0000E01D0010E006E016AE850011071
:108D100001E0000CE8511200100EE66FE85018E078
:108D2000E751026E036A010E02180AE1035008E1DE
:108D3000A051046E056A0450051002E0000E01D037
:108D4000010E006E016AE850011001E0000CE851CC
:108D500012000001A0511200D9CFE6FFE1CFD9FFE8
:108D6000E652DF6A0001A051006E016A0050011056
:108D700025E0A251EA6A600FE96E000EEA22EF5088
:108D8000E66EDF50E76EFD0EDBCFE9FFFE0EDBCFB8
:108D9000EAFFE750E926000EEA22E552E750EF6EBF
:108DA000DF2AA251006E016A3F0E001804E1015053
:108DB00002E1A26B01D0A22BA007D4D7DF50E5526D
:108DC000E552E7CFD9FF1200D9CFE6FFE1CFD9FFB7
:108DD000E652DF6AFE0EDB50006E016ABB0E001821
:108DE00001E101500BE0AA0E001811E101500FE162
:108DF0000001410EA46F010EE46F08D00001310E96
:108E0000A46F320EA56F020EE46F010EDF6EDF500D
:0A8E1000E552E552E7CFD9FF12004A
:068E1A000001700EED6F77
:108E20001200D9CFE6FFE1CFD9FF020EE126DE52D4
:108E3000210EDD6ED950010FE66E000EDA20E66ECF
:108E4000010EE66E0001ED51E66E84EC42F0E55253
:108E5000E552E552E5526AEC46F0DF6EDF50006EF7
:108E6000016AE8500110F7E0E66A48D8E5520F0EB3
:108E7000E66E0CD8E5529ED8020EE15C02E2E16A91
:108E8000E552E16EE552E7CFD9FF1200D9CFE6FFF8
:108E9000E1CFD9FFE652FE0EDB50006E016A0134CD
:108EA0000AE200500F08000E015405E20F0EF36EA7
:108EB000FE0EF3CFDBFFFE0EDB8ADB8CDB8ED950A0
:108EC000FE0FE66EFF0EDA20E66E010EE66E000182
:108ED000ED51E66E84EC42F0E552E552E552E55282
:108EE0006AEC46F0DF6EDF50006E016AE850011058
:108EF000F7E0E552E552E7CFD9FF1200D9CFE6FF00
:108F0000E1CFD9FFE652FE0EDB50006E016A01345C
:108F100007E200500308000E015402E2FE0EDB6A75
:108F2000FE0EDB50006E016AD89000360136810ECD
:108F30000010DF6ED9CFE6FFDACFE6FF010EE66E56
:108F40000001ED51E66E84EC42F0E552E552E55247
:108F5000E5526AEC46F0DF6EDF50006E016AE850C1
:108F60000110F7E0E552E552E7CFD9FF1200D9CF63
:108F7000E6FFE1CFD9FFE6520001EE6BEE0EE66EA2
:108F8000000EE66E110EE66EED51E66E84EC42F0D8
:108F9000E552E552E552E5526AEC46F0DF6EDF50ED
:108FA000006E016AE8500110F7E0E552E552E7CFA4
:108FB000D9FF1200D9CFE6FFE1CFD9FFE652DF6A31
:108FC000DF50006E016AD890015004E6110E005C7B
:108FD000000E015809E2DF50EA6AEE0FE96E000E5A
:108FE000EA22EF6ADF2AECD7E552E552E7CFD9FF54
:108FF0001200D9CFE6FFE1CFD9FFFE0EDB50016AA8
:10900000E850011003E00001F36902D00001F36BA6
:10901000E552E7CFD9FF1200D9CFE6FFE1CFD9FF64
:10902000FE0EDB50006E016A013405E200500408B8
:10903000000E015415E3FD0EDB50E66EFE0EDB5014
:10904000E96EEA6AD890E936EA36010EE926000EA2
:10905000EA22EE0EE926000EEA22E552E750EF6E14
:10906000E552E7CFD9FF1200D9CFE6FFE1CFD9FF14
:10907000FE0EDB50006E016A013405E20050040868
:10908000000E01542CE3FE0EDB50006E016A013429
:1090900007E200500108000E015402E2FE0EDB2A36
:1090A000FD0EDB50EA6AC50FE96E010EEA22EFCF32
:1090B00000F0016A00BE0168FC0EDB50026E036A1C
:1090C000070ED89002360336E804FBE10050021088
:1090D000E66EFE0EDB50E66E9FDFE552E552E5528E
:1090E000E7CFD9FF1200D9CFE6FFE1CFD9FFFE0EBF
:1090F000DB50006E016A013405E200500408000EE6
:1091000001542CE3FE0EDB50006E016A013407E2CD
:1091100000500108000E015402E2FE0EDB2AFD0E93
:10912000DB50EA6ACF0FE96E010EEA22EFCF00F0C2
:10913000016A00BE0168FC0EDB50026E036A070E76
:10914000D89002360336E804FBE100500210E66EC8
:10915000FE0EDB50E66E60DFE552E552E552E7CFEA
:10916000D9FF1200D9CFE6FFE1CFD9FFE66AFD0EA5
:10917000DBCF00F0FE0EDBCF01F0100E246E270EC9
:10918000256E00C01FF001C020F044EC57F01BC05A
:1091900000F01CC001F0E80E246E030E256E1BC00B
:1091A0001FF01CC020F044EC57F01FC000F020C09E
:1091B00001F01F50E66EE66A57DFE552E552E552D0
:1091C000E66AFD0EDBCF00F0FE0EDBCF01F0E80E0D
:1091D000246E030E256E00C01FF001C020F044EC89
:1091E00057F01BC000F01CC001F0640E246E256A0D
:1091F0001BC01FF01CC020F044EC57F01FC000F053
:1092000020C001F01F50E66E010EE66E2DDFE55224
:10921000E552E552E66AFD0EDBCF00F0FE0EDBCF35
:1092200001F0640E246E256A00C01FF001C020F01A
:1092300044EC57F01BC000F01CC001F00A0E246E75
:10924000256A1BC01FF01CC020F044EC57F01FC063
:1092500000F020C001F01F50E66E020EE66E04DF43
:10926000E552E552E552E66AFD0EDBCF00F0FE0E58
:10927000DBCF01F00A0E246E256A00C01FF001C08A
:1092800020F044EC57F01BC000F01CC001F01B5054
:10929000E66E030EE66EE8DEE552E552E552FD0E9F
:1092A000DBCF00F0FE0EDBCF01F00A0E005C000EFB
:1092B00001580EE2E66AE66AAFDEE552E552E66A7A
:1092C000010EE66EA9DEE552E552E66A030E12D003
:1092D000FD0EDBCF00F0FE0EDBCF01F0640E005C74
:1092E000000E015809E2E66AE66A96DEE552E552AA
:1092F000E66A010EE66E0DD0FD0EDBCF00F0FE0E2D
:10930000DBCF01F0E80E005C030E015805E2E66ACF
:10931000E66A82DEE552E5522ADEE552E7CFD9FF62
:02932000120039
:0E93220000000000003E5B4F5B3E3E6B4F6B59
:109330003E1C3E7C3E1C183C7E3C181C577D571C36
:109340001C5E7F5E1C00183C1800FFE7C3E7FF00AF
:1093500018241800FFE7DBE7FF30483A060E2629FD
:10936000792926407F050507407F05253F5A3CE7C0
:109370003C5A7F3E1C1C08081C1C3E7F14227F2286
:10938000145F5F005F5F06097F017F006689956A51
:10939000606060606094A2FFA29408047E040810DC
:1093A000207E201008082A1C08081C2A08081E1005
:1093B0001010100C1E0C1E0C30383E3830060E3EBD
:1093C0000E06000000000000005F0000000700071C
:1093D00000147F147F14242A7F2A12231308646246
:1093E00036495620500008070300001C22410000A7
:1093F00041221C002A1C7F1C2A08083E0808008005
:10940000703000080808080800006060002010089C
:1094100004023E5149453E00427F4000724949499D
:10942000462141494D331814127F102745454539CF
:109430003C4A4949314121110907364949493646D3
:109440004949291E000014000000403400000008B3
:109450001422411414141414004122140802015956
:1094600009063E415D594E7C1211127C7F494949E3
:10947000363E414141227F4141413E7F4949494178
:109480007F090909013E414151737F0808087F00A7
:10949000417F41002040413F017F081422417F402D
:1094A0004040407F021C027F7F0408107F3E414104
:1094B000413E7F090909063E4151215E7F09192974
:1094C00046264949493203017F01033F4040403F5E
:1094D0001F2040201F3F4038403F6314081463039F
:1094E000047804036159494D43007F41414102041E
:1094F000081020004141417F040201020440404025
:109500004040000307080020545478407F2844441A
:10951000383844444428384444287F385454541834
:1095200000087E090218A4A49C787F08040478002F
:10953000447D40002040403D007F10284400004111
:109540007F40007C047804787C0804047838444424
:109550004438FC1824241818242418FC7C0804041B
:1095600008485454542404043F44243C4040207C84
:109570001C2040201C3C4030403C44281028444CD7
:109580009090907C4464544C4400083641000000A4
:10959000770000004136080002010204023C262345
:1095A000263C1EA1A161123A4040207A38545455FD
:1095B00059215555794121545478412155547840C9
:1095C00020545579400C1E5272123955555559394F
:1095D0005454545939555454580000457C410002A4
:1095E000457D420001457C40F0292429F0F02825E2
:1095F00028F07C545545002054547C547C0A097F43
:109600004932494949323248484832324A4848305A
:109610003A4141217A3A42402078009DA0A07D390C
:10962000444444393D4040403D3C24FF2424487E8E
:109630004943662B2FFC2F2BFF0929F620C0887E7B
:10964000090320545479410000447D413048484A80
:1096500032384040227A007A0A0A727D0D19317D33
:109660002629292F28262929292630484D40203807
:109670000808080808080808382F10C8ACBA2F10C6
:109680002834FA00007B000008142A142222142A2D
:109690001408AA005500AAAA55AA55AA000000FF5E
:1096A00000101010FF00141414FF001010FF00FF32
:1096B0001010F010F0141414FC001414F700FF0044
:1096C00000FF00FF1414F404FC141417101F1010F2
:1096D0001F101F1414141F00101010F000000000C1
:1096E0001F101010101F10101010F010000000FFBD
:1096F000101010101010101010FF10000000FF14B8
:109700000000FF00FF00001F10170000FC04F4140D
:10971000141710171414F404F40000FF00F71414C5
:109720001414141414F700F7141414171410101F41
:10973000101F141414F4141010F010F000001F1077
:109740001F0000001F14000000FC140000F010F0C7
:109750001010FF10FF141414FF141010101F00003D
:109760000000F010FFFFFFFFFFF0F0F0F0F0FFFF50
:10977000FF0000000000FFFF0F0F0F0F0F384444E1
:1097800038447C2A2A3E147E02020606027E027EAD
:109790000263554941633844443C04407E201E2006
:1097A00006027E020299A5E7A5991C2A492A1C4CAB
:1097B0007201724C304A4D4D303048784830BC62AE
:1097C0005A463D3E494949007E0101017E2A2A2A26
:1097D0002A2A44445F444440514A444040444A5148
:1097E000400000FF0103E080FF000008086B6B08E9
:1097F0003612362436060F090F060000181800002E
:10980000001010003040FF0101001F01011E00196F
:0D9810001D1712003C3C3C3C000000000015
:03981D0000000048
:1098200000003E5B4F5B3E3E6B4F6B3E1C3E7C3E02
:109830001C183C7E3C181C577D571C1C5E7F5E1C10
:1098400000183C1800FFE7C3E7FF0018241800FFCA
:10985000E7DBE7FF30483A060E2629792926407FC4
:10986000050507407F05253F5A3CE73C5A7F3E1CD3
:109870001C08081C1C3E7F14227F22145F5F005FBF
:109880005F06097F017F006689956A60606060609D
:1098900094A2FFA29408047E040810207E201008E1
:1098A000082A1C08081C2A08081E101010100C1E7C
:1098B0000C1E0C30383E3830060E3E0E06000000FE
:1098C000000000005F00000007000700147F147F05
:1098D00014242A7F2A122313086462364956205022
:1098E0000008070300001C2241000041221C002A3E
:1098F0001C7F1C2A08083E080800807030000808F9
:10990000080808000060600020100804023E514969
:10991000453E00427F400072494949462141494D38
:10992000331814127F1027454545393C4A494931BF
:1099300041211109073649494936464949291E003E
:1099400000140000004034000000081422411414E8
:10995000141414004122140802015909063E415D05
:10996000594E7C1211127C7F494949363E41414192
:10997000227F4141413E7F494949417F090909010F
:109980003E414151737F0808087F00417F4100201C
:1099900040413F017F081422417F404040407F0208
:1099A0001C027F7F0408107F3E4141413E7F090930
:1099B00009063E4151215E7F091929462649494938
:1099C0003203017F01033F4040403F1F2040201FE2
:1099D0003F4038403F631408146303047804036174
:1099E00059494D43007F4141410204081020004184
:1099F00041417F040201020440404040400003070F
:109A0000080020545478407F284444383844444463
:109A100028384444287F385454541800087E0902DA
:109A200018A4A49C787F0804047800447D4000209A
:109A300040403D007F1028440000417F40007C04EE
:109A40007804787C080404783844444438FC1824AA
:109A5000241818242418FC7C08040408485454547E
:109A60002404043F44243C4040207C1C2040201C13
:109A70003C4030403C44281028444C9090907C441A
:109A800064544C4400083641000000770000004157
:109A900036080002010204023C2623263C1EA1A136
:109AA00061123A4040207A3854545559215555791D
:109AB00041215454784121555478402054557940DF
:109AC0000C1E52721239555555593954545459393E
:109AD000555454580000457C410002457D42000128
:109AE000457C40F0292429F0F0282528F07C5455A5
:109AF00045002054547C547C0A097F493249494925
:109B0000323248484832324A4848303A4141217A54
:109B10003A42402078009DA0A07D39444444393D1C
:109B20004040403D3C24FF2424487E4943662B2F7F
:109B3000FC2F2BFF0929F620C0887E0903205454EE
:109B400079410000447D413048484A323840402243
:109B50007A007A0A0A727D0D19317D2629292F286B
:109B6000262929292630484D4020380808080808A9
:109B7000080808382F10C8ACBA2F102834FA000093
:109B80007B000008142A142222142A1408AA005563
:109B900000AAAA55AA55AA000000FF00101010FF45
:109BA00000141414FF001010FF00FF1010F010F04C
:109BB000141414FC001414F700FF0000FF00FF143D
:109BC00014F404FC141417101F10101F101F141489
:109BD000141F00101010F0000000001F10101010D3
:109BE0001F10101010F010000000FF1010101010C7
:109BF00010101010FF10000000FF140000FF00FF05
:109C000000001F10170000FC04F4141417101714A0
:109C100014F404F40000FF00F714141414141414C2
:109C2000F700F7141414171410101F101F14141435
:109C3000F4141010F010F000001F101F0000001F9F
:109C400014000000FC140000F010F01010FF10FFD2
:109C5000141414FF141010101F00000000F010FF67
:109C6000FFFFFFFFF0F0F0F0F0FFFFFF000000004B
:109C700000FFFF0F0F0F0F0F38444438447C2A2A8F
:109C80003E147E02020606027E027E0263554941B0
:109C9000633844443C04407E201E2006027E0202BB
:109CA00099A5E7A5991C2A492A1C4C7201724C30CF
:109CB0004A4D4D303048784830BC625A463D3E49A6
:109CC0004949007E0101017E2A2A2A2A2A44445F4A
:109CD000444440514A444040444A51400000FF013E
:109CE00003E080FF000008086B6B0836123624364C
:109CF000060F090F060000181800000010100030B1
:109D000040FF0101001F01011E00191D1712003C38
:089D10003C3C3C000000000097
:089D1800D9CFE6FFE1CFD9FF2E
:109D2000020EE126DE6ADD6A8F0ED3147009D36E4F
:109D3000FC0ED3140009D36E0F0148691F0E496F42
:109D4000CEEC51F0030EE66E43EC50F0E55222ECFF
:109D500000F029EC53F024EC53F0CF0EE66EA90E80
:109D6000E66E000EE66EFFEC55F0E552E552E55268
:109D70002FEC00F0E6682DEC57F0E552E6682DEC8C
:109D800057F0E552E66A09EC29F0E55239EC14F097
:109D9000E6682DEC57F0E552E6682DEC57F0E552F9
:109DA000C2EC16F0E66A09EC29F0E552000EE66E08
:109DB000E66AE66EE66AA6EC28F0E552E552E55260
:109DC000E5524C0EE66EA90EE66E000EE66E4BEC0A
:109DD00028F0E552E552E552E6682DEC57F0E552E1
:109DE000E6682DEC57F0E552C2EC16F0030EE66E75
:109DF00009EC29F0E552000EE66EE66AE66EE66AC8
:109E0000A6EC28F0E552E552E552E5524C0EE66E1E
:109E1000A90EE66E000EE66E4BEC28F0E552E55218
:109E2000E552E6682DEC57F0E552E6682DEC57F068
:109E3000E552E66A09EC29F0E552E00EE66EE668C6
:109E40002FEC0AF0E552E552E6682DEC57F0E552AA
:109E5000E6682DEC57F0E552030EE66E09EC29F0AA
:109E6000E5521F0EE66EE66A2FEC0AF0E552E55267
:109E7000E6682DEC57F0E552E6682DEC57F0E55218
:109E8000E66A09EC29F0E552E00EE66E070EE66E92
:109E9000F3EC0CF0E552E552E6682DEC57F0E55294
:109EA000E6682DEC57F0E552010EE66E09EC29F05C
:109EB000E552E66AF80EE66EF3EC0CF0E552E55278
:109EC000E6682DEC57F0E552E6682DEC57F0E552C8
:109ED000020EE66E09EC29F0E5521F0EE66EE66A08
:109EE000F3EC0CF0E552E552E6682DEC57F0E55244
:109EF000E6682DEC57F0E552030EE66E09EC29F00A
:109F0000E552E00EE66EE668F3EC0CF0E552E55241
:109F1000E6682DEC57F0E552E6682DEC57F0E55277
:109F2000E66A09EC29F0E5521F0EE66EF80EE66EC1
:109F3000E00EE66EE66863EC0EF0E552E552E5529F
:109F4000E552E6682DEC57F0E552E6682DEC57F047
:109F5000E552030EE66E09EC29F0E552E00EE66EDE
:109F6000070EE66E1F0EE66EE66A63EC0EF0E55233
:109F7000E552E552E552E6682DEC57F0E552E66809
:109F80002DEC57F0E552E66A09EC29F0E552C2ECF7
:109F900016F01F0EE66EE66A0A0EE66EE66A54ECEE
:109FA00011F0E552E552E552E552E668E6680A0E20
:109FB000E66EE66AADEC10F0E552E552E552E55288
:109FC000E6682DEC57F0E552E6682DEC57F0E552C7
:109FD000030EE66E09EC29F0E552C2EC16F01F0EF6
:109FE000E66EF80EE66E0A0EE66EE66A54EC11F0C6
:109FF000E552E552E552E552E00EE66EE6680A0EDD
:10A00000E66EE66AADEC10F0E552E552E552E55237
:10A01000E6682DEC57F0E552E6682DEC57F0E55276
:10A02000E66A09EC29F0E552E5EC11F0E6682DEC62
:10A0300057F0E552E6682DEC57F0E552030EE66E58
:10A0400009EC29F0E552E5EC11F0E6682DEC57F04B
:10A05000E552E6682DEC57F0E552E66A09EC29F086
:10A06000E5528EEC12F0E6682DEC57F0E552E6680A
:10A070002DEC57F0E552030EE66E09EC29F0E5529F
:06A080008EEC12F077D611
:0AA08600D9CFE6FFE1CFD9FF0E01AC
:10A09000070EFD6F0B0EC76F0A0EC56F9398939452
:10A0A000939E8A8E939C8A8C939A8A9A739E739CB1
:10A0B000FE0EDB50006E016A040E001806E101502E
:10A0C00004E1F00E721400091DD0FE0EDB50006E8C
:10A0D000016A030E001806E1015004E1F00E72144B
:10A0E0000A0910D0FE0EDB50006E016A020E001845
:10A0F00006E1015004E1F00E7214010903D0F00EE4
:10A1000072140209726E7288728AA39E0201426BF7
:10A11000406B416B836B846BE552E7CFD9FF120034
:10A12000D9CFE6FFE1CFD9FFE6527350010B016AA8
:10A13000E850011047E002014251006E016A3F0EF3
:10A14000001810E101500EE13B0EE66EAA0EE66E1D
:10A15000000EE66EFFEC55F0E552E552E552755003
:10A16000DF6E30D07550E66E4151EA6A000FE96E3D
:10A17000020EEA22E552E750EF6E4151006E016A8D
:10A180003F0E001804E1015002E1416B01D0412B68
:10A19000422B8351006E016A8451026E036A0250A1
:10A1A000001802E1035001180AE08351EA6A430FE4
:10A1B000E96E020EEA22EF50756E832B03D08A847B
:10A1C000836B846BE552E552E7CFD9FF1200D9CFFC
:10A1D000E6FFE1CFD9FF030EE126DE6ADD6A020E5B
:10A1E000DB6A8A9EFB0EDB50DF1804E1FC0EDB50BD
:10A1F000DE52DD181EE0FD0EDBCF00F0FE0EDBCFE1
:10A2000001F0DE500024E96EDD500120EA6EEF50CF
:10A21000756EDF2A010E01E3DB2A7350010B016A20
:10A22000E8500110FAE07550E76E020EE7CFDBFF51
:10A23000D9D78A8E030EE15C02E2E16AE552E16E53
:10A24000E552E7CFD9FF1200D9CFE6FFE1CFD9FF22
:10A25000030EE126DE6ADD6A020EDB6A8A9EFC0ED0
:10A26000DB50DF1804E1FD0EDB50DE52DD1813E099
:10A27000FE0EDB50756EDF2A010E01E3DB2A735000
:10A28000010B016AE8500110FAE07550E76E020E0A
:10A29000E7CFDBFFE4D78A8E030EE15C02E2E16ADE
:10A2A000E552E16EE552E7CFD9FF1200D9CFE6FFC4
:10A2B000E1CFD9FFE652DF6A8A9EDF6ADF50006E87
:10A2C000016AFE0EDB50000101AE02D0D89003D02F
:10A2D000005C000E015821E2756A7350010B016A9F
:10A2E000E8500110FAE07550E66E02014151EA6A49
:10A2F000000FE96E020EEA22E552E750EF6E41517F
:10A30000006E016A3F0E001804E1015002E1416B4A
:10A3100001D0412B422BDF2AD1D78A8EE552E5525C
:10A32000E7CFD9FF1200020142511200D9CFE6FF58
:10A33000E1CFD9FFE652DF6A02014251006E016AA5
:10A340000050011025E04051EA6A000FE96E020E4C
:10A35000EA22EF50E66EDF50E76EFD0EDBCFE9FF3D
:10A36000FE0EDBCFEAFFE750E926000EEA22E552B7
:10A37000E750EF6EDF2A4051006E016A3F0E001871
:10A3800004E1015002E1406B01D0402B4207D4D7D9
:0CA39000DF50E552E552E7CFD9FF120084
:04A39C00949C948E6B
:10A3A0007E96190EB06EAD84AD98AC8EAD9CAC9C13
:10A3B000AC88AD8A9D989D8A0101406B416B426BD0
:10A3C0001200D9CFE6FFE1CFD9FFE6529E50200B15
:10A3D00001E0010E016AE85001102FE00101425135
:10A3E000006E016A3F0E001811E101500FE1AD9AB5
:10A3F000640EE66EAA0EE66E000EE66EFFEC55F0F9
:10A40000E552E552E552AF50DF6E17D0AF50E66E21
:10A410004151EA6A000FE96E010EEA22E552E75067
:10A42000EF6E4151006E016A3F0E001804E10150C9
:10A4300002E1416B01D0412B422BAC50020B01E0F9
:10A44000010E006E016A010E001810E101500EE1CC
:10A45000AC98AC88AD9A530EE66EAA0EE66E000E6E
:10A46000E66EFFEC55F0E552E552E552E552E55255
:10A47000E7CFD9FF120001018351006E016A8451B8
:10A48000026E036A0250001802E1035001180AE04C
:10A490008351EA6A430FE96E010EEA22EF50AE6E75
:10A4A000832B1200AD50020B01E0010E006E016A19
:10A4B000E8500110F7E0AD9A0101836B846B120044
:10A4C000D9CFE6FFE1CFD9FF020EE126AD50200B38
:10A4D00001E0010E016AE8500110F8E1D950FC0FCB
:10A4E000006EFF0EDA20016E00C0DEFFDD6EDECFF3
:10A4F000E6FFDDCFE6FFFC0EDBCFE6FFFD0EDBCF98
:10A50000E6FFFE0EDBCFE6FF430EE66E010EE66EC3
:10A510004BEC56F0006E070EE15E0050430EE66E07
:10A52000010EE66E48EC54F0E552E552F3CF84F1AB
:10A530000101010E836F4351AE6EAD8A020EE15CE4
:10A5400002E2E16AE552E16EE552E7CFD9FF12007F
:10A55000D9CFE6FFE1CFD9FFE652AD50200B01E0A5
:10A56000010E016AE8500110F8E1FC0EDB50010118
:10A57000846F010E836FDF6ADF50006E016AFC0E8C
:10A58000DB50000101AE02D0D89003D0005C000E79
:10A59000015819E2DF50E76EFD0EDBCFE9FFFE0E3A
:10A5A000DBCFEAFFE750E926000EEA22EFCF00F00A
:10A5B000016ADF50EA6A430FE96E010EEA2200C029
:10A5C000EFFFDF2AD9D701014351AE6EAD8AE552C4
:10A5D000E552E7CFD9FF1200D9CFE6FFE1CFD9FF8F
:10A5E000E652DF6A01014251006E016A005001101B
:10A5F00025E04051EA6A000FE96E010EEA22EF50B1
:10A60000E66EDF50E76EFD0EDBCFE9FFFE0EDBCF1F
:10A61000EAFFE750E926000EEA22E552E750EF6E26
:10A62000DF2A4051006E016A3F0E001804E101501C
:10A6300002E1406B01D0402B4207D4D7DF50E552F6
:08A64000E552E7CFD9FF12003B
:08A648009F8A9F889F86A58E62
:10A650001200D08EF28EF28C1200F250800B01E0CC
:10A66000010E036AE850031002E0000E01D0010E53
:10A67000016AF36E01C0F4FF1200F250400B01E0DA
:10A68000010E036AE850031002E0000E01D0010E33
:10A69000016AF36E01C0F4FF1200F250400B01E0BA
:10A6A000010E006E016A010E001802E1015004E083
:10A6B000D4DFF350F41002E0F36A02D0010EF36E1F
:10A6C000F46A1200EADFF3CF02F0F4CF03F0F350A4
:10A6D000F41004E1C2DFF350F41002E0000E01D0E8
:10A6E000010E016AE850011003E0010EF36E01D083
:10A6F000F36AF46A1200DACFE4FFE2CFDAFFE9CFBF
:10A70000E4FFEACFE4FFF6CFE4FFF7CFE4FFF8CFB2
:10A71000E4FFF5CFE4FFF3CFE4FFF4CFE4FFFACF9B
:10A72000E4FFFBCFE4FF00EE17F0140EE80403E3B0
:10A73000EECFE4FFFBD700EE00F0170EE80403E3D2
:10A74000EECFE4FFFBD7E652A450800B01E0010EF0
:10A750002B6E2C6AE8502C1004E090EC50F0A49E74
:10A7600019D09E50080B01E0010E2B6E2C6AE850A8
:10A770002C1004E03AEC43F09E960CD09E50200B37
:10A7800001E0010E2B6E2C6AE8502C1003E0E1EC86
:10A7900051F09E9AE55200EE16F0170EE80403E31E
:10A7A000E5CFEDFFFBD700EE2AF0140EE80403E33B
:10A7B000E5CFEDFFFBD7E5CFFBFFE5CFFAFFE5CF18
:10A7C000F4FFE5CFF3FFE5CFF5FFE5CFF8FFE5CFE9
:10A7D000F7FFE5CFF6FFE5CFEAFFE5CFE9FFE5CFED
:10A7E000DAFF1100D8CFE4FFE0CFE4FFE46EDACF68
:10A7F000E4FFE652E552E5CFDAFFE550E5CFE0FFB2
:06A80000E5CFD8FF1000B7
:0AA80600D9CFE6FFDACFE6FFFA0E25
:10A81000E3CFD9FFFB0EE3CFDAFFFC0EE3CFE9FF76
:10A82000FD0EE3CFEAFFE9CFF3FFEACFF4FFF80E26
:10A83000E35003E1F90EE35008E0F80EE30602E20C
:10A84000F90EE306DECFEEFFF2D7FF0EE3CFDAFF1D
:10A85000E552FF0EE3CFD9FFE5521200FE0EE3CF23
:10A86000E9FFFF0EE3CFEAFFE9CFF3FFEACFF4FF02
:10A87000FB0EE35003E1FC0EE35009E0FB0EE306A0
:10A8800002E2FC0EE306FD0EE350EE6EF1D712007D
:10A89000FE0EE3CFE9FFFF0EE3CFEAFFF36AF46AAF
:10A8A000EE5203E0F34AF42AFBD71200D9CFE6FFB9
:10A8B000DACFE6FFFA0EE3CFD9FFFB0EE3CFDAFFE4
:10A8C000FC0EE3CFE9FFFD0EE3CFEAFFF80EE35005
:10A8D00003E1F90EE3500AE0F80EE30602E2F90E96
:10A8E000E306DE50EF5C02E1EE66F0D7F36EFF0E9A
:10A8F000E3CFDAFFE552FF0EE3CFD9FFE552F35085
:10A900001200FF0EE3CFF8FFE552FF0EE3CFF7FF93
:10A91000E552FF0EE3CFF6FFE552E66AE66AE66A25
:10A920000900F55209E0FD0EE32A05E1FE0EE32AD7
:10A9300002E1FF0EE32AF4D7FD0EE3CF1EF0FE0E78
:0CA94000E3CF1FF0FF0EE3CF20F0120069
:04A94C004C6F726575
:10A950006D20697073756D20646F6C6F7220736900
:10A960007420616D65742C20636F6E73656374650C
:10A970007475722061646970697363696E672065BC
:10A980006C69742E204375726162697475722061FE
:10A99000646970697363696E6720616E74652073A2
:10A9A0006564206E6962682074696E636964756E9F
:10A9B0007420666575676961742E204D61656365F5
:10A9C0006E617320656E696D206D61737361000D3A
:10A9D0000A426567696E2050726F6772616D0D0A79
:10A9E000004932433A20284552524F5229206E6F77
:10A9F00020646174612072656369657665640D0A1F
:10AA0000004932433A2064617461207265616420B8
:10AA100066726F6D206275666665723A2025780DE4
:10AA20000A004932433A206F766572666C6F772070
:10AA300064657465637465640D0A00535049323A65
:10AA400020627566666572206F766572666C6F77D8
:10AA50000D0A0055415254313A206F766572727575
:10AA60006E0D0A0055415254313A20627566666592
:0DAA700072206F766572666C6F770D0A00BC
:02AA7E00176A55
:10AA800025AE48EF55F0246C251EE86A2522171ED6
:10AA900020AE50EF55F01F6C201EE86A2022171ED2
:10AAA00044EC57F020BE60EF55F017AE000C1F6C61
:10AAB000201EE86A20221B6C1C1EE86A1C22000C67
:10AAC00017BE57EF55F01888FF0C20C02AF01FC0A2
:10AAD00029F01F502402F4CF1EF0F3CF1DF02050B8
:10AAE0002502F4CF20F0F3CF1FF02402F3501E26EE
:10AAF000F4501F22E86A202229502502F3501E2616
:10AB0000F4501F22E86A202225AE8BEF55F0295021
:10AB10001F5E2A50205A2AAE000C24501F5E25507A
:10AB2000205A000C1FC029F01F502402F4CF1EF041
:10AB3000F3CF1DF020502502F4CF20F0F3CF1FF00B
:10AB40002402F3501E26F4501F22E86A20222950C6
:10AB50002502F3501E26F4501F22E86A2022000C22
:10AB60001E0EF66E000EF76E000EF86E0101090063
:10AB7000F550E96F0900F550EA6F03E1E96701D08C
:10AB80003DD00900F550E46F0900F550E56F09006C
:10AB9000F550E66F09000900F550E96E0900F5501F
:10ABA000EA6E090009000900F550E76F0900F55049
:10ABB000E86F09000900F6CFEBF1F7CFECF1F8CF21
:10ABC000EDF1E4C1F6FFE5C1F7FFE6C1F8FF0101D1
:10ABD000E75302E1E85307E00900F550EE6EE7079E
:10ABE000F8E2E807F9D7EBC1F6FFECC1F7FFEDC1DA
:0EABF000F8FF0101E907000EEA5BBFD7120073
:02ABFE00D9CFAD
:10AC0000E6FFDACFE6FFE1CFD9FFE2CFDAFFE65287
:10AC1000E652E652E652D950FB0F006EFF0EDA20E4
:10AC2000016E00C0DEFFDD6EDECFE6FFDDCFE6FFAA
:10AC3000FB0EDBCFE6FFFC0EDBCFE6FFFD0EDBCF2E
:10AC4000E6FFA9CEE6FFAACEE6FF57EC3CF0006E89
:10AC5000070EE15C02E2E16AE552E16E0050020E8D
:10AC6000F3CFDBFF030EF4CFDBFF020EDBCF00F0F0
:10AC7000030EDBCF01F000C0F3FF01C0F4FF040EB0
:10AC8000E15C02E2E16AE552E16EE552E5CFDAFF0E
:06AC9000E7CFD9FF12001E
:0AAC9600D9CFE6FFDACFE6FFE1CFE9
:10ACA000D9FFE2CFDAFFE652E652F70EDBCFE6FF3E
:10ACB000F80EDBCFE6FFF90EDBCFE6FFFA0EDBCFB7
:10ACC000E6FFFB0EDBCFE6FFD950FC0FE66EFF0E72
:10ACD000DA20E66E57EC3CF0006E070EE15C02E213
:10ACE000E16AE552E16E0050F3CFDEFFF4CFDDFF05
:10ACF000FC0EDBCFE9FFFD0EDBCFEAFFEF6ADECF14
:10AD000000F0DDCF01F000C0F3FF01C0F4FFE55219
:0EAD1000E552E552E5CFDAFFE7CFD9FF12009A
:02AD1E00D9CF8B
:10AD2000E6FFDACFE6FFE1CFD9FFE2CFDAFFFB0E95
:10AD3000DBCF00F0FC0EDBCF01F00001800E011430
:10AD40001AE1FB0EDBCFE9FFFC0EDBCFEAFFEECF13
:10AD5000F3FFEDCFF4FFEE2A000EEF22F3CFE9FF71
:10AD6000F4CFEAFFFD0EDBCFEFFFEF50016AF36E89
:10AD700001C0F4FF10D0FB0EDB50FE0806E1FD0E13
:10AD8000DBCFE6FF9AEC57F005D0FD0EDBCFE6FFF8
:10AD900003EC00F0E552E552E5CFDAFFE7CFD9FF4B
:02ADA00012009F
:0EADA2001D502202F3CF19F0F4CF1AF0230255
:10ADB000F3501A26000EF4201B6E1D502402F3508F
:10ADC0001B26000EF4201C6E1D502502F3501C267D
:10ADD0001E502202F3501A26F4501B22000E1C2291
:10ADE0001E502302F3501B26F4501C221E50240236
:10ADF000F3501C261F502202F3501B26F4501C2235
:10AE00001F502302F3501C2620502202F3501C2610
:02AE100012002E
:0EAE12001C6A1B6A1A6A196A200EE76ED89035
:10AE20001D361E361F36203619361A361B361C368E
:10AE30002250195C23501A5824501B5825501C5876
:10AE400009E32250195E23501A5A24501B5A2550E8
:0AAE50001C5A1D2AE72EE4D7120059
:06AE5A00FF0EE3502E6E16
:10AE6000EF0E01D0F30EE76EE72E34EF57F00C0E25
:10AE70002D6EE76AE72E3AEF57F02D2E39EF57F097
:08AE80002E2E32EF57F01200F4
:08AE88001C6A1B6A100EE76E44
:10AE9000D8901F3620361B361C3624501B5C25509C
:10AEA0001C5805E324501B5E25501C5A1F2AE72E10
:04AEB000F0D71200C5
:0CAEB400F36AF46AFF0EE124E96EFF0E61
:10AEC000E220EA6EED6607D02F0EEF6404D03A0E52
:08AED000EF6001D0F32A12002B
:08AED800FF0EE3502E6E480E40
:10AEE00001D04C0EE76EE72EFED7E76AE72EFED7BD
:08AEF0002E2EF7D7000012001E
:08AEF800B00EF36E00EE00F055
:10AF00000E0E01D81200EA6002D0EE6AFCD7F350B0
:08AF1000E9601200EE6AFCD7B3
:08AF18001DEE00F02DEE00F02B
:10AF2000F86A189CB0EC55F007EC00F08CEC4EF091
:04AF3000FBD7120039
:0CAF3400FF0EE350ADBA04D0B06AAC8E42
:10AF4000AD8A949CADA2FED7AE6EF36EF46A120089
:10AF5000FF0EE350E84E1200000000D000D000D0F9
:06AF6000E82EFAD71200F2
:0AAF6600F36AF46AF32A0F0B05E00A
:0CAF7000D890F336F436E804FBE1120040
:04AF7C00303132330B
:0DAF80003435363738396162636465660028
:03AF8D00010000C0
:0CAF9000FF06FAD503010000FF00FF00DF
:04AF9C003F065B4FC2
:0CAFA000666D7D077F6F777C395E7971EC
:020000040001F9
:01FFF800AA5E
:01FFFA00FD09
/PIC Stuff/PIC_27J13/glcdfont.c
0,0 → 1,263
#ifndef FONT5X7_H
#define FONT5X7_H
 
// standard ascii 5x7 font
 
static rom unsigned char font[] = {
0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
0x18, 0x3C, 0x7E, 0x3C, 0x18,
0x1C, 0x57, 0x7D, 0x57, 0x1C,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
0x00, 0x18, 0x3C, 0x18, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
0x00, 0x18, 0x24, 0x18, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
0x30, 0x48, 0x3A, 0x06, 0x0E,
0x26, 0x29, 0x79, 0x29, 0x26,
0x40, 0x7F, 0x05, 0x05, 0x07,
0x40, 0x7F, 0x05, 0x25, 0x3F,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
0x14, 0x22, 0x7F, 0x22, 0x14,
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
0x06, 0x09, 0x7F, 0x01, 0x7F,
0x00, 0x66, 0x89, 0x95, 0x6A,
0x60, 0x60, 0x60, 0x60, 0x60,
0x94, 0xA2, 0xFF, 0xA2, 0x94,
0x08, 0x04, 0x7E, 0x04, 0x08,
0x10, 0x20, 0x7E, 0x20, 0x10,
0x08, 0x08, 0x2A, 0x1C, 0x08,
0x08, 0x1C, 0x2A, 0x08, 0x08,
0x1E, 0x10, 0x10, 0x10, 0x10,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
0x30, 0x38, 0x3E, 0x38, 0x30,
0x06, 0x0E, 0x3E, 0x0E, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14,
0x24, 0x2A, 0x7F, 0x2A, 0x12,
0x23, 0x13, 0x08, 0x64, 0x62,
0x36, 0x49, 0x56, 0x20, 0x50,
0x00, 0x08, 0x07, 0x03, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
0x08, 0x08, 0x3E, 0x08, 0x08,
0x00, 0x80, 0x70, 0x30, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x60, 0x60, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02,
0x3E, 0x51, 0x49, 0x45, 0x3E,
0x00, 0x42, 0x7F, 0x40, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46,
0x21, 0x41, 0x49, 0x4D, 0x33,
0x18, 0x14, 0x12, 0x7F, 0x10,
0x27, 0x45, 0x45, 0x45, 0x39,
0x3C, 0x4A, 0x49, 0x49, 0x31,
0x41, 0x21, 0x11, 0x09, 0x07,
0x36, 0x49, 0x49, 0x49, 0x36,
0x46, 0x49, 0x49, 0x29, 0x1E,
0x00, 0x00, 0x14, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41,
0x14, 0x14, 0x14, 0x14, 0x14,
0x00, 0x41, 0x22, 0x14, 0x08,
0x02, 0x01, 0x59, 0x09, 0x06,
0x3E, 0x41, 0x5D, 0x59, 0x4E,
0x7C, 0x12, 0x11, 0x12, 0x7C,
0x7F, 0x49, 0x49, 0x49, 0x36,
0x3E, 0x41, 0x41, 0x41, 0x22,
0x7F, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x49, 0x49, 0x49, 0x41,
0x7F, 0x09, 0x09, 0x09, 0x01,
0x3E, 0x41, 0x41, 0x51, 0x73,
0x7F, 0x08, 0x08, 0x08, 0x7F,
0x00, 0x41, 0x7F, 0x41, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01,
0x7F, 0x08, 0x14, 0x22, 0x41,
0x7F, 0x40, 0x40, 0x40, 0x40,
0x7F, 0x02, 0x1C, 0x02, 0x7F,
0x7F, 0x04, 0x08, 0x10, 0x7F,
0x3E, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x09, 0x09, 0x09, 0x06,
0x3E, 0x41, 0x51, 0x21, 0x5E,
0x7F, 0x09, 0x19, 0x29, 0x46,
0x26, 0x49, 0x49, 0x49, 0x32,
0x03, 0x01, 0x7F, 0x01, 0x03,
0x3F, 0x40, 0x40, 0x40, 0x3F,
0x1F, 0x20, 0x40, 0x20, 0x1F,
0x3F, 0x40, 0x38, 0x40, 0x3F,
0x63, 0x14, 0x08, 0x14, 0x63,
0x03, 0x04, 0x78, 0x04, 0x03,
0x61, 0x59, 0x49, 0x4D, 0x43,
0x00, 0x7F, 0x41, 0x41, 0x41,
0x02, 0x04, 0x08, 0x10, 0x20,
0x00, 0x41, 0x41, 0x41, 0x7F,
0x04, 0x02, 0x01, 0x02, 0x04,
0x40, 0x40, 0x40, 0x40, 0x40,
0x00, 0x03, 0x07, 0x08, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40,
0x7F, 0x28, 0x44, 0x44, 0x38,
0x38, 0x44, 0x44, 0x44, 0x28,
0x38, 0x44, 0x44, 0x28, 0x7F,
0x38, 0x54, 0x54, 0x54, 0x18,
0x00, 0x08, 0x7E, 0x09, 0x02,
0x18, 0xA4, 0xA4, 0x9C, 0x78,
0x7F, 0x08, 0x04, 0x04, 0x78,
0x00, 0x44, 0x7D, 0x40, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78,
0x7C, 0x08, 0x04, 0x04, 0x78,
0x38, 0x44, 0x44, 0x44, 0x38,
0xFC, 0x18, 0x24, 0x24, 0x18,
0x18, 0x24, 0x24, 0x18, 0xFC,
0x7C, 0x08, 0x04, 0x04, 0x08,
0x48, 0x54, 0x54, 0x54, 0x24,
0x04, 0x04, 0x3F, 0x44, 0x24,
0x3C, 0x40, 0x40, 0x20, 0x7C,
0x1C, 0x20, 0x40, 0x20, 0x1C,
0x3C, 0x40, 0x30, 0x40, 0x3C,
0x44, 0x28, 0x10, 0x28, 0x44,
0x4C, 0x90, 0x90, 0x90, 0x7C,
0x44, 0x64, 0x54, 0x4C, 0x44,
0x00, 0x08, 0x36, 0x41, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02,
0x3C, 0x26, 0x23, 0x26, 0x3C,
0x1E, 0xA1, 0xA1, 0x61, 0x12,
0x3A, 0x40, 0x40, 0x20, 0x7A,
0x38, 0x54, 0x54, 0x55, 0x59,
0x21, 0x55, 0x55, 0x79, 0x41,
0x21, 0x54, 0x54, 0x78, 0x41,
0x21, 0x55, 0x54, 0x78, 0x40,
0x20, 0x54, 0x55, 0x79, 0x40,
0x0C, 0x1E, 0x52, 0x72, 0x12,
0x39, 0x55, 0x55, 0x55, 0x59,
0x39, 0x54, 0x54, 0x54, 0x59,
0x39, 0x55, 0x54, 0x54, 0x58,
0x00, 0x00, 0x45, 0x7C, 0x41,
0x00, 0x02, 0x45, 0x7D, 0x42,
0x00, 0x01, 0x45, 0x7C, 0x40,
0xF0, 0x29, 0x24, 0x29, 0xF0,
0xF0, 0x28, 0x25, 0x28, 0xF0,
0x7C, 0x54, 0x55, 0x45, 0x00,
0x20, 0x54, 0x54, 0x7C, 0x54,
0x7C, 0x0A, 0x09, 0x7F, 0x49,
0x32, 0x49, 0x49, 0x49, 0x32,
0x32, 0x48, 0x48, 0x48, 0x32,
0x32, 0x4A, 0x48, 0x48, 0x30,
0x3A, 0x41, 0x41, 0x21, 0x7A,
0x3A, 0x42, 0x40, 0x20, 0x78,
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
0x39, 0x44, 0x44, 0x44, 0x39,
0x3D, 0x40, 0x40, 0x40, 0x3D,
0x3C, 0x24, 0xFF, 0x24, 0x24,
0x48, 0x7E, 0x49, 0x43, 0x66,
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
0xFF, 0x09, 0x29, 0xF6, 0x20,
0xC0, 0x88, 0x7E, 0x09, 0x03,
0x20, 0x54, 0x54, 0x79, 0x41,
0x00, 0x00, 0x44, 0x7D, 0x41,
0x30, 0x48, 0x48, 0x4A, 0x32,
0x38, 0x40, 0x40, 0x22, 0x7A,
0x00, 0x7A, 0x0A, 0x0A, 0x72,
0x7D, 0x0D, 0x19, 0x31, 0x7D,
0x26, 0x29, 0x29, 0x2F, 0x28,
0x26, 0x29, 0x29, 0x29, 0x26,
0x30, 0x48, 0x4D, 0x40, 0x20,
0x38, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x38,
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
0x2F, 0x10, 0x28, 0x34, 0xFA,
0x00, 0x00, 0x7B, 0x00, 0x00,
0x08, 0x14, 0x2A, 0x14, 0x22,
0x22, 0x14, 0x2A, 0x14, 0x08,
0xAA, 0x00, 0x55, 0x00, 0xAA,
0xAA, 0x55, 0xAA, 0x55, 0xAA,
0x00, 0x00, 0x00, 0xFF, 0x00,
0x10, 0x10, 0x10, 0xFF, 0x00,
0x14, 0x14, 0x14, 0xFF, 0x00,
0x10, 0x10, 0xFF, 0x00, 0xFF,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x14, 0x14, 0x14, 0xFC, 0x00,
0x14, 0x14, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x14, 0x14, 0xF4, 0x04, 0xFC,
0x14, 0x14, 0x17, 0x10, 0x1F,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0x1F, 0x00,
0x10, 0x10, 0x10, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x10,
0x10, 0x10, 0x10, 0x1F, 0x10,
0x10, 0x10, 0x10, 0xF0, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xFF, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x14,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x1F, 0x10, 0x17,
0x00, 0x00, 0xFC, 0x04, 0xF4,
0x14, 0x14, 0x17, 0x10, 0x17,
0x14, 0x14, 0xF4, 0x04, 0xF4,
0x00, 0x00, 0xFF, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x14, 0x14,
0x14, 0x14, 0xF7, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x17, 0x14,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0xF4, 0x14,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x00, 0x00, 0x1F, 0x10, 0x1F,
0x00, 0x00, 0x00, 0x1F, 0x14,
0x00, 0x00, 0x00, 0xFC, 0x14,
0x00, 0x00, 0xF0, 0x10, 0xF0,
0x10, 0x10, 0xFF, 0x10, 0xFF,
0x14, 0x14, 0x14, 0xFF, 0x14,
0x10, 0x10, 0x10, 0x1F, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x10,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x38, 0x44, 0x44, 0x38, 0x44,
0x7C, 0x2A, 0x2A, 0x3E, 0x14,
0x7E, 0x02, 0x02, 0x06, 0x06,
0x02, 0x7E, 0x02, 0x7E, 0x02,
0x63, 0x55, 0x49, 0x41, 0x63,
0x38, 0x44, 0x44, 0x3C, 0x04,
0x40, 0x7E, 0x20, 0x1E, 0x20,
0x06, 0x02, 0x7E, 0x02, 0x02,
0x99, 0xA5, 0xE7, 0xA5, 0x99,
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
0x4C, 0x72, 0x01, 0x72, 0x4C,
0x30, 0x4A, 0x4D, 0x4D, 0x30,
0x30, 0x48, 0x78, 0x48, 0x30,
0xBC, 0x62, 0x5A, 0x46, 0x3D,
0x3E, 0x49, 0x49, 0x49, 0x00,
0x7E, 0x01, 0x01, 0x01, 0x7E,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x44, 0x44, 0x5F, 0x44, 0x44,
0x40, 0x51, 0x4A, 0x44, 0x40,
0x40, 0x44, 0x4A, 0x51, 0x40,
0x00, 0x00, 0xFF, 0x01, 0x03,
0xE0, 0x80, 0xFF, 0x00, 0x00,
0x08, 0x08, 0x6B, 0x6B, 0x08,
0x36, 0x12, 0x36, 0x24, 0x36,
0x06, 0x0F, 0x09, 0x0F, 0x06,
0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x10, 0x10, 0x00,
0x30, 0x40, 0xFF, 0x01, 0x01,
0x00, 0x1F, 0x01, 0x01, 0x1E,
0x00, 0x19, 0x1D, 0x17, 0x12,
0x00, 0x3C, 0x3C, 0x3C, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00,
};
#endif
/PIC Stuff/PIC_27J13/i2c.c
29,7 → 29,7
}
 
// Setup the PIC to operate as a master.
void I2C_Configure_Master() {
void I2C_Configure_Master(unsigned char speed) {
i2c_data.operating_mode = I2C_MODE_MASTER;
 
TRISCbits.TRISC3 = 1;
39,7 → 39,11
SSPCON1 = 0x0;
SSPCON2 = 0x0;
SSPCON1bits.SSPM = 0x8; // I2C Master Mode
SSPADD = 0x77; // Operate at 100KHz (48MHz)
if (speed) {
SSPADD = 0x74; // Operate at 100KHz (48MHz)
} else {
SSPADD = 0x1A; // Operate at 400KHz (48MHz)
}
SSPSTATbits.SMP = 1; // Disable Slew Rate Control
SSPCON1bits.SSPEN = 1; // Enable MSSP Module
}
57,6 → 61,7
i2c_data.buffer_in_len = length;
i2c_data.master_dest_addr = address;
i2c_data.buffer_in_read_ind = 0;
i2c_data.buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data.operating_state = I2C_SEND_ADDR;
75,6 → 80,7
i2c_data.buffer_in_len = length;
i2c_data.master_dest_addr = address;
i2c_data.buffer_in_read_ind = 0;
i2c_data.buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data.operating_state = I2C_SEND_ADDR;
98,6 → 104,7
i2c_data.buffer_in_len = length;
i2c_data.master_dest_addr = address;
i2c_data.buffer_in_read_ind = 0;
i2c_data.buffer_in_write_ind = 0;
 
// Change status to 'next' operation
i2c_data.operating_state = I2C_SEND_ADDR;
196,9 → 203,10
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
i2c_data.buffer_in[i2c_data.buffer_in_read_ind] = SSPBUF;
i2c_data.buffer_in_read_ind++;
if (i2c_data.buffer_in_read_ind < i2c_data.buffer_in_len) {
// TODO: handle i2c buffer overflow
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = SSPBUF;
i2c_data.buffer_in_write_ind++;
if (i2c_data.buffer_in_write_ind < i2c_data.buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_data.operating_state = I2C_REQ_DATA;
SSPCON2bits.ACKDT = 0; // ACK
279,9 → 287,10
break;
case I2C_RCV_DATA:
// On receive, save byte into buffer
i2c_data.buffer_in[i2c_data.buffer_in_read_ind] = SSPBUF;
i2c_data.buffer_in_read_ind++;
if (i2c_data.buffer_in_read_ind < i2c_data.buffer_in_len) {
// TODO: handle i2c buffer overflow
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = SSPBUF;
i2c_data.buffer_in_write_ind++;
if (i2c_data.buffer_in_write_ind < i2c_data.buffer_in_len) {
// If we still need to read, send an ACK to the slave
i2c_data.operating_state = I2C_REQ_DATA;
SSPCON2bits.ACKDT = 0; // ACK
317,7 → 326,7
 
// Clear SSPOV (overflow bit)
if (SSPCON1bits.SSPOV == 1) {
// DBG_PRINT_I2C("I2C: overflow detected\r\n");
DBG_PRINT_I2C("I2C: overflow detected\r\n");
SSPCON1bits.SSPOV = 0;
// We failed to read the buffer in time, so we know we
// can't properly receive this message, just put us in the
330,7 → 339,7
// Read SPPxBUF if it is full
if (SSPSTATbits.BF == 1) {
received_data = SSPBUF;
// DBG_PRINT_I2C("I2C: data read from buffer: %x\r\n", SSPBUF);
DBG_PRINT_I2C("I2C: data read from buffer: %x\r\n", SSPBUF);
data_read_from_buffer = 1;
}
 
344,7 → 353,7
i2c_data.operating_state = I2C_STARTED;
// if (data_read_from_buffer) {
// if (SSPSTATbits.D_A == 1) {
//// DBG_PRINT_I2C("I2C Start: (ERROR) no address recieved\r\n");
// DBG_PRINT_I2C("I2C Start: (ERROR) no address recieved\r\n");
// // This is bad because we got data and we wanted an address
// i2c_data.operating_state = I2C_IDLE;
// i2c_data.return_status = I2C_ERR_NOADDR;
381,7 → 390,7
goto send;
}
} else {
// DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_data.operating_state = I2C_IDLE;
i2c_data.return_status = I2C_ERR_NODATA;
}
426,6 → 435,7
if (data_read_from_buffer) {
if (SSPSTATbits.D_A == 1) {
// Data received with stop bit
// TODO: handle i2c buffer overflow
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = received_data;
if (i2c_data.buffer_in_write_ind == MAXI2CBUF-1) {
i2c_data.buffer_in_write_ind = 0;
437,7 → 447,7
i2c_data.slave_in_last_byte = received_data;
i2c_data.return_status = I2C_DATA_AVAL;
} else {
// DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_data.operating_state = I2C_IDLE;
i2c_data.return_status = I2C_ERR_NODATA;
}
466,7 → 476,7
goto send;
} else {
// Bad to recv an address again, we aren't ready
// DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n");
i2c_data.operating_state = I2C_IDLE;
i2c_data.return_status = I2C_ERR_NODATA;
}
503,6 → 513,10
}
}
 
unsigned char I2C_Buffer_Len() {
return i2c_data.buffer_in_len;
}
 
/* Returns 0 if I2C module is currently busy, otherwise returns buffer length */
unsigned char I2C_Read_Buffer(char *buffer) {
unsigned char i = 0;
/PIC Stuff/PIC_27J13/i2c.h
3,6 → 3,10
 
#define MAXI2CBUF 64
 
// I2C Operating Speed
#define I2C_400KHZ 0x0
#define I2C_100KHZ 0x1
 
// Operating State
#define I2C_IDLE 0x1
#define I2C_STARTED 0x2
65,11 → 69,12
void I2C_Interrupt_Slave(void);
void I2C_Interrupt_Master(void);
void I2C_Configure_Slave(unsigned char);
void I2C_Configure_Master(void);
void I2C_Configure_Master(unsigned char speed);
void I2C_Master_Send(unsigned char address, unsigned char length,unsigned char *msg);
void I2C_Master_Recv(unsigned char address, unsigned char length);
void I2C_Master_Restart(unsigned char address, unsigned char msg, unsigned char length);
unsigned char I2C_Get_Status(void);
unsigned char I2C_Buffer_Len(void);
unsigned char I2C_Read_Buffer(char *buffer);
unsigned char I2C_Process_Send(unsigned char);
 
/PIC Stuff/PIC_27J13/interrupts.c
1,6 → 1,7
#include "maindefs.h"
#include "uart.h"
#include "i2c.h"
#include "spi.h"
#include "interrupts.h"
 
//----------------------------------------------------------------------------
18,8 → 19,9
// High priority interrupts
IPR1bits.RC1IP = 1; // USART1 RX interrupt
IPR1bits.TX1IP = 1; // USART1 TX interrupt
// IPR3bits.RC2IP = 1; // USART2 RX interrupt
IPR1bits.SSPIP = 1; // I2C interrupt
// IPR3bits.RC2IP = 1; // USART2 RX interrupt
IPR1bits.SSPIP = 1; // I2C interrupt
IPR3bits.SSP2IP = 1; // MSSP2 (SPI2) interrupt
 
// Low priority interrupts
101,6 → 103,28
// We need to check the interrupt flag of each enabled high-priority interrupt to
// see which device generated this interrupt. Then we can call the correct handler.
 
// Check to see if we have an SPI2 interrupt
if (PIR3bits.SSP2IF) {
// Call the handler
SPI2_Recv_Interrupt_Handler();
 
// Clear the interrupt flag
PIR3bits.SSP2IF = 0;
 
return;
}
 
// Check to see if we have an I2C interrupt
if (PIR1bits.SSPIF) {
// Call the handler
I2C_Interrupt_Handler();
 
// Clear the interrupt flag
PIR1bits.SSPIF = 0;
 
return;
}
// Check to see if we have an interrupt on USART1 RX
if (PIR1bits.RC1IF) {
// Call the interrupt handler
112,6 → 136,7
return;
}
 
#ifndef _DEBUG // Disable UART1 TX interrupt for debug mode (using printf)
// Check to see if we have an interrupt on USART1 TX
if (PIR1bits.TX1IF) {
// Call the interrupt handler
122,6 → 147,7
 
return;
}
#endif
// // Check to see if we have an interrupt on USART2 RX
// if (PIR3bits.RC2IF) {
132,17 → 158,6
// // Clear the interrupt flag
// PIR3bits.RC2IF = 0;
// }
// Check to see if we have an I2C interrupt
if (PIR1bits.SSPIF) {
// Call the handler
I2C_Interrupt_Handler();
 
// Clear the interrupt flag
PIR1bits.SSPIF = 0;
 
return;
}
}
 
//----------------------------------------------------------------------------
/PIC Stuff/PIC_27J13/led_backpack.c
0,0 → 1,135
#include "led_backpack.h"
#include "i2c.h"
 
static const char numbertable[] = {
0x3F /* 0 */,
0x06 /* 1 */,
0x5B /* 2 */,
0x4F /* 3 */,
0x66 /* 4 */,
0x6D /* 5 */,
0x7D, /* 6 */
0x07, /* 7 */
0x7F, /* 8 */
0x6F, /* 9 */
};
 
static const char alphatable[] = {
0x77, /* a */
0x7C, /* b */
0x39, /* C */
0x5E, /* d */
0x79, /* E */
0x71, /* F */
};
 
static LED_DATA led_data;
 
void LED_Init() {
led_data.i2c_address = 0x70;
}
 
void LED_Start() {
unsigned char result;
unsigned char c = 0x21; // Cmd to turn on oscillator
I2C_Master_Send(led_data.i2c_address, 1, &c);
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
 
LED_blinkRate(HT16K33_BLINK_OFF);
LED_setBrightness(15); // Max brightness
LED_clear();
}
 
void LED_setBrightness(unsigned char c) {
unsigned char result;
if (c > 15) c = 15;
c |= 0xE0;
 
I2C_Master_Send(led_data.i2c_address, 1, &c);
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
}
 
void LED_blinkRate(unsigned char c) {
unsigned char buffer;
 
if (c > 3) c = 0;
 
buffer = HT16K33_BLINK_CMD | HT16K33_BLINK_DISPLAYON | (c << 1);
 
I2C_Master_Send(led_data.i2c_address, 1, &buffer);
buffer = I2C_Get_Status();
while (!buffer) {
buffer = I2C_Get_Status();
}
}
 
void LED_writeDisplay() {
unsigned char result;
led_data.display_buffer[0] = 0x00; // Start at address 0x00
I2C_Master_Send(led_data.i2c_address, 17, led_data.display_buffer);
 
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
}
 
void LED_clear() {
unsigned char c;
for (c = 0; c < 17; c++) {
led_data.display_buffer[c] = 0;
}
}
 
void LED_drawColon(unsigned char c) {
if (c) {
led_data.display_buffer[5] = 0xFF;
} else {
led_data.display_buffer[5] = 0;
}
}
 
void LED_writeDigitRaw(unsigned char loc, unsigned char bitmask) {
if (loc > 4) return;
led_data.display_buffer[(loc<<1)+1] = bitmask;
}
 
void LED_writeDigitNum(unsigned char loc, unsigned char num, unsigned char dot) {
if (loc > 4) return;
if (loc > 1) loc++;
LED_writeDigitRaw(loc, numbertable[num] | dot << 7);
}
 
void LED_writeDigitAlpha(unsigned char loc, unsigned char alpha, unsigned char dot) {
if (loc > 4) return;
if (loc > 1) loc++;
LED_writeDigitRaw(loc, alphatable[alpha] | dot << 7);
}
 
void LED_writeNum(unsigned int i) {
LED_writeDigitNum(0, (i%10000)/1000, 0);
LED_writeDigitNum(1, (i%1000)/100, 0);
LED_writeDigitNum(2, (i%100)/10, 0);
LED_writeDigitNum(3, i%10, 0);
 
if (i < 10) {
LED_writeDigitRaw(0, 0);
LED_writeDigitRaw(1, 0);
LED_writeDigitRaw(3, 0);
} else if (i < 100) {
LED_writeDigitRaw(0, 0);
LED_writeDigitRaw(1, 0);
} else if (i < 1000) {
LED_writeDigitRaw(0, 0);
}
LED_writeDisplay();
}
/PIC Stuff/PIC_27J13/led_backpack.h
0,0 → 1,32
#ifndef LED_BACKPACK_H
#define LED_BACKPACK_H
 
#define HT16K33_BLINK_CMD 0x80
#define HT16K33_BLINK_DISPLAYON 0x01
#define HT16K33_BLINK_OFF 0
#define HT16K33_BLINK_2HZ 1
#define HT16K33_BLINK_1HZ 2
#define HT16K33_BLINK_HALFHZ 3
 
#define HT16K33_CMD_BRIGHTNESS 0x0E
 
typedef struct {
unsigned char i2c_address;
unsigned char display_buffer[17];
} LED_DATA;
 
void LED_Init(void);
void LED_Start(void);
void LED_setBrightness(unsigned char c);
void LED_blinkRate(unsigned char c);
void LED_writeDisplay(void);
void LED_clear(void);
void LED_drawColon(unsigned char c);
void LED_writeDigitRaw(unsigned char loc, unsigned char bitmask);
void LED_writeDigitNum(unsigned char loc, unsigned char num, unsigned char dot);
void LED_writeDigitAlpha(unsigned char loc, unsigned char alpha, unsigned char dot);
void LED_writeNum(unsigned int i);
 
 
#endif /* LED_BACKPACK_H */
 
/PIC Stuff/PIC_27J13/main.c
1,16 → 1,16
#include "maindefs.h"
#include "Adafruit_GFX.h"
#include "interrupts.h"
#include "uart.h"
#include "i2c.h"
//#include "adc.h"
//#include "timers.h"
//#include "xbee.h"
//#include "led_driver.h"
//#include "pwm.h"
//#include "delays.h"
//#include "pin_interrupts.h"
#include "spi.h"
#include "nfc.h"
#include "led_backpack.h"
#include "oled_ssd1306.h"
#include "oled_ssd1331.h"
#include <usart.h>
#include <delays.h>
#include <string.h>
 
#pragma config WDTEN = OFF // Turn off watchdog timer
#pragma config XINST = OFF // Turn off extended instruction set
32,38 → 32,72
* RA6 - Oscillator
* RA7 - Oscillator
*
* RC0 -
* RC1 -
* RC2 -
* RC3 -
* RC4 -
* RC5 -
* RC6 - UART Debug Output
* RC7 - UART Debug Input
* RB0 - UART2 Tx
* RB1 - UART2 Rx
* RB2 - SPI2 MOSI
* RB3 - SPI2 MISO
* RB4 - SPI2 CLK
* RB5 - SPI2 D/C
* RB6 - SPI2 RESET
* RB7 - SPI2 CS
*
* RB0 -
* RB1 -
* RB2 -
* RB3 -
* RB4 -
* RB5 -
* RB6 -
* RB7 -
* RC0 -
* RC1 - IRQ
* RC2 - Reset
* RC3 - I2C CLK
* RC4 - I2C DATA
* RC5 -
* RC6 - UART1 Tx
* RC7 - UART1 Rx
* ---------------------------- */
 
//static I2C_DATA i2c_data;
//static XBEE_DATA xbee_data;
#ifdef _TEST_UART
 
void main(void) {
unsigned char length = 0;
unsigned char buffer[100];
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
while (1) {
 
length = UART1_Read((char *) buffer);
if (length != 0) {
UART1_WriteB((char *) buffer, length);
}
 
Delay10KTCYx(255);
Delay10KTCYx(255);
}
}
#endif
 
#ifdef _TEST_I2C_MASTER
 
void main(void) {
unsigned char i = 0;
unsigned char length = 0;
unsigned char result = 0;
unsigned char test[8] = "ASDF123";
unsigned char buffer[100];
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
73,69 → 107,87
 
UART1_Init(); // Initialize the UART handler code
I2C_Init(); // Initialize the I2C handler code
// xbee_init(&xbee_data); // Initialize the XBee handler code
// adc_init(); // Initialize the ADC
// timers_init(); // Initialize timers
// port_b_int_init(); // Initialze Port B interrupt handler
// pwm_init(); // Initialize the PWM output driver
 
I2C_Configure_Master();
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
// Loop and process recieved messages from interrupts;
 
// I2C_Configure_Master();
while (1) {
 
buffer[0] = 0xBB;
 
I2C_Master_Send(0x30, 1, buffer);
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
DBG_PRINT_MAIN("S:%X ", result);
 
I2C_Master_Recv(0x30, 2);
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
DBG_PRINT_MAIN("S:%X ", result);
length = I2C_Read_Buffer(buffer);
DBG_PRINT_MAIN("L:%d D:", length);
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%c ", buffer[i]);
}
 
I2C_Master_Restart(0x30, 0xBB, 2);
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
DBG_PRINT_MAIN("S:%X ", result);
length = I2C_Read_Buffer(buffer);
DBG_PRINT_MAIN("L:%d D:", length);
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%c ", buffer[i]);
}
 
DBG_PRINT_MAIN("\r\n");
 
Delay10KTCYx(255);
Delay10KTCYx(255);
}
}
#endif
 
#ifdef _TEST_I2C_SLAVE
 
void main(void) {
unsigned char i = 0;
unsigned char length = 0;
unsigned char result = 0;
unsigned char buffer[100];
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
I2C_Init(); // Initialize the I2C handler code
 
I2C_Configure_Slave(0x30);
 
TRISCbits.TRISC0 = 0;
TRISCbits.TRISC1 = 0;
TRISCbits.TRISC2 = 0;
LATCbits.LATC0 = 0;
LATCbits.LATC1 = 0;
LATCbits.LATC2 = 0;
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
while (1) {
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
/* UART Test */
// length = UART1_Read((char *)buffer);
// if (length != 0) {
// UART1_WriteB((char *)buffer, length) ;
// }
/* UART Test*/
 
/* I2C Master Test */
// buffer[0] = 0xBB;
// I2C_Master_Send(0x30, 1, buffer);
//
// result = I2C_Get_Status();
// while (!result) {
// result = I2C_Get_Status();
// }
// DBG_PRINT_MAIN("%x ", result);
//
// I2C_Master_Recv(0x30, 2);
//
// result = I2C_Get_Status();
// while (!result) {
// result = I2C_Get_Status();
// }
// DBG_PRINT_MAIN("%x ", result);
//
// I2C_Master_Restart(0x30, 0xBB, 2);
//
// result = I2C_Get_Status();
// while (!result) {
// result = I2C_Get_Status();
// }
// DBG_PRINT_MAIN("%x\r\n", result);
/* I2C Master Test */
 
/* I2C Slave Receive Test */
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
147,6 → 199,480
DBG_PRINT_MAIN("%X ", buffer[i]);
}
DBG_PRINT_MAIN("\r\n");
/* I2C Slave Receive Test */
 
Delay10KTCYx(255);
Delay10KTCYx(255);
}
}
}
#endif
 
#ifdef _TEST_NFC
 
void main(void) {
unsigned char i = 0;
unsigned char length = 0;
unsigned char result = 0;
NFC_FIRMWARE_VERSION version;
unsigned char buffer[50];
 
// NFC stuff
unsigned char uid[7];
unsigned char uidLen;
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
I2C_Init(); // Initialize the I2C handler code
NFC_Init(); // Initialize the NFC chip (uses I2C)
 
I2C_Configure_Master(I2C_400KHZ);
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
version = NFC_getFirmwareVersion();
while (!version.IC) {
DBG_PRINT_MAIN("Waiting for NFC board..\r\n");
Delay10KTCYx(3);
version = NFC_getFirmwareVersion();
}
DBG_PRINT_MAIN("Found chip PN5%X\r\n", version.IC);
DBG_PRINT_MAIN("Firmware ver. %d.%d\r\n", version.Ver, version.Rev);
NFC_SAMConfig();
 
while (1) {
 
// This call will hang until the NFC chip replies (card detected)
if (NFC_readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLen)) {
DBG_PRINT_MAIN("Card Found!\r\n");
DBG_PRINT_MAIN("UID Length: %d bytes\r\n", uidLen);
DBG_PRINT_MAIN("UID: ");
for (i = 0; i < uidLen; i++) {
DBG_PRINT_MAIN("%02X ", uid[i]);
}
DBG_PRINT_MAIN("\r\n");
}
 
// Delay10KTCYx(255);
// Delay10KTCYx(255);
}
}
#endif
 
#ifdef _TEST_LED_BACKPACK
 
void main(void) {
unsigned char i = 0;
unsigned char length = 0;
unsigned char buffer[100];
unsigned int counter = 0;
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
I2C_Init(); // Initialize the I2C handler code
LED_Init(); // Initialize the LED backpack (uses I2C);
 
I2C_Configure_Master(I2C_400KHZ);
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
LED_Start();
LED_writeDigitNum(0, 1, 1);
LED_writeDigitNum(1, 2, 0);
LED_writeDigitNum(2, 3, 0);
LED_writeDigitNum(3, 4, 0);
LED_writeDisplay();
for (i = 0; i < 15; i++) {
LED_setBrightness(15 - i);
Delay10KTCYx(100);
}
for (i = 0; i < 15; i++) {
LED_setBrightness(i);
Delay10KTCYx(100);
}
LED_blinkRate(HT16K33_BLINK_OFF);
 
while (1) {
LED_writeNum(counter);
counter++;
if (counter > 9999)
counter = 0;
 
// Delay10KTCYx(255);
}
}
#endif
 
#ifdef _TEST_SPI
 
void main(void) {
unsigned char i = 0;
unsigned char length = 0;
unsigned char result = 0;
unsigned char buffer[100];
unsigned char test[8] = "ASDF123";
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
while (1) {
 
SPI2_Write(test, 7);
while (result != 7) {
length = SPI2_Buffer_Read(buffer);
if (length) {
result += length;
}
}
result = 0;
 
for (i = 0; i < result; i++) {
DBG_PRINT_MAIN("%X ", buffer[i]);
}
DBG_PRINT_MAIN("\r\n");
 
Delay10KTCYx(255);
Delay10KTCYx(255);
}
}
#endif
 
#ifdef _TEST_SSD1306_OLED
 
void main(void) {
unsigned int i = 0;
unsigned long l = 0;
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module
SSD1306_Init(); // Initialize the OLED code
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
SSD1306_Begin(SSD1306_SWITCHCAPVCC);
 
SSD1306_Display(); // Show splashscreen
 
while (1) {
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// for (i = 0; i < 32; i++) {
// SSD1306_Draw_Pixel(i, i, WHITE);
// }
// SSD1306_Display();
 
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_DrawLine();
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_DrawRect();
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_FillRect();
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_DrawCircle();
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// GFX_fillCircle(GFX_width() / 2, GFX_height() / 2, 10, WHITE);
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_DrawRoundRect();
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_FillRoundRect();
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_DrawTriangle();
// SSD1306_Display();
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_FillTriangle();
// SSD1306_Display();
 
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// SSD1306_Test_DrawChar();
// SSD1306_Display();
 
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// SSD1306_Clear_Display();
// GFX_setTextSize(1);
// GFX_setTextColor(WHITE);
// GFX_setCursor(0,0);
// GFX_writeString("Hello World!\n");
//// GFX_setTextColorBG(BLACK, WHITE);
// i = 65535;
// GFX_writeString("%u %d\n", i, i);
//// GFX_setTextSize(2);
//// GFX_setTextColor(WHITE);
// l = 0xDEADBEEF;
// GFX_writeString("0x%X", (long)l);
// SSD1306_Display();
 
SSD1306_Clear_Display();
GFX_setRotation(0);
GFX_setTextSize(1);
GFX_setTextColor(SSD1306_WHITE);
GFX_setCursor(0, 0);
GFX_writeString("%u", i);
i++;
SSD1306_Display();
 
}
}
#endif
 
#ifdef _TEST_SSD1331_OLED
 
void main(void) {
unsigned int i = 0;
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module
SSD1331_Init(); // Initialize the OLED code
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
SSD1331_Begin();
 
while (1) {
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(0);
SSD1331_Test_Pattern();
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_clearScreen();
GFX_setRotation(0);
GFX_setCursor(0, 0);
GFX_writeString("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa");
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_clearScreen();
GFX_setRotation(3);
GFX_setCursor(0, 0);
GFX_writeString("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa");
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(0);
SSD1331_Test_DrawLines(SSD1331_YELLOW);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(3);
SSD1331_Test_DrawLines(SSD1331_BLUE);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(0);
SSD1331_Test_DrawRect(SSD1331_GREEN);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(1);
SSD1331_Test_DrawRect(SSD1331_RED);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(2);
SSD1331_Test_DrawRect(SSD1331_BLUE);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(3);
SSD1331_Test_DrawRect(SSD1331_YELLOW);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(0);
SSD1331_Test_FillRect(SSD1331_YELLOW, SSD1331_MAGENTA);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(3);
SSD1331_Test_FillRect(SSD1331_BLUE, SSD1331_GREEN);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(0);
GFX_clearScreen();
SSD1331_Test_FillCircle(10, SSD1331_BLUE);
SSD1331_Test_DrawCircle(10, SSD1331_WHITE);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(3);
GFX_clearScreen();
SSD1331_Test_FillCircle(10, SSD1331_MAGENTA);
SSD1331_Test_DrawCircle(10, SSD1331_YELLOW);
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(0);
SSD1331_Test_DrawTria();
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(3);
SSD1331_Test_DrawTria();
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(0);
SSD1331_Test_DrawRoundRect();
 
Delay10KTCYx(255);
Delay10KTCYx(255);
GFX_setRotation(3);
SSD1331_Test_DrawRoundRect();
 
// GFX_clearScreen();
// GFX_setRotation(3);
// GFX_setCursor(0,0);
// GFX_setTextColorBG(SSD1331_WHITE, SSD1331_BLACK);
// GFX_writeString("%u", i);
// i++;
}
}
#endif
 
#if !defined(_TEST_UART) && !defined(_TEST_I2C_MASTER) && \
!defined(_TEST_I2C_SLAVE) && !defined(_TEST_SPI) && \
!defined(_TEST_NFC) && !defined(_TEST_LED_BACKPACK) && \
!defined(_TEST_SSD1306_OLED) && !defined(_TEST_SSD1331_OLED)
 
void main(void) {
unsigned char i = 0;
unsigned char length = 0;
unsigned char result = 0;
unsigned char buffer[100];
 
/* --------------------- Oscillator Configuration --------------------- */
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
ANCON0 = 0xFF;
ANCON1 = 0x1F;
 
UART1_Init(); // Initialize the UART handler code
I2C_Init(); // Initialize the I2C handler code
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module
SSD1331_Init(); // Initialize the SSD1331 OLED display (uses SPI2)
// NFC_Init(); // Initialize the NFC chip (uses I2C)
// LED_Init(); // Initialize the LED backpack (uses I2C);
 
I2C_Configure_Master(I2C_400KHZ);
SSD1331_Begin();
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
DBG_PRINT_MAIN("\r\nBegin Program\r\n");
 
while (1) {
 
 
Delay10KTCYx(255);
Delay10KTCYx(255);
}
}
#endif
/PIC Stuff/PIC_27J13/maindefs.h
6,12 → 6,25
#include "uart.h"
 
#define _DEBUG
//#define _TEST_UART
//#define _TEST_I2C_MASTER
//#define _TEST_I2C_SLAVE
//#define _TEST_SPI
//#define _TEST_NFC
//#define _TEST_LED_BACKPACK
//#define _TEST_SSD1306_OLED
#define _TEST_SSD1331_OLED
 
// Option to choose between active OLED displays
//#define GFX_SSD1306
#define GFX_SSD1331
 
// Enable or disable debug prints depending on project preprocessor (_DEBUG)
#ifdef _DEBUG
#define DBG_PRINT_MAIN(x) UART1_WriteS(x)
#define DBG_PRINT_UART(x) UART1_WriteS(x)
#define DBG_PRINT_I2C(x)
#define DBG_PRINT_MAIN(x) printf(x)
#define DBG_PRINT_UART(x) printf(x)
#define DBG_PRINT_I2C(x) printf(x)
#define DBG_PRINT_SPI(x) printf(x)
#define DBG_PRINT_XBEE(x)
#define DBG_PRINT_PORTB_INT(x)
#define DBG_PRINT_INT(x)
20,6 → 33,7
#define DBG_PRINT_MAIN(x)
#define DBG_PRINT_UART(x)
#define DBG_PRINT_I2C(x)
#define DBG_PRINT_SPI(x)
#define DBG_PRINT_XBEE(x)
#define DBG_PRINT_PORTB_INT(x)
#define DBG_PRINT_INT(x)
26,61 → 40,5
#define DBG_PRINT_BUFFER(x)
#endif
 
// Message type definitions
#define MSGTYPE_RESEND 1
 
#define MSGTYPE_TIMER0 10
#define MSGTYPE_TIMER1 11
#define MSGTYPE_TIMER2 12
#define MSGTYPE_TIMER3 13
#define MSGTYPE_TIMER4 14
#define MSGTYPE_TIMER5 15
#define MSGTYPE_TIMER6 16
#define MSGTYPE_TIMER8 17
#define MSGTYPE_MAIN1 20
#define MSGTYPE_OVERRUN 30
#define MSGTYPE_UART_DATA 31
#define MSGTYPE_I2C_DBG 40
#define MSGTYPE_I2C_DATA 41
#define MSGTYPE_I2C_REPLY 42
//#define MSGTYPE_I2C_RQST 43
 
// Unused (Used for I2C Master Mode)
#define MSGTYPE_I2C_MASTER_SEND_COMPLETE 43
#define MSGTYPE_I2C_MASTER_SEND_FAILED 44
#define MSGTYPE_I2C_MASTER_RECV_COMPLETE 45
#define MSGTYPE_I2C_MASTER_RECV_FAILED 46
 
#define MSGTYPE_ADC_NEWVALUE 50
 
#define MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE 60
#define MSGTYPE_XBEE_RX_DATA_PACKET 61
#define MSGTYPE_XBEE_RX_DATA_TX_STATUS 62
#define MSGTYPE_XBEE_RX_IO_DATA_SAMPLE 63
#define MSGTYPE_XBEE_RX_EXPLICIT_COMMAND 64
#define MSGTYPE_XBEE_RX_REMOTE_AT_COMMAND_RESPONSE 65
#define MSGTYPE_XBEE_RX_ROUTE_RECORD 66
#define MSGTYPE_XBEE_RX_NODE_IDENTIFICATION 67
#define MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS 68
 
#define MSGTYPE_PORTB_4_DOWN 70
#define MSGTYPE_PORTB_4_UP 71
#define MSGTYPE_PORTB_5_DOWN 72
#define MSGTYPE_PORTB_5_UP 73
#define MSGTYPE_PORTB_6_DOWN 74
#define MSGTYPE_PORTB_6_UP 75
#define MSGTYPE_PORTB_7_DOWN 76
#define MSGTYPE_PORTB_7_UP 77
 
#define MSGTYPE_INT1 80
 
enum I2C_STATE {
I2C_STATE_IDLE,
I2C_WAIT_WRITE_LENGTH_ACK,
I2C_WAIT_WRITE_DATA_ACK,
I2C_WAIT_REPLY_LENGTH,
I2C_WAIT_REPLY_DATA
};
 
#endif
 
/PIC Stuff/PIC_27J13/nbproject/Makefile-default.mk
41,11 → 41,11
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE}
 
# Object Files Quoted if spaced
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/interrupts.o ${OBJECTDIR}/main.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/i2c.o
POSSIBLE_DEPFILES=${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/main.o.d ${OBJECTDIR}/uart.o.d ${OBJECTDIR}/i2c.o.d
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_backpack.o ${OBJECTDIR}/nfc.o ${OBJECTDIR}/spi.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/oled_ssd1306.o ${OBJECTDIR}/glcdfont.o ${OBJECTDIR}/Adafruit_GFX.o ${OBJECTDIR}/oled_ssd1331.o
POSSIBLE_DEPFILES=${OBJECTDIR}/main.o.d ${OBJECTDIR}/i2c.o.d ${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/led_backpack.o.d ${OBJECTDIR}/nfc.o.d ${OBJECTDIR}/spi.o.d ${OBJECTDIR}/uart.o.d ${OBJECTDIR}/oled_ssd1306.o.d ${OBJECTDIR}/glcdfont.o.d ${OBJECTDIR}/Adafruit_GFX.o.d ${OBJECTDIR}/oled_ssd1331.o.d
 
# Object Files
OBJECTFILES=${OBJECTDIR}/interrupts.o ${OBJECTDIR}/main.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/i2c.o
OBJECTFILES=${OBJECTDIR}/main.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_backpack.o ${OBJECTDIR}/nfc.o ${OBJECTDIR}/spi.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/oled_ssd1306.o ${OBJECTDIR}/glcdfont.o ${OBJECTDIR}/Adafruit_GFX.o ${OBJECTDIR}/oled_ssd1331.o
 
 
CFLAGS=
76,6 → 76,18
# ------------------------------------------------------------------------------------
# Rules for buildStep: compile
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c
@${DEP_GEN} -d ${OBJECTDIR}/main.o
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/i2c.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o
${OBJECTDIR}/interrupts.o: interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/interrupts.o.d
82,12 → 94,24
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.o
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk
${OBJECTDIR}/led_backpack.o: led_backpack.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c
@${DEP_GEN} -d ${OBJECTDIR}/main.o
@${RM} ${OBJECTDIR}/led_backpack.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/led_backpack.o led_backpack.c
@${DEP_GEN} -d ${OBJECTDIR}/led_backpack.o
${OBJECTDIR}/nfc.o: nfc.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/nfc.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/nfc.o nfc.c
@${DEP_GEN} -d ${OBJECTDIR}/nfc.o
${OBJECTDIR}/spi.o: spi.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/spi.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/spi.o spi.c
@${DEP_GEN} -d ${OBJECTDIR}/spi.o
${OBJECTDIR}/uart.o: uart.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/uart.o.d
94,13 → 118,43
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c
@${DEP_GEN} -d ${OBJECTDIR}/uart.o
${OBJECTDIR}/oled_ssd1306.o: oled_ssd1306.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/oled_ssd1306.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1306.o oled_ssd1306.c
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1306.o
${OBJECTDIR}/glcdfont.o: glcdfont.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/glcdfont.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/glcdfont.o glcdfont.c
@${DEP_GEN} -d ${OBJECTDIR}/glcdfont.o
${OBJECTDIR}/Adafruit_GFX.o: Adafruit_GFX.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/Adafruit_GFX.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/Adafruit_GFX.o Adafruit_GFX.c
@${DEP_GEN} -d ${OBJECTDIR}/Adafruit_GFX.o
${OBJECTDIR}/oled_ssd1331.o: oled_ssd1331.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/oled_ssd1331.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1331.o oled_ssd1331.c
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1331.o
else
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c
@${DEP_GEN} -d ${OBJECTDIR}/main.o
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/i2c.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o
else
${OBJECTDIR}/interrupts.o: interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/interrupts.o.d
107,12 → 161,24
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.o
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk
${OBJECTDIR}/led_backpack.o: led_backpack.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/main.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c
@${DEP_GEN} -d ${OBJECTDIR}/main.o
@${RM} ${OBJECTDIR}/led_backpack.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/led_backpack.o led_backpack.c
@${DEP_GEN} -d ${OBJECTDIR}/led_backpack.o
${OBJECTDIR}/nfc.o: nfc.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/nfc.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/nfc.o nfc.c
@${DEP_GEN} -d ${OBJECTDIR}/nfc.o
${OBJECTDIR}/spi.o: spi.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/spi.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/spi.o spi.c
@${DEP_GEN} -d ${OBJECTDIR}/spi.o
${OBJECTDIR}/uart.o: uart.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/uart.o.d
119,12 → 185,30
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c
@${DEP_GEN} -d ${OBJECTDIR}/uart.o
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk
${OBJECTDIR}/oled_ssd1306.o: oled_ssd1306.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/i2c.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o
@${RM} ${OBJECTDIR}/oled_ssd1306.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1306.o oled_ssd1306.c
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1306.o
${OBJECTDIR}/glcdfont.o: glcdfont.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/glcdfont.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/glcdfont.o glcdfont.c
@${DEP_GEN} -d ${OBJECTDIR}/glcdfont.o
${OBJECTDIR}/Adafruit_GFX.o: Adafruit_GFX.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/Adafruit_GFX.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/Adafruit_GFX.o Adafruit_GFX.c
@${DEP_GEN} -d ${OBJECTDIR}/Adafruit_GFX.o
${OBJECTDIR}/oled_ssd1331.o: oled_ssd1331.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/oled_ssd1331.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1331.o oled_ssd1331.c
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1331.o
endif
 
# ------------------------------------------------------------------------------------
132,11 → 216,11
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_LD} $(MP_EXTRA_LD_PRE) -p$(MP_PROCESSOR_OPTION_LD) -w -x -u_DEBUG -z__MPLAB_BUILD=1 -u_CRUNTIME -z__MPLAB_DEBUG=1 -z__MPLAB_DEBUGGER_PK3=1 $(MP_LINKER_DEBUG_OPTION) -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
${MP_LD} $(MP_EXTRA_LD_PRE) "18f27j13.lkr" -p$(MP_PROCESSOR_OPTION_LD) -w -x -u_DEBUG -z__MPLAB_BUILD=1 -u_CRUNTIME -z__MPLAB_DEBUG=1 -z__MPLAB_DEBUGGER_PK3=1 $(MP_LINKER_DEBUG_OPTION) -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
else
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_LD} $(MP_EXTRA_LD_PRE) -p$(MP_PROCESSOR_OPTION_LD) -w -z__MPLAB_BUILD=1 -u_CRUNTIME -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
${MP_LD} $(MP_EXTRA_LD_PRE) "18f27j13.lkr" -p$(MP_PROCESSOR_OPTION_LD) -w -z__MPLAB_BUILD=1 -u_CRUNTIME -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}
endif
 
 
/PIC Stuff/PIC_27J13/nbproject/Makefile-genesis.properties
1,5 → 1,5
#
#Thu Jun 28 14:34:26 EDT 2012
#Wed Jul 11 23:10:42 EDT 2012
default.com-microchip-mplab-nbide-toolchainC18-C18LanguageToolchain.md5=fd3c294f650afc344cfb0579847b1618
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\mplabc18\\v3.40\\bin
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=39edbdd4b2849b7912992109f4b86781
/PIC Stuff/PIC_27J13/nbproject/configurations.xml
4,10 → 4,16
<logicalFolder name="HeaderFiles"
displayName="Header Files"
projectFiles="true">
<itemPath>i2c.h</itemPath>
<itemPath>interrupts.h</itemPath>
<itemPath>led_backpack.h</itemPath>
<itemPath>maindefs.h</itemPath>
<itemPath>nfc.h</itemPath>
<itemPath>spi.h</itemPath>
<itemPath>uart.h</itemPath>
<itemPath>i2c.h</itemPath>
<itemPath>oled_ssd1306.h</itemPath>
<itemPath>Adafruit_GFX.h</itemPath>
<itemPath>oled_ssd1331.h</itemPath>
</logicalFolder>
<logicalFolder name="LibraryFiles"
displayName="Library Files"
16,6 → 22,7
<logicalFolder name="LinkerScript"
displayName="Linker Files"
projectFiles="true">
<itemPath>18f27j13.lkr</itemPath>
</logicalFolder>
<logicalFolder name="ObjectFiles"
displayName="Object Files"
24,10 → 31,17
<logicalFolder name="SourceFiles"
displayName="Source Files"
projectFiles="true">
<itemPath>main.c</itemPath>
<itemPath>i2c.c</itemPath>
<itemPath>interrupts.c</itemPath>
<itemPath>main.c</itemPath>
<itemPath>led_backpack.c</itemPath>
<itemPath>nfc.c</itemPath>
<itemPath>spi.c</itemPath>
<itemPath>uart.c</itemPath>
<itemPath>i2c.c</itemPath>
<itemPath>oled_ssd1306.c</itemPath>
<itemPath>glcdfont.c</itemPath>
<itemPath>Adafruit_GFX.c</itemPath>
<itemPath>oled_ssd1331.c</itemPath>
</logicalFolder>
<logicalFolder name="ExternalFiles"
displayName="Important Files"
130,7 → 144,7
<property key="memories.programmemory" value="true"/>
<property key="memories.programmemory.end" value="0x1fff7"/>
<property key="memories.programmemory.start" value="0x0"/>
<property key="poweroptions.powerenable" value="true"/>
<property key="poweroptions.powerenable" value="false"/>
<property key="programmertogo.imagename" value=""/>
<property key="programoptions.eraseb4program" value="true"/>
<property key="programoptions.preserveeeprom" value="false"/>
/PIC Stuff/PIC_27J13/nfc.c
0,0 → 1,402
#include "maindefs.h"
#include "nfc.h"
#include "i2c.h"
#include <string.h>
#include <delays.h>
 
static NFC_DATA nfc_data;
 
// Const value arrays for comparison use
static char pn532response_firmwarevers[] = {0x01, 0x00, 0x00, 0xFF, 0x06, 0xFA, 0xD5, 0x03};
static char pn532ack[] = {0x01, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00};
 
void NFC_Init() {
TRISCbits.TRISC1 = 1; // IRQ Pin is RC5
TRISCbits.TRISC2 = 0; // Reset Pin is RC2
// Reset the PN532
LATCbits.LATC2 = 1;
LATCbits.LATC2 = 0;
Delay10TCYx(1);
LATCbits.LATC2 = 1;
}
 
// Configures the SAM (Secure Access Module)
unsigned char NFC_SAMConfig() {
nfc_data.packetbuffer[0] = PN532_COMMAND_SAMCONFIGURATION;
nfc_data.packetbuffer[1] = 0x01; // Normal mode
nfc_data.packetbuffer[2] = 0x14; // Timeout 50ms * 20 = 1s
nfc_data.packetbuffer[3] = 0x01; // Use IRQ pin
 
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 4))
return 0;
 
NFC_I2C_Read_Data(nfc_data.packetbuffer, 8);
 
return (nfc_data.packetbuffer[7] == 0x15);
}
 
// Checks the firmware version of the PN5xx chip
NFC_FIRMWARE_VERSION NFC_getFirmwareVersion(void) {
NFC_FIRMWARE_VERSION response = {0,0,0,0};
 
// Create and send command
nfc_data.packetbuffer[0] = PN532_COMMAND_GETFIRMWAREVERSION;
 
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 1))
return response;
 
// Read back data from the PN532
NFC_I2C_Read_Data(nfc_data.packetbuffer, 12);
 
// Compare and check returned values
if (strncmp((char *)nfc_data.packetbuffer, (char *)pn532response_firmwarevers, 8) != 0)
return response;
 
// Save and return info
response.IC = nfc_data.packetbuffer[8];
response.Ver = nfc_data.packetbuffer[9];
response.Rev = nfc_data.packetbuffer[10];
response.Support = nfc_data.packetbuffer[11];
 
return response;
}
 
// Sends a command and waits a specified period for the ACK
unsigned char NFC_sendCommandCheckAck(unsigned char *cmd, unsigned char cmdlen) {
unsigned int timer = 0;
 
// Write the command
NFC_I2C_Write_Cmd(cmd, cmdlen);
 
// Wait for chip to be ready
while (NFC_I2C_Read_Status() != PN532_I2C_READY) {
if (PN532_TIMEOUT != 0) {
timer += 1;
if (timer > PN532_TIMEOUT)
return 0;
}
Delay10TCYx(1);
}
 
// Check ACK
if (!NFC_I2C_Read_ACK()) {
return 0;
}
 
return 1;
}
 
// Waits for an ISO14443A target to enter the field
unsigned char NFC_readPassiveTargetID(unsigned char cardbaudrate, unsigned char * uid, unsigned char * uidLength) {
unsigned char i = 0;
 
nfc_data.packetbuffer[0] = PN532_COMMAND_INLISTPASSIVETARGET;
nfc_data.packetbuffer[1] = 1; // max 1 cards at once (we can set this to 2 later)
nfc_data.packetbuffer[2] = cardbaudrate;
 
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 3))
return 0;
 
// Wait for IRQ line
while (NFC_I2C_Read_Status() != PN532_I2C_READY);
 
NFC_I2C_Read_Data(nfc_data.packetbuffer, 20);
 
/* ISO14443A card response should be in the following format:
// (byte 0 is actually 0x01 (data ready))
byte Description
------------- ------------------------------------------
b0..6 Frame header and preamble
b7 Tags Found
b8 Tag Number (only one used in this example)
b9..10 SENS_RES
b11 SEL_RES
b12 NFCID Length
b13..NFCIDLen NFCID */
 
// Check # of tags found
if (nfc_data.packetbuffer[8] != 1)
return 0;
 
// Save UID length
*uidLength = nfc_data.packetbuffer[13];
 
// Save UID
for (i = 0; i < *uidLength; i++) {
uid[i] = nfc_data.packetbuffer[14+i];
}
 
return 1;
}
 
// Indicates whether the specified block number is the first block
// in the sector (block 0 relative to the current sector)
unsigned char NFC_mifareclassic_IsFirstBlock(unsigned long uiBlock) {
// Test if we are in the small or big sectors
if (uiBlock < 128)
return ((uiBlock) % 4 == 0);
else
return ((uiBlock) % 16 == 0);
}
 
// Indicates whether the specified block number is the sector trailer
unsigned char NFC_mifareclassic_IsTrailerBlock(unsigned long uiBlock) {
// Test if we are in the small or big sectors
if (uiBlock < 128)
return ((uiBlock + 1) % 4 == 0);
else
return ((uiBlock + 1) % 16 == 0);
}
 
// Tries to authenticate a block of memory on a MIFARE card using the INDATAEXCHANGE command
unsigned char NFC_mifareclassic_AuthenticateBlock(unsigned char *uid, unsigned char uidLen, unsigned long blockNumber, unsigned char keyNumber, unsigned char *keyData) {
// See section 7.3.8 of the PN532 User Manual
// blockNumber = The block number to authenticate. (0..63 for 1KB cards, and 0..255 for 4KB cards)\
// keyNumber = Which key type to use during authentication (0 = MIFARE_CMD_AUTH_A, 1 = MIFARE_CMD_AUTH_B)
// keyData = Pointer to a byte array containing the 6 byte key value
unsigned char i;
 
// Assemble frame data
nfc_data.packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE; /* Data Exchange Header */
nfc_data.packetbuffer[1] = 1; /* Max card numbers */
nfc_data.packetbuffer[2] = (keyNumber) ? MIFARE_CMD_AUTH_A : MIFARE_CMD_AUTH_B;
nfc_data.packetbuffer[3] = blockNumber; /* Block Number (1K = 0..63, 4K = 0..255 */
for (i = 0; i < 6; i++) {
nfc_data.packetbuffer[4+i] = keyData[i];
}
for (i = 0; i < uidLen; i++) {
nfc_data.packetbuffer[10+i] = uid[i];
}
 
// Send frame and check for ACK
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 10+uidLen))
return 0;
 
// Read response from PN532
NFC_I2C_Read_Data(nfc_data.packetbuffer, 12);
 
return 1;
}
 
// Tries to read an entire 16-byte data block at the specified block address
unsigned char NFC_mifareclassic_ReadDataBlock(unsigned char blockNumber, unsigned char *data) {
unsigned char i;
 
// Assemble frame data
nfc_data.packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE;
nfc_data.packetbuffer[1] = 1; /* Card number */
nfc_data.packetbuffer[2] = MIFARE_CMD_READ; /* Mifare Read command = 0x30 */
nfc_data.packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */
 
// Send frame and check for ACK
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 4))
return 0;
 
// Read reponse
NFC_I2C_Read_Data(nfc_data.packetbuffer, 26);
 
// If byte 9 isnt 0x00 we probably have and error
if (nfc_data.packetbuffer[8] != 0x00) {
return 0;
}
 
// Copy the 16 data bytes into the data buffer
// Block contents starts at byte 10 of a valid response
for (i = 0; i < 16; i++) {
data[i] = nfc_data.packetbuffer[9+i];
}
 
return 1;
}
 
// Tries to write an entire 16-byte data block at the specified block address
unsigned char NFC_mifareclassic_WriteDataBlock(unsigned char blockNumber, unsigned char *data) {
unsigned char i;
// Assemble frame data
nfc_data.packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE;
nfc_data.packetbuffer[1] = 1; /* Card number */
nfc_data.packetbuffer[2] = MIFARE_CMD_WRITE; /* Mifare Write command = 0xA0 */
nfc_data.packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */
for (i = 0; i < 16; i++) { /* Data Payload */
nfc_data.packetbuffer[4+i] = data[i];
}
 
// Send frame and check for ACK
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 20))
return 0;
 
// Read response
NFC_I2C_Read_Data(nfc_data.packetbuffer, 26);
 
return 1;
}
 
// Formats a Mifare Classic card to store NDEF Records
unsigned char NFC_mifareclassic_FormatNDEF(void) {
unsigned char sectorbuffer1[16] = {0x14, 0x01, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1};
unsigned char sectorbuffer2[16] = {0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1};
unsigned char sectorbuffer3[16] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0x78, 0x77, 0x88, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 
// Write blocks 1 and 2
if (!NFC_mifareclassic_WriteDataBlock(1, sectorbuffer1))
return 0;
if (!NFC_mifareclassic_WriteDataBlock(2, sectorbuffer2))
return 0;
// Write key A and access rights
if (!NFC_mifareclassic_WriteDataBlock(3, sectorbuffer3))
return 0;
 
return 1;
}
 
// Writes an NDEF URI Record to the specified sector (1..15)
/* Note that this function assumes that the Mifare Classic card is
already formatted to work as an "NFC Forum Tag" and uses a MAD1
file system. You can use the NXP TagWriter app on Android to
properly format cards for this. */
unsigned char NFC_mifareclassic_WriteNDEFURI(unsigned char sectorNumber, unsigned char uriIdentifier, const char * url) {
// uriIdentifier = The uri identifier code (0 = none, 0x01 = "http://www.", etc.)
// url = The uri text to write (max 38 characters)
 
// Figure out how long the string is
unsigned char len = strlen(url);
unsigned char sectorbuffer1[16] = {0x00, 0x00, 0x03, len + 5, 0xD1, 0x01, len + 1, 0x55, uriIdentifier, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char sectorbuffer2[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char sectorbuffer3[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char sectorbuffer4[16] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7, 0x7F, 0x07, 0x88, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 
// Make sure we're within a 1K limit for the sector number
if ((sectorNumber < 1) || (sectorNumber > 15))
return 0;
 
// Make sure the URI payload is between 1 and 38 chars
if ((len < 1) || (len > 38))
return 0;
 
if (len <= 6) {
// Unlikely we'll get a url this short, but why not ...
memcpy(sectorbuffer1 + 9, url, len);
sectorbuffer1[len + 9] = 0xFE;
} else if (len == 7) {
// 0xFE needs to be wrapped around to next block
memcpy(sectorbuffer1 + 9, url, len);
sectorbuffer2[0] = 0xFE;
} else if ((len > 7) || (len <= 22)) {
// Url fits in two blocks
memcpy(sectorbuffer1 + 9, url, 7);
memcpy(sectorbuffer2, url + 7, len - 7);
sectorbuffer2[len - 7] = 0xFE;
} else if (len == 23) {
// 0xFE needs to be wrapped around to final block
memcpy(sectorbuffer1 + 9, url, 7);
memcpy(sectorbuffer2, url + 7, len - 7);
sectorbuffer3[0] = 0xFE;
} else {
// Url fits in three blocks
memcpy(sectorbuffer1 + 9, url, 7);
memcpy(sectorbuffer2, url + 7, 16);
memcpy(sectorbuffer3, url + 23, len - 24);
sectorbuffer3[len - 22] = 0xFE;
}
 
// Now write all three blocks back to the card
if (!(NFC_mifareclassic_WriteDataBlock(sectorNumber * 4, sectorbuffer1)))
return 0;
if (!(NFC_mifareclassic_WriteDataBlock((sectorNumber * 4) + 1, sectorbuffer2)))
return 0;
if (!(NFC_mifareclassic_WriteDataBlock((sectorNumber * 4) + 2, sectorbuffer3)))
return 0;
if (!(NFC_mifareclassic_WriteDataBlock((sectorNumber * 4) + 3, sectorbuffer4)))
return 0;
 
return 1;
}
 
// Reads and checks for the ACK signal
unsigned char NFC_I2C_Read_ACK() {
unsigned char buffer[7];
 
// Check ACK
NFC_I2C_Read_Data(buffer, 6);
 
// Return if the 7 bytes matches the ACK
return (strncmp((char *)buffer, (char *)pn532ack, 7) == 0);
}
 
// Checks the IRQ pin to know if the PN532 is ready
unsigned char NFC_I2C_Read_Status() {
if (PORTCbits.RC1 == 1) {
return PN532_I2C_BUSY;
} else {
return PN532_I2C_READY;
}
}
 
// Reads n bytes of data from the PN532 via I2C
void NFC_I2C_Read_Data(unsigned char *buffer, unsigned char length) {
unsigned char result;
 
// Wait for IRQ to go low
while (NFC_I2C_Read_Status() != PN532_I2C_READY);
 
// Read bytes from PN532 into buffer
I2C_Master_Recv(PN532_I2C_ADDRESS, length+2);
result = I2C_Get_Status();
while (!result) {
result = I2C_Get_Status();
}
I2C_Read_Buffer((char *)buffer);
 
// Note: First byte is always 0x01 (ready status from PN532)
/* Remaining packet byte layout is as follows:
Byte Description
----- ----------------------
* 0 Preamble (0x00)
* 1-2 Start code (0x00,0xFF)
* 3 Length (TFI to N)
* 4 Length Checksum (Length + LCS = 0x00)
* 5 TFI (Frame identifier)
* 0xD4 - Host to PN532
* 0xD5 - PN532 to Host
* 6-N Data (Length - 1 bytes)
* N+1 Data checksum (TFI + Data~N + DCS = 0x00)
* N+2 Postamble (0x00) */
}
 
// Writes a command to the PN532, automatically inserting the preamble and required frame details (checksum, len, etc.)
void NFC_I2C_Write_Cmd(unsigned char* cmd, unsigned char cmdlen) {
int i;
unsigned char checksum;
unsigned char buffer[PN532_PACKBUFFSIZ+8];
unsigned char buffer_ind = 6;
cmdlen++;
 
checksum = PN532_PREAMBLE + PN532_PREAMBLE + PN532_STARTCODE2 + PN532_HOSTTOPN532;
 
// Fill out required frame fields
buffer[0] = PN532_PREAMBLE;
buffer[1] = PN532_PREAMBLE;
buffer[2] = PN532_STARTCODE2;
buffer[3] = cmdlen;
buffer[4] = ~cmdlen + 1;
buffer[5] = PN532_HOSTTOPN532;
 
 
// Copy cmd to be sent
for (i = 0; i < cmdlen-1; i++) {
checksum += cmd[i];
buffer[buffer_ind] = cmd[i];
buffer_ind++;
}
buffer[buffer_ind] = ~checksum;
buffer_ind++;
buffer[buffer_ind] = PN532_POSTAMBLE;
buffer_ind++;
 
I2C_Master_Send(PN532_I2C_ADDRESS, buffer_ind, buffer);
}
/PIC Stuff/PIC_27J13/nfc.h
0,0 → 1,163
#ifndef NFC_H
#define NFC_H
 
/* PN532 NFC Reader from Adafruit */
 
#define PN532_PREAMBLE (0x00)
#define PN532_STARTCODE1 (0x00)
#define PN532_STARTCODE2 (0xFF)
#define PN532_POSTAMBLE (0x00)
 
#define PN532_HOSTTOPN532 (0xD4)
 
// PN532 Commands
#define PN532_COMMAND_DIAGNOSE (0x00)
#define PN532_COMMAND_GETFIRMWAREVERSION (0x02)
#define PN532_COMMAND_GETGENERALSTATUS (0x04)
#define PN532_COMMAND_READREGISTER (0x06)
#define PN532_COMMAND_WRITEREGISTER (0x08)
#define PN532_COMMAND_READGPIO (0x0C)
#define PN532_COMMAND_WRITEGPIO (0x0E)
#define PN532_COMMAND_SETSERIALBAUDRATE (0x10)
#define PN532_COMMAND_SETPARAMETERS (0x12)
#define PN532_COMMAND_SAMCONFIGURATION (0x14)
#define PN532_COMMAND_POWERDOWN (0x16)
#define PN532_COMMAND_RFCONFIGURATION (0x32)
#define PN532_COMMAND_RFREGULATIONTEST (0x58)
#define PN532_COMMAND_INJUMPFORDEP (0x56)
#define PN532_COMMAND_INJUMPFORPSL (0x46)
#define PN532_COMMAND_INLISTPASSIVETARGET (0x4A)
#define PN532_COMMAND_INATR (0x50)
#define PN532_COMMAND_INPSL (0x4E)
#define PN532_COMMAND_INDATAEXCHANGE (0x40)
#define PN532_COMMAND_INCOMMUNICATETHRU (0x42)
#define PN532_COMMAND_INDESELECT (0x44)
#define PN532_COMMAND_INRELEASE (0x52)
#define PN532_COMMAND_INSELECT (0x54)
#define PN532_COMMAND_INAUTOPOLL (0x60)
#define PN532_COMMAND_TGINITASTARGET (0x8C)
#define PN532_COMMAND_TGSETGENERALBYTES (0x92)
#define PN532_COMMAND_TGGETDATA (0x86)
#define PN532_COMMAND_TGSETDATA (0x8E)
#define PN532_COMMAND_TGSETMETADATA (0x94)
#define PN532_COMMAND_TGGETINITIATORCOMMAND (0x88)
#define PN532_COMMAND_TGRESPONSETOINITIATOR (0x90)
#define PN532_COMMAND_TGGETTARGETSTATUS (0x8A)
 
#define PN532_WAKEUP (0x55)
 
#define PN532_SPI_STATREAD (0x02)
#define PN532_SPI_DATAWRITE (0x01)
#define PN532_SPI_DATAREAD (0x03)
#define PN532_SPI_READY (0x01)
 
#define PN532_I2C_ADDRESS (0x48 >> 1)
#define PN532_I2C_READBIT (0x01)
#define PN532_I2C_BUSY (0x00)
#define PN532_I2C_READY (0x01)
#define PN532_I2C_READYTIMEOUT (20)
 
#define PN532_MIFARE_ISO14443A (0x00)
 
// Mifare Commands
#define MIFARE_CMD_AUTH_A (0x60)
#define MIFARE_CMD_AUTH_B (0x61)
#define MIFARE_CMD_READ (0x30)
#define MIFARE_CMD_WRITE (0xA0)
#define MIFARE_CMD_TRANSFER (0xB0)
#define MIFARE_CMD_DECREMENT (0xC0)
#define MIFARE_CMD_INCREMENT (0xC1)
#define MIFARE_CMD_STORE (0xC2)
 
// Prefixes for NDEF Records (to identify record type)
#define NDEF_URIPREFIX_NONE (0x00)
#define NDEF_URIPREFIX_HTTP_WWWDOT (0x01)
#define NDEF_URIPREFIX_HTTPS_WWWDOT (0x02)
#define NDEF_URIPREFIX_HTTP (0x03)
#define NDEF_URIPREFIX_HTTPS (0x04)
#define NDEF_URIPREFIX_TEL (0x05)
#define NDEF_URIPREFIX_MAILTO (0x06)
#define NDEF_URIPREFIX_FTP_ANONAT (0x07)
#define NDEF_URIPREFIX_FTP_FTPDOT (0x08)
#define NDEF_URIPREFIX_FTPS (0x09)
#define NDEF_URIPREFIX_SFTP (0x0A)
#define NDEF_URIPREFIX_SMB (0x0B)
#define NDEF_URIPREFIX_NFS (0x0C)
#define NDEF_URIPREFIX_FTP (0x0D)
#define NDEF_URIPREFIX_DAV (0x0E)
#define NDEF_URIPREFIX_NEWS (0x0F)
#define NDEF_URIPREFIX_TELNET (0x10)
#define NDEF_URIPREFIX_IMAP (0x11)
#define NDEF_URIPREFIX_RTSP (0x12)
#define NDEF_URIPREFIX_URN (0x13)
#define NDEF_URIPREFIX_POP (0x14)
#define NDEF_URIPREFIX_SIP (0x15)
#define NDEF_URIPREFIX_SIPS (0x16)
#define NDEF_URIPREFIX_TFTP (0x17)
#define NDEF_URIPREFIX_BTSPP (0x18)
#define NDEF_URIPREFIX_BTL2CAP (0x19)
#define NDEF_URIPREFIX_BTGOEP (0x1A)
#define NDEF_URIPREFIX_TCPOBEX (0x1B)
#define NDEF_URIPREFIX_IRDAOBEX (0x1C)
#define NDEF_URIPREFIX_FILE (0x1D)
#define NDEF_URIPREFIX_URN_EPC_ID (0x1E)
#define NDEF_URIPREFIX_URN_EPC_TAG (0x1F)
#define NDEF_URIPREFIX_URN_EPC_PAT (0x20)
#define NDEF_URIPREFIX_URN_EPC_RAW (0x21)
#define NDEF_URIPREFIX_URN_EPC (0x22)
#define NDEF_URIPREFIX_URN_NFC (0x23)
 
#define PN532_GPIO_VALIDATIONBIT (0x80)
#define PN532_GPIO_P30 (0)
#define PN532_GPIO_P31 (1)
#define PN532_GPIO_P32 (2)
#define PN532_GPIO_P33 (3)
#define PN532_GPIO_P34 (4)
#define PN532_GPIO_P35 (5)
 
#define PN532_PACKBUFFSIZ 64
#define PN532_TIMEOUT 1000
 
typedef struct {
unsigned char IC;
unsigned char Ver;
unsigned char Rev;
unsigned char Support;
} NFC_FIRMWARE_VERSION;
 
typedef struct __NFC_DATA {
unsigned char packetbuffer[PN532_PACKBUFFSIZ];
} NFC_DATA;
 
void NFC_Init(void);
 
// Generic PN532 functions
unsigned char NFC_SAMConfig(void);
NFC_FIRMWARE_VERSION NFC_getFirmwareVersion(void);
unsigned char NFC_sendCommandCheckAck(unsigned char *cmd, unsigned char cmdlen);
//unsigned char NFC_writeGPIO(unsigned char pinstate);
//unsigned char NFC_readGPIO(void);
 
// ISO14443A functions
unsigned char NFC_readPassiveTargetID(unsigned char cardbaudrate, unsigned char * uid, unsigned char * uidLength);
 
// Mifare Classic functions
unsigned char NFC_mifareclassic_IsFirstBlock(unsigned long uiBlock);
unsigned char NFC_mifareclassic_IsTrailerBlock(unsigned long uiBlock);
unsigned char NFC_mifareclassic_AuthenticateBlock(unsigned char *uid, unsigned char uidLen, unsigned long blockNumber, unsigned char keyNumber, unsigned char *keyData);
unsigned char NFC_mifareclassic_ReadDataBlock(unsigned char blockNumber, unsigned char *data);
unsigned char NFC_mifareclassic_WriteDataBlock(unsigned char blockNumber, unsigned char *data);
unsigned char NFC_mifareclassic_FormatNDEF(void);
unsigned char NFC_mifareclassic_WriteNDEFURI(unsigned char sectorNumber, unsigned char uriIdentifier, const char * url);
 
// Mifare Ultralight functions
//unsigned char NFC_mifareultralight_ReadPage(unsigned char page, unsigned char * buffer);
 
// Low level SPI functions
unsigned char NFC_I2C_Read_ACK(void);
unsigned char NFC_I2C_Read_Status(void);
void NFC_I2C_Read_Data(unsigned char *buffer, unsigned char length);
void NFC_I2C_Write_Cmd(unsigned char *cmd, unsigned char cmdlen);
 
#endif
 
/PIC Stuff/PIC_27J13/oled_ssd1306.c
0,0 → 1,369
#include "maindefs.h"
#include "oled_ssd1306.h"
#include "spi.h"
#include "string.h"
#include "Adafruit_GFX.h"
#include <delays.h>
 
// 512 (128x32) or 1024 (128x64) bytes allocated for LCD buffer
// See linker file for details
#ifdef GFX_SSD1306
static unsigned char LCD_Buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF,
0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8,
0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80,
0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01,
0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF,
0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00,
0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF,
0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF,
0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F,
0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC,
0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03,
0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01,
0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00,
0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03,
0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
#if (SSD1306_LCDHEIGHT == 64)
0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F,
0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F,
0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00,
0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E,
0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC,
0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06,
0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8,
0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C,
0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F,
0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00,
0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07,
0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
#endif
};
#else
static unsigned char LCD_Buffer[1];
#endif
 
void SSD1306_Init() {
GFX_Init(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT);
}
 
void SSD1306_Begin(unsigned char vccstate) {
// Toggle reset pin
LATBbits.LATB6 = 0;
Delay10KTCYx(1);
LATBbits.LATB6 = 1;
 
#if defined SSD1306_128_32
// Init sequence for 128x32 OLED module
SSD1306_Command(SSD1306_DISPLAYOFF); // 0xAE
SSD1306_Command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
SSD1306_Command(0x80); // The suggested ratio 0x80
SSD1306_Command(SSD1306_SETMULTIPLEX); // 0xA8
SSD1306_Command(0x1F);
SSD1306_Command(SSD1306_SETDISPLAYOFFSET); // 0xD3
SSD1306_Command(0x0); // No offset
SSD1306_Command(SSD1306_SETSTARTLINE | 0x0); // Line #0
SSD1306_Command(SSD1306_CHARGEPUMP); // 0x8D
if (vccstate == SSD1306_EXTERNALVCC) {
SSD1306_Command(0x10);
} else {
SSD1306_Command(0x14);
}
SSD1306_Command(SSD1306_MEMORYMODE); // 0x20
SSD1306_Command(0x00); // 0x0 act like ks0108
SSD1306_Command(SSD1306_SEGREMAP | 0x1);
SSD1306_Command(SSD1306_COMSCANDEC);
SSD1306_Command(SSD1306_SETCOMPINS); // 0xDA
SSD1306_Command(0x02);
SSD1306_Command(SSD1306_SETCONTRAST); // 0x81
SSD1306_Command(0x8F);
SSD1306_Command(SSD1306_SETPRECHARGE); // 0xd9
if (vccstate == SSD1306_EXTERNALVCC) {
SSD1306_Command(0x22);
} else {
SSD1306_Command(0xF1);
}
SSD1306_Command(SSD1306_SETVCOMDETECT); // 0xDB
SSD1306_Command(0x40);
SSD1306_Command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
SSD1306_Command(SSD1306_NORMALDISPLAY); // 0xA6
#endif
 
#if defined SSD1306_128_64
// Init sequence for 128x64 OLED module
SSD1306_Command(SSD1306_DISPLAYOFF); // 0xAE
SSD1306_Command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
SSD1306_Command(0x80); // The suggested ratio 0x80
SSD1306_Command(SSD1306_SETMULTIPLEX); // 0xA8
SSD1306_Command(0x3F);
SSD1306_Command(SSD1306_SETDISPLAYOFFSET); // 0xD3
SSD1306_Command(0x0); // No offset
SSD1306_Command(SSD1306_SETSTARTLINE | 0x0); // Line #0
SSD1306_Command(SSD1306_CHARGEPUMP); // 0x8D
if (vccstate == SSD1306_EXTERNALVCC) {
SSD1306_Command(0x10);
} else {
SSD1306_Command(0x14);
}
SSD1306_Command(SSD1306_MEMORYMODE); // 0x20
SSD1306_Command(0x00); // 0x0 act like ks0108
SSD1306_Command(SSD1306_SEGREMAP | 0x1);
SSD1306_Command(SSD1306_COMSCANDEC);
SSD1306_Command(SSD1306_SETCOMPINS); // 0xDA
SSD1306_Command(0x12);
SSD1306_Command(SSD1306_SETCONTRAST); // 0x81
if (vccstate == SSD1306_EXTERNALVCC) {
SSD1306_Command(0x9F);
} else {
SSD1306_Command(0xCF);
}
SSD1306_Command(SSD1306_SETPRECHARGE); // 0xd9
if (vccstate == SSD1306_EXTERNALVCC) {
SSD1306_Command(0x22);
} else {
SSD1306_Command(0xF1);
}
SSD1306_Command(SSD1306_SETVCOMDETECT); // 0xDB
SSD1306_Command(0x40);
SSD1306_Command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
SSD1306_Command(SSD1306_NORMALDISPLAY); // 0xA6
#endif
 
SSD1306_Command(SSD1306_DISPLAYON); // Turn on OLED panel
}
 
void SSD1306_Command(unsigned char cmd) {
unsigned char c = cmd;
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(&c, 1);
}
 
void SSD1306_Data(unsigned char data) {
unsigned char c = data;
LATBbits.LATB5 = 1; // D/C high (data)
SPI2_Write(&c, 1);
}
 
void SSD1306_Clear_Display() {
memset(LCD_Buffer, 0, (SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8));
}
 
void SSD1306_Invert_Display(unsigned char c) {
if (c) {
SSD1306_Command(SSD1306_INVERTDISPLAY);
} else {
SSD1306_Command((SSD1306_NORMALDISPLAY));
}
}
 
void SSD1306_Display() {
unsigned int i;
unsigned char c = 0;
 
SSD1306_Command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
SSD1306_Command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
SSD1306_Command(SSD1306_SETSTARTLINE | 0x0); // line #0
 
LATBbits.LATB5 = 1; // D/C high (data)
SPI2_Write(LCD_Buffer, SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8);
 
// if (SSD1306_LCDHEIGHT == 32) {
// SPI2_Write_Repeat(0, SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8);
// }
}
 
void SSD1306_Draw_Pixel(int x, int y, unsigned int color) {
if ((x < 0) || (x >= GFX_width()) || (y < 0) || (y >= GFX_height()))
return;
 
// check rotation, move pixel around if necessary
switch (GFX_getRotation()) {
case 1:
GFX_Swap(&x, &y);
x = SSD1306_LCDWIDTH - x - 1;
break;
case 2:
x = SSD1306_LCDWIDTH - x - 1;
y = SSD1306_LCDHEIGHT - y - 1;
break;
case 3:
GFX_Swap(&x, &y);
y = SSD1306_LCDHEIGHT - y - 1;
break;
}
 
// x is which column
if (color == SSD1306_WHITE)
LCD_Buffer[x + (y / 8) * SSD1306_LCDWIDTH] |= 1<<(y % 8);
else
LCD_Buffer[x + (y / 8) * SSD1306_LCDWIDTH] &= ~(1<<(y % 8));
}
 
void SSD1306_Test_DrawChar() {
unsigned char i;
GFX_setTextSize(1);
GFX_setTextColor(SSD1306_WHITE);
GFX_setCursor(0, 0);
 
for (i = 0; i < 168; i++) {
if (i == '\n') continue;
GFX_write(i);
// if ((i > 0) && (i % 21 == 0))
// GFX_write('\n');
}
SSD1306_Display();
}
 
void SSD1306_Test_DrawCircle() {
int i;
for (i = 0; i < GFX_height(); i += 2) {
GFX_drawCircle(GFX_width() / 2, GFX_height() / 2, i, SSD1306_WHITE);
SSD1306_Display();
}
}
 
void SSD1306_Test_DrawRect(void) {
int i;
for (i = 0; i < GFX_height() / 2; i += 2) {
GFX_drawRect(i, i, GFX_width() - 2 * i, GFX_height() - 2 * i, SSD1306_WHITE);
SSD1306_Display();
}
}
 
void SSD1306_Test_FillRect(void) {
unsigned char color = 1;
int i;
for (i = 0; i < GFX_height() / 2; i += 3) {
// alternate colors
GFX_fillRect(i, i, GFX_width() - i * 2, GFX_height() - i * 2, color % 2);
SSD1306_Display();
color++;
}
}
 
void SSD1306_Test_DrawTriangle(void) {
int i;
int min = GFX_width() < GFX_height() ? GFX_width() : GFX_height();
for (i = 0; i < min / 2; i += 5) {
GFX_drawTriangle(GFX_width() / 2, GFX_height() / 2 - i,
GFX_width() / 2 - i, GFX_height() / 2 + i,
GFX_width() / 2 + i, GFX_height() / 2 + i, SSD1306_WHITE);
SSD1306_Display();
}
}
 
void SSD1306_Test_FillTriangle(void) {
unsigned char color = SSD1306_WHITE;
int i;
int min = GFX_width() < GFX_height() ? GFX_width() : GFX_height();
for (i = min / 2; i > 0; i -= 5) {
GFX_fillTriangle(GFX_width() / 2, GFX_height() / 2 - i,
GFX_width() / 2 - i, GFX_height() / 2 + i,
GFX_width() / 2 + i, GFX_height() / 2 + i, SSD1306_WHITE);
if (color == SSD1306_WHITE) color = SSD1306_BLACK;
else color = SSD1306_WHITE;
SSD1306_Display();
}
}
 
void SSD1306_Test_DrawRoundRect(void) {
int i;
for (i = 0; i < GFX_height() / 2 - 2; i += 2) {
GFX_drawRoundRect(i, i, GFX_width() - 2 * i, GFX_height() - 2 * i, GFX_height() / 4, SSD1306_WHITE);
SSD1306_Display();
}
}
 
void SSD1306_Test_FillRoundRect(void) {
unsigned char color = SSD1306_WHITE;
int i;
for (i = 0; i < GFX_height() / 2 - 2; i += 2) {
GFX_fillRoundRect(i, i, GFX_width() - 2 * i, GFX_height() - 2 * i, GFX_height() / 4, color);
if (color == SSD1306_WHITE) color = SSD1306_BLACK;
else color = SSD1306_WHITE;
SSD1306_Display();
}
}
 
void SSD1306_Test_DrawLine(void) {
int i;
for (i = 0; i < GFX_width(); i += 4) {
GFX_drawLine(0, 0, i, GFX_height() - 1, SSD1306_WHITE);
SSD1306_Display();
}
for (i = 0; i < GFX_height(); i += 4) {
GFX_drawLine(0, 0, GFX_width() - 1, i, SSD1306_WHITE);
SSD1306_Display();
}
Delay10KTCYx(255);
 
SSD1306_Clear_Display();
for (i = 0; i < GFX_width(); i += 4) {
GFX_drawLine(0, GFX_height() - 1, i, 0, SSD1306_WHITE);
SSD1306_Display();
}
for (i = GFX_height() - 1; i >= 0; i -= 4) {
GFX_drawLine(0, GFX_height() - 1, GFX_width() - 1, i, SSD1306_WHITE);
SSD1306_Display();
}
Delay10KTCYx(255);
 
SSD1306_Clear_Display();
for (i = GFX_width() - 1; i >= 0; i -= 4) {
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, i, 0, SSD1306_WHITE);
SSD1306_Display();
}
for (i = GFX_height() - 1; i >= 0; i -= 4) {
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, 0, i, SSD1306_WHITE);
SSD1306_Display();
}
Delay10KTCYx(255);
 
SSD1306_Clear_Display();
for (i = 0; i < GFX_height(); i += 4) {
GFX_drawLine(GFX_width() - 1, 0, 0, i, SSD1306_WHITE);
SSD1306_Display();
}
for (i = 0; i < GFX_width(); i += 4) {
GFX_drawLine(GFX_width() - 1, 0, i, GFX_height() - 1, SSD1306_WHITE);
SSD1306_Display();
}
Delay10KTCYx(255);
}
/PIC Stuff/PIC_27J13/oled_ssd1306.h
0,0 → 1,83
#ifndef OLED_SSD1306_H
#define OLED_SSD1306_H
 
/*=========================================================================
SSD1306 Displays
-----------------------------------------------------------------------
The driver is used in multiple displays (128x64, 128x32, etc.).
Select the appropriate display below to create an appropriately
sized framebuffer, etc.
 
SSD1306_128_64 128x64 pixel display
 
SSD1306_128_32 128x32 pixel display
 
You also need to set the LCDWIDTH and LCDHEIGHT defines to an
appropriate size
 
-----------------------------------------------------------------------*/
// #define SSD1306_128_64
#define SSD1306_128_32
/*=========================================================================*/
 
#if defined SSD1306_128_64
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 64
#endif
#if defined SSD1306_128_32
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 32
#endif
 
#define SSD1306_BLACK 0
#define SSD1306_WHITE 1
 
#define SSD1306_I2C_ADDRESS 0x3D // 011110+SA0+RW
 
#define SSD1306_SETCONTRAST 0x81
#define SSD1306_DISPLAYALLON_RESUME 0xA4
#define SSD1306_DISPLAYALLON 0xA5
#define SSD1306_NORMALDISPLAY 0xA6
#define SSD1306_INVERTDISPLAY 0xA7
#define SSD1306_DISPLAYOFF 0xAE
#define SSD1306_DISPLAYON 0xAF
#define SSD1306_SETDISPLAYOFFSET 0xD3
#define SSD1306_SETCOMPINS 0xDA
#define SSD1306_SETVCOMDETECT 0xDB
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
#define SSD1306_SETPRECHARGE 0xD9
#define SSD1306_SETMULTIPLEX 0xA8
#define SSD1306_SETLOWCOLUMN 0x00
#define SSD1306_SETHIGHCOLUMN 0x10
#define SSD1306_SETSTARTLINE 0x40
#define SSD1306_MEMORYMODE 0x20
#define SSD1306_COMSCANINC 0xC0
#define SSD1306_COMSCANDEC 0xC8
#define SSD1306_SEGREMAP 0xA0
#define SSD1306_CHARGEPUMP 0x8D
#define SSD1306_EXTERNALVCC 0x1
#define SSD1306_SWITCHCAPVCC 0x2
 
void SSD1306_Init(void);
void SSD1306_Begin(unsigned char vcc);
void SSD1306_Command(unsigned char cmd);
void SSD1306_Data(unsigned char data);
 
void SSD1306_Clear_Display(void);
void SSD1306_Invert_Display(unsigned char);
void SSD1306_Display(void);
 
void SSD1306_Draw_Pixel(int x, int y, unsigned int color);
 
void SSD1306_Test_DrawChar(void);
void SSD1306_Test_DrawCircle(void);
void SSD1306_Test_DrawRect(void);
void SSD1306_Test_FillRect(void);
void SSD1306_Test_DrawTriangle(void);
void SSD1306_Test_FillTriangle(void);
void SSD1306_Test_DrawRoundRect(void);
void SSD1306_Test_FillRoundRect(void);
void SSD1306_Test_DrawLine(void);
 
#endif /* OLED_SSD1306_H */
 
/PIC Stuff/PIC_27J13/oled_ssd1331.c
0,0 → 1,538
#include "maindefs.h"
#include "oled_ssd1331.h"
#include "spi.h"
#include "string.h"
#include "Adafruit_GFX.h"
#include <delays.h>
 
void SSD1331_Init() {
GFX_Init(SSD1331_LCDWIDTH, SSD1331_LCDHEIGHT);
}
 
void SSD1331_Begin() {
unsigned char buffer[37];
 
// Toggle reset pin
LATBbits.LATB6 = 0;
Delay10KTCYx(1);
LATBbits.LATB6 = 1;
 
// Initialization Sequence
buffer[0] = SSD1331_CMD_DISPLAYOFF; // 0xAE
buffer[1] = SSD1331_CMD_SETREMAP; // 0xA0
#if defined SSD1331_COLORORDER_RGB
buffer[2] = 0x72; // RGB Color
#else
buffer[2] = 0x76; // BGR Color
#endif
buffer[3] = SSD1331_CMD_STARTLINE; // 0xA1
buffer[4] = 0x0;
buffer[5] = SSD1331_CMD_DISPLAYOFFSET; // 0xA2
buffer[6] = 0x0;
buffer[7] = SSD1331_CMD_NORMALDISPLAY; // 0xA4
buffer[8] = SSD1331_CMD_SETMULTIPLEX; // 0xA8
buffer[9] = 0x3F; // 0x3F 1/64 duty
buffer[10] = SSD1331_CMD_SETMASTER; // 0xAD
buffer[11] = 0x8E;
buffer[12] = SSD1331_CMD_POWERMODE; // 0xB0
buffer[13] = 0x0B;
buffer[14] = SSD1331_CMD_PRECHARGE; // 0xB1
buffer[15] = 0x31;
buffer[16] = SSD1331_CMD_CLOCKDIV; // 0xB3
buffer[17] = 0xF0; // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16)
buffer[18] = SSD1331_CMD_PRECHARGEA; // 0x8A
buffer[19] = 0x64;
buffer[20] = SSD1331_CMD_PRECHARGEB; // 0x8B
buffer[21] = 0x78;
buffer[22] = SSD1331_CMD_PRECHARGEA; // 0x8C
buffer[23] = 0x64;
buffer[24] = SSD1331_CMD_PRECHARGELEVEL; // 0xBB
buffer[25] = 0x3A;
buffer[26] = SSD1331_CMD_VCOMH; // 0xBE
buffer[27] = 0x3E;
buffer[28] = SSD1331_CMD_MASTERCURRENT; // 0x87
buffer[29] = 0x06;
buffer[30] = SSD1331_CMD_CONTRASTA; // 0x81
buffer[31] = 0x91;
buffer[32] = SSD1331_CMD_CONTRASTB; // 0x82
buffer[33] = 0x50;
buffer[34] = SSD1331_CMD_CONTRASTC; // 0x83
buffer[35] = 0x7D;
buffer[36] = SSD1331_CMD_DISPLAYON; //--turn on oled panel
 
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(buffer, 37);
}
 
void SSD1331_GoTo(int x, int y) {
unsigned char buffer[6];
if ((x >= SSD1331_LCDWIDTH) || (y >= SSD1331_LCDHEIGHT)) return;
 
// set x and y coordinate
buffer[0] = (SSD1331_CMD_SETCOLUMN);
buffer[1] = (x);
buffer[2] = (SSD1331_LCDWIDTH - 1);
 
buffer[3] = (SSD1331_CMD_SETROW);
buffer[4] = (y);
buffer[5] = (SSD1331_LCDHEIGHT - 1);
 
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(buffer, 6);
}
 
void SSD1331_Reset() {
 
}
 
void SSD1331_Command(unsigned char cmd) {
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(&cmd, 1);
}
 
void SSD1331_Data(unsigned char data) {
LATBbits.LATB5 = 1; // D/C high (data)
SPI2_Write(&data, 1);
}
 
void SSD1331_Draw_Pixel(int x, int y, unsigned int color) {
unsigned char buffer[2];
buffer[0] = color >> 8;
buffer[1] = color;
if ((x < 0) || (x >= GFX_width()) || (y < 0) || (y >= GFX_height())) return;
 
// check rotation, move pixel around if necessary
switch (GFX_getRotation()) {
case 1:
GFX_Swap(&x, &y);
x = SSD1331_LCDWIDTH - x - 1;
break;
case 2:
x = SSD1331_LCDWIDTH - x - 1;
y = SSD1331_LCDHEIGHT - y - 1;
break;
case 3:
GFX_Swap(&x, &y);
y = SSD1331_LCDHEIGHT - y - 1;
break;
}
 
SSD1331_GoTo(x, y);
 
// setup for data
LATBbits.LATB5 = 1; // D/C high (data)
 
SPI2_Write(buffer, 2);
}
 
void SSD1331_Draw_Line(int x0, int y0, int x1, int y1, unsigned int color) {
unsigned char buffer[8];
 
// check rotation, move pixel around if necessary
switch (GFX_getRotation()) {
case 1:
GFX_Swap(&x0, &y0);
GFX_Swap(&x1, &y1);
x0 = SSD1331_LCDWIDTH - x0 - 1;
x1 = SSD1331_LCDWIDTH - x1 - 1;
break;
case 2:
x0 = SSD1331_LCDWIDTH - x0 - 1;
y0 = SSD1331_LCDHEIGHT - y0 - 1;
x1 = SSD1331_LCDWIDTH - x1 - 1;
y1 = SSD1331_LCDHEIGHT - y1 - 1;
break;
case 3:
GFX_Swap(&x0, &y0);
GFX_Swap(&x1, &y1);
y0 = SSD1331_LCDHEIGHT - y0 - 1;
y1 = SSD1331_LCDHEIGHT - y1 - 1;
break;
}
 
// Boundary check
if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT))
return;
if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH))
return;
if (x0 >= SSD1331_LCDWIDTH)
x0 = SSD1331_LCDWIDTH - 1;
if (y0 >= SSD1331_LCDHEIGHT)
y0 = SSD1331_LCDHEIGHT - 1;
if (x1 >= SSD1331_LCDWIDTH)
x1 = SSD1331_LCDWIDTH - 1;
if (y1 >= SSD1331_LCDHEIGHT)
y1 = SSD1331_LCDHEIGHT - 1;
if (x0 < 0)
x0 = 0;
if (y0 < 0)
y0 = 0;
if (x1 < 0)
x1 = 0;
if (y1 < 0)
y1 = 0;
 
buffer[0] = SSD1331_CMD_DRAWLINE;
buffer[1] = x0;
buffer[2] = y0;
buffer[3] = x1;
buffer[4] = y1;
buffer[5] = (color >> 11) << 1;
buffer[6] = (color >> 5) & 0x3F;
buffer[7] = (color << 1) & 0x3F;
 
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(buffer, 8);
}
 
void SSD1331_Draw_Rect(int tx0, int ty0, int tx1, int ty1, unsigned int color) {
unsigned char buffer[13];
int x0,y0,x1,y1;
// check rotation, move pixel around if necessary
switch (GFX_getRotation()) {
case 0:
x0 = tx0;
y0 = ty0;
x1 = tx1;
y1 = ty1;
break;
case 1:
x0 = SSD1331_LCDWIDTH - ty1 - 1;
y0 = tx0;
x1 = SSD1331_LCDWIDTH - ty0 - 1;
y1 = tx1;
break;
case 2:
x0 = SSD1331_LCDWIDTH - tx1 - 1;
y0 = SSD1331_LCDHEIGHT - ty1 - 1;
x1 = SSD1331_LCDWIDTH - tx0 - 1;
y1 = SSD1331_LCDHEIGHT - ty0 - 1;
break;
case 3:
x0 = ty0;
y0 = SSD1331_LCDHEIGHT - tx1 - 1;
x1 = ty1;
y1 = SSD1331_LCDHEIGHT - tx0 - 1;
break;
}
 
// Boundary check
if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT))
return;
if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH))
return;
if (x0 >= SSD1331_LCDWIDTH)
x0 = SSD1331_LCDWIDTH - 1;
if (y0 >= SSD1331_LCDHEIGHT)
y0 = SSD1331_LCDHEIGHT - 1;
if (x1 >= SSD1331_LCDWIDTH)
x1 = SSD1331_LCDWIDTH - 1;
if (y1 >= SSD1331_LCDHEIGHT)
y1 = SSD1331_LCDHEIGHT - 1;
if (x0 < 0)
x0 = 0;
if (y0 < 0)
y0 = 0;
if (x1 < 0)
x1 = 0;
if (y1 < 0)
y1 = 0;
 
buffer[0] = SSD1331_CMD_FILL;
buffer[1] = 0;
buffer[2] = SSD1331_CMD_DRAWRECT;
buffer[3] = x0;
buffer[4] = y0;
buffer[5] = x1;
buffer[6] = y1;
buffer[7] = (color >> 11) << 1;
buffer[8] = (color >> 5) & 0x3F;
buffer[9] = (color << 1) & 0x3F;
buffer[10] = 0;
buffer[11] = 0;
buffer[12] = 0;
 
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(buffer, 13);
}
 
void SSD1331_Fill_Rect(int tx0, int ty0, int tx1, int ty1, unsigned int color) {
unsigned char buffer[13];
int x0,y0,x1,y1;
// check rotation, move pixel around if necessary
switch (GFX_getRotation()) {
case 0:
x0 = tx0;
y0 = ty0;
x1 = tx1;
y1 = ty1;
break;
case 1:
x0 = SSD1331_LCDWIDTH - ty1 - 1;
y0 = tx0;
x1 = SSD1331_LCDWIDTH - ty0 - 1;
y1 = tx1;
break;
case 2:
x0 = SSD1331_LCDWIDTH - tx1 - 1;
y0 = SSD1331_LCDHEIGHT - ty1 - 1;
x1 = SSD1331_LCDWIDTH - tx0 - 1;
y1 = SSD1331_LCDHEIGHT - ty0 - 1;
break;
case 3:
x0 = ty0;
y0 = SSD1331_LCDHEIGHT - tx1 - 1;
x1 = ty1;
y1 = SSD1331_LCDHEIGHT - tx0 - 1;
break;
}
 
// Boundary check
if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT))
return;
if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH))
return;
if (x0 >= SSD1331_LCDWIDTH)
x0 = SSD1331_LCDWIDTH - 1;
if (y0 >= SSD1331_LCDHEIGHT)
y0 = SSD1331_LCDHEIGHT - 1;
if (x1 >= SSD1331_LCDWIDTH)
x1 = SSD1331_LCDWIDTH - 1;
if (y1 >= SSD1331_LCDHEIGHT)
y1 = SSD1331_LCDHEIGHT - 1;
if (x0 < 0)
x0 = 0;
if (y0 < 0)
y0 = 0;
if (x1 < 0)
x1 = 0;
if (y1 < 0)
y1 = 0;
 
buffer[0] = SSD1331_CMD_FILL;
buffer[1] = 1;
buffer[2] = SSD1331_CMD_DRAWRECT;
buffer[3] = x0;
buffer[4] = y0;
buffer[5] = x1;
buffer[6] = y1;
buffer[7] = (color >> 11) << 1;
buffer[8] = (color >> 5) & 0x3F;
buffer[9] = (color << 1) & 0x3F;
buffer[10] = (color >> 11) << 1;
buffer[11] = (color >> 5) & 0x3F;
buffer[12] = (color << 1) & 0x3F;
 
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(buffer, 13);
 
Delay1KTCYx(4);
}
 
void SSD1331_Clear_Display() {
unsigned char buffer[5];
 
buffer[0] = SSD1331_CMD_CLEARWINDOW;
buffer[1] = 0;
buffer[2] = 0;
buffer[3] = SSD1331_LCDWIDTH-1;
buffer[4] = SSD1331_LCDHEIGHT-1;
 
LATBbits.LATB5 = 0; // D/C low (cmd)
SPI2_Write(buffer, 5);
 
Delay1KTCYx(4);
}
 
unsigned int SSD1331_Color565(unsigned char r, unsigned char g, unsigned char b) {
unsigned int c;
c = r >> 3;
c <<= 6;
c |= g >> 2;
c <<= 5;
c |= b >> 3;
 
return c;
}
 
void SSD1331_Test_DrawLines(unsigned int color) {
int x, y;
GFX_clearScreen();
for (x = 0; x < GFX_width() - 1; x += 6) {
GFX_drawLine(0, 0, x, GFX_height() - 1, color);
}
for (y = 0; y < GFX_height() - 1; y += 6) {
GFX_drawLine(0, 0, GFX_width() - 1, y, color);
}
 
GFX_clearScreen();
for (x = 0; x < GFX_width() - 1; x += 6) {
GFX_drawLine(GFX_width() - 1, 0, x, GFX_height() - 1, color);
}
for (y = 0; y < GFX_height() - 1; y += 6) {
GFX_drawLine(GFX_width() - 1, 0, 0, y, color);
}
 
GFX_clearScreen();
for (x = 0; x < GFX_width() - 1; x += 6) {
GFX_drawLine(0, GFX_height() - 1, x, 0, color);
}
for (y = 0; y < GFX_height() - 1; y += 6) {
GFX_drawLine(0, GFX_height() - 1, GFX_width() - 1, y, color);
}
 
GFX_clearScreen();
for (x = 0; x < GFX_width() - 1; x += 6) {
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, x, 0, color);
}
for (y = 0; y < GFX_height() - 1; y += 6) {
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, 0, y, color);
}
}
 
void SSD1331_Test_DrawRect(unsigned int color) {
int x;
GFX_clearScreen();
if (GFX_height() < GFX_width()) {
for (x = 0; x < GFX_height() - 1; x += 6) {
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color);
}
} else {
for (x = 0; x < GFX_width() - 1; x += 6) {
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color);
}
}
}
 
void SSD1331_Test_FillRect(unsigned int color1, unsigned int color2) {
int x;
GFX_clearScreen();
if (GFX_height() < GFX_width()) {
for (x = GFX_height() - 1; x > 6; x -= 6) {
GFX_fillRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color1);
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color2);
}
} else {
for (x = GFX_width() - 1; x > 6; x -= 6) {
GFX_fillRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color1);
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color2);
}
}
}
 
void SSD1331_Test_DrawCircle(unsigned int radius, unsigned int color) {
int x, y;
for (x = 0; x < GFX_width() - 1 + radius; x += radius * 2) {
for (y = 0; y < GFX_height() - 1 + radius; y += radius * 2) {
GFX_drawCircle(x, y, radius, color);
}
}
}
 
void SSD1331_Test_FillCircle(unsigned int radius, unsigned int color) {
unsigned char x, y;
for (x = radius; x < GFX_width() - 1; x += radius * 2) {
for (y = radius; y < GFX_height() - 1; y += radius * 2) {
GFX_fillCircle(x, y, radius, color);
}
}
}
 
void SSD1331_Test_DrawTria(void) {
int color = 0xF800;
int t;
int w = GFX_width() / 2;
int x = GFX_height();
int y = 0;
int z = GFX_width();
GFX_clearScreen();
for (t = 0; t <= 15; t += 1) {
GFX_drawTriangle(w, y, y, x, z, x, color);
x -= 4;
y += 4;
z -= 4;
color += 100;
}
}
 
void SSD1331_Test_DrawRoundRect(void) {
int color = 100;
int i, t, x, y, w, h;
GFX_clearScreen();
for (t = 0; t <= 4; t += 1) {
x = 0;
y = 0;
w = GFX_width();
h = GFX_height();
for (i = 0; i <= 24; i += 1) {
GFX_drawRoundRect(x, y, w, h, 5, color);
x += 2;
y += 3;
w -= 4;
h -= 6;
color += 1100;
}
color += 100;
}
}
 
void SSD1331_Test_MediaButtons(void) {
// play
GFX_clearScreen();
GFX_fillRoundRect(25, 10, 78, 60, 8, SSD1331_WHITE);
GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_RED);
Delay10KTCYx(100);
// pause
GFX_fillRoundRect(25, 90, 78, 60, 8, SSD1331_WHITE);
GFX_fillRoundRect(39, 98, 20, 45, 5, SSD1331_GREEN);
GFX_fillRoundRect(69, 98, 20, 45, 5, SSD1331_GREEN);
Delay10KTCYx(100);
// play color
GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_BLUE);
Delay10KTCYx(100);
// pause color
GFX_fillRoundRect(39, 98, 20, 45, 5, SSD1331_RED);
GFX_fillRoundRect(69, 98, 20, 45, 5, SSD1331_RED);
// play color
GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_GREEN);
}
 
void SSD1331_Test_Pattern(void) {
unsigned char buffer[2];
unsigned int i, j;
SSD1331_GoTo(0, 0);
 
for (i = 0; i < 64; i++) {
for (j = 0; j < 96; j++) {
if (i > 55) {
buffer[0] = (SSD1331_WHITE >> 8);
buffer[1] = (SSD1331_WHITE);
} else if (i > 47) {
buffer[0] = (SSD1331_BLUE >> 8);
buffer[1] = (SSD1331_BLUE);
} else if (i > 39) {
buffer[0] = (SSD1331_GREEN >> 8);
buffer[1] = (SSD1331_GREEN);
} else if (i > 31) {
buffer[0] = (SSD1331_CYAN >> 8);
buffer[1] = (SSD1331_CYAN);
} else if (i > 23) {
buffer[0] = (SSD1331_RED >> 8);
buffer[1] = (SSD1331_RED);
} else if (i > 15) {
buffer[0] = (SSD1331_MAGENTA >> 8);
buffer[1] = (SSD1331_MAGENTA);
} else if (i > 7) {
buffer[0] = (SSD1331_YELLOW >> 8);
buffer[1] = (SSD1331_YELLOW);
} else {
buffer[0] = (SSD1331_BLACK >> 8);
buffer[1] = (SSD1331_BLACK);
}
LATBbits.LATB5 = 1; // D/C high (data)
SPI2_Write(buffer, 2);
}
}
}
/PIC Stuff/PIC_27J13/oled_ssd1331.h
0,0 → 1,78
#ifndef OLED_SSD1331_H
#define OLED_SSD1331_H
 
#define SSD1331_LCDWIDTH 96
#define SSD1331_LCDHEIGHT 64
 
// Select one of these defines to set the pixel color order
#define SSD1331_COLORORDER_RGB
// #define SSD1331_COLORORDER_BGR
 
// SSD1331 Commands
#define SSD1331_CMD_DRAWLINE 0x21
#define SSD1331_CMD_DRAWRECT 0x22
#define SSD1331_CMD_CLEARWINDOW 0x25
#define SSD1331_CMD_FILL 0x26
#define SSD1331_CMD_SETCOLUMN 0x15
#define SSD1331_CMD_SETROW 0x75
#define SSD1331_CMD_CONTRASTA 0x81
#define SSD1331_CMD_CONTRASTB 0x82
#define SSD1331_CMD_CONTRASTC 0x83
#define SSD1331_CMD_MASTERCURRENT 0x87
#define SSD1331_CMD_SETREMAP 0xA0
#define SSD1331_CMD_STARTLINE 0xA1
#define SSD1331_CMD_DISPLAYOFFSET 0xA2
#define SSD1331_CMD_NORMALDISPLAY 0xA4
#define SSD1331_CMD_DISPLAYALLON 0xA5
#define SSD1331_CMD_DISPLAYALLOFF 0xA6
#define SSD1331_CMD_INVERTDISPLAY 0xA7
#define SSD1331_CMD_SETMULTIPLEX 0xA8
#define SSD1331_CMD_SETMASTER 0xAD
#define SSD1331_CMD_DISPLAYOFF 0xAE
#define SSD1331_CMD_DISPLAYON 0xAF
#define SSD1331_CMD_POWERMODE 0xB0
#define SSD1331_CMD_PRECHARGE 0xB1
#define SSD1331_CMD_CLOCKDIV 0xB3
#define SSD1331_CMD_PRECHARGEA 0x8A
#define SSD1331_CMD_PRECHARGEB 0x8B
#define SSD1331_CMD_PRECHARGEC 0x8C
#define SSD1331_CMD_PRECHARGELEVEL 0xBB
#define SSD1331_CMD_VCOMH 0xBE
 
// Color definitions
#define SSD1331_BLACK 0x0000
#define SSD1331_BLUE 0x001F
#define SSD1331_RED 0xF800
#define SSD1331_GREEN 0x07E0
#define SSD1331_CYAN 0x07FF
#define SSD1331_MAGENTA 0xF81F
#define SSD1331_YELLOW 0xFFE0
#define SSD1331_WHITE 0xFFFF
 
void SSD1331_Init(void);
void SSD1331_Begin(void);
void SSD1331_GoTo(int x, int y);
 
void SSD1331_Command(unsigned char c);
void SSD1331_Data(unsigned char d);
 
void SSD1331_Draw_Pixel(int x, int y, unsigned int color);
void SSD1331_Draw_Line(int x0, int y0, int x1, int y1, unsigned int color);
void SSD1331_Draw_Rect(int x0, int y0, int x1, int y1, unsigned int color);
void SSD1331_Fill_Rect(int x0, int y0, int x1, int y1, unsigned int color);
void SSD1331_Clear_Display(void);
 
unsigned int SSD1331_Color565(unsigned char r, unsigned char g, unsigned char b);
 
void SSD1331_Test_DrawLines(unsigned int color);
void SSD1331_Test_DrawRect(unsigned int color);
void SSD1331_Test_FillRect(unsigned int color1, unsigned int color2);
void SSD1331_Test_DrawCircle(unsigned int radius, unsigned int color);
void SSD1331_Test_FillCircle(unsigned int radius, unsigned int color);
void SSD1331_Test_DrawTria(void);
void SSD1331_Test_DrawRoundRect(void);
void SSD1331_Test_MediaButtons(void);
void SSD1331_Test_Pattern(void);
 
#endif /* OLED_SSD1331_H */
 
/PIC Stuff/PIC_27J13/spi.c
0,0 → 1,200
#include "maindefs.h"
#include "spi.h"
 
static SPI_DATA spi_data;
 
void SPI2_Init(unsigned char speed) {
// Set up SPI2 with specified pins
RPINR22 = 7; // SPI2 CLK Input (Pin RB4)
RPOR7 = 11; // SPI2 CLK Output (Pin RB4)
#ifndef SPI2_WRITE_ONLY
RPINR21 = 6; // SPI2 Data Input (Pin RB3)
#endif
RPOR5 = 10; // SPI2 Data Output (MOSI) (Pin RB2)
 
TRISBbits.TRISB4 = 0; // SPI2 clock pin (Pin RB4)
#ifndef SPI2_WRITE_ONLY
TRISBbits.TRISB3 = 1; // SPI2 data in pin (Pin RB3)(MISO)
#endif
TRISBbits.TRISB2 = 0; // SPI2 data out pin (Pin RB2)(MOSI)
 
TRISBbits.TRISB7 = 0; // SPI2 slave select (Pin RB7)
LATBbits.LATB7 = 1; // SPI2 SS high (Idle)
 
TRISBbits.TRISB6 = 0; // SPI2 reset (Pin RB6)
LATBbits.LATB6 = 1; // SPI2 reset active low
 
TRISBbits.TRISB5 = 0; // SPI2 D/C select (Pin RB5)
LATBbits.LATB5 = 0;
 
SSP2STATbits.SMP = 0; // Input is sampled in the middle of data output time
SSP2STATbits.CKE = 0; // Transmit occurs on transition from Idle to active clock state
 
if (speed == SPI2_FOSC_4)
SSP2CON1bits.SSPM = 0b0000; // Clock = FOSC/4
else if (speed == SPI2_FOSC_8)
SSP2CON1bits.SSPM = 0b1010; // Clock = FOSC/8
else if (speed == SPI2_FOSC_16)
SSP2CON1bits.SSPM = 0b0001; // Clock = FOSC/16
else
SSP2CON1bits.SSPM = 0b0010; // Clock = FOSC/64
 
SSP2CON1bits.CKP = 1; // Idle state for clock is a high level
SSP2CON1bits.SSPEN = 1; // Enable MSSP module
 
#ifdef SPI2_USE_INTERRUPT
PIE3bits.SSP2IE = 1; // Enable MSSP2 interrupt
#else
PIE3bits.SSP2IE = 0;
#endif
 
spi_data.buffer_in_len = 0;
spi_data.buffer_in_read_ind = 0;
spi_data.buffer_in_write_ind = 0;
spi_data.buffer_out_ind = 0;
spi_data.buffer_out_len = 0;
}
 
void SPI2_Recv_Interrupt_Handler() {
unsigned char c;
 
if (SSP2STATbits.BF) { // Check if data receive flag is set
if (spi_data.buffer_in_len == MAXSPIBUF - 1) {
DBG_PRINT_SPI("SPI2: buffer overflow\r\n");
c = SSP2BUF; // Read SSP2BUF to clear it
} else {
// Save received data into buffer
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
spi_data.buffer_in_write_ind = 0;
} else {
spi_data.buffer_in_write_ind++;
}
spi_data.buffer_in_len++;
 
// Put next byte in SSP2BUF for transmit
if (spi_data.buffer_out_ind != spi_data.buffer_out_len) {
SSP2BUF = spi_data.buffer_out[spi_data.buffer_out_ind];
spi_data.buffer_out_ind++;
} else {
LATBbits.LATB2 = 1; // Bring SS line high
spi_data.buffer_out_ind = 0;
spi_data.buffer_out_len = 0;
}
}
}
}
 
void SPI2_Write(unsigned char *msg, unsigned int length) {
#ifdef SPI2_USE_INTERRUPT
unsigned char i;
spi_data.buffer_out_len = length;
spi_data.buffer_out_ind = 1;
for (i = 0; i < length; i++) {
spi_data.buffer_out[i] = msg[i];
}
LATBbits.LATB7 = 0; // Bring SS line low
SSP2BUF = spi_data.buffer_out[0]; // Transmit first byte
#else
unsigned int i = 0;
unsigned char tmp = 0;
LATBbits.LATB7 = 0;
while (i != length) {
SSP2BUF = msg[i];
i++;
while (!SSP2STATbits.BF);
 
#ifndef SPI2_WRITE_ONLY
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
spi_data.buffer_in_write_ind = 0;
} else {
spi_data.buffer_in_write_ind++;
}
spi_data.buffer_in_len++;
#else
// Read data in buffer to clear it
tmp = SSP2BUF;
#endif
}
LATBbits.LATB7 = 1;
#endif
}
 
void SPI2_Write_Repeat(unsigned char c, unsigned int length) {
#ifdef SPI2_USE_INTERRUPT
// TODO
#else
unsigned int i = 0;
unsigned char tmp = 0;
LATBbits.LATB7 = 0;
while (i != length) {
SSP2BUF = c;
i++;
while (!SSP2STATbits.BF);
 
#ifndef SPI2_WRITE_ONLY
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
spi_data.buffer_in_write_ind = 0;
} else {
spi_data.buffer_in_write_ind++;
}
spi_data.buffer_in_len++;
#else
// Read data in buffer to clear it
tmp = SSP2BUF;
#endif
}
LATBbits.LATB7 = 1;
#endif
}
 
void SPI2_Read(unsigned char length) {
#ifdef SPI2_USE_INTERRUPT
unsigned char i;
spi_data.buffer_out_len = length;
spi_data.buffer_out_ind = 1;
for (i = 0; i < length; i++) {
spi_data.buffer_out[i] = 0x0;
}
LATBbits.LATB7 = 0; // Bring SS line low
SSP2BUF = spi_data.buffer_out[0]; // Transmit first byte
#else
unsigned char i = 0;
LATBbits.LATB7 = 0;
 
for (i = 0; i < length; i++) {
SSP2BUF = 0x0;
while (!SSP2STATbits.BF);
 
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
spi_data.buffer_in_write_ind = 0;
} else {
spi_data.buffer_in_write_ind++;
}
spi_data.buffer_in_len++;
}
LATBbits.LATB7 = 1;
#endif
}
 
unsigned char SPI2_Buffer_Len() {
return spi_data.buffer_in_len;
}
 
unsigned char SPI2_Buffer_Read(unsigned char* buffer) {
unsigned char i = 0;
while (spi_data.buffer_in_len != 0) {
buffer[i] = spi_data.buffer_in[spi_data.buffer_in_read_ind];
i++;
if (spi_data.buffer_in_read_ind == MAXSPIBUF - 1) {
spi_data.buffer_in_read_ind = 0;
} else {
spi_data.buffer_in_read_ind++;
}
spi_data.buffer_in_len--;
}
return i;
}
/PIC Stuff/PIC_27J13/spi.h
0,0 → 1,39
#ifndef SPI_H
#define SPI_H
 
#define MAXSPIBUF 64
 
// Option to use interrupt. If interrupt are used, SPI write does not block but
// there is a longer delay between reading/writing data
//#define SPI2_USE_INTERRUPT
 
// Option to write only
#define SPI2_WRITE_ONLY
 
// SPI speed selection
#define SPI2_FOSC_64 1
#define SPI2_FOSC_16 2
#define SPI2_FOSC_8 3
#define SPI2_FOSC_4 4
 
typedef struct __SPI_DATA {
unsigned char buffer_in[MAXSPIBUF];
unsigned char buffer_in_read_ind;
unsigned char buffer_in_write_ind;
unsigned char buffer_in_len;
 
unsigned char buffer_out[MAXSPIBUF];
unsigned char buffer_out_ind;
unsigned char buffer_out_len;
} SPI_DATA;
 
void SPI2_Init(unsigned char speed);
void SPI2_Recv_Interrupt_Handler(void);
void SPI2_Write(unsigned char *msg, unsigned int length);
void SPI2_Write_Repeat(unsigned char c, unsigned int length);
void SPI2_Read(unsigned char length);
unsigned char SPI2_Buffer_Len(void);
unsigned char SPI2_Buffer_Read(unsigned char *buffer);
 
#endif /* SPI_H */
 
/PIC Stuff/PIC_27J13/timers.c
1,9 → 1,7
/* The processor calls these handlers when an interrupt is triggered */
#include "maindefs.h"
#include "msg_queues.h"
#include <timers.h>
#include "timers.h"
#include "pwm.h"
 
void timers_init() {
/*--------------------Timer Delay Formulas-------------------- */
11,10 → 9,9
/* Delay = (256 - InitTMR0 * Prescaler) / (Frequency / 4) */
/* ----------------------------------------------------------- */
#ifdef _BASE_STATION
 
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16);
T0CONbits.TMR0ON = 0; // Timer 0 initially off
#endif
 
// // Set timer 1 to overflow every two seconds
// OpenTimer1(TIMER_INT_ON & T1_16BIT_RW &
22,7 → 19,6
// T1_OSC1EN_ON & T1_SYNC_EXT_OFF,
// TIMER_GATE_OFF & TIMER_GATE_INT_OFF);
#ifdef _REMOTE
// Open timer 2 for ECCP1 (PWM)
OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
 
30,18 → 26,16
OpenTimer3(TIMER_INT_ON & T3_16BIT_RW & T3_SOURCE_FOSC_4 &
T3_OSC1EN_OFF & T3_PS_1_1 & T3_SYNC_EXT_OFF, TIMER_GATE_OFF);
T3CONbits.TMR3ON = 0; // Timer 3 initially off
#endif
}
 
// Interrupt handler for timer 0
void timer0_interrupt_handler() {
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_TIMER0, (void *) 0);
}
 
void timer0_enable() {
T0CONbits.TMR0ON = 1;
}
 
void timer0_disable() {
T0CONbits.TMR0ON = 0;
}
48,37 → 42,16
 
// Interrupt handler for timer 1
void timer1_interrupt_handler() {
// Set timer to overflow every 10ms
WriteTimer1(62259);
}
 
void timer3_interrupt_handler() {
if (!pwm_on) {
// Turn on PWM
pwm_start();
pwm_on = 1;
WriteTimer3(0xE500); // Send 38kHz pulses for 600us
} else {
// Turn off PWM
pwm_stop();
pwm_on = 0;
WriteTimer3(0xE500); // Send low for 0.6ms
// WriteTimer3(0xD000); // Send low for 1ms
// WriteTimer3(0xA000); // Send low for 2ms
// WriteTimer3(0x1000); // Send low for 5ms
}
 
}
 
void timer3_enable() {
// Enable timer and start PWM
T3CONbits.TMR3ON = 1;
pwm_start();
pwm_on = 1;
}
 
void timer3_disable() {
// Disable timer and stop PWM
T3CONbits.TMR3ON = 0;
pwm_stop();
pwm_on = 0;
}
/PIC Stuff/PIC_27J13/uart.c
19,10 → 19,16
RCSTA1bits.SPEN = 1; // Serial port enable
TXSTA1bits.TX9 = 0; // 8 bit transmission
RCSTA1bits.RX9 = 0; // 8 bit reception
TXSTA1bits.TXEN = 0; // Enable transmission
RCSTA1bits.CREN = 1; // Continuous receive mode
#ifdef _DEBUG // In debug mode we want to have TXEN constantly enabled
TXSTA1bits.TXEN = 1; // TX is always enabled
PIE1bits.TX1IE = 0; // Disable TX interrupt
#else
TXSTA1bits.TXEN = 0; // Enable transmission
PIE1bits.TX1IE = 1; // Enable TX interrupt
#endif
 
PIE1bits.RC1IE = 1; // Enable RX interrupt
 
// Initialize the buffer that holds UART messages