diff options
author | Paulo Henrique Silva <ph.silva@gmail.com> | 2014-10-26 20:55:22 -0200 |
---|---|---|
committer | Paulo Henrique Silva <ph.silva@gmail.com> | 2014-10-26 20:55:22 -0200 |
commit | d5c8d896d87e02d32d0c0758a09f051c141006f6 (patch) | |
tree | 50e2788e5dfc63db909a3613fff6934a0e80b153 /gerber | |
parent | d0eedf3dd7ee4fbf19f51de319e48dd964b93561 (diff) | |
parent | 4f076d7b769b0f488888d268a9a199b7545afdd7 (diff) | |
download | gerbonara-d5c8d896d87e02d32d0c0758a09f051c141006f6.tar.gz gerbonara-d5c8d896d87e02d32d0c0758a09f051c141006f6.tar.bz2 gerbonara-d5c8d896d87e02d32d0c0758a09f051c141006f6.zip |
Merge pull request #4 from hamiltonkibbe/master
Many fixes in parsing, rendering and new features
Diffstat (limited to 'gerber')
35 files changed, 17875 insertions, 869 deletions
diff --git a/gerber/__init__.py b/gerber/__init__.py index 0bf7c24..1a11159 100644 --- a/gerber/__init__.py +++ b/gerber/__init__.py @@ -14,3 +14,13 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +""" +Gerber Tools +============ +**Gerber Tools** + +gerber-tools provides utilities for working with Gerber (RS-274X) and Excellon +files in python. +""" + +from .common import read
\ No newline at end of file diff --git a/gerber/__main__.py b/gerber/__main__.py index 6f861cf..71e3bfc 100644 --- a/gerber/__main__.py +++ b/gerber/__main__.py @@ -10,22 +10,32 @@ # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. if __name__ == '__main__': - from .parser import GerberParser - from .render import GerberContext - + from .common import read + from .render import GerberSvgContext import sys if len(sys.argv) < 2: print >> sys.stderr, "Usage: python -m gerber <filename> <filename>..." sys.exit(1) + ctx = GerberSvgContext() + ctx.set_alpha(0.95) for filename in sys.argv[1:]: print "parsing %s" % filename - g = GerberParser(GerberContext()) - g.parse(filename) + if 'GTO' in filename or 'GBO' in filename: + ctx.set_color((1, 1, 1)) + ctx.set_alpha(0.8) + elif 'GTS' in filename or 'GBS' in filename: + ctx.set_color((0.2, 0.2, 0.75)) + ctx.set_alpha(0.8) + gerberfile = read(filename) + gerberfile.render(ctx) + + print('Saving image to test.svg') + ctx.dump('test.svg') diff --git a/gerber/cam.py b/gerber/cam.py new file mode 100644 index 0000000..051c3b5 --- /dev/null +++ b/gerber/cam.py @@ -0,0 +1,178 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +CAM File +============ +**AM file classes** + +This module provides common base classes for Excellon/Gerber CNC files +""" + + +class FileSettings(object): + """ CAM File Settings + + Provides a common representation of gerber/excellon file settings + """ + def __init__(self, notation='absolute', units='inch', + zero_suppression='trailing', format=(2, 5)): + if notation not in ['absolute', 'incremental']: + raise ValueError('Notation must be either absolute or incremental') + self.notation = notation + + if units not in ['inch', 'metric']: + raise ValueError('Units must be either inch or metric') + self.units = units + + if zero_suppression not in ['leading', 'trailing']: + raise ValueError('Zero suppression must be either leading or \ + trailling') + self.zero_suppression = zero_suppression + + if len(format) != 2: + raise ValueError('Format must be a tuple(n=2) of integers') + self.format = format + + def __getitem__(self, key): + if key == 'notation': + return self.notation + elif key == 'units': + return self.units + elif key == 'zero_suppression': + return self.zero_suppression + elif key == 'format': + return self.format + else: + raise KeyError() + + def __setitem__(self, key, value): + if key == 'notation': + if value not in ['absolute', 'incremental']: + raise ValueError('Notation must be either \ + absolute or incremental') + self.notation = value + elif key == 'units': + if value not in ['inch', 'metric']: + raise ValueError('Units must be either inch or metric') + self.units = value + elif key == 'zero_suppression': + if value not in ['leading', 'trailing']: + raise ValueError('Zero suppression must be either leading or \ + trailling') + self.zero_suppression = value + elif key == 'format': + if len(value) != 2: + raise ValueError('Format must be a tuple(n=2) of integers') + self.format = value + + def __eq__(self, other): + return (self.notation == other.notation and + self.units == other.units and + self.zero_suppression == other.zero_suppression and + self.format == other.format) + + + +class CamFile(object): + """ Base class for Gerber/Excellon files. + + Provides a common set of settings parameters. + + Parameters + ---------- + settings : FileSettings + The current file configuration. + + primitives : iterable + List of primitives in the file. + + filename : string + Name of the file that this CamFile represents. + + layer_name : string + Name of the PCB layer that the file represents + + Attributes + ---------- + settings : FileSettings + File settings as a FileSettings object + + notation : string + File notation setting. May be either 'absolute' or 'incremental' + + units : string + File units setting. May be 'inch' or 'metric' + + zero_suppression : string + File zero-suppression setting. May be either 'leading' or 'trailling' + + format : tuple (<int>, <int>) + File decimal representation format as a tuple of (integer digits, + decimal digits) + """ + + def __init__(self, statements=None, settings=None, primitives=None, + filename=None, layer_name=None): + if settings is not None: + self.notation = settings['notation'] + self.units = settings['units'] + self.zero_suppression = settings['zero_suppression'] + self.format = settings['format'] + else: + self.notation = 'absolute' + self.units = 'inch' + self.zero_suppression = 'trailing' + self.format = (2, 5) + self.statements = statements if statements is not None else [] + self.primitives = primitives + self.filename = filename + self.layer_name = layer_name + + @property + def settings(self): + """ File settings + + Returns + ------- + settings : FileSettings (dict-like) + A FileSettings object with the specified configuration. + """ + return FileSettings(self.notation, self.units, self.zero_suppression, + self.format) + + @property + def bounds(self): + """ File baundaries + """ + pass + + def render(self, ctx, filename=None): + """ Generate image of layer. + + Parameters + ---------- + ctx : :class:`GerberContext` + GerberContext subclass used for rendering the image + + filename : string <optional> + If provided, save the rendered image to `filename` + """ + ctx.set_bounds(self.bounds) + for p in self.primitives: + ctx.render(p) + if filename is not None: + ctx.dump(filename) diff --git a/gerber/common.py b/gerber/common.py new file mode 100644 index 0000000..6e8c862 --- /dev/null +++ b/gerber/common.py @@ -0,0 +1,42 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def read(filename): + """ Read a gerber or excellon file and return a representative object. + + Parameters + ---------- + filename : string + Filename of the file to read. + + Returns + ------- + file : CncFile subclass + CncFile object representing the file, either GerberFile or + ExcellonFile. Returns None if file is not an Excellon or Gerber file. + """ + import rs274x + import excellon + from utils import detect_file_format + fmt = detect_file_format(filename) + if fmt == 'rs274x': + return rs274x.read(filename) + elif fmt == 'excellon': + return excellon.read(filename) + else: + return None diff --git a/gerber/excellon.py b/gerber/excellon.py index 1e746ad..9d09576 100755 --- a/gerber/excellon.py +++ b/gerber/excellon.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*-
# Copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be>
-
+ # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
@@ -13,138 +13,229 @@ # distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-import re
-from itertools import tee, izip
-from .utils import parse_gerber_value
-
-
-
-
-class Tool(object):
-
- @classmethod
- def from_line(cls, line, settings):
- commands = re.split('([BCFHSTZ])', line)[1:]
- commands = [(command, value) for command, value in pairwise(commands)]
- args = {}
- format = settings['format']
- zero_suppression = settings['zero_suppression']
- for cmd, val in commands:
- if cmd == 'B':
- args['retract_rate'] = parse_gerber_value(val, format, zero_suppression)
- elif cmd == 'C':
- args['diameter'] = parse_gerber_value(val, format, zero_suppression)
- elif cmd == 'F':
- args['feed_rate'] = parse_gerber_value(val, format, zero_suppression)
- elif cmd == 'H':
- args['max_hit_count'] = parse_gerber_value(val, format, zero_suppression)
- elif cmd == 'S':
- args['rpm'] = 1000 * parse_gerber_value(val, format, zero_suppression)
- elif cmd == 'T':
- args['number'] = int(val)
- elif cmd == 'Z':
- args['depth_offset'] = parse_gerber_value(val, format, zero_suppression)
- return cls(settings, **args)
-
- def __init__(self, settings, **kwargs):
- self.number = kwargs.get('number')
- self.feed_rate = kwargs.get('feed_rate')
- self.retract_rate = kwargs.get('retract_rate')
- self.rpm = kwargs.get('rpm')
- self.diameter = kwargs.get('diameter')
- self.max_hit_count = kwargs.get('max_hit_count')
- self.depth_offset = kwargs.get('depth_offset')
- self.units = settings.get('units', 'inch')
-
- def __repr__(self):
- unit = 'in.' if self.units == 'inch' else 'mm'
- return '<Tool %d: %0.3f%s dia.>' % (self.number, self.diameter, unit)
-
+# limitations under the License. + +"""
+Excellon File module
+====================
+**Excellon file classes**
+
+This module provides Excellon file classes and parsing utilities
+"""
+
+
+from .excellon_statements import *
+from .cam import CamFile, FileSettings
+from .primitives import Drill
+import math
+
+def read(filename):
+ """ Read data from filename and return an ExcellonFile
+ Parameters
+ ----------
+ filename : string
+ Filename of file to parse
+
+ Returns
+ -------
+ file : :class:`gerber.excellon.ExcellonFile`
+ An ExcellonFile created from the specified file.
+
+ """
+ detected_settings = detect_excellon_format(filename)
+ settings = FileSettings(**detected_settings)
+ zeros = ''
+ return ExcellonParser(settings).parse(filename)
+
+
+class ExcellonFile(CamFile):
+ """ A class representing a single excellon file
+
+ The ExcellonFile class represents a single excellon file.
+
+ Parameters
+ ----------
+ tools : list
+ list of gerber file statements
+
+ hits : list of tuples
+ list of drill hits as (<Tool>, (x, y))
+ settings : dict
+ Dictionary of gerber file settings
+
+ filename : string
+ Filename of the source gerber file
+
+ Attributes
+ ----------
+ units : string
+ either 'inch' or 'metric'.
+
+ """
+ def __init__(self, statements, tools, hits, settings, filename=None):
+ super(ExcellonFile, self).__init__(statements=statements,
+ settings=settings,
+ filename=filename)
+ self.tools = tools
+ self.hits = hits
+ self.primitives = [Drill(position, tool.diameter)
+ for tool, position in self.hits]
+
+ @property
+ def bounds(self):
+ xmin = ymin = 100000000000
+ xmax = ymax = -100000000000
+ for tool, position in self.hits:
+ radius = tool.diameter / 2.
+ x = position[0]
+ y = position[1]
+ xmin = min(x - radius, xmin)
+ xmax = max(x + radius, xmax)
+ ymin = min(y - radius, ymin)
+ ymax = max(y + radius, ymax)
+ return ((xmin, xmax), (ymin, ymax))
+
+ def report(self):
+ """ Print drill report
+ """
+ pass
+
+
+ def write(self, filename):
+ with open(filename, 'w') as f:
+ for statement in self.statements:
+ f.write(statement.to_excellon() + '\n')
class ExcellonParser(object):
- def __init__(self, ctx=None):
- self.ctx=ctx
+ """ Excellon File Parser
+
+ Parameters
+ ----------
+ settings : FileSettings or dict-like
+ Excellon file settings to use when interpreting the excellon file.
+ """
+ def __init__(self, settings=None):
self.notation = 'absolute'
self.units = 'inch'
self.zero_suppression = 'trailing'
- self.format = (2,5)
+ self.format = (2, 5)
self.state = 'INIT'
+ self.statements = []
self.tools = {}
self.hits = []
self.active_tool = None
- self.pos = [0., 0.]
- if ctx is not None:
- zeros = 'L' if self.zero_suppression == 'leading' else 'T'
- x = self.format
- y = self.format
- self.ctx.set_coord_format(zeros, x, y)
+ self.pos = [0., 0.] + if settings is not None:
+ self.units = settings.units
+ self.zero_suppression = settings.zero_suppression
+ self.notation = settings.notation
+ self.format = settings.format
+
+
+ @property
+ def coordinates(self):
+ return [(stmt.x, stmt.y) for stmt in self.statements if isinstance(stmt, CoordinateStmt)]
+
+ @property
+ def bounds(self):
+ xmin = ymin = 100000000000
+ xmax = ymax = -100000000000
+ for x, y in self.coordinates:
+ if x is not None:
+ xmin = x if x < xmin else xmin
+ xmax = x if x > xmax else xmax
+ if y is not None:
+ ymin = y if y < ymin else ymin
+ ymax = y if y > ymax else ymax
+ return ((xmin, xmax), (ymin, ymax))
+
+ @property
+ def hole_sizes(self):
+ return [stmt.diameter for stmt in self.statements if isinstance(stmt, ExcellonTool)]
+
+ @property
+ def hole_count(self):
+ return len(self.hits)
+
def parse(self, filename):
with open(filename, 'r') as f:
for line in f:
- self._parse(line)
-
- def dump(self, filename='teste.svg'):
- if self.ctx is not None:
- self.ctx.dump(filename)
-
+ self._parse(line.strip())
+ return ExcellonFile(self.statements, self.tools, self.hits,
+ self._settings(), filename)
+
def _parse(self, line):
- if 'M48' in line:
+ #line = line.strip()
+ zs = self._settings().zero_suppression
+ fmt = self._settings().format
+ if line[0] == ';':
+ self.statements.append(CommentStmt.from_excellon(line))
+
+ elif line[:3] == 'M48':
+ self.statements.append(HeaderBeginStmt())
self.state = 'HEADER'
-
- if 'G00' in line:
+
+ elif line[0] == '%':
+ self.statements.append(RewindStopStmt())
+ if self.state == 'HEADER':
+ self.state = 'DRILL'
+
+ elif line[:3] == 'M95':
+ self.statements.append(HeaderEndStmt())
+ if self.state == 'HEADER':
+ self.state = 'DRILL'
+
+ elif line[:3] == 'M30':
+ stmt = EndOfProgramStmt.from_excellon(line)
+ self.statements.append(stmt)
+
+ elif line[:3] == 'G00':
self.state = 'ROUT'
-
- if 'G05' in line:
- self.state = 'DRILL'
-
- elif line[0] == '%' and self.state == 'HEADER':
+
+ elif line[:3] == 'G05':
self.state = 'DRILL'
-
- if 'INCH' in line or line.strip() == 'M72':
- self.units = 'inch'
-
- elif 'METRIC' in line or line.strip() == 'M71':
- self.units = 'metric'
-
- if 'LZ' in line:
- self.zero_suppression = 'trailing'
-
- elif 'TZ' in line:
- self.zero_suppression = 'leading'
-
- if 'ICI' in line and 'ON' in line or line.strip() == 'G91':
- self.notation = 'incremental'
-
- if 'ICI' in line and 'OFF' in line or line.strip() == 'G90':
- self.notation = 'absolute'
-
- zs = self._settings()['zero_suppression']
- fmt = self._settings()['format']
-
- # tool definition
- if line[0] == 'T' and self.state == 'HEADER':
- tool = Tool.from_line(line,self._settings())
+
+ elif (('INCH' in line or 'METRIC' in line) and
+ ('LZ' in line or 'TZ' in line)):
+ stmt = UnitStmt.from_excellon(line)
+ self.units = stmt.units
+ self.zero_suppression = stmt.zero_suppression
+ self.statements.append(stmt)
+
+ elif line[:3] == 'M71' or line [:3] == 'M72':
+ stmt = MeasuringModeStmt.from_excellon(line)
+ self.units = stmt.units
+ self.statements.append(stmt)
+
+ elif line[:3] == 'ICI':
+ stmt = IncrementalModeStmt.from_excellon(line)
+ self.notation = 'incremental' if stmt.mode == 'on' else 'absolute'
+ self.statements.append(stmt)
+
+ elif line[:3] == 'VER':
+ stmt = VersionStmt.from_excellon(line)
+ self.statements.append(stmt)
+
+ elif line[:4] == 'FMAT':
+ stmt = FormatStmt.from_excellon(line)
+ self.statements.append(stmt)
+
+ elif line[0] == 'T' and self.state == 'HEADER':
+ tool = ExcellonTool.from_excellon(line, self._settings())
self.tools[tool.number] = tool
-
+ self.statements.append(tool)
+
elif line[0] == 'T' and self.state != 'HEADER':
- self.active_tool = self.tools[int(line.strip().split('T')[1])]
-
-
- if line[0] in ['X', 'Y']:
- x = None
- y = None
- if line[0] == 'X':
- splitline = line.strip('X').split('Y')
- x = parse_gerber_value(splitline[0].strip(), fmt, zs)
- if len(splitline) == 2:
- y = parse_gerber_value(splitline[1].strip(), fmt,zs)
- else:
- y = parse_gerber_value(line.strip(' Y'), fmt,zs)
-
+ stmt = ToolSelectionStmt.from_excellon(line)
+ self.active_tool = self.tools[stmt.tool]
+ self.statements.append(stmt)
+
+ elif line[0] in ['X', 'Y']:
+ stmt = CoordinateStmt.from_excellon(line, fmt, zs)
+ x = stmt.x
+ y = stmt.y
+ self.statements.append(stmt) if self.notation == 'absolute':
if x is not None:
self.pos[0] = x
@@ -155,26 +246,115 @@ class ExcellonParser(object): self.pos[0] += x
if y is not None:
self.pos[1] += y
- if self.state == 'DRILL':
- self.hits.append((self.active_tool, self.pos))
- if self.ctx is not None:
- self.ctx.drill(self.pos[0], self.pos[1],
- self.active_tool.diameter)
-
+ if self.state == 'DRILL': + self.hits.append((self.active_tool, tuple(self.pos)))
+ self.active_tool._hit()
+ else:
+ self.statements.append(UnknownStmt.from_excellon(line))
+
def _settings(self):
- return {'units':self.units, 'zero_suppression':self.zero_suppression,
- 'format': self.format}
-
-def pairwise(iterator):
- itr = iter(iterator)
- while True:
- yield tuple([itr.next() for i in range(2)])
-
-if __name__ == '__main__':
- from .render_svg import GerberSvgContext
- tools = []
- p = ExcellonParser(GerberSvgContext())
- p.parse('examples/ncdrill.txt')
- p.dump('excellon.svg')
-
-
\ No newline at end of file + return FileSettings(units=self.units, format=self.format,
+ zero_suppression=self.zero_suppression,
+ notation=self.notation)
+
+
+def detect_excellon_format(filename):
+ """ Detect excellon file decimal format and zero-suppression settings.
+
+ Parameters
+ ----------
+ filename : string
+ Name of the file to parse. This does not check if the file is actually
+ an Excellon file, so do that before calling this.
+
+ Returns
+ -------
+ settings : dict
+ Detected excellon file settings. Keys are
+ - `format`: decimal format as tuple (<int part>, <decimal part>)
+ - `zero_suppression`: zero suppression, 'leading' or 'trailing'
+ """
+ results = {}
+ detected_zeros = None
+ detected_format = None
+ zs_options = ('leading', 'trailing', )
+ format_options = ((2, 4), (2, 5), (3, 3),)
+
+ # Check for obvious clues:
+ p = ExcellonParser()
+ p.parse(filename)
+
+ # Get zero_suppression from a unit statement
+ zero_statements = [stmt.zero_suppression for stmt in p.statements
+ if isinstance(stmt, UnitStmt)]
+
+ # get format from altium comment
+ format_comment = [stmt.comment for stmt in p.statements
+ if isinstance(stmt, CommentStmt)
+ and 'FILE_FORMAT' in stmt.comment]
+
+ detected_format = (tuple([int(val) for val in
+ format_comment[0].split('=')[1].split(':')])
+ if len(format_comment) == 1 else None)
+ detected_zeros = zero_statements[0] if len(zero_statements) == 1 else None
+
+ # Bail out here if possible
+ if detected_format is not None and detected_zeros is not None:
+ return {'format': detected_format, 'zero_suppression': detected_zeros}
+
+ # Only look at remaining options
+ if detected_format is not None:
+ format_options = (detected_format,)
+ if detected_zeros is not None:
+ zs_options = (detected_zeros,)
+
+ # Brute force all remaining options, and pick the best looking one...
+ for zs in zs_options:
+ for fmt in format_options:
+ key = (fmt, zs)
+ settings = FileSettings(zero_suppression=zs, format=fmt)
+ try:
+ p = ExcellonParser(settings)
+ p.parse(filename)
+ size = tuple([t[1] - t[0] for t in p.bounds])
+ hole_area = 0.0
+ for hit in p.hits:
+ tool = hit[0]
+ hole_area += math.pow(math.pi * tool.diameter / 2., 2)
+ results[key] = (size, p.hole_count, hole_area)
+ except:
+ pass
+
+ # See if any of the dimensions are left with only a single option
+ formats = set(key[0] for key in results.iterkeys())
+ zeros = set(key[1] for key in results.iterkeys())
+ if len(formats) == 1:
+ detected_format = formats.pop()
+ if len(zeros) == 1:
+ detected_zeros = zeros.pop()
+
+ # Bail out here if we got everything....
+ if detected_format is not None and detected_zeros is not None:
+ return {'format': detected_format, 'zero_suppression': detected_zeros}
+
+ # Otherwise score each option and pick the best candidate
+ else:
+ scores = {}
+ for key in results.keys():
+ size, count, diameter = results[key]
+ scores[key] = _layer_size_score(size, count, diameter)
+ minscore = min(scores.values())
+ for key in scores.iterkeys():
+ if scores[key] == minscore:
+ return {'format': key[0], 'zero_suppression': key[1]}
+
+
+def _layer_size_score(size, hole_count, hole_area):
+ """ Heuristic used for determining the correct file number interpretation.
+ Lower is better.
+ """
+ board_area = size[0] * size[1]
+ hole_percentage = hole_area / board_area
+ hole_score = (hole_percentage - 0.25) ** 2
+ size_score = (board_area - 8) **2
+ return hole_score * size_score
diff --git a/gerber/excellon_statements.py b/gerber/excellon_statements.py new file mode 100644 index 0000000..feeda44 --- /dev/null +++ b/gerber/excellon_statements.py @@ -0,0 +1,431 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Excellon Statements +==================== +**Excellon file statement classes** + +""" + +from .utils import parse_gerber_value, write_gerber_value, decimal_string +import re + +__all__ = ['ExcellonTool', 'ToolSelectionStmt', 'CoordinateStmt', + 'CommentStmt', 'HeaderBeginStmt', 'HeaderEndStmt', + 'RewindStopStmt', 'EndOfProgramStmt', 'UnitStmt', + 'IncrementalModeStmt', 'VersionStmt', 'FormatStmt', 'LinkToolStmt', + 'MeasuringModeStmt', 'UnknownStmt', + ] + + +class ExcellonStatement(object): + """ Excellon Statement abstract base class + """ + @classmethod + def from_excellon(cls, line): + pass + + def to_excellon(self): + pass + + +class ExcellonTool(ExcellonStatement): + """ Excellon Tool class + + Parameters + ---------- + settings : FileSettings (dict-like) + File-wide settings. + + kwargs : dict-like + Tool settings from the excellon statement. Valid keys are: + - `diameter` : Tool diameter [expressed in file units] + - `rpm` : Tool RPM + - `feed_rate` : Z-axis tool feed rate + - `retract_rate` : Z-axis tool retraction rate + - `max_hit_count` : Number of hits allowed before a tool change + - `depth_offset` : Offset of tool depth from tip of tool. + + Attributes + ---------- + number : integer + Tool number from the excellon file + + diameter : float + Tool diameter in file units + + rpm : float + Tool RPM + + feed_rate : float + Tool Z-axis feed rate. + + retract_rate : float + Tool Z-axis retract rate + + depth_offset : float + Offset of depth measurement from tip of tool + + max_hit_count : integer + Maximum number of tool hits allowed before a tool change + + hit_count : integer + Number of tool hits in excellon file. + """ + + @classmethod + def from_excellon(cls, line, settings): + """ Create a Tool from an excellon file tool definition line. + + Parameters + ---------- + line : string + Tool definition line from an excellon file. + + settings : FileSettings (dict-like) + Excellon file-wide settings + + Returns + ------- + tool : Tool + An ExcellonTool representing the tool defined in `line` + """ + commands = re.split('([BCFHSTZ])', line)[1:] + commands = [(command, value) for command, value in pairwise(commands)] + args = {} + nformat = settings.format + zero_suppression = settings.zero_suppression + for cmd, val in commands: + if cmd == 'B': + args['retract_rate'] = parse_gerber_value(val, nformat, zero_suppression) + elif cmd == 'C': + args['diameter'] = parse_gerber_value(val, nformat, zero_suppression) + elif cmd == 'F': + args['feed_rate'] = parse_gerber_value(val, nformat, zero_suppression) + elif cmd == 'H': + args['max_hit_count'] = parse_gerber_value(val, nformat, zero_suppression) + elif cmd == 'S': + args['rpm'] = 1000 * parse_gerber_value(val, nformat, zero_suppression) + elif cmd == 'T': + args['number'] = int(val) + elif cmd == 'Z': + args['depth_offset'] = parse_gerber_value(val, nformat, zero_suppression) + return cls(settings, **args) + + @classmethod + def from_dict(cls, settings, tool_dict): + """ Create an ExcellonTool from a dict. + + Parameters + ---------- + settings : FileSettings (dict-like) + Excellon File-wide settings + + tool_dict : dict + Excellon tool parameters as a dict + + Returns + ------- + tool : ExcellonTool + An ExcellonTool initialized with the parameters in tool_dict. + """ + return cls(settings, tool_dict) + + def __init__(self, settings, **kwargs): + self.settings = settings + self.number = kwargs.get('number') + self.feed_rate = kwargs.get('feed_rate') + self.retract_rate = kwargs.get('retract_rate') + self.rpm = kwargs.get('rpm') + self.diameter = kwargs.get('diameter') + self.max_hit_count = kwargs.get('max_hit_count') + self.depth_offset = kwargs.get('depth_offset') + self.hit_count = 0 + + def to_excellon(self): + fmt = self.settings.format + zs = self.settings.format + stmt = 'T%d' % self.number + if self.retract_rate is not None: + stmt += 'B%s' % write_gerber_value(self.retract_rate, fmt, zs) + if self.feed_rate is not None: + stmt += 'F%s' % write_gerber_value(self.feed_rate, fmt, zs) + if self.max_hit_count is not None: + stmt += 'H%s' % write_gerber_value(self.max_hit_count, fmt, zs) + if self.rpm is not None: + if self.rpm < 100000.: + stmt += 'S%s' % write_gerber_value(self.rpm / 1000., fmt, zs) + else: + stmt += 'S%g' % self.rpm / 1000. + if self.diameter is not None: + stmt += 'C%s' % decimal_string(self.diameter, fmt[1], True) + if self.depth_offset is not None: + stmt += 'Z%s' % write_gerber_value(self.depth_offset, fmt, zs) + return stmt + + def _hit(self): + self.hit_count += 1 + + def __repr__(self): + unit = 'in.' if self.settings.units == 'inch' else 'mm' + return '<ExcellonTool %d: %0.3f%s dia.>' % (self.number, self.diameter, unit) + + +class ToolSelectionStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + """ Create a ToolSelectionStmt from an excellon file line. + + Parameters + ---------- + line : string + Line from an Excellon file + + Returns + ------- + tool_statement : ToolSelectionStmt + ToolSelectionStmt representation of `line.` + """ + line = line[1:] + compensation_index = None + tool = int(line[:2]) + if len(line) > 2: + compensation_index = int(line[2:]) + return cls(tool, compensation_index) + + def __init__(self, tool, compensation_index=None): + tool = int(tool) + compensation_index = (int(compensation_index) if compensation_index + is not None else None) + self.tool = tool + self.compensation_index = compensation_index + + def to_excellon(self): + stmt = 'T%02d' % self.tool + if self.compensation_index is not None: + stmt += '%02d' % self.compensation_index + return stmt + + +class CoordinateStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line, nformat=(2, 5), zero_suppression='trailing'): + x_coord = None + y_coord = None + if line[0] == 'X': + splitline = line.strip('X').split('Y') + x_coord = parse_gerber_value(splitline[0], nformat, + zero_suppression) + if len(splitline) == 2: + y_coord = parse_gerber_value(splitline[1], nformat, + zero_suppression) + else: + y_coord = parse_gerber_value(line.strip(' Y'), nformat, + zero_suppression) + return cls(x_coord, y_coord) + + def __init__(self, x=None, y=None): + self.x = x + self.y = y + + def to_excellon(self): + stmt = '' + if self.x is not None: + stmt += 'X%s' % write_gerber_value(self.x) + if self.y is not None: + stmt += 'Y%s' % write_gerber_value(self.y) + return stmt + + +class CommentStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + return cls(line.lstrip(';')) + + def __init__(self, comment): + self.comment = comment + + def to_excellon(self): + return ';%s' % self.comment + + +class HeaderBeginStmt(ExcellonStatement): + + def __init__(self): + pass + + def to_excellon(self): + return 'M48' + + +class HeaderEndStmt(ExcellonStatement): + + def __init__(self): + pass + + def to_excellon(self): + return 'M95' + + +class RewindStopStmt(ExcellonStatement): + + def __init__(self): + pass + + def to_excellon(self): + return '%' + + +class EndOfProgramStmt(ExcellonStatement): + + def __init__(self, x=None, y=None): + self.x = x + self.y = y + + def to_excellon(self): + stmt = 'M30' + if self.x is not None: + stmt += 'X%s' % write_gerber_value(self.x) + if self.y is not None: + stmt += 'Y%s' % write_gerber_value(self.y) + return stmt + + +class UnitStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + units = 'inch' if 'INCH' in line else 'metric' + zero_suppression = 'trailing' if 'LZ' in line else 'leading' + return cls(units, zero_suppression) + + def __init__(self, units='inch', zero_suppression='trailing'): + self.units = units.lower() + self.zero_suppression = zero_suppression + + def to_excellon(self): + stmt = '%s,%s' % ('INCH' if self.units == 'inch' else 'METRIC', + 'LZ' if self.zero_suppression == 'trailing' + else 'TZ') + return stmt + + +class IncrementalModeStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + return cls('off') if 'OFF' in line else cls('on') + + def __init__(self, mode='off'): + if mode.lower() not in ['on', 'off']: + raise ValueError('Mode may be "on" or "off"') + self.mode = mode + + def to_excellon(self): + return 'ICI,%s' % ('OFF' if self.mode == 'off' else 'ON') + + +class VersionStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + version = int(line.split(',')[1]) + return cls(version) + + def __init__(self, version=1): + version = int(version) + if version not in [1, 2]: + raise ValueError('Valid versions are 1 or 2') + self.version = version + + def to_excellon(self): + return 'VER,%d' % self.version + + +class FormatStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + fmt = int(line.split(',')[1]) + return cls(fmt) + + def __init__(self, format=1): + format = int(format) + if format not in [1, 2]: + raise ValueError('Valid formats are 1 or 2') + self.format = format + + def to_excellon(self): + return 'FMAT,%d' % self.format + + +class LinkToolStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + linked = [int(tool) for tool in line.split('/')] + return cls(linked) + + def __init__(self, linked_tools): + self.linked_tools = [int(x) for x in linked_tools] + + def to_excellon(self): + return '/'.join([str(x) for x in self.linked_tools]) + + +class MeasuringModeStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + if not ('M71' in line or 'M72' in line): + raise ValueError('Not a measuring mode statement') + return cls('inch') if 'M72' in line else cls('metric') + + def __init__(self, units='inch'): + units = units.lower() + if units not in ['inch', 'metric']: + raise ValueError('units must be "inch" or "metric"') + self.units = units + + def to_excellon(self): + return 'M72' if self.units == 'inch' else 'M71' + + +class UnknownStmt(ExcellonStatement): + + @classmethod + def from_excellon(cls, line): + return cls(line) + + def __init__(self, stmt): + self.stmt = stmt + + def to_excellon(self): + return self.stmt + + +def pairwise(iterator): + """ Iterate over list taking two elements at a time. + + e.g. [1, 2, 3, 4, 5, 6] ==> [(1, 2), (3, 4), (5, 6)] + """ + itr = iter(iterator) + while True: + yield tuple([itr.next() for i in range(2)]) diff --git a/gerber/gerber_statements.py b/gerber/gerber_statements.py new file mode 100644 index 0000000..e392ec5 --- /dev/null +++ b/gerber/gerber_statements.py @@ -0,0 +1,676 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +""" +Gerber (RS-274X) Statements +=========================== +**Gerber RS-274X file statement classes** + +""" +from .utils import parse_gerber_value, write_gerber_value, decimal_string + + +__all__ = ['FSParamStmt', 'MOParamStmt', 'IPParamStmt', 'OFParamStmt', + 'LPParamStmt', 'ADParamStmt', 'AMParamStmt', 'INParamStmt', + 'LNParamStmt', 'CoordStmt', 'ApertureStmt', 'CommentStmt', + 'EofStmt', 'QuadrantModeStmt', 'RegionModeStmt', 'UnknownStmt', + 'ParamStmt'] + + +class Statement(object): + """ Gerber statement Base class + + The statement class provides a type attribute. + + Parameters + ---------- + type : string + String identifying the statement type. + + Attributes + ---------- + type : string + String identifying the statement type. + """ + def __init__(self, stype): + self.type = stype + + def __str__(self): + s = "<{0} ".format(self.__class__.__name__) + + for key, value in self.__dict__.items(): + s += "{0}={1} ".format(key, value) + + s = s.rstrip() + ">" + return s + + +class ParamStmt(Statement): + """ Gerber parameter statement Base class + + The parameter statement class provides a parameter type attribute. + + Parameters + ---------- + param : string + two-character code identifying the parameter statement type. + + Attributes + ---------- + param : string + Parameter type code + """ + def __init__(self, param): + Statement.__init__(self, "PARAM") + self.param = param + + +class FSParamStmt(ParamStmt): + """ FS - Gerber Format Specification Statement + """ + + @classmethod + def from_dict(cls, stmt_dict): + """ + """ + param = stmt_dict.get('param') + zeros = 'leading' if stmt_dict.get('zero') == 'L' else 'trailing' + notation = 'absolute' if stmt_dict.get('notation') == 'A' else 'incremental' + x = map(int, stmt_dict.get('x')) + fmt = (x[0], x[1]) + return cls(param, zeros, notation, fmt) + + def __init__(self, param, zero_suppression='leading', + notation='absolute', format=(2, 4)): + """ Initialize FSParamStmt class + + .. note:: + The FS command specifies the format of the coordinate data. It + must only be used once at the beginning of a file. It must be + specified before the first use of coordinate data. + + Parameters + ---------- + param : string + Parameter. + + zero_suppression : string + Zero-suppression mode. May be either 'leading' or 'trailing' + + notation : string + Notation mode. May be either 'absolute' or 'incremental' + + format : tuple (int, int) + Gerber precision format expressed as a tuple containing: + (number of integer-part digits, number of decimal-part digits) + + Returns + ------- + ParamStmt : FSParamStmt + Initialized FSParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.zero_suppression = zero_suppression + self.notation = notation + self.format = format + + def to_gerber(self): + zero_suppression = 'L' if self.zero_suppression == 'leading' else 'T' + notation = 'A' if self.notation == 'absolute' else 'I' + fmt = ''.join(map(str, self.format)) + return '%FS{0}{1}X{2}Y{3}*%'.format(zero_suppression, notation, + fmt, fmt) + + def __str__(self): + return ('<Format Spec: %d:%d %s zero suppression %s notation>' % + (self.format[0], self.format[1], self.zero_suppression, + self.notation)) + + +class MOParamStmt(ParamStmt): + """ MO - Gerber Mode (measurement units) Statement. + """ + + @classmethod + def from_dict(cls, stmt_dict): + param = stmt_dict.get('param') + if stmt_dict.get('mo').lower() == 'in': + mo = 'inch' + elif stmt_dict.get('mo').lower() == 'mm': + mo = 'metric' + else: + mo = None + return cls(param, mo) + + def __init__(self, param, mo): + """ Initialize MOParamStmt class + + Parameters + ---------- + param : string + Parameter. + + mo : string + Measurement units. May be either 'inch' or 'metric' + + Returns + ------- + ParamStmt : MOParamStmt + Initialized MOParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.mode = mo + + def to_gerber(self): + mode = 'MM' if self.mode == 'metric' else 'IN' + return '%MO{0}*%'.format(mode) + + def __str__(self): + mode_str = 'millimeters' if self.mode == 'metric' else 'inches' + return ('<Mode: %s>' % mode_str) + + +class IPParamStmt(ParamStmt): + """ IP - Gerber Image Polarity Statement. (Deprecated) + """ + @classmethod + def from_dict(cls, stmt_dict): + param = stmt_dict.get('param') + ip = 'positive' if stmt_dict.get('ip') == 'POS' else 'negative' + return cls(param, ip) + + def __init__(self, param, ip): + """ Initialize IPParamStmt class + + Parameters + ---------- + param : string + Parameter string. + + ip : string + Image polarity. May be either'positive' or 'negative' + + Returns + ------- + ParamStmt : IPParamStmt + Initialized IPParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.ip = ip + + def to_gerber(self): + ip = 'POS' if self.ip == 'positive' else 'NEG' + return '%IP{0}*%'.format(ip) + + def __str__(self): + return ('<Image Polarity: %s>' % self.ip) + + +class OFParamStmt(ParamStmt): + """ OF - Gerber Offset statement (Deprecated) + """ + + @classmethod + def from_dict(cls, stmt_dict): + param = stmt_dict.get('param') + a = float(stmt_dict.get('a')) + b = float(stmt_dict.get('b')) + return cls(param, a, b) + + def __init__(self, param, a, b): + """ Initialize OFParamStmt class + + Parameters + ---------- + param : string + Parameter + + a : float + Offset along the output device A axis + + b : float + Offset along the output device B axis + + Returns + ------- + ParamStmt : OFParamStmt + Initialized OFParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.a = a + self.b = b + + def to_gerber(self): + ret = '%OF' + if self.a: + ret += 'A' + decimal_string(self.a, precision=6) + if self.b: + ret += 'B' + decimal_string(self.b, precision=6) + return ret + '*%' + + def __str__(self): + offset_str = '' + if self.a: + offset_str += ('X: %f' % self.a) + if self.b: + offset_str += ('Y: %f' % self.b) + return ('<Offset: %s>' % offset_str) + + +class LPParamStmt(ParamStmt): + """ LP - Gerber Level Polarity statement + """ + + @classmethod + def from_dict(cls, stmt_dict): + param = stmt_dict['param'] + lp = 'clear' if stmt_dict.get('lp') == 'C' else 'dark' + return cls(param, lp) + + def __init__(self, param, lp): + """ Initialize LPParamStmt class + + Parameters + ---------- + param : string + Parameter + + lp : string + Level polarity. May be either 'clear' or 'dark' + + Returns + ------- + ParamStmt : LPParamStmt + Initialized LPParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.lp = lp + + def to_gerber(self): + lp = 'C' if self.lp == 'clear' else 'D' + return '%LP{0}*%'.format(lp) + + def __str__(self): + return '<Level Polarity: %s>' % self.lp + + +class ADParamStmt(ParamStmt): + """ AD - Gerber Aperture Definition Statement + """ + + @classmethod + def from_dict(cls, stmt_dict): + param = stmt_dict.get('param') + d = int(stmt_dict.get('d')) + shape = stmt_dict.get('shape') + modifiers = stmt_dict.get('modifiers') + return cls(param, d, shape, modifiers) + + def __init__(self, param, d, shape, modifiers): + """ Initialize ADParamStmt class + + Parameters + ---------- + param : string + Parameter code + + d : int + Aperture D-code + + shape : string + aperture name + + modifiers : list of lists of floats + Shape modifiers + + Returns + ------- + ParamStmt : LPParamStmt + Initialized LPParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.d = d + self.shape = shape + if modifiers is not None: + self.modifiers = [[x for x in m.split("X")] for m in modifiers.split(",")] + else: + self.modifiers = [] + + def to_gerber(self, settings): + return '%ADD{0}{1},{2}*%'.format(self.d, self.shape, + ','.join(['X'.join(e) for e in self.modifiers])) + + def __str__(self): + if self.shape == 'C': + shape = 'circle' + elif self.shape == 'R': + shape = 'rectangle' + elif self.shape == 'O': + shape = 'oblong' + else: + shape = self.shape + + return '<Aperture Definition: %d: %s>' % (self.d, shape) + + +class AMParamStmt(ParamStmt): + """ AM - Aperture Macro Statement + """ + + @classmethod + def from_dict(cls, stmt_dict): + return cls(**stmt_dict) + + def __init__(self, param, name, macro): + """ Initialize AMParamStmt class + + Parameters + ---------- + param : string + Parameter code + + name : string + Aperture macro name + + macro : string + Aperture macro string + + Returns + ------- + ParamStmt : AMParamStmt + Initialized AMParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.name = name + self.macro = macro + + def to_gerber(self): + return '%AM{0}*{1}*%'.format(self.name, self.macro) + + def __str__(self): + return '<Aperture Macro %s: %s>' % (self.name, macro) + + +class INParamStmt(ParamStmt): + """ IN - Image Name Statement + """ + @classmethod + def from_dict(cls, stmt_dict): + return cls(**stmt_dict) + + def __init__(self, param, name): + """ Initialize INParamStmt class + + Parameters + ---------- + param : string + Parameter code + + name : string + Image name + + Returns + ------- + ParamStmt : INParamStmt + Initialized INParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.name = name + + def to_gerber(self): + return '%IN{0}*%'.format(self.name) + + def __str__(self): + return '<Image Name: %s>' % self.name + + +class LNParamStmt(ParamStmt): + """ LN - Level Name Statement (Deprecated) + """ + @classmethod + def from_dict(cls, stmt_dict): + return cls(**stmt_dict) + + def __init__(self, param, name): + """ Initialize LNParamStmt class + + Parameters + ---------- + param : string + Parameter code + + name : string + Level name + + Returns + ------- + ParamStmt : LNParamStmt + Initialized LNParamStmt class. + + """ + ParamStmt.__init__(self, param) + self.name = name + + def to_gerber(self): + return '%LN{0}*%'.format(self.name) + + def __str__(self): + return '<Level Name: %s>' % self.name + + +class CoordStmt(Statement): + """ Coordinate Data Block + """ + + @classmethod + def from_dict(cls, stmt_dict, settings): + zeros = settings.zero_suppression + format = settings.format + function = stmt_dict['function'] + x = stmt_dict.get('x') + y = stmt_dict.get('y') + i = stmt_dict.get('i') + j = stmt_dict.get('j') + op = stmt_dict.get('op') + + if x is not None: + x = parse_gerber_value(stmt_dict.get('x'), + format, zeros) + if y is not None: + y = parse_gerber_value(stmt_dict.get('y'), + format, zeros) + if i is not None: + i = parse_gerber_value(stmt_dict.get('i'), + format, zeros) + if j is not None: + j = parse_gerber_value(stmt_dict.get('j'), + format, zeros) + return cls(function, x, y, i, j, op, settings) + + def __init__(self, function, x, y, i, j, op, settings): + """ Initialize CoordStmt class + + Parameters + ---------- + function : string + function + + x : float + X coordinate + + y : float + Y coordinate + + i : float + Coordinate offset in the X direction + + j : float + Coordinate offset in the Y direction + + op : string + Operation code + + settings : dict {'zero_suppression', 'format'} + Gerber file coordinate format + + Returns + ------- + Statement : CoordStmt + Initialized CoordStmt class. + + """ + Statement.__init__(self, "COORD") + self.zero_suppression = settings.zero_suppression + self.format = settings.format + self.function = function + self.x = x + self.y = y + self.i = i + self.j = j + self.op = op + + def to_gerber(self): + ret = '' + if self.function: + ret += self.function + if self.x: + ret += 'X{0}'.format(write_gerber_value(self.x, self.zeros, + self.format)) + if self.y: + ret += 'Y{0}'.format(write_gerber_value(self.y, self. zeros, + self.format)) + if self.i: + ret += 'I{0}'.format(write_gerber_value(self.i, self.zeros, + self.format)) + if self.j: + ret += 'J{0}'.format(write_gerber_value(self.j, self.zeros, + self.format)) + if self.op: + ret += self.op + return ret + '*' + + def __str__(self): + coord_str = '' + if self.function: + coord_str += 'Fn: %s ' % self.function + if self.x: + coord_str += 'X: %f ' % self.x + if self.y: + coord_str += 'Y: %f ' % self.y + if self.i: + coord_str += 'I: %f ' % self.i + if self.j: + coord_str += 'J: %f ' % self.j + if self.op: + if self.op == 'D01': + op = 'Lights On' + elif self.op == 'D02': + op = 'Lights Off' + elif self.op == 'D03': + op = 'Flash' + else: + op = self.op + coord_str += 'Op: %s' % op + + return '<Coordinate Statement: %s>' % coord_str + + +class ApertureStmt(Statement): + """ Aperture Statement + """ + def __init__(self, d): + Statement.__init__(self, "APERTURE") + self.d = int(d) + + def to_gerber(self): + return 'G54D{0}*'.format(self.d) + + def __str__(self): + return '<Aperture: %d>' % self.d + + +class CommentStmt(Statement): + """ Comment Statment + """ + + def __init__(self, comment): + Statement.__init__(self, "COMMENT") + self.comment = comment + + def to_gerber(self): + return 'G04{0}*'.format(self.comment) + + def __str__(self): + return '<Comment: %s>' % self.comment + + +class EofStmt(Statement): + """ EOF Statement + """ + def __init__(self): + Statement.__init__(self, "EOF") + + def to_gerber(self): + return 'M02*' + + def __str__(self): + return '<EOF Statement>' + + +class QuadrantModeStmt(Statement): + + @classmethod + def from_gerber(cls, line): + if 'G74' not in line and 'G75' not in line: + raise ValueError('%s is not a valid quadrant mode statement' + % line) + return (cls('single-quadrant') if line[:3] == 'G74' + else cls('multi-quadrant')) + + def __init__(self, mode): + super(QuadrantModeStmt, self).__init__('QuadrantMode') + mode = mode.lower() + if mode not in ['single-quadrant', 'multi-quadrant']: + raise ValueError('Quadrant mode must be "single-quadrant" \ + or "multi-quadrant"') + self.mode = mode + + def to_gerber(self): + return 'G74*' if self.mode == 'single-quadrant' else 'G75*' + + +class RegionModeStmt(Statement): + + @classmethod + def from_gerber(cls, line): + if 'G36' not in line and 'G37' not in line: + raise ValueError('%s is not a valid region mode statement' % line) + return (cls('on') if line[:3] == 'G36' else cls('off')) + + def __init__(self, mode): + super(RegionModeStmt, self).__init__('RegionMode') + mode = mode.lower() + if mode not in ['on', 'off']: + raise ValueError('Valid modes are "on" or "off"') + self.mode = mode + + def to_gerber(self): + return 'G36*' if self.mode == 'on' else 'G37*' + + +class UnknownStmt(Statement): + """ Unknown Statement + """ + def __init__(self, line): + Statement.__init__(self, "UNKNOWN") + self.line = line + + def to_gerber(self): + return self.line diff --git a/gerber/layers.py b/gerber/layers.py new file mode 100644 index 0000000..b10cf16 --- /dev/null +++ b/gerber/layers.py @@ -0,0 +1,54 @@ +#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+top_copper_ext = ['gtl', 'cmp', 'top', ]
+top_copper_name = ['art01', 'top', 'GTL', 'layer1', 'soldcom', 'comp', ]
+
+bottom_copper_ext = ['gbl', 'sld', 'bot', 'sol', ]
+bottom_coppper_name = ['art02', 'bottom', 'bot', 'GBL', 'layer2', 'soldsold', ]
+
+internal_layer_ext = ['in', 'gt1', 'gt2', 'gt3', 'gt4', 'gt5', 'gt6', 'g1',
+ 'g2', 'g3', 'g4', 'g5', 'g6', ]
+internal_layer_name = ['art', 'internal']
+
+power_plane_name = ['pgp', 'pwr', ]
+ground_plane_name = ['gp1', 'gp2', 'gp3', 'gp4', 'gt5', 'gp6', 'gnd',
+ 'ground', ]
+
+top_silk_ext = ['gto', 'sst', 'plc', 'ts', 'skt', ]
+top_silk_name = ['sst01', 'topsilk', 'silk', 'slk', 'sst', ]
+
+bottom_silk_ext = ['gbo', 'ssb', 'pls', 'bs', 'skb', ]
+bottom_silk_name = ['sst', 'bsilk', 'ssb', 'botsilk', ]
+
+top_mask_ext = ['gts', 'stc', 'tmk', 'smt', 'tr', ]
+top_mask_name = ['sm01', 'cmask', 'tmask', 'mask1', 'maskcom', 'topmask',
+ 'mst', ]
+
+bottom_mask_ext = ['gbs', 'sts', 'bmk', 'smb', 'br', ]
+bottom_mask_name = ['sm', 'bmask', 'mask2', 'masksold', 'botmask', 'msb', ]
+
+top_paste_ext = ['gtp', 'tm']
+top_paste_name = ['sp01', 'toppaste', 'pst']
+
+bottom_paste_ext = ['gbp', 'bm']
+bottom_paste_name = ['sp02', 'botpaste', 'psb']
+
+board_outline_ext = ['gko']
+board_outline_name = ['BDR', 'border', 'out', ]
+
+
diff --git a/gerber/parser.py b/gerber/parser.py deleted file mode 100644 index 67893af..0000000 --- a/gerber/parser.py +++ /dev/null @@ -1,370 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# Copyright 2013-2014 Paulo Henrique Silva <ph.silva@gmail.com> - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import re -import json - - -class Statement(object): - def __init__(self, type): - self.type = type - - def __str__(self): - s = "<{0} ".format(self.__class__.__name__) - - for key, value in self.__dict__.items(): - s += "{0}={1} ".format(key, value) - - s = s.rstrip() + ">" - return s - - -class ParamStmt(Statement): - def __init__(self, param): - Statement.__init__(self, "PARAM") - self.param = param - - - -class FSParamStmt(ParamStmt): - def __init__(self, param, zero="L", notation="A", x="24", y="24"): - ParamStmt.__init__(self, param) - self.zero = zero - self.notation = notation - self.x = x - self.y = y - - def to_gerber(self): - return '%FS{0}{1}X{2}Y{3}*%'.format(self.zero, self.notation, - self.x, self.y) - -class MOParamStmt(ParamStmt): - def __init__(self, param, mo): - ParamStmt.__init__(self, param) - self.mo = mo - - def to_gerber(self): - return '%MO{0}*%'.format(self.mo) - -class IPParamStmt(ParamStmt): - def __init__(self, param, ip): - ParamStmt.__init__(self, param) - self.ip = ip - - def to_gerber(self): - return '%IP{0}*%'.format(self.ip) - - -class OFParamStmt(ParamStmt): - def __init__(self, param, a, b): - ParamStmt.__init__(self, param) - self.a = a - self.b = b - - def to_gerber(self): - ret = '%OF' - if self.a: - ret += 'A' + self.a - if self.b: - ret += 'B' + self.b - return ret + '*%' - - -class LPParamStmt(ParamStmt): - def __init__(self, param, lp): - ParamStmt.__init__(self, param) - self.lp = lp - - def to_gerber(self): - return '%LP{0}*%'.format(self.lp) - - -class ADParamStmt(ParamStmt): - def __init__(self, param, d, shape, modifiers): - ParamStmt.__init__(self, param) - self.d = d - self.shape = shape - if modifiers is not None: - self.modifiers = [[x for x in m.split("X")] for m in modifiers.split(",")] - else: - self.modifiers = [] - - def to_gerber(self): - return '%ADD{0}{1},{2}*%'.format(self.d, self.shape, - ','.join(['X'.join(e) for e in self.modifiers])) - -class AMParamStmt(ParamStmt): - def __init__(self, param, name, macro): - ParamStmt.__init__(self, param) - self.name = name - self.macro = macro - - def to_gerber(self): - #think this is right... - return '%AM{0}*{1}*%'.format(self.name, self.macro) - -class INParamStmt(ParamStmt): - def __init__(self, param, name): - ParamStmt.__init__(self, param) - self.name = name - - def to_gerber(self): - return '%IN{0}*%'.format(self.name) - - -class LNParamStmt(ParamStmt): - def __init__(self, param, name): - ParamStmt.__init__(self, param) - self.name = name - - def to_gerber(self): - return '%LN{0}*%'.format(self.name) - -class CoordStmt(Statement): - def __init__(self, function, x, y, i, j, op): - Statement.__init__(self, "COORD") - self.function = function - self.x = x - self.y = y - self.i = i - self.j = j - self.op = op - - def to_gerber(self): - ret = '' - if self.function: - ret += self.function - if self.x: - ret += 'X{0}'.format(self.x) - if self.y: - ret += 'Y{0}'.format(self.y) - if self.i: - ret += 'I{0}'.format(self.i) - if self.j: - ret += 'J{0}'.format(self.j) - if self.op: - ret += self.op - return ret + '*' - - -class ApertureStmt(Statement): - def __init__(self, d): - Statement.__init__(self, "APERTURE") - self.d = int(d) - - def to_gerber(self): - return 'G54D{0}*'.format(self.d) - -class CommentStmt(Statement): - def __init__(self, comment): - Statement.__init__(self, "COMMENT") - self.comment = comment - - def to_gerber(self): - return 'G04{0}*'.format(self.comment) - -class EofStmt(Statement): - def __init__(self): - Statement.__init__(self, "EOF") - - def to_gerber(self): - return 'M02*' - -class UnknownStmt(Statement): - def __init__(self, line): - Statement.__init__(self, "UNKNOWN") - self.line = line - - -class GerberParser(object): - NUMBER = r"[\+-]?\d+" - DECIMAL = r"[\+-]?\d+([.]?\d+)?" - STRING = r"[a-zA-Z0-9_+\-/!?<>”’(){}.\|&@# :]+" - NAME = r"[a-zA-Z_$][a-zA-Z_$0-9]+" - FUNCTION = r"G\d{2}" - - COORD_OP = r"D[0]?[123]" - - FS = r"(?P<param>FS)(?P<zero>(L|T))?(?P<notation>(A|I))X(?P<x>[0-7][0-7])Y(?P<y>[0-7][0-7])" - MO = r"(?P<param>MO)(?P<mo>(MM|IN))" - IP = r"(?P<param>IP)(?P<ip>(POS|NEG))" - LP = r"(?P<param>LP)(?P<lp>(D|C))" - AD_CIRCLE = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>C)[,](?P<modifiers>[^,]*)" - AD_RECT = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>R)[,]?(?P<modifiers>[^,]+)?" - AD_OBROUND = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>O)[,](?P<modifiers>[^,]*)" - AD_POLY = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>P)[,](?P<modifiers>[^,]*)" - AD_MACRO = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>{name})[,]?(?P<modifiers>[^,]+)?".format(name=NAME) - AM = r"(?P<param>AM)(?P<name>{name})\*(?P<macro>.*)".format(name=NAME) - - # begin deprecated - OF = r"(?P<param>OF)(A(?P<a>{decimal}))?(B(?P<b>{decimal}))?".format(decimal=DECIMAL) - IN = r"(?P<param>IN)(?P<name>.*)" - LN = r"(?P<param>LN)(?P<name>.*)" - # end deprecated - - PARAMS = (FS, MO, IP, LP, AD_CIRCLE, AD_RECT, AD_OBROUND, AD_POLY, AD_MACRO, AM, OF, IN, LN) - PARAM_STMT = [re.compile(r"%{0}\*%".format(p)) for p in PARAMS] - - COORD_STMT = re.compile(( - r"(?P<function>{function})?" - r"(X(?P<x>{number}))?(Y(?P<y>{number}))?" - r"(I(?P<i>{number}))?(J(?P<j>{number}))?" - r"(?P<op>{op})?\*".format(number=NUMBER, function=FUNCTION, op=COORD_OP))) - - APERTURE_STMT = re.compile(r"(G54)?D(?P<d>\d+)\*") - - #COMMENT_STMT = re.compile(r"G04(?P<comment>{string})(\*)?".format(string=STRING)) - #spec is unclear on whether all chars allowed in comment string - - #seems reasonable to be more permissive. - COMMENT_STMT = re.compile(r"G04(?P<comment>[^*]*)(\*)?") - - EOF_STMT = re.compile(r"(?P<eof>M02)\*") - - def __init__(self, ctx=None): - self.statements = [] - self.ctx = ctx - - def parse(self, filename): - fp = open(filename, "r") - data = fp.readlines() - - for stmt in self._parse(data): - self.statements.append(stmt) - if self.ctx: - self.ctx.evaluate(stmt) - - def dump_json(self): - stmts = {"statements": [stmt.__dict__ for stmt in self.statements]} - return json.dumps(stmts) - - def dump_str(self): - s = "" - for stmt in self.statements: - s += str(stmt) + "\n" - return s - - def dump(self): - self.ctx.dump() - - def _parse(self, data): - oldline = '' - - for i, line in enumerate(data): - line = oldline + line.strip() - - # skip empty lines - if not len(line): - continue - - # deal with multi-line parameters - if line.startswith("%") and not line.endswith("%"): - oldline = line - continue - - did_something = True # make sure we do at least one loop - while did_something and len(line) > 0: - did_something = False - # coord - (coord, r) = self._match_one(self.COORD_STMT, line) - if coord: - yield CoordStmt(**coord) - line = r - did_something = True - continue - - # aperture selection - (aperture, r) = self._match_one(self.APERTURE_STMT, line) - if aperture: - yield ApertureStmt(**aperture) - - did_something = True - line = r - continue - - # comment - (comment, r) = self._match_one(self.COMMENT_STMT, line) - if comment: - yield CommentStmt(comment["comment"]) - did_something = True - line = r - continue - - # parameter - (param, r) = self._match_one_from_many(self.PARAM_STMT, line) - if param: - if param["param"] == "FS": - yield FSParamStmt(**param) - elif param["param"] == "MO": - yield MOParamStmt(**param) - elif param["param"] == "IP": - yield IPParamStmt(**param) - elif param["param"] == "LP": - yield LPParamStmt(**param) - elif param["param"] == "AD": - yield ADParamStmt(**param) - elif param["param"] == "AM": - yield AMParamStmt(**param) - elif param["param"] == "OF": - yield OFParamStmt(**param) - elif param["param"] == "IN": - yield INParamStmt(**param) - elif param["param"] == "LN": - yield LNParamStmt(**param) - else: - yield UnknownStmt(line) - did_something = True - line = r - continue - - # eof - (eof, r) = self._match_one(self.EOF_STMT, line) - if eof: - yield EofStmt() - did_something = True - line = r - continue - - if False: - print self.COORD_STMT.pattern - print self.APERTURE_STMT.pattern - print self.COMMENT_STMT.pattern - print self.EOF_STMT.pattern - for i in self.PARAM_STMT: - print i.pattern - - if line.find('*') > 0: - yield UnknownStmt(line) - did_something = True - line = "" - continue - - oldline = line - - def _match_one(self, expr, data): - match = expr.match(data) - if match is None: - return ({}, None) - else: - return (match.groupdict(), data[match.end(0):]) - - def _match_one_from_many(self, exprs, data): - for expr in exprs: - match = expr.match(data) - if match: - return (match.groupdict(), data[match.end(0):]) - - return ({}, None) diff --git a/gerber/primitives.py b/gerber/primitives.py new file mode 100644 index 0000000..670b758 --- /dev/null +++ b/gerber/primitives.py @@ -0,0 +1,228 @@ +#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be>
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import math
+from operator import sub
+
+
+class Primitive(object):
+
+ def __init__(self, level_polarity='dark'):
+ self.level_polarity = level_polarity
+
+ def bounding_box(self):
+ """ Calculate bounding box
+
+ will be helpful for sweep & prune during DRC clearance checks.
+
+ Return ((min x, max x), (min y, max y))
+ """
+ pass
+
+
+class Line(Primitive):
+ """
+ """
+ def __init__(self, start, end, width, level_polarity='dark'):
+ super(Line, self).__init__(level_polarity)
+ self.start = start
+ self.end = end
+ self.width = width
+
+ @property
+ def angle(self):
+ delta_x, delta_y = tuple(map(sub, end, start))
+ angle = degrees(math.tan(delta_y/delta_x))
+ return angle
+
+ @property
+ def bounding_box(self):
+ width_2 = self.width / 2.
+ min_x = min(self.start[0], self.end[0]) - width_2
+ max_x = max(self.start[0], self.end[0]) + width_2
+ min_y = min(self.start[1], self.end[1]) - width_2
+ max_y = max(self.start[1], self.end[1]) + width_2
+ return ((min_x, max_x), (min_y, max_y))
+
+
+class Arc(Primitive):
+ """
+ """
+ def __init__(self, start, end, center, direction, width, level_polarity='dark'):
+ super(Arc, self).__init__(level_polarity)
+ self.start = start
+ self.end = end
+ self.center = center
+ self.direction = direction
+ self.width = width
+
+ @property
+ def start_angle(self):
+ dy, dx = map(sub, self.start, self.center)
+ return math.atan2(dy, dx)
+
+ @property
+ def end_angle(self):
+ dy, dx = map(sub, self.end, self.center)
+ return math.atan2(dy, dx)
+
+ @property
+ def bounding_box(self):
+ pass
+
+class Circle(Primitive):
+ """
+ """
+ def __init__(self, position, diameter, level_polarity='dark'):
+ super(Circle, self).__init__(level_polarity)
+ self.position = position
+ self.diameter = diameter
+
+ @property
+ def radius(self):
+ return self.diameter / 2.
+
+ @property
+ def bounding_box(self):
+ min_x = self.position[0] - self.radius
+ max_x = self.position[0] + self.radius
+ min_y = self.position[1] - self.radius
+ max_y = self.position[1] + self.radius
+ return ((min_x, max_x), (min_y, max_y))
+
+ @property
+ def stroke_width(self):
+ return self.diameter
+
+
+class Rectangle(Primitive):
+ """
+ """
+ def __init__(self, position, width, height, level_polarity='dark'):
+ super(Rectangle, self).__init__(level_polarity)
+ self.position = position
+ self.width = width
+ self.height = height
+
+ @property
+ def lower_left(self):
+ return (self.position[0] - (self.width / 2.),
+ self.position[1] - (self.height / 2.))
+
+ @property
+ def upper_right(self):
+ return (self.position[0] + (self.width / 2.),
+ self.position[1] + (self.height / 2.))
+
+ @property
+ def bounding_box(self):
+ min_x = self.lower_left[0]
+ max_x = self.upper_right[0]
+ min_y = self.lower_left[1]
+ max_y = self.upper_right[1]
+ return ((min_x, max_x), (min_y, max_y))
+
+ @property
+ def stroke_width(self):
+ return max((self.width, self.height))
+
+
+class Obround(Primitive):
+ """
+ """
+ def __init__(self, position, width, height, level_polarity='dark'):
+ super(Obround, self).__init__(level_polarity)
+ self.position = position
+ self.width = width
+ self.height = height
+
+ @property
+ def orientation(self):
+ return 'vertical' if self.height > self.width else 'horizontal'
+
+ @property
+ def lower_left(self):
+ return (self.position[0] - (self.width / 2.),
+ self.position[1] - (self.height / 2.))
+
+ @property
+ def upper_right(self):
+ return (self.position[0] + (self.width / 2.),
+ self.position[1] + (self.height / 2.))
+
+ @property
+ def bounding_box(self):
+ min_x = self.lower_left[0]
+ max_x = self.upper_right[0]
+ min_y = self.lower_left[1]
+ max_y = self.upper_right[1]
+ return ((min_x, max_x), (min_y, max_y))
+
+
+class Polygon(Primitive):
+ """
+ """
+ def __init__(self, position, sides, radius, level_polarity='dark'):
+ super(Polygon, self).__init__(level_polarity)
+ self.position = position
+ self.sides = sides
+ self.radius = radius
+
+ @property
+ def bounding_box(self):
+ min_x = self.position[0] - self.radius
+ max_x = self.position[0] + self.radius
+ min_y = self.position[1] - self.radius
+ max_y = self.position[1] + self.radius
+ return ((min_x, max_x), (min_y, max_y))
+
+
+class Region(Primitive):
+ """
+ """
+ def __init__(self, points, level_polarity='dark'):
+ super(Region, self).__init__(level_polarity)
+ self.points = points
+
+ @property
+ def bounding_box(self):
+ x_list, y_list = zip(*self.points)
+ min_x = min(x_list)
+ max_x = max(x_list)
+ min_y = min(y_list)
+ max_y = max(y_list)
+ return ((min_x, max_x), (min_y, max_y))
+
+
+class Drill(Primitive):
+ """
+ """
+ def __init__(self, position, diameter):
+ super(Drill, self).__init__('dark')
+ self.position = position
+ self.diameter = diameter
+
+ @property
+ def radius(self):
+ return self.diameter / 2.
+
+ @property
+ def bounding_box(self):
+ min_x = self.position[0] - self.radius
+ max_x = self.position[0] + self.radius
+ min_y = self.position[1] - self.radius
+ max_y = self.position[1] + self.radius
+ return ((min_x, max_x), (min_y, max_y))
diff --git a/gerber/render.py b/gerber/render.py deleted file mode 100644 index 585b340..0000000 --- a/gerber/render.py +++ /dev/null @@ -1,188 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# Copyright 2013-2014 Paulo Henrique Silva <ph.silva@gmail.com> - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from .parser import CommentStmt, UnknownStmt, EofStmt, ParamStmt, CoordStmt, ApertureStmt - -IMAGE_POLARITY_POSITIVE = 1 -IMAGE_POLARITY_NEGATIVE = 2 - -LEVEL_POLARITY_DARK = 1 -LEVEL_POLARITY_CLEAR = 2 - -NOTATION_ABSOLUTE = 1 -NOTATION_INCREMENTAL = 2 - -UNIT_INCH = 1 -UNIT_MM = 2 - -INTERPOLATION_LINEAR = 1 -INTERPOLATION_ARC = 2 - - -class GerberCoordFormat(object): - def __init__(self, zeroes, x, y): - self.omit_leading_zeroes = True if zeroes == "L" else False - self.omit_trailing_zeroes = True if zeroes == "T" else False - self.x_int_digits, self.x_dec_digits = [int(d) for d in x] - self.y_int_digits, self.y_dec_digits = [int(d) for d in y] - - def resolve(self, x, y): - new_x = x.replace("+", "") if x else None - new_y = y.replace("+", "") if y else None - - if new_x is not None: - negative = "-" in new_x - new_x = new_x.replace("-", "") - - missing_zeroes = (self.x_int_digits + self.x_dec_digits) - len(new_x) - - if missing_zeroes and self.omit_leading_zeroes: - new_x = (missing_zeroes * "0") + new_x - elif missing_zeroes and self.omit_trailing_zeroes: - new_x += missing_zeroes * "0" - - new_x = float("{0}{1}.{2}".format("-" if negative else "", - new_x[:self.x_int_digits], - new_x[self.x_int_digits:])) - - if new_y is not None: - negative = "-" in new_y - new_y = new_y.replace("-", "") - - missing_zeroes = (self.y_int_digits + self.y_dec_digits) - len(new_y) - - if missing_zeroes and self.omit_leading_zeroes: - new_y = (missing_zeroes * "0") + new_y - elif missing_zeroes and self.omit_trailing_zeroes: - new_y += missing_zeroes * "0" - - new_y = float("{0}{1}.{2}".format("-" if negative else "", - new_y[:self.y_int_digits], - new_y[self.y_int_digits:])) - - return new_x, new_y - - -class GerberContext(object): - coord_format = None - coord_notation = NOTATION_ABSOLUTE - coord_unit = None - - x = 0 - y = 0 - - aperture = 0 - interpolation = INTERPOLATION_LINEAR - - image_polarity = IMAGE_POLARITY_POSITIVE - level_polarity = LEVEL_POLARITY_DARK - - def __init__(self): - pass - - def set_coord_format(self, zeroes, x, y): - self.coord_format = GerberCoordFormat(zeroes, x, y) - - def set_coord_notation(self, notation): - self.coord_notation = NOTATION_ABSOLUTE if notation == "A" else NOTATION_INCREMENTAL - - def set_coord_unit(self, unit): - self.coord_unit = UNIT_INCH if unit == "IN" else UNIT_MM - - def set_image_polarity(self, polarity): - self.image_polarity = IMAGE_POLARITY_POSITIVE if polarity == "POS" else IMAGE_POLARITY_NEGATIVE - - def set_level_polarity(self, polarity): - self.level_polarity = LEVEL_POLARITY_DARK if polarity == "D" else LEVEL_POLARITY_CLEAR - - def set_interpolation(self, interpolation): - self.interpolation = INTERPOLATION_LINEAR if interpolation in ("G01", "G1") else INTERPOLATION_ARC - - def set_aperture(self, d): - self.aperture = d - - def resolve(self, x, y): - x, y = self.coord_format.resolve(x, y) - return x if x is not None else self.x, y if y is not None else self.y - - def define_aperture(self, d, shape, modifiers): - pass - - def move(self, x, y, resolve=True): - if resolve: - self.x, self.y = self.resolve(x, y) - else: - self.x, self.y = x, y - - def stroke(self, x, y): - pass - - def line(self, x, y): - pass - - def arc(self, x, y): - pass - - def flash(self, x, y): - pass - - def drill(self, x, y, diameter): - pass - - def evaluate(self, stmt): - if isinstance(stmt, (CommentStmt, UnknownStmt, EofStmt)): - return - - elif isinstance(stmt, ParamStmt): - self._evaluate_param(stmt) - - elif isinstance(stmt, CoordStmt): - self._evaluate_coord(stmt) - - elif isinstance(stmt, ApertureStmt): - self._evaluate_aperture(stmt) - - else: - raise Exception("Invalid statement to evaluate") - - def _evaluate_param(self, stmt): - if stmt.param == "FS": - self.set_coord_format(stmt.zero, stmt.x, stmt.y) - self.set_coord_notation(stmt.notation) - elif stmt.param == "MO:": - self.set_coord_unit(stmt.mo) - elif stmt.param == "IP:": - self.set_image_polarity(stmt.ip) - elif stmt.param == "LP:": - self.set_level_polarity(stmt.lp) - elif stmt.param == "AD": - self.define_aperture(stmt.d, stmt.shape, stmt.modifiers) - - def _evaluate_coord(self, stmt): - - if stmt.function in ("G01", "G1", "G02", "G2", "G03", "G3"): - self.set_interpolation(stmt.function) - - if stmt.op == "D01": - self.stroke(stmt.x, stmt.y) - elif stmt.op == "D02": - self.move(stmt.x, stmt.y) - elif stmt.op == "D03": - self.flash(stmt.x, stmt.y) - - def _evaluate_aperture(self, stmt): - self.set_aperture(stmt.d) diff --git a/gerber/render/__init__.py b/gerber/render/__init__.py new file mode 100644 index 0000000..0d3527b --- /dev/null +++ b/gerber/render/__init__.py @@ -0,0 +1,28 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +gerber.render +============ +**Gerber Renderers** + +This module provides contexts for rendering images of gerber layers. Currently +SVG is the only supported format. +""" + + +from svgwrite_backend import GerberSvgContext + diff --git a/gerber/render/apertures.py b/gerber/render/apertures.py new file mode 100644 index 0000000..52ae50c --- /dev/null +++ b/gerber/render/apertures.py @@ -0,0 +1,76 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +gerber.render.apertures +============ +**Gerber Aperture base classes** + +This module provides base classes for gerber apertures. These are used by +the rendering engine to draw the gerber file. +""" +import math + +class Aperture(object): + """ Gerber Aperture base class + """ + def draw(self, ctx, x, y): + raise NotImplementedError('The draw method must be implemented \ + in an Aperture subclass.') + + def flash(self, ctx, x, y): + raise NotImplementedError('The flash method must be implemented \ + in an Aperture subclass.') + + def _arc_params(self, startx, starty, x, y, i, j): + center = (startx + i, starty + j) + radius = math.sqrt(math.pow(center[0] - x, 2) + + math.pow(center[1] - y, 2)) + delta_x0 = startx - center[0] + delta_y0 = center[1] - starty + delta_x1 = x - center[0] + delta_y1 = center[1] - y + start_angle = math.atan2(delta_y0, delta_x0) + end_angle = math.atan2(delta_y1, delta_x1) + return {'center': center, 'radius': radius, + 'start_angle': start_angle, 'end_angle': end_angle} + + +class Circle(Aperture): + """ Circular Aperture base class + """ + def __init__(self, diameter=0.0): + self.diameter = diameter + + +class Rect(Aperture): + """ Rectangular Aperture base class + """ + def __init__(self, size=(0, 0)): + self.size = size + + +class Obround(Aperture): + """ Obround Aperture base class + """ + def __init__(self, size=(0, 0)): + self.size = size + + +class Polygon(Aperture): + """ Polygon Aperture base class + """ + pass diff --git a/gerber/render/render.py b/gerber/render/render.py new file mode 100644 index 0000000..f5c58d8 --- /dev/null +++ b/gerber/render/render.py @@ -0,0 +1,174 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> +# Modified from code by Paulo Henrique Silva <ph.silva@gmail.com> + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Rendering +============ +**Gerber (RS-274X) and Excellon file rendering** + +Render Gerber and Excellon files to a variety of formats. The render module +currently supports SVG rendering using the `svgwrite` library. +""" +from ..gerber_statements import (CommentStmt, UnknownStmt, EofStmt, ParamStmt, + CoordStmt, ApertureStmt, RegionModeStmt, + QuadrantModeStmt, +) + +from ..primitives import * + +class GerberContext(object): + """ Gerber rendering context base class + + Provides basic functionality and API for rendering gerber files. Medium- + specific renderers should subclass GerberContext and implement the drawing + functions. Colors are stored internally as 32-bit RGB and may need to be + converted to a native format in the rendering subclass. + + Attributes + ---------- + units : string + Measurement units + + color : tuple (<float>, <float>, <float>) + Color used for rendering as a tuple of normalized (red, green, blue) values. + + drill_color : tuple (<float>, <float>, <float>) + Color used for rendering drill hits. Format is the same as for `color`. + + background_color : tuple (<float>, <float>, <float>) + Color of the background. Used when exposing areas in 'clear' level + polarity mode. Format is the same as for `color`. + + alpha : float + Rendering opacity. Between 0.0 (transparent) and 1.0 (opaque.) + """ + def __init__(self, units='inch'): + self.units = units + self.color = (0.7215, 0.451, 0.200) + self.drill_color = (0.25, 0.25, 0.25) + self.background_color = (0.0, 0.0, 0.0) + self.alpha = 1.0 + + def set_units(self, units): + """ Set context measurement units + + Parameters + ---------- + unit : string + Measurement units. may be 'inch' or 'metric' + + Raises + ------ + ValueError + If `unit` is not 'inch' or 'metric' + """ + if units not in ('inch', 'metric'): + raise ValueError('Units may be "inch" or "metric"') + self.units = units + + def set_color(self, color): + """ Set rendering color. + + Parameters + ---------- + color : tuple (<float>, <float>, <float>) + Color as a tuple of (red, green, blue) values. Each channel is + represented as a float value in (0, 1) + """ + self.color = color + + def set_drill_color(self, color): + """ Set color used for rendering drill hits. + + Parameters + ---------- + color : tuple (<float>, <float>, <float>) + Color as a tuple of (red, green, blue) values. Each channel is + represented as a float value in (0, 1) + """ + self.drill_color = color + + def set_background_color(self, color): + """ Set rendering background color + + Parameters + ---------- + color : tuple (<float>, <float>, <float>) + Color as a tuple of (red, green, blue) values. Each channel is + represented as a float value in (0, 1) + """ + self.background_color = color + + def set_alpha(self, alpha): + """ Set layer rendering opacity + + .. note:: + Not all backends/rendering devices support this parameter. + + Parameters + ---------- + alpha : float + Rendering opacity. must be between 0.0 (transparent) and 1.0 (opaque) + """ + self.alpha = alpha + + def render(self, primitive): + color = (self.color if primitive.level_polarity == 'dark' + else self.background_color) + if isinstance(primitive, Line): + self._render_line(primitive, color) + elif isinstance(primitive, Arc): + self._render_arc(primitive, color) + elif isinstance(primitive, Region): + self._render_region(primitive, color) + elif isinstance(primitive, Circle): + self._render_circle(primitive, color) + elif isinstance(primitive, Rectangle): + self._render_rectangle(primitive, color) + elif isinstance(primitive, Obround): + self._render_obround(primitive, color) + elif isinstance(primitive, Polygon): + self._render_polygon(Polygon, color) + elif isinstance(primitive, Drill): + self._render_drill(primitive, self.drill_color) + else: + return + + def _render_line(self, primitive, color): + pass + + def _render_arc(self, primitive, color): + pass + + def _render_region(self, primitive, color): + pass + + def _render_circle(self, primitive, color): + pass + + def _render_rectangle(self, primitive, color): + pass + + def _render_obround(self, primitive, color): + pass + + def _render_polygon(self, primitive, color): + pass + + def _render_drill(self, primitive, color): + pass + diff --git a/gerber/render/svgwrite_backend.py b/gerber/render/svgwrite_backend.py new file mode 100644 index 0000000..d9456a5 --- /dev/null +++ b/gerber/render/svgwrite_backend.py @@ -0,0 +1,155 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> +# Based on render_svg.py by Paulo Henrique Silva <ph.silva@gmail.com> + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .render import GerberContext +from operator import mul +import svgwrite + +SCALE = 300 + + +def svg_color(color): + color = tuple([int(ch * 255) for ch in color]) + return 'rgb(%d, %d, %d)' % color + + +class GerberSvgContext(GerberContext): + def __init__(self): + GerberContext.__init__(self) + self.scale = (SCALE, -SCALE) + self.dwg = svgwrite.Drawing() + self.background = False + + def dump(self, filename): + self.dwg.saveas(filename) + + def set_bounds(self, bounds): + xbounds, ybounds = bounds + size = (SCALE * (xbounds[1] - xbounds[0]), + SCALE * (ybounds[1] - ybounds[0])) + if not self.background: + vbox = '%f, %f, %f, %f' % (SCALE * xbounds[0], -SCALE * ybounds[1], + size[0], size[1]) + self.dwg = svgwrite.Drawing(viewBox=vbox) + rect = self.dwg.rect(insert=(SCALE * xbounds[0], + -SCALE * ybounds[1]), + size=size, + fill=svg_color(self.background_color)) + self.dwg.add(rect) + self.background = True + + def _render_line(self, line, color): + start = map(mul, line.start, self.scale) + end = map(mul, line.end, self.scale) + aline = self.dwg.line(start=start, end=end, + stroke=svg_color(color), + stroke_width=SCALE * line.width, + stroke_linecap='round') + aline.stroke(opacity=self.alpha) + self.dwg.add(aline) + + def _render_region(self, region, color): + points = [tuple(map(mul, point, self.scale)) for point in region.points] + region_path = self.dwg.path(d='M %f, %f' % points[0], + fill=svg_color(color), + stroke='none') + region_path.fill(opacity=self.alpha) + for point in points[1:]: + region_path.push('L %f, %f' % point) + self.dwg.add(region_path) + + def _render_circle(self, circle, color): + center = map(mul, circle.position, self.scale) + acircle = self.dwg.circle(center=center, + r = SCALE * circle.radius, + fill=svg_color(color)) + acircle.fill(opacity=self.alpha) + self.dwg.add(acircle) + + def _render_rectangle(self, rectangle, color): + center = map(mul, rectangle.position, self.scale) + size = tuple(map(mul, (rectangle.width, rectangle.height), map(abs, self.scale))) + insert = center[0] - size[0] / 2., center[1] - size[1] / 2. + arect = self.dwg.rect(insert=insert, size=size, + fill=svg_color(color)) + arect.fill(opacity=self.alpha) + self.dwg.add(arect) + + def _render_obround(self, obround, color): + x, y = tuple(map(mul, obround.position, self.scale)) + xsize, ysize = tuple(map(mul, (obround.width, obround.height), + self.scale)) + xscale, yscale = self.scale + + # Corner case... + if xsize == ysize: + circle = self.dwg.circle(center=(x, y), + r = (xsize / 2.0), + fill=svg_color(color)) + circle.fill(opacity=self.alpha) + self.dwg.add(circle) + + # Horizontal obround + elif xsize > ysize: + rectx = xsize - ysize + recty = ysize + c1 = self.dwg.circle(center=(x - (rectx / 2.0), y), + r = (ysize / 2.0), + fill=svg_color(color)) + + c2 = self.dwg.circle(center=(x + (rectx / 2.0), y), + r = (ysize / 2.0), + fill=svg_color(color)) + + rect = self.dwg.rect(insert=(x, y), + size=(xsize, ysize), + fill=svg_color(color)) + c1.fill(opacity=self.alpha) + c2.fill(opacity=self.alpha) + rect.fill(opacity=self.alpha) + self.dwg.add(c1) + self.dwg.add(c2) + self.dwg.add(rect) + + # Vertical obround + else: + rectx = xsize + recty = ysize - xsize + c1 = self.dwg.circle(center=(x, y - (recty / 2.)), + r = (xsize / 2.), + fill=svg_color(color)) + + c2 = self.dwg.circle(center=(x, y + (recty / 2.)), + r = (xsize / 2.), + fill=svg_color(color)) + + rect = self.dwg.rect(insert=(x, y), + size=(xsize, ysize), + fill=svg_color(color)) + c1.fill(opacity=self.alpha) + c2.fill(opacity=self.alpha) + rect.fill(opacity=self.alpha) + self.dwg.add(c1) + self.dwg.add(c2) + self.dwg.add(rect) + + def _render_drill(self, primitive, color): + center = map(mul, primitive.position, self.scale) + hit = self.dwg.circle(center=center, r=SCALE * primitive.radius, + fill=svg_color(color)) + self.dwg.add(hit) diff --git a/gerber/render_svg.py b/gerber/render_svg.py deleted file mode 100644 index cb42371..0000000 --- a/gerber/render_svg.py +++ /dev/null @@ -1,114 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# Copyright 2013-2014 Paulo Henrique Silva <ph.silva@gmail.com> - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from .render import GerberContext, INTERPOLATION_LINEAR, INTERPOLATION_ARC -import svgwrite - - -class Shape(object): - pass - - -class Circle(Shape): - def __init__(self, diameter=0.0): - self.diameter = diameter - - def draw(self, ctx, x, y): - return ctx.dwg.line(start=(ctx.x*300, ctx.y*300), end=(x*300, y*300), stroke="rgb(184, 115, 51)", - stroke_width=2, stroke_linecap="round") - - def flash(self, ctx, x, y): - return ctx.dwg.circle(center=(x*300, y*300), r=300*(self.diameter/2.0), fill="rgb(184, 115, 51)") - - -class Rect(Shape): - def __init__(self, size=(0, 0)): - self.size = size - - def draw(self, ctx, x, y): - return ctx.dwg.line(start=(ctx.x*300, ctx.y*300), end=(x*300, y*300), stroke="rgb(184, 115, 51)", - stroke_width=2, stroke_linecap="butt") - - def flash(self, ctx, x, y): - # Center the rectange on x,y - x -= (self.size[0] / 2.0) - y -= (self.size[0] / 2.0) - return ctx.dwg.rect(insert=(300*x, 300*y), size=(300*float(self.size[0]), 300*float(self.size[1])), - fill="rgb(184, 115, 51)") - - -class GerberSvgContext(GerberContext): - def __init__(self): - GerberContext.__init__(self) - - self.apertures = {} - self.dwg = svgwrite.Drawing() - self.dwg.add(self.dwg.rect(insert=(0, 0), size=(2000, 2000), fill="black")) - - def define_aperture(self, d, shape, modifiers): - aperture = None - if shape == "C": - aperture = Circle(diameter=float(modifiers[0][0])) - elif shape == "R": - aperture = Rect(size=modifiers[0][0:2]) - - self.apertures[d] = aperture - - def stroke(self, x, y): - super(GerberSvgContext, self).stroke(x, y) - - if self.interpolation == INTERPOLATION_LINEAR: - self.line(x, y) - elif self.interpolation == INTERPOLATION_ARC: - self.arc(x, y) - - def line(self, x, y): - super(GerberSvgContext, self).line(x, y) - - x, y = self.resolve(x, y) - - ap = self.apertures.get(str(self.aperture), None) - if ap is None: - return - - self.dwg.add(ap.draw(self, x, y)) - - self.move(x, y, resolve=False) - - def arc(self, x, y): - super(GerberSvgContext, self).arc(x, y) - - def flash(self, x, y): - super(GerberSvgContext, self).flash(x, y) - - x, y = self.resolve(x, y) - - ap = self.apertures.get(str(self.aperture), None) - if ap is None: - return - - self.dwg.add(ap.flash(self, x, y)) - - self.move(x, y, resolve=False) - - def drill(self, x, y, diameter): - hit = self.dwg.circle(center=(x*300, y*300), r=300*(diameter/2.0), fill="gray") - self.dwg.add(hit) - - - def dump(self,filename='teste.svg'): - self.dwg.saveas(filename) diff --git a/gerber/rs274x.py b/gerber/rs274x.py new file mode 100644 index 0000000..f18a35d --- /dev/null +++ b/gerber/rs274x.py @@ -0,0 +1,434 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> +# Modified from parser.py by Paulo Henrique Silva <ph.silva@gmail.com> +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" This module provides an RS-274-X class and parser. +""" + + +import copy +import json +import re +from .gerber_statements import * +from .primitives import * +from .cam import CamFile, FileSettings + +def read(filename): + """ Read data from filename and return a GerberFile + + Parameters + ---------- + filename : string + Filename of file to parse + + Returns + ------- + file : :class:`gerber.rs274x.GerberFile` + A GerberFile created from the specified file. + """ + return GerberParser().parse(filename) + + +class GerberFile(CamFile): + """ A class representing a single gerber file + + The GerberFile class represents a single gerber file. + + Parameters + ---------- + statements : list + list of gerber file statements + + settings : dict + Dictionary of gerber file settings + + filename : string + Filename of the source gerber file + + Attributes + ---------- + comments: list of strings + List of comments contained in the gerber file. + + size : tuple, (<float>, <float>) + Size in [self.units] of the layer described by the gerber file. + + bounds: tuple, ((<float>, <float>), (<float>, <float>)) + boundaries of the layer described by the gerber file. + `bounds` is stored as ((min x, max x), (min y, max y)) + + """ + def __init__(self, statements, settings, primitives, filename=None): + super(GerberFile, self).__init__(statements, settings, primitives, filename) + + + @property + def comments(self): + return [comment.comment for comment in self.statements + if isinstance(comment, CommentStmt)] + + @property + def size(self): + xbounds, ybounds = self.bounds + return (xbounds[1] - xbounds[0], ybounds[1] - ybounds[0]) + + @property + def bounds(self): + xbounds = [0.0, 0.0] + ybounds = [0.0, 0.0] + for stmt in [stmt for stmt in self.statements + if isinstance(stmt, CoordStmt)]: + if stmt.x is not None: + if stmt.x < xbounds[0]: + xbounds[0] = stmt.x + elif stmt.x > xbounds[1]: + xbounds[1] = stmt.x + if stmt.y is not None: + if stmt.y < ybounds[0]: + ybounds[0] = stmt.y + elif stmt.y > ybounds[1]: + ybounds[1] = stmt.y + return (xbounds, ybounds) + + + def write(self, filename): + """ Write data out to a gerber file + """ + with open(filename, 'w') as f: + for statement in self.statements: + f.write(statement.to_gerber()) + + +class GerberParser(object): + """ GerberParser + """ + NUMBER = r"[\+-]?\d+" + DECIMAL = r"[\+-]?\d+([.]?\d+)?" + STRING = r"[a-zA-Z0-9_+\-/!?<>”’(){}.\|&@# :]+" + NAME = r"[a-zA-Z_$][a-zA-Z_$0-9]+" + FUNCTION = r"G\d{2}" + + COORD_OP = r"D[0]?[123]" + + FS = r"(?P<param>FS)(?P<zero>(L|T))?(?P<notation>(A|I))X(?P<x>[0-7][0-7])Y(?P<y>[0-7][0-7])" + MO = r"(?P<param>MO)(?P<mo>(MM|IN))" + IP = r"(?P<param>IP)(?P<ip>(POS|NEG))" + LP = r"(?P<param>LP)(?P<lp>(D|C))" + AD_CIRCLE = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>C)[,](?P<modifiers>[^,]*)" + AD_RECT = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>R)[,]?(?P<modifiers>[^,]+)?" + AD_OBROUND = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>O)[,](?P<modifiers>[^,]*)" + AD_POLY = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>P)[,](?P<modifiers>[^,]*)" + AD_MACRO = r"(?P<param>AD)D(?P<d>\d+)(?P<shape>{name})[,]?(?P<modifiers>[^,]+)?".format(name=NAME) + AM = r"(?P<param>AM)(?P<name>{name})\*(?P<macro>.*)".format(name=NAME) + + # begin deprecated + OF = r"(?P<param>OF)(A(?P<a>{decimal}))?(B(?P<b>{decimal}))?".format(decimal=DECIMAL) + IN = r"(?P<param>IN)(?P<name>.*)" + LN = r"(?P<param>LN)(?P<name>.*)" + # end deprecated + + PARAMS = (FS, MO, IP, LP, AD_CIRCLE, AD_RECT, AD_OBROUND, AD_POLY, AD_MACRO, AM, OF, IN, LN) + PARAM_STMT = [re.compile(r"%{0}\*%".format(p)) for p in PARAMS] + + COORD_STMT = re.compile(( + r"(?P<function>{function})?" + r"(X(?P<x>{number}))?(Y(?P<y>{number}))?" + r"(I(?P<i>{number}))?(J(?P<j>{number}))?" + r"(?P<op>{op})?\*".format(number=NUMBER, function=FUNCTION, op=COORD_OP))) + + APERTURE_STMT = re.compile(r"(G54)?D(?P<d>\d+)\*") + + COMMENT_STMT = re.compile(r"G04(?P<comment>[^*]*)(\*)?") + + EOF_STMT = re.compile(r"(?P<eof>M02)\*") + + REGION_MODE_STMT = re.compile(r'(?P<mode>G3[67])\*') + QUAD_MODE_STMT = re.compile(r'(?P<mode>G7[45])\*') + + def __init__(self): + self.settings = FileSettings() + self.statements = [] + self.primitives = [] + self.apertures = {} + self.current_region = None + self.x = 0 + self.y = 0 + + self.aperture = 0 + self.interpolation = 'linear' + self.direction = 'clockwise' + self.image_polarity = 'positive' + self.level_polarity = 'dark' + self.region_mode = 'off' + self.quadrant_mode = 'multi-quadrant' + self.step_and_repeat = (1, 1, 0, 0) + + + def parse(self, filename): + fp = open(filename, "r") + data = fp.readlines() + + for stmt in self._parse(data): + self.evaluate(stmt) + self.statements.append(stmt) + + return GerberFile(self.statements, self.settings, self.primitives, filename) + + def dump_json(self): + stmts = {"statements": [stmt.__dict__ for stmt in self.statements]} + return json.dumps(stmts) + + def dump_str(self): + s = "" + for stmt in self.statements: + s += str(stmt) + "\n" + return s + + def _parse(self, data): + oldline = '' + + for i, line in enumerate(data): + line = oldline + line.strip() + + # skip empty lines + if not len(line): + continue + + # deal with multi-line parameters + if line.startswith("%") and not line.endswith("%"): + oldline = line + continue + + did_something = True # make sure we do at least one loop + while did_something and len(line) > 0: + did_something = False + + # Region Mode + (mode, r) = _match_one(self.REGION_MODE_STMT, line) + if mode: + yield RegionModeStmt.from_gerber(line) + line = r + did_something = True + continue + + # Quadrant Mode + (mode, r) = _match_one(self.QUAD_MODE_STMT, line) + if mode: + yield QuadrantModeStmt.from_gerber(line) + line = r + did_something = True + continue + + # coord + (coord, r) = _match_one(self.COORD_STMT, line) + if coord: + yield CoordStmt.from_dict(coord, self.settings) + line = r + did_something = True + continue + + # aperture selection + (aperture, r) = _match_one(self.APERTURE_STMT, line) + if aperture: + yield ApertureStmt(**aperture) + + did_something = True + line = r + continue + + # comment + (comment, r) = _match_one(self.COMMENT_STMT, line) + if comment: + yield CommentStmt(comment["comment"]) + did_something = True + line = r + continue + + # parameter + (param, r) = _match_one_from_many(self.PARAM_STMT, line) + if param: + if param["param"] == "FS": + stmt = FSParamStmt.from_dict(param) + self.settings.zero_suppression = stmt.zero_suppression + self.settings.format = stmt.format + self.settings.notation = stmt.notation + yield stmt + elif param["param"] == "MO": + stmt = MOParamStmt.from_dict(param) + self.settings.units = stmt.mode + yield stmt + elif param["param"] == "IP": + yield IPParamStmt.from_dict(param) + elif param["param"] == "LP": + yield LPParamStmt.from_dict(param) + elif param["param"] == "AD": + yield ADParamStmt.from_dict(param) + elif param["param"] == "AM": + yield AMParamStmt.from_dict(param) + elif param["param"] == "OF": + yield OFParamStmt.from_dict(param) + elif param["param"] == "IN": + yield INParamStmt.from_dict(param) + elif param["param"] == "LN": + yield LNParamStmt.from_dict(param) + else: + yield UnknownStmt(line) + did_something = True + line = r + continue + + # eof + (eof, r) = _match_one(self.EOF_STMT, line) + if eof: + yield EofStmt() + did_something = True + line = r + continue + + if False: + print self.COORD_STMT.pattern + print self.APERTURE_STMT.pattern + print self.COMMENT_STMT.pattern + print self.EOF_STMT.pattern + for i in self.PARAM_STMT: + print i.pattern + + if line.find('*') > 0: + yield UnknownStmt(line) + oldline = line + + def evaluate(self, stmt): + """ Evaluate Gerber statement and update image accordingly. + + This method is called once for each statement in the file as it + is parsed. + + Parameters + ---------- + statement : Statement + Gerber/Excellon statement to evaluate. + + """ + if isinstance(stmt, CoordStmt): + self._evaluate_coord(stmt) + + elif isinstance(stmt, ParamStmt): + self._evaluate_param(stmt) + + elif isinstance(stmt, ApertureStmt): + self._evaluate_aperture(stmt) + + elif isinstance(stmt, (RegionModeStmt, QuadrantModeStmt)): + self._evaluate_mode(stmt) + + elif isinstance(stmt, (CommentStmt, UnknownStmt, EofStmt)): + return + + else: + raise Exception("Invalid statement to evaluate") + + + def _define_aperture(self, d, shape, modifiers): + aperture = None + if shape == 'C': + diameter = float(modifiers[0][0]) + aperture = Circle(position=None, diameter=diameter) + elif shape == 'R': + width = float(modifiers[0][0]) + height = float(modifiers[0][1]) + aperture = Rectangle(position=None, width=width, height=height) + elif shape == 'O': + width = float(modifiers[0][0]) + height = float(modifiers[0][1]) + aperture = Obround(position=None, width=width, height=height) + self.apertures[d] = aperture + + def _evaluate_mode(self, stmt): + if stmt.type == 'RegionMode': + if self.region_mode == 'on' and stmt.mode == 'off': + self.primitives.append(Region(self.current_region, self.level_polarity)) + self.current_region = None + self.region_mode = stmt.mode + elif stmt.type == 'QuadrantMode': + self.quadrant_mode = stmt.mode + + def _evaluate_param(self, stmt): + if stmt.param == "FS": + self.settings.zero_suppression = stmt.zero_suppression + self.settings.format = stmt.format + self.settings.notation = stmt.notation + elif stmt.param == "MO": + self.settings.units = stmt.mode + elif stmt.param == "IP": + self.image_polarity = stmt.ip + elif stmt.param == "LP": + self.level_polarity = stmt.lp + elif stmt.param == "AD": + self._define_aperture(stmt.d, stmt.shape, stmt.modifiers) + + def _evaluate_coord(self, stmt): + x = self.x if stmt.x is None else stmt.x + y = self.y if stmt.y is None else stmt.y + if stmt.function in ("G01", "G1"): + self.interpolation = 'linear' + elif stmt.function in ('G02', 'G2', 'G03', 'G3'): + self.interpolation = 'arc' + self.direction = ('clockwise' if stmt.function in ('G02', 'G2') + else 'counterclockwise') + if stmt.op == "D01": + if self.region_mode == 'on': + if self.current_region is None: + self.current_region = [(self.x, self.y), ] + self.current_region.append((x, y,)) + else: + start = (self.x, self.y) + end = (x, y) + width = self.apertures[self.aperture].stroke_width + if self.interpolation == 'linear': + self.primitives.append(Line(start, end, width, self.level_polarity)) + else: + center = (start[0] + stmt.i, start[1] + stmt.j) + self.primitives.append(Arc(start, end, center, self.direction, width, self.level_polarity)) + + elif stmt.op == "D02": + pass + + elif stmt.op == "D03": + primitive = copy.deepcopy(self.apertures[self.aperture]) + primitive.position = (x, y) + primitive.level_polarity = self.level_polarity + self.primitives.append(primitive) + self.x, self.y = x, y + + def _evaluate_aperture(self, stmt): + self.aperture = stmt.d + + +def _match_one(expr, data): + match = expr.match(data) + if match is None: + return ({}, None) + else: + return (match.groupdict(), data[match.end(0):]) + + +def _match_one_from_many(exprs, data): + for expr in exprs: + match = expr.match(data) + if match: + return (match.groupdict(), data[match.end(0):]) + + return ({}, None) diff --git a/gerber/tests/__init__.py b/gerber/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/gerber/tests/__init__.py diff --git a/gerber/tests/resources/board_outline.GKO b/gerber/tests/resources/board_outline.GKO new file mode 100644 index 0000000..40b8c7d --- /dev/null +++ b/gerber/tests/resources/board_outline.GKO @@ -0,0 +1,503 @@ +G75* +%MOIN*% +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0000*% +%ADD11C,0.0004*% +D10* +X000300Y003064D02* +X000300Y018064D01* +X022800Y018064D01* +X022800Y003064D01* +X000300Y003064D01* +X001720Y005114D02* +X001722Y005164D01* +X001728Y005214D01* +X001738Y005263D01* +X001752Y005311D01* +X001769Y005358D01* +X001790Y005403D01* +X001815Y005447D01* +X001843Y005488D01* +X001875Y005527D01* +X001909Y005564D01* +X001946Y005598D01* +X001986Y005628D01* +X002028Y005655D01* +X002072Y005679D01* +X002118Y005700D01* +X002165Y005716D01* +X002213Y005729D01* +X002263Y005738D01* +X002312Y005743D01* +X002363Y005744D01* +X002413Y005741D01* +X002462Y005734D01* +X002511Y005723D01* +X002559Y005708D01* +X002605Y005690D01* +X002650Y005668D01* +X002693Y005642D01* +X002734Y005613D01* +X002773Y005581D01* +X002809Y005546D01* +X002841Y005508D01* +X002871Y005468D01* +X002898Y005425D01* +X002921Y005381D01* +X002940Y005335D01* +X002956Y005287D01* +X002968Y005238D01* +X002976Y005189D01* +X002980Y005139D01* +X002980Y005089D01* +X002976Y005039D01* +X002968Y004990D01* +X002956Y004941D01* +X002940Y004893D01* +X002921Y004847D01* +X002898Y004803D01* +X002871Y004760D01* +X002841Y004720D01* +X002809Y004682D01* +X002773Y004647D01* +X002734Y004615D01* +X002693Y004586D01* +X002650Y004560D01* +X002605Y004538D01* +X002559Y004520D01* +X002511Y004505D01* +X002462Y004494D01* +X002413Y004487D01* +X002363Y004484D01* +X002312Y004485D01* +X002263Y004490D01* +X002213Y004499D01* +X002165Y004512D01* +X002118Y004528D01* +X002072Y004549D01* +X002028Y004573D01* +X001986Y004600D01* +X001946Y004630D01* +X001909Y004664D01* +X001875Y004701D01* +X001843Y004740D01* +X001815Y004781D01* +X001790Y004825D01* +X001769Y004870D01* +X001752Y004917D01* +X001738Y004965D01* +X001728Y005014D01* +X001722Y005064D01* +X001720Y005114D01* +X001670Y016064D02* +X001672Y016114D01* +X001678Y016164D01* +X001688Y016213D01* +X001702Y016261D01* +X001719Y016308D01* +X001740Y016353D01* +X001765Y016397D01* +X001793Y016438D01* +X001825Y016477D01* +X001859Y016514D01* +X001896Y016548D01* +X001936Y016578D01* +X001978Y016605D01* +X002022Y016629D01* +X002068Y016650D01* +X002115Y016666D01* +X002163Y016679D01* +X002213Y016688D01* +X002262Y016693D01* +X002313Y016694D01* +X002363Y016691D01* +X002412Y016684D01* +X002461Y016673D01* +X002509Y016658D01* +X002555Y016640D01* +X002600Y016618D01* +X002643Y016592D01* +X002684Y016563D01* +X002723Y016531D01* +X002759Y016496D01* +X002791Y016458D01* +X002821Y016418D01* +X002848Y016375D01* +X002871Y016331D01* +X002890Y016285D01* +X002906Y016237D01* +X002918Y016188D01* +X002926Y016139D01* +X002930Y016089D01* +X002930Y016039D01* +X002926Y015989D01* +X002918Y015940D01* +X002906Y015891D01* +X002890Y015843D01* +X002871Y015797D01* +X002848Y015753D01* +X002821Y015710D01* +X002791Y015670D01* +X002759Y015632D01* +X002723Y015597D01* +X002684Y015565D01* +X002643Y015536D01* +X002600Y015510D01* +X002555Y015488D01* +X002509Y015470D01* +X002461Y015455D01* +X002412Y015444D01* +X002363Y015437D01* +X002313Y015434D01* +X002262Y015435D01* +X002213Y015440D01* +X002163Y015449D01* +X002115Y015462D01* +X002068Y015478D01* +X002022Y015499D01* +X001978Y015523D01* +X001936Y015550D01* +X001896Y015580D01* +X001859Y015614D01* +X001825Y015651D01* +X001793Y015690D01* +X001765Y015731D01* +X001740Y015775D01* +X001719Y015820D01* +X001702Y015867D01* +X001688Y015915D01* +X001678Y015964D01* +X001672Y016014D01* +X001670Y016064D01* +X020060Y012714D02* +X020062Y012764D01* +X020068Y012814D01* +X020078Y012863D01* +X020091Y012912D01* +X020109Y012959D01* +X020130Y013005D01* +X020154Y013048D01* +X020182Y013090D01* +X020213Y013130D01* +X020247Y013167D01* +X020284Y013201D01* +X020324Y013232D01* +X020366Y013260D01* +X020409Y013284D01* +X020455Y013305D01* +X020502Y013323D01* +X020551Y013336D01* +X020600Y013346D01* +X020650Y013352D01* +X020700Y013354D01* +X020750Y013352D01* +X020800Y013346D01* +X020849Y013336D01* +X020898Y013323D01* +X020945Y013305D01* +X020991Y013284D01* +X021034Y013260D01* +X021076Y013232D01* +X021116Y013201D01* +X021153Y013167D01* +X021187Y013130D01* +X021218Y013090D01* +X021246Y013048D01* +X021270Y013005D01* +X021291Y012959D01* +X021309Y012912D01* +X021322Y012863D01* +X021332Y012814D01* +X021338Y012764D01* +X021340Y012714D01* +X021338Y012664D01* +X021332Y012614D01* +X021322Y012565D01* +X021309Y012516D01* +X021291Y012469D01* +X021270Y012423D01* +X021246Y012380D01* +X021218Y012338D01* +X021187Y012298D01* +X021153Y012261D01* +X021116Y012227D01* +X021076Y012196D01* +X021034Y012168D01* +X020991Y012144D01* +X020945Y012123D01* +X020898Y012105D01* +X020849Y012092D01* +X020800Y012082D01* +X020750Y012076D01* +X020700Y012074D01* +X020650Y012076D01* +X020600Y012082D01* +X020551Y012092D01* +X020502Y012105D01* +X020455Y012123D01* +X020409Y012144D01* +X020366Y012168D01* +X020324Y012196D01* +X020284Y012227D01* +X020247Y012261D01* +X020213Y012298D01* +X020182Y012338D01* +X020154Y012380D01* +X020130Y012423D01* +X020109Y012469D01* +X020091Y012516D01* +X020078Y012565D01* +X020068Y012614D01* +X020062Y012664D01* +X020060Y012714D01* +X020170Y016064D02* +X020172Y016114D01* +X020178Y016164D01* +X020188Y016213D01* +X020202Y016261D01* +X020219Y016308D01* +X020240Y016353D01* +X020265Y016397D01* +X020293Y016438D01* +X020325Y016477D01* +X020359Y016514D01* +X020396Y016548D01* +X020436Y016578D01* +X020478Y016605D01* +X020522Y016629D01* +X020568Y016650D01* +X020615Y016666D01* +X020663Y016679D01* +X020713Y016688D01* +X020762Y016693D01* +X020813Y016694D01* +X020863Y016691D01* +X020912Y016684D01* +X020961Y016673D01* +X021009Y016658D01* +X021055Y016640D01* +X021100Y016618D01* +X021143Y016592D01* +X021184Y016563D01* +X021223Y016531D01* +X021259Y016496D01* +X021291Y016458D01* +X021321Y016418D01* +X021348Y016375D01* +X021371Y016331D01* +X021390Y016285D01* +X021406Y016237D01* +X021418Y016188D01* +X021426Y016139D01* +X021430Y016089D01* +X021430Y016039D01* +X021426Y015989D01* +X021418Y015940D01* +X021406Y015891D01* +X021390Y015843D01* +X021371Y015797D01* +X021348Y015753D01* +X021321Y015710D01* +X021291Y015670D01* +X021259Y015632D01* +X021223Y015597D01* +X021184Y015565D01* +X021143Y015536D01* +X021100Y015510D01* +X021055Y015488D01* +X021009Y015470D01* +X020961Y015455D01* +X020912Y015444D01* +X020863Y015437D01* +X020813Y015434D01* +X020762Y015435D01* +X020713Y015440D01* +X020663Y015449D01* +X020615Y015462D01* +X020568Y015478D01* +X020522Y015499D01* +X020478Y015523D01* +X020436Y015550D01* +X020396Y015580D01* +X020359Y015614D01* +X020325Y015651D01* +X020293Y015690D01* +X020265Y015731D01* +X020240Y015775D01* +X020219Y015820D01* +X020202Y015867D01* +X020188Y015915D01* +X020178Y015964D01* +X020172Y016014D01* +X020170Y016064D01* +X020060Y008714D02* +X020062Y008764D01* +X020068Y008814D01* +X020078Y008863D01* +X020091Y008912D01* +X020109Y008959D01* +X020130Y009005D01* +X020154Y009048D01* +X020182Y009090D01* +X020213Y009130D01* +X020247Y009167D01* +X020284Y009201D01* +X020324Y009232D01* +X020366Y009260D01* +X020409Y009284D01* +X020455Y009305D01* +X020502Y009323D01* +X020551Y009336D01* +X020600Y009346D01* +X020650Y009352D01* +X020700Y009354D01* +X020750Y009352D01* +X020800Y009346D01* +X020849Y009336D01* +X020898Y009323D01* +X020945Y009305D01* +X020991Y009284D01* +X021034Y009260D01* +X021076Y009232D01* +X021116Y009201D01* +X021153Y009167D01* +X021187Y009130D01* +X021218Y009090D01* +X021246Y009048D01* +X021270Y009005D01* +X021291Y008959D01* +X021309Y008912D01* +X021322Y008863D01* +X021332Y008814D01* +X021338Y008764D01* +X021340Y008714D01* +X021338Y008664D01* +X021332Y008614D01* +X021322Y008565D01* +X021309Y008516D01* +X021291Y008469D01* +X021270Y008423D01* +X021246Y008380D01* +X021218Y008338D01* +X021187Y008298D01* +X021153Y008261D01* +X021116Y008227D01* +X021076Y008196D01* +X021034Y008168D01* +X020991Y008144D01* +X020945Y008123D01* +X020898Y008105D01* +X020849Y008092D01* +X020800Y008082D01* +X020750Y008076D01* +X020700Y008074D01* +X020650Y008076D01* +X020600Y008082D01* +X020551Y008092D01* +X020502Y008105D01* +X020455Y008123D01* +X020409Y008144D01* +X020366Y008168D01* +X020324Y008196D01* +X020284Y008227D01* +X020247Y008261D01* +X020213Y008298D01* +X020182Y008338D01* +X020154Y008380D01* +X020130Y008423D01* +X020109Y008469D01* +X020091Y008516D01* +X020078Y008565D01* +X020068Y008614D01* +X020062Y008664D01* +X020060Y008714D01* +X020170Y005064D02* +X020172Y005114D01* +X020178Y005164D01* +X020188Y005213D01* +X020202Y005261D01* +X020219Y005308D01* +X020240Y005353D01* +X020265Y005397D01* +X020293Y005438D01* +X020325Y005477D01* +X020359Y005514D01* +X020396Y005548D01* +X020436Y005578D01* +X020478Y005605D01* +X020522Y005629D01* +X020568Y005650D01* +X020615Y005666D01* +X020663Y005679D01* +X020713Y005688D01* +X020762Y005693D01* +X020813Y005694D01* +X020863Y005691D01* +X020912Y005684D01* +X020961Y005673D01* +X021009Y005658D01* +X021055Y005640D01* +X021100Y005618D01* +X021143Y005592D01* +X021184Y005563D01* +X021223Y005531D01* +X021259Y005496D01* +X021291Y005458D01* +X021321Y005418D01* +X021348Y005375D01* +X021371Y005331D01* +X021390Y005285D01* +X021406Y005237D01* +X021418Y005188D01* +X021426Y005139D01* +X021430Y005089D01* +X021430Y005039D01* +X021426Y004989D01* +X021418Y004940D01* +X021406Y004891D01* +X021390Y004843D01* +X021371Y004797D01* +X021348Y004753D01* +X021321Y004710D01* +X021291Y004670D01* +X021259Y004632D01* +X021223Y004597D01* +X021184Y004565D01* +X021143Y004536D01* +X021100Y004510D01* +X021055Y004488D01* +X021009Y004470D01* +X020961Y004455D01* +X020912Y004444D01* +X020863Y004437D01* +X020813Y004434D01* +X020762Y004435D01* +X020713Y004440D01* +X020663Y004449D01* +X020615Y004462D01* +X020568Y004478D01* +X020522Y004499D01* +X020478Y004523D01* +X020436Y004550D01* +X020396Y004580D01* +X020359Y004614D01* +X020325Y004651D01* +X020293Y004690D01* +X020265Y004731D01* +X020240Y004775D01* +X020219Y004820D01* +X020202Y004867D01* +X020188Y004915D01* +X020178Y004964D01* +X020172Y005014D01* +X020170Y005064D01* +D11* +X022869Y007639D02* +X022869Y013789D01* +M02* diff --git a/gerber/tests/resources/bottom_copper.GBL b/gerber/tests/resources/bottom_copper.GBL new file mode 100644 index 0000000..0d98da3 --- /dev/null +++ b/gerber/tests/resources/bottom_copper.GBL @@ -0,0 +1,1811 @@ +G75* +%MOIN*% +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0000*% +%ADD11C,0.0110*% +%ADD12C,0.0004*% +%ADD13C,0.0554*% +%ADD14C,0.0600*% +%ADD15C,0.0160*% +%ADD16C,0.0396*% +%ADD17C,0.0240*% +D10* +X000300Y003064D02* +X000300Y018064D01* +X022800Y018064D01* +X022800Y003064D01* +X000300Y003064D01* +X001720Y005114D02* +X001722Y005164D01* +X001728Y005214D01* +X001738Y005263D01* +X001752Y005311D01* +X001769Y005358D01* +X001790Y005403D01* +X001815Y005447D01* +X001843Y005488D01* +X001875Y005527D01* +X001909Y005564D01* +X001946Y005598D01* +X001986Y005628D01* +X002028Y005655D01* +X002072Y005679D01* +X002118Y005700D01* +X002165Y005716D01* +X002213Y005729D01* +X002263Y005738D01* +X002312Y005743D01* +X002363Y005744D01* +X002413Y005741D01* +X002462Y005734D01* +X002511Y005723D01* +X002559Y005708D01* +X002605Y005690D01* +X002650Y005668D01* +X002693Y005642D01* +X002734Y005613D01* +X002773Y005581D01* +X002809Y005546D01* +X002841Y005508D01* +X002871Y005468D01* +X002898Y005425D01* +X002921Y005381D01* +X002940Y005335D01* +X002956Y005287D01* +X002968Y005238D01* +X002976Y005189D01* +X002980Y005139D01* +X002980Y005089D01* +X002976Y005039D01* +X002968Y004990D01* +X002956Y004941D01* +X002940Y004893D01* +X002921Y004847D01* +X002898Y004803D01* +X002871Y004760D01* +X002841Y004720D01* +X002809Y004682D01* +X002773Y004647D01* +X002734Y004615D01* +X002693Y004586D01* +X002650Y004560D01* +X002605Y004538D01* +X002559Y004520D01* +X002511Y004505D01* +X002462Y004494D01* +X002413Y004487D01* +X002363Y004484D01* +X002312Y004485D01* +X002263Y004490D01* +X002213Y004499D01* +X002165Y004512D01* +X002118Y004528D01* +X002072Y004549D01* +X002028Y004573D01* +X001986Y004600D01* +X001946Y004630D01* +X001909Y004664D01* +X001875Y004701D01* +X001843Y004740D01* +X001815Y004781D01* +X001790Y004825D01* +X001769Y004870D01* +X001752Y004917D01* +X001738Y004965D01* +X001728Y005014D01* +X001722Y005064D01* +X001720Y005114D01* +X001670Y016064D02* +X001672Y016114D01* +X001678Y016164D01* +X001688Y016213D01* +X001702Y016261D01* +X001719Y016308D01* +X001740Y016353D01* +X001765Y016397D01* +X001793Y016438D01* +X001825Y016477D01* +X001859Y016514D01* +X001896Y016548D01* +X001936Y016578D01* +X001978Y016605D01* +X002022Y016629D01* +X002068Y016650D01* +X002115Y016666D01* +X002163Y016679D01* +X002213Y016688D01* +X002262Y016693D01* +X002313Y016694D01* +X002363Y016691D01* +X002412Y016684D01* +X002461Y016673D01* +X002509Y016658D01* +X002555Y016640D01* +X002600Y016618D01* +X002643Y016592D01* +X002684Y016563D01* +X002723Y016531D01* +X002759Y016496D01* +X002791Y016458D01* +X002821Y016418D01* +X002848Y016375D01* +X002871Y016331D01* +X002890Y016285D01* +X002906Y016237D01* +X002918Y016188D01* +X002926Y016139D01* +X002930Y016089D01* +X002930Y016039D01* +X002926Y015989D01* +X002918Y015940D01* +X002906Y015891D01* +X002890Y015843D01* +X002871Y015797D01* +X002848Y015753D01* +X002821Y015710D01* +X002791Y015670D01* +X002759Y015632D01* +X002723Y015597D01* +X002684Y015565D01* +X002643Y015536D01* +X002600Y015510D01* +X002555Y015488D01* +X002509Y015470D01* +X002461Y015455D01* +X002412Y015444D01* +X002363Y015437D01* +X002313Y015434D01* +X002262Y015435D01* +X002213Y015440D01* +X002163Y015449D01* +X002115Y015462D01* +X002068Y015478D01* +X002022Y015499D01* +X001978Y015523D01* +X001936Y015550D01* +X001896Y015580D01* +X001859Y015614D01* +X001825Y015651D01* +X001793Y015690D01* +X001765Y015731D01* +X001740Y015775D01* +X001719Y015820D01* +X001702Y015867D01* +X001688Y015915D01* +X001678Y015964D01* +X001672Y016014D01* +X001670Y016064D01* +X020060Y012714D02* +X020062Y012764D01* +X020068Y012814D01* +X020078Y012863D01* +X020091Y012912D01* +X020109Y012959D01* +X020130Y013005D01* +X020154Y013048D01* +X020182Y013090D01* +X020213Y013130D01* +X020247Y013167D01* +X020284Y013201D01* +X020324Y013232D01* +X020366Y013260D01* +X020409Y013284D01* +X020455Y013305D01* +X020502Y013323D01* +X020551Y013336D01* +X020600Y013346D01* +X020650Y013352D01* +X020700Y013354D01* +X020750Y013352D01* +X020800Y013346D01* +X020849Y013336D01* +X020898Y013323D01* +X020945Y013305D01* +X020991Y013284D01* +X021034Y013260D01* +X021076Y013232D01* +X021116Y013201D01* +X021153Y013167D01* +X021187Y013130D01* +X021218Y013090D01* +X021246Y013048D01* +X021270Y013005D01* +X021291Y012959D01* +X021309Y012912D01* +X021322Y012863D01* +X021332Y012814D01* +X021338Y012764D01* +X021340Y012714D01* +X021338Y012664D01* +X021332Y012614D01* +X021322Y012565D01* +X021309Y012516D01* +X021291Y012469D01* +X021270Y012423D01* +X021246Y012380D01* +X021218Y012338D01* +X021187Y012298D01* +X021153Y012261D01* +X021116Y012227D01* +X021076Y012196D01* +X021034Y012168D01* +X020991Y012144D01* +X020945Y012123D01* +X020898Y012105D01* +X020849Y012092D01* +X020800Y012082D01* +X020750Y012076D01* +X020700Y012074D01* +X020650Y012076D01* +X020600Y012082D01* +X020551Y012092D01* +X020502Y012105D01* +X020455Y012123D01* +X020409Y012144D01* +X020366Y012168D01* +X020324Y012196D01* +X020284Y012227D01* +X020247Y012261D01* +X020213Y012298D01* +X020182Y012338D01* +X020154Y012380D01* +X020130Y012423D01* +X020109Y012469D01* +X020091Y012516D01* +X020078Y012565D01* +X020068Y012614D01* +X020062Y012664D01* +X020060Y012714D01* +X020170Y016064D02* +X020172Y016114D01* +X020178Y016164D01* +X020188Y016213D01* +X020202Y016261D01* +X020219Y016308D01* +X020240Y016353D01* +X020265Y016397D01* +X020293Y016438D01* +X020325Y016477D01* +X020359Y016514D01* +X020396Y016548D01* +X020436Y016578D01* +X020478Y016605D01* +X020522Y016629D01* +X020568Y016650D01* +X020615Y016666D01* +X020663Y016679D01* +X020713Y016688D01* +X020762Y016693D01* +X020813Y016694D01* +X020863Y016691D01* +X020912Y016684D01* +X020961Y016673D01* +X021009Y016658D01* +X021055Y016640D01* +X021100Y016618D01* +X021143Y016592D01* +X021184Y016563D01* +X021223Y016531D01* +X021259Y016496D01* +X021291Y016458D01* +X021321Y016418D01* +X021348Y016375D01* +X021371Y016331D01* +X021390Y016285D01* +X021406Y016237D01* +X021418Y016188D01* +X021426Y016139D01* +X021430Y016089D01* +X021430Y016039D01* +X021426Y015989D01* +X021418Y015940D01* +X021406Y015891D01* +X021390Y015843D01* +X021371Y015797D01* +X021348Y015753D01* +X021321Y015710D01* +X021291Y015670D01* +X021259Y015632D01* +X021223Y015597D01* +X021184Y015565D01* +X021143Y015536D01* +X021100Y015510D01* +X021055Y015488D01* +X021009Y015470D01* +X020961Y015455D01* +X020912Y015444D01* +X020863Y015437D01* +X020813Y015434D01* +X020762Y015435D01* +X020713Y015440D01* +X020663Y015449D01* +X020615Y015462D01* +X020568Y015478D01* +X020522Y015499D01* +X020478Y015523D01* +X020436Y015550D01* +X020396Y015580D01* +X020359Y015614D01* +X020325Y015651D01* +X020293Y015690D01* +X020265Y015731D01* +X020240Y015775D01* +X020219Y015820D01* +X020202Y015867D01* +X020188Y015915D01* +X020178Y015964D01* +X020172Y016014D01* +X020170Y016064D01* +X020060Y008714D02* +X020062Y008764D01* +X020068Y008814D01* +X020078Y008863D01* +X020091Y008912D01* +X020109Y008959D01* +X020130Y009005D01* +X020154Y009048D01* +X020182Y009090D01* +X020213Y009130D01* +X020247Y009167D01* +X020284Y009201D01* +X020324Y009232D01* +X020366Y009260D01* +X020409Y009284D01* +X020455Y009305D01* +X020502Y009323D01* +X020551Y009336D01* +X020600Y009346D01* +X020650Y009352D01* +X020700Y009354D01* +X020750Y009352D01* +X020800Y009346D01* +X020849Y009336D01* +X020898Y009323D01* +X020945Y009305D01* +X020991Y009284D01* +X021034Y009260D01* +X021076Y009232D01* +X021116Y009201D01* +X021153Y009167D01* +X021187Y009130D01* +X021218Y009090D01* +X021246Y009048D01* +X021270Y009005D01* +X021291Y008959D01* +X021309Y008912D01* +X021322Y008863D01* +X021332Y008814D01* +X021338Y008764D01* +X021340Y008714D01* +X021338Y008664D01* +X021332Y008614D01* +X021322Y008565D01* +X021309Y008516D01* +X021291Y008469D01* +X021270Y008423D01* +X021246Y008380D01* +X021218Y008338D01* +X021187Y008298D01* +X021153Y008261D01* +X021116Y008227D01* +X021076Y008196D01* +X021034Y008168D01* +X020991Y008144D01* +X020945Y008123D01* +X020898Y008105D01* +X020849Y008092D01* +X020800Y008082D01* +X020750Y008076D01* +X020700Y008074D01* +X020650Y008076D01* +X020600Y008082D01* +X020551Y008092D01* +X020502Y008105D01* +X020455Y008123D01* +X020409Y008144D01* +X020366Y008168D01* +X020324Y008196D01* +X020284Y008227D01* +X020247Y008261D01* +X020213Y008298D01* +X020182Y008338D01* +X020154Y008380D01* +X020130Y008423D01* +X020109Y008469D01* +X020091Y008516D01* +X020078Y008565D01* +X020068Y008614D01* +X020062Y008664D01* +X020060Y008714D01* +X020170Y005064D02* +X020172Y005114D01* +X020178Y005164D01* +X020188Y005213D01* +X020202Y005261D01* +X020219Y005308D01* +X020240Y005353D01* +X020265Y005397D01* +X020293Y005438D01* +X020325Y005477D01* +X020359Y005514D01* +X020396Y005548D01* +X020436Y005578D01* +X020478Y005605D01* +X020522Y005629D01* +X020568Y005650D01* +X020615Y005666D01* +X020663Y005679D01* +X020713Y005688D01* +X020762Y005693D01* +X020813Y005694D01* +X020863Y005691D01* +X020912Y005684D01* +X020961Y005673D01* +X021009Y005658D01* +X021055Y005640D01* +X021100Y005618D01* +X021143Y005592D01* +X021184Y005563D01* +X021223Y005531D01* +X021259Y005496D01* +X021291Y005458D01* +X021321Y005418D01* +X021348Y005375D01* +X021371Y005331D01* +X021390Y005285D01* +X021406Y005237D01* +X021418Y005188D01* +X021426Y005139D01* +X021430Y005089D01* +X021430Y005039D01* +X021426Y004989D01* +X021418Y004940D01* +X021406Y004891D01* +X021390Y004843D01* +X021371Y004797D01* +X021348Y004753D01* +X021321Y004710D01* +X021291Y004670D01* +X021259Y004632D01* +X021223Y004597D01* +X021184Y004565D01* +X021143Y004536D01* +X021100Y004510D01* +X021055Y004488D01* +X021009Y004470D01* +X020961Y004455D01* +X020912Y004444D01* +X020863Y004437D01* +X020813Y004434D01* +X020762Y004435D01* +X020713Y004440D01* +X020663Y004449D01* +X020615Y004462D01* +X020568Y004478D01* +X020522Y004499D01* +X020478Y004523D01* +X020436Y004550D01* +X020396Y004580D01* +X020359Y004614D01* +X020325Y004651D01* +X020293Y004690D01* +X020265Y004731D01* +X020240Y004775D01* +X020219Y004820D01* +X020202Y004867D01* +X020188Y004915D01* +X020178Y004964D01* +X020172Y005014D01* +X020170Y005064D01* +D11* +X019495Y004010D02* +X019298Y003813D01* +X019101Y004010D01* +X019101Y003419D01* +X018850Y003419D02* +X018654Y003419D01* +X018752Y003419D02* +X018752Y004010D01* +X018850Y004010D02* +X018654Y004010D01* +X018421Y004010D02* +X018125Y004010D01* +X018027Y003911D01* +X018027Y003518D01* +X018125Y003419D01* +X018421Y003419D01* +X018421Y004010D01* +X017776Y004010D02* +X017579Y004010D01* +X017678Y004010D02* +X017678Y003419D01* +X017776Y003419D02* +X017579Y003419D01* +X016702Y003715D02* +X016308Y003715D01* +X015413Y004010D02* +X015413Y003419D01* +X015118Y003419D01* +X015019Y003518D01* +X015019Y003911D01* +X015118Y004010D01* +X015413Y004010D01* +X014768Y004010D02* +X014768Y003419D01* +X014375Y003419D02* +X014375Y004010D01* +X014571Y003813D01* +X014768Y004010D01* +X014124Y004010D02* +X013730Y003419D01* +X014124Y003419D02* +X013730Y004010D01* +X012835Y004010D02* +X012835Y003419D01* +X012539Y003419D01* +X012441Y003518D01* +X012441Y003616D01* +X012539Y003715D01* +X012835Y003715D01* +X012835Y004010D02* +X012539Y004010D01* +X012441Y003911D01* +X012441Y003813D01* +X012539Y003715D01* +X012190Y003813D02* +X012190Y003419D01* +X012190Y003616D02* +X011993Y003813D01* +X011895Y003813D01* +X011653Y003813D02* +X011555Y003813D01* +X011555Y003419D01* +X011653Y003419D02* +X011456Y003419D01* +X011223Y003518D02* +X011223Y003715D01* +X011125Y003813D01* +X010830Y003813D01* +X010830Y004010D02* +X010830Y003419D01* +X011125Y003419D01* +X011223Y003518D01* +X011555Y004010D02* +X011555Y004108D01* +X010579Y003715D02* +X010579Y003518D01* +X010480Y003419D01* +X010185Y003419D01* +X010185Y003321D02* +X010185Y003813D01* +X010480Y003813D01* +X010579Y003715D01* +X010185Y003321D02* +X010283Y003222D01* +X010382Y003222D01* +X009934Y003518D02* +X009934Y003715D01* +X009836Y003813D01* +X009639Y003813D01* +X009541Y003715D01* +X009541Y003616D01* +X009934Y003616D01* +X009934Y003518D02* +X009836Y003419D01* +X009639Y003419D01* +X019495Y003419D02* +X019495Y004010D01* +D12* +X022869Y007639D02* +X022869Y013789D01* +D13* +X018200Y011964D03* +X017200Y011464D03* +X017200Y010464D03* +X018200Y009964D03* +X018200Y010964D03* +X017200Y009464D03* +D14* +X017350Y016514D02* +X017350Y017114D01* +X018350Y017114D02* +X018350Y016514D01* +X007350Y016664D02* +X007350Y017264D01* +X006350Y017264D02* +X006350Y016664D01* +X005350Y016664D02* +X005350Y017264D01* +X001800Y012564D02* +X001200Y012564D01* +X001200Y011564D02* +X001800Y011564D01* +X001800Y010564D02* +X001200Y010564D01* +X001200Y009564D02* +X001800Y009564D01* +X001800Y008564D02* +X001200Y008564D01* +D15* +X001031Y008136D02* +X000780Y008136D01* +X000780Y007978D02* +X019853Y007978D01* +X019804Y008027D02* +X020012Y007818D01* +X020268Y007671D01* +X020553Y007594D01* +X020847Y007594D01* +X021132Y007671D01* +X021388Y007818D01* +X021596Y008027D01* +X021744Y008282D01* +X021820Y008567D01* +X021820Y008862D01* +X021744Y009147D01* +X021596Y009402D01* +X021388Y009611D01* +X021132Y009758D01* +X020847Y009834D01* +X020553Y009834D01* +X020268Y009758D01* +X020012Y009611D01* +X019804Y009402D01* +X019656Y009147D01* +X019580Y008862D01* +X019580Y008567D01* +X019656Y008282D01* +X019804Y008027D01* +X019740Y008136D02* +X001969Y008136D01* +X001891Y008104D02* +X002061Y008174D01* +X002190Y008304D01* +X002260Y008473D01* +X002260Y008656D01* +X002190Y008825D01* +X002061Y008954D01* +X001891Y009024D01* +X001108Y009024D01* +X000939Y008954D01* +X000810Y008825D01* +X000780Y008752D01* +X000780Y009376D01* +X000810Y009304D01* +X000939Y009174D01* +X001108Y009104D01* +X001891Y009104D01* +X002061Y009174D01* +X002190Y009304D01* +X002260Y009473D01* +X002260Y009656D01* +X002190Y009825D01* +X002061Y009954D01* +X001891Y010024D01* +X001108Y010024D01* +X000939Y009954D01* +X000810Y009825D01* +X000780Y009752D01* +X000780Y010376D01* +X000810Y010304D01* +X000939Y010174D01* +X001108Y010104D01* +X001891Y010104D01* +X002061Y010174D01* +X002190Y010304D01* +X002260Y010473D01* +X002260Y010656D01* +X002190Y010825D01* +X002061Y010954D01* +X001891Y011024D01* +X001108Y011024D01* +X000939Y010954D01* +X000810Y010825D01* +X000780Y010752D01* +X000780Y011376D01* +X000810Y011304D01* +X000939Y011174D01* +X001108Y011104D01* +X001891Y011104D01* +X002061Y011174D01* +X002190Y011304D01* +X002260Y011473D01* +X002260Y011656D01* +X002190Y011825D01* +X002061Y011954D01* +X001891Y012024D01* +X001108Y012024D01* +X000939Y011954D01* +X000810Y011825D01* +X000780Y011752D01* +X000780Y012376D01* +X000810Y012304D01* +X000939Y012174D01* +X001108Y012104D01* +X001891Y012104D01* +X002061Y012174D01* +X002190Y012304D01* +X002260Y012473D01* +X002260Y012656D01* +X002190Y012825D01* +X002061Y012954D01* +X001891Y013024D01* +X001108Y013024D01* +X000939Y012954D01* +X000810Y012825D01* +X000780Y012752D01* +X000780Y015356D01* +X000786Y015335D01* +X001068Y014922D01* +X001068Y014922D01* +X001068Y014922D01* +X001460Y014609D01* +X001926Y014426D01* +X002426Y014389D01* +X002914Y014500D01* +X003347Y014751D01* +X003347Y014751D01* +X003688Y015118D01* +X003905Y015569D01* +X003980Y016064D01* +X003905Y016560D01* +X003688Y017011D01* +X003347Y017378D01* +X002990Y017584D01* +X005019Y017584D01* +X004960Y017525D01* +X004890Y017356D01* +X004890Y016573D01* +X004960Y016404D01* +X005089Y016274D01* +X005258Y016204D01* +X005441Y016204D01* +X005611Y016274D01* +X005740Y016404D01* +X005810Y016573D01* +X005810Y017356D01* +X005740Y017525D01* +X005681Y017584D01* +X006019Y017584D01* +X005960Y017525D01* +X005890Y017356D01* +X005890Y016573D01* +X005960Y016404D01* +X006089Y016274D01* +X006258Y016204D01* +X006441Y016204D01* +X006611Y016274D01* +X006740Y016404D01* +X006810Y016573D01* +X006810Y017356D01* +X006740Y017525D01* +X006681Y017584D01* +X006991Y017584D01* +X006984Y017577D01* +X006939Y017516D01* +X006905Y017449D01* +X006882Y017377D01* +X006870Y017302D01* +X006870Y016984D01* +X007330Y016984D01* +X007330Y016944D01* +X007370Y016944D01* +X007370Y016184D01* +X007388Y016184D01* +X007462Y016196D01* +X007534Y016219D01* +X007602Y016254D01* +X007663Y016298D01* +X007716Y016352D01* +X007761Y016413D01* +X007795Y016480D01* +X007818Y016552D01* +X007830Y016627D01* +X007830Y016944D01* +X007370Y016944D01* +X007370Y016984D01* +X007830Y016984D01* +X007830Y017302D01* +X007818Y017377D01* +X007795Y017449D01* +X007761Y017516D01* +X007716Y017577D01* +X007709Y017584D01* +X018249Y017584D01* +X018238Y017583D01* +X018166Y017559D01* +X018098Y017525D01* +X018037Y017480D01* +X017984Y017427D01* +X017939Y017366D01* +X017905Y017299D01* +X017882Y017227D01* +X017870Y017152D01* +X017870Y016834D01* +X018330Y016834D01* +X018330Y016794D01* +X018370Y016794D01* +X018370Y016034D01* +X018388Y016034D01* +X018462Y016046D01* +X018534Y016069D01* +X018602Y016104D01* +X018663Y016148D01* +X018716Y016202D01* +X018761Y016263D01* +X018795Y016330D01* +X018818Y016402D01* +X018830Y016477D01* +X018830Y016794D01* +X018370Y016794D01* +X018370Y016834D01* +X018830Y016834D01* +X018830Y017152D01* +X018818Y017227D01* +X018795Y017299D01* +X018761Y017366D01* +X018716Y017427D01* +X018663Y017480D01* +X018602Y017525D01* +X018534Y017559D01* +X018462Y017583D01* +X018451Y017584D01* +X020126Y017584D01* +X019960Y017519D01* +X019568Y017207D01* +X019286Y016793D01* +X019139Y016315D01* +X019139Y015814D01* +X019286Y015335D01* +X019568Y014922D01* +X019568Y014922D01* +X019568Y014922D01* +X019960Y014609D01* +X020426Y014426D01* +X020926Y014389D01* +X021414Y014500D01* +X021847Y014751D01* +X021847Y014751D01* +X022188Y015118D01* +X022320Y015392D01* +X022320Y005737D01* +X022188Y006011D01* +X021847Y006378D01* +X021414Y006628D01* +X021414Y006628D01* +X020926Y006740D01* +X020926Y006740D01* +X020426Y006702D01* +X019960Y006519D01* +X019568Y006207D01* +X019286Y005793D01* +X019139Y005315D01* +X019139Y004814D01* +X019231Y004514D01* +X009450Y004514D01* +X009450Y003928D01* +X009326Y003804D01* +X009326Y003544D01* +X002937Y003544D01* +X002964Y003550D01* +X003397Y003801D01* +X003397Y003801D01* +X003738Y004168D01* +X003955Y004619D01* +X004030Y005114D01* +X003955Y005610D01* +X003738Y006061D01* +X003397Y006428D01* +X002964Y006678D01* +X002964Y006678D01* +X002476Y006790D01* +X002476Y006790D01* +X001976Y006752D01* +X001510Y006569D01* +X001118Y006257D01* +X000836Y005843D01* +X000780Y005660D01* +X000780Y008376D01* +X000810Y008304D01* +X000939Y008174D01* +X001108Y008104D01* +X001891Y008104D01* +X002181Y008295D02* +X019653Y008295D01* +X019610Y008453D02* +X013735Y008453D01* +X013753Y008461D02* +X013854Y008561D01* +X013908Y008693D01* +X013908Y008836D01* +X013854Y008967D01* +X013753Y009068D01* +X013621Y009122D01* +X013588Y009122D01* +X011930Y010780D01* +X011930Y012938D01* +X011954Y012961D01* +X012008Y013093D01* +X012008Y013236D01* +X011954Y013367D01* +X019783Y013367D01* +X019804Y013402D02* +X019656Y013147D01* +X019580Y012862D01* +X019580Y012567D01* +X019656Y012282D01* +X019804Y012027D01* +X020012Y011818D01* +X020268Y011671D01* +X020553Y011594D01* +X020847Y011594D01* +X021132Y011671D01* +X021388Y011818D01* +X021596Y012027D01* +X021744Y012282D01* +X021820Y012567D01* +X021820Y012862D01* +X021744Y013147D01* +X021596Y013402D01* +X021388Y013611D01* +X021132Y013758D01* +X020847Y013834D01* +X020553Y013834D01* +X020268Y013758D01* +X020012Y013611D01* +X019804Y013402D01* +X019927Y013525D02* +X000780Y013525D01* +X000780Y013367D02* +X011346Y013367D01* +X011292Y013236D01* +X011292Y013093D01* +X011346Y012961D01* +X011370Y012938D01* +X011370Y010609D01* +X011413Y010506D01* +X013192Y008726D01* +X013192Y008693D01* +X013246Y008561D01* +X013347Y008461D01* +X013479Y008406D01* +X013621Y008406D01* +X013753Y008461D01* +X013874Y008612D02* +X019580Y008612D01* +X019580Y008770D02* +X013908Y008770D01* +X013869Y008929D02* +X019598Y008929D01* +X019640Y009087D02* +X017432Y009087D01* +X017448Y009094D02* +X017571Y009217D01* +X017637Y009377D01* +X017637Y009551D01* +X017571Y009712D01* +X017558Y009724D01* +X017826Y009724D01* +X017829Y009717D01* +X017952Y009594D01* +X018113Y009527D01* +X018287Y009527D01* +X018448Y009594D01* +X018571Y009717D01* +X018637Y009877D01* +X018637Y010051D01* +X018571Y010212D01* +X018448Y010335D01* +X018287Y010401D01* +X018113Y010401D01* +X017952Y010335D01* +X017829Y010212D01* +X017826Y010204D01* +X017576Y010204D01* +X017591Y010225D01* +X017624Y010289D01* +X017646Y010357D01* +X017657Y010428D01* +X017657Y010456D01* +X017209Y010456D01* +X017209Y010473D01* +X017657Y010473D01* +X017657Y010500D01* +X017646Y010571D01* +X017624Y010640D01* +X017591Y010704D01* +X017549Y010762D01* +X017498Y010813D01* +X017440Y010855D01* +X017375Y010888D01* +X017307Y010910D01* +X017236Y010921D01* +X017209Y010921D01* +X017209Y010473D01* +X017191Y010473D01* +X017191Y010456D01* +X016743Y010456D01* +X016743Y010428D01* +X016754Y010357D01* +X016776Y010289D01* +X016809Y010225D01* +X016824Y010204D01* +X016066Y010204D01* +X016053Y010218D01* +X015921Y010272D01* +X015779Y010272D01* +X015647Y010218D01* +X015546Y010117D01* +X015492Y009986D01* +X015492Y009843D01* +X015546Y009711D01* +X015647Y009611D01* +X015779Y009556D01* +X015921Y009556D01* +X016053Y009611D01* +X016154Y009711D01* +X016159Y009724D01* +X016842Y009724D01* +X016829Y009712D01* +X016763Y009551D01* +X016763Y009377D01* +X016829Y009217D01* +X016952Y009094D01* +X017113Y009027D01* +X017287Y009027D01* +X017448Y009094D01* +X017583Y009246D02* +X019714Y009246D01* +X019806Y009404D02* +X017637Y009404D01* +X017632Y009563D02* +X018027Y009563D01* +X017827Y009721D02* +X017561Y009721D01* +X017645Y010355D02* +X018002Y010355D01* +X018113Y010527D02* +X018287Y010527D01* +X018448Y010594D01* +X018571Y010717D01* +X018637Y010877D01* +X018637Y011051D01* +X018571Y011212D01* +X018448Y011335D01* +X018287Y011401D01* +X018113Y011401D01* +X017952Y011335D01* +X017829Y011212D01* +X017763Y011051D01* +X017763Y010877D01* +X017829Y010717D01* +X017952Y010594D01* +X018113Y010527D01* +X017874Y010672D02* +X017607Y010672D01* +X017655Y010514D02* +X022320Y010514D01* +X022320Y010672D02* +X018526Y010672D01* +X018618Y010831D02* +X022320Y010831D01* +X022320Y010989D02* +X018637Y010989D01* +X018597Y011148D02* +X022320Y011148D01* +X022320Y011306D02* +X018476Y011306D01* +X018448Y011594D02* +X018287Y011527D01* +X018113Y011527D01* +X017952Y011594D01* +X017829Y011717D01* +X017763Y011877D01* +X017763Y012051D01* +X017829Y012212D01* +X017952Y012335D01* +X018113Y012401D01* +X018287Y012401D01* +X018448Y012335D01* +X018571Y012212D01* +X018637Y012051D01* +X018637Y011877D01* +X018571Y011717D01* +X018448Y011594D01* +X018477Y011623D02* +X020444Y011623D01* +X020075Y011782D02* +X018598Y011782D01* +X018637Y011940D02* +X019890Y011940D01* +X019762Y012099D02* +X018617Y012099D01* +X018525Y012257D02* +X019671Y012257D01* +X019620Y012416D02* +X011930Y012416D01* +X011930Y012574D02* +X019580Y012574D01* +X019580Y012733D02* +X011930Y012733D01* +X011930Y012891D02* +X019588Y012891D01* +X019630Y013050D02* +X011990Y013050D01* +X012008Y013208D02* +X019692Y013208D01* +X020139Y013684D02* +X000780Y013684D01* +X000780Y013842D02* +X022320Y013842D01* +X022320Y013684D02* +X021261Y013684D01* +X021473Y013525D02* +X022320Y013525D01* +X022320Y013367D02* +X021617Y013367D01* +X021708Y013208D02* +X022320Y013208D01* +X022320Y013050D02* +X021770Y013050D01* +X021812Y012891D02* +X022320Y012891D01* +X022320Y012733D02* +X021820Y012733D01* +X021820Y012574D02* +X022320Y012574D01* +X022320Y012416D02* +X021780Y012416D01* +X021729Y012257D02* +X022320Y012257D01* +X022320Y012099D02* +X021638Y012099D01* +X021510Y011940D02* +X022320Y011940D01* +X022320Y011782D02* +X021325Y011782D01* +X020956Y011623D02* +X022320Y011623D01* +X022320Y011465D02* +X017637Y011465D01* +X017637Y011551D02* +X017637Y011377D01* +X017571Y011217D01* +X017448Y011094D01* +X017287Y011027D01* +X017113Y011027D01* +X016952Y011094D01* +X016829Y011217D01* +X016763Y011377D01* +X016763Y011551D01* +X016829Y011712D01* +X016952Y011835D01* +X017113Y011901D01* +X017287Y011901D01* +X017448Y011835D01* +X017571Y011712D01* +X017637Y011551D01* +X017607Y011623D02* +X017923Y011623D01* +X017802Y011782D02* +X017501Y011782D01* +X017763Y011940D02* +X011930Y011940D01* +X011930Y011782D02* +X016899Y011782D01* +X016793Y011623D02* +X011930Y011623D01* +X011930Y011465D02* +X016763Y011465D01* +X016792Y011306D02* +X011930Y011306D01* +X011930Y011148D02* +X016898Y011148D01* +X017025Y010888D02* +X016960Y010855D01* +X016902Y010813D01* +X016851Y010762D01* +X016809Y010704D01* +X016776Y010640D01* +X016754Y010571D01* +X016743Y010500D01* +X016743Y010473D01* +X017191Y010473D01* +X017191Y010921D01* +X017164Y010921D01* +X017093Y010910D01* +X017025Y010888D01* +X016927Y010831D02* +X011930Y010831D01* +X011930Y010989D02* +X017763Y010989D01* +X017782Y010831D02* +X017473Y010831D01* +X017502Y011148D02* +X017803Y011148D01* +X017924Y011306D02* +X017608Y011306D01* +X017209Y010831D02* +X017191Y010831D01* +X017191Y010672D02* +X017209Y010672D01* +X017209Y010514D02* +X017191Y010514D01* +X016793Y010672D02* +X012038Y010672D01* +X012196Y010514D02* +X016745Y010514D01* +X016755Y010355D02* +X012355Y010355D01* +X012513Y010197D02* +X015626Y010197D01* +X015514Y010038D02* +X012672Y010038D01* +X012830Y009880D02* +X015492Y009880D01* +X015542Y009721D02* +X012989Y009721D01* +X013147Y009563D02* +X015763Y009563D01* +X015937Y009563D02* +X016768Y009563D01* +X016763Y009404D02* +X013306Y009404D01* +X013464Y009246D02* +X016817Y009246D01* +X016968Y009087D02* +X013706Y009087D01* +X013148Y008770D02* +X002213Y008770D01* +X002260Y008612D02* +X013226Y008612D01* +X013365Y008453D02* +X002252Y008453D01* +X002086Y008929D02* +X012990Y008929D01* +X012831Y009087D02* +X000780Y009087D01* +X000780Y008929D02* +X000914Y008929D01* +X000787Y008770D02* +X000780Y008770D01* +X000780Y008295D02* +X000819Y008295D01* +X000780Y007819D02* +X020011Y007819D01* +X020304Y007661D02* +X000780Y007661D01* +X000780Y007502D02* +X022320Y007502D01* +X022320Y007344D02* +X000780Y007344D01* +X000780Y007185D02* +X022320Y007185D01* +X022320Y007027D02* +X000780Y007027D01* +X000780Y006868D02* +X022320Y006868D01* +X022320Y006710D02* +X021056Y006710D01* +X021547Y006551D02* +X022320Y006551D01* +X022320Y006393D02* +X021821Y006393D01* +X021847Y006378D02* +X021847Y006378D01* +X021981Y006234D02* +X022320Y006234D01* +X022320Y006076D02* +X022128Y006076D01* +X022188Y006011D02* +X022188Y006011D01* +X022233Y005917D02* +X022320Y005917D01* +X022309Y005759D02* +X022320Y005759D01* +X020528Y006710D02* +X002825Y006710D01* +X003184Y006551D02* +X020042Y006551D01* +X019960Y006519D02* +X019960Y006519D01* +X019801Y006393D02* +X003430Y006393D01* +X003397Y006428D02* +X003397Y006428D01* +X003577Y006234D02* +X019603Y006234D01* +X019568Y006207D02* +X019568Y006207D01* +X019479Y006076D02* +X003724Y006076D01* +X003738Y006061D02* +X003738Y006061D01* +X003807Y005917D02* +X019371Y005917D01* +X019286Y005793D02* +X019286Y005793D01* +X019276Y005759D02* +X003883Y005759D01* +X003955Y005610D02* +X003955Y005610D01* +X003957Y005600D02* +X019227Y005600D01* +X019178Y005442D02* +X003981Y005442D01* +X004005Y005283D02* +X019139Y005283D01* +X019139Y005125D02* +X004028Y005125D01* +X004008Y004966D02* +X019139Y004966D01* +X019141Y004808D02* +X003984Y004808D01* +X003960Y004649D02* +X019190Y004649D01* +X020426Y006702D02* +X020426Y006702D01* +X021096Y007661D02* +X022320Y007661D01* +X022320Y007819D02* +X021389Y007819D01* +X021547Y007978D02* +X022320Y007978D01* +X022320Y008136D02* +X021660Y008136D01* +X021747Y008295D02* +X022320Y008295D01* +X022320Y008453D02* +X021790Y008453D01* +X021820Y008612D02* +X022320Y008612D01* +X022320Y008770D02* +X021820Y008770D01* +X021802Y008929D02* +X022320Y008929D01* +X022320Y009087D02* +X021760Y009087D01* +X021686Y009246D02* +X022320Y009246D01* +X022320Y009404D02* +X021594Y009404D01* +X021435Y009563D02* +X022320Y009563D01* +X022320Y009721D02* +X021196Y009721D01* +X020204Y009721D02* +X018573Y009721D01* +X018637Y009880D02* +X022320Y009880D01* +X022320Y010038D02* +X018637Y010038D01* +X018577Y010197D02* +X022320Y010197D01* +X022320Y010355D02* +X018398Y010355D01* +X018200Y009964D02* +X015900Y009964D01* +X015850Y009914D01* +X016158Y009721D02* +X016839Y009721D01* +X018373Y009563D02* +X019965Y009563D01* +X017783Y012099D02* +X011930Y012099D01* +X011930Y012257D02* +X017875Y012257D01* +X020426Y014426D02* +X020426Y014426D01* +X020299Y014476D02* +X002808Y014476D01* +X002914Y014500D02* +X002914Y014500D01* +X003147Y014635D02* +X019928Y014635D01* +X019960Y014609D02* +X019960Y014609D01* +X019729Y014793D02* +X003387Y014793D01* +X003534Y014952D02* +X019548Y014952D01* +X019440Y015110D02* +X003681Y015110D01* +X003688Y015118D02* +X003688Y015118D01* +X003761Y015269D02* +X019332Y015269D01* +X019286Y015335D02* +X019286Y015335D01* +X019258Y015427D02* +X003837Y015427D01* +X003905Y015569D02* +X003905Y015569D01* +X003908Y015586D02* +X019209Y015586D01* +X019160Y015744D02* +X003932Y015744D01* +X003956Y015903D02* +X019139Y015903D01* +X019139Y016061D02* +X018509Y016061D01* +X018370Y016061D02* +X018330Y016061D01* +X018330Y016034D02* +X018330Y016794D01* +X017870Y016794D01* +X017870Y016477D01* +X017882Y016402D01* +X017905Y016330D01* +X017939Y016263D01* +X017984Y016202D01* +X018037Y016148D01* +X018098Y016104D01* +X018166Y016069D01* +X018238Y016046D01* +X018312Y016034D01* +X018330Y016034D01* +X018191Y016061D02* +X017458Y016061D01* +X017441Y016054D02* +X017611Y016124D01* +X017740Y016254D01* +X017810Y016423D01* +X017810Y017206D01* +X017740Y017375D01* +X017611Y017504D01* +X017441Y017574D01* +X017258Y017574D01* +X017089Y017504D01* +X016960Y017375D01* +X016890Y017206D01* +X016890Y016423D01* +X016960Y016254D01* +X017089Y016124D01* +X017258Y016054D01* +X017441Y016054D01* +X017242Y016061D02* +X003980Y016061D01* +X003980Y016064D02* +X003980Y016064D01* +X003957Y016220D02* +X005221Y016220D01* +X005479Y016220D02* +X006221Y016220D01* +X006479Y016220D02* +X007165Y016220D01* +X007166Y016219D02* +X007238Y016196D01* +X007312Y016184D01* +X007330Y016184D01* +X007330Y016944D01* +X006870Y016944D01* +X006870Y016627D01* +X006882Y016552D01* +X006905Y016480D01* +X006939Y016413D01* +X006984Y016352D01* +X007037Y016298D01* +X007098Y016254D01* +X007166Y016219D01* +X007330Y016220D02* +X007370Y016220D01* +X007370Y016378D02* +X007330Y016378D01* +X007330Y016537D02* +X007370Y016537D01* +X007370Y016695D02* +X007330Y016695D01* +X007330Y016854D02* +X007370Y016854D01* +X007830Y016854D02* +X016890Y016854D01* +X016890Y017012D02* +X007830Y017012D01* +X007830Y017171D02* +X016890Y017171D01* +X016941Y017329D02* +X007826Y017329D01* +X007775Y017488D02* +X017073Y017488D01* +X017627Y017488D02* +X018047Y017488D01* +X017921Y017329D02* +X017759Y017329D01* +X017810Y017171D02* +X017873Y017171D01* +X017870Y017012D02* +X017810Y017012D01* +X017810Y016854D02* +X017870Y016854D01* +X017870Y016695D02* +X017810Y016695D01* +X017810Y016537D02* +X017870Y016537D01* +X017889Y016378D02* +X017792Y016378D01* +X017706Y016220D02* +X017971Y016220D01* +X018330Y016220D02* +X018370Y016220D01* +X018370Y016378D02* +X018330Y016378D01* +X018330Y016537D02* +X018370Y016537D01* +X018370Y016695D02* +X018330Y016695D01* +X018830Y016695D02* +X019256Y016695D01* +X019286Y016793D02* +X019286Y016793D01* +X019328Y016854D02* +X018830Y016854D01* +X018830Y017012D02* +X019436Y017012D01* +X019544Y017171D02* +X018827Y017171D01* +X018779Y017329D02* +X019722Y017329D01* +X019568Y017207D02* +X019568Y017207D01* +X019921Y017488D02* +X018653Y017488D01* +X018830Y016537D02* +X019207Y016537D01* +X019158Y016378D02* +X018811Y016378D01* +X018729Y016220D02* +X019139Y016220D01* +X019960Y017519D02* +X019960Y017519D01* +X022261Y015269D02* +X022320Y015269D01* +X022320Y015110D02* +X022181Y015110D01* +X022188Y015118D02* +X022188Y015118D01* +X022320Y014952D02* +X022034Y014952D01* +X021887Y014793D02* +X022320Y014793D01* +X022320Y014635D02* +X021647Y014635D01* +X021414Y014500D02* +X021414Y014500D01* +X021308Y014476D02* +X022320Y014476D01* +X022320Y014318D02* +X000780Y014318D01* +X000780Y014476D02* +X001799Y014476D01* +X001926Y014426D02* +X001926Y014426D01* +X001460Y014609D02* +X001460Y014609D01* +X001428Y014635D02* +X000780Y014635D01* +X000780Y014793D02* +X001229Y014793D01* +X001048Y014952D02* +X000780Y014952D01* +X000780Y015110D02* +X000940Y015110D01* +X000832Y015269D02* +X000780Y015269D01* +X000786Y015335D02* +X000786Y015335D01* +X000780Y014159D02* +X022320Y014159D01* +X022320Y014001D02* +X000780Y014001D01* +X000780Y013208D02* +X011292Y013208D01* +X011310Y013050D02* +X000780Y013050D01* +X000780Y012891D02* +X000876Y012891D01* +X000856Y012257D02* +X000780Y012257D01* +X000780Y012099D02* +X011370Y012099D01* +X011370Y012257D02* +X002144Y012257D01* +X002236Y012416D02* +X011370Y012416D01* +X011370Y012574D02* +X002260Y012574D01* +X002228Y012733D02* +X011370Y012733D01* +X011370Y012891D02* +X002124Y012891D01* +X002075Y011940D02* +X011370Y011940D01* +X011370Y011782D02* +X002208Y011782D01* +X002260Y011623D02* +X011370Y011623D01* +X011370Y011465D02* +X002257Y011465D01* +X002191Y011306D02* +X011370Y011306D01* +X011370Y011148D02* +X001997Y011148D01* +X001976Y010989D02* +X011370Y010989D01* +X011370Y010831D02* +X002184Y010831D01* +X002253Y010672D02* +X011370Y010672D01* +X011409Y010514D02* +X002260Y010514D01* +X002211Y010355D02* +X011563Y010355D01* +X011722Y010197D02* +X002083Y010197D01* +X002135Y009880D02* +X012039Y009880D01* +X012197Y009721D02* +X002233Y009721D01* +X002260Y009563D02* +X012356Y009563D01* +X012514Y009404D02* +X002232Y009404D01* +X002132Y009246D02* +X012673Y009246D01* +X011880Y010038D02* +X000780Y010038D01* +X000780Y009880D02* +X000865Y009880D01* +X000917Y010197D02* +X000780Y010197D01* +X000780Y010355D02* +X000789Y010355D01* +X000780Y010831D02* +X000816Y010831D01* +X000780Y010989D02* +X001024Y010989D01* +X001003Y011148D02* +X000780Y011148D01* +X000780Y011306D02* +X000809Y011306D01* +X000780Y011782D02* +X000792Y011782D01* +X000780Y011940D02* +X000925Y011940D01* +X002426Y014389D02* +X002426Y014389D01* +X003933Y016378D02* +X004985Y016378D01* +X004905Y016537D02* +X003909Y016537D01* +X003840Y016695D02* +X004890Y016695D01* +X004890Y016854D02* +X003764Y016854D01* +X003688Y017011D02* +X003688Y017011D01* +X003687Y017012D02* +X004890Y017012D01* +X004890Y017171D02* +X003539Y017171D01* +X003392Y017329D02* +X004890Y017329D01* +X004945Y017488D02* +X003157Y017488D01* +X003347Y017378D02* +X003347Y017378D01* +X005715Y016378D02* +X005985Y016378D01* +X005905Y016537D02* +X005795Y016537D01* +X005810Y016695D02* +X005890Y016695D01* +X005890Y016854D02* +X005810Y016854D01* +X005810Y017012D02* +X005890Y017012D01* +X005890Y017171D02* +X005810Y017171D01* +X005810Y017329D02* +X005890Y017329D01* +X005945Y017488D02* +X005755Y017488D01* +X006755Y017488D02* +X006925Y017488D01* +X006874Y017329D02* +X006810Y017329D01* +X006810Y017171D02* +X006870Y017171D01* +X006870Y017012D02* +X006810Y017012D01* +X006810Y016854D02* +X006870Y016854D01* +X006870Y016695D02* +X006810Y016695D01* +X006795Y016537D02* +X006887Y016537D01* +X006964Y016378D02* +X006715Y016378D01* +X007535Y016220D02* +X016994Y016220D01* +X016908Y016378D02* +X007736Y016378D01* +X007813Y016537D02* +X016890Y016537D01* +X016890Y016695D02* +X007830Y016695D01* +X011346Y013367D02* +X011447Y013468D01* +X011579Y013522D01* +X011721Y013522D01* +X011853Y013468D01* +X011954Y013367D01* +X020926Y014389D02* +X020926Y014389D01* +X009450Y004491D02* +X003894Y004491D01* +X003955Y004619D02* +X003955Y004619D01* +X003817Y004332D02* +X009450Y004332D01* +X009450Y004174D02* +X003741Y004174D01* +X003738Y004168D02* +X003738Y004168D01* +X003596Y004015D02* +X009450Y004015D01* +X009379Y003857D02* +X003449Y003857D01* +X003220Y003698D02* +X009326Y003698D01* +X002964Y003550D02* +X002964Y003550D01* +X000810Y005759D02* +X000780Y005759D01* +X000836Y005843D02* +X000836Y005843D01* +X000887Y005917D02* +X000780Y005917D01* +X000780Y006076D02* +X000995Y006076D01* +X001103Y006234D02* +X000780Y006234D01* +X000780Y006393D02* +X001289Y006393D01* +X001118Y006257D02* +X001118Y006257D01* +X000780Y006551D02* +X001488Y006551D01* +X001510Y006569D02* +X001510Y006569D01* +X001868Y006710D02* +X000780Y006710D01* +X001976Y006752D02* +X001976Y006752D01* +X000868Y009246D02* +X000780Y009246D01* +D16* +X004150Y011564D03* +X006500Y013714D03* +X010000Y015114D03* +X011650Y013164D03* +X013300Y011464D03* +X013350Y010114D03* +X013550Y008764D03* +X013500Y006864D03* +X012100Y005314D03* +X009250Y004064D03* +X015200Y004514D03* +X015650Y006264D03* +X015850Y009914D03* +X014250Y014964D03* +D17* +X011650Y013164D02* +X011650Y010664D01* +X013550Y008764D01* +M02* diff --git a/gerber/tests/resources/bottom_mask.GBS b/gerber/tests/resources/bottom_mask.GBS new file mode 100644 index 0000000..b06654f --- /dev/null +++ b/gerber/tests/resources/bottom_mask.GBS @@ -0,0 +1,66 @@ +G75* +%MOIN*% +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0634*% +%ADD11C,0.1360*% +%ADD12C,0.0680*% +%ADD13C,0.1340*% +%ADD14C,0.0476*% +D10* +X017200Y009464D03* +X018200Y009964D03* +X018200Y010964D03* +X017200Y010464D03* +X017200Y011464D03* +X018200Y011964D03* +D11* +X020700Y012714D03* +X020700Y008714D03* +D12* +X018350Y016514D02* +X018350Y017114D01* +X017350Y017114D02* +X017350Y016514D01* +X007350Y016664D02* +X007350Y017264D01* +X006350Y017264D02* +X006350Y016664D01* +X005350Y016664D02* +X005350Y017264D01* +X001800Y012564D02* +X001200Y012564D01* +X001200Y011564D02* +X001800Y011564D01* +X001800Y010564D02* +X001200Y010564D01* +X001200Y009564D02* +X001800Y009564D01* +X001800Y008564D02* +X001200Y008564D01* +D13* +X002350Y005114D03* +X002300Y016064D03* +X020800Y016064D03* +X020800Y005064D03* +D14* +X015650Y006264D03* +X013500Y006864D03* +X012100Y005314D03* +X009250Y004064D03* +X015200Y004514D03* +X013550Y008764D03* +X013350Y010114D03* +X013300Y011464D03* +X011650Y013164D03* +X010000Y015114D03* +X006500Y013714D03* +X004150Y011564D03* +X014250Y014964D03* +X015850Y009914D03* +M02* diff --git a/gerber/tests/resources/bottom_silk.GBO b/gerber/tests/resources/bottom_silk.GBO new file mode 100644 index 0000000..0e19197 --- /dev/null +++ b/gerber/tests/resources/bottom_silk.GBO @@ -0,0 +1,6007 @@ +G75* +%MOIN*% +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0000*% +%ADD11R,0.0470X0.0010*% +%ADD12R,0.0560X0.0010*% +%ADD13R,0.0570X0.0010*% +%ADD14R,0.0580X0.0010*% +%ADD15R,0.0300X0.0010*% +%ADD16R,0.0450X0.0010*% +%ADD17R,0.0670X0.0010*% +%ADD18R,0.0510X0.0010*% +%ADD19R,0.0760X0.0010*% +%ADD20R,0.0520X0.0010*% +%ADD21R,0.1900X0.0010*% +%ADD22R,0.0820X0.0010*% +%ADD23R,0.0880X0.0010*% +%ADD24R,0.0530X0.0010*% +%ADD25R,0.0940X0.0010*% +%ADD26R,0.1000X0.0010*% +%ADD27R,0.0540X0.0010*% +%ADD28R,0.1050X0.0010*% +%ADD29R,0.0550X0.0010*% +%ADD30R,0.1100X0.0010*% +%ADD31R,0.1140X0.0010*% +%ADD32R,0.1180X0.0010*% +%ADD33R,0.1220X0.0010*% +%ADD34R,0.1260X0.0010*% +%ADD35R,0.1300X0.0010*% +%ADD36R,0.1320X0.0010*% +%ADD37R,0.0590X0.0010*% +%ADD38R,0.1360X0.0010*% +%ADD39R,0.0600X0.0010*% +%ADD40R,0.1400X0.0010*% +%ADD41R,0.1420X0.0010*% +%ADD42R,0.0610X0.0010*% +%ADD43R,0.1460X0.0010*% +%ADD44R,0.1480X0.0010*% +%ADD45R,0.0620X0.0010*% +%ADD46R,0.1500X0.0010*% +%ADD47R,0.0630X0.0010*% +%ADD48R,0.1540X0.0010*% +%ADD49R,0.1560X0.0010*% +%ADD50R,0.0640X0.0010*% +%ADD51R,0.1580X0.0010*% +%ADD52R,0.0650X0.0010*% +%ADD53R,0.1600X0.0010*% +%ADD54R,0.1640X0.0010*% +%ADD55R,0.0660X0.0010*% +%ADD56R,0.1660X0.0010*% +%ADD57R,0.1680X0.0010*% +%ADD58R,0.1700X0.0010*% +%ADD59R,0.0680X0.0010*% +%ADD60R,0.1720X0.0010*% +%ADD61R,0.1740X0.0010*% +%ADD62R,0.0690X0.0010*% +%ADD63R,0.1760X0.0010*% +%ADD64R,0.1780X0.0010*% +%ADD65R,0.0700X0.0010*% +%ADD66R,0.1800X0.0010*% +%ADD67R,0.0710X0.0010*% +%ADD68R,0.1820X0.0010*% +%ADD69R,0.0720X0.0010*% +%ADD70R,0.1840X0.0010*% +%ADD71R,0.0730X0.0010*% +%ADD72R,0.1860X0.0010*% +%ADD73R,0.1880X0.0010*% +%ADD74R,0.0740X0.0010*% +%ADD75R,0.1920X0.0010*% +%ADD76R,0.0750X0.0010*% +%ADD77R,0.1940X0.0010*% +%ADD78R,0.0860X0.0010*% +%ADD79R,0.0850X0.0010*% +%ADD80R,0.0810X0.0010*% +%ADD81R,0.0770X0.0010*% +%ADD82R,0.0790X0.0010*% +%ADD83R,0.0780X0.0010*% +%ADD84R,0.0800X0.0010*% +%ADD85R,0.0830X0.0010*% +%ADD86R,0.0840X0.0010*% +%ADD87R,0.0870X0.0010*% +%ADD88R,0.0890X0.0010*% +%ADD89R,0.0900X0.0010*% +%ADD90R,0.0910X0.0010*% +%ADD91R,0.0920X0.0010*% +%ADD92R,0.0930X0.0010*% +%ADD93R,0.0950X0.0010*% +%ADD94R,0.0960X0.0010*% +%ADD95R,0.0970X0.0010*% +%ADD96R,0.0980X0.0010*% +%ADD97R,0.0990X0.0010*% +%ADD98R,0.1010X0.0010*% +%ADD99R,0.1020X0.0010*% +%ADD100R,0.1030X0.0010*% +%ADD101R,0.1040X0.0010*% +%ADD102R,0.0480X0.0010*% +%ADD103R,0.1990X0.0010*% +%ADD104R,0.1850X0.0010*% +%ADD105R,0.1620X0.0010*% +%ADD106R,0.1570X0.0010*% +%ADD107R,0.1550X0.0010*% +%ADD108R,0.1520X0.0010*% +%ADD109R,0.1490X0.0010*% +%ADD110R,0.1470X0.0010*% +%ADD111R,0.1430X0.0010*% +%ADD112R,0.1410X0.0010*% +%ADD113R,0.1380X0.0010*% +%ADD114R,0.1350X0.0010*% +%ADD115R,0.1310X0.0010*% +%ADD116R,0.1280X0.0010*% +%ADD117R,0.1250X0.0010*% +%ADD118R,0.1210X0.0010*% +%ADD119R,0.1170X0.0010*% +%ADD120R,0.1120X0.0010*% +%ADD121R,0.1080X0.0010*% +%ADD122R,0.0500X0.0010*% +%ADD123R,0.0370X0.0010*% +%ADD124R,0.0070X0.0010*% +%ADD125R,0.2950X0.0010*% +%ADD126R,0.0490X0.0010*% +%ADD127R,0.1290X0.0010*% +%ADD128R,0.1610X0.0010*% +%ADD129R,0.1690X0.0010*% +%ADD130R,0.1710X0.0010*% +%ADD131R,0.1730X0.0010*% +%ADD132R,0.1750X0.0010*% +%ADD133R,0.1810X0.0010*% +%ADD134R,0.1830X0.0010*% +%ADD135R,0.1870X0.0010*% +%ADD136R,0.1890X0.0010*% +%ADD137R,0.1910X0.0010*% +%ADD138R,0.1930X0.0010*% +%ADD139R,0.1950X0.0010*% +%ADD140R,0.1960X0.0010*% +%ADD141R,0.1970X0.0010*% +%ADD142R,0.1980X0.0010*% +%ADD143R,0.2000X0.0010*% +%ADD144R,0.2010X0.0010*% +%ADD145R,0.2020X0.0010*% +%ADD146R,0.2060X0.0010*% +%ADD147R,0.2050X0.0010*% +%ADD148R,0.2030X0.0010*% +%ADD149R,0.1790X0.0010*% +%ADD150R,0.1770X0.0010*% +%ADD151R,0.1450X0.0010*% +%ADD152R,0.1440X0.0010*% +%ADD153R,0.1670X0.0010*% +%ADD154R,0.1650X0.0010*% +%ADD155R,0.1630X0.0010*% +%ADD156R,0.1390X0.0010*% +%ADD157R,0.1370X0.0010*% +%ADD158R,0.3140X0.0010*% +%ADD159R,0.1240X0.0010*% +%ADD160C,0.0004*% +D10* +X000303Y003014D02* +X000310Y003014D01* +X000313Y003018D01* +X000318Y003018D02* +X000318Y003014D01* +X000322Y003014D01* +X000322Y003018D01* +X000318Y003018D01* +X000318Y003024D02* +X000318Y003028D01* +X000322Y003028D01* +X000322Y003024D01* +X000318Y003024D01* +X000313Y003031D02* +X000310Y003034D01* +X000303Y003034D01* +X000300Y003031D01* +X000300Y003018D01* +X000303Y003014D01* +X000328Y003014D02* +X000341Y003034D01* +X000346Y003034D02* +X000346Y003018D01* +X000349Y003014D01* +X000356Y003014D01* +X000359Y003018D01* +X000359Y003034D01* +X000368Y003028D02* +X000378Y003028D01* +X000383Y003024D02* +X000386Y003028D01* +X000393Y003028D01* +X000396Y003024D01* +X000396Y003021D01* +X000383Y003021D01* +X000383Y003018D02* +X000383Y003024D01* +X000383Y003018D02* +X000386Y003014D01* +X000393Y003014D01* +X000401Y003014D02* +X000401Y003028D01* +X000408Y003028D02* +X000411Y003028D01* +X000408Y003028D02* +X000401Y003021D01* +X000417Y003024D02* +X000420Y003028D01* +X000430Y003028D01* +X000427Y003021D02* +X000420Y003021D01* +X000417Y003024D01* +X000417Y003014D02* +X000427Y003014D01* +X000430Y003018D01* +X000427Y003021D01* +X000435Y003014D02* +X000448Y003034D01* +X000453Y003034D02* +X000453Y003014D01* +X000453Y003024D02* +X000457Y003028D01* +X000463Y003028D01* +X000467Y003024D01* +X000467Y003014D01* +X000472Y003018D02* +X000475Y003021D01* +X000485Y003021D01* +X000485Y003024D02* +X000485Y003014D01* +X000475Y003014D01* +X000472Y003018D01* +X000475Y003028D02* +X000482Y003028D01* +X000485Y003024D01* +X000490Y003028D02* +X000494Y003028D01* +X000497Y003024D01* +X000500Y003028D01* +X000504Y003024D01* +X000504Y003014D01* +X000509Y003014D02* +X000515Y003014D01* +X000512Y003014D02* +X000512Y003028D01* +X000509Y003028D01* +X000512Y003034D02* +X000512Y003038D01* +X000521Y003034D02* +X000524Y003034D01* +X000524Y003014D01* +X000521Y003014D02* +X000528Y003014D01* +X000537Y003018D02* +X000540Y003014D01* +X000537Y003018D02* +X000537Y003031D01* +X000540Y003028D02* +X000533Y003028D01* +X000546Y003024D02* +X000546Y003018D01* +X000549Y003014D01* +X000556Y003014D01* +X000559Y003018D01* +X000559Y003024D01* +X000556Y003028D01* +X000549Y003028D01* +X000546Y003024D01* +X000564Y003028D02* +X000574Y003028D01* +X000577Y003024D01* +X000577Y003014D01* +X000582Y003014D02* +X000586Y003014D01* +X000586Y003018D01* +X000582Y003018D01* +X000582Y003014D01* +X000592Y003014D02* +X000592Y003034D01* +X000602Y003028D02* +X000592Y003021D01* +X000602Y003014D01* +X000607Y003014D02* +X000614Y003014D01* +X000610Y003014D02* +X000610Y003028D01* +X000607Y003028D01* +X000610Y003034D02* +X000610Y003038D01* +X000619Y003034D02* +X000619Y003014D01* +X000629Y003014D01* +X000633Y003018D01* +X000633Y003024D01* +X000629Y003028D01* +X000619Y003028D01* +X000638Y003028D02* +X000648Y003028D01* +X000651Y003024D01* +X000651Y003018D01* +X000648Y003014D01* +X000638Y003014D01* +X000638Y003034D01* +X000656Y003024D02* +X000659Y003028D01* +X000666Y003028D01* +X000669Y003024D01* +X000669Y003021D01* +X000656Y003021D01* +X000656Y003018D02* +X000656Y003024D01* +X000656Y003018D02* +X000659Y003014D01* +X000666Y003014D01* +X000674Y003014D02* +X000688Y003034D01* +X000693Y003034D02* +X000703Y003034D01* +X000706Y003031D01* +X000706Y003018D01* +X000703Y003014D01* +X000693Y003014D01* +X000693Y003034D01* +X000711Y003024D02* +X000715Y003028D01* +X000721Y003028D01* +X000725Y003024D01* +X000725Y003021D01* +X000711Y003021D01* +X000711Y003018D02* +X000711Y003024D01* +X000711Y003018D02* +X000715Y003014D01* +X000721Y003014D01* +X000730Y003014D02* +X000740Y003014D01* +X000743Y003018D01* +X000740Y003021D01* +X000733Y003021D01* +X000730Y003024D01* +X000733Y003028D01* +X000743Y003028D01* +X000748Y003034D02* +X000748Y003014D01* +X000748Y003021D02* +X000758Y003028D01* +X000763Y003028D02* +X000770Y003028D01* +X000767Y003031D02* +X000767Y003018D01* +X000770Y003014D01* +X000776Y003018D02* +X000779Y003014D01* +X000786Y003014D01* +X000789Y003018D01* +X000789Y003024D01* +X000786Y003028D01* +X000779Y003028D01* +X000776Y003024D01* +X000776Y003018D01* +X000758Y003014D02* +X000748Y003021D01* +X000794Y003014D02* +X000804Y003014D01* +X000807Y003018D01* +X000807Y003024D01* +X000804Y003028D01* +X000794Y003028D01* +X000794Y003008D01* +X000813Y003014D02* +X000826Y003034D01* +X000831Y003034D02* +X000831Y003014D01* +X000841Y003014D01* +X000844Y003018D01* +X000844Y003024D01* +X000841Y003028D01* +X000831Y003028D01* +X000849Y003028D02* +X000856Y003028D01* +X000853Y003031D02* +X000853Y003018D01* +X000856Y003014D01* +X000865Y003014D02* +X000865Y003031D01* +X000868Y003034D01* +X000874Y003028D02* +X000887Y003014D01* +X000892Y003014D02* +X000896Y003014D01* +X000896Y003018D01* +X000892Y003018D01* +X000892Y003014D01* +X000902Y003014D02* +X000912Y003014D01* +X000915Y003018D01* +X000915Y003021D01* +X000912Y003024D01* +X000902Y003024D01* +X000912Y003024D02* +X000915Y003028D01* +X000915Y003031D01* +X000912Y003034D01* +X000902Y003034D01* +X000902Y003014D01* +X000920Y003014D02* +X000920Y003034D01* +X000927Y003028D01* +X000933Y003034D01* +X000933Y003014D01* +X000938Y003014D02* +X000938Y003034D01* +X000948Y003034D01* +X000952Y003031D01* +X000952Y003024D01* +X000948Y003021D01* +X000938Y003021D01* +X000887Y003028D02* +X000874Y003014D01* +X000868Y003024D02* +X000862Y003024D01* +X000564Y003014D02* +X000564Y003028D01* +X000497Y003024D02* +X000497Y003014D01* +X000490Y003014D02* +X000490Y003028D01* +X000378Y003018D02* +X000374Y003021D01* +X000368Y003021D01* +X000364Y003024D01* +X000368Y003028D01* +X000364Y003014D02* +X000374Y003014D01* +X000378Y003018D01* +X000300Y003064D02* +X000300Y018064D01* +X022800Y018064D01* +X022800Y003064D01* +X000300Y003064D01* +X001720Y005114D02* +X001722Y005164D01* +X001728Y005214D01* +X001738Y005263D01* +X001752Y005311D01* +X001769Y005358D01* +X001790Y005403D01* +X001815Y005447D01* +X001843Y005488D01* +X001875Y005527D01* +X001909Y005564D01* +X001946Y005598D01* +X001986Y005628D01* +X002028Y005655D01* +X002072Y005679D01* +X002118Y005700D01* +X002165Y005716D01* +X002213Y005729D01* +X002263Y005738D01* +X002312Y005743D01* +X002363Y005744D01* +X002413Y005741D01* +X002462Y005734D01* +X002511Y005723D01* +X002559Y005708D01* +X002605Y005690D01* +X002650Y005668D01* +X002693Y005642D01* +X002734Y005613D01* +X002773Y005581D01* +X002809Y005546D01* +X002841Y005508D01* +X002871Y005468D01* +X002898Y005425D01* +X002921Y005381D01* +X002940Y005335D01* +X002956Y005287D01* +X002968Y005238D01* +X002976Y005189D01* +X002980Y005139D01* +X002980Y005089D01* +X002976Y005039D01* +X002968Y004990D01* +X002956Y004941D01* +X002940Y004893D01* +X002921Y004847D01* +X002898Y004803D01* +X002871Y004760D01* +X002841Y004720D01* +X002809Y004682D01* +X002773Y004647D01* +X002734Y004615D01* +X002693Y004586D01* +X002650Y004560D01* +X002605Y004538D01* +X002559Y004520D01* +X002511Y004505D01* +X002462Y004494D01* +X002413Y004487D01* +X002363Y004484D01* +X002312Y004485D01* +X002263Y004490D01* +X002213Y004499D01* +X002165Y004512D01* +X002118Y004528D01* +X002072Y004549D01* +X002028Y004573D01* +X001986Y004600D01* +X001946Y004630D01* +X001909Y004664D01* +X001875Y004701D01* +X001843Y004740D01* +X001815Y004781D01* +X001790Y004825D01* +X001769Y004870D01* +X001752Y004917D01* +X001738Y004965D01* +X001728Y005014D01* +X001722Y005064D01* +X001720Y005114D01* +X001670Y016064D02* +X001672Y016114D01* +X001678Y016164D01* +X001688Y016213D01* +X001702Y016261D01* +X001719Y016308D01* +X001740Y016353D01* +X001765Y016397D01* +X001793Y016438D01* +X001825Y016477D01* +X001859Y016514D01* +X001896Y016548D01* +X001936Y016578D01* +X001978Y016605D01* +X002022Y016629D01* +X002068Y016650D01* +X002115Y016666D01* +X002163Y016679D01* +X002213Y016688D01* +X002262Y016693D01* +X002313Y016694D01* +X002363Y016691D01* +X002412Y016684D01* +X002461Y016673D01* +X002509Y016658D01* +X002555Y016640D01* +X002600Y016618D01* +X002643Y016592D01* +X002684Y016563D01* +X002723Y016531D01* +X002759Y016496D01* +X002791Y016458D01* +X002821Y016418D01* +X002848Y016375D01* +X002871Y016331D01* +X002890Y016285D01* +X002906Y016237D01* +X002918Y016188D01* +X002926Y016139D01* +X002930Y016089D01* +X002930Y016039D01* +X002926Y015989D01* +X002918Y015940D01* +X002906Y015891D01* +X002890Y015843D01* +X002871Y015797D01* +X002848Y015753D01* +X002821Y015710D01* +X002791Y015670D01* +X002759Y015632D01* +X002723Y015597D01* +X002684Y015565D01* +X002643Y015536D01* +X002600Y015510D01* +X002555Y015488D01* +X002509Y015470D01* +X002461Y015455D01* +X002412Y015444D01* +X002363Y015437D01* +X002313Y015434D01* +X002262Y015435D01* +X002213Y015440D01* +X002163Y015449D01* +X002115Y015462D01* +X002068Y015478D01* +X002022Y015499D01* +X001978Y015523D01* +X001936Y015550D01* +X001896Y015580D01* +X001859Y015614D01* +X001825Y015651D01* +X001793Y015690D01* +X001765Y015731D01* +X001740Y015775D01* +X001719Y015820D01* +X001702Y015867D01* +X001688Y015915D01* +X001678Y015964D01* +X001672Y016014D01* +X001670Y016064D01* +X020060Y012714D02* +X020062Y012764D01* +X020068Y012814D01* +X020078Y012863D01* +X020091Y012912D01* +X020109Y012959D01* +X020130Y013005D01* +X020154Y013048D01* +X020182Y013090D01* +X020213Y013130D01* +X020247Y013167D01* +X020284Y013201D01* +X020324Y013232D01* +X020366Y013260D01* +X020409Y013284D01* +X020455Y013305D01* +X020502Y013323D01* +X020551Y013336D01* +X020600Y013346D01* +X020650Y013352D01* +X020700Y013354D01* +X020750Y013352D01* +X020800Y013346D01* +X020849Y013336D01* +X020898Y013323D01* +X020945Y013305D01* +X020991Y013284D01* +X021034Y013260D01* +X021076Y013232D01* +X021116Y013201D01* +X021153Y013167D01* +X021187Y013130D01* +X021218Y013090D01* +X021246Y013048D01* +X021270Y013005D01* +X021291Y012959D01* +X021309Y012912D01* +X021322Y012863D01* +X021332Y012814D01* +X021338Y012764D01* +X021340Y012714D01* +X021338Y012664D01* +X021332Y012614D01* +X021322Y012565D01* +X021309Y012516D01* +X021291Y012469D01* +X021270Y012423D01* +X021246Y012380D01* +X021218Y012338D01* +X021187Y012298D01* +X021153Y012261D01* +X021116Y012227D01* +X021076Y012196D01* +X021034Y012168D01* +X020991Y012144D01* +X020945Y012123D01* +X020898Y012105D01* +X020849Y012092D01* +X020800Y012082D01* +X020750Y012076D01* +X020700Y012074D01* +X020650Y012076D01* +X020600Y012082D01* +X020551Y012092D01* +X020502Y012105D01* +X020455Y012123D01* +X020409Y012144D01* +X020366Y012168D01* +X020324Y012196D01* +X020284Y012227D01* +X020247Y012261D01* +X020213Y012298D01* +X020182Y012338D01* +X020154Y012380D01* +X020130Y012423D01* +X020109Y012469D01* +X020091Y012516D01* +X020078Y012565D01* +X020068Y012614D01* +X020062Y012664D01* +X020060Y012714D01* +X020170Y016064D02* +X020172Y016114D01* +X020178Y016164D01* +X020188Y016213D01* +X020202Y016261D01* +X020219Y016308D01* +X020240Y016353D01* +X020265Y016397D01* +X020293Y016438D01* +X020325Y016477D01* +X020359Y016514D01* +X020396Y016548D01* +X020436Y016578D01* +X020478Y016605D01* +X020522Y016629D01* +X020568Y016650D01* +X020615Y016666D01* +X020663Y016679D01* +X020713Y016688D01* +X020762Y016693D01* +X020813Y016694D01* +X020863Y016691D01* +X020912Y016684D01* +X020961Y016673D01* +X021009Y016658D01* +X021055Y016640D01* +X021100Y016618D01* +X021143Y016592D01* +X021184Y016563D01* +X021223Y016531D01* +X021259Y016496D01* +X021291Y016458D01* +X021321Y016418D01* +X021348Y016375D01* +X021371Y016331D01* +X021390Y016285D01* +X021406Y016237D01* +X021418Y016188D01* +X021426Y016139D01* +X021430Y016089D01* +X021430Y016039D01* +X021426Y015989D01* +X021418Y015940D01* +X021406Y015891D01* +X021390Y015843D01* +X021371Y015797D01* +X021348Y015753D01* +X021321Y015710D01* +X021291Y015670D01* +X021259Y015632D01* +X021223Y015597D01* +X021184Y015565D01* +X021143Y015536D01* +X021100Y015510D01* +X021055Y015488D01* +X021009Y015470D01* +X020961Y015455D01* +X020912Y015444D01* +X020863Y015437D01* +X020813Y015434D01* +X020762Y015435D01* +X020713Y015440D01* +X020663Y015449D01* +X020615Y015462D01* +X020568Y015478D01* +X020522Y015499D01* +X020478Y015523D01* +X020436Y015550D01* +X020396Y015580D01* +X020359Y015614D01* +X020325Y015651D01* +X020293Y015690D01* +X020265Y015731D01* +X020240Y015775D01* +X020219Y015820D01* +X020202Y015867D01* +X020188Y015915D01* +X020178Y015964D01* +X020172Y016014D01* +X020170Y016064D01* +X020060Y008714D02* +X020062Y008764D01* +X020068Y008814D01* +X020078Y008863D01* +X020091Y008912D01* +X020109Y008959D01* +X020130Y009005D01* +X020154Y009048D01* +X020182Y009090D01* +X020213Y009130D01* +X020247Y009167D01* +X020284Y009201D01* +X020324Y009232D01* +X020366Y009260D01* +X020409Y009284D01* +X020455Y009305D01* +X020502Y009323D01* +X020551Y009336D01* +X020600Y009346D01* +X020650Y009352D01* +X020700Y009354D01* +X020750Y009352D01* +X020800Y009346D01* +X020849Y009336D01* +X020898Y009323D01* +X020945Y009305D01* +X020991Y009284D01* +X021034Y009260D01* +X021076Y009232D01* +X021116Y009201D01* +X021153Y009167D01* +X021187Y009130D01* +X021218Y009090D01* +X021246Y009048D01* +X021270Y009005D01* +X021291Y008959D01* +X021309Y008912D01* +X021322Y008863D01* +X021332Y008814D01* +X021338Y008764D01* +X021340Y008714D01* +X021338Y008664D01* +X021332Y008614D01* +X021322Y008565D01* +X021309Y008516D01* +X021291Y008469D01* +X021270Y008423D01* +X021246Y008380D01* +X021218Y008338D01* +X021187Y008298D01* +X021153Y008261D01* +X021116Y008227D01* +X021076Y008196D01* +X021034Y008168D01* +X020991Y008144D01* +X020945Y008123D01* +X020898Y008105D01* +X020849Y008092D01* +X020800Y008082D01* +X020750Y008076D01* +X020700Y008074D01* +X020650Y008076D01* +X020600Y008082D01* +X020551Y008092D01* +X020502Y008105D01* +X020455Y008123D01* +X020409Y008144D01* +X020366Y008168D01* +X020324Y008196D01* +X020284Y008227D01* +X020247Y008261D01* +X020213Y008298D01* +X020182Y008338D01* +X020154Y008380D01* +X020130Y008423D01* +X020109Y008469D01* +X020091Y008516D01* +X020078Y008565D01* +X020068Y008614D01* +X020062Y008664D01* +X020060Y008714D01* +X020170Y005064D02* +X020172Y005114D01* +X020178Y005164D01* +X020188Y005213D01* +X020202Y005261D01* +X020219Y005308D01* +X020240Y005353D01* +X020265Y005397D01* +X020293Y005438D01* +X020325Y005477D01* +X020359Y005514D01* +X020396Y005548D01* +X020436Y005578D01* +X020478Y005605D01* +X020522Y005629D01* +X020568Y005650D01* +X020615Y005666D01* +X020663Y005679D01* +X020713Y005688D01* +X020762Y005693D01* +X020813Y005694D01* +X020863Y005691D01* +X020912Y005684D01* +X020961Y005673D01* +X021009Y005658D01* +X021055Y005640D01* +X021100Y005618D01* +X021143Y005592D01* +X021184Y005563D01* +X021223Y005531D01* +X021259Y005496D01* +X021291Y005458D01* +X021321Y005418D01* +X021348Y005375D01* +X021371Y005331D01* +X021390Y005285D01* +X021406Y005237D01* +X021418Y005188D01* +X021426Y005139D01* +X021430Y005089D01* +X021430Y005039D01* +X021426Y004989D01* +X021418Y004940D01* +X021406Y004891D01* +X021390Y004843D01* +X021371Y004797D01* +X021348Y004753D01* +X021321Y004710D01* +X021291Y004670D01* +X021259Y004632D01* +X021223Y004597D01* +X021184Y004565D01* +X021143Y004536D01* +X021100Y004510D01* +X021055Y004488D01* +X021009Y004470D01* +X020961Y004455D01* +X020912Y004444D01* +X020863Y004437D01* +X020813Y004434D01* +X020762Y004435D01* +X020713Y004440D01* +X020663Y004449D01* +X020615Y004462D01* +X020568Y004478D01* +X020522Y004499D01* +X020478Y004523D01* +X020436Y004550D01* +X020396Y004580D01* +X020359Y004614D01* +X020325Y004651D01* +X020293Y004690D01* +X020265Y004731D01* +X020240Y004775D01* +X020219Y004820D01* +X020202Y004867D01* +X020188Y004915D01* +X020178Y004964D01* +X020172Y005014D01* +X020170Y005064D01* +D11* +X015810Y007044D03* +X015810Y007054D03* +X015810Y007064D03* +X015810Y007074D03* +X015810Y007084D03* +X015810Y007094D03* +X015810Y007104D03* +X015810Y007114D03* +X015810Y007124D03* +X015810Y007134D03* +X015810Y007144D03* +X015810Y007154D03* +X015810Y007164D03* +X015810Y007174D03* +X015810Y007184D03* +X015810Y007194D03* +X015810Y007204D03* +X015810Y007214D03* +X015810Y007224D03* +X015810Y007234D03* +X015810Y007244D03* +X015810Y007254D03* +X015810Y007264D03* +X015810Y007274D03* +X015810Y007284D03* +X015810Y007294D03* +X015810Y007304D03* +X015810Y007314D03* +X015810Y007324D03* +X015810Y007334D03* +X015810Y007344D03* +X015810Y007354D03* +X015810Y007364D03* +X015810Y007374D03* +X015810Y007384D03* +X015810Y007394D03* +X015810Y007404D03* +X015810Y007414D03* +X015810Y007424D03* +X015810Y007434D03* +X015810Y007444D03* +X015810Y007454D03* +X015810Y007464D03* +X015810Y007474D03* +X015810Y007484D03* +X015810Y007494D03* +X015810Y007504D03* +X015810Y007514D03* +X015810Y007524D03* +X015810Y007534D03* +X015810Y007544D03* +X015810Y007554D03* +X015810Y007564D03* +X015810Y007574D03* +X015810Y007584D03* +X015810Y007594D03* +X015810Y007604D03* +X015810Y007614D03* +X015810Y007624D03* +X015810Y007634D03* +X015810Y007644D03* +X015810Y007654D03* +X015810Y007664D03* +X015810Y007674D03* +X015810Y007684D03* +X015810Y007694D03* +X015810Y007704D03* +X015810Y007714D03* +X015810Y007724D03* +X015810Y007734D03* +X015810Y007744D03* +X015810Y007754D03* +X015810Y007764D03* +X015810Y007774D03* +X015810Y007784D03* +X015810Y007794D03* +X015810Y007804D03* +X015810Y007814D03* +X015810Y007824D03* +X015810Y007834D03* +X015810Y007844D03* +X015810Y007854D03* +X015810Y007864D03* +X015810Y007874D03* +X015810Y007884D03* +X015810Y007894D03* +X015810Y007904D03* +X015810Y007914D03* +X015810Y007924D03* +X015810Y007934D03* +X015810Y007944D03* +X015810Y007954D03* +X015810Y007964D03* +X015810Y007974D03* +X015810Y007984D03* +X015810Y007994D03* +X015810Y008004D03* +X015810Y008014D03* +X015810Y008024D03* +X015810Y008034D03* +X015810Y008044D03* +X015810Y008054D03* +X015810Y008064D03* +X015810Y008074D03* +X015810Y008084D03* +X015810Y008094D03* +X015810Y008104D03* +X015810Y008114D03* +X015810Y008124D03* +X015810Y008134D03* +X015810Y008144D03* +X015810Y008154D03* +X015810Y008164D03* +X015810Y008174D03* +X015810Y008184D03* +X015810Y008194D03* +X015810Y008204D03* +X015810Y008214D03* +X015810Y008224D03* +X015810Y008234D03* +X015810Y008244D03* +X015810Y008254D03* +X015810Y008264D03* +X015810Y008274D03* +X015810Y008284D03* +X015810Y008294D03* +X015810Y008304D03* +X015810Y008314D03* +X015810Y008324D03* +X015810Y008334D03* +X015810Y008344D03* +X015810Y008354D03* +X015810Y008364D03* +X015810Y008374D03* +X015810Y008384D03* +X015810Y008394D03* +X015810Y008404D03* +X015810Y008414D03* +X015810Y008424D03* +X015810Y008434D03* +X015810Y008444D03* +X015810Y008454D03* +X015810Y008464D03* +X015810Y008474D03* +X015810Y008484D03* +X015810Y008494D03* +X015810Y008504D03* +X015810Y008514D03* +X015810Y008524D03* +X015810Y008534D03* +X015810Y008544D03* +X015810Y008554D03* +X015810Y008564D03* +X015810Y008574D03* +X015810Y008584D03* +X015810Y008594D03* +X015810Y008604D03* +X015810Y008614D03* +X015810Y008624D03* +X015810Y008634D03* +X010930Y008634D03* +X010930Y008624D03* +X010930Y008614D03* +X010930Y008604D03* +X010930Y008594D03* +X010930Y008584D03* +X010930Y008574D03* +X010930Y008564D03* +X010930Y008554D03* +X010930Y008544D03* +X010930Y008534D03* +X010930Y008524D03* +X010930Y008514D03* +X010930Y008504D03* +X010930Y008494D03* +X010930Y008484D03* +X010930Y008474D03* +X010930Y008464D03* +X010930Y008454D03* +X010930Y008444D03* +X010930Y008434D03* +X010930Y008424D03* +X010930Y008414D03* +X010930Y008404D03* +X010930Y008394D03* +X010930Y008384D03* +X010930Y008374D03* +X010930Y008364D03* +X010930Y008354D03* +X010930Y008344D03* +X010930Y008334D03* +X010930Y008324D03* +X010930Y008314D03* +X010930Y008304D03* +X010930Y008294D03* +X010930Y008284D03* +X010930Y008274D03* +X010930Y008264D03* +X010930Y008254D03* +X010930Y008244D03* +X010930Y008234D03* +X010930Y008224D03* +X010930Y008214D03* +X010930Y008204D03* +X010930Y008194D03* +X010930Y008184D03* +X010930Y008174D03* +X010930Y008164D03* +X010930Y008154D03* +X010930Y008144D03* +X010930Y008134D03* +X010930Y008124D03* +X010930Y008114D03* +X010930Y008104D03* +X010930Y008094D03* +X010930Y008084D03* +X010930Y008074D03* +X010930Y008064D03* +X010930Y008054D03* +X010930Y008044D03* +X010930Y008034D03* +X010930Y008024D03* +X010930Y008014D03* +X010930Y008004D03* +X010930Y007994D03* +X010930Y007984D03* +X010930Y007974D03* +X010930Y007964D03* +X010930Y007954D03* +X010930Y007944D03* +X010930Y007934D03* +X010930Y007924D03* +X010930Y007914D03* +X010930Y007904D03* +X010930Y007894D03* +X010930Y007884D03* +X010930Y007874D03* +X010930Y007864D03* +X010930Y007854D03* +X010930Y007844D03* +X010930Y007834D03* +X010930Y007824D03* +X010930Y007814D03* +X010930Y007804D03* +X010930Y007794D03* +X010930Y007784D03* +X010930Y007774D03* +X010930Y007764D03* +X010930Y007754D03* +X010930Y007744D03* +X010930Y007734D03* +X010930Y007724D03* +X010930Y007714D03* +X010930Y007704D03* +X010930Y007694D03* +X010930Y007684D03* +X010930Y007674D03* +X010930Y007664D03* +X010930Y007654D03* +X010930Y007644D03* +X010930Y007634D03* +X010930Y007624D03* +X010930Y007614D03* +X010930Y007604D03* +X010930Y007594D03* +X010930Y007584D03* +X010930Y007574D03* +X010930Y007564D03* +X010930Y007554D03* +X010930Y007544D03* +X010930Y007534D03* +X010930Y007524D03* +X010930Y007514D03* +X010930Y007504D03* +X010930Y007494D03* +X010930Y007484D03* +X010930Y007474D03* +X010930Y007464D03* +X010930Y007454D03* +X010930Y007444D03* +X010930Y007434D03* +X010930Y007424D03* +X010930Y007414D03* +X010930Y007404D03* +X010930Y007394D03* +X010930Y007384D03* +X010930Y007374D03* +X010930Y007364D03* +X010930Y007354D03* +X010930Y007344D03* +X010930Y007334D03* +X010930Y007324D03* +X010930Y007314D03* +X010930Y007304D03* +X010930Y007294D03* +X010930Y007284D03* +X010930Y007274D03* +X010930Y007264D03* +X010930Y007254D03* +X010930Y007244D03* +X010930Y007234D03* +X010930Y007224D03* +X010930Y007214D03* +X010930Y007204D03* +X010930Y007194D03* +X010930Y007184D03* +X010930Y007174D03* +X010930Y007164D03* +X010930Y007154D03* +X010930Y007144D03* +X010930Y007134D03* +X010930Y007124D03* +X010930Y007114D03* +X010930Y007104D03* +X010930Y007094D03* +X010930Y007084D03* +X010930Y007074D03* +X010930Y007064D03* +X010930Y007054D03* +X010930Y007044D03* +X010930Y007034D03* +X010930Y007024D03* +X010930Y007014D03* +X010930Y007004D03* +X010930Y006994D03* +X010930Y006984D03* +X010930Y006974D03* +X010930Y008644D03* +X010930Y008654D03* +X010930Y008664D03* +X010930Y008674D03* +X010930Y008684D03* +X010930Y008694D03* +X010930Y008704D03* +X010930Y008714D03* +X010930Y008724D03* +X010930Y008734D03* +X010930Y008744D03* +X010930Y008754D03* +X010930Y008764D03* +X010930Y008774D03* +X010930Y008784D03* +X010930Y008794D03* +X010930Y008804D03* +X010930Y008814D03* +X010930Y008824D03* +X010930Y008834D03* +X010930Y008844D03* +X010930Y008854D03* +X010930Y008864D03* +X010930Y008874D03* +X010930Y008884D03* +X010930Y008894D03* +X010930Y008904D03* +X010930Y008914D03* +X010930Y008924D03* +X010930Y008934D03* +X010930Y008944D03* +X010930Y008954D03* +X010930Y008964D03* +X010930Y008974D03* +X010930Y008984D03* +X010930Y008994D03* +X010930Y009004D03* +X010930Y009014D03* +X010930Y009024D03* +X010930Y009034D03* +X010930Y009044D03* +X010930Y009054D03* +X010930Y009064D03* +X010930Y009074D03* +X010930Y009084D03* +X010930Y009094D03* +X010930Y009104D03* +X010930Y009114D03* +X010930Y009124D03* +X010930Y009134D03* +X010930Y009144D03* +X010930Y009154D03* +X010930Y009164D03* +X010930Y009174D03* +X010930Y009184D03* +X010930Y009194D03* +X010930Y009204D03* +X010930Y009214D03* +X010930Y009224D03* +X010930Y009234D03* +X010930Y009244D03* +X010930Y009254D03* +X010930Y009264D03* +X010930Y009274D03* +X010930Y009284D03* +X010930Y009294D03* +X010930Y009304D03* +X010930Y009314D03* +X010930Y009324D03* +X010930Y009334D03* +X010930Y009344D03* +X010930Y009354D03* +X010930Y009364D03* +X010930Y009374D03* +X010930Y009384D03* +X010930Y009394D03* +X010930Y009404D03* +X010930Y009414D03* +X010930Y009424D03* +X010930Y009434D03* +X010930Y009444D03* +X010930Y009454D03* +X010930Y009464D03* +X010930Y009474D03* +X010930Y009484D03* +X010930Y009494D03* +X010930Y009504D03* +X010930Y009514D03* +X010930Y009524D03* +X010930Y009534D03* +X010930Y009544D03* +X010930Y009554D03* +X010930Y009564D03* +X010930Y009574D03* +X010930Y009584D03* +X010930Y009594D03* +X010930Y009604D03* +X010930Y009614D03* +X010930Y009624D03* +X010930Y009634D03* +X010930Y009644D03* +X010930Y009654D03* +X010930Y009664D03* +X010930Y009674D03* +X010930Y009684D03* +X010930Y009694D03* +X010930Y009704D03* +X010930Y009714D03* +X010930Y009724D03* +X010930Y009734D03* +X010930Y009744D03* +X010930Y009754D03* +X010930Y009764D03* +X010930Y009774D03* +X010930Y009784D03* +X010930Y009794D03* +X010930Y009804D03* +X010930Y009814D03* +X010930Y009824D03* +X010930Y009834D03* +X010930Y009844D03* +X010930Y009854D03* +X010930Y009864D03* +X010930Y009874D03* +X010930Y009884D03* +X010930Y009894D03* +X010930Y009904D03* +X010930Y009914D03* +X010930Y009924D03* +X010930Y009934D03* +X010930Y009944D03* +X010930Y009954D03* +X010930Y009964D03* +X010930Y009974D03* +X010930Y009984D03* +X010930Y009994D03* +X010930Y010004D03* +X010930Y010014D03* +X010930Y010024D03* +X010930Y010034D03* +X010930Y010044D03* +X010930Y010054D03* +X010930Y010064D03* +X010930Y010074D03* +X010930Y010084D03* +X010930Y010094D03* +X010930Y010534D03* +X010930Y010544D03* +X010930Y010554D03* +X010930Y010564D03* +X010930Y010574D03* +X010930Y010584D03* +X010930Y010594D03* +X010930Y010604D03* +X010930Y010614D03* +X010930Y010624D03* +X010930Y010634D03* +X010930Y010644D03* +X010930Y010654D03* +X010930Y010664D03* +X010930Y010674D03* +X010930Y010684D03* +X010930Y010694D03* +X010930Y010704D03* +X010930Y010714D03* +X010930Y010724D03* +X010930Y010734D03* +X010930Y010744D03* +X010930Y010754D03* +X010930Y010764D03* +X010930Y010774D03* +X010930Y010784D03* +X010930Y010794D03* +X010930Y010804D03* +X010930Y010814D03* +X010930Y010824D03* +X010930Y010834D03* +X010930Y010844D03* +X010930Y010854D03* +X010930Y010864D03* +X010930Y010874D03* +X010930Y010884D03* +X010930Y010894D03* +X010930Y010904D03* +X010930Y010914D03* +X010930Y010924D03* +X010930Y010934D03* +X010930Y010944D03* +X010930Y010954D03* +X010930Y010964D03* +X010930Y010974D03* +X010930Y010984D03* +X010930Y010994D03* +X010930Y011004D03* +X010930Y011014D03* +X010930Y011024D03* +X010930Y011034D03* +X010930Y011044D03* +X010930Y011054D03* +X010930Y011064D03* +X010930Y011074D03* +X010930Y011084D03* +X010930Y011094D03* +X010930Y011104D03* +X010930Y011114D03* +X010930Y011124D03* +X010930Y011134D03* +X010930Y011144D03* +X010930Y011154D03* +X010930Y011164D03* +X010930Y011174D03* +X010930Y011184D03* +X010930Y011194D03* +X010930Y011204D03* +X010930Y011214D03* +X010930Y011224D03* +X010930Y011234D03* +X010930Y011244D03* +X010930Y011254D03* +X010930Y011264D03* +X010930Y011274D03* +X010930Y011284D03* +X010930Y011294D03* +X010930Y011304D03* +X010930Y011314D03* +X010930Y011324D03* +X010930Y011334D03* +X010930Y011344D03* +X010930Y011354D03* +X010930Y011364D03* +X010930Y011374D03* +X010930Y011384D03* +X010930Y011394D03* +X010930Y011404D03* +X010930Y011414D03* +X010930Y011424D03* +X010930Y011434D03* +X010930Y011444D03* +X010930Y011454D03* +X010930Y011464D03* +X010930Y011474D03* +X010930Y011484D03* +X010930Y011494D03* +X010930Y011504D03* +X010930Y011514D03* +X010930Y011524D03* +X010930Y011534D03* +X010930Y011544D03* +X010930Y011554D03* +X010930Y011564D03* +X010930Y011574D03* +X010930Y011584D03* +X010930Y011594D03* +X010930Y011604D03* +X010930Y011614D03* +X010930Y011624D03* +X010930Y011634D03* +X010930Y011644D03* +X010930Y011654D03* +X010930Y011664D03* +X010930Y011674D03* +X010930Y011684D03* +X010930Y011694D03* +X010930Y011704D03* +X010930Y011714D03* +X010930Y011724D03* +X010930Y011734D03* +X010930Y011744D03* +X010930Y011754D03* +X010930Y011764D03* +X010930Y011774D03* +X010930Y011784D03* +X010930Y011794D03* +X010930Y011804D03* +X010930Y011814D03* +X010930Y011824D03* +X010930Y011834D03* +X010930Y011844D03* +X010930Y011854D03* +X010930Y011864D03* +X010930Y011874D03* +X010930Y011884D03* +X010930Y011894D03* +X010930Y011904D03* +X010930Y011914D03* +X010930Y011924D03* +X010930Y011934D03* +X010930Y011944D03* +X010930Y011954D03* +X010930Y011964D03* +X010930Y011974D03* +X010930Y011984D03* +X010930Y011994D03* +X010930Y012004D03* +X010930Y012014D03* +X010930Y012024D03* +X010930Y012034D03* +X010930Y012044D03* +X010930Y012054D03* +X010930Y012064D03* +X010930Y012074D03* +X010930Y012084D03* +X010930Y012094D03* +X010930Y012104D03* +X010930Y012114D03* +X010930Y012124D03* +X010930Y012134D03* +X010930Y012144D03* +X010930Y012154D03* +X010930Y012164D03* +X010930Y012174D03* +X010930Y012184D03* +X010930Y012194D03* +X010930Y012204D03* +X010930Y012214D03* +X010930Y012224D03* +X010930Y012234D03* +X010930Y012244D03* +X010930Y012254D03* +X010930Y012264D03* +X010930Y012274D03* +X010930Y012284D03* +X010930Y012294D03* +X010930Y012304D03* +X010930Y012314D03* +X010930Y012324D03* +X010930Y012334D03* +X010930Y012344D03* +X010930Y012354D03* +X010930Y012364D03* +X010930Y012374D03* +X010930Y012384D03* +X010930Y012394D03* +X010930Y012404D03* +X010930Y012414D03* +X010930Y012424D03* +X010930Y012434D03* +X010930Y012444D03* +X010930Y012454D03* +X010930Y012464D03* +X010930Y012474D03* +X010930Y012484D03* +X010930Y012494D03* +X010930Y012504D03* +X010930Y012514D03* +X010930Y012524D03* +X010930Y012534D03* +X010930Y012544D03* +X010930Y012554D03* +X010930Y012564D03* +X010930Y012574D03* +X010930Y012584D03* +X010930Y012594D03* +X010930Y012604D03* +X010930Y012614D03* +X010930Y012624D03* +X010930Y012634D03* +X010930Y012644D03* +X010930Y012654D03* +X010930Y012664D03* +X010930Y012674D03* +X010930Y012684D03* +X010930Y012694D03* +X010930Y012704D03* +X010930Y012714D03* +X010930Y012724D03* +X010930Y012734D03* +X010930Y012744D03* +X010930Y012754D03* +X010930Y012764D03* +X010930Y012774D03* +X010930Y012784D03* +X010930Y012794D03* +X010930Y012804D03* +X010930Y012814D03* +X010930Y012824D03* +X010930Y012834D03* +X010930Y012844D03* +X010930Y012854D03* +X010930Y012864D03* +X010930Y012874D03* +X010930Y012884D03* +X010930Y012894D03* +X010930Y012904D03* +X010930Y012914D03* +X010930Y012924D03* +X010930Y012934D03* +X010930Y012944D03* +X010930Y012954D03* +X010930Y012964D03* +X010930Y012974D03* +X010930Y012984D03* +X010930Y012994D03* +X010930Y013004D03* +X010930Y013014D03* +X010930Y013024D03* +X010930Y013034D03* +X010930Y013044D03* +X010930Y013054D03* +X010930Y013064D03* +X010930Y013074D03* +X010930Y013084D03* +X010930Y013094D03* +X010930Y013104D03* +X010930Y013114D03* +X010930Y013124D03* +X010930Y013134D03* +X010930Y013144D03* +X010930Y013154D03* +X010930Y013164D03* +X010930Y013174D03* +X010930Y013184D03* +X010930Y013194D03* +X010930Y013204D03* +X010930Y013214D03* +X010930Y013224D03* +X010930Y013234D03* +X010930Y013244D03* +X010930Y013254D03* +D12* +X013355Y012004D03* +X014305Y011544D03* +X014285Y011494D03* +X014275Y011464D03* +X014265Y011444D03* +X014255Y011414D03* +X014245Y011394D03* +X014235Y011364D03* +X014225Y011344D03* +X014225Y011334D03* +X014215Y011314D03* +X014205Y011294D03* +X014205Y011284D03* +X014195Y011264D03* +X014185Y011244D03* +X014185Y011234D03* +X014175Y011214D03* +X015765Y009434D03* +X015765Y009424D03* +X015275Y008624D03* +X015265Y008604D03* +X015255Y008594D03* +X015245Y008574D03* +X015225Y008544D03* +X015215Y008524D03* +X015205Y008514D03* +X015195Y008494D03* +X015185Y008474D03* +X015175Y008464D03* +X015165Y008444D03* +X015145Y008414D03* +X015135Y008394D03* +X015125Y008384D03* +X015115Y008364D03* +X015105Y008344D03* +X015095Y008334D03* +X015085Y008314D03* +X015075Y008304D03* +X015075Y008294D03* +X015065Y008284D03* +X015055Y008264D03* +X015045Y008254D03* +X015035Y008234D03* +X015025Y008214D03* +X015015Y008204D03* +X015005Y008184D03* +X014995Y008174D03* +X014995Y008164D03* +X014985Y008154D03* +X014975Y008134D03* +X014965Y008124D03* +X014955Y008104D03* +X014945Y008094D03* +X014945Y008084D03* +X014935Y008074D03* +X014925Y008054D03* +X014915Y008044D03* +X014915Y008034D03* +X014905Y008024D03* +X014895Y008004D03* +X014885Y007994D03* +X014885Y007984D03* +X014875Y007974D03* +X014865Y007964D03* +X014865Y007954D03* +X014855Y007944D03* +X014845Y007924D03* +X014835Y007914D03* +X014835Y007904D03* +X014345Y007124D03* +X014345Y007114D03* +X016765Y007834D03* +X016775Y007814D03* +X016775Y007804D03* +X016785Y007784D03* +X016785Y007774D03* +X016795Y007764D03* +X016785Y008794D03* +X016795Y008814D03* +X016795Y008824D03* +X016805Y008844D03* +X018495Y008824D03* +X018495Y008814D03* +X018505Y008804D03* +X018505Y008794D03* +X018515Y008774D03* +X018525Y007834D03* +X018515Y007814D03* +X018515Y007804D03* +X018505Y007794D03* +X018505Y007784D03* +X019175Y011774D03* +X019195Y012154D03* +X019195Y012164D03* +X019205Y012174D03* +X019295Y013194D03* +X015165Y013674D03* +X006695Y007474D03* +X006705Y007454D03* +X006715Y007444D03* +X006725Y007424D03* +X006745Y007394D03* +X006755Y007374D03* +X006765Y007364D03* +X006775Y007344D03* +X006795Y007314D03* +X006825Y007264D03* +X006845Y007234D03* +X006875Y007184D03* +X006925Y007104D03* +X007005Y006974D03* +X006685Y007494D03* +X006675Y007504D03* +X006665Y007524D03* +X006655Y007534D03* +X006655Y007544D03* +X006645Y007554D03* +X006635Y007574D03* +X006625Y007584D03* +X006615Y007604D03* +X006605Y007614D03* +X006605Y007624D03* +X006595Y007634D03* +X006585Y007654D03* +X006575Y007664D03* +X006575Y007674D03* +X006565Y007684D03* +X006555Y007694D03* +X006555Y007704D03* +X006545Y007714D03* +X006535Y007734D03* +X006525Y007744D03* +X006525Y007754D03* +X006515Y007764D03* +X006505Y007774D03* +X006505Y007784D03* +X006495Y007794D03* +X006495Y007804D03* +X006485Y007814D03* +X006475Y007824D03* +X006475Y007834D03* +X006465Y007844D03* +X006455Y007854D03* +X006455Y007864D03* +X006445Y007874D03* +X006445Y007884D03* +X006435Y007894D03* +X006425Y007904D03* +X006425Y007914D03* +X006415Y007924D03* +X006405Y007944D03* +X006395Y007954D03* +X006395Y007964D03* +X006385Y007974D03* +X006375Y007984D03* +X006375Y007994D03* +X006365Y008004D03* +X006355Y008024D03* +X006345Y008034D03* +X006345Y008044D03* +X006335Y008054D03* +X006325Y008074D03* +X006315Y008084D03* +X006305Y008104D03* +X006295Y008124D03* +X006285Y008134D03* +X006275Y008154D03* +X006265Y008164D03* +X006255Y008184D03* +X006235Y008214D03* +X006225Y008234D03* +X006205Y008264D03* +X006185Y008294D03* +X006175Y008314D03* +X006155Y008344D03* +X006125Y008394D03* +X006105Y008424D03* +X006075Y008474D03* +X006025Y008554D03* +X004355Y009554D03* +X004345Y009544D03* +X004335Y009524D03* +X004315Y009494D03* +X004305Y009474D03* +X004285Y009444D03* +X004275Y009424D03* +X004255Y009394D03* +X004245Y009374D03* +X004225Y009344D03* +X004215Y009324D03* +X004195Y009294D03* +X004185Y009274D03* +X004165Y009244D03* +X004155Y009224D03* +X004135Y009194D03* +X004105Y009144D03* +X004075Y009094D03* +X004045Y009044D03* +X004015Y008994D03* +X003995Y008964D03* +X003985Y008944D03* +X003965Y008914D03* +X003935Y008864D03* +X003905Y008814D03* +X003875Y008764D03* +X003845Y008714D03* +X003815Y008664D03* +X003645Y008384D03* +X004365Y009574D03* +X004375Y009594D03* +X004385Y009604D03* +X004395Y009624D03* +X004405Y009644D03* +X004415Y009654D03* +X004415Y009664D03* +X004425Y009674D03* +X004435Y009694D03* +X004445Y009704D03* +X004445Y009714D03* +X004455Y009724D03* +X004455Y009734D03* +X004465Y009744D03* +X004475Y009764D03* +X004485Y009774D03* +X004485Y009784D03* +X004495Y009794D03* +X004505Y009814D03* +X005235Y010924D03* +X005245Y010944D03* +X005265Y010974D03* +X005275Y010994D03* +X005285Y011014D03* +X005295Y011024D03* +X005295Y011034D03* +X005305Y011044D03* +X005305Y011054D03* +X005315Y011064D03* +X005325Y011074D03* +X005325Y011084D03* +X005335Y011094D03* +X005335Y011104D03* +X005345Y011114D03* +X005355Y011124D03* +X005355Y011134D03* +X005365Y011144D03* +X005365Y011154D03* +X005375Y011164D03* +X005385Y011184D03* +X005395Y011194D03* +X005395Y011204D03* +X005405Y011214D03* +X005415Y011234D03* +X005425Y011244D03* +X005425Y011254D03* +X005435Y011264D03* +X005445Y011284D03* +X005455Y011294D03* +X005455Y011304D03* +X005465Y011314D03* +X005475Y011334D03* +X005485Y011344D03* +X005485Y011354D03* +X005495Y011364D03* +X005505Y011384D03* +X005515Y011394D03* +X005515Y011404D03* +X005525Y011414D03* +X005535Y011434D03* +X005545Y011444D03* +X005545Y011454D03* +X005555Y011464D03* +X005565Y011484D03* +X005575Y011494D03* +X005575Y011504D03* +X005585Y011514D03* +X005595Y011534D03* +X005605Y011554D03* +X005615Y011564D03* +X005625Y011584D03* +X005635Y011604D03* +X005645Y011614D03* +X005645Y011624D03* +X005655Y011634D03* +X005665Y011654D03* +X005675Y011664D03* +X005675Y011674D03* +X005685Y011684D03* +X005695Y011704D03* +X005705Y011714D03* +X005705Y011724D03* +X005715Y011734D03* +X005725Y011754D03* +X005735Y011764D03* +X005735Y011774D03* +X005745Y011784D03* +X005755Y011804D03* +X005765Y011814D03* +X005765Y011824D03* +X005775Y011834D03* +X005785Y011854D03* +X005795Y011864D03* +X005795Y011874D03* +X005805Y011884D03* +X005815Y011904D03* +X005825Y011914D03* +X005825Y011924D03* +X005835Y011934D03* +X005845Y011954D03* +X005855Y011974D03* +X005865Y011984D03* +X005875Y012004D03* +X005885Y012024D03* +X005895Y012034D03* +X005905Y012054D03* +X005915Y012074D03* +X005925Y012084D03* +X005935Y012104D03* +X005945Y012124D03* +X005955Y012134D03* +X005965Y012154D03* +X005975Y012174D03* +X005985Y012184D03* +X005995Y012204D03* +X006005Y012224D03* +X006015Y012234D03* +X006025Y012254D03* +X006035Y012274D03* +X006045Y012284D03* +X006055Y012304D03* +X006065Y012324D03* +X006075Y012334D03* +X006085Y012354D03* +X006095Y012374D03* +X006105Y012384D03* +X006115Y012404D03* +X006125Y012424D03* +X006145Y012454D03* +X006155Y012474D03* +X006175Y012504D03* +X006185Y012524D03* +X006205Y012554D03* +X006215Y012574D03* +X006235Y012604D03* +X006245Y012624D03* +X006265Y012654D03* +X006275Y012674D03* +X006295Y012704D03* +X006305Y012724D03* +X006325Y012754D03* +X006335Y012774D03* +X006355Y012804D03* +X006365Y012824D03* +X006395Y012874D03* +X006425Y012924D03* +X006455Y012974D03* +X006485Y013024D03* +X006515Y013074D03* +X006545Y013124D03* +X006575Y013174D03* +X006605Y013224D03* +D13* +X006600Y013214D03* +X006590Y013204D03* +X006590Y013194D03* +X006580Y013184D03* +X006570Y013164D03* +X006560Y013154D03* +X006560Y013144D03* +X006550Y013134D03* +X006540Y013114D03* +X006530Y013104D03* +X006530Y013094D03* +X006520Y013084D03* +X006510Y013064D03* +X006500Y013054D03* +X006500Y013044D03* +X006490Y013034D03* +X006480Y013014D03* +X006470Y013004D03* +X006470Y012994D03* +X006460Y012984D03* +X006450Y012964D03* +X006440Y012954D03* +X006440Y012944D03* +X006430Y012934D03* +X006420Y012914D03* +X006410Y012904D03* +X006410Y012894D03* +X006400Y012884D03* +X006390Y012864D03* +X006380Y012854D03* +X006380Y012844D03* +X006370Y012834D03* +X006360Y012814D03* +X006350Y012794D03* +X006340Y012784D03* +X006330Y012764D03* +X006320Y012744D03* +X006310Y012734D03* +X006300Y012714D03* +X006290Y012694D03* +X006280Y012684D03* +X006270Y012664D03* +X006260Y012644D03* +X006250Y012634D03* +X006240Y012614D03* +X006230Y012594D03* +X006220Y012584D03* +X006210Y012564D03* +X006200Y012544D03* +X006190Y012534D03* +X006180Y012514D03* +X006170Y012494D03* +X006160Y012484D03* +X006150Y012464D03* +X006140Y012444D03* +X006130Y012434D03* +X006120Y012414D03* +X006110Y012394D03* +X006090Y012364D03* +X006080Y012344D03* +X006060Y012314D03* +X006050Y012294D03* +X006030Y012264D03* +X006020Y012244D03* +X006000Y012214D03* +X005990Y012194D03* +X005970Y012164D03* +X005960Y012144D03* +X005940Y012114D03* +X005930Y012094D03* +X005910Y012064D03* +X005900Y012044D03* +X005880Y012014D03* +X005870Y011994D03* +X005850Y011964D03* +X005840Y011944D03* +X005810Y011894D03* +X005780Y011844D03* +X005750Y011794D03* +X005720Y011744D03* +X005690Y011694D03* +X005660Y011644D03* +X005630Y011594D03* +X005620Y011574D03* +X005600Y011544D03* +X005590Y011524D03* +X005560Y011474D03* +X005530Y011424D03* +X005500Y011374D03* +X005470Y011324D03* +X005440Y011274D03* +X005410Y011224D03* +X005380Y011174D03* +X004430Y009684D03* +X004400Y009634D03* +X004390Y009614D03* +X004370Y009584D03* +X004360Y009564D03* +X004340Y009534D03* +X004330Y009514D03* +X004320Y009504D03* +X004310Y009484D03* +X004300Y009464D03* +X004290Y009454D03* +X004280Y009434D03* +X004270Y009414D03* +X004260Y009404D03* +X004250Y009384D03* +X004240Y009364D03* +X004230Y009354D03* +X004220Y009334D03* +X004210Y009314D03* +X004200Y009304D03* +X004190Y009284D03* +X004180Y009264D03* +X004170Y009254D03* +X004160Y009234D03* +X004150Y009214D03* +X004140Y009204D03* +X004130Y009184D03* +X004120Y009174D03* +X004120Y009164D03* +X004110Y009154D03* +X004100Y009134D03* +X004090Y009124D03* +X004090Y009114D03* +X004080Y009104D03* +X004070Y009084D03* +X004060Y009074D03* +X004060Y009064D03* +X004050Y009054D03* +X004040Y009034D03* +X004030Y009024D03* +X004030Y009014D03* +X004020Y009004D03* +X004010Y008984D03* +X004000Y008974D03* +X003990Y008954D03* +X003980Y008934D03* +X003970Y008924D03* +X003960Y008904D03* +X003950Y008894D03* +X003950Y008884D03* +X003940Y008874D03* +X003930Y008854D03* +X003920Y008844D03* +X003920Y008834D03* +X003910Y008824D03* +X003900Y008804D03* +X003890Y008794D03* +X003890Y008784D03* +X003880Y008774D03* +X003870Y008754D03* +X003860Y008744D03* +X003860Y008734D03* +X003850Y008724D03* +X003840Y008704D03* +X003830Y008694D03* +X003830Y008684D03* +X003820Y008674D03* +X003810Y008654D03* +X003800Y008644D03* +X003800Y008634D03* +X003790Y008624D03* +X003780Y008614D03* +X003780Y008604D03* +X003770Y008594D03* +X003770Y008584D03* +X003760Y008574D03* +X003750Y008564D03* +X003750Y008554D03* +X003740Y008544D03* +X003740Y008534D03* +X003730Y008524D03* +X003720Y008514D03* +X003720Y008504D03* +X003710Y008494D03* +X003710Y008484D03* +X003700Y008474D03* +X003690Y008464D03* +X003690Y008454D03* +X003680Y008444D03* +X003680Y008434D03* +X003670Y008424D03* +X003660Y008414D03* +X003660Y008404D03* +X003650Y008394D03* +X003640Y008374D03* +X003630Y008364D03* +X003630Y008354D03* +X003620Y008344D03* +X003610Y008334D03* +X003610Y008324D03* +X003600Y008314D03* +X003600Y008304D03* +X003590Y008294D03* +X003580Y008284D03* +X003580Y008274D03* +X003570Y008264D03* +X003570Y008254D03* +X003560Y008244D03* +X003550Y008234D03* +X003550Y008224D03* +X003540Y008214D03* +X003540Y008204D03* +X003530Y008194D03* +X003520Y008184D03* +X003520Y008174D03* +X003510Y008164D03* +X003510Y008154D03* +X003500Y008144D03* +X003490Y008134D03* +X003490Y008124D03* +X003480Y008114D03* +X003480Y008104D03* +X003470Y008094D03* +X003460Y008084D03* +X003460Y008074D03* +X003450Y008064D03* +X003450Y008054D03* +X003440Y008044D03* +X003430Y008034D03* +X003430Y008024D03* +X003420Y008014D03* +X003410Y007994D03* +X003400Y007984D03* +X003400Y007974D03* +X003390Y007964D03* +X003380Y007944D03* +X003370Y007934D03* +X003370Y007924D03* +X003360Y007914D03* +X003350Y007894D03* +X003340Y007884D03* +X003340Y007874D03* +X003330Y007864D03* +X003320Y007844D03* +X003310Y007834D03* +X003310Y007824D03* +X003300Y007814D03* +X003290Y007804D03* +X003290Y007794D03* +X003280Y007784D03* +X003280Y007774D03* +X003270Y007764D03* +X003260Y007754D03* +X003260Y007744D03* +X003250Y007734D03* +X003240Y007714D03* +X003230Y007704D03* +X003230Y007694D03* +X003220Y007684D03* +X003210Y007664D03* +X003200Y007654D03* +X003200Y007644D03* +X003190Y007634D03* +X003180Y007614D03* +X003170Y007604D03* +X003170Y007594D03* +X003160Y007584D03* +X003150Y007564D03* +X003140Y007554D03* +X003140Y007544D03* +X003130Y007534D03* +X003120Y007514D03* +X003110Y007504D03* +X003110Y007494D03* +X003100Y007484D03* +X003090Y007464D03* +X003080Y007454D03* +X003070Y007434D03* +X003060Y007414D03* +X003050Y007404D03* +X003040Y007384D03* +X003030Y007364D03* +X003020Y007354D03* +X003010Y007334D03* +X003000Y007314D03* +X002990Y007304D03* +X002980Y007284D03* +X002970Y007264D03* +X002960Y007254D03* +X002950Y007234D03* +X002940Y007224D03* +X002940Y007214D03* +X002930Y007204D03* +X002920Y007184D03* +X002910Y007174D03* +X002900Y007154D03* +X002890Y007134D03* +X002880Y007124D03* +X002870Y007104D03* +X002860Y007084D03* +X002850Y007074D03* +X002840Y007054D03* +X002830Y007034D03* +X002820Y007024D03* +X002810Y007004D03* +X002800Y006984D03* +X002790Y006974D03* +X006540Y007724D03* +X006590Y007644D03* +X006620Y007594D03* +X006640Y007564D03* +X006670Y007514D03* +X006690Y007484D03* +X006700Y007464D03* +X006720Y007434D03* +X006730Y007414D03* +X006740Y007404D03* +X006750Y007384D03* +X006770Y007354D03* +X006780Y007334D03* +X006790Y007324D03* +X006800Y007304D03* +X006810Y007294D03* +X006810Y007284D03* +X006820Y007274D03* +X006830Y007254D03* +X006840Y007244D03* +X006850Y007224D03* +X006860Y007214D03* +X006860Y007204D03* +X006870Y007194D03* +X006880Y007174D03* +X006890Y007164D03* +X006890Y007154D03* +X006900Y007144D03* +X006910Y007134D03* +X006910Y007124D03* +X006920Y007114D03* +X006930Y007094D03* +X006940Y007084D03* +X006940Y007074D03* +X006950Y007064D03* +X006960Y007054D03* +X006960Y007044D03* +X006970Y007034D03* +X006970Y007024D03* +X006980Y007014D03* +X006990Y007004D03* +X006990Y006994D03* +X007000Y006984D03* +X013350Y012014D03* +X015160Y013654D03* +X015160Y013664D03* +X019300Y013204D03* +X019370Y012754D03* +X019220Y012194D03* +X019210Y012184D03* +X019180Y011764D03* +X019190Y011744D03* +X015760Y009414D03* +X015760Y009404D03* +X015280Y008634D03* +X015270Y008614D03* +X015250Y008584D03* +X015240Y008564D03* +X015230Y008554D03* +X015220Y008534D03* +X015200Y008504D03* +X015190Y008484D03* +X015170Y008454D03* +X015160Y008434D03* +X015150Y008424D03* +X015140Y008404D03* +X015120Y008374D03* +X015110Y008354D03* +X015090Y008324D03* +X015060Y008274D03* +X015040Y008244D03* +X015030Y008224D03* +X015010Y008194D03* +X014980Y008144D03* +X014960Y008114D03* +X014930Y008064D03* +X014900Y008014D03* +X014850Y007934D03* +X014350Y007134D03* +X016800Y007744D03* +X016800Y007754D03* +X016810Y007724D03* +X016800Y008834D03* +X016810Y008854D03* +X016820Y008864D03* +X016820Y008874D03* +X018480Y008854D03* +X018480Y008844D03* +X018490Y008834D03* +X018500Y007774D03* +X018500Y007764D03* +X018490Y007754D03* +X018490Y007744D03* +X006860Y013644D03* +X006860Y013654D03* +X006870Y013664D03* +X006870Y013674D03* +X006880Y013684D03* +X006850Y013634D03* +X006840Y013624D03* +X006840Y013614D03* +X006830Y013604D03* +X006830Y013594D03* +X006820Y013584D03* +X006810Y013574D03* +X006810Y013564D03* +X006800Y013554D03* +X006800Y013544D03* +X006790Y013534D03* +X006780Y013524D03* +X006780Y013514D03* +X006770Y013504D03* +X006770Y013494D03* +X006760Y013484D03* +X006750Y013474D03* +X006750Y013464D03* +X006740Y013454D03* +X006740Y013444D03* +X006730Y013434D03* +X006720Y013424D03* +X006720Y013414D03* +X006710Y013404D03* +X006710Y013394D03* +X006700Y013384D03* +X006690Y013374D03* +X006690Y013364D03* +X006680Y013354D03* +X006680Y013344D03* +X006670Y013334D03* +X006660Y013324D03* +X006660Y013314D03* +X006650Y013304D03* +X006650Y013294D03* +X006640Y013284D03* +X006630Y013274D03* +X006630Y013264D03* +X006620Y013254D03* +X006620Y013244D03* +X006610Y013234D03* +D14* +X013345Y012024D03* +X015755Y009394D03* +X016825Y008884D03* +X016835Y008894D03* +X016845Y008914D03* +X016805Y007734D03* +X016815Y007714D03* +X016825Y007704D03* +X016835Y007684D03* +X017645Y007024D03* +X018465Y007704D03* +X018475Y007714D03* +X018475Y007724D03* +X018485Y007734D03* +X018475Y008864D03* +X018465Y008874D03* +X018465Y008884D03* +X018455Y008894D03* +X019195Y011734D03* +X019185Y011754D03* +X019385Y012744D03* +X019305Y013214D03* +X014355Y007154D03* +X014355Y007144D03* +X003415Y008004D03* +X003385Y007954D03* +X003355Y007904D03* +X003325Y007854D03* +X003245Y007724D03* +X003215Y007674D03* +X003185Y007624D03* +X003155Y007574D03* +X003125Y007524D03* +X003095Y007474D03* +X003075Y007444D03* +X003065Y007424D03* +X003045Y007394D03* +X003035Y007374D03* +X003015Y007344D03* +X003005Y007324D03* +X002985Y007294D03* +X002975Y007274D03* +X002955Y007244D03* +X002925Y007194D03* +X002905Y007164D03* +X002895Y007144D03* +X002875Y007114D03* +X002865Y007094D03* +X002845Y007064D03* +X002835Y007044D03* +X002815Y007014D03* +X002805Y006994D03* +D15* +X017645Y007004D03* +D16* +X017640Y007014D03* +D17* +X017640Y007034D03* +X016950Y007534D03* +X016940Y007544D03* +X016950Y009044D03* +X015710Y009244D03* +X015710Y009254D03* +X014400Y007294D03* +X018330Y009044D03* +X013300Y012114D03* +X012690Y012714D03* +X012260Y013184D03* +X012250Y013194D03* +X012240Y013204D03* +X012230Y013214D03* +X012220Y013224D03* +X012210Y013234D03* +X012200Y013244D03* +X012190Y013254D03* +X012180Y013264D03* +X012170Y013274D03* +X012160Y013284D03* +X012150Y013294D03* +X012090Y013364D03* +X012080Y013374D03* +X012070Y013384D03* +X012060Y013394D03* +X012050Y013404D03* +X012040Y013414D03* +X011720Y011224D03* +X015160Y013524D03* +X015160Y013534D03* +X015160Y013544D03* +X004870Y010414D03* +D18* +X005140Y009994D03* +X005150Y009984D03* +X005160Y009964D03* +X005170Y009944D03* +X004470Y010934D03* +X004440Y010984D03* +X004430Y011004D03* +X004420Y011024D03* +X004410Y011034D03* +X004410Y011044D03* +X004400Y011054D03* +X004390Y011074D03* +X004380Y011084D03* +X004380Y011094D03* +X004370Y011104D03* +X004360Y011124D03* +X004350Y011144D03* +X004340Y011154D03* +X004330Y011174D03* +X004320Y011194D03* +X004300Y011224D03* +X004290Y011244D03* +X004270Y011274D03* +X004260Y011294D03* +X004240Y011324D03* +X004230Y011344D03* +X004210Y011374D03* +X004200Y011394D03* +X004180Y011424D03* +X013380Y011424D03* +X013380Y011414D03* +X013380Y011404D03* +X013380Y011394D03* +X013380Y011384D03* +X013380Y011374D03* +X013380Y011364D03* +X013380Y011354D03* +X013380Y011344D03* +X013380Y011334D03* +X013380Y011324D03* +X013380Y011314D03* +X013380Y011304D03* +X013380Y011294D03* +X013380Y011284D03* +X013380Y011274D03* +X013380Y011264D03* +X013380Y011254D03* +X013380Y011244D03* +X013380Y011234D03* +X013380Y011224D03* +X013380Y011214D03* +X013380Y011434D03* +X013380Y011444D03* +X013380Y011454D03* +X013380Y011464D03* +X013380Y011474D03* +X013380Y011484D03* +X013380Y011494D03* +X013380Y011504D03* +X013380Y011514D03* +X013380Y011524D03* +X013380Y011534D03* +X013380Y011544D03* +X013380Y011554D03* +X013380Y011564D03* +X013380Y011574D03* +X013380Y011584D03* +X013380Y011594D03* +X013380Y011604D03* +X013380Y011614D03* +X013380Y011624D03* +X013380Y011634D03* +X013380Y011644D03* +X013380Y011654D03* +X013380Y011664D03* +X013380Y011674D03* +X013380Y011684D03* +X013380Y011694D03* +X013380Y011704D03* +X013380Y011714D03* +X013380Y011724D03* +X013380Y011734D03* +X013380Y011744D03* +X013380Y011754D03* +X013380Y011764D03* +X013380Y011774D03* +X013380Y011784D03* +X013380Y011794D03* +X013380Y011804D03* +X013380Y011814D03* +X013380Y011824D03* +X013380Y011834D03* +X013380Y011844D03* +X013380Y011854D03* +X013380Y011864D03* +X013380Y011874D03* +X013380Y011884D03* +X013380Y011894D03* +X013380Y011904D03* +X013380Y011914D03* +X013380Y011924D03* +X013380Y011934D03* +X013380Y011944D03* +X013380Y011954D03* +X013380Y012614D03* +X013380Y012624D03* +X013380Y012634D03* +X013380Y012644D03* +X013380Y012654D03* +X013380Y012664D03* +X013380Y012674D03* +X013380Y012684D03* +X013380Y012694D03* +X013380Y012704D03* +X013380Y012714D03* +X013380Y012724D03* +X013380Y012734D03* +X013380Y012744D03* +X013380Y012754D03* +X013380Y012764D03* +X013380Y012774D03* +X013380Y012784D03* +X013380Y012794D03* +X013380Y012804D03* +X013380Y012814D03* +X013380Y012824D03* +X013380Y012834D03* +X013380Y012844D03* +X013380Y012854D03* +X013380Y012864D03* +X013380Y012874D03* +X013380Y012884D03* +X013380Y012894D03* +X013380Y012904D03* +X013380Y012914D03* +X013380Y012924D03* +X013380Y012934D03* +X013380Y012944D03* +X013380Y012954D03* +X013380Y012964D03* +X013380Y012974D03* +X013380Y012984D03* +X013380Y012994D03* +X013380Y013004D03* +X013380Y013014D03* +X013380Y013024D03* +X013380Y013034D03* +X013380Y013044D03* +X013380Y013054D03* +X013380Y013064D03* +X013380Y013074D03* +X013380Y013084D03* +X013380Y013094D03* +X013380Y013104D03* +X013380Y013114D03* +X013380Y013124D03* +X013380Y013134D03* +X013380Y013144D03* +X013380Y013154D03* +X013380Y013164D03* +X013380Y013174D03* +X013380Y013184D03* +X013380Y013194D03* +X013380Y013204D03* +X013380Y013214D03* +X013380Y013224D03* +X013380Y013234D03* +X013380Y013244D03* +X013380Y013254D03* +X013380Y013264D03* +X013380Y013274D03* +X013380Y013284D03* +X013380Y013294D03* +X013380Y013304D03* +X013380Y013314D03* +X013380Y013324D03* +X013380Y013334D03* +X013380Y013344D03* +X013380Y013354D03* +X013380Y013364D03* +X013380Y013374D03* +X013380Y013384D03* +X013380Y013394D03* +X013380Y013404D03* +X013380Y013414D03* +X013380Y013424D03* +X013380Y013434D03* +X013380Y013444D03* +X013380Y013454D03* +X013380Y013464D03* +X013380Y013474D03* +X013380Y013484D03* +X013380Y013494D03* +X013380Y013504D03* +X013380Y013514D03* +X013380Y013524D03* +X013380Y013534D03* +X013380Y013544D03* +X013380Y013554D03* +X013380Y013564D03* +X013380Y013574D03* +X013380Y013584D03* +X013380Y013594D03* +X013380Y013604D03* +X013380Y013614D03* +X013380Y013624D03* +X013380Y013634D03* +X013380Y013644D03* +X013380Y013654D03* +X013380Y013664D03* +X013380Y013674D03* +X013380Y013684D03* +X013380Y013694D03* +X014900Y013074D03* +X014880Y013024D03* +X015490Y012904D03* +X015500Y012874D03* +X015510Y012854D03* +X015520Y012824D03* +X015530Y012804D03* +X015530Y012794D03* +X015540Y012774D03* +X015540Y012764D03* +X015550Y012744D03* +X015560Y012724D03* +X015560Y012714D03* +X015570Y012694D03* +X015570Y012684D03* +X015580Y012674D03* +X015580Y012664D03* +X015580Y012654D03* +X015590Y012644D03* +X015590Y012634D03* +X015600Y012624D03* +X015600Y012614D03* +X015600Y012604D03* +X015610Y012594D03* +X015610Y012584D03* +X015610Y012574D03* +X015620Y012564D03* +X015620Y012554D03* +X015630Y012534D03* +X015630Y012524D03* +X015640Y012514D03* +X015640Y012504D03* +X015650Y012484D03* +X015650Y012474D03* +X015660Y012454D03* +X015670Y012434D03* +X015670Y012424D03* +X015680Y012404D03* +X015680Y012394D03* +X015690Y012374D03* +X015700Y012344D03* +X015710Y012324D03* +X015720Y012294D03* +X015750Y012214D03* +X018210Y012214D03* +X018210Y012204D03* +X018210Y012194D03* +X018210Y012184D03* +X018210Y012174D03* +X018210Y012164D03* +X018210Y012154D03* +X018210Y012144D03* +X018210Y012134D03* +X018210Y012124D03* +X018210Y012114D03* +X018210Y012104D03* +X018210Y012094D03* +X018210Y012084D03* +X018210Y012074D03* +X018210Y012064D03* +X018210Y012054D03* +X018210Y012044D03* +X018210Y012034D03* +X018210Y012024D03* +X018210Y012014D03* +X018210Y012004D03* +X018210Y011994D03* +X018210Y011984D03* +X018210Y011974D03* +X018210Y011964D03* +X018210Y011954D03* +X018210Y011944D03* +X018210Y011934D03* +X018210Y011924D03* +X018210Y011914D03* +X018210Y011904D03* +X018210Y011894D03* +X018210Y011884D03* +X018210Y011874D03* +X018210Y011864D03* +X018210Y011854D03* +X018210Y011844D03* +X018210Y011834D03* +X018210Y011824D03* +X018210Y011814D03* +X018210Y011804D03* +X018210Y011794D03* +X018210Y011784D03* +X018210Y011774D03* +X018210Y011764D03* +X018210Y011754D03* +X018210Y011744D03* +X018210Y011734D03* +X018210Y011724D03* +X018210Y011714D03* +X018210Y011704D03* +X018210Y011694D03* +X018210Y011684D03* +X018210Y011674D03* +X018210Y011664D03* +X018210Y011654D03* +X018210Y011644D03* +X018210Y011634D03* +X018210Y012224D03* +X018210Y012234D03* +X018210Y012244D03* +X018210Y012254D03* +X018210Y012264D03* +X018210Y012274D03* +X018210Y012284D03* +X018210Y012294D03* +X018210Y012734D03* +X018210Y012744D03* +X018210Y012754D03* +X018210Y012764D03* +X018210Y012774D03* +X018210Y012784D03* +X018210Y012794D03* +X018210Y012804D03* +X018210Y012814D03* +X018210Y012824D03* +X018210Y012834D03* +X018210Y012844D03* +X018210Y012854D03* +X018210Y012864D03* +X018210Y012874D03* +X018210Y012884D03* +X018210Y012894D03* +X018210Y012904D03* +X018210Y012914D03* +X018210Y012924D03* +X018210Y012934D03* +X018210Y012944D03* +X018210Y012954D03* +X018210Y012964D03* +X018210Y012974D03* +X018210Y012984D03* +X018210Y012994D03* +X018210Y013004D03* +X018210Y013014D03* +X018210Y013024D03* +X018210Y013034D03* +X018210Y013044D03* +X018210Y013054D03* +X018210Y013064D03* +X018210Y013074D03* +X018210Y013084D03* +X018210Y013094D03* +X018210Y013104D03* +X018210Y013114D03* +X018210Y013124D03* +X018210Y013134D03* +X018210Y013144D03* +X018210Y013154D03* +X018210Y013164D03* +X018210Y013174D03* +X018210Y013184D03* +X018210Y013194D03* +X018210Y013204D03* +X018210Y013214D03* +X018210Y013224D03* +X018210Y013234D03* +X018210Y013244D03* +X018210Y013254D03* +X018210Y013264D03* +X019260Y013114D03* +X019260Y013104D03* +X019260Y013094D03* +X019310Y012814D03* +X019320Y012804D03* +X020710Y012804D03* +X020710Y012794D03* +X020710Y012784D03* +X020710Y012774D03* +X020710Y012764D03* +X020710Y012754D03* +X020710Y012744D03* +X020710Y012734D03* +X020710Y012724D03* +X020710Y012714D03* +X020710Y012814D03* +X020710Y012824D03* +X020710Y012834D03* +X020710Y012844D03* +X020710Y012854D03* +X020710Y012864D03* +X020710Y012874D03* +X020710Y012884D03* +X020710Y012894D03* +X020710Y012904D03* +X020710Y012914D03* +X020710Y012924D03* +X020710Y012934D03* +X020710Y012944D03* +X020710Y012954D03* +X020710Y012964D03* +X020710Y012974D03* +X020710Y012984D03* +X020710Y012994D03* +X020710Y013004D03* +X020710Y013014D03* +X020710Y013024D03* +X020710Y013034D03* +X020710Y013044D03* +X020710Y013054D03* +X020710Y013064D03* +X020710Y013074D03* +X020710Y013084D03* +X020710Y013094D03* +X020710Y013104D03* +X020710Y013114D03* +X020710Y013124D03* +X020710Y013134D03* +X020710Y013144D03* +X020710Y013154D03* +X020710Y013164D03* +X020710Y013174D03* +X020710Y013184D03* +X020710Y013194D03* +X020710Y013204D03* +X020710Y013214D03* +X020710Y013224D03* +X020710Y013234D03* +X020710Y013244D03* +X020710Y013254D03* +X020710Y013264D03* +X020710Y013274D03* +X020710Y012284D03* +X020710Y012274D03* +X020710Y012264D03* +X020710Y012254D03* +X020710Y012244D03* +X020710Y012234D03* +X020710Y012224D03* +X020710Y012214D03* +X020710Y012204D03* +X020710Y012194D03* +X020710Y012184D03* +X020710Y012174D03* +X020710Y012164D03* +X020710Y012154D03* +X020710Y012144D03* +X020710Y012134D03* +X020710Y012124D03* +X020710Y012114D03* +X020710Y012104D03* +X020710Y012094D03* +X020710Y012084D03* +X020710Y012074D03* +X020710Y012064D03* +X020710Y012054D03* +X020710Y012044D03* +X020710Y012034D03* +X020710Y012024D03* +X020710Y012014D03* +X020710Y012004D03* +X020710Y011994D03* +X020710Y011984D03* +X020710Y011974D03* +X020710Y011964D03* +X020710Y011954D03* +X020710Y011944D03* +X020710Y011934D03* +X020710Y011924D03* +X020710Y011914D03* +X020710Y011904D03* +X020710Y011894D03* +X020710Y011884D03* +X020710Y011874D03* +X020710Y011864D03* +X020710Y011854D03* +X020710Y011844D03* +X020710Y011834D03* +X020710Y011824D03* +X020710Y011814D03* +X020710Y011804D03* +X020710Y011794D03* +X020710Y011784D03* +X020710Y011774D03* +X020710Y011764D03* +X020710Y011754D03* +X020710Y011744D03* +X020710Y011734D03* +X020710Y011724D03* +X020710Y011714D03* +X020710Y011704D03* +X020710Y011694D03* +X020710Y011684D03* +X020710Y011674D03* +X020710Y011664D03* +X020710Y011654D03* +X020710Y011644D03* +X020710Y011634D03* +X020060Y009104D03* +X020060Y009094D03* +X020060Y009084D03* +X020060Y009074D03* +X020060Y009064D03* +X020060Y009054D03* +X020060Y009044D03* +X020060Y009034D03* +X020060Y009024D03* +X020060Y009014D03* +X020060Y009004D03* +X020060Y008994D03* +X020060Y008984D03* +X020060Y008974D03* +X020060Y008964D03* +X020060Y008954D03* +X020060Y008944D03* +X020060Y008934D03* +X020060Y008924D03* +X020060Y008914D03* +X020060Y008904D03* +X020060Y008894D03* +X020060Y008884D03* +X020060Y008874D03* +X020060Y008864D03* +X020060Y008854D03* +X020060Y008844D03* +X020060Y008834D03* +X020060Y008824D03* +X020060Y008814D03* +X020060Y008804D03* +X020060Y008794D03* +X020060Y008784D03* +X020060Y008774D03* +X020060Y008764D03* +X020060Y008754D03* +X020060Y008744D03* +X020060Y008734D03* +X020060Y008724D03* +X020060Y008714D03* +X020060Y008704D03* +X020060Y008694D03* +X020060Y008684D03* +X020060Y008674D03* +X020060Y008664D03* +X020060Y008654D03* +X020060Y008644D03* +X020060Y008634D03* +X020060Y008624D03* +X020060Y008614D03* +X020060Y008604D03* +X020060Y008594D03* +X020060Y008584D03* +X020060Y008574D03* +X020060Y008564D03* +X020060Y008554D03* +X020060Y008544D03* +X020060Y008534D03* +X020060Y008524D03* +X020060Y008514D03* +X020060Y008504D03* +X020060Y008494D03* +X020060Y008484D03* +X020060Y008474D03* +X020060Y008464D03* +X020060Y008454D03* +X020060Y008444D03* +X020060Y008434D03* +X020060Y008424D03* +X020060Y008414D03* +X020060Y008404D03* +X020060Y008394D03* +X020060Y008384D03* +X020060Y008374D03* +X020060Y008364D03* +X020060Y008354D03* +X020060Y008344D03* +X020060Y008334D03* +X020060Y008324D03* +X020060Y008314D03* +X020060Y008304D03* +X020060Y008294D03* +X020060Y008284D03* +X020060Y008274D03* +X020060Y008264D03* +X020060Y008254D03* +X020060Y008244D03* +X020060Y008234D03* +X020060Y008224D03* +X020060Y008214D03* +X020060Y008204D03* +X020060Y008194D03* +X020060Y008184D03* +X020060Y008174D03* +X020060Y008164D03* +X020060Y008154D03* +X020060Y008144D03* +X020060Y008134D03* +X020060Y008124D03* +X020060Y008114D03* +X020060Y008104D03* +X020060Y008094D03* +X020060Y008084D03* +X020060Y008074D03* +X020060Y008064D03* +X020060Y008054D03* +X020060Y008044D03* +X020060Y008034D03* +X020060Y008024D03* +X020060Y008014D03* +X020060Y008004D03* +X020060Y007994D03* +X020060Y007984D03* +X020060Y007974D03* +X020060Y007964D03* +X020060Y007954D03* +X020060Y007944D03* +X020060Y007934D03* +X020060Y007924D03* +X020060Y007914D03* +X020060Y007904D03* +X020060Y007894D03* +X020060Y007884D03* +X020060Y007874D03* +X020060Y007864D03* +X020060Y007854D03* +X020060Y007844D03* +X020060Y007834D03* +X020060Y007824D03* +X020060Y007814D03* +X020060Y007804D03* +X020060Y007794D03* +X020060Y007784D03* +X020060Y007774D03* +X020060Y007764D03* +X020060Y007754D03* +X020060Y007744D03* +X020060Y007734D03* +X020060Y007724D03* +X020060Y007714D03* +X020060Y007704D03* +X020060Y007694D03* +X020060Y007684D03* +X020060Y007674D03* +X020060Y007664D03* +X020060Y007654D03* +X020060Y007644D03* +X020060Y007634D03* +X020060Y007624D03* +X020060Y007614D03* +X020060Y007604D03* +X020060Y007594D03* +X020060Y007584D03* +X020060Y007574D03* +X020060Y007564D03* +X020060Y007554D03* +X020060Y007544D03* +X020060Y007534D03* +X020060Y007524D03* +X020060Y007514D03* +X020060Y007504D03* +X020060Y007494D03* +X020060Y007484D03* +X020060Y007474D03* +X020060Y007464D03* +X020060Y007454D03* +X020060Y007444D03* +X020060Y007434D03* +X020060Y007424D03* +X020060Y007414D03* +X020060Y007404D03* +X020060Y007394D03* +X020060Y007384D03* +X020060Y007374D03* +X020060Y007364D03* +X020060Y007354D03* +X020060Y007344D03* +X020060Y007334D03* +X020060Y007324D03* +X020060Y007314D03* +X020060Y007304D03* +X020060Y007294D03* +X020060Y007284D03* +X020060Y007274D03* +X020060Y007264D03* +X020060Y007254D03* +X020060Y007244D03* +X020060Y007234D03* +X020060Y007224D03* +X020060Y007214D03* +X020060Y007204D03* +X020060Y007194D03* +X020060Y007184D03* +X020060Y007174D03* +X020060Y007164D03* +X020060Y007154D03* +X020060Y007144D03* +X020060Y007134D03* +X020060Y007124D03* +X020060Y007114D03* +X020060Y007104D03* +X020060Y007094D03* +X020060Y007084D03* +X020060Y007074D03* +X020060Y007064D03* +X020060Y007054D03* +X020060Y007044D03* +X015790Y009504D03* +X015790Y009514D03* +X013290Y009104D03* +X013290Y009094D03* +X013290Y009084D03* +X013290Y009074D03* +X013290Y009064D03* +X013290Y009054D03* +X013290Y009044D03* +X013290Y009034D03* +X013290Y009024D03* +X013290Y009014D03* +X013290Y009004D03* +X013290Y008994D03* +X013290Y008984D03* +X013290Y008974D03* +X013290Y008964D03* +X013290Y008954D03* +X013290Y008944D03* +X013290Y008934D03* +X013290Y008924D03* +X013290Y008914D03* +X013290Y008904D03* +X013290Y008894D03* +X013290Y008884D03* +X013290Y008874D03* +X013290Y008864D03* +X013290Y008854D03* +X013290Y008844D03* +X013290Y008834D03* +X013290Y008824D03* +X013290Y008814D03* +X013290Y008804D03* +X013290Y008794D03* +X013290Y008784D03* +X013290Y008774D03* +X013290Y008764D03* +X013290Y008754D03* +X013290Y008744D03* +X013290Y008734D03* +X013290Y008724D03* +X013290Y008714D03* +X013290Y008704D03* +X013290Y008694D03* +X013290Y008684D03* +X013290Y008674D03* +X013290Y008664D03* +X013290Y008654D03* +X013290Y008644D03* +X013290Y008634D03* +X013290Y008624D03* +X013290Y008614D03* +X013290Y008604D03* +X013290Y008594D03* +X013290Y008584D03* +X013290Y008574D03* +X013290Y008564D03* +X013290Y008134D03* +X013290Y008124D03* +X013290Y008114D03* +X013290Y008104D03* +X013290Y008094D03* +X013290Y008084D03* +X013290Y008074D03* +X013290Y008064D03* +X013290Y008054D03* +X013290Y008044D03* +X013290Y008034D03* +X013290Y008024D03* +X013290Y008014D03* +X013290Y008004D03* +X013290Y007994D03* +X013290Y007984D03* +X013290Y007974D03* +X013290Y007964D03* +X013290Y007954D03* +X013290Y007944D03* +X013290Y007934D03* +X013290Y007924D03* +X013290Y007914D03* +X013290Y007904D03* +X013290Y007894D03* +X013290Y007884D03* +X013290Y007874D03* +X013290Y007864D03* +X013290Y007854D03* +X013290Y007844D03* +X013290Y007834D03* +X013290Y007824D03* +X013290Y007814D03* +X013290Y007804D03* +X013290Y007794D03* +X013290Y007784D03* +X013290Y007774D03* +X013290Y007764D03* +X013290Y007754D03* +X013290Y007744D03* +X013290Y007734D03* +X013290Y007724D03* +X013290Y007714D03* +X013290Y007704D03* +X013290Y007694D03* +X013290Y007684D03* +X013290Y007674D03* +X013290Y007664D03* +X013290Y007654D03* +X013290Y007644D03* +X013290Y007634D03* +X013290Y007624D03* +X013290Y007614D03* +X013290Y007604D03* +X013290Y007594D03* +X013290Y007584D03* +X013290Y007574D03* +X013290Y007564D03* +X013290Y007554D03* +X013290Y007544D03* +X013290Y007534D03* +X013290Y007524D03* +X013290Y007514D03* +X013290Y007504D03* +X013290Y007494D03* +X013290Y007484D03* +X013290Y007474D03* +D19* +X014445Y007444D03* +X014445Y007434D03* +X015665Y009094D03* +X015665Y009104D03* +X017035Y009104D03* +X017035Y007474D03* +X017645Y007044D03* +X018255Y007474D03* +X013255Y012214D03* +X012695Y012654D03* +X019495Y012714D03* +X004865Y010244D03* +X004865Y010234D03* +D20* +X005155Y009974D03* +X005165Y009954D03* +X005175Y009934D03* +X005185Y009924D03* +X005185Y009914D03* +X005195Y009904D03* +X005205Y009884D03* +X004365Y011114D03* +X004355Y011134D03* +X004335Y011164D03* +X004325Y011184D03* +X004315Y011204D03* +X004305Y011214D03* +X004295Y011234D03* +X004285Y011254D03* +X004275Y011264D03* +X004265Y011284D03* +X004255Y011304D03* +X004245Y011314D03* +X004235Y011334D03* +X004225Y011354D03* +X004215Y011364D03* +X004205Y011384D03* +X004195Y011404D03* +X004185Y011414D03* +X004175Y011434D03* +X004165Y011444D03* +X004165Y011454D03* +X004155Y011464D03* +X004155Y011474D03* +X004145Y011484D03* +X004135Y011494D03* +X004135Y011504D03* +X004125Y011514D03* +X004125Y011524D03* +X004115Y011534D03* +X004105Y011544D03* +X004105Y011554D03* +X004095Y011564D03* +X004095Y011574D03* +X004085Y011584D03* +X004075Y011594D03* +X004075Y011604D03* +X004065Y011614D03* +X004065Y011624D03* +X004055Y011634D03* +X004045Y011644D03* +X004045Y011654D03* +X004035Y011664D03* +X004035Y011674D03* +X004025Y011684D03* +X004015Y011704D03* +X004005Y011714D03* +X003995Y011734D03* +X003985Y011754D03* +X003975Y011764D03* +X003965Y011784D03* +X003955Y011804D03* +X003945Y011814D03* +X003935Y011834D03* +X003925Y011854D03* +X003915Y011864D03* +X003905Y011884D03* +X003895Y011904D03* +X003885Y011914D03* +X003875Y011934D03* +X003865Y011954D03* +X003845Y011984D03* +X003815Y012034D03* +X003785Y012084D03* +X003755Y012134D03* +X013375Y011964D03* +X014745Y012674D03* +X014765Y012724D03* +X014775Y012754D03* +X014785Y012774D03* +X014785Y012784D03* +X014795Y012804D03* +X014805Y012824D03* +X014805Y012834D03* +X014815Y012854D03* +X014815Y012864D03* +X014825Y012874D03* +X014825Y012884D03* +X014835Y012904D03* +X014835Y012914D03* +X014845Y012924D03* +X014845Y012934D03* +X014845Y012944D03* +X014855Y012954D03* +X014855Y012964D03* +X014865Y012974D03* +X014865Y012984D03* +X014865Y012994D03* +X014875Y013004D03* +X014875Y013014D03* +X014885Y013034D03* +X014885Y013044D03* +X014895Y013054D03* +X014895Y013064D03* +X014905Y013084D03* +X015625Y012544D03* +X015645Y012494D03* +X015655Y012464D03* +X015665Y012444D03* +X015675Y012414D03* +X015685Y012384D03* +X015695Y012364D03* +X015695Y012354D03* +X015705Y012334D03* +X015715Y012314D03* +X015715Y012304D03* +X015725Y012284D03* +X015725Y012274D03* +X015735Y012264D03* +X015735Y012254D03* +X015735Y012244D03* +X015745Y012234D03* +X015745Y012224D03* +X015755Y012204D03* +X015785Y009494D03* +X016705Y008444D03* +X018585Y008434D03* +X018585Y008424D03* +X018585Y008414D03* +X014325Y007054D03* +X014325Y007044D03* +X019145Y011994D03* +X019145Y012004D03* +X019325Y012794D03* +X019265Y013124D03* +X019265Y013134D03* +D21* +X020015Y013334D03* +X020015Y013344D03* +X020015Y012384D03* +X020015Y011434D03* +X017515Y011434D03* +X017515Y011424D03* +X017515Y011414D03* +X017515Y011404D03* +X017515Y011394D03* +X017515Y011384D03* +X017515Y011374D03* +X017515Y011364D03* +X017515Y011354D03* +X017515Y011344D03* +X017515Y011334D03* +X017515Y011324D03* +X017515Y011314D03* +X017515Y011304D03* +X017515Y011294D03* +X017515Y011284D03* +X017515Y011274D03* +X017515Y011264D03* +X017515Y011254D03* +X017515Y011244D03* +X017515Y011234D03* +X017515Y011224D03* +X017515Y011214D03* +X017515Y011444D03* +X017515Y011454D03* +X017515Y011464D03* +X017515Y011474D03* +X017515Y011484D03* +X017515Y011494D03* +X017515Y011504D03* +X017515Y011514D03* +X017515Y011524D03* +X017515Y011534D03* +X017515Y011544D03* +X017515Y011554D03* +X017515Y011564D03* +X017515Y011574D03* +X017515Y011584D03* +X017515Y011594D03* +X017515Y011604D03* +X017515Y011614D03* +X017515Y011624D03* +X015155Y011974D03* +X017645Y009154D03* +X017645Y007414D03* +X012595Y007414D03* +X012595Y007404D03* +X012595Y007394D03* +X012595Y007384D03* +X012595Y007374D03* +X012595Y007364D03* +X012595Y007354D03* +X012595Y007344D03* +X012595Y007334D03* +X012595Y007324D03* +X012595Y007314D03* +X012595Y007304D03* +X012595Y007294D03* +X012595Y007284D03* +X012595Y007274D03* +X012595Y007264D03* +X012595Y007254D03* +X012595Y007244D03* +X012595Y007234D03* +X012595Y007224D03* +X012595Y007214D03* +X012595Y007204D03* +X012595Y007194D03* +X012595Y007184D03* +X012595Y007174D03* +X012595Y007164D03* +X012595Y007154D03* +X012595Y007144D03* +X012595Y007134D03* +X012595Y007124D03* +X012595Y007114D03* +X012595Y007104D03* +X012595Y007094D03* +X012595Y007084D03* +X012595Y007074D03* +X012595Y007064D03* +X012595Y007054D03* +X012595Y007044D03* +X012595Y007424D03* +X012595Y007434D03* +X012595Y007444D03* +X012595Y007454D03* +X012595Y007464D03* +D22* +X014475Y007534D03* +X014475Y007544D03* +X015635Y009004D03* +X017085Y009124D03* +X018205Y009124D03* +X018215Y007454D03* +X017645Y007054D03* +X013225Y012274D03* +X012705Y012614D03* +X015155Y013344D03* +X004865Y010194D03* +X004865Y010184D03* +D23* +X004865Y010144D03* +X013195Y012334D03* +X017115Y009134D03* +X018165Y009134D03* +X015605Y008904D03* +X014505Y007634D03* +X017645Y007064D03* +D24* +X016730Y007964D03* +X016720Y008004D03* +X016720Y008014D03* +X016720Y008024D03* +X016720Y008034D03* +X016710Y008064D03* +X016710Y008074D03* +X016710Y008084D03* +X016710Y008094D03* +X016710Y008104D03* +X016710Y008114D03* +X016710Y008124D03* +X016700Y008144D03* +X016700Y008154D03* +X016700Y008164D03* +X016700Y008174D03* +X016700Y008184D03* +X016700Y008194D03* +X016700Y008204D03* +X016700Y008214D03* +X016700Y008224D03* +X016700Y008234D03* +X016700Y008244D03* +X016700Y008254D03* +X016700Y008264D03* +X016700Y008274D03* +X016700Y008284D03* +X016700Y008294D03* +X016700Y008304D03* +X016700Y008314D03* +X016700Y008324D03* +X016700Y008334D03* +X016700Y008344D03* +X016700Y008354D03* +X016700Y008364D03* +X016700Y008374D03* +X016700Y008384D03* +X016700Y008394D03* +X016700Y008404D03* +X016700Y008414D03* +X016700Y008424D03* +X016700Y008434D03* +X016710Y008454D03* +X016710Y008464D03* +X016710Y008474D03* +X016710Y008484D03* +X016710Y008494D03* +X016710Y008504D03* +X016710Y008514D03* +X016710Y008524D03* +X016720Y008534D03* +X016720Y008544D03* +X016720Y008554D03* +X016720Y008564D03* +X016720Y008574D03* +X016720Y008584D03* +X016730Y008604D03* +X016730Y008614D03* +X016730Y008624D03* +X016740Y008654D03* +X016740Y008664D03* +X015780Y009474D03* +X015780Y009484D03* +X017650Y009554D03* +X018550Y008654D03* +X018560Y008614D03* +X018560Y008604D03* +X018570Y008574D03* +X018570Y008564D03* +X018570Y008554D03* +X018570Y008544D03* +X018570Y008534D03* +X018580Y008514D03* +X018580Y008504D03* +X018580Y008494D03* +X018580Y008484D03* +X018580Y008474D03* +X018580Y008464D03* +X018580Y008454D03* +X018580Y008444D03* +X018590Y008404D03* +X018590Y008394D03* +X018590Y008384D03* +X018590Y008374D03* +X018590Y008364D03* +X018590Y008354D03* +X018590Y008344D03* +X018590Y008334D03* +X018590Y008324D03* +X018590Y008314D03* +X018590Y008304D03* +X018590Y008294D03* +X018590Y008284D03* +X018590Y008274D03* +X018590Y008264D03* +X018590Y008254D03* +X018590Y008244D03* +X018590Y008234D03* +X018590Y008224D03* +X018590Y008214D03* +X018590Y008204D03* +X018590Y008194D03* +X018590Y008184D03* +X018590Y008174D03* +X018590Y008164D03* +X018590Y008154D03* +X018590Y008144D03* +X018580Y008134D03* +X018580Y008124D03* +X018580Y008114D03* +X018580Y008104D03* +X018580Y008094D03* +X018580Y008084D03* +X018580Y008074D03* +X018580Y008064D03* +X018570Y008034D03* +X018570Y008024D03* +X018570Y008014D03* +X018570Y008004D03* +X018560Y007964D03* +X014330Y007074D03* +X014330Y007064D03* +X016060Y011394D03* +X016040Y011444D03* +X016030Y011474D03* +X016020Y011504D03* +X016010Y011524D03* +X016000Y011554D03* +X015990Y011574D03* +X015990Y011584D03* +X015980Y011604D03* +X015980Y011614D03* +X015970Y011624D03* +X015970Y011634D03* +X015960Y011654D03* +X015960Y011664D03* +X015950Y011684D03* +X015950Y011694D03* +X015940Y011704D03* +X015940Y011714D03* +X015940Y011724D03* +X015930Y011734D03* +X015930Y011744D03* +X015920Y011754D03* +X015920Y011764D03* +X014610Y012324D03* +X014630Y012374D03* +X014640Y012404D03* +X014650Y012424D03* +X014650Y012434D03* +X014660Y012454D03* +X014670Y012474D03* +X014670Y012484D03* +X014680Y012504D03* +X014680Y012514D03* +X014690Y012524D03* +X014690Y012534D03* +X014700Y012554D03* +X014700Y012564D03* +X014710Y012574D03* +X014710Y012584D03* +X014710Y012594D03* +X014720Y012604D03* +X014720Y012614D03* +X014730Y012624D03* +X014730Y012634D03* +X014730Y012644D03* +X014740Y012654D03* +X014740Y012664D03* +X014750Y012684D03* +X014750Y012694D03* +X014760Y012704D03* +X014760Y012714D03* +X014770Y012734D03* +X014770Y012744D03* +X014780Y012764D03* +X014790Y012794D03* +X014800Y012814D03* +X014810Y012844D03* +X014830Y012894D03* +X013370Y011974D03* +X019140Y011974D03* +X019140Y011964D03* +X019140Y011954D03* +X019140Y011944D03* +X019140Y011934D03* +X019140Y011924D03* +X019140Y011914D03* +X019140Y011904D03* +X019140Y011894D03* +X019150Y011884D03* +X019150Y011874D03* +X019150Y011864D03* +X019150Y011854D03* +X019140Y011984D03* +X019150Y012014D03* +X019150Y012024D03* +X019150Y012034D03* +X019150Y012044D03* +X019150Y012054D03* +X019160Y012074D03* +X019160Y012084D03* +X019340Y012784D03* +X019270Y013144D03* +X019270Y013154D03* +X005430Y009514D03* +X005300Y009724D03* +X005280Y009754D03* +X005270Y009774D03* +X005260Y009794D03* +X005250Y009804D03* +X005240Y009824D03* +X005230Y009834D03* +X005230Y009844D03* +X005220Y009854D03* +X005220Y009864D03* +X005210Y009874D03* +X005200Y009894D03* +X004600Y009984D03* +X004600Y009994D03* +X004590Y009974D03* +X004580Y009954D03* +X004570Y009934D03* +X005130Y010734D03* +X005140Y010754D03* +X004020Y011694D03* +X004000Y011724D03* +X003990Y011744D03* +X003970Y011774D03* +X003960Y011794D03* +X003940Y011824D03* +X003930Y011844D03* +X003910Y011874D03* +X003900Y011894D03* +X003880Y011924D03* +X003870Y011944D03* +X003860Y011964D03* +X003850Y011974D03* +X003840Y011994D03* +X003830Y012004D03* +X003830Y012014D03* +X003820Y012024D03* +X003810Y012044D03* +X003800Y012054D03* +X003800Y012064D03* +X003790Y012074D03* +X003780Y012094D03* +X003770Y012104D03* +X003770Y012114D03* +X003760Y012124D03* +X003750Y012144D03* +X003740Y012154D03* +X003740Y012164D03* +X003730Y012174D03* +X003730Y012184D03* +X003720Y012194D03* +X003710Y012204D03* +X003710Y012214D03* +X003700Y012224D03* +X003700Y012234D03* +X003690Y012244D03* +X003680Y012254D03* +X003680Y012264D03* +X003670Y012274D03* +X003670Y012284D03* +X003660Y012294D03* +X003650Y012304D03* +X003650Y012314D03* +X003640Y012324D03* +X003630Y012344D03* +X003620Y012354D03* +X003620Y012364D03* +X003610Y012374D03* +X003600Y012394D03* +X003590Y012404D03* +X003590Y012414D03* +X003580Y012424D03* +X003570Y012444D03* +X003560Y012464D03* +X003550Y012474D03* +X003540Y012494D03* +X003530Y012514D03* +X003520Y012524D03* +X003510Y012544D03* +X003500Y012564D03* +X003490Y012574D03* +X003480Y012594D03* +X003460Y012624D03* +X003450Y012644D03* +X003420Y012694D03* +X003390Y012744D03* +X003360Y012794D03* +X003330Y012844D03* +X003300Y012894D03* +D25* +X004865Y010094D03* +X014535Y007734D03* +X014535Y007724D03* +X015575Y008804D03* +X015575Y008814D03* +X017645Y007074D03* +X015155Y013194D03* +D26* +X015155Y013114D03* +X015545Y008714D03* +X015545Y008704D03* +X014565Y007834D03* +X014565Y007824D03* +X017645Y007084D03* +X004865Y010044D03* +D27* +X004585Y009964D03* +X004575Y009944D03* +X004565Y009924D03* +X004555Y009914D03* +X004555Y009904D03* +X004545Y009884D03* +X005245Y009814D03* +X005265Y009784D03* +X005275Y009764D03* +X005285Y009744D03* +X005295Y009734D03* +X005305Y009714D03* +X005315Y009704D03* +X005315Y009694D03* +X005325Y009684D03* +X005325Y009674D03* +X005335Y009664D03* +X005345Y009654D03* +X005345Y009644D03* +X005355Y009634D03* +X005365Y009624D03* +X005365Y009614D03* +X005375Y009604D03* +X005375Y009594D03* +X005385Y009584D03* +X005395Y009574D03* +X005395Y009564D03* +X005405Y009554D03* +X005415Y009544D03* +X005415Y009534D03* +X005425Y009524D03* +X005435Y009504D03* +X005445Y009494D03* +X005445Y009484D03* +X005455Y009474D03* +X005465Y009464D03* +X005465Y009454D03* +X005475Y009444D03* +X005475Y009434D03* +X005485Y009424D03* +X005495Y009414D03* +X005495Y009404D03* +X005505Y009394D03* +X005515Y009384D03* +X005515Y009374D03* +X005525Y009364D03* +X005525Y009354D03* +X005535Y009344D03* +X005545Y009334D03* +X005545Y009324D03* +X005555Y009314D03* +X005565Y009294D03* +X005575Y009284D03* +X005575Y009274D03* +X005585Y009264D03* +X005595Y009244D03* +X005605Y009234D03* +X005615Y009214D03* +X005625Y009204D03* +X005625Y009194D03* +X005635Y009184D03* +X005645Y009164D03* +X005655Y009154D03* +X005665Y009134D03* +X005675Y009114D03* +X005685Y009104D03* +X005695Y009084D03* +X005705Y009074D03* +X005715Y009054D03* +X005725Y009034D03* +X005735Y009024D03* +X005745Y009004D03* +X005765Y008974D03* +X005785Y008944D03* +X005795Y008924D03* +X005815Y008894D03* +X005845Y008844D03* +X005865Y008814D03* +X005895Y008764D03* +X005125Y010724D03* +X005135Y010744D03* +X005145Y010764D03* +X005155Y010774D03* +X005155Y010784D03* +X005165Y010794D03* +X005165Y010804D03* +X005175Y010814D03* +X005185Y010834D03* +X005195Y010854D03* +X003635Y012334D03* +X003605Y012384D03* +X003575Y012434D03* +X003565Y012454D03* +X003545Y012484D03* +X003535Y012504D03* +X003515Y012534D03* +X003505Y012554D03* +X003485Y012584D03* +X003475Y012604D03* +X003465Y012614D03* +X003455Y012634D03* +X003445Y012654D03* +X003435Y012664D03* +X003435Y012674D03* +X003425Y012684D03* +X003415Y012704D03* +X003405Y012714D03* +X003405Y012724D03* +X003395Y012734D03* +X003385Y012754D03* +X003375Y012764D03* +X003375Y012774D03* +X003365Y012784D03* +X003355Y012804D03* +X003345Y012814D03* +X003345Y012824D03* +X003335Y012834D03* +X003325Y012854D03* +X003315Y012864D03* +X003315Y012874D03* +X003305Y012884D03* +X003295Y012904D03* +X003285Y012914D03* +X003285Y012924D03* +X003275Y012934D03* +X003265Y012954D03* +X003255Y012964D03* +X003255Y012974D03* +X003245Y012984D03* +X003235Y013004D03* +X003225Y013014D03* +X003225Y013024D03* +X003215Y013034D03* +X003205Y013054D03* +X003195Y013064D03* +X003195Y013074D03* +X003185Y013084D03* +X003175Y013104D03* +X003165Y013114D03* +X003165Y013124D03* +X003155Y013134D03* +X003145Y013154D03* +X003135Y013174D03* +X003125Y013184D03* +X003115Y013204D03* +X003095Y013234D03* +X003085Y013254D03* +X003065Y013284D03* +X003055Y013304D03* +X003035Y013334D03* +X003025Y013354D03* +X003005Y013384D03* +X002995Y013404D03* +X002965Y013454D03* +X002935Y013504D03* +X013365Y011984D03* +X014375Y011724D03* +X014565Y012204D03* +X014565Y012214D03* +X014575Y012224D03* +X014575Y012234D03* +X014575Y012244D03* +X014585Y012254D03* +X014585Y012264D03* +X014595Y012274D03* +X014595Y012284D03* +X014595Y012294D03* +X014605Y012304D03* +X014605Y012314D03* +X014615Y012334D03* +X014615Y012344D03* +X014625Y012354D03* +X014625Y012364D03* +X014635Y012384D03* +X014635Y012394D03* +X014645Y012414D03* +X014655Y012444D03* +X014665Y012464D03* +X014675Y012494D03* +X014695Y012544D03* +X015955Y011674D03* +X015965Y011644D03* +X015985Y011594D03* +X015995Y011564D03* +X016005Y011544D03* +X016005Y011534D03* +X016015Y011514D03* +X016025Y011494D03* +X016025Y011484D03* +X016035Y011464D03* +X016035Y011454D03* +X016045Y011434D03* +X016045Y011424D03* +X016055Y011414D03* +X016055Y011404D03* +X016065Y011384D03* +X016065Y011374D03* +X016075Y011364D03* +X016075Y011354D03* +X016075Y011344D03* +X016085Y011334D03* +X016085Y011324D03* +X016095Y011304D03* +X016095Y011294D03* +X016105Y011284D03* +X016105Y011274D03* +X016105Y011264D03* +X016115Y011254D03* +X016115Y011244D03* +X016125Y011224D03* +X016125Y011214D03* +X015775Y009464D03* +X015775Y009454D03* +X016765Y008744D03* +X016755Y008724D03* +X016755Y008714D03* +X016755Y008704D03* +X016745Y008694D03* +X016745Y008684D03* +X016745Y008674D03* +X016735Y008644D03* +X016735Y008634D03* +X016725Y008594D03* +X016705Y008134D03* +X016715Y008054D03* +X016715Y008044D03* +X016725Y007994D03* +X016725Y007984D03* +X016725Y007974D03* +X016735Y007954D03* +X016735Y007944D03* +X016735Y007934D03* +X016735Y007924D03* +X016745Y007914D03* +X016745Y007904D03* +X016745Y007894D03* +X016755Y007864D03* +X018545Y007904D03* +X018545Y007914D03* +X018555Y007924D03* +X018555Y007934D03* +X018555Y007944D03* +X018555Y007954D03* +X018565Y007974D03* +X018565Y007984D03* +X018565Y007994D03* +X018575Y008044D03* +X018575Y008054D03* +X018575Y008524D03* +X018565Y008584D03* +X018565Y008594D03* +X018555Y008624D03* +X018555Y008634D03* +X018555Y008644D03* +X018545Y008664D03* +X018545Y008674D03* +X018545Y008684D03* +X018535Y008704D03* +X018535Y008714D03* +X018525Y008744D03* +X019155Y011824D03* +X019155Y011834D03* +X019155Y011844D03* +X019155Y012064D03* +X019165Y012094D03* +X019165Y012104D03* +X019175Y012114D03* +X019175Y012124D03* +X019345Y012774D03* +X019275Y013164D03* +X014335Y007084D03* +D28* +X017640Y007094D03* +X004870Y010004D03* +D29* +X004550Y009894D03* +X004540Y009874D03* +X004530Y009864D03* +X004530Y009854D03* +X004520Y009844D03* +X004520Y009834D03* +X004510Y009824D03* +X004500Y009804D03* +X004470Y009754D03* +X005560Y009304D03* +X005590Y009254D03* +X005610Y009224D03* +X005640Y009174D03* +X005660Y009144D03* +X005670Y009124D03* +X005690Y009094D03* +X005710Y009064D03* +X005720Y009044D03* +X005740Y009014D03* +X005750Y008994D03* +X005760Y008984D03* +X005770Y008964D03* +X005780Y008954D03* +X005790Y008934D03* +X005800Y008914D03* +X005810Y008904D03* +X005820Y008884D03* +X005830Y008874D03* +X005830Y008864D03* +X005840Y008854D03* +X005850Y008834D03* +X005860Y008824D03* +X005870Y008804D03* +X005880Y008794D03* +X005880Y008784D03* +X005890Y008774D03* +X005900Y008754D03* +X005910Y008744D03* +X005910Y008734D03* +X005920Y008724D03* +X005930Y008714D03* +X005930Y008704D03* +X005940Y008694D03* +X005940Y008684D03* +X005950Y008674D03* +X005960Y008664D03* +X005960Y008654D03* +X005970Y008644D03* +X005980Y008634D03* +X005980Y008624D03* +X005990Y008614D03* +X005990Y008604D03* +X006000Y008594D03* +X006010Y008584D03* +X006010Y008574D03* +X006020Y008564D03* +X006030Y008544D03* +X006040Y008534D03* +X006040Y008524D03* +X006050Y008514D03* +X006060Y008504D03* +X006060Y008494D03* +X006070Y008484D03* +X006080Y008464D03* +X006090Y008454D03* +X006090Y008444D03* +X006100Y008434D03* +X006110Y008414D03* +X006120Y008404D03* +X006130Y008384D03* +X006140Y008374D03* +X006140Y008364D03* +X006150Y008354D03* +X006160Y008334D03* +X006170Y008324D03* +X006180Y008304D03* +X006190Y008284D03* +X006200Y008274D03* +X006210Y008254D03* +X006220Y008244D03* +X006230Y008224D03* +X006240Y008204D03* +X006250Y008194D03* +X006260Y008174D03* +X006280Y008144D03* +X006300Y008114D03* +X006310Y008094D03* +X006330Y008064D03* +X006360Y008014D03* +X006410Y007934D03* +X005180Y010824D03* +X005190Y010844D03* +X005200Y010864D03* +X005210Y010874D03* +X005210Y010884D03* +X005220Y010894D03* +X005220Y010904D03* +X005230Y010914D03* +X005240Y010934D03* +X005250Y010954D03* +X005260Y010964D03* +X005270Y010984D03* +X005280Y011004D03* +X003270Y012944D03* +X003240Y012994D03* +X003210Y013044D03* +X003180Y013094D03* +X003150Y013144D03* +X003140Y013164D03* +X003120Y013194D03* +X003110Y013214D03* +X003100Y013224D03* +X003090Y013244D03* +X003080Y013264D03* +X003070Y013274D03* +X003060Y013294D03* +X003050Y013314D03* +X003040Y013324D03* +X003030Y013344D03* +X003020Y013364D03* +X003010Y013374D03* +X003000Y013394D03* +X002990Y013414D03* +X002980Y013424D03* +X002980Y013434D03* +X002970Y013444D03* +X002960Y013464D03* +X002950Y013474D03* +X002950Y013484D03* +X002940Y013494D03* +X002930Y013514D03* +X002920Y013524D03* +X002920Y013534D03* +X002910Y013544D03* +X002900Y013554D03* +X002900Y013564D03* +X002890Y013574D03* +X002890Y013584D03* +X002880Y013594D03* +X002870Y013604D03* +X002870Y013614D03* +X002860Y013624D03* +X002860Y013634D03* +X002850Y013644D03* +X002840Y013654D03* +X002840Y013664D03* +X002830Y013674D03* +X002830Y013684D03* +X013360Y011994D03* +X014320Y011594D03* +X014320Y011584D03* +X014320Y011574D03* +X014310Y011564D03* +X014310Y011554D03* +X014300Y011534D03* +X014300Y011524D03* +X014290Y011514D03* +X014290Y011504D03* +X014280Y011484D03* +X014280Y011474D03* +X014270Y011454D03* +X014260Y011434D03* +X014260Y011424D03* +X014250Y011404D03* +X014240Y011384D03* +X014240Y011374D03* +X014230Y011354D03* +X014220Y011324D03* +X014210Y011304D03* +X014200Y011274D03* +X014190Y011254D03* +X014180Y011224D03* +X014330Y011604D03* +X014330Y011614D03* +X014340Y011624D03* +X014340Y011634D03* +X014340Y011644D03* +X014350Y011654D03* +X014350Y011664D03* +X014360Y011674D03* +X014360Y011684D03* +X014360Y011694D03* +X014370Y011704D03* +X014370Y011714D03* +X014380Y011734D03* +X014380Y011744D03* +X014390Y011754D03* +X014390Y011764D03* +X016090Y011314D03* +X016120Y011234D03* +X015770Y009444D03* +X016790Y008804D03* +X016780Y008784D03* +X016780Y008774D03* +X016770Y008764D03* +X016770Y008754D03* +X016760Y008734D03* +X016750Y007884D03* +X016750Y007874D03* +X016760Y007854D03* +X016760Y007844D03* +X016770Y007824D03* +X016780Y007794D03* +X018520Y007824D03* +X018530Y007844D03* +X018530Y007854D03* +X018530Y007864D03* +X018540Y007874D03* +X018540Y007884D03* +X018540Y007894D03* +X018540Y008694D03* +X018530Y008724D03* +X018530Y008734D03* +X018520Y008754D03* +X018520Y008764D03* +X018510Y008784D03* +X019170Y011784D03* +X019170Y011794D03* +X019160Y011804D03* +X019160Y011814D03* +X019180Y012134D03* +X019190Y012144D03* +X019360Y012764D03* +X019280Y013174D03* +X019290Y013184D03* +X015160Y013684D03* +X015160Y013694D03* +X014340Y007104D03* +X014340Y007094D03* +D30* +X017645Y007104D03* +D31* +X017645Y007114D03* +D32* +X017645Y007124D03* +D33* +X017645Y007134D03* +D34* +X017645Y007144D03* +D35* +X017645Y007154D03* +D36* +X017645Y007164D03* +D37* +X016840Y007674D03* +X016830Y007694D03* +X016840Y008904D03* +X016850Y008924D03* +X016860Y008934D03* +X015750Y009374D03* +X015750Y009384D03* +X014360Y007164D03* +X018450Y007674D03* +X018460Y007694D03* +X018450Y008904D03* +X018440Y008914D03* +X018440Y008924D03* +X018430Y008934D03* +X019200Y011724D03* +X019230Y012204D03* +X019240Y012214D03* +X015160Y013634D03* +X015160Y013644D03* +X013340Y012034D03* +X012420Y012354D03* +X012420Y012364D03* +X012410Y012344D03* +X012410Y012334D03* +X012400Y012324D03* +X012390Y012314D03* +X012390Y012304D03* +X012380Y012294D03* +X012370Y012274D03* +X012360Y012264D03* +X012350Y012244D03* +D38* +X012955Y012584D03* +X012955Y012594D03* +X017645Y007174D03* +D39* +X016855Y007654D03* +X016845Y007664D03* +X016865Y008944D03* +X015745Y009364D03* +X014365Y007184D03* +X014365Y007174D03* +X018435Y007654D03* +X018445Y007664D03* +X018455Y007684D03* +X018425Y008944D03* +X018415Y008954D03* +X019215Y011714D03* +X019405Y012734D03* +X019315Y013224D03* +X019325Y013234D03* +X015165Y013624D03* +X013335Y012044D03* +X012375Y012284D03* +X012355Y012254D03* +X012345Y012234D03* +X012335Y012224D03* +X012335Y012214D03* +X012325Y012204D03* +X012315Y012194D03* +X012315Y012184D03* +X012305Y012174D03* +X012295Y012154D03* +X012285Y012144D03* +X012285Y012134D03* +X012275Y012124D03* +X012265Y012104D03* +X012245Y012074D03* +D40* +X012935Y012524D03* +X017645Y007184D03* +D41* +X017645Y007194D03* +X012925Y012494D03* +D42* +X013330Y012054D03* +X012300Y012164D03* +X012270Y012114D03* +X012260Y012094D03* +X012250Y012084D03* +X012240Y012064D03* +X012230Y012054D03* +X012230Y012044D03* +X012220Y012034D03* +X012210Y012024D03* +X012210Y012014D03* +X012200Y012004D03* +X012190Y011984D03* +X012180Y011974D03* +X012170Y011954D03* +X012160Y011934D03* +X012140Y011904D03* +X015160Y013604D03* +X015160Y013614D03* +X019250Y012224D03* +X019260Y012234D03* +X019220Y011704D03* +X018400Y008974D03* +X018410Y008964D03* +X018430Y007644D03* +X018420Y007634D03* +X016870Y007634D03* +X016860Y007644D03* +X016870Y008954D03* +X016880Y008964D03* +X016890Y008974D03* +X015740Y009344D03* +X015740Y009354D03* +X014370Y007204D03* +X014370Y007194D03* +X004870Y010364D03* +D43* +X012905Y012434D03* +X017645Y007204D03* +X020235Y011224D03* +D44* +X017645Y007214D03* +X012895Y012404D03* +D45* +X013325Y012064D03* +X012195Y011994D03* +X012175Y011964D03* +X012165Y011944D03* +X012155Y011924D03* +X012145Y011914D03* +X012135Y011894D03* +X012125Y011884D03* +X012125Y011874D03* +X012115Y011864D03* +X012105Y011854D03* +X012105Y011844D03* +X012095Y011834D03* +X012085Y011814D03* +X012065Y011784D03* +X012035Y011734D03* +X015735Y009334D03* +X015735Y009324D03* +X016895Y008984D03* +X016905Y008994D03* +X016875Y007624D03* +X016885Y007614D03* +X018415Y007624D03* +X014375Y007214D03* +X019225Y011694D03* +X019335Y013244D03* +X004865Y010354D03* +D46* +X012885Y012374D03* +X017645Y007224D03* +D47* +X016900Y007594D03* +X016890Y007604D03* +X018390Y007594D03* +X018400Y007604D03* +X018410Y007614D03* +X018390Y008984D03* +X018380Y008994D03* +X017650Y009544D03* +X015730Y009314D03* +X014380Y007234D03* +X014380Y007224D03* +X011960Y011614D03* +X011980Y011644D03* +X011990Y011664D03* +X012000Y011674D03* +X012010Y011694D03* +X012020Y011704D03* +X012020Y011714D03* +X012030Y011724D03* +X012040Y011744D03* +X012050Y011754D03* +X012050Y011764D03* +X012060Y011774D03* +X012070Y011794D03* +X012080Y011804D03* +X012090Y011824D03* +X013320Y012074D03* +X015160Y013584D03* +X015160Y013594D03* +X019430Y012724D03* +X004870Y010384D03* +X004870Y010374D03* +X004860Y010344D03* +D48* +X017645Y007234D03* +D49* +X017645Y007244D03* +D50* +X016915Y007574D03* +X016905Y007584D03* +X018375Y007574D03* +X018385Y007584D03* +X018375Y009004D03* +X018365Y009014D03* +X016925Y009014D03* +X016915Y009004D03* +X015725Y009294D03* +X015725Y009304D03* +X014385Y007244D03* +X011855Y011444D03* +X011875Y011474D03* +X011885Y011494D03* +X011895Y011504D03* +X011905Y011524D03* +X011915Y011534D03* +X011915Y011544D03* +X011925Y011554D03* +X011925Y011564D03* +X011935Y011574D03* +X011945Y011584D03* +X011945Y011594D03* +X011955Y011604D03* +X011965Y011624D03* +X011975Y011634D03* +X011985Y011654D03* +X012005Y011684D03* +X013315Y012084D03* +X012655Y012764D03* +X012645Y012774D03* +X012635Y012784D03* +X012625Y012794D03* +X012615Y012804D03* +X015165Y013574D03* +X019275Y012244D03* +X019235Y011684D03* +X004865Y010334D03* +D51* +X017645Y007254D03* +X020175Y013634D03* +D52* +X019350Y013254D03* +X019290Y012254D03* +X019250Y011674D03* +X016930Y009024D03* +X015720Y009274D03* +X015720Y009284D03* +X016920Y007564D03* +X016930Y007554D03* +X014390Y007264D03* +X014390Y007254D03* +X011770Y011304D03* +X011780Y011324D03* +X011790Y011334D03* +X011800Y011354D03* +X011810Y011374D03* +X011820Y011384D03* +X011830Y011404D03* +X011840Y011414D03* +X011840Y011424D03* +X011850Y011434D03* +X011860Y011454D03* +X011870Y011464D03* +X011880Y011484D03* +X011900Y011514D03* +X013310Y012094D03* +X012690Y012724D03* +X012680Y012734D03* +X012670Y012744D03* +X012660Y012754D03* +X012610Y012814D03* +X012600Y012824D03* +X012590Y012834D03* +X012580Y012844D03* +X012570Y012854D03* +X012560Y012864D03* +X012550Y012874D03* +X012540Y012884D03* +X012530Y012894D03* +X012520Y012904D03* +X012510Y012914D03* +X012500Y012924D03* +X015160Y013554D03* +X015160Y013564D03* +X004870Y010404D03* +X004870Y010394D03* +D53* +X017645Y009314D03* +X017645Y007264D03* +X020165Y013624D03* +D54* +X020145Y013604D03* +X020145Y011264D03* +X017645Y009294D03* +X017645Y007274D03* +D55* +X018355Y007554D03* +X018365Y007564D03* +X018355Y009024D03* +X018345Y009034D03* +X016945Y009034D03* +X015715Y009264D03* +X014395Y007284D03* +X014395Y007274D03* +X011715Y011214D03* +X011725Y011234D03* +X011735Y011244D03* +X011735Y011254D03* +X011745Y011264D03* +X011755Y011274D03* +X011755Y011284D03* +X011765Y011294D03* +X011775Y011314D03* +X011795Y011344D03* +X011805Y011364D03* +X011825Y011394D03* +X013305Y012104D03* +X012495Y012934D03* +X012485Y012944D03* +X012475Y012954D03* +X012465Y012964D03* +X012455Y012974D03* +X012445Y012984D03* +X012435Y012994D03* +X012425Y013004D03* +X012415Y013014D03* +X012405Y013024D03* +X012395Y013034D03* +X012385Y013044D03* +X012375Y013054D03* +X012375Y013064D03* +X012365Y013074D03* +X012355Y013084D03* +X012345Y013094D03* +X012335Y013104D03* +X012325Y013114D03* +X012315Y013124D03* +X012305Y013134D03* +X012295Y013144D03* +X012285Y013154D03* +X012275Y013164D03* +X012265Y013174D03* +X004865Y010324D03* +X004865Y010314D03* +D56* +X017645Y009284D03* +X017645Y007284D03* +X020135Y011274D03* +X020135Y013594D03* +D57* +X020125Y013584D03* +X020125Y012564D03* +X017645Y009274D03* +X017645Y007294D03* +D58* +X017645Y007304D03* +X017645Y009264D03* +X020115Y012504D03* +X020115Y012574D03* +D59* +X019375Y013264D03* +X019265Y011664D03* +X018325Y009054D03* +X016965Y009054D03* +X015705Y009224D03* +X015705Y009234D03* +X014405Y007314D03* +X014405Y007304D03* +X018335Y007534D03* +X018345Y007544D03* +X013295Y012124D03* +X012695Y012704D03* +X012145Y013304D03* +X012135Y013314D03* +X012125Y013324D03* +X012115Y013334D03* +X012105Y013344D03* +X012095Y013354D03* +X012035Y013424D03* +X012025Y013434D03* +X012015Y013444D03* +X012005Y013454D03* +X011995Y013464D03* +X011985Y013474D03* +X011975Y013484D03* +X011965Y013494D03* +X011955Y013504D03* +X011945Y013514D03* +X011935Y013524D03* +X011925Y013534D03* +X011915Y013544D03* +X011805Y013664D03* +X004865Y010304D03* +D60* +X017645Y009254D03* +X017645Y007314D03* +X020105Y013554D03* +D61* +X020095Y013544D03* +X020095Y012604D03* +X017645Y009244D03* +X017645Y007324D03* +X015155Y012174D03* +X015155Y012184D03* +D62* +X015160Y013504D03* +X015160Y013514D03* +X013290Y012134D03* +X011910Y013554D03* +X011900Y013564D03* +X011890Y013574D03* +X011880Y013584D03* +X011870Y013594D03* +X011860Y013604D03* +X011850Y013614D03* +X011840Y013624D03* +X011830Y013634D03* +X011820Y013644D03* +X011810Y013654D03* +X011800Y013674D03* +X011790Y013684D03* +X011780Y013694D03* +X015700Y009214D03* +X016980Y009064D03* +X018310Y009064D03* +X016960Y007524D03* +X014410Y007334D03* +X014410Y007324D03* +X019310Y012264D03* +X004870Y010434D03* +X004870Y010424D03* +D63* +X012665Y008554D03* +X012665Y008544D03* +X012665Y008534D03* +X012665Y008524D03* +X012665Y008514D03* +X012665Y008504D03* +X012665Y008494D03* +X012665Y008484D03* +X012665Y008474D03* +X012665Y008464D03* +X012665Y008454D03* +X012665Y008444D03* +X012665Y008434D03* +X012665Y008424D03* +X012665Y008414D03* +X012665Y008404D03* +X012665Y008394D03* +X012665Y008384D03* +X012665Y008374D03* +X012665Y008364D03* +X012665Y008354D03* +X012665Y008344D03* +X012665Y008334D03* +X012665Y008324D03* +X012665Y008314D03* +X012665Y008304D03* +X012665Y008294D03* +X012665Y008284D03* +X012665Y008274D03* +X012665Y008264D03* +X012665Y008254D03* +X012665Y008244D03* +X012665Y008234D03* +X012665Y008224D03* +X012665Y008214D03* +X012665Y008204D03* +X012665Y008194D03* +X012665Y008184D03* +X012665Y008174D03* +X012665Y008164D03* +X012665Y008154D03* +X012665Y008144D03* +X017645Y007334D03* +X017645Y009234D03* +X020085Y011324D03* +X020085Y012474D03* +X020085Y013524D03* +X017585Y012724D03* +X017585Y012714D03* +X017585Y012704D03* +X017585Y012694D03* +X017585Y012684D03* +X017585Y012674D03* +X017585Y012664D03* +X017585Y012654D03* +X017585Y012644D03* +X017585Y012634D03* +X017585Y012624D03* +X017585Y012614D03* +X017585Y012604D03* +X017585Y012594D03* +X017585Y012584D03* +X017585Y012574D03* +X017585Y012564D03* +X017585Y012554D03* +X017585Y012544D03* +X017585Y012534D03* +X017585Y012524D03* +X017585Y012514D03* +X017585Y012504D03* +X017585Y012494D03* +X017585Y012484D03* +X017585Y012474D03* +X017585Y012464D03* +X017585Y012454D03* +X017585Y012444D03* +X017585Y012434D03* +X017585Y012424D03* +X017585Y012414D03* +X017585Y012404D03* +X017585Y012394D03* +X017585Y012384D03* +X017585Y012374D03* +X017585Y012364D03* +X017585Y012354D03* +X017585Y012344D03* +X017585Y012334D03* +X017585Y012324D03* +X017585Y012314D03* +X017585Y012304D03* +X015155Y012154D03* +D64* +X015155Y012134D03* +X015155Y012124D03* +X017645Y009224D03* +X017645Y007344D03* +X020075Y011334D03* +X020075Y012464D03* +X020075Y012634D03* +X020075Y013504D03* +D65* +X019285Y011654D03* +X015695Y009204D03* +X015695Y009194D03* +X016975Y007514D03* +X018315Y007514D03* +X018325Y007524D03* +X014415Y007344D03* +X013285Y012144D03* +X012695Y012694D03* +X004865Y010294D03* +X004865Y010284D03* +D66* +X015155Y012104D03* +X017645Y009214D03* +X017645Y007354D03* +X020065Y011344D03* +X020065Y012454D03* +X020065Y012654D03* +X020065Y013484D03* +D67* +X015160Y013484D03* +X015160Y013474D03* +X015160Y013494D03* +X013280Y012154D03* +X012690Y012684D03* +X015690Y009184D03* +X016990Y009074D03* +X017650Y009534D03* +X018300Y009074D03* +X018300Y007504D03* +X016990Y007504D03* +X014420Y007364D03* +X014420Y007354D03* +X004870Y010444D03* +X004870Y010454D03* +D68* +X015155Y012074D03* +X015155Y012084D03* +X017645Y009204D03* +X017645Y007374D03* +X017645Y007364D03* +X020055Y011364D03* +X020055Y012444D03* +X020055Y012674D03* +X020055Y013464D03* +D69* +X015685Y009174D03* +X015685Y009164D03* +X017005Y009084D03* +X018285Y009084D03* +X014425Y007374D03* +X013275Y012164D03* +X013275Y012174D03* +X012695Y012674D03* +X004865Y010274D03* +X004865Y010264D03* +D70* +X015155Y012054D03* +X017645Y009194D03* +X017645Y007384D03* +X020045Y012424D03* +X020045Y012704D03* +X020045Y013434D03* +D71* +X015160Y013454D03* +X015160Y013464D03* +X013270Y012184D03* +X015680Y009154D03* +X015680Y009144D03* +X017020Y009094D03* +X017000Y007494D03* +X018290Y007494D03* +X014430Y007394D03* +X014430Y007384D03* +X004870Y010464D03* +D72* +X015155Y012024D03* +X017645Y009174D03* +X017645Y007394D03* +X020035Y011394D03* +X020035Y012414D03* +X020035Y013404D03* +X020035Y013414D03* +D73* +X020025Y013384D03* +X020025Y013374D03* +X020025Y012394D03* +X020025Y011414D03* +X017645Y009164D03* +X017645Y007404D03* +X015155Y012004D03* +D74* +X013265Y012194D03* +X012695Y012664D03* +X015675Y009134D03* +X014435Y007414D03* +X014435Y007404D03* +X017015Y007484D03* +X018275Y007484D03* +X018265Y009094D03* +X019345Y012274D03* +X004865Y010254D03* +D75* +X015155Y011954D03* +X017645Y009144D03* +X017645Y007424D03* +X020005Y011454D03* +X020005Y011464D03* +X020005Y012354D03* +X020005Y013294D03* +X020005Y013304D03* +D76* +X019310Y011644D03* +X015670Y009124D03* +X015670Y009114D03* +X014440Y007424D03* +X013260Y012204D03* +X015160Y013424D03* +X015160Y013434D03* +X015160Y013444D03* +X004870Y010484D03* +X004870Y010474D03* +D77* +X015155Y011924D03* +X019995Y012334D03* +X019995Y011484D03* +X017645Y007434D03* +D78* +X018185Y007444D03* +X017655Y009514D03* +X015615Y008944D03* +X015615Y008934D03* +X014495Y007604D03* +X014495Y007594D03* +X013205Y012314D03* +X015155Y013294D03* +X004865Y010154D03* +D79* +X004870Y010164D03* +X004870Y010564D03* +X013210Y012304D03* +X015160Y013304D03* +X015160Y013314D03* +X015620Y008954D03* +X014490Y007584D03* +X017100Y007444D03* +D80* +X017070Y007454D03* +X015640Y009014D03* +X015640Y009024D03* +X014470Y007524D03* +X014470Y007514D03* +X013230Y012264D03* +X012700Y012624D03* +X015160Y013354D03* +X015160Y013364D03* +X004870Y010534D03* +X004870Y010524D03* +D81* +X004870Y010494D03* +X012700Y012644D03* +X013250Y012224D03* +X015160Y013404D03* +X015160Y013414D03* +X015660Y009084D03* +X014450Y007454D03* +X018250Y009104D03* +D82* +X018230Y009114D03* +X017060Y009114D03* +X015650Y009054D03* +X014460Y007494D03* +X014460Y007484D03* +X018240Y007464D03* +X013240Y012244D03* +X012700Y012634D03* +X015160Y013374D03* +X015160Y013384D03* +X015160Y013394D03* +X004870Y010514D03* +X004870Y010214D03* +D83* +X004865Y010224D03* +X004865Y010504D03* +X013245Y012234D03* +X015655Y009074D03* +X015655Y009064D03* +X014455Y007474D03* +X014455Y007464D03* +X017045Y007464D03* +X019425Y013274D03* +D84* +X017655Y009524D03* +X015645Y009044D03* +X015645Y009034D03* +X014465Y007504D03* +X013235Y012254D03* +X004865Y010204D03* +D85* +X004870Y010544D03* +X013220Y012284D03* +X015160Y013324D03* +X015160Y013334D03* +X015630Y008994D03* +X015630Y008984D03* +X014480Y007554D03* +D86* +X014485Y007564D03* +X014485Y007574D03* +X015625Y008964D03* +X015625Y008974D03* +X013215Y012294D03* +X019405Y012284D03* +X004865Y010554D03* +X004865Y010174D03* +D87* +X004870Y010574D03* +X004870Y010584D03* +X013200Y012324D03* +X015160Y013274D03* +X015160Y013284D03* +X015610Y008924D03* +X015610Y008914D03* +X014500Y007624D03* +X014500Y007614D03* +D88* +X014510Y007644D03* +X014510Y007654D03* +X015600Y008884D03* +X015600Y008894D03* +X013190Y012344D03* +X015160Y013254D03* +X015160Y013264D03* +X004870Y010594D03* +X004870Y010134D03* +D89* +X004865Y010124D03* +X004865Y010604D03* +X013185Y012354D03* +X015155Y013244D03* +X015595Y008874D03* +X014515Y007664D03* +D90* +X014520Y007674D03* +X014520Y007684D03* +X015590Y008854D03* +X015590Y008864D03* +X013180Y012364D03* +X015160Y013224D03* +X015160Y013234D03* +X004870Y010614D03* +X004870Y010114D03* +D91* +X004865Y010104D03* +X014525Y007704D03* +X014525Y007694D03* +X015585Y008834D03* +X015585Y008844D03* +X017655Y009504D03* +D92* +X015580Y008824D03* +X014530Y007714D03* +X019410Y011634D03* +X015160Y013204D03* +X015160Y013214D03* +X004870Y010634D03* +X004870Y010624D03* +D93* +X004870Y010644D03* +X004870Y010084D03* +X014540Y007754D03* +X014540Y007744D03* +X015570Y008784D03* +X015570Y008794D03* +X015160Y013174D03* +X015160Y013184D03* +D94* +X015155Y013164D03* +X015565Y008774D03* +X014545Y007764D03* +X004865Y010074D03* +X004865Y010654D03* +D95* +X004870Y010664D03* +X014550Y007784D03* +X014550Y007774D03* +X015560Y008754D03* +X015560Y008764D03* +X015160Y013154D03* +D96* +X015155Y013144D03* +X017655Y009494D03* +X015555Y008744D03* +X014555Y007794D03* +X004865Y010064D03* +D97* +X004870Y010054D03* +X004870Y010674D03* +X004870Y010684D03* +X014560Y007814D03* +X014560Y007804D03* +X015550Y008724D03* +X015550Y008734D03* +X015160Y013124D03* +X015160Y013134D03* +D98* +X015160Y013104D03* +X015540Y008694D03* +X014570Y007844D03* +X004870Y010034D03* +X004870Y010694D03* +D99* +X004865Y010704D03* +X004865Y010024D03* +X014575Y007864D03* +X014575Y007854D03* +X015535Y008674D03* +X015535Y008684D03* +X015155Y013094D03* +D100* +X017650Y009484D03* +X015530Y008664D03* +X015530Y008654D03* +X014580Y007874D03* +X004870Y010714D03* +D101* +X004865Y010014D03* +X014585Y007894D03* +X014585Y007884D03* +X015525Y008644D03* +D102* +X014305Y008644D03* +X014305Y008634D03* +X014305Y008624D03* +X014305Y008614D03* +X014305Y008604D03* +X014305Y008594D03* +X014305Y008584D03* +X014305Y008574D03* +X014305Y008564D03* +X014305Y008554D03* +X014305Y008544D03* +X014305Y008534D03* +X014305Y008524D03* +X014305Y008514D03* +X014305Y008504D03* +X014305Y008494D03* +X014305Y008484D03* +X014305Y008474D03* +X014305Y008464D03* +X014305Y008454D03* +X014305Y008444D03* +X014305Y008434D03* +X014305Y008424D03* +X014305Y008414D03* +X014305Y008404D03* +X014305Y008394D03* +X014305Y008384D03* +X014305Y008374D03* +X014305Y008364D03* +X014305Y008354D03* +X014305Y008344D03* +X014305Y008334D03* +X014305Y008324D03* +X014305Y008314D03* +X014305Y008304D03* +X014305Y008294D03* +X014305Y008284D03* +X014305Y008274D03* +X014305Y008264D03* +X014305Y008254D03* +X014305Y008244D03* +X014305Y008234D03* +X014305Y008224D03* +X014305Y008214D03* +X014305Y008204D03* +X014305Y008194D03* +X014305Y008184D03* +X014305Y008174D03* +X014305Y008164D03* +X014305Y008154D03* +X014305Y008144D03* +X014305Y008134D03* +X014305Y008124D03* +X014305Y008114D03* +X014305Y008104D03* +X014305Y008094D03* +X014305Y008084D03* +X014305Y008074D03* +X014305Y008064D03* +X014305Y008054D03* +X014305Y008044D03* +X014305Y008034D03* +X014305Y008024D03* +X014305Y008014D03* +X014305Y008004D03* +X014305Y007994D03* +X014305Y007984D03* +X014305Y007974D03* +X014305Y007964D03* +X014305Y007954D03* +X014305Y007944D03* +X014305Y007934D03* +X014305Y007924D03* +X014305Y007914D03* +X014305Y007904D03* +X014305Y008654D03* +X014305Y008664D03* +X014305Y008674D03* +X014305Y008684D03* +X014305Y008694D03* +X014305Y008704D03* +X014305Y008714D03* +X014305Y008724D03* +X014305Y008734D03* +X014305Y008744D03* +X014305Y008754D03* +X014305Y008764D03* +X014305Y008774D03* +X014305Y008784D03* +X014305Y008794D03* +X014305Y008804D03* +X014305Y008814D03* +X014305Y008824D03* +X014305Y008834D03* +X014305Y008844D03* +X014305Y008854D03* +X014305Y008864D03* +X014305Y008874D03* +X014305Y008884D03* +X014305Y008894D03* +X014305Y008904D03* +X014305Y008914D03* +X014305Y008924D03* +X014305Y008934D03* +X014305Y008944D03* +X014305Y008954D03* +X014305Y008964D03* +X014305Y008974D03* +X014305Y008984D03* +X014305Y008994D03* +X014305Y009004D03* +X014305Y009014D03* +X014305Y009024D03* +X014305Y009034D03* +X014305Y009044D03* +X014305Y009054D03* +X014305Y009064D03* +X014305Y009074D03* +X014305Y009084D03* +X014305Y009094D03* +X014305Y009104D03* +X014305Y009114D03* +X014305Y009124D03* +X014305Y009134D03* +X014305Y009144D03* +X014305Y009154D03* +X014305Y009164D03* +X014305Y009174D03* +X014305Y009184D03* +X014305Y009194D03* +X014305Y009204D03* +X014305Y009214D03* +X014305Y009224D03* +X014305Y009234D03* +X014305Y009244D03* +X014305Y009254D03* +X014305Y009264D03* +X014305Y009274D03* +X014305Y009284D03* +X014305Y009294D03* +X014305Y009304D03* +X014305Y009314D03* +X014305Y009324D03* +X014305Y009334D03* +X014305Y009344D03* +X014305Y009354D03* +X014305Y009364D03* +X014305Y009374D03* +X014305Y009384D03* +X014305Y009394D03* +X014305Y009404D03* +X014305Y009414D03* +X014305Y009424D03* +X014305Y009434D03* +X014305Y009444D03* +X014305Y009454D03* +X014305Y009464D03* +X014305Y009474D03* +X014305Y009484D03* +X014305Y009494D03* +X014305Y009504D03* +X014305Y009514D03* +X014305Y009524D03* +D103* +X015150Y011864D03* +X019970Y011564D03* +X020060Y009524D03* +X020060Y009514D03* +X020060Y009504D03* +X020060Y009494D03* +X020060Y009484D03* +X020060Y009474D03* +X020060Y009464D03* +X020060Y009454D03* +X020060Y009444D03* +X020060Y009434D03* +X020060Y009424D03* +X020060Y009414D03* +X020060Y009404D03* +X020060Y009394D03* +X020060Y009384D03* +X020060Y009374D03* +X020060Y009364D03* +X020060Y009354D03* +X020060Y009344D03* +X020060Y009334D03* +X020060Y009324D03* +X020060Y009314D03* +X020060Y009304D03* +X020060Y009294D03* +X020060Y009284D03* +X020060Y009274D03* +X020060Y009264D03* +X020060Y009254D03* +X020060Y009244D03* +X020060Y009234D03* +X020060Y009224D03* +X020060Y009214D03* +X020060Y009204D03* +X020060Y009194D03* +X020060Y009184D03* +X020060Y009174D03* +X020060Y009164D03* +X020060Y009154D03* +X020060Y009144D03* +X020060Y009134D03* +X020060Y009124D03* +X020060Y009114D03* +D104* +X017650Y009184D03* +X020040Y011384D03* +X017540Y013274D03* +X017540Y013284D03* +X017540Y013294D03* +X017540Y013304D03* +X017540Y013314D03* +X017540Y013324D03* +X017540Y013334D03* +X017540Y013344D03* +X017540Y013354D03* +X017540Y013364D03* +X017540Y013374D03* +X017540Y013384D03* +X017540Y013394D03* +X017540Y013404D03* +X017540Y013414D03* +X017540Y013424D03* +X017540Y013434D03* +X017540Y013444D03* +X017540Y013454D03* +X017540Y013464D03* +X017540Y013474D03* +X017540Y013484D03* +X017540Y013494D03* +X017540Y013504D03* +X017540Y013514D03* +X017540Y013524D03* +X017540Y013534D03* +X017540Y013544D03* +X017540Y013554D03* +X017540Y013564D03* +X017540Y013574D03* +X017540Y013584D03* +X017540Y013594D03* +X017540Y013604D03* +X017540Y013614D03* +X017540Y013624D03* +X017540Y013634D03* +X017540Y013644D03* +X017540Y013654D03* +X017540Y013664D03* +X017540Y013674D03* +X017540Y013684D03* +X017540Y013694D03* +X020040Y013424D03* +X015150Y012044D03* +X015150Y012034D03* +X012620Y009524D03* +X012620Y009514D03* +X012620Y009504D03* +X012620Y009494D03* +X012620Y009484D03* +X012620Y009474D03* +X012620Y009464D03* +X012620Y009454D03* +X012620Y009444D03* +X012620Y009434D03* +X012620Y009424D03* +X012620Y009414D03* +X012620Y009404D03* +X012620Y009394D03* +X012620Y009384D03* +X012620Y009374D03* +X012620Y009364D03* +X012620Y009354D03* +X012620Y009344D03* +X012620Y009334D03* +X012620Y009324D03* +X012620Y009314D03* +X012620Y009304D03* +X012620Y009294D03* +X012620Y009284D03* +X012620Y009274D03* +X012620Y009264D03* +X012620Y009254D03* +X012620Y009244D03* +X012620Y009234D03* +X012620Y009224D03* +X012620Y009214D03* +X012620Y009204D03* +X012620Y009194D03* +X012620Y009184D03* +X012620Y009174D03* +X012620Y009164D03* +X012620Y009154D03* +X012620Y009144D03* +X012620Y009134D03* +X012620Y009124D03* +X012620Y009114D03* +D105* +X017645Y009304D03* +D106* +X017650Y009324D03* +X020180Y011244D03* +D107* +X017650Y009334D03* +X020190Y013644D03* +D108* +X020205Y013654D03* +X020205Y011234D03* +X017645Y009344D03* +D109* +X017650Y009354D03* +X012890Y012384D03* +X012890Y012394D03* +X020220Y013664D03* +D110* +X017650Y009364D03* +X012900Y012414D03* +X012900Y012424D03* +D111* +X012920Y012474D03* +X012920Y012484D03* +X017650Y009374D03* +D112* +X017650Y009384D03* +X012930Y012504D03* +X012930Y012514D03* +D113* +X012945Y012554D03* +X012945Y012564D03* +X017655Y009394D03* +D114* +X017650Y009404D03* +X012960Y012604D03* +D115* +X017650Y009414D03* +D116* +X017655Y009424D03* +D117* +X017650Y009434D03* +D118* +X017650Y009444D03* +D119* +X017650Y009454D03* +D120* +X017655Y009464D03* +D121* +X017655Y009474D03* +D122* +X015795Y009524D03* +X015565Y012704D03* +X015555Y012734D03* +X015545Y012754D03* +X015535Y012784D03* +X015525Y012814D03* +X015515Y012834D03* +X015515Y012844D03* +X015505Y012864D03* +X015495Y012884D03* +X015495Y012894D03* +X015485Y012914D03* +X015485Y012924D03* +X015475Y012934D03* +X015475Y012944D03* +X015475Y012954D03* +X015465Y012964D03* +X015465Y012974D03* +X015455Y012984D03* +X015455Y012994D03* +X015455Y013004D03* +X015445Y013014D03* +X015445Y013024D03* +X015445Y013034D03* +X015435Y013044D03* +X015435Y013054D03* +X015425Y013074D03* +X015425Y013084D03* +X019255Y013084D03* +X019255Y013074D03* +X019255Y013064D03* +X019255Y013054D03* +X019255Y013044D03* +X019275Y012884D03* +X019285Y012864D03* +X019295Y012844D03* +X019295Y012834D03* +X019305Y012824D03* +X004575Y010754D03* +X004545Y010804D03* +X004535Y010824D03* +X004525Y010834D03* +X004525Y010844D03* +X004515Y010854D03* +X004505Y010874D03* +X004495Y010884D03* +X004495Y010894D03* +X004485Y010904D03* +X004485Y010914D03* +X004475Y010924D03* +X004465Y010944D03* +X004455Y010954D03* +X004455Y010964D03* +X004445Y010974D03* +X004435Y010994D03* +X004425Y011014D03* +X004395Y011064D03* +D123* +X017650Y009564D03* +D124* +X017650Y009574D03* +D125* +X009690Y010104D03* +X009690Y010114D03* +X009690Y010124D03* +X009690Y010134D03* +X009690Y010144D03* +X009690Y010154D03* +X009690Y010164D03* +X009690Y010174D03* +X009690Y010184D03* +X009690Y010194D03* +X009690Y010204D03* +X009690Y010214D03* +X009690Y010224D03* +X009690Y010234D03* +X009690Y010244D03* +X009690Y010254D03* +X009690Y010264D03* +X009690Y010274D03* +X009690Y010284D03* +X009690Y010294D03* +X009690Y010304D03* +X009690Y010314D03* +X009690Y010324D03* +X009690Y010334D03* +X009690Y010344D03* +X009690Y010354D03* +X009690Y010364D03* +X009690Y010374D03* +X009690Y010384D03* +X009690Y010394D03* +X009690Y010404D03* +X009690Y010414D03* +X009690Y010424D03* +X009690Y010434D03* +X009690Y010444D03* +X009690Y010454D03* +X009690Y010464D03* +X009690Y010474D03* +X009690Y010484D03* +X009690Y010494D03* +X009690Y010504D03* +X009690Y010514D03* +X009690Y010524D03* +D126* +X004590Y010724D03* +X004590Y010734D03* +X004580Y010744D03* +X004570Y010764D03* +X004560Y010774D03* +X004560Y010784D03* +X004550Y010794D03* +X004540Y010814D03* +X004510Y010864D03* +X015430Y013064D03* +X019250Y013034D03* +X019250Y013024D03* +X019250Y013014D03* +X019250Y013004D03* +X019250Y012994D03* +X019250Y012984D03* +X019250Y012974D03* +X019250Y012964D03* +X019260Y012954D03* +X019260Y012944D03* +X019260Y012934D03* +X019260Y012924D03* +X019260Y012914D03* +X019270Y012904D03* +X019270Y012894D03* +X019280Y012874D03* +X019290Y012854D03* +D127* +X020320Y011214D03* +D128* +X020160Y011254D03* +D129* +X020120Y011284D03* +X020120Y013574D03* +D130* +X020110Y013564D03* +X020110Y012584D03* +X020110Y011294D03* +D131* +X020100Y011304D03* +X020100Y012494D03* +X020100Y012594D03* +X015150Y012194D03* +D132* +X015150Y012164D03* +X020090Y012484D03* +X020090Y012614D03* +X020090Y013534D03* +X020090Y011314D03* +D133* +X020060Y011354D03* +X020060Y012664D03* +X020060Y013474D03* +X015150Y012094D03* +D134* +X015150Y012064D03* +X020050Y012434D03* +X020050Y012684D03* +X020050Y012694D03* +X020050Y013444D03* +X020050Y013454D03* +X020050Y011374D03* +D135* +X020030Y011404D03* +X020030Y012404D03* +X020030Y013394D03* +X015150Y012014D03* +D136* +X015150Y011994D03* +X015150Y011984D03* +X020020Y011424D03* +X020020Y013354D03* +X020020Y013364D03* +D137* +X020010Y013324D03* +X020010Y013314D03* +X020010Y012374D03* +X020010Y012364D03* +X020010Y011444D03* +X015150Y011964D03* +D138* +X015150Y011944D03* +X015150Y011934D03* +X020000Y012344D03* +X020000Y011474D03* +X020000Y013284D03* +D139* +X019990Y012324D03* +X019990Y011504D03* +X019990Y011494D03* +X015150Y011914D03* +D140* +X015155Y011904D03* +X019985Y011514D03* +X019985Y012314D03* +D141* +X019980Y012304D03* +X019980Y011534D03* +X019980Y011524D03* +X015150Y011884D03* +X015150Y011894D03* +D142* +X015155Y011874D03* +X019975Y011554D03* +X019975Y011544D03* +X019975Y012294D03* +D143* +X019965Y011584D03* +X019965Y011574D03* +X015155Y011854D03* +D144* +X015150Y011844D03* +X015150Y011834D03* +X019960Y011604D03* +X019960Y011594D03* +D145* +X019955Y011614D03* +X019955Y011624D03* +X015155Y011824D03* +D146* +X015155Y011774D03* +D147* +X015150Y011784D03* +X015150Y011794D03* +D148* +X015150Y011804D03* +X015150Y011814D03* +D149* +X015150Y012114D03* +X020070Y012644D03* +X020070Y013494D03* +D150* +X020080Y013514D03* +X020080Y012624D03* +X015150Y012144D03* +D151* +X012910Y012444D03* +X012910Y012454D03* +D152* +X012915Y012464D03* +X020245Y013674D03* +D153* +X020130Y012554D03* +X020130Y012514D03* +D154* +X020140Y012524D03* +X020140Y012544D03* +D155* +X020150Y012534D03* +X020150Y013614D03* +D156* +X012940Y012544D03* +X012940Y012534D03* +D157* +X012950Y012574D03* +X020280Y013684D03* +D158* +X009595Y013684D03* +X009595Y013674D03* +X009595Y013664D03* +X009595Y013654D03* +X009595Y013644D03* +X009595Y013634D03* +X009595Y013624D03* +X009595Y013614D03* +X009595Y013604D03* +X009595Y013594D03* +X009595Y013584D03* +X009595Y013574D03* +X009595Y013564D03* +X009595Y013554D03* +X009595Y013544D03* +X009595Y013534D03* +X009595Y013524D03* +X009595Y013514D03* +X009595Y013504D03* +X009595Y013494D03* +X009595Y013484D03* +X009595Y013474D03* +X009595Y013464D03* +X009595Y013454D03* +X009595Y013444D03* +X009595Y013434D03* +X009595Y013424D03* +X009595Y013414D03* +X009595Y013404D03* +X009595Y013394D03* +X009595Y013384D03* +X009595Y013374D03* +X009595Y013364D03* +X009595Y013354D03* +X009595Y013344D03* +X009595Y013334D03* +X009595Y013324D03* +X009595Y013314D03* +X009595Y013304D03* +X009595Y013294D03* +X009595Y013284D03* +X009595Y013274D03* +X009595Y013264D03* +D159* +X020345Y013694D03* +D160* +X022869Y013789D02* +X022869Y007639D01* +M02* diff --git a/gerber/tests/resources/ncdrill.DRD b/gerber/tests/resources/ncdrill.DRD new file mode 100644 index 0000000..ced00ca --- /dev/null +++ b/gerber/tests/resources/ncdrill.DRD @@ -0,0 +1,51 @@ +% +M48 +M72 +T01C0.0236 +T02C0.0354 +T03C0.0400 +T04C0.1260 +T05C0.1280 +% +T01 +X9250Y4064 +X12100Y5314 +X13500Y6864 +X15650Y6264 +X15200Y4514 +X13550Y8764 +X13350Y10114 +X13300Y11464 +X11650Y13164 +X10000Y15114 +X6500Y13714 +X4150Y11564 +X14250Y14964 +X15850Y9914 +T02 +X17200Y9464 +X18200Y9964 +X18200Y10964 +X17200Y10464 +X17200Y11464 +X18200Y11964 +T03 +X18350Y16814 +X17350Y16814 +X7350Y16964 +X6350Y16964 +X5350Y16964 +X1500Y12564 +X1500Y11564 +X1500Y10564 +X1500Y9564 +X1500Y8564 +T04 +X2350Y5114 +X2300Y16064 +X20800Y16064 +X20800Y5064 +T05 +X20700Y8714 +X20700Y12714 +M30 diff --git a/gerber/tests/resources/top_copper.GTL b/gerber/tests/resources/top_copper.GTL new file mode 100644 index 0000000..cedd2fd --- /dev/null +++ b/gerber/tests/resources/top_copper.GTL @@ -0,0 +1,3457 @@ +G75* +%MOIN*% +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0000*% +%ADD11R,0.0260X0.0800*% +%ADD12R,0.0591X0.0157*% +%ADD13R,0.4098X0.4252*% +%ADD14R,0.0850X0.0420*% +%ADD15R,0.0630X0.1575*% +%ADD16R,0.0591X0.0512*% +%ADD17R,0.0512X0.0591*% +%ADD18R,0.0630X0.1535*% +%ADD19R,0.1339X0.0748*% +%ADD20C,0.0004*% +%ADD21C,0.0554*% +%ADD22R,0.0394X0.0500*% +%ADD23C,0.0600*% +%ADD24R,0.0472X0.0472*% +%ADD25C,0.0160*% +%ADD26C,0.0396*% +%ADD27C,0.0240*% +D10* +X000300Y003064D02* +X000300Y018064D01* +X022800Y018064D01* +X022800Y003064D01* +X000300Y003064D01* +X001720Y005114D02* +X001722Y005164D01* +X001728Y005214D01* +X001738Y005263D01* +X001752Y005311D01* +X001769Y005358D01* +X001790Y005403D01* +X001815Y005447D01* +X001843Y005488D01* +X001875Y005527D01* +X001909Y005564D01* +X001946Y005598D01* +X001986Y005628D01* +X002028Y005655D01* +X002072Y005679D01* +X002118Y005700D01* +X002165Y005716D01* +X002213Y005729D01* +X002263Y005738D01* +X002312Y005743D01* +X002363Y005744D01* +X002413Y005741D01* +X002462Y005734D01* +X002511Y005723D01* +X002559Y005708D01* +X002605Y005690D01* +X002650Y005668D01* +X002693Y005642D01* +X002734Y005613D01* +X002773Y005581D01* +X002809Y005546D01* +X002841Y005508D01* +X002871Y005468D01* +X002898Y005425D01* +X002921Y005381D01* +X002940Y005335D01* +X002956Y005287D01* +X002968Y005238D01* +X002976Y005189D01* +X002980Y005139D01* +X002980Y005089D01* +X002976Y005039D01* +X002968Y004990D01* +X002956Y004941D01* +X002940Y004893D01* +X002921Y004847D01* +X002898Y004803D01* +X002871Y004760D01* +X002841Y004720D01* +X002809Y004682D01* +X002773Y004647D01* +X002734Y004615D01* +X002693Y004586D01* +X002650Y004560D01* +X002605Y004538D01* +X002559Y004520D01* +X002511Y004505D01* +X002462Y004494D01* +X002413Y004487D01* +X002363Y004484D01* +X002312Y004485D01* +X002263Y004490D01* +X002213Y004499D01* +X002165Y004512D01* +X002118Y004528D01* +X002072Y004549D01* +X002028Y004573D01* +X001986Y004600D01* +X001946Y004630D01* +X001909Y004664D01* +X001875Y004701D01* +X001843Y004740D01* +X001815Y004781D01* +X001790Y004825D01* +X001769Y004870D01* +X001752Y004917D01* +X001738Y004965D01* +X001728Y005014D01* +X001722Y005064D01* +X001720Y005114D01* +X001670Y016064D02* +X001672Y016114D01* +X001678Y016164D01* +X001688Y016213D01* +X001702Y016261D01* +X001719Y016308D01* +X001740Y016353D01* +X001765Y016397D01* +X001793Y016438D01* +X001825Y016477D01* +X001859Y016514D01* +X001896Y016548D01* +X001936Y016578D01* +X001978Y016605D01* +X002022Y016629D01* +X002068Y016650D01* +X002115Y016666D01* +X002163Y016679D01* +X002213Y016688D01* +X002262Y016693D01* +X002313Y016694D01* +X002363Y016691D01* +X002412Y016684D01* +X002461Y016673D01* +X002509Y016658D01* +X002555Y016640D01* +X002600Y016618D01* +X002643Y016592D01* +X002684Y016563D01* +X002723Y016531D01* +X002759Y016496D01* +X002791Y016458D01* +X002821Y016418D01* +X002848Y016375D01* +X002871Y016331D01* +X002890Y016285D01* +X002906Y016237D01* +X002918Y016188D01* +X002926Y016139D01* +X002930Y016089D01* +X002930Y016039D01* +X002926Y015989D01* +X002918Y015940D01* +X002906Y015891D01* +X002890Y015843D01* +X002871Y015797D01* +X002848Y015753D01* +X002821Y015710D01* +X002791Y015670D01* +X002759Y015632D01* +X002723Y015597D01* +X002684Y015565D01* +X002643Y015536D01* +X002600Y015510D01* +X002555Y015488D01* +X002509Y015470D01* +X002461Y015455D01* +X002412Y015444D01* +X002363Y015437D01* +X002313Y015434D01* +X002262Y015435D01* +X002213Y015440D01* +X002163Y015449D01* +X002115Y015462D01* +X002068Y015478D01* +X002022Y015499D01* +X001978Y015523D01* +X001936Y015550D01* +X001896Y015580D01* +X001859Y015614D01* +X001825Y015651D01* +X001793Y015690D01* +X001765Y015731D01* +X001740Y015775D01* +X001719Y015820D01* +X001702Y015867D01* +X001688Y015915D01* +X001678Y015964D01* +X001672Y016014D01* +X001670Y016064D01* +X020060Y012714D02* +X020062Y012764D01* +X020068Y012814D01* +X020078Y012863D01* +X020091Y012912D01* +X020109Y012959D01* +X020130Y013005D01* +X020154Y013048D01* +X020182Y013090D01* +X020213Y013130D01* +X020247Y013167D01* +X020284Y013201D01* +X020324Y013232D01* +X020366Y013260D01* +X020409Y013284D01* +X020455Y013305D01* +X020502Y013323D01* +X020551Y013336D01* +X020600Y013346D01* +X020650Y013352D01* +X020700Y013354D01* +X020750Y013352D01* +X020800Y013346D01* +X020849Y013336D01* +X020898Y013323D01* +X020945Y013305D01* +X020991Y013284D01* +X021034Y013260D01* +X021076Y013232D01* +X021116Y013201D01* +X021153Y013167D01* +X021187Y013130D01* +X021218Y013090D01* +X021246Y013048D01* +X021270Y013005D01* +X021291Y012959D01* +X021309Y012912D01* +X021322Y012863D01* +X021332Y012814D01* +X021338Y012764D01* +X021340Y012714D01* +X021338Y012664D01* +X021332Y012614D01* +X021322Y012565D01* +X021309Y012516D01* +X021291Y012469D01* +X021270Y012423D01* +X021246Y012380D01* +X021218Y012338D01* +X021187Y012298D01* +X021153Y012261D01* +X021116Y012227D01* +X021076Y012196D01* +X021034Y012168D01* +X020991Y012144D01* +X020945Y012123D01* +X020898Y012105D01* +X020849Y012092D01* +X020800Y012082D01* +X020750Y012076D01* +X020700Y012074D01* +X020650Y012076D01* +X020600Y012082D01* +X020551Y012092D01* +X020502Y012105D01* +X020455Y012123D01* +X020409Y012144D01* +X020366Y012168D01* +X020324Y012196D01* +X020284Y012227D01* +X020247Y012261D01* +X020213Y012298D01* +X020182Y012338D01* +X020154Y012380D01* +X020130Y012423D01* +X020109Y012469D01* +X020091Y012516D01* +X020078Y012565D01* +X020068Y012614D01* +X020062Y012664D01* +X020060Y012714D01* +X020170Y016064D02* +X020172Y016114D01* +X020178Y016164D01* +X020188Y016213D01* +X020202Y016261D01* +X020219Y016308D01* +X020240Y016353D01* +X020265Y016397D01* +X020293Y016438D01* +X020325Y016477D01* +X020359Y016514D01* +X020396Y016548D01* +X020436Y016578D01* +X020478Y016605D01* +X020522Y016629D01* +X020568Y016650D01* +X020615Y016666D01* +X020663Y016679D01* +X020713Y016688D01* +X020762Y016693D01* +X020813Y016694D01* +X020863Y016691D01* +X020912Y016684D01* +X020961Y016673D01* +X021009Y016658D01* +X021055Y016640D01* +X021100Y016618D01* +X021143Y016592D01* +X021184Y016563D01* +X021223Y016531D01* +X021259Y016496D01* +X021291Y016458D01* +X021321Y016418D01* +X021348Y016375D01* +X021371Y016331D01* +X021390Y016285D01* +X021406Y016237D01* +X021418Y016188D01* +X021426Y016139D01* +X021430Y016089D01* +X021430Y016039D01* +X021426Y015989D01* +X021418Y015940D01* +X021406Y015891D01* +X021390Y015843D01* +X021371Y015797D01* +X021348Y015753D01* +X021321Y015710D01* +X021291Y015670D01* +X021259Y015632D01* +X021223Y015597D01* +X021184Y015565D01* +X021143Y015536D01* +X021100Y015510D01* +X021055Y015488D01* +X021009Y015470D01* +X020961Y015455D01* +X020912Y015444D01* +X020863Y015437D01* +X020813Y015434D01* +X020762Y015435D01* +X020713Y015440D01* +X020663Y015449D01* +X020615Y015462D01* +X020568Y015478D01* +X020522Y015499D01* +X020478Y015523D01* +X020436Y015550D01* +X020396Y015580D01* +X020359Y015614D01* +X020325Y015651D01* +X020293Y015690D01* +X020265Y015731D01* +X020240Y015775D01* +X020219Y015820D01* +X020202Y015867D01* +X020188Y015915D01* +X020178Y015964D01* +X020172Y016014D01* +X020170Y016064D01* +X020060Y008714D02* +X020062Y008764D01* +X020068Y008814D01* +X020078Y008863D01* +X020091Y008912D01* +X020109Y008959D01* +X020130Y009005D01* +X020154Y009048D01* +X020182Y009090D01* +X020213Y009130D01* +X020247Y009167D01* +X020284Y009201D01* +X020324Y009232D01* +X020366Y009260D01* +X020409Y009284D01* +X020455Y009305D01* +X020502Y009323D01* +X020551Y009336D01* +X020600Y009346D01* +X020650Y009352D01* +X020700Y009354D01* +X020750Y009352D01* +X020800Y009346D01* +X020849Y009336D01* +X020898Y009323D01* +X020945Y009305D01* +X020991Y009284D01* +X021034Y009260D01* +X021076Y009232D01* +X021116Y009201D01* +X021153Y009167D01* +X021187Y009130D01* +X021218Y009090D01* +X021246Y009048D01* +X021270Y009005D01* +X021291Y008959D01* +X021309Y008912D01* +X021322Y008863D01* +X021332Y008814D01* +X021338Y008764D01* +X021340Y008714D01* +X021338Y008664D01* +X021332Y008614D01* +X021322Y008565D01* +X021309Y008516D01* +X021291Y008469D01* +X021270Y008423D01* +X021246Y008380D01* +X021218Y008338D01* +X021187Y008298D01* +X021153Y008261D01* +X021116Y008227D01* +X021076Y008196D01* +X021034Y008168D01* +X020991Y008144D01* +X020945Y008123D01* +X020898Y008105D01* +X020849Y008092D01* +X020800Y008082D01* +X020750Y008076D01* +X020700Y008074D01* +X020650Y008076D01* +X020600Y008082D01* +X020551Y008092D01* +X020502Y008105D01* +X020455Y008123D01* +X020409Y008144D01* +X020366Y008168D01* +X020324Y008196D01* +X020284Y008227D01* +X020247Y008261D01* +X020213Y008298D01* +X020182Y008338D01* +X020154Y008380D01* +X020130Y008423D01* +X020109Y008469D01* +X020091Y008516D01* +X020078Y008565D01* +X020068Y008614D01* +X020062Y008664D01* +X020060Y008714D01* +X020170Y005064D02* +X020172Y005114D01* +X020178Y005164D01* +X020188Y005213D01* +X020202Y005261D01* +X020219Y005308D01* +X020240Y005353D01* +X020265Y005397D01* +X020293Y005438D01* +X020325Y005477D01* +X020359Y005514D01* +X020396Y005548D01* +X020436Y005578D01* +X020478Y005605D01* +X020522Y005629D01* +X020568Y005650D01* +X020615Y005666D01* +X020663Y005679D01* +X020713Y005688D01* +X020762Y005693D01* +X020813Y005694D01* +X020863Y005691D01* +X020912Y005684D01* +X020961Y005673D01* +X021009Y005658D01* +X021055Y005640D01* +X021100Y005618D01* +X021143Y005592D01* +X021184Y005563D01* +X021223Y005531D01* +X021259Y005496D01* +X021291Y005458D01* +X021321Y005418D01* +X021348Y005375D01* +X021371Y005331D01* +X021390Y005285D01* +X021406Y005237D01* +X021418Y005188D01* +X021426Y005139D01* +X021430Y005089D01* +X021430Y005039D01* +X021426Y004989D01* +X021418Y004940D01* +X021406Y004891D01* +X021390Y004843D01* +X021371Y004797D01* +X021348Y004753D01* +X021321Y004710D01* +X021291Y004670D01* +X021259Y004632D01* +X021223Y004597D01* +X021184Y004565D01* +X021143Y004536D01* +X021100Y004510D01* +X021055Y004488D01* +X021009Y004470D01* +X020961Y004455D01* +X020912Y004444D01* +X020863Y004437D01* +X020813Y004434D01* +X020762Y004435D01* +X020713Y004440D01* +X020663Y004449D01* +X020615Y004462D01* +X020568Y004478D01* +X020522Y004499D01* +X020478Y004523D01* +X020436Y004550D01* +X020396Y004580D01* +X020359Y004614D01* +X020325Y004651D01* +X020293Y004690D01* +X020265Y004731D01* +X020240Y004775D01* +X020219Y004820D01* +X020202Y004867D01* +X020188Y004915D01* +X020178Y004964D01* +X020172Y005014D01* +X020170Y005064D01* +D11* +X006500Y010604D03* +X006000Y010604D03* +X005500Y010604D03* +X005000Y010604D03* +X005000Y013024D03* +X005500Y013024D03* +X006000Y013024D03* +X006500Y013024D03* +D12* +X011423Y007128D03* +X011423Y006872D03* +X011423Y006616D03* +X011423Y006360D03* +X011423Y006104D03* +X011423Y005848D03* +X011423Y005592D03* +X011423Y005336D03* +X011423Y005080D03* +X011423Y004825D03* +X011423Y004569D03* +X011423Y004313D03* +X011423Y004057D03* +X011423Y003801D03* +X014277Y003801D03* +X014277Y004057D03* +X014277Y004313D03* +X014277Y004569D03* +X014277Y004825D03* +X014277Y005080D03* +X014277Y005336D03* +X014277Y005592D03* +X014277Y005848D03* +X014277Y006104D03* +X014277Y006360D03* +X014277Y006616D03* +X014277Y006872D03* +X014277Y007128D03* +D13* +X009350Y010114D03* +D14* +X012630Y010114D03* +X012630Y010784D03* +X012630Y011454D03* +X012630Y009444D03* +X012630Y008774D03* +D15* +X010000Y013467D03* +X010000Y016262D03* +D16* +X004150Y012988D03* +X004150Y012240D03* +X009900Y005688D03* +X009900Y004940D03* +X015000Y006240D03* +X015000Y006988D03* +D17* +X014676Y008364D03* +X015424Y008364D03* +X017526Y004514D03* +X018274Y004514D03* +X010674Y004064D03* +X009926Y004064D03* +X004174Y009564D03* +X003426Y009564D03* +X005376Y014564D03* +X006124Y014564D03* +D18* +X014250Y016088D03* +X014250Y012741D03* +D19* +X014250Y010982D03* +X014250Y009447D03* +D20* +X022869Y007639D02* +X022869Y013789D01* +D21* +X018200Y011964D03* +X017200Y011464D03* +X017200Y010464D03* +X018200Y009964D03* +X018200Y010964D03* +X017200Y009464D03* +D22* +X008696Y006914D03* +X008696Y005864D03* +X008696Y004864D03* +X008696Y003814D03* +X005004Y003814D03* +X005004Y004864D03* +X005004Y005864D03* +X005004Y006914D03* +D23* +X001800Y008564D02* +X001200Y008564D01* +X001200Y009564D02* +X001800Y009564D01* +X001800Y010564D02* +X001200Y010564D01* +X001200Y011564D02* +X001800Y011564D01* +X001800Y012564D02* +X001200Y012564D01* +X005350Y016664D02* +X005350Y017264D01* +X006350Y017264D02* +X006350Y016664D01* +X007350Y016664D02* +X007350Y017264D01* +X017350Y017114D02* +X017350Y016514D01* +X018350Y016514D02* +X018350Y017114D01* +D24* +X016613Y004514D03* +X015787Y004514D03* +D25* +X015200Y004514D01* +X014868Y004649D02* +X014732Y004649D01* +X014842Y004586D02* +X014842Y004443D01* +X014896Y004311D01* +X014997Y004211D01* +X015129Y004156D01* +X015271Y004156D01* +X015395Y004207D01* +X015484Y004118D01* +X016089Y004118D01* +X016183Y004212D01* +X016183Y004817D01* +X016089Y004911D01* +X015484Y004911D01* +X015395Y004821D01* +X015271Y004872D01* +X015129Y004872D01* +X014997Y004818D01* +X014896Y004717D01* +X014842Y004586D01* +X014842Y004491D02* +X014732Y004491D01* +X014732Y004332D02* +X014888Y004332D01* +X014732Y004174D02* +X015086Y004174D01* +X015314Y004174D02* +X015428Y004174D01* +X014732Y004015D02* +X019505Y004015D01* +X019568Y003922D02* +X019568Y003922D01* +X019568Y003922D01* +X019286Y004335D01* +X019286Y004335D01* +X019139Y004814D01* +X019139Y005315D01* +X019286Y005793D01* +X019286Y005793D01* +X019568Y006207D01* +X019568Y006207D01* +X019960Y006519D01* +X019960Y006519D01* +X020426Y006702D01* +X020926Y006740D01* +X020926Y006740D01* +X021414Y006628D01* +X021414Y006628D01* +X021847Y006378D01* +X021847Y006378D01* +X022188Y006011D01* +X022188Y006011D01* +X022320Y005737D01* +X022320Y015392D01* +X022188Y015118D01* +X022188Y015118D01* +X021847Y014751D01* +X021847Y014751D01* +X021414Y014500D01* +X021414Y014500D01* +X020926Y014389D01* +X020926Y014389D01* +X020426Y014426D01* +X020426Y014426D01* +X019960Y014609D01* +X019960Y014609D01* +X019568Y014922D01* +X019568Y014922D01* +X019568Y014922D01* +X019286Y015335D01* +X019286Y015335D01* +X019139Y015814D01* +X019139Y016315D01* +X019286Y016793D01* +X019286Y016793D01* +X019568Y017207D01* +X019568Y017207D01* +X019568Y017207D01* +X019960Y017519D01* +X019960Y017519D01* +X020126Y017584D01* +X016626Y017584D01* +X016637Y017573D01* +X016924Y017287D01* +X016960Y017375D01* +X017089Y017504D01* +X017258Y017574D01* +X017441Y017574D01* +X017611Y017504D01* +X017740Y017375D01* +X017810Y017206D01* +X017810Y016423D01* +X017740Y016254D01* +X017611Y016124D01* +X017441Y016054D01* +X017258Y016054D01* +X017089Y016124D01* +X016960Y016254D01* +X016890Y016423D01* +X016890Y016557D01* +X016841Y016577D01* +X016284Y017134D01* +X010456Y017134D01* +X010475Y017116D01* +X010475Y016310D01* +X010475Y016310D01* +X010495Y016216D01* +X010477Y016123D01* +X010475Y016120D01* +X010475Y015408D01* +X010381Y015315D01* +X010305Y015315D01* +X010358Y015186D01* +X010358Y015043D01* +X010304Y014911D01* +X010203Y014811D01* +X010071Y014756D01* +X009929Y014756D01* +X009797Y014811D01* +X009696Y014911D01* +X009642Y015043D01* +X009642Y015186D01* +X009695Y015315D01* +X009619Y015315D01* +X009525Y015408D01* +X009525Y017116D01* +X009544Y017134D01* +X009416Y017134D01* +X009330Y017048D01* +X009330Y014080D01* +X009525Y013885D01* +X009525Y014320D01* +X009619Y014414D01* +X010381Y014414D01* +X010475Y014320D01* +X010475Y013747D01* +X011403Y013747D01* +X011506Y013704D01* +X011688Y013522D01* +X011721Y013522D01* +X011853Y013468D01* +X011954Y013367D01* +X013755Y013367D01* +X013755Y013525D02* +X011685Y013525D01* +X011526Y013684D02* +X013893Y013684D01* +X013911Y013689D02* +X013866Y013677D01* +X013825Y013653D01* +X013791Y013619D01* +X013767Y013578D01* +X013755Y013533D01* +X013755Y012819D01* +X014173Y012819D01* +X014173Y013689D01* +X013911Y013689D01* +X014173Y013684D02* +X014327Y013684D01* +X014327Y013689D02* +X014327Y012819D01* +X014173Y012819D01* +X014173Y012664D01* +X014327Y012664D01* +X014327Y011793D01* +X014589Y011793D01* +X014634Y011806D01* +X014675Y011829D01* +X014709Y011863D01* +X014733Y011904D01* +X014745Y011950D01* +X014745Y012664D01* +X014327Y012664D01* +X014327Y012819D01* +X014745Y012819D01* +X014745Y013533D01* +X014733Y013578D01* +X014709Y013619D01* +X014675Y013653D01* +X014634Y013677D01* +X014589Y013689D01* +X014327Y013689D01* +X014327Y013525D02* +X014173Y013525D01* +X014173Y013367D02* +X014327Y013367D01* +X014327Y013208D02* +X014173Y013208D01* +X014173Y013050D02* +X014327Y013050D01* +X014327Y012891D02* +X014173Y012891D01* +X014173Y012733D02* +X010475Y012733D01* +X010475Y012613D02* +X010475Y013187D01* +X011232Y013187D01* +X011292Y013126D01* +X011292Y013093D01* +X011346Y012961D01* +X011447Y012861D01* +X011579Y012806D01* +X011721Y012806D01* +X011853Y012861D01* +X011954Y012961D01* +X012008Y013093D01* +X012008Y013236D01* +X011954Y013367D01* +X012008Y013208D02* +X013755Y013208D01* +X013755Y013050D02* +X011990Y013050D01* +X011883Y012891D02* +X013755Y012891D01* +X013755Y012664D02* +X013755Y011950D01* +X013767Y011904D01* +X013791Y011863D01* +X013825Y011829D01* +X013866Y011806D01* +X013911Y011793D01* +X014173Y011793D01* +X014173Y012664D01* +X013755Y012664D01* +X013755Y012574D02* +X010436Y012574D01* +X010475Y012613D02* +X010381Y012519D01* +X009619Y012519D01* +X009525Y012613D01* +X009525Y013234D01* +X009444Y013234D01* +X009341Y013277D01* +X009263Y013356D01* +X009263Y013356D01* +X008813Y013806D01* +X008770Y013909D01* +X008770Y017220D01* +X008813Y017323D01* +X009074Y017584D01* +X007681Y017584D01* +X007740Y017525D01* +X007810Y017356D01* +X007810Y016573D01* +X007740Y016404D01* +X007611Y016274D01* +X007441Y016204D01* +X007258Y016204D01* +X007089Y016274D01* +X006960Y016404D01* +X006890Y016573D01* +X006890Y017356D01* +X006960Y017525D01* +X007019Y017584D01* +X006681Y017584D01* +X006740Y017525D01* +X006810Y017356D01* +X006810Y016573D01* +X006740Y016404D01* +X006611Y016274D01* +X006590Y016266D01* +X006590Y015367D01* +X006553Y015278D01* +X006340Y015065D01* +X006340Y015020D01* +X006446Y015020D01* +X006540Y014926D01* +X006540Y014203D01* +X006446Y014109D01* +X006240Y014109D01* +X006240Y013961D01* +X006297Y014018D01* +X006429Y014072D01* +X006571Y014072D01* +X006703Y014018D01* +X006804Y013917D01* +X006858Y013786D01* +X006858Y013643D01* +X006804Y013511D01* +X006786Y013494D01* +X006790Y013491D01* +X006790Y012558D01* +X006696Y012464D01* +X006304Y012464D01* +X006250Y012518D01* +X006196Y012464D01* +X005804Y012464D01* +X005750Y012518D01* +X005696Y012464D01* +X005304Y012464D01* +X005264Y012504D01* +X005241Y012480D01* +X005199Y012457D01* +X005154Y012444D01* +X005000Y012444D01* +X005000Y013024D01* +X005000Y013024D01* +X005000Y012444D01* +X004846Y012444D01* +X004801Y012457D01* +X004759Y012480D01* +X004726Y012514D01* +X004702Y012555D01* +X004690Y012601D01* +X004690Y013024D01* +X005000Y013024D01* +X005000Y013024D01* +X004964Y012988D01* +X004150Y012988D01* +X004198Y012940D02* +X004198Y013036D01* +X004625Y013036D01* +X004625Y013268D01* +X004613Y013314D01* +X004589Y013355D01* +X004556Y013388D01* +X004515Y013412D01* +X004469Y013424D01* +X004198Y013424D01* +X004198Y013036D01* +X004102Y013036D01* +X004102Y012940D01* +X003675Y012940D01* +X003675Y012709D01* +X003687Y012663D01* +X003711Y012622D01* +X003732Y012600D01* +X003695Y012562D01* +X003695Y011918D01* +X003788Y011824D01* +X003904Y011824D01* +X003846Y011767D01* +X003792Y011636D01* +X003792Y011493D01* +X003846Y011361D01* +X003947Y011261D01* +X004079Y011206D01* +X004221Y011206D01* +X004353Y011261D01* +X004454Y011361D01* +X004508Y011493D01* +X004508Y011636D01* +X004454Y011767D01* +X004396Y011824D01* +X004512Y011824D01* +X004605Y011918D01* +X004605Y012562D01* +X004568Y012600D01* +X004589Y012622D01* +X004613Y012663D01* +X004625Y012709D01* +X004625Y012940D01* +X004198Y012940D01* +X004198Y013050D02* +X004102Y013050D01* +X004102Y013036D02* +X004102Y013424D01* +X003831Y013424D01* +X003785Y013412D01* +X003744Y013388D01* +X003711Y013355D01* +X003687Y013314D01* +X003675Y013268D01* +X003675Y013036D01* +X004102Y013036D01* +X004102Y013208D02* +X004198Y013208D01* +X004198Y013367D02* +X004102Y013367D01* +X003723Y013367D02* +X000780Y013367D01* +X000780Y013525D02* +X004720Y013525D01* +X004726Y013535D02* +X004702Y013494D01* +X004690Y013448D01* +X004690Y013024D01* +X005000Y013024D01* +X005000Y012264D01* +X005750Y011514D01* +X005750Y010604D01* +X005500Y010604D01* +X005500Y010024D01* +X005654Y010024D01* +X005699Y010037D01* +X005741Y010060D01* +X005750Y010070D01* +X005759Y010060D01* +X005801Y010037D01* +X005846Y010024D01* +X006000Y010024D01* +X006154Y010024D01* +X006199Y010037D01* +X006241Y010060D01* +X006260Y010080D01* +X006260Y008267D01* +X006297Y008178D01* +X006364Y008111D01* +X006364Y008111D01* +X006821Y007654D01* +X006149Y007654D01* +X005240Y008564D01* +X005240Y010080D01* +X005259Y010060D01* +X005301Y010037D01* +X005346Y010024D01* +X005500Y010024D01* +X005500Y010604D01* +X005500Y010604D01* +X005500Y010604D01* +X005690Y010604D01* +X006000Y010604D01* +X006000Y010024D01* +X006000Y010604D01* +X006000Y010604D01* +X006000Y010604D01* +X005750Y010604D01* +X005500Y010604D02* +X006000Y010604D01* +X006000Y011184D01* +X005846Y011184D01* +X005801Y011172D01* +X005759Y011148D01* +X005741Y011148D01* +X005699Y011172D01* +X005654Y011184D01* +X005500Y011184D01* +X005346Y011184D01* +X005301Y011172D01* +X005259Y011148D01* +X005213Y011148D01* +X005196Y011164D02* +X005236Y011125D01* +X005259Y011148D01* +X005196Y011164D02* +X004804Y011164D01* +X004710Y011071D01* +X004710Y010138D01* +X004760Y010088D01* +X004760Y009309D01* +X004753Y009324D01* +X004590Y009488D01* +X004590Y009926D01* +X004496Y010020D01* +X003852Y010020D01* +X003800Y009968D01* +X003748Y010020D01* +X003104Y010020D01* +X003010Y009926D01* +X003010Y009804D01* +X002198Y009804D01* +X002190Y009825D01* +X002061Y009954D01* +X001891Y010024D01* +X001108Y010024D01* +X000939Y009954D01* +X000810Y009825D01* +X000780Y009752D01* +X000780Y010376D01* +X000810Y010304D01* +X000939Y010174D01* +X001108Y010104D01* +X001891Y010104D01* +X002061Y010174D01* +X002190Y010304D01* +X002260Y010473D01* +X002260Y010656D01* +X002190Y010825D01* +X002061Y010954D01* +X001891Y011024D01* +X001108Y011024D01* +X000939Y010954D01* +X000810Y010825D01* +X000780Y010752D01* +X000780Y011376D01* +X000810Y011304D01* +X000939Y011174D01* +X001108Y011104D01* +X001891Y011104D01* +X002061Y011174D01* +X002190Y011304D01* +X002260Y011473D01* +X002260Y011656D01* +X002190Y011825D01* +X002061Y011954D01* +X001891Y012024D01* +X001108Y012024D01* +X000939Y011954D01* +X000810Y011825D01* +X000780Y011752D01* +X000780Y012376D01* +X000810Y012304D01* +X000939Y012174D01* +X001108Y012104D01* +X001891Y012104D01* +X002061Y012174D01* +X002190Y012304D01* +X002260Y012473D01* +X002260Y012656D01* +X002190Y012825D01* +X002061Y012954D01* +X001891Y013024D01* +X001108Y013024D01* +X000939Y012954D01* +X000810Y012825D01* +X000780Y012752D01* +X000780Y015356D01* +X000786Y015335D01* +X001068Y014922D01* +X001068Y014922D01* +X001068Y014922D01* +X001460Y014609D01* +X001926Y014426D01* +X002426Y014389D01* +X002914Y014500D01* +X003347Y014751D01* +X003347Y014751D01* +X003688Y015118D01* +X003905Y015569D01* +X003980Y016064D01* +X003905Y016560D01* +X003688Y017011D01* +X003347Y017378D01* +X002990Y017584D01* +X005019Y017584D01* +X004960Y017525D01* +X004890Y017356D01* +X004890Y016573D01* +X004960Y016404D01* +X005089Y016274D01* +X005110Y016266D01* +X005110Y015020D01* +X005054Y015020D01* +X004960Y014926D01* +X004960Y014203D01* +X005054Y014109D01* +X005260Y014109D01* +X005260Y013549D01* +X005241Y013568D01* +X005199Y013592D01* +X005154Y013604D01* +X005000Y013604D01* +X004846Y013604D01* +X004801Y013592D01* +X004759Y013568D01* +X004726Y013535D01* +X004690Y013367D02* +X004577Y013367D01* +X004625Y013208D02* +X004690Y013208D01* +X004690Y013050D02* +X004625Y013050D01* +X004625Y012891D02* +X004690Y012891D01* +X004690Y012733D02* +X004625Y012733D01* +X004593Y012574D02* +X004697Y012574D01* +X004605Y012416D02* +X013755Y012416D01* +X013755Y012257D02* +X011559Y012257D01* +X011559Y012307D02* +X011465Y012400D01* +X007235Y012400D01* +X007141Y012307D01* +X007141Y008013D01* +X006740Y008414D01* +X006740Y010088D01* +X006790Y010138D01* +X006790Y011071D01* +X006696Y011164D01* +X006304Y011164D01* +X006264Y011125D01* +X006241Y011148D01* +X006287Y011148D01* +X006241Y011148D02* +X006199Y011172D01* +X006154Y011184D01* +X006000Y011184D01* +X006000Y010604D01* +X006000Y010604D01* +X006000Y010672D02* +X006000Y010672D01* +X006000Y010514D02* +X006000Y010514D01* +X006000Y010355D02* +X006000Y010355D01* +X006000Y010197D02* +X006000Y010197D01* +X006000Y010038D02* +X006000Y010038D01* +X006202Y010038D02* +X006260Y010038D01* +X006260Y009880D02* +X005240Y009880D01* +X005240Y010038D02* +X005297Y010038D01* +X005500Y010038D02* +X005500Y010038D01* +X005500Y010197D02* +X005500Y010197D01* +X005500Y010355D02* +X005500Y010355D01* +X005500Y010514D02* +X005500Y010514D01* +X005500Y010604D02* +X005500Y011184D01* +X005500Y010604D01* +X005500Y010604D01* +X005500Y010672D02* +X005500Y010672D01* +X005500Y010831D02* +X005500Y010831D01* +X005500Y010989D02* +X005500Y010989D01* +X005500Y011148D02* +X005500Y011148D01* +X005741Y011148D02* +X005750Y011139D01* +X005759Y011148D01* +X006000Y011148D02* +X006000Y011148D01* +X006000Y010989D02* +X006000Y010989D01* +X006000Y010831D02* +X006000Y010831D01* +X006500Y010604D02* +X006500Y008314D01* +X007150Y007664D01* +X009450Y007664D01* +X010750Y006364D01* +X011419Y006364D01* +X011423Y006360D01* +X011377Y006364D01* +X011423Y006104D02* +X010660Y006104D01* +X009350Y007414D01* +X006050Y007414D01* +X005000Y008464D01* +X005000Y010604D01* +X004710Y010672D02* +X002253Y010672D01* +X002260Y010514D02* +X004710Y010514D01* +X004710Y010355D02* +X002211Y010355D01* +X002083Y010197D02* +X004710Y010197D01* +X004760Y010038D02* +X000780Y010038D01* +X000780Y009880D02* +X000865Y009880D01* +X000917Y010197D02* +X000780Y010197D01* +X000780Y010355D02* +X000789Y010355D01* +X000780Y010831D02* +X000816Y010831D01* +X000780Y010989D02* +X001024Y010989D01* +X001003Y011148D02* +X000780Y011148D01* +X000780Y011306D02* +X000809Y011306D01* +X000780Y011782D02* +X000792Y011782D01* +X000780Y011940D02* +X000925Y011940D01* +X000780Y012099D02* +X003695Y012099D01* +X003695Y012257D02* +X002144Y012257D01* +X002236Y012416D02* +X003695Y012416D01* +X003707Y012574D02* +X002260Y012574D01* +X002228Y012733D02* +X003675Y012733D01* +X003675Y012891D02* +X002124Y012891D01* +X002075Y011940D02* +X003695Y011940D01* +X003861Y011782D02* +X002208Y011782D01* +X002260Y011623D02* +X003792Y011623D01* +X003804Y011465D02* +X002257Y011465D01* +X002191Y011306D02* +X003902Y011306D01* +X004150Y011564D02* +X004150Y012240D01* +X004605Y012257D02* +X007141Y012257D01* +X007141Y012099D02* +X004605Y012099D01* +X004605Y011940D02* +X007141Y011940D01* +X007141Y011782D02* +X004439Y011782D01* +X004508Y011623D02* +X007141Y011623D01* +X007141Y011465D02* +X004496Y011465D01* +X004398Y011306D02* +X007141Y011306D01* +X007141Y011148D02* +X006713Y011148D01* +X006790Y010989D02* +X007141Y010989D01* +X007141Y010831D02* +X006790Y010831D01* +X006790Y010672D02* +X007141Y010672D01* +X007141Y010514D02* +X006790Y010514D01* +X006790Y010355D02* +X007141Y010355D01* +X007141Y010197D02* +X006790Y010197D01* +X006740Y010038D02* +X007141Y010038D01* +X007141Y009880D02* +X006740Y009880D01* +X006740Y009721D02* +X007141Y009721D01* +X007141Y009563D02* +X006740Y009563D01* +X006740Y009404D02* +X007141Y009404D01* +X007141Y009246D02* +X006740Y009246D01* +X006740Y009087D02* +X007141Y009087D01* +X007141Y008929D02* +X006740Y008929D01* +X006740Y008770D02* +X007141Y008770D01* +X007141Y008612D02* +X006740Y008612D01* +X006740Y008453D02* +X007141Y008453D01* +X007141Y008295D02* +X006859Y008295D01* +X007017Y008136D02* +X007141Y008136D01* +X006656Y007819D02* +X005984Y007819D01* +X005826Y007978D02* +X006497Y007978D01* +X006339Y008136D02* +X005667Y008136D01* +X005509Y008295D02* +X006260Y008295D01* +X006260Y008453D02* +X005350Y008453D01* +X005240Y008612D02* +X006260Y008612D01* +X006260Y008770D02* +X005240Y008770D01* +X005240Y008929D02* +X006260Y008929D01* +X006260Y009087D02* +X005240Y009087D01* +X005240Y009246D02* +X006260Y009246D01* +X006260Y009404D02* +X005240Y009404D01* +X005240Y009563D02* +X006260Y009563D01* +X006260Y009721D02* +X005240Y009721D01* +X004760Y009721D02* +X004590Y009721D01* +X004590Y009563D02* +X004760Y009563D01* +X004760Y009404D02* +X004673Y009404D01* +X004550Y009188D02* +X004174Y009564D01* +X004590Y009880D02* +X004760Y009880D01* +X004550Y009188D02* +X004550Y006114D01* +X004800Y005864D01* +X005004Y005864D01* +X004647Y005678D02* +X004647Y005548D01* +X004740Y005454D01* +X005267Y005454D01* +X005360Y005548D01* +X005360Y006181D01* +X005267Y006274D01* +X004790Y006274D01* +X004790Y006504D01* +X005267Y006504D01* +X005360Y006598D01* +X005360Y007231D01* +X005267Y007324D01* +X004790Y007324D01* +X004790Y008344D01* +X004797Y008328D01* +X005847Y007278D01* +X005914Y007211D01* +X006002Y007174D01* +X008320Y007174D01* +X008320Y006933D01* +X008678Y006933D01* +X008678Y006896D01* +X008320Y006896D01* +X008320Y006641D01* +X008332Y006595D01* +X008356Y006554D01* +X008389Y006520D01* +X008430Y006497D01* +X008476Y006484D01* +X008678Y006484D01* +X008678Y006896D01* +X008715Y006896D01* +X008715Y006933D01* +X009073Y006933D01* +X009073Y007174D01* +X009251Y007174D01* +X010337Y006088D01* +X010278Y006088D01* +X010262Y006104D01* +X009538Y006104D01* +X009445Y006011D01* +X009445Y005928D01* +X009276Y005928D01* +X009188Y005892D01* +X009064Y005768D01* +X009053Y005757D01* +X009053Y006181D01* +X008960Y006274D01* +X008433Y006274D01* +X008340Y006181D01* +X008340Y005548D01* +X008433Y005454D01* +X008960Y005454D01* +X008960Y005455D01* +X008960Y005274D01* +X008960Y005274D01* +X008433Y005274D01* +X008340Y005181D01* +X008340Y004548D01* +X008433Y004454D01* +X008960Y004454D01* +X009053Y004548D01* +X009053Y004627D01* +X009136Y004661D01* +X009203Y004728D01* +X009403Y004928D01* +X009428Y004988D01* +X009852Y004988D01* +X009852Y004892D01* +X009425Y004892D01* +X009425Y004661D01* +X009437Y004615D01* +X009461Y004574D01* +X009494Y004540D01* +X009535Y004517D01* +X009581Y004504D01* +X009589Y004504D01* +X009510Y004426D01* +X009510Y004311D01* +X009453Y004368D01* +X009321Y004422D01* +X009179Y004422D01* +X009047Y004368D01* +X008984Y004304D01* +X008899Y004304D01* +X008811Y004268D01* +X008767Y004224D01* +X008433Y004224D01* +X008340Y004131D01* +X008340Y003544D01* +X005360Y003544D01* +X005360Y004131D01* +X005267Y004224D01* +X004740Y004224D01* +X004647Y004131D01* +X004647Y003544D01* +X002937Y003544D01* +X002964Y003550D01* +X003397Y003801D01* +X003397Y003801D01* +X003738Y004168D01* +X003955Y004619D01* +X004030Y005114D01* +X003955Y005610D01* +X003738Y006061D01* +X003397Y006428D01* +X002964Y006678D01* +X002964Y006678D01* +X002476Y006790D01* +X002476Y006790D01* +X001976Y006752D01* +X001510Y006569D01* +X001118Y006257D01* +X000836Y005843D01* +X000780Y005660D01* +X000780Y008376D01* +X000810Y008304D01* +X000939Y008174D01* +X001108Y008104D01* +X001891Y008104D01* +X002061Y008174D01* +X002190Y008304D01* +X002198Y008324D01* +X003701Y008324D01* +X004060Y007965D01* +X004060Y005267D01* +X004097Y005178D01* +X004164Y005111D01* +X004497Y004778D01* +X004564Y004711D01* +X004647Y004677D01* +X004647Y004548D01* +X004740Y004454D01* +X005267Y004454D01* +X005360Y004548D01* +X005360Y005181D01* +X005267Y005274D01* +X004740Y005274D01* +X004710Y005244D01* +X004540Y005414D01* +X004540Y005785D01* +X004647Y005678D01* +X004647Y005600D02* +X004540Y005600D01* +X004540Y005442D02* +X008960Y005442D01* +X008960Y005283D02* +X004670Y005283D01* +X004309Y004966D02* +X004008Y004966D01* +X004030Y005114D02* +X004030Y005114D01* +X004028Y005125D02* +X004150Y005125D01* +X004060Y005283D02* +X004005Y005283D01* +X003981Y005442D02* +X004060Y005442D01* +X004060Y005600D02* +X003957Y005600D01* +X003883Y005759D02* +X004060Y005759D01* +X004060Y005917D02* +X003807Y005917D01* +X003738Y006061D02* +X003738Y006061D01* +X003724Y006076D02* +X004060Y006076D01* +X004060Y006234D02* +X003577Y006234D01* +X003430Y006393D02* +X004060Y006393D01* +X004060Y006551D02* +X003184Y006551D01* +X003397Y006428D02* +X003397Y006428D01* +X002825Y006710D02* +X004060Y006710D01* +X004060Y006868D02* +X000780Y006868D01* +X000780Y006710D02* +X001868Y006710D01* +X001976Y006752D02* +X001976Y006752D01* +X001510Y006569D02* +X001510Y006569D01* +X001488Y006551D02* +X000780Y006551D01* +X000780Y006393D02* +X001289Y006393D01* +X001118Y006257D02* +X001118Y006257D01* +X001118Y006257D01* +X001103Y006234D02* +X000780Y006234D01* +X000780Y006076D02* +X000995Y006076D01* +X000887Y005917D02* +X000780Y005917D01* +X000836Y005843D02* +X000836Y005843D01* +X000810Y005759D02* +X000780Y005759D01* +X000780Y007027D02* +X004060Y007027D01* +X004060Y007185D02* +X000780Y007185D01* +X000780Y007344D02* +X004060Y007344D01* +X004060Y007502D02* +X000780Y007502D01* +X000780Y007661D02* +X004060Y007661D01* +X004060Y007819D02* +X000780Y007819D01* +X000780Y007978D02* +X004047Y007978D01* +X003889Y008136D02* +X001969Y008136D01* +X002181Y008295D02* +X003730Y008295D01* +X003800Y008564D02* +X001500Y008564D01* +X001031Y008136D02* +X000780Y008136D01* +X000780Y008295D02* +X000819Y008295D01* +X001500Y009564D02* +X003426Y009564D01* +X003010Y009880D02* +X002135Y009880D01* +X002184Y010831D02* +X004710Y010831D01* +X004710Y010989D02* +X001976Y010989D01* +X001997Y011148D02* +X004787Y011148D01* +X005702Y010038D02* +X005797Y010038D01* +X004830Y008295D02* +X004790Y008295D01* +X004790Y008136D02* +X004989Y008136D01* +X005147Y007978D02* +X004790Y007978D01* +X004790Y007819D02* +X005306Y007819D01* +X005464Y007661D02* +X004790Y007661D01* +X004790Y007502D02* +X005623Y007502D01* +X005781Y007344D02* +X004790Y007344D01* +X005360Y007185D02* +X005976Y007185D01* +X006143Y007661D02* +X006814Y007661D01* +X005360Y007027D02* +X008320Y007027D01* +X008320Y006868D02* +X005360Y006868D01* +X005360Y006710D02* +X008320Y006710D01* +X008358Y006551D02* +X005314Y006551D01* +X005307Y006234D02* +X008393Y006234D01* +X008340Y006076D02* +X005360Y006076D01* +X005360Y005917D02* +X008340Y005917D01* +X008340Y005759D02* +X005360Y005759D01* +X005360Y005600D02* +X008340Y005600D01* +X008340Y005125D02* +X005360Y005125D01* +X005360Y004966D02* +X008340Y004966D01* +X008340Y004808D02* +X005360Y004808D01* +X005360Y004649D02* +X008340Y004649D01* +X008397Y004491D02* +X005303Y004491D01* +X005317Y004174D02* +X008383Y004174D01* +X008340Y004015D02* +X005360Y004015D01* +X005360Y003857D02* +X008340Y003857D01* +X008340Y003698D02* +X005360Y003698D01* +X004647Y003698D02* +X003220Y003698D01* +X003449Y003857D02* +X004647Y003857D01* +X004647Y004015D02* +X003596Y004015D01* +X003738Y004168D02* +X003738Y004168D01* +X003741Y004174D02* +X004690Y004174D01* +X004704Y004491D02* +X003894Y004491D01* +X003955Y004619D02* +X003955Y004619D01* +X003960Y004649D02* +X004647Y004649D01* +X004467Y004808D02* +X003984Y004808D01* +X003817Y004332D02* +X009012Y004332D01* +X008996Y004491D02* +X009575Y004491D01* +X009510Y004332D02* +X009488Y004332D01* +X009250Y004064D02* +X008946Y004064D01* +X008696Y003814D01* +X009053Y003758D02* +X009053Y003544D01* +X020126Y003544D01* +X019960Y003609D01* +X019960Y003609D01* +X019568Y003922D01* +X019650Y003857D02* +X014732Y003857D01* +X014732Y003698D02* +X019848Y003698D01* +X019397Y004174D02* +X018704Y004174D01* +X018710Y004195D02* +X018710Y004466D01* +X018322Y004466D01* +X018322Y004039D01* +X018554Y004039D01* +X018599Y004051D01* +X018640Y004075D01* +X018674Y004109D01* +X018698Y004150D01* +X018710Y004195D01* +X018710Y004332D02* +X019288Y004332D01* +X019238Y004491D02* +X018322Y004491D01* +X018322Y004466D02* +X018322Y004562D01* +X018710Y004562D01* +X018710Y004833D01* +X018698Y004879D01* +X018674Y004920D01* +X018640Y004954D01* +X018599Y004977D01* +X018554Y004990D01* +X018322Y004990D01* +X018322Y004562D01* +X018226Y004562D01* +X018226Y004990D01* +X017994Y004990D01* +X017949Y004977D01* +X017908Y004954D01* +X017886Y004932D01* +X017848Y004970D01* +X017204Y004970D01* +X017110Y004876D01* +X017110Y004754D01* +X017010Y004754D01* +X017010Y004817D01* +X016916Y004911D01* +X016311Y004911D01* +X016217Y004817D01* +X016217Y004212D01* +X016311Y004118D01* +X016916Y004118D01* +X017010Y004212D01* +X017010Y004274D01* +X017110Y004274D01* +X017110Y004153D01* +X017204Y004059D01* +X017848Y004059D01* +X017886Y004097D01* +X017908Y004075D01* +X017949Y004051D01* +X017994Y004039D01* +X018226Y004039D01* +X018226Y004466D01* +X018322Y004466D01* +X018322Y004332D02* +X018226Y004332D01* +X018226Y004174D02* +X018322Y004174D01* +X018322Y004649D02* +X018226Y004649D01* +X018226Y004808D02* +X018322Y004808D01* +X018322Y004966D02* +X018226Y004966D01* +X017930Y004966D02* +X017851Y004966D01* +X017526Y004514D02* +X016613Y004514D01* +X016217Y004491D02* +X016183Y004491D01* +X016183Y004649D02* +X016217Y004649D01* +X016217Y004808D02* +X016183Y004808D01* +X016670Y005096D02* +X016758Y005133D01* +X018836Y007211D01* +X018903Y007278D01* +X018940Y007367D01* +X018940Y010512D01* +X018903Y010600D01* +X018634Y010870D01* +X018637Y010877D01* +X018637Y011051D01* +X018571Y011212D01* +X018448Y011335D01* +X018287Y011401D01* +X018113Y011401D01* +X017952Y011335D01* +X017829Y011212D01* +X017818Y011185D01* +X017634Y011370D01* +X017637Y011377D01* +X017637Y011551D01* +X017571Y011712D01* +X017448Y011835D01* +X017287Y011901D01* +X017113Y011901D01* +X016952Y011835D01* +X016829Y011712D01* +X016763Y011551D01* +X016763Y011377D01* +X016829Y011217D01* +X016952Y011094D01* +X017113Y011027D01* +X017287Y011027D01* +X017295Y011030D01* +X017460Y010865D01* +X017460Y010823D01* +X017448Y010835D01* +X017287Y010901D01* +X017113Y010901D01* +X016952Y010835D01* +X016829Y010712D01* +X016763Y010551D01* +X016763Y010377D01* +X016829Y010217D01* +X016952Y010094D01* +X017113Y010027D01* +X017287Y010027D01* +X017448Y010094D01* +X017460Y010106D01* +X017460Y009823D01* +X017448Y009835D01* +X017287Y009901D01* +X017113Y009901D01* +X016952Y009835D01* +X016829Y009712D01* +X016763Y009551D01* +X016763Y009377D01* +X016829Y009217D01* +X016952Y009094D01* +X016960Y009091D01* +X016960Y008914D01* +X016651Y008604D01* +X015840Y008604D01* +X015840Y008726D01* +X015746Y008820D01* +X015102Y008820D01* +X015064Y008782D01* +X015042Y008804D01* +X015001Y008827D01* +X014956Y008840D01* +X014724Y008840D01* +X014724Y008412D01* +X014628Y008412D01* +X014628Y008316D01* +X014240Y008316D01* +X014240Y008045D01* +X014252Y008000D01* +X014276Y007959D01* +X014310Y007925D01* +X014345Y007904D01* +X013152Y007904D01* +X013064Y007868D01* +X012997Y007800D01* +X012564Y007368D01* +X011375Y007368D01* +X011372Y007366D01* +X011061Y007366D01* +X010968Y007273D01* +X010968Y006604D01* +X010849Y006604D01* +X009625Y007828D01* +X011465Y007828D01* +X011559Y007922D01* +X011559Y012307D01* +X011559Y012099D02* +X013755Y012099D01* +X013758Y011940D02* +X011559Y011940D01* +X011559Y011782D02* +X012096Y011782D01* +X012139Y011824D02* +X012045Y011731D01* +X012045Y011178D01* +X012090Y011133D01* +X012061Y011105D01* +X012037Y011064D01* +X012025Y011018D01* +X012025Y010809D01* +X012605Y010809D01* +X012605Y010759D01* +X012025Y010759D01* +X012025Y010551D01* +X012037Y010505D01* +X012061Y010464D01* +X012090Y010435D01* +X012045Y010391D01* +X012045Y009838D01* +X012104Y009779D01* +X012045Y009721D01* +X012045Y009168D01* +X012104Y009109D01* +X012045Y009051D01* +X012045Y008498D01* +X012139Y008404D01* +X013121Y008404D01* +X013201Y008484D01* +X013324Y008484D01* +X013347Y008461D01* +X013479Y008406D01* +X013621Y008406D01* +X013753Y008461D01* +X013854Y008561D01* +X013908Y008693D01* +X013908Y008836D01* +X013876Y008913D01* +X014986Y008913D01* +X015079Y009006D01* +X015079Y009887D01* +X014986Y009981D01* +X013682Y009981D01* +X013708Y010043D01* +X013708Y010186D01* +X013654Y010317D01* +X013553Y010418D01* +X013421Y010472D01* +X013279Y010472D01* +X013176Y010430D01* +X013170Y010435D01* +X013199Y010464D01* +X013223Y010505D01* +X013235Y010551D01* +X013235Y010759D01* +X012655Y010759D01* +X012655Y010809D01* +X013235Y010809D01* +X013235Y011018D01* +X013223Y011064D01* +X013199Y011105D01* +X013176Y011128D01* +X013229Y011106D01* +X013371Y011106D01* +X013401Y011118D01* +X013401Y011062D01* +X014170Y011062D01* +X014170Y010902D01* +X014330Y010902D01* +X014330Y010428D01* +X014943Y010428D01* +X014989Y010440D01* +X015030Y010464D01* +X015063Y010498D01* +X015087Y010539D01* +X015099Y010584D01* +X015099Y010902D01* +X014330Y010902D01* +X014330Y011062D01* +X015099Y011062D01* +X015099Y011380D01* +X015087Y011426D01* +X015063Y011467D01* +X015030Y011500D01* +X014989Y011524D01* +X014943Y011536D01* +X014330Y011536D01* +X014330Y011062D01* +X014170Y011062D01* +X014170Y011536D01* +X013658Y011536D01* +X013604Y011667D01* +X013503Y011768D01* +X013371Y011822D01* +X013229Y011822D01* +X013154Y011792D01* +X013121Y011824D01* +X012139Y011824D01* +X012045Y011623D02* +X011559Y011623D01* +X011559Y011465D02* +X012045Y011465D01* +X012045Y011306D02* +X011559Y011306D01* +X011559Y011148D02* +X012075Y011148D01* +X012025Y010989D02* +X011559Y010989D01* +X011559Y010831D02* +X012025Y010831D01* +X012025Y010672D02* +X011559Y010672D01* +X011559Y010514D02* +X012035Y010514D01* +X012045Y010355D02* +X011559Y010355D01* +X011559Y010197D02* +X012045Y010197D01* +X012045Y010038D02* +X011559Y010038D01* +X011559Y009880D02* +X012045Y009880D01* +X012046Y009721D02* +X011559Y009721D01* +X011559Y009563D02* +X012045Y009563D01* +X012045Y009404D02* +X011559Y009404D01* +X011559Y009246D02* +X012045Y009246D01* +X012082Y009087D02* +X011559Y009087D01* +X011559Y008929D02* +X012045Y008929D01* +X012045Y008770D02* +X011559Y008770D01* +X011559Y008612D02* +X012045Y008612D01* +X012090Y008453D02* +X011559Y008453D01* +X011559Y008295D02* +X014240Y008295D01* +X014240Y008412D02* +X014628Y008412D01* +X014628Y008840D01* +X014396Y008840D01* +X014351Y008827D01* +X014310Y008804D01* +X014276Y008770D01* +X014252Y008729D01* +X014240Y008683D01* +X014240Y008412D01* +X014240Y008453D02* +X013735Y008453D01* +X013874Y008612D02* +X014240Y008612D01* +X014276Y008770D02* +X013908Y008770D01* +X013365Y008453D02* +X013170Y008453D01* +X013016Y007819D02* +X009634Y007819D01* +X009793Y007661D02* +X012857Y007661D01* +X012699Y007502D02* +X009951Y007502D01* +X010110Y007344D02* +X011039Y007344D01* +X010968Y007185D02* +X010268Y007185D01* +X010427Y007027D02* +X010968Y007027D01* +X010968Y006868D02* +X010585Y006868D01* +X010744Y006710D02* +X010968Y006710D01* +X011423Y007128D02* +X012663Y007128D01* +X013200Y007664D01* +X015250Y007664D01* +X015424Y007838D01* +X015424Y008364D01* +X016750Y008364D01* +X017200Y008814D01* +X017200Y009464D01* +X016817Y009246D02* +X015079Y009246D01* +X015079Y009404D02* +X016763Y009404D01* +X016768Y009563D02* +X015079Y009563D01* +X015079Y009721D02* +X016839Y009721D01* +X017061Y009880D02* +X015079Y009880D01* +X015073Y010514D02* +X016763Y010514D01* +X016772Y010355D02* +X013615Y010355D01* +X013557Y010428D02* +X014170Y010428D01* +X014170Y010902D01* +X013401Y010902D01* +X013401Y010584D01* +X013413Y010539D01* +X013437Y010498D01* +X013470Y010464D01* +X013511Y010440D01* +X013557Y010428D01* +X013427Y010514D02* +X013225Y010514D01* +X013235Y010672D02* +X013401Y010672D01* +X013401Y010831D02* +X013235Y010831D01* +X013235Y010989D02* +X014170Y010989D01* +X014170Y010831D02* +X014330Y010831D01* +X014330Y010989D02* +X017336Y010989D01* +X017452Y010831D02* +X017460Y010831D01* +X017700Y010964D02* +X017200Y011464D01* +X016792Y011306D02* +X015099Y011306D01* +X015099Y011148D02* +X016898Y011148D01* +X016948Y010831D02* +X015099Y010831D01* +X015099Y010672D02* +X016813Y010672D01* +X016849Y010197D02* +X013703Y010197D01* +X013706Y010038D02* +X017086Y010038D01* +X017314Y010038D02* +X017460Y010038D01* +X017460Y009880D02* +X017339Y009880D01* +X017940Y009588D02* +X017960Y009573D01* +X018025Y009541D01* +X018093Y009518D01* +X018164Y009507D01* +X018191Y009507D01* +X018191Y009956D01* +X018209Y009956D01* +X018209Y009507D01* +X018236Y009507D01* +X018307Y009518D01* +X018375Y009541D01* +X018440Y009573D01* +X018460Y009588D01* +X018460Y007514D01* +X017940Y006994D01* +X017940Y009588D01* +X017940Y009563D02* +X017981Y009563D01* +X017940Y009404D02* +X018460Y009404D01* +X018460Y009246D02* +X017940Y009246D01* +X017940Y009087D02* +X018460Y009087D01* +X018460Y008929D02* +X017940Y008929D01* +X017940Y008770D02* +X018460Y008770D01* +X018460Y008612D02* +X017940Y008612D01* +X017940Y008453D02* +X018460Y008453D01* +X018460Y008295D02* +X017940Y008295D01* +X017940Y008136D02* +X018460Y008136D01* +X018460Y007978D02* +X017940Y007978D01* +X017940Y007819D02* +X018460Y007819D01* +X018460Y007661D02* +X017940Y007661D01* +X017940Y007502D02* +X018449Y007502D01* +X018290Y007344D02* +X017940Y007344D01* +X017940Y007185D02* +X018132Y007185D01* +X017973Y007027D02* +X017940Y007027D01* +X017700Y006814D02* +X017700Y010964D01* +X017697Y011306D02* +X017924Y011306D01* +X017952Y011594D02* +X018113Y011527D01* +X018287Y011527D01* +X018448Y011594D01* +X018571Y011717D01* +X018637Y011877D01* +X018637Y012051D01* +X018571Y012212D01* +X018448Y012335D01* +X018287Y012401D01* +X018113Y012401D01* +X017952Y012335D01* +X017829Y012212D01* +X017763Y012051D01* +X017763Y011877D01* +X017829Y011717D01* +X017952Y011594D01* +X017923Y011623D02* +X017607Y011623D01* +X017637Y011465D02* +X022320Y011465D01* +X022320Y011623D02* +X020956Y011623D01* +X020847Y011594D02* +X021132Y011671D01* +X021388Y011818D01* +X021596Y012027D01* +X021744Y012282D01* +X021820Y012567D01* +X021820Y012862D01* +X021744Y013147D01* +X021596Y013402D01* +X021388Y013611D01* +X021132Y013758D01* +X020847Y013834D01* +X020553Y013834D01* +X020268Y013758D01* +X020012Y013611D01* +X019804Y013402D01* +X019656Y013147D01* +X019580Y012862D01* +X019580Y012567D01* +X019656Y012282D01* +X019804Y012027D01* +X020012Y011818D01* +X020268Y011671D01* +X020553Y011594D01* +X020847Y011594D01* +X020444Y011623D02* +X018477Y011623D01* +X018598Y011782D02* +X020075Y011782D01* +X019890Y011940D02* +X018637Y011940D01* +X018617Y012099D02* +X019762Y012099D01* +X019671Y012257D02* +X018525Y012257D01* +X017875Y012257D02* +X014745Y012257D01* +X014745Y012099D02* +X017783Y012099D01* +X017763Y011940D02* +X014742Y011940D01* +X014327Y011940D02* +X014173Y011940D01* +X014173Y012099D02* +X014327Y012099D01* +X014327Y012257D02* +X014173Y012257D01* +X014173Y012416D02* +X014327Y012416D01* +X014327Y012574D02* +X014173Y012574D01* +X014327Y012733D02* +X019580Y012733D01* +X019588Y012891D02* +X014745Y012891D01* +X014745Y013050D02* +X019630Y013050D01* +X019692Y013208D02* +X014745Y013208D01* +X014745Y013367D02* +X019783Y013367D01* +X019927Y013525D02* +X014745Y013525D01* +X014607Y013684D02* +X020139Y013684D01* +X021261Y013684D02* +X022320Y013684D01* +X022320Y013842D02* +X010475Y013842D01* +X010475Y014001D02* +X022320Y014001D01* +X022320Y014159D02* +X010475Y014159D01* +X010475Y014318D02* +X022320Y014318D01* +X022320Y014476D02* +X021308Y014476D01* +X021647Y014635D02* +X022320Y014635D01* +X022320Y014793D02* +X021887Y014793D01* +X021847Y014751D02* +X021847Y014751D01* +X022034Y014952D02* +X022320Y014952D01* +X022320Y015110D02* +X022181Y015110D01* +X022261Y015269D02* +X022320Y015269D01* +X020299Y014476D02* +X009330Y014476D01* +X009330Y014318D02* +X009525Y014318D01* +X009525Y014159D02* +X009330Y014159D01* +X009409Y014001D02* +X009525Y014001D01* +X008935Y013684D02* +X006858Y013684D01* +X006835Y013842D02* +X008797Y013842D01* +X008770Y014001D02* +X006720Y014001D01* +X006496Y014159D02* +X008770Y014159D01* +X008770Y014318D02* +X006540Y014318D01* +X006540Y014476D02* +X008770Y014476D01* +X008770Y014635D02* +X006540Y014635D01* +X006540Y014793D02* +X008770Y014793D01* +X008770Y014952D02* +X006514Y014952D01* +X006385Y015110D02* +X008770Y015110D01* +X008770Y015269D02* +X006544Y015269D01* +X006590Y015427D02* +X008770Y015427D01* +X008770Y015586D02* +X006590Y015586D01* +X006590Y015744D02* +X008770Y015744D01* +X008770Y015903D02* +X006590Y015903D01* +X006590Y016061D02* +X008770Y016061D01* +X008770Y016220D02* +X007479Y016220D01* +X007221Y016220D02* +X006590Y016220D01* +X006715Y016378D02* +X006985Y016378D01* +X006905Y016537D02* +X006795Y016537D01* +X006810Y016695D02* +X006890Y016695D01* +X006890Y016854D02* +X006810Y016854D01* +X006810Y017012D02* +X006890Y017012D01* +X006890Y017171D02* +X006810Y017171D01* +X006810Y017329D02* +X006890Y017329D01* +X006945Y017488D02* +X006755Y017488D01* +X006350Y016964D02* +X006350Y015414D01* +X006100Y015164D01* +X006100Y014588D01* +X006124Y014564D01* +X006000Y014490D01* +X006000Y013024D01* +X005500Y013024D02* +X005500Y014440D01* +X005376Y014564D01* +X005350Y014590D01* +X005350Y016964D01* +X004890Y017012D02* +X003687Y017012D01* +X003688Y017011D02* +X003688Y017011D01* +X003764Y016854D02* +X004890Y016854D01* +X004890Y016695D02* +X003840Y016695D01* +X003905Y016560D02* +X003905Y016560D01* +X003909Y016537D02* +X004905Y016537D01* +X004985Y016378D02* +X003933Y016378D01* +X003957Y016220D02* +X005110Y016220D01* +X005110Y016061D02* +X003980Y016061D01* +X003980Y016064D02* +X003980Y016064D01* +X003956Y015903D02* +X005110Y015903D01* +X005110Y015744D02* +X003932Y015744D01* +X003908Y015586D02* +X005110Y015586D01* +X005110Y015427D02* +X003837Y015427D01* +X003761Y015269D02* +X005110Y015269D01* +X005110Y015110D02* +X003681Y015110D01* +X003688Y015118D02* +X003688Y015118D01* +X003534Y014952D02* +X004986Y014952D01* +X004960Y014793D02* +X003387Y014793D01* +X003347Y014751D02* +X003347Y014751D01* +X003147Y014635D02* +X004960Y014635D01* +X004960Y014476D02* +X002808Y014476D01* +X002914Y014500D02* +X002914Y014500D01* +X002426Y014389D02* +X002426Y014389D01* +X001926Y014426D02* +X001926Y014426D01* +X001799Y014476D02* +X000780Y014476D01* +X000780Y014318D02* +X004960Y014318D01* +X005004Y014159D02* +X000780Y014159D01* +X000780Y014001D02* +X005260Y014001D01* +X005260Y013842D02* +X000780Y013842D01* +X000780Y013684D02* +X005260Y013684D01* +X005000Y013604D02* +X005000Y013024D01* +X005000Y013604D01* +X005000Y013525D02* +X005000Y013525D01* +X005000Y013367D02* +X005000Y013367D01* +X005000Y013208D02* +X005000Y013208D01* +X005000Y013050D02* +X005000Y013050D01* +X005000Y013024D02* +X005000Y013024D01* +X005000Y012891D02* +X005000Y012891D01* +X005000Y012733D02* +X005000Y012733D01* +X005000Y012574D02* +X005000Y012574D01* +X003675Y013050D02* +X000780Y013050D01* +X000780Y013208D02* +X003675Y013208D01* +X001460Y014609D02* +X001460Y014609D01* +X001428Y014635D02* +X000780Y014635D01* +X000780Y014793D02* +X001229Y014793D01* +X001048Y014952D02* +X000780Y014952D01* +X000780Y015110D02* +X000940Y015110D01* +X000832Y015269D02* +X000780Y015269D01* +X000786Y015335D02* +X000786Y015335D01* +X003347Y017378D02* +X003347Y017378D01* +X003392Y017329D02* +X004890Y017329D01* +X004890Y017171D02* +X003539Y017171D01* +X003157Y017488D02* +X004945Y017488D01* +X007755Y017488D02* +X008978Y017488D01* +X008819Y017329D02* +X007810Y017329D01* +X007810Y017171D02* +X008770Y017171D01* +X008770Y017012D02* +X007810Y017012D01* +X007810Y016854D02* +X008770Y016854D01* +X008770Y016695D02* +X007810Y016695D01* +X007795Y016537D02* +X008770Y016537D01* +X008770Y016378D02* +X007715Y016378D01* +X009330Y016378D02* +X009525Y016378D01* +X009525Y016220D02* +X009330Y016220D01* +X009330Y016061D02* +X009525Y016061D01* +X009525Y015903D02* +X009330Y015903D01* +X009330Y015744D02* +X009525Y015744D01* +X009525Y015586D02* +X009330Y015586D01* +X009330Y015427D02* +X009525Y015427D01* +X009676Y015269D02* +X009330Y015269D01* +X009330Y015110D02* +X009642Y015110D01* +X009680Y014952D02* +X009330Y014952D01* +X009330Y014793D02* +X009839Y014793D01* +X010161Y014793D02* +X013933Y014793D01* +X013946Y014761D02* +X014047Y014661D01* +X014179Y014606D01* +X014321Y014606D01* +X014453Y014661D01* +X014554Y014761D01* +X014608Y014893D01* +X014608Y015036D01* +X014557Y015160D01* +X014631Y015160D01* +X014725Y015254D01* +X014725Y016922D01* +X014631Y017015D01* +X013869Y017015D01* +X013775Y016922D01* +X013775Y015254D01* +X013869Y015160D01* +X013943Y015160D01* +X013892Y015036D01* +X013892Y014893D01* +X013946Y014761D01* +X013892Y014952D02* +X010320Y014952D01* +X010358Y015110D02* +X013923Y015110D01* +X013775Y015269D02* +X010324Y015269D01* +X010475Y015427D02* +X013775Y015427D01* +X013775Y015586D02* +X010475Y015586D01* +X010475Y015744D02* +X013775Y015744D01* +X013775Y015903D02* +X010475Y015903D01* +X010475Y016061D02* +X013775Y016061D01* +X013775Y016220D02* +X010494Y016220D01* +X010475Y016378D02* +X013775Y016378D01* +X013775Y016537D02* +X010475Y016537D01* +X010475Y016695D02* +X013775Y016695D01* +X013775Y016854D02* +X010475Y016854D01* +X010475Y017012D02* +X013866Y017012D01* +X014634Y017012D02* +X016406Y017012D01* +X016564Y016854D02* +X014725Y016854D01* +X014725Y016695D02* +X016723Y016695D01* +X016890Y016537D02* +X014725Y016537D01* +X014725Y016378D02* +X016908Y016378D01* +X016994Y016220D02* +X014725Y016220D01* +X014725Y016061D02* +X017242Y016061D01* +X017458Y016061D02* +X018242Y016061D01* +X018258Y016054D02* +X018441Y016054D01* +X018611Y016124D01* +X018740Y016254D01* +X018810Y016423D01* +X018810Y017206D01* +X018740Y017375D01* +X018611Y017504D01* +X018441Y017574D01* +X018258Y017574D01* +X018089Y017504D01* +X017960Y017375D01* +X017890Y017206D01* +X017890Y016423D01* +X017960Y016254D01* +X018089Y016124D01* +X018258Y016054D01* +X018458Y016061D02* +X019139Y016061D01* +X019139Y015903D02* +X014725Y015903D01* +X014725Y015744D02* +X019160Y015744D01* +X019209Y015586D02* +X014725Y015586D01* +X014725Y015427D02* +X019258Y015427D01* +X019332Y015269D02* +X014725Y015269D01* +X014577Y015110D02* +X019440Y015110D01* +X019548Y014952D02* +X014608Y014952D01* +X014567Y014793D02* +X019729Y014793D01* +X019928Y014635D02* +X014390Y014635D01* +X014110Y014635D02* +X009330Y014635D01* +X010000Y015114D02* +X010000Y016262D01* +X010250Y016214D01* +X009525Y016537D02* +X009330Y016537D01* +X009330Y016695D02* +X009525Y016695D01* +X009525Y016854D02* +X009330Y016854D01* +X009330Y017012D02* +X009525Y017012D01* +X006280Y014001D02* +X006240Y014001D01* +X006500Y013714D02* +X006500Y013024D01* +X006790Y013050D02* +X009525Y013050D01* +X009525Y013208D02* +X006790Y013208D01* +X006790Y013367D02* +X009252Y013367D01* +X009093Y013525D02* +X006809Y013525D01* +X006790Y012891D02* +X009525Y012891D01* +X009525Y012733D02* +X006790Y012733D01* +X006790Y012574D02* +X009564Y012574D01* +X010475Y012891D02* +X011417Y012891D01* +X011310Y013050D02* +X010475Y013050D01* +X012630Y011454D02* +X013290Y011454D01* +X013300Y011464D01* +X013622Y011623D02* +X016793Y011623D01* +X016763Y011465D02* +X015064Y011465D01* +X014330Y011465D02* +X014170Y011465D01* +X014170Y011306D02* +X014330Y011306D01* +X014330Y011148D02* +X014170Y011148D01* +X014170Y010672D02* +X014330Y010672D01* +X014330Y010514D02* +X014170Y010514D01* +X013350Y010114D02* +X012630Y010114D01* +X013469Y011782D02* +X016899Y011782D01* +X017501Y011782D02* +X017802Y011782D01* +X018476Y011306D02* +X022320Y011306D01* +X022320Y011148D02* +X018597Y011148D01* +X018637Y010989D02* +X022320Y010989D01* +X022320Y010831D02* +X018673Y010831D01* +X018831Y010672D02* +X022320Y010672D01* +X022320Y010514D02* +X018939Y010514D01* +X018940Y010355D02* +X022320Y010355D01* +X022320Y010197D02* +X018940Y010197D01* +X018940Y010038D02* +X022320Y010038D01* +X022320Y009880D02* +X018940Y009880D01* +X018940Y009721D02* +X020204Y009721D01* +X020268Y009758D02* +X020012Y009611D01* +X019804Y009402D01* +X019656Y009147D01* +X019580Y008862D01* +X019580Y008567D01* +X019656Y008282D01* +X019804Y008027D01* +X020012Y007818D01* +X020268Y007671D01* +X020553Y007594D01* +X020847Y007594D01* +X021132Y007671D01* +X021388Y007818D01* +X021596Y008027D01* +X021744Y008282D01* +X021820Y008567D01* +X021820Y008862D01* +X021744Y009147D01* +X021596Y009402D01* +X021388Y009611D01* +X021132Y009758D01* +X020847Y009834D01* +X020553Y009834D01* +X020268Y009758D01* +X019965Y009563D02* +X018940Y009563D01* +X018940Y009404D02* +X019806Y009404D01* +X019714Y009246D02* +X018940Y009246D01* +X018940Y009087D02* +X019640Y009087D01* +X019598Y008929D02* +X018940Y008929D01* +X018940Y008770D02* +X019580Y008770D01* +X019580Y008612D02* +X018940Y008612D01* +X018940Y008453D02* +X019610Y008453D01* +X019653Y008295D02* +X018940Y008295D01* +X018940Y008136D02* +X019740Y008136D01* +X019853Y007978D02* +X018940Y007978D01* +X018940Y007819D02* +X020011Y007819D01* +X020304Y007661D02* +X018940Y007661D01* +X018940Y007502D02* +X022320Y007502D01* +X022320Y007344D02* +X018931Y007344D01* +X018810Y007185D02* +X022320Y007185D01* +X022320Y007027D02* +X018652Y007027D01* +X018493Y006868D02* +X022320Y006868D01* +X022320Y006710D02* +X021056Y006710D01* +X021547Y006551D02* +X022320Y006551D01* +X022320Y006393D02* +X021821Y006393D01* +X021981Y006234D02* +X022320Y006234D01* +X022320Y006076D02* +X022128Y006076D01* +X022233Y005917D02* +X022320Y005917D01* +X022309Y005759D02* +X022320Y005759D01* +X020528Y006710D02* +X018335Y006710D01* +X018176Y006551D02* +X020042Y006551D01* +X019801Y006393D02* +X018018Y006393D01* +X017859Y006234D02* +X019603Y006234D01* +X019479Y006076D02* +X017701Y006076D01* +X017542Y005917D02* +X019371Y005917D01* +X019276Y005759D02* +X017384Y005759D01* +X017225Y005600D02* +X019227Y005600D01* +X019178Y005442D02* +X017067Y005442D01* +X016908Y005283D02* +X019139Y005283D01* +X019139Y005125D02* +X016738Y005125D01* +X016670Y005096D02* +X014732Y005096D01* +X014732Y003656D01* +X014639Y003562D01* +X013916Y003562D01* +X013822Y003656D01* +X013822Y006632D01* +X013774Y006632D01* +X013703Y006561D01* +X013571Y006506D01* +X013429Y006506D01* +X013297Y006561D01* +X013196Y006661D01* +X013142Y006793D01* +X013142Y006936D01* +X013196Y007067D01* +X013297Y007168D01* +X013429Y007222D01* +X013571Y007222D01* +X013703Y007168D01* +X013759Y007112D01* +X013802Y007112D01* +X013802Y007128D01* +X014277Y007128D01* +X014277Y007386D01* +X013958Y007386D01* +X013912Y007374D01* +X013871Y007350D01* +X013838Y007317D01* +X013814Y007276D01* +X013802Y007230D01* +X013802Y007128D01* +X014277Y007128D01* +X014277Y007128D01* +X014277Y007128D01* +X014277Y007386D01* +X014592Y007386D01* +X014594Y007388D01* +X014635Y007412D01* +X014681Y007424D01* +X014952Y007424D01* +X014952Y007036D01* +X015048Y007036D01* +X015475Y007036D01* +X015475Y007268D01* +X015463Y007314D01* +X015439Y007355D01* +X015406Y007388D01* +X015365Y007412D01* +X015319Y007424D01* +X015048Y007424D01* +X015048Y007036D01* +X015048Y006940D01* +X015475Y006940D01* +X015475Y006709D01* +X015463Y006663D01* +X015439Y006622D01* +X015418Y006600D01* +X015449Y006569D01* +X015579Y006622D01* +X015721Y006622D01* +X015853Y006568D01* +X015954Y006467D01* +X016008Y006336D01* +X016008Y006193D01* +X015954Y006061D01* +X015853Y005961D01* +X015721Y005906D01* +X015579Y005906D01* +X015455Y005957D01* +X015455Y005918D01* +X015369Y005832D01* +X016379Y005832D01* +X017460Y006914D01* +X017460Y009106D01* +X017448Y009094D01* +X017440Y009091D01* +X017440Y008767D01* +X017403Y008678D01* +X017336Y008611D01* +X016886Y008161D01* +X016798Y008124D01* +X015840Y008124D01* +X015840Y008003D01* +X015746Y007909D01* +X015664Y007909D01* +X015664Y007791D01* +X015627Y007702D01* +X015453Y007528D01* +X015453Y007528D01* +X015386Y007461D01* +X015298Y007424D01* +X013299Y007424D01* +X012799Y006924D01* +X012711Y006888D01* +X011878Y006888D01* +X011878Y005599D01* +X011897Y005618D01* +X012029Y005672D01* +X012171Y005672D01* +X012303Y005618D01* +X012404Y005517D01* +X012458Y005386D01* +X012458Y005243D01* +X012404Y005111D01* +X012303Y005011D01* +X012171Y004956D01* +X012029Y004956D01* +X011897Y005011D01* +X011878Y005030D01* +X011878Y004218D01* +X011886Y004205D01* +X011898Y004159D01* +X011898Y004057D01* +X011423Y004057D01* +X011423Y004057D01* +X011898Y004057D01* +X011898Y003954D01* +X011886Y003909D01* +X011878Y003895D01* +X011878Y003656D01* +X011784Y003562D01* +X011061Y003562D01* +X011014Y003610D01* +X010999Y003601D01* +X010954Y003589D01* +X010722Y003589D01* +X010722Y004016D01* +X010626Y004016D01* +X010626Y003589D01* +X010394Y003589D01* +X010349Y003601D01* +X010308Y003625D01* +X010286Y003647D01* +X010248Y003609D01* +X009604Y003609D01* +X009510Y003703D01* +X009510Y003818D01* +X009453Y003761D01* +X009321Y003706D01* +X009179Y003706D01* +X009053Y003758D01* +X009053Y003698D02* +X009515Y003698D01* +X009250Y004064D02* +X009926Y004064D01* +X010286Y004482D02* +X010254Y004514D01* +X010265Y004517D01* +X010306Y004540D01* +X010339Y004574D01* +X010363Y004615D01* +X010375Y004661D01* +X010375Y004892D01* +X009948Y004892D01* +X009948Y004988D01* +X010375Y004988D01* +X010375Y005220D01* +X010363Y005266D01* +X010339Y005307D01* +X010318Y005328D01* +X010355Y005366D01* +X010355Y005608D01* +X010968Y005608D01* +X010968Y005481D01* +X010968Y004536D01* +X010954Y004540D01* +X010722Y004540D01* +X010722Y004112D01* +X010948Y004112D01* +X010948Y004057D01* +X011423Y004057D01* +X011406Y004040D01* +X010674Y004064D01* +X010722Y004016D02* +X010722Y004112D01* +X010626Y004112D01* +X010626Y004540D01* +X010394Y004540D01* +X010349Y004527D01* +X010308Y004504D01* +X010286Y004482D01* +X010277Y004491D02* +X010295Y004491D01* +X010372Y004649D02* +X010968Y004649D01* +X010968Y004808D02* +X010375Y004808D01* +X010375Y005125D02* +X010968Y005125D01* +X010968Y005283D02* +X010353Y005283D01* +X010355Y005442D02* +X010968Y005442D01* +X010968Y005600D02* +X010355Y005600D01* +X010060Y005848D02* +X009900Y005688D01* +X009324Y005688D01* +X009200Y005564D01* +X009200Y005064D01* +X009000Y004864D01* +X008696Y004864D01* +X009108Y004649D02* +X009428Y004649D01* +X009425Y004808D02* +X009283Y004808D01* +X009419Y004966D02* +X009852Y004966D01* +X009948Y004966D02* +X010968Y004966D01* +X011423Y005336D02* +X011445Y005314D01* +X012100Y005314D01* +X011880Y005600D02* +X011878Y005600D01* +X011878Y005759D02* +X013822Y005759D01* +X013822Y005917D02* +X011878Y005917D01* +X011878Y006076D02* +X013822Y006076D01* +X013822Y006234D02* +X011878Y006234D01* +X011878Y006393D02* +X013822Y006393D01* +X013822Y006551D02* +X013680Y006551D01* +X013320Y006551D02* +X011878Y006551D01* +X011878Y006710D02* +X013176Y006710D01* +X013142Y006868D02* +X011878Y006868D01* +X012902Y007027D02* +X013180Y007027D01* +X013060Y007185D02* +X013339Y007185D01* +X013219Y007344D02* +X013865Y007344D01* +X013802Y007185D02* +X013661Y007185D01* +X013507Y006872D02* +X013500Y006864D01* +X013507Y006872D02* +X014277Y006872D01* +X014277Y007128D02* +X014861Y007128D01* +X015000Y006988D01* +X015048Y007027D02* +X017460Y007027D01* +X017460Y007185D02* +X015475Y007185D01* +X015446Y007344D02* +X017460Y007344D01* +X017460Y007502D02* +X015427Y007502D01* +X015586Y007661D02* +X017460Y007661D01* +X017460Y007819D02* +X015664Y007819D01* +X015815Y007978D02* +X017460Y007978D01* +X017460Y008136D02* +X016827Y008136D01* +X017020Y008295D02* +X017460Y008295D01* +X017460Y008453D02* +X017178Y008453D01* +X017337Y008612D02* +X017460Y008612D01* +X017460Y008770D02* +X017440Y008770D01* +X017440Y008929D02* +X017460Y008929D01* +X017460Y009087D02* +X017440Y009087D01* +X016960Y009087D02* +X015079Y009087D01* +X015002Y008929D02* +X016960Y008929D01* +X016817Y008770D02* +X015795Y008770D01* +X015840Y008612D02* +X016658Y008612D01* +X018191Y009563D02* +X018209Y009563D01* +X018209Y009721D02* +X018191Y009721D01* +X018191Y009880D02* +X018209Y009880D01* +X018209Y009973D02* +X018191Y009973D01* +X018191Y010421D01* +X018164Y010421D01* +X018093Y010410D01* +X018025Y010388D01* +X017960Y010355D01* +X017940Y010341D01* +X017940Y010606D01* +X017952Y010594D01* +X018113Y010527D01* +X018287Y010527D01* +X018295Y010530D01* +X018460Y010365D01* +X018460Y010341D01* +X018440Y010355D01* +X018375Y010388D01* +X018307Y010410D01* +X018236Y010421D01* +X018209Y010421D01* +X018209Y009973D01* +X018209Y010038D02* +X018191Y010038D01* +X018191Y010197D02* +X018209Y010197D01* +X018209Y010355D02* +X018191Y010355D01* +X018311Y010514D02* +X017940Y010514D01* +X017940Y010355D02* +X017960Y010355D01* +X018440Y010355D02* +X018460Y010355D01* +X018700Y010464D02* +X018200Y010964D01* +X018700Y010464D02* +X018700Y007414D01* +X016622Y005336D01* +X014277Y005336D01* +X014277Y005592D02* +X016478Y005592D01* +X017700Y006814D01* +X017415Y006868D02* +X015475Y006868D01* +X015475Y006710D02* +X017256Y006710D01* +X017098Y006551D02* +X015869Y006551D01* +X015984Y006393D02* +X016939Y006393D01* +X016781Y006234D02* +X016008Y006234D01* +X015960Y006076D02* +X016622Y006076D01* +X016464Y005917D02* +X015748Y005917D01* +X015552Y005917D02* +X015454Y005917D01* +X015650Y006264D02* +X015024Y006264D01* +X015000Y006240D01* +X014952Y007185D02* +X015048Y007185D01* +X015048Y007344D02* +X014952Y007344D01* +X014277Y007344D02* +X014277Y007344D01* +X014277Y007185D02* +X014277Y007185D01* +X014265Y007978D02* +X011559Y007978D01* +X011559Y008136D02* +X014240Y008136D01* +X014628Y008453D02* +X014724Y008453D01* +X014724Y008612D02* +X014628Y008612D01* +X014628Y008770D02* +X014724Y008770D01* +X018419Y009563D02* +X018460Y009563D01* +X021196Y009721D02* +X022320Y009721D01* +X022320Y009563D02* +X021435Y009563D01* +X021594Y009404D02* +X022320Y009404D01* +X022320Y009246D02* +X021686Y009246D01* +X021760Y009087D02* +X022320Y009087D01* +X022320Y008929D02* +X021802Y008929D01* +X021820Y008770D02* +X022320Y008770D01* +X022320Y008612D02* +X021820Y008612D01* +X021790Y008453D02* +X022320Y008453D01* +X022320Y008295D02* +X021747Y008295D01* +X021660Y008136D02* +X022320Y008136D01* +X022320Y007978D02* +X021547Y007978D01* +X021389Y007819D02* +X022320Y007819D01* +X022320Y007661D02* +X021096Y007661D01* +X019139Y004966D02* +X018618Y004966D01* +X018710Y004808D02* +X019141Y004808D01* +X019190Y004649D02* +X018710Y004649D01* +X017201Y004966D02* +X014732Y004966D01* +X014732Y004808D02* +X014987Y004808D01* +X013822Y004808D02* +X011878Y004808D01* +X011878Y004966D02* +X012004Y004966D01* +X012196Y004966D02* +X013822Y004966D01* +X013822Y005125D02* +X012409Y005125D01* +X012458Y005283D02* +X013822Y005283D01* +X013822Y005442D02* +X012435Y005442D01* +X012320Y005600D02* +X013822Y005600D01* +X013822Y004649D02* +X011878Y004649D01* +X011878Y004491D02* +X013822Y004491D01* +X013822Y004332D02* +X011878Y004332D01* +X011894Y004174D02* +X013822Y004174D01* +X013822Y004015D02* +X011898Y004015D01* +X011878Y003857D02* +X013822Y003857D01* +X013822Y003698D02* +X011878Y003698D01* +X011423Y004057D02* +X010948Y004057D01* +X010948Y004016D01* +X010722Y004016D01* +X010722Y004015D02* +X010626Y004015D01* +X010626Y003857D02* +X010722Y003857D01* +X010722Y003698D02* +X010626Y003698D01* +X010626Y004174D02* +X010722Y004174D01* +X010722Y004332D02* +X010626Y004332D01* +X010626Y004491D02* +X010722Y004491D01* +X011423Y004057D02* +X011423Y004057D01* +X011423Y005848D02* +X010060Y005848D01* +X009890Y005848D02* +X009900Y005688D01* +X009510Y006076D02* +X009053Y006076D01* +X009053Y005917D02* +X009250Y005917D01* +X009055Y005759D02* +X009053Y005759D01* +X009000Y006234D02* +X010191Y006234D01* +X010032Y006393D02* +X004790Y006393D01* +X004566Y005759D02* +X004540Y005759D01* +X004300Y005314D02* +X004300Y008064D01* +X003800Y008564D01* +X004300Y005314D02* +X004700Y004914D01* +X004954Y004914D01* +X005004Y004864D01* +X002964Y003550D02* +X002964Y003550D01* +X008678Y006551D02* +X008715Y006551D01* +X008715Y006484D02* +X008917Y006484D01* +X008963Y006497D01* +X009004Y006520D01* +X009037Y006554D01* +X009061Y006595D01* +X009073Y006641D01* +X009073Y006896D01* +X008715Y006896D01* +X008715Y006484D01* +X008715Y006710D02* +X008678Y006710D01* +X008678Y006868D02* +X008715Y006868D01* +X009073Y006868D02* +X009557Y006868D01* +X009715Y006710D02* +X009073Y006710D01* +X009035Y006551D02* +X009874Y006551D01* +X009398Y007027D02* +X009073Y007027D01* +X014745Y012416D02* +X019620Y012416D01* +X019580Y012574D02* +X014745Y012574D01* +X014250Y014964D02* +X014250Y016088D01* +X016722Y017488D02* +X017073Y017488D01* +X016941Y017329D02* +X016881Y017329D01* +X017627Y017488D02* +X018073Y017488D01* +X017941Y017329D02* +X017759Y017329D01* +X017810Y017171D02* +X017890Y017171D01* +X017890Y017012D02* +X017810Y017012D01* +X017810Y016854D02* +X017890Y016854D01* +X017890Y016695D02* +X017810Y016695D01* +X017810Y016537D02* +X017890Y016537D01* +X017908Y016378D02* +X017792Y016378D01* +X017706Y016220D02* +X017994Y016220D01* +X018706Y016220D02* +X019139Y016220D01* +X019158Y016378D02* +X018792Y016378D01* +X018810Y016537D02* +X019207Y016537D01* +X019256Y016695D02* +X018810Y016695D01* +X018810Y016854D02* +X019328Y016854D01* +X019436Y017012D02* +X018810Y017012D01* +X018810Y017171D02* +X019544Y017171D01* +X019722Y017329D02* +X018759Y017329D01* +X018627Y017488D02* +X019921Y017488D01* +X021473Y013525D02* +X022320Y013525D01* +X022320Y013367D02* +X021617Y013367D01* +X021708Y013208D02* +X022320Y013208D01* +X022320Y013050D02* +X021770Y013050D01* +X021812Y012891D02* +X022320Y012891D01* +X022320Y012733D02* +X021820Y012733D01* +X021820Y012574D02* +X022320Y012574D01* +X022320Y012416D02* +X021780Y012416D01* +X021729Y012257D02* +X022320Y012257D01* +X022320Y012099D02* +X021638Y012099D01* +X021510Y011940D02* +X022320Y011940D01* +X022320Y011782D02* +X021325Y011782D01* +X017110Y004808D02* +X017010Y004808D01* +X016972Y004174D02* +X017110Y004174D01* +X016255Y004174D02* +X016145Y004174D01* +X016183Y004332D02* +X016217Y004332D01* +X000856Y012257D02* +X000780Y012257D01* +X000780Y012891D02* +X000876Y012891D01* +D26* +X004150Y011564D03* +X006500Y013714D03* +X010000Y015114D03* +X011650Y013164D03* +X013300Y011464D03* +X013350Y010114D03* +X013550Y008764D03* +X013500Y006864D03* +X012100Y005314D03* +X009250Y004064D03* +X015200Y004514D03* +X015650Y006264D03* +X015850Y009914D03* +X014250Y014964D03* +D27* +X011650Y013164D02* +X011348Y013467D01* +X010000Y013467D01* +X009952Y013514D01* +X009500Y013514D01* +X009050Y013964D01* +X009050Y017164D01* +X009300Y017414D01* +X016400Y017414D01* +X017000Y016814D01* +X017350Y016814D01* +X014250Y010982D02* +X014052Y010784D01* +X012630Y010784D01* +X012632Y009447D02* +X012630Y009444D01* +X012632Y009447D02* +X014250Y009447D01* +X013550Y008764D02* +X012640Y008764D01* +X012630Y008774D01* +M02* diff --git a/gerber/tests/resources/top_mask.GTS b/gerber/tests/resources/top_mask.GTS new file mode 100644 index 0000000..a3886f5 --- /dev/null +++ b/gerber/tests/resources/top_mask.GTS @@ -0,0 +1,162 @@ +G75* +%MOIN*% +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10R,0.0340X0.0880*% +%ADD11R,0.0671X0.0237*% +%ADD12R,0.4178X0.4332*% +%ADD13R,0.0930X0.0500*% +%ADD14R,0.0710X0.1655*% +%ADD15R,0.0671X0.0592*% +%ADD16R,0.0592X0.0671*% +%ADD17R,0.0710X0.1615*% +%ADD18R,0.1419X0.0828*% +%ADD19C,0.0634*% +%ADD20C,0.1360*% +%ADD21R,0.0474X0.0580*% +%ADD22C,0.0680*% +%ADD23R,0.0552X0.0552*% +%ADD24C,0.1340*% +%ADD25C,0.0476*% +D10* +X005000Y010604D03* +X005500Y010604D03* +X006000Y010604D03* +X006500Y010604D03* +X006500Y013024D03* +X006000Y013024D03* +X005500Y013024D03* +X005000Y013024D03* +D11* +X011423Y007128D03* +X011423Y006872D03* +X011423Y006616D03* +X011423Y006360D03* +X011423Y006104D03* +X011423Y005848D03* +X011423Y005592D03* +X011423Y005336D03* +X011423Y005080D03* +X011423Y004825D03* +X011423Y004569D03* +X011423Y004313D03* +X011423Y004057D03* +X011423Y003801D03* +X014277Y003801D03* +X014277Y004057D03* +X014277Y004313D03* +X014277Y004569D03* +X014277Y004825D03* +X014277Y005080D03* +X014277Y005336D03* +X014277Y005592D03* +X014277Y005848D03* +X014277Y006104D03* +X014277Y006360D03* +X014277Y006616D03* +X014277Y006872D03* +X014277Y007128D03* +D12* +X009350Y010114D03* +D13* +X012630Y010114D03* +X012630Y010784D03* +X012630Y011454D03* +X012630Y009444D03* +X012630Y008774D03* +D14* +X010000Y013467D03* +X010000Y016262D03* +D15* +X004150Y012988D03* +X004150Y012240D03* +X009900Y005688D03* +X009900Y004940D03* +X015000Y006240D03* +X015000Y006988D03* +D16* +X014676Y008364D03* +X015424Y008364D03* +X017526Y004514D03* +X018274Y004514D03* +X010674Y004064D03* +X009926Y004064D03* +X004174Y009564D03* +X003426Y009564D03* +X005376Y014564D03* +X006124Y014564D03* +D17* +X014250Y016088D03* +X014250Y012741D03* +D18* +X014250Y010982D03* +X014250Y009447D03* +D19* +X017200Y009464D03* +X018200Y009964D03* +X018200Y010964D03* +X017200Y010464D03* +X017200Y011464D03* +X018200Y011964D03* +D20* +X020700Y012714D03* +X020700Y008714D03* +D21* +X005004Y003814D03* +X005004Y004864D03* +X005004Y005864D03* +X005004Y006914D03* +X008696Y006914D03* +X008696Y005864D03* +X008696Y004864D03* +X008696Y003814D03* +D22* +X001800Y008564D02* +X001200Y008564D01* +X001200Y009564D02* +X001800Y009564D01* +X001800Y010564D02* +X001200Y010564D01* +X001200Y011564D02* +X001800Y011564D01* +X001800Y012564D02* +X001200Y012564D01* +X005350Y016664D02* +X005350Y017264D01* +X006350Y017264D02* +X006350Y016664D01* +X007350Y016664D02* +X007350Y017264D01* +X017350Y017114D02* +X017350Y016514D01* +X018350Y016514D02* +X018350Y017114D01* +D23* +X016613Y004514D03* +X015787Y004514D03* +D24* +X020800Y005064D03* +X020800Y016064D03* +X002300Y016064D03* +X002350Y005114D03* +D25* +X009250Y004064D03* +X012100Y005314D03* +X013500Y006864D03* +X015650Y006264D03* +X015200Y004514D03* +X013550Y008764D03* +X013350Y010114D03* +X013300Y011464D03* +X011650Y013164D03* +X010000Y015114D03* +X006500Y013714D03* +X004150Y011564D03* +X014250Y014964D03* +X015850Y009914D03* +M02* diff --git a/gerber/tests/resources/top_silk.GTO b/gerber/tests/resources/top_silk.GTO new file mode 100644 index 0000000..ea46f80 --- /dev/null +++ b/gerber/tests/resources/top_silk.GTO @@ -0,0 +1,2099 @@ +G75* +%MOIN*% +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0000*% +%ADD11C,0.0060*% +%ADD12C,0.0020*% +%ADD13C,0.0050*% +%ADD14C,0.0080*% +%ADD15C,0.0040*% +%ADD16R,0.0660X0.0380*% +%ADD17C,0.0030*% +%ADD18C,0.0004*% +%ADD19R,0.0450X0.0364*% +%ADD20C,0.0025*% +%ADD21C,0.0098*% +D10* +X000300Y003064D02* +X000300Y018064D01* +X022800Y018064D01* +X022800Y003064D01* +X000300Y003064D01* +X001720Y005114D02* +X001722Y005164D01* +X001728Y005214D01* +X001738Y005263D01* +X001752Y005311D01* +X001769Y005358D01* +X001790Y005403D01* +X001815Y005447D01* +X001843Y005488D01* +X001875Y005527D01* +X001909Y005564D01* +X001946Y005598D01* +X001986Y005628D01* +X002028Y005655D01* +X002072Y005679D01* +X002118Y005700D01* +X002165Y005716D01* +X002213Y005729D01* +X002263Y005738D01* +X002312Y005743D01* +X002363Y005744D01* +X002413Y005741D01* +X002462Y005734D01* +X002511Y005723D01* +X002559Y005708D01* +X002605Y005690D01* +X002650Y005668D01* +X002693Y005642D01* +X002734Y005613D01* +X002773Y005581D01* +X002809Y005546D01* +X002841Y005508D01* +X002871Y005468D01* +X002898Y005425D01* +X002921Y005381D01* +X002940Y005335D01* +X002956Y005287D01* +X002968Y005238D01* +X002976Y005189D01* +X002980Y005139D01* +X002980Y005089D01* +X002976Y005039D01* +X002968Y004990D01* +X002956Y004941D01* +X002940Y004893D01* +X002921Y004847D01* +X002898Y004803D01* +X002871Y004760D01* +X002841Y004720D01* +X002809Y004682D01* +X002773Y004647D01* +X002734Y004615D01* +X002693Y004586D01* +X002650Y004560D01* +X002605Y004538D01* +X002559Y004520D01* +X002511Y004505D01* +X002462Y004494D01* +X002413Y004487D01* +X002363Y004484D01* +X002312Y004485D01* +X002263Y004490D01* +X002213Y004499D01* +X002165Y004512D01* +X002118Y004528D01* +X002072Y004549D01* +X002028Y004573D01* +X001986Y004600D01* +X001946Y004630D01* +X001909Y004664D01* +X001875Y004701D01* +X001843Y004740D01* +X001815Y004781D01* +X001790Y004825D01* +X001769Y004870D01* +X001752Y004917D01* +X001738Y004965D01* +X001728Y005014D01* +X001722Y005064D01* +X001720Y005114D01* +X001670Y016064D02* +X001672Y016114D01* +X001678Y016164D01* +X001688Y016213D01* +X001702Y016261D01* +X001719Y016308D01* +X001740Y016353D01* +X001765Y016397D01* +X001793Y016438D01* +X001825Y016477D01* +X001859Y016514D01* +X001896Y016548D01* +X001936Y016578D01* +X001978Y016605D01* +X002022Y016629D01* +X002068Y016650D01* +X002115Y016666D01* +X002163Y016679D01* +X002213Y016688D01* +X002262Y016693D01* +X002313Y016694D01* +X002363Y016691D01* +X002412Y016684D01* +X002461Y016673D01* +X002509Y016658D01* +X002555Y016640D01* +X002600Y016618D01* +X002643Y016592D01* +X002684Y016563D01* +X002723Y016531D01* +X002759Y016496D01* +X002791Y016458D01* +X002821Y016418D01* +X002848Y016375D01* +X002871Y016331D01* +X002890Y016285D01* +X002906Y016237D01* +X002918Y016188D01* +X002926Y016139D01* +X002930Y016089D01* +X002930Y016039D01* +X002926Y015989D01* +X002918Y015940D01* +X002906Y015891D01* +X002890Y015843D01* +X002871Y015797D01* +X002848Y015753D01* +X002821Y015710D01* +X002791Y015670D01* +X002759Y015632D01* +X002723Y015597D01* +X002684Y015565D01* +X002643Y015536D01* +X002600Y015510D01* +X002555Y015488D01* +X002509Y015470D01* +X002461Y015455D01* +X002412Y015444D01* +X002363Y015437D01* +X002313Y015434D01* +X002262Y015435D01* +X002213Y015440D01* +X002163Y015449D01* +X002115Y015462D01* +X002068Y015478D01* +X002022Y015499D01* +X001978Y015523D01* +X001936Y015550D01* +X001896Y015580D01* +X001859Y015614D01* +X001825Y015651D01* +X001793Y015690D01* +X001765Y015731D01* +X001740Y015775D01* +X001719Y015820D01* +X001702Y015867D01* +X001688Y015915D01* +X001678Y015964D01* +X001672Y016014D01* +X001670Y016064D01* +X020060Y012714D02* +X020062Y012764D01* +X020068Y012814D01* +X020078Y012863D01* +X020091Y012912D01* +X020109Y012959D01* +X020130Y013005D01* +X020154Y013048D01* +X020182Y013090D01* +X020213Y013130D01* +X020247Y013167D01* +X020284Y013201D01* +X020324Y013232D01* +X020366Y013260D01* +X020409Y013284D01* +X020455Y013305D01* +X020502Y013323D01* +X020551Y013336D01* +X020600Y013346D01* +X020650Y013352D01* +X020700Y013354D01* +X020750Y013352D01* +X020800Y013346D01* +X020849Y013336D01* +X020898Y013323D01* +X020945Y013305D01* +X020991Y013284D01* +X021034Y013260D01* +X021076Y013232D01* +X021116Y013201D01* +X021153Y013167D01* +X021187Y013130D01* +X021218Y013090D01* +X021246Y013048D01* +X021270Y013005D01* +X021291Y012959D01* +X021309Y012912D01* +X021322Y012863D01* +X021332Y012814D01* +X021338Y012764D01* +X021340Y012714D01* +X021338Y012664D01* +X021332Y012614D01* +X021322Y012565D01* +X021309Y012516D01* +X021291Y012469D01* +X021270Y012423D01* +X021246Y012380D01* +X021218Y012338D01* +X021187Y012298D01* +X021153Y012261D01* +X021116Y012227D01* +X021076Y012196D01* +X021034Y012168D01* +X020991Y012144D01* +X020945Y012123D01* +X020898Y012105D01* +X020849Y012092D01* +X020800Y012082D01* +X020750Y012076D01* +X020700Y012074D01* +X020650Y012076D01* +X020600Y012082D01* +X020551Y012092D01* +X020502Y012105D01* +X020455Y012123D01* +X020409Y012144D01* +X020366Y012168D01* +X020324Y012196D01* +X020284Y012227D01* +X020247Y012261D01* +X020213Y012298D01* +X020182Y012338D01* +X020154Y012380D01* +X020130Y012423D01* +X020109Y012469D01* +X020091Y012516D01* +X020078Y012565D01* +X020068Y012614D01* +X020062Y012664D01* +X020060Y012714D01* +X020170Y016064D02* +X020172Y016114D01* +X020178Y016164D01* +X020188Y016213D01* +X020202Y016261D01* +X020219Y016308D01* +X020240Y016353D01* +X020265Y016397D01* +X020293Y016438D01* +X020325Y016477D01* +X020359Y016514D01* +X020396Y016548D01* +X020436Y016578D01* +X020478Y016605D01* +X020522Y016629D01* +X020568Y016650D01* +X020615Y016666D01* +X020663Y016679D01* +X020713Y016688D01* +X020762Y016693D01* +X020813Y016694D01* +X020863Y016691D01* +X020912Y016684D01* +X020961Y016673D01* +X021009Y016658D01* +X021055Y016640D01* +X021100Y016618D01* +X021143Y016592D01* +X021184Y016563D01* +X021223Y016531D01* +X021259Y016496D01* +X021291Y016458D01* +X021321Y016418D01* +X021348Y016375D01* +X021371Y016331D01* +X021390Y016285D01* +X021406Y016237D01* +X021418Y016188D01* +X021426Y016139D01* +X021430Y016089D01* +X021430Y016039D01* +X021426Y015989D01* +X021418Y015940D01* +X021406Y015891D01* +X021390Y015843D01* +X021371Y015797D01* +X021348Y015753D01* +X021321Y015710D01* +X021291Y015670D01* +X021259Y015632D01* +X021223Y015597D01* +X021184Y015565D01* +X021143Y015536D01* +X021100Y015510D01* +X021055Y015488D01* +X021009Y015470D01* +X020961Y015455D01* +X020912Y015444D01* +X020863Y015437D01* +X020813Y015434D01* +X020762Y015435D01* +X020713Y015440D01* +X020663Y015449D01* +X020615Y015462D01* +X020568Y015478D01* +X020522Y015499D01* +X020478Y015523D01* +X020436Y015550D01* +X020396Y015580D01* +X020359Y015614D01* +X020325Y015651D01* +X020293Y015690D01* +X020265Y015731D01* +X020240Y015775D01* +X020219Y015820D01* +X020202Y015867D01* +X020188Y015915D01* +X020178Y015964D01* +X020172Y016014D01* +X020170Y016064D01* +X020060Y008714D02* +X020062Y008764D01* +X020068Y008814D01* +X020078Y008863D01* +X020091Y008912D01* +X020109Y008959D01* +X020130Y009005D01* +X020154Y009048D01* +X020182Y009090D01* +X020213Y009130D01* +X020247Y009167D01* +X020284Y009201D01* +X020324Y009232D01* +X020366Y009260D01* +X020409Y009284D01* +X020455Y009305D01* +X020502Y009323D01* +X020551Y009336D01* +X020600Y009346D01* +X020650Y009352D01* +X020700Y009354D01* +X020750Y009352D01* +X020800Y009346D01* +X020849Y009336D01* +X020898Y009323D01* +X020945Y009305D01* +X020991Y009284D01* +X021034Y009260D01* +X021076Y009232D01* +X021116Y009201D01* +X021153Y009167D01* +X021187Y009130D01* +X021218Y009090D01* +X021246Y009048D01* +X021270Y009005D01* +X021291Y008959D01* +X021309Y008912D01* +X021322Y008863D01* +X021332Y008814D01* +X021338Y008764D01* +X021340Y008714D01* +X021338Y008664D01* +X021332Y008614D01* +X021322Y008565D01* +X021309Y008516D01* +X021291Y008469D01* +X021270Y008423D01* +X021246Y008380D01* +X021218Y008338D01* +X021187Y008298D01* +X021153Y008261D01* +X021116Y008227D01* +X021076Y008196D01* +X021034Y008168D01* +X020991Y008144D01* +X020945Y008123D01* +X020898Y008105D01* +X020849Y008092D01* +X020800Y008082D01* +X020750Y008076D01* +X020700Y008074D01* +X020650Y008076D01* +X020600Y008082D01* +X020551Y008092D01* +X020502Y008105D01* +X020455Y008123D01* +X020409Y008144D01* +X020366Y008168D01* +X020324Y008196D01* +X020284Y008227D01* +X020247Y008261D01* +X020213Y008298D01* +X020182Y008338D01* +X020154Y008380D01* +X020130Y008423D01* +X020109Y008469D01* +X020091Y008516D01* +X020078Y008565D01* +X020068Y008614D01* +X020062Y008664D01* +X020060Y008714D01* +X020170Y005064D02* +X020172Y005114D01* +X020178Y005164D01* +X020188Y005213D01* +X020202Y005261D01* +X020219Y005308D01* +X020240Y005353D01* +X020265Y005397D01* +X020293Y005438D01* +X020325Y005477D01* +X020359Y005514D01* +X020396Y005548D01* +X020436Y005578D01* +X020478Y005605D01* +X020522Y005629D01* +X020568Y005650D01* +X020615Y005666D01* +X020663Y005679D01* +X020713Y005688D01* +X020762Y005693D01* +X020813Y005694D01* +X020863Y005691D01* +X020912Y005684D01* +X020961Y005673D01* +X021009Y005658D01* +X021055Y005640D01* +X021100Y005618D01* +X021143Y005592D01* +X021184Y005563D01* +X021223Y005531D01* +X021259Y005496D01* +X021291Y005458D01* +X021321Y005418D01* +X021348Y005375D01* +X021371Y005331D01* +X021390Y005285D01* +X021406Y005237D01* +X021418Y005188D01* +X021426Y005139D01* +X021430Y005089D01* +X021430Y005039D01* +X021426Y004989D01* +X021418Y004940D01* +X021406Y004891D01* +X021390Y004843D01* +X021371Y004797D01* +X021348Y004753D01* +X021321Y004710D01* +X021291Y004670D01* +X021259Y004632D01* +X021223Y004597D01* +X021184Y004565D01* +X021143Y004536D01* +X021100Y004510D01* +X021055Y004488D01* +X021009Y004470D01* +X020961Y004455D01* +X020912Y004444D01* +X020863Y004437D01* +X020813Y004434D01* +X020762Y004435D01* +X020713Y004440D01* +X020663Y004449D01* +X020615Y004462D01* +X020568Y004478D01* +X020522Y004499D01* +X020478Y004523D01* +X020436Y004550D01* +X020396Y004580D01* +X020359Y004614D01* +X020325Y004651D01* +X020293Y004690D01* +X020265Y004731D01* +X020240Y004775D01* +X020219Y004820D01* +X020202Y004867D01* +X020188Y004915D01* +X020178Y004964D01* +X020172Y005014D01* +X020170Y005064D01* +D11* +X019450Y005064D02* +X019452Y005137D01* +X019458Y005210D01* +X019468Y005282D01* +X019482Y005354D01* +X019499Y005425D01* +X019521Y005495D01* +X019546Y005564D01* +X019575Y005631D01* +X019607Y005696D01* +X019643Y005760D01* +X019683Y005822D01* +X019725Y005881D01* +X019771Y005938D01* +X019820Y005992D01* +X019872Y006044D01* +X019926Y006093D01* +X019983Y006139D01* +X020042Y006181D01* +X020104Y006221D01* +X020168Y006257D01* +X020233Y006289D01* +X020300Y006318D01* +X020369Y006343D01* +X020439Y006365D01* +X020510Y006382D01* +X020582Y006396D01* +X020654Y006406D01* +X020727Y006412D01* +X020800Y006414D01* +X020873Y006412D01* +X020946Y006406D01* +X021018Y006396D01* +X021090Y006382D01* +X021161Y006365D01* +X021231Y006343D01* +X021300Y006318D01* +X021367Y006289D01* +X021432Y006257D01* +X021496Y006221D01* +X021558Y006181D01* +X021617Y006139D01* +X021674Y006093D01* +X021728Y006044D01* +X021780Y005992D01* +X021829Y005938D01* +X021875Y005881D01* +X021917Y005822D01* +X021957Y005760D01* +X021993Y005696D01* +X022025Y005631D01* +X022054Y005564D01* +X022079Y005495D01* +X022101Y005425D01* +X022118Y005354D01* +X022132Y005282D01* +X022142Y005210D01* +X022148Y005137D01* +X022150Y005064D01* +X022148Y004991D01* +X022142Y004918D01* +X022132Y004846D01* +X022118Y004774D01* +X022101Y004703D01* +X022079Y004633D01* +X022054Y004564D01* +X022025Y004497D01* +X021993Y004432D01* +X021957Y004368D01* +X021917Y004306D01* +X021875Y004247D01* +X021829Y004190D01* +X021780Y004136D01* +X021728Y004084D01* +X021674Y004035D01* +X021617Y003989D01* +X021558Y003947D01* +X021496Y003907D01* +X021432Y003871D01* +X021367Y003839D01* +X021300Y003810D01* +X021231Y003785D01* +X021161Y003763D01* +X021090Y003746D01* +X021018Y003732D01* +X020946Y003722D01* +X020873Y003716D01* +X020800Y003714D01* +X020727Y003716D01* +X020654Y003722D01* +X020582Y003732D01* +X020510Y003746D01* +X020439Y003763D01* +X020369Y003785D01* +X020300Y003810D01* +X020233Y003839D01* +X020168Y003871D01* +X020104Y003907D01* +X020042Y003947D01* +X019983Y003989D01* +X019926Y004035D01* +X019872Y004084D01* +X019820Y004136D01* +X019771Y004190D01* +X019725Y004247D01* +X019683Y004306D01* +X019643Y004368D01* +X019607Y004432D01* +X019575Y004497D01* +X019546Y004564D01* +X019521Y004633D01* +X019499Y004703D01* +X019482Y004774D01* +X019468Y004846D01* +X019458Y004918D01* +X019452Y004991D01* +X019450Y005064D01* +X019798Y007044D02* +X019904Y007044D01* +X020011Y007151D01* +X020011Y007685D01* +X019904Y007685D02* +X020118Y007685D01* +X020335Y007471D02* +X020549Y007685D01* +X020549Y007044D01* +X020762Y007044D02* +X020335Y007044D01* +X019798Y007044D02* +X019691Y007151D01* +X019450Y016064D02* +X019452Y016137D01* +X019458Y016210D01* +X019468Y016282D01* +X019482Y016354D01* +X019499Y016425D01* +X019521Y016495D01* +X019546Y016564D01* +X019575Y016631D01* +X019607Y016696D01* +X019643Y016760D01* +X019683Y016822D01* +X019725Y016881D01* +X019771Y016938D01* +X019820Y016992D01* +X019872Y017044D01* +X019926Y017093D01* +X019983Y017139D01* +X020042Y017181D01* +X020104Y017221D01* +X020168Y017257D01* +X020233Y017289D01* +X020300Y017318D01* +X020369Y017343D01* +X020439Y017365D01* +X020510Y017382D01* +X020582Y017396D01* +X020654Y017406D01* +X020727Y017412D01* +X020800Y017414D01* +X020873Y017412D01* +X020946Y017406D01* +X021018Y017396D01* +X021090Y017382D01* +X021161Y017365D01* +X021231Y017343D01* +X021300Y017318D01* +X021367Y017289D01* +X021432Y017257D01* +X021496Y017221D01* +X021558Y017181D01* +X021617Y017139D01* +X021674Y017093D01* +X021728Y017044D01* +X021780Y016992D01* +X021829Y016938D01* +X021875Y016881D01* +X021917Y016822D01* +X021957Y016760D01* +X021993Y016696D01* +X022025Y016631D01* +X022054Y016564D01* +X022079Y016495D01* +X022101Y016425D01* +X022118Y016354D01* +X022132Y016282D01* +X022142Y016210D01* +X022148Y016137D01* +X022150Y016064D01* +X022148Y015991D01* +X022142Y015918D01* +X022132Y015846D01* +X022118Y015774D01* +X022101Y015703D01* +X022079Y015633D01* +X022054Y015564D01* +X022025Y015497D01* +X021993Y015432D01* +X021957Y015368D01* +X021917Y015306D01* +X021875Y015247D01* +X021829Y015190D01* +X021780Y015136D01* +X021728Y015084D01* +X021674Y015035D01* +X021617Y014989D01* +X021558Y014947D01* +X021496Y014907D01* +X021432Y014871D01* +X021367Y014839D01* +X021300Y014810D01* +X021231Y014785D01* +X021161Y014763D01* +X021090Y014746D01* +X021018Y014732D01* +X020946Y014722D01* +X020873Y014716D01* +X020800Y014714D01* +X020727Y014716D01* +X020654Y014722D01* +X020582Y014732D01* +X020510Y014746D01* +X020439Y014763D01* +X020369Y014785D01* +X020300Y014810D01* +X020233Y014839D01* +X020168Y014871D01* +X020104Y014907D01* +X020042Y014947D01* +X019983Y014989D01* +X019926Y015035D01* +X019872Y015084D01* +X019820Y015136D01* +X019771Y015190D01* +X019725Y015247D01* +X019683Y015306D01* +X019643Y015368D01* +X019607Y015432D01* +X019575Y015497D01* +X019546Y015564D01* +X019521Y015633D01* +X019499Y015703D01* +X019482Y015774D01* +X019468Y015846D01* +X019458Y015918D01* +X019452Y015991D01* +X019450Y016064D01* +X018850Y016564D02* +X018600Y016314D01* +X018100Y016314D01* +X017850Y016564D01* +X017600Y016314D01* +X017100Y016314D01* +X016850Y016564D01* +X016850Y017064D01* +X017100Y017314D01* +X017600Y017314D01* +X017850Y017064D01* +X018100Y017314D01* +X018600Y017314D01* +X018850Y017064D01* +X018850Y016564D01* +X017850Y016564D02* +X017850Y017064D01* +X007850Y017214D02* +X007850Y016714D01* +X007600Y016464D01* +X007100Y016464D01* +X006850Y016714D01* +X006600Y016464D01* +X006100Y016464D01* +X005850Y016714D01* +X005600Y016464D01* +X005100Y016464D01* +X004850Y016714D01* +X004850Y017214D01* +X005100Y017464D01* +X005600Y017464D01* +X005850Y017214D01* +X006100Y017464D01* +X006600Y017464D01* +X006850Y017214D01* +X007100Y017464D01* +X007600Y017464D01* +X007850Y017214D01* +X006850Y017214D02* +X006850Y016714D01* +X005850Y016714D02* +X005850Y017214D01* +X000950Y016064D02* +X000952Y016137D01* +X000958Y016210D01* +X000968Y016282D01* +X000982Y016354D01* +X000999Y016425D01* +X001021Y016495D01* +X001046Y016564D01* +X001075Y016631D01* +X001107Y016696D01* +X001143Y016760D01* +X001183Y016822D01* +X001225Y016881D01* +X001271Y016938D01* +X001320Y016992D01* +X001372Y017044D01* +X001426Y017093D01* +X001483Y017139D01* +X001542Y017181D01* +X001604Y017221D01* +X001668Y017257D01* +X001733Y017289D01* +X001800Y017318D01* +X001869Y017343D01* +X001939Y017365D01* +X002010Y017382D01* +X002082Y017396D01* +X002154Y017406D01* +X002227Y017412D01* +X002300Y017414D01* +X002373Y017412D01* +X002446Y017406D01* +X002518Y017396D01* +X002590Y017382D01* +X002661Y017365D01* +X002731Y017343D01* +X002800Y017318D01* +X002867Y017289D01* +X002932Y017257D01* +X002996Y017221D01* +X003058Y017181D01* +X003117Y017139D01* +X003174Y017093D01* +X003228Y017044D01* +X003280Y016992D01* +X003329Y016938D01* +X003375Y016881D01* +X003417Y016822D01* +X003457Y016760D01* +X003493Y016696D01* +X003525Y016631D01* +X003554Y016564D01* +X003579Y016495D01* +X003601Y016425D01* +X003618Y016354D01* +X003632Y016282D01* +X003642Y016210D01* +X003648Y016137D01* +X003650Y016064D01* +X003648Y015991D01* +X003642Y015918D01* +X003632Y015846D01* +X003618Y015774D01* +X003601Y015703D01* +X003579Y015633D01* +X003554Y015564D01* +X003525Y015497D01* +X003493Y015432D01* +X003457Y015368D01* +X003417Y015306D01* +X003375Y015247D01* +X003329Y015190D01* +X003280Y015136D01* +X003228Y015084D01* +X003174Y015035D01* +X003117Y014989D01* +X003058Y014947D01* +X002996Y014907D01* +X002932Y014871D01* +X002867Y014839D01* +X002800Y014810D01* +X002731Y014785D01* +X002661Y014763D01* +X002590Y014746D01* +X002518Y014732D01* +X002446Y014722D01* +X002373Y014716D01* +X002300Y014714D01* +X002227Y014716D01* +X002154Y014722D01* +X002082Y014732D01* +X002010Y014746D01* +X001939Y014763D01* +X001869Y014785D01* +X001800Y014810D01* +X001733Y014839D01* +X001668Y014871D01* +X001604Y014907D01* +X001542Y014947D01* +X001483Y014989D01* +X001426Y015035D01* +X001372Y015084D01* +X001320Y015136D01* +X001271Y015190D01* +X001225Y015247D01* +X001183Y015306D01* +X001143Y015368D01* +X001107Y015432D01* +X001075Y015497D01* +X001046Y015564D01* +X001021Y015633D01* +X000999Y015703D01* +X000982Y015774D01* +X000968Y015846D01* +X000958Y015918D01* +X000952Y015991D01* +X000950Y016064D01* +X001250Y013064D02* +X001000Y012814D01* +X001000Y012314D01* +X001250Y012064D01* +X001000Y011814D01* +X001000Y011314D01* +X001250Y011064D01* +X001750Y011064D01* +X002000Y011314D01* +X002000Y011814D01* +X001750Y012064D01* +X001250Y012064D01* +X001750Y012064D02* +X002000Y012314D01* +X002000Y012814D01* +X001750Y013064D01* +X001250Y013064D01* +X001250Y011064D02* +X001000Y010814D01* +X001000Y010314D01* +X001250Y010064D01* +X001000Y009814D01* +X001000Y009314D01* +X001250Y009064D01* +X001000Y008814D01* +X001000Y008314D01* +X001250Y008064D01* +X001750Y008064D01* +X002000Y008314D01* +X002000Y008814D01* +X001750Y009064D01* +X001250Y009064D01* +X001750Y009064D02* +X002000Y009314D01* +X002000Y009814D01* +X001750Y010064D01* +X001250Y010064D01* +X001750Y010064D02* +X002000Y010314D01* +X002000Y010814D01* +X001750Y011064D01* +X004750Y011194D02* +X004750Y011614D01* +X004750Y012014D01* +X004750Y012434D01* +X004752Y012457D01* +X004757Y012480D01* +X004766Y012502D01* +X004779Y012522D01* +X004794Y012540D01* +X004812Y012555D01* +X004832Y012568D01* +X004854Y012577D01* +X004877Y012582D01* +X004900Y012584D01* +X006600Y012584D01* +X006623Y012582D01* +X006646Y012577D01* +X006668Y012568D01* +X006688Y012555D01* +X006706Y012540D01* +X006721Y012522D01* +X006734Y012502D01* +X006743Y012480D01* +X006748Y012457D01* +X006750Y012434D01* +X006750Y011194D01* +X006748Y011171D01* +X006743Y011148D01* +X006734Y011126D01* +X006721Y011106D01* +X006706Y011088D01* +X006688Y011073D01* +X006668Y011060D01* +X006646Y011051D01* +X006623Y011046D01* +X006600Y011044D01* +X004900Y011044D01* +X004877Y011046D01* +X004854Y011051D01* +X004832Y011060D01* +X004812Y011073D01* +X004794Y011088D01* +X004779Y011106D01* +X004766Y011126D01* +X004757Y011148D01* +X004752Y011171D01* +X004750Y011194D01* +X004750Y011614D02* +X004777Y011616D01* +X004804Y011621D01* +X004830Y011631D01* +X004854Y011643D01* +X004876Y011659D01* +X004896Y011677D01* +X004913Y011699D01* +X004928Y011722D01* +X004938Y011747D01* +X004946Y011773D01* +X004950Y011800D01* +X004950Y011828D01* +X004946Y011855D01* +X004938Y011881D01* +X004928Y011906D01* +X004913Y011929D01* +X004896Y011951D01* +X004876Y011969D01* +X004854Y011985D01* +X004830Y011997D01* +X004804Y012007D01* +X004777Y012012D01* +X004750Y012014D01* +X001000Y005114D02* +X001002Y005187D01* +X001008Y005260D01* +X001018Y005332D01* +X001032Y005404D01* +X001049Y005475D01* +X001071Y005545D01* +X001096Y005614D01* +X001125Y005681D01* +X001157Y005746D01* +X001193Y005810D01* +X001233Y005872D01* +X001275Y005931D01* +X001321Y005988D01* +X001370Y006042D01* +X001422Y006094D01* +X001476Y006143D01* +X001533Y006189D01* +X001592Y006231D01* +X001654Y006271D01* +X001718Y006307D01* +X001783Y006339D01* +X001850Y006368D01* +X001919Y006393D01* +X001989Y006415D01* +X002060Y006432D01* +X002132Y006446D01* +X002204Y006456D01* +X002277Y006462D01* +X002350Y006464D01* +X002423Y006462D01* +X002496Y006456D01* +X002568Y006446D01* +X002640Y006432D01* +X002711Y006415D01* +X002781Y006393D01* +X002850Y006368D01* +X002917Y006339D01* +X002982Y006307D01* +X003046Y006271D01* +X003108Y006231D01* +X003167Y006189D01* +X003224Y006143D01* +X003278Y006094D01* +X003330Y006042D01* +X003379Y005988D01* +X003425Y005931D01* +X003467Y005872D01* +X003507Y005810D01* +X003543Y005746D01* +X003575Y005681D01* +X003604Y005614D01* +X003629Y005545D01* +X003651Y005475D01* +X003668Y005404D01* +X003682Y005332D01* +X003692Y005260D01* +X003698Y005187D01* +X003700Y005114D01* +X003698Y005041D01* +X003692Y004968D01* +X003682Y004896D01* +X003668Y004824D01* +X003651Y004753D01* +X003629Y004683D01* +X003604Y004614D01* +X003575Y004547D01* +X003543Y004482D01* +X003507Y004418D01* +X003467Y004356D01* +X003425Y004297D01* +X003379Y004240D01* +X003330Y004186D01* +X003278Y004134D01* +X003224Y004085D01* +X003167Y004039D01* +X003108Y003997D01* +X003046Y003957D01* +X002982Y003921D01* +X002917Y003889D01* +X002850Y003860D01* +X002781Y003835D01* +X002711Y003813D01* +X002640Y003796D01* +X002568Y003782D01* +X002496Y003772D01* +X002423Y003766D01* +X002350Y003764D01* +X002277Y003766D01* +X002204Y003772D01* +X002132Y003782D01* +X002060Y003796D01* +X001989Y003813D01* +X001919Y003835D01* +X001850Y003860D01* +X001783Y003889D01* +X001718Y003921D01* +X001654Y003957D01* +X001592Y003997D01* +X001533Y004039D01* +X001476Y004085D01* +X001422Y004134D01* +X001370Y004186D01* +X001321Y004240D01* +X001275Y004297D01* +X001233Y004356D01* +X001193Y004418D01* +X001157Y004482D01* +X001125Y004547D01* +X001096Y004614D01* +X001071Y004683D01* +X001049Y004753D01* +X001032Y004824D01* +X001018Y004896D01* +X001008Y004968D01* +X001002Y005041D01* +X001000Y005114D01* +D12* +X004750Y011184D02* +X006750Y011184D01* +D13* +X006929Y012889D02* +X007079Y012889D01* +X007154Y012964D01* +X007154Y013340D01* +X007315Y013265D02* +X007390Y013340D01* +X007540Y013340D01* +X007615Y013265D01* +X007615Y013190D01* +X007540Y013115D01* +X007615Y013039D01* +X007615Y012964D01* +X007540Y012889D01* +X007390Y012889D01* +X007315Y012964D01* +X007465Y013115D02* +X007540Y013115D01* +X006929Y012889D02* +X006854Y012964D01* +X006854Y013340D01* +X006216Y015659D02* +X005916Y016110D01* +X005756Y016110D02* +X005756Y015659D01* +X005916Y015659D02* +X006216Y016110D01* +X005756Y016110D02* +X005606Y015960D01* +X005455Y016110D01* +X005455Y015659D01* +X005295Y015734D02* +X005295Y016035D01* +X005220Y016110D01* +X004995Y016110D01* +X004995Y015659D01* +X005220Y015659D01* +X005295Y015734D01* +X002695Y012963D02* +X002695Y012812D01* +X002695Y012887D02* +X002245Y012887D01* +X002245Y012812D02* +X002245Y012963D01* +X002320Y012652D02* +X002245Y012577D01* +X002245Y012352D01* +X002695Y012352D01* +X002695Y012577D01* +X002620Y012652D01* +X002320Y012652D01* +X002245Y012195D02* +X002245Y012045D01* +X002245Y012120D02* +X002695Y012120D01* +X002695Y012045D02* +X002695Y012195D01* +X002695Y011885D02* +X002245Y011885D01* +X002395Y011735D01* +X002245Y011585D01* +X002695Y011585D01* +X016845Y017559D02* +X016845Y018010D01* +X017070Y018010D01* +X017145Y017935D01* +X017145Y017785D01* +X017070Y017709D01* +X016845Y017709D01* +X017305Y017559D02* +X017305Y018010D01* +X017606Y018010D02* +X017606Y017559D01* +X017456Y017709D01* +X017305Y017559D01* +X017766Y017559D02* +X017766Y018010D01* +X017991Y018010D01* +X018066Y017935D01* +X018066Y017785D01* +X017991Y017709D01* +X017766Y017709D01* +X017916Y017709D02* +X018066Y017559D01* +D14* +X020131Y016064D02* +X020133Y016115D01* +X020139Y016166D01* +X020149Y016216D01* +X020162Y016266D01* +X020180Y016314D01* +X020200Y016361D01* +X020225Y016406D01* +X020253Y016449D01* +X020284Y016490D01* +X020318Y016528D01* +X020355Y016563D01* +X020394Y016596D01* +X020436Y016626D01* +X020480Y016652D01* +X020526Y016674D01* +X020574Y016694D01* +X020623Y016709D01* +X020673Y016721D01* +X020723Y016729D01* +X020774Y016733D01* +X020826Y016733D01* +X020877Y016729D01* +X020927Y016721D01* +X020977Y016709D01* +X021026Y016694D01* +X021074Y016674D01* +X021120Y016652D01* +X021164Y016626D01* +X021206Y016596D01* +X021245Y016563D01* +X021282Y016528D01* +X021316Y016490D01* +X021347Y016449D01* +X021375Y016406D01* +X021400Y016361D01* +X021420Y016314D01* +X021438Y016266D01* +X021451Y016216D01* +X021461Y016166D01* +X021467Y016115D01* +X021469Y016064D01* +X021467Y016013D01* +X021461Y015962D01* +X021451Y015912D01* +X021438Y015862D01* +X021420Y015814D01* +X021400Y015767D01* +X021375Y015722D01* +X021347Y015679D01* +X021316Y015638D01* +X021282Y015600D01* +X021245Y015565D01* +X021206Y015532D01* +X021164Y015502D01* +X021120Y015476D01* +X021074Y015454D01* +X021026Y015434D01* +X020977Y015419D01* +X020927Y015407D01* +X020877Y015399D01* +X020826Y015395D01* +X020774Y015395D01* +X020723Y015399D01* +X020673Y015407D01* +X020623Y015419D01* +X020574Y015434D01* +X020526Y015454D01* +X020480Y015476D01* +X020436Y015502D01* +X020394Y015532D01* +X020355Y015565D01* +X020318Y015600D01* +X020284Y015638D01* +X020253Y015679D01* +X020225Y015722D01* +X020200Y015767D01* +X020180Y015814D01* +X020162Y015862D01* +X020149Y015912D01* +X020139Y015962D01* +X020133Y016013D01* +X020131Y016064D01* +X023764Y013422D02* +X016441Y013422D01* +X016441Y008007D01* +X023764Y008007D01* +X023764Y013422D01* +X013874Y007472D02* +X013874Y003456D01* +X011826Y003456D01* +X011826Y007472D01* +X011484Y008109D02* +X011484Y012120D01* +X008060Y007206D02* +X005640Y007206D01* +X005640Y003522D01* +X008060Y003522D01* +X008060Y007206D01* +X001681Y005114D02* +X001683Y005165D01* +X001689Y005216D01* +X001699Y005266D01* +X001712Y005316D01* +X001730Y005364D01* +X001750Y005411D01* +X001775Y005456D01* +X001803Y005499D01* +X001834Y005540D01* +X001868Y005578D01* +X001905Y005613D01* +X001944Y005646D01* +X001986Y005676D01* +X002030Y005702D01* +X002076Y005724D01* +X002124Y005744D01* +X002173Y005759D01* +X002223Y005771D01* +X002273Y005779D01* +X002324Y005783D01* +X002376Y005783D01* +X002427Y005779D01* +X002477Y005771D01* +X002527Y005759D01* +X002576Y005744D01* +X002624Y005724D01* +X002670Y005702D01* +X002714Y005676D01* +X002756Y005646D01* +X002795Y005613D01* +X002832Y005578D01* +X002866Y005540D01* +X002897Y005499D01* +X002925Y005456D01* +X002950Y005411D01* +X002970Y005364D01* +X002988Y005316D01* +X003001Y005266D01* +X003011Y005216D01* +X003017Y005165D01* +X003019Y005114D01* +X003017Y005063D01* +X003011Y005012D01* +X003001Y004962D01* +X002988Y004912D01* +X002970Y004864D01* +X002950Y004817D01* +X002925Y004772D01* +X002897Y004729D01* +X002866Y004688D01* +X002832Y004650D01* +X002795Y004615D01* +X002756Y004582D01* +X002714Y004552D01* +X002670Y004526D01* +X002624Y004504D01* +X002576Y004484D01* +X002527Y004469D01* +X002477Y004457D01* +X002427Y004449D01* +X002376Y004445D01* +X002324Y004445D01* +X002273Y004449D01* +X002223Y004457D01* +X002173Y004469D01* +X002124Y004484D01* +X002076Y004504D01* +X002030Y004526D01* +X001986Y004552D01* +X001944Y004582D01* +X001905Y004615D01* +X001868Y004650D01* +X001834Y004688D01* +X001803Y004729D01* +X001775Y004772D01* +X001750Y004817D01* +X001730Y004864D01* +X001712Y004912D01* +X001699Y004962D01* +X001689Y005012D01* +X001683Y005063D01* +X001681Y005114D01* +X001631Y016064D02* +X001633Y016115D01* +X001639Y016166D01* +X001649Y016216D01* +X001662Y016266D01* +X001680Y016314D01* +X001700Y016361D01* +X001725Y016406D01* +X001753Y016449D01* +X001784Y016490D01* +X001818Y016528D01* +X001855Y016563D01* +X001894Y016596D01* +X001936Y016626D01* +X001980Y016652D01* +X002026Y016674D01* +X002074Y016694D01* +X002123Y016709D01* +X002173Y016721D01* +X002223Y016729D01* +X002274Y016733D01* +X002326Y016733D01* +X002377Y016729D01* +X002427Y016721D01* +X002477Y016709D01* +X002526Y016694D01* +X002574Y016674D01* +X002620Y016652D01* +X002664Y016626D01* +X002706Y016596D01* +X002745Y016563D01* +X002782Y016528D01* +X002816Y016490D01* +X002847Y016449D01* +X002875Y016406D01* +X002900Y016361D01* +X002920Y016314D01* +X002938Y016266D01* +X002951Y016216D01* +X002961Y016166D01* +X002967Y016115D01* +X002969Y016064D01* +X002967Y016013D01* +X002961Y015962D01* +X002951Y015912D01* +X002938Y015862D01* +X002920Y015814D01* +X002900Y015767D01* +X002875Y015722D01* +X002847Y015679D01* +X002816Y015638D01* +X002782Y015600D01* +X002745Y015565D01* +X002706Y015532D01* +X002664Y015502D01* +X002620Y015476D01* +X002574Y015454D01* +X002526Y015434D01* +X002477Y015419D01* +X002427Y015407D01* +X002377Y015399D01* +X002326Y015395D01* +X002274Y015395D01* +X002223Y015399D01* +X002173Y015407D01* +X002123Y015419D01* +X002074Y015434D01* +X002026Y015454D01* +X001980Y015476D01* +X001936Y015502D01* +X001894Y015532D01* +X001855Y015565D01* +X001818Y015600D01* +X001784Y015638D01* +X001753Y015679D01* +X001725Y015722D01* +X001700Y015767D01* +X001680Y015814D01* +X001662Y015862D01* +X001649Y015912D01* +X001639Y015962D01* +X001633Y016013D01* +X001631Y016064D01* +X020131Y005064D02* +X020133Y005115D01* +X020139Y005166D01* +X020149Y005216D01* +X020162Y005266D01* +X020180Y005314D01* +X020200Y005361D01* +X020225Y005406D01* +X020253Y005449D01* +X020284Y005490D01* +X020318Y005528D01* +X020355Y005563D01* +X020394Y005596D01* +X020436Y005626D01* +X020480Y005652D01* +X020526Y005674D01* +X020574Y005694D01* +X020623Y005709D01* +X020673Y005721D01* +X020723Y005729D01* +X020774Y005733D01* +X020826Y005733D01* +X020877Y005729D01* +X020927Y005721D01* +X020977Y005709D01* +X021026Y005694D01* +X021074Y005674D01* +X021120Y005652D01* +X021164Y005626D01* +X021206Y005596D01* +X021245Y005563D01* +X021282Y005528D01* +X021316Y005490D01* +X021347Y005449D01* +X021375Y005406D01* +X021400Y005361D01* +X021420Y005314D01* +X021438Y005266D01* +X021451Y005216D01* +X021461Y005166D01* +X021467Y005115D01* +X021469Y005064D01* +X021467Y005013D01* +X021461Y004962D01* +X021451Y004912D01* +X021438Y004862D01* +X021420Y004814D01* +X021400Y004767D01* +X021375Y004722D01* +X021347Y004679D01* +X021316Y004638D01* +X021282Y004600D01* +X021245Y004565D01* +X021206Y004532D01* +X021164Y004502D01* +X021120Y004476D01* +X021074Y004454D01* +X021026Y004434D01* +X020977Y004419D01* +X020927Y004407D01* +X020877Y004399D01* +X020826Y004395D01* +X020774Y004395D01* +X020723Y004399D01* +X020673Y004407D01* +X020623Y004419D01* +X020574Y004434D01* +X020526Y004454D01* +X020480Y004476D01* +X020436Y004502D01* +X020394Y004532D01* +X020355Y004565D01* +X020318Y004600D01* +X020284Y004638D01* +X020253Y004679D01* +X020225Y004722D01* +X020200Y004767D01* +X020180Y004814D01* +X020162Y004862D01* +X020149Y004912D01* +X020139Y004962D01* +X020133Y005013D01* +X020131Y005064D01* +D15* +X018017Y003995D02* +X017710Y003995D01* +X017710Y003765D01* +X017863Y003841D01* +X017940Y003841D01* +X018017Y003765D01* +X018017Y003611D01* +X017940Y003534D01* +X017786Y003534D01* +X017710Y003611D01* +X017556Y003534D02* +X017403Y003688D01* +X017479Y003688D02* +X017249Y003688D01* +X017249Y003534D02* +X017249Y003995D01* +X017479Y003995D01* +X017556Y003918D01* +X017556Y003765D01* +X017479Y003688D01* +X016918Y003628D02* +X016611Y003628D01* +X016764Y003628D02* +X016764Y004088D01* +X016611Y003935D01* +X016457Y004012D02* +X016457Y003705D01* +X016380Y003628D01* +X016150Y003628D01* +X016150Y004088D01* +X016380Y004088D01* +X016457Y004012D01* +X015997Y004088D02* +X015690Y004088D01* +X015690Y003628D01* +X015997Y003628D01* +X015843Y003858D02* +X015690Y003858D01* +X015536Y003628D02* +X015229Y003628D01* +X015229Y004088D01* +X015596Y006214D02* +X015903Y006214D01* +X015980Y006290D01* +X015980Y006444D01* +X015903Y006520D01* +X015903Y006674D02* +X015980Y006751D01* +X015980Y006904D01* +X015903Y006981D01* +X015750Y006981D01* +X015673Y006904D01* +X015673Y006827D01* +X015750Y006674D01* +X015520Y006674D01* +X015520Y006981D01* +X015596Y006520D02* +X015520Y006444D01* +X015520Y006290D01* +X015596Y006214D01* +X012602Y007640D02* +X012295Y007640D01* +X012602Y007947D01* +X012602Y008024D01* +X012525Y008101D01* +X012372Y008101D01* +X012295Y008024D01* +X012142Y008101D02* +X012142Y007717D01* +X012065Y007640D01* +X011911Y007640D01* +X011835Y007717D01* +X011835Y008101D01* +X010261Y006645D02* +X010030Y006415D01* +X010337Y006415D01* +X010261Y006645D02* +X010261Y006184D01* +X009877Y006184D02* +X009723Y006338D01* +X009800Y006338D02* +X009570Y006338D01* +X009570Y006184D02* +X009570Y006645D01* +X009800Y006645D01* +X009877Y006568D01* +X009877Y006415D01* +X009800Y006338D01* +X009847Y003695D02* +X009770Y003618D01* +X009770Y003311D01* +X009847Y003234D01* +X010000Y003234D01* +X010077Y003311D01* +X010230Y003465D02* +X010537Y003465D01* +X010461Y003695D02* +X010461Y003234D01* +X010230Y003465D02* +X010461Y003695D01* +X010077Y003618D02* +X010000Y003695D01* +X009847Y003695D01* +X006311Y007384D02* +X006311Y007845D01* +X006080Y007615D01* +X006387Y007615D01* +X005927Y007461D02* +X005927Y007845D01* +X005620Y007845D02* +X005620Y007461D01* +X005697Y007384D01* +X005850Y007384D01* +X005927Y007461D01* +X004261Y010084D02* +X004107Y010084D01* +X004030Y010161D01* +X003877Y010084D02* +X003723Y010238D01* +X003800Y010238D02* +X003570Y010238D01* +X003570Y010084D02* +X003570Y010545D01* +X003800Y010545D01* +X003877Y010468D01* +X003877Y010315D01* +X003800Y010238D01* +X004030Y010468D02* +X004107Y010545D01* +X004261Y010545D01* +X004337Y010468D01* +X004337Y010391D01* +X004261Y010315D01* +X004337Y010238D01* +X004337Y010161D01* +X004261Y010084D01* +X004261Y010315D02* +X004184Y010315D01* +X004207Y013484D02* +X004130Y013561D01* +X004207Y013484D02* +X004361Y013484D01* +X004437Y013561D01* +X004437Y013638D01* +X004361Y013715D01* +X004284Y013715D01* +X004361Y013715D02* +X004437Y013791D01* +X004437Y013868D01* +X004361Y013945D01* +X004207Y013945D01* +X004130Y013868D01* +X003977Y013868D02* +X003900Y013945D01* +X003747Y013945D01* +X003670Y013868D01* +X003670Y013561D01* +X003747Y013484D01* +X003900Y013484D01* +X003977Y013561D01* +X006649Y014334D02* +X006649Y014795D01* +X006879Y014795D01* +X006956Y014718D01* +X006956Y014565D01* +X006879Y014488D01* +X006649Y014488D01* +X006803Y014488D02* +X006956Y014334D01* +X007110Y014334D02* +X007417Y014334D01* +X007263Y014334D02* +X007263Y014795D01* +X007110Y014641D01* +X008386Y014156D02* +X008386Y016479D01* +X009606Y016479D01* +X010394Y016479D02* +X011614Y016479D01* +X011614Y014156D01* +X010709Y013250D01* +X010394Y013250D01* +X009606Y013250D02* +X009291Y013250D01* +X008386Y014156D01* +X009646Y013348D02* +X009569Y013368D01* +X009494Y013391D01* +X009420Y013419D01* +X009348Y013450D01* +X009277Y013485D01* +X009208Y013523D01* +X009142Y013565D01* +X009077Y013610D01* +X009015Y013658D01* +X008955Y013710D01* +X008898Y013764D01* +X008844Y013821D01* +X008792Y013881D01* +X008744Y013943D01* +X008699Y014008D01* +X008658Y014075D01* +X008620Y014144D01* +X008585Y014215D01* +X008554Y014287D01* +X008526Y014361D01* +X008503Y014436D01* +X008483Y014512D01* +X008467Y014590D01* +X008455Y014668D01* +X008447Y014746D01* +X008443Y014825D01* +X008443Y014903D01* +X008447Y014982D01* +X008455Y015060D01* +X008467Y015138D01* +X008483Y015216D01* +X008503Y015292D01* +X008526Y015367D01* +X008554Y015441D01* +X008585Y015513D01* +X008620Y015584D01* +X008658Y015653D01* +X008699Y015720D01* +X008744Y015785D01* +X008792Y015847D01* +X008844Y015907D01* +X008898Y015964D01* +X008955Y016018D01* +X009015Y016070D01* +X009077Y016118D01* +X009142Y016163D01* +X009208Y016205D01* +X009277Y016243D01* +X009348Y016278D01* +X009420Y016309D01* +X009494Y016337D01* +X009569Y016360D01* +X009646Y016380D01* +X010354Y016380D02* +X010431Y016360D01* +X010506Y016337D01* +X010580Y016309D01* +X010652Y016278D01* +X010723Y016243D01* +X010792Y016205D01* +X010858Y016163D01* +X010923Y016118D01* +X010985Y016070D01* +X011045Y016018D01* +X011102Y015964D01* +X011156Y015907D01* +X011208Y015847D01* +X011256Y015785D01* +X011301Y015720D01* +X011342Y015653D01* +X011380Y015584D01* +X011415Y015513D01* +X011446Y015441D01* +X011474Y015367D01* +X011497Y015292D01* +X011517Y015216D01* +X011533Y015138D01* +X011545Y015060D01* +X011553Y014982D01* +X011557Y014903D01* +X011557Y014825D01* +X011553Y014746D01* +X011545Y014668D01* +X011533Y014590D01* +X011517Y014512D01* +X011497Y014436D01* +X011474Y014361D01* +X011446Y014287D01* +X011415Y014215D01* +X011380Y014144D01* +X011342Y014075D01* +X011301Y014008D01* +X011256Y013943D01* +X011208Y013881D01* +X011156Y013821D01* +X011102Y013764D01* +X011045Y013710D01* +X010985Y013658D01* +X010923Y013610D01* +X010858Y013565D01* +X010792Y013523D01* +X010723Y013485D01* +X010652Y013450D01* +X010580Y013419D01* +X010506Y013391D01* +X010431Y013368D01* +X010354Y013348D01* +X011749Y012395D02* +X011749Y012011D01* +X011826Y011934D01* +X011979Y011934D01* +X012056Y012011D01* +X012056Y012395D01* +X012210Y012241D02* +X012363Y012395D01* +X012363Y011934D01* +X012210Y011934D02* +X012517Y011934D01* +X013148Y012406D02* +X012242Y013312D01* +X012242Y016422D01* +X013856Y016422D01* +X014644Y016422D02* +X016258Y016422D01* +X016258Y013312D01* +X015352Y012406D01* +X014644Y012406D01* +X013856Y012406D02* +X013148Y012406D01* +X014849Y010645D02* +X014849Y010184D01* +X015156Y010184D01* +X015310Y010184D02* +X015617Y010184D01* +X015463Y010184D02* +X015463Y010645D01* +X015310Y010491D01* +X015320Y009295D02* +X015550Y009295D01* +X015627Y009218D01* +X015627Y009065D01* +X015550Y008988D01* +X015320Y008988D01* +X015473Y008988D02* +X015627Y008834D01* +X015780Y008834D02* +X016087Y009141D01* +X016087Y009218D01* +X016011Y009295D01* +X015857Y009295D01* +X015780Y009218D01* +X015780Y008834D02* +X016087Y008834D01* +X015320Y008834D02* +X015320Y009295D01* +X014644Y012504D02* +X014729Y012524D01* +X014813Y012547D01* +X014896Y012574D01* +X014978Y012605D01* +X015058Y012639D01* +X015137Y012678D01* +X015214Y012719D01* +X015289Y012764D01* +X015362Y012812D01* +X015433Y012864D01* +X015501Y012918D01* +X015567Y012976D01* +X015630Y013036D01* +X015690Y013099D01* +X015748Y013165D01* +X015802Y013234D01* +X015854Y013304D01* +X015902Y013377D01* +X015946Y013453D01* +X015988Y013530D01* +X016026Y013608D01* +X016060Y013689D01* +X016091Y013771D01* +X016118Y013854D01* +X016141Y013938D01* +X016160Y014023D01* +X016176Y014109D01* +X016188Y014196D01* +X016196Y014283D01* +X016200Y014370D01* +X016200Y014458D01* +X016196Y014545D01* +X016188Y014632D01* +X016176Y014719D01* +X016160Y014805D01* +X016141Y014890D01* +X016118Y014974D01* +X016091Y015057D01* +X016060Y015139D01* +X016026Y015220D01* +X015988Y015298D01* +X015946Y015375D01* +X015902Y015451D01* +X015854Y015524D01* +X015802Y015594D01* +X015748Y015663D01* +X015690Y015729D01* +X015630Y015792D01* +X015567Y015852D01* +X015501Y015910D01* +X015433Y015964D01* +X015362Y016016D01* +X015289Y016064D01* +X015214Y016109D01* +X015137Y016150D01* +X015058Y016189D01* +X014978Y016223D01* +X014896Y016254D01* +X014813Y016281D01* +X014729Y016304D01* +X014644Y016324D01* +X013856Y016324D02* +X013771Y016304D01* +X013687Y016281D01* +X013604Y016254D01* +X013522Y016223D01* +X013442Y016189D01* +X013363Y016150D01* +X013286Y016109D01* +X013211Y016064D01* +X013138Y016016D01* +X013067Y015964D01* +X012999Y015910D01* +X012933Y015852D01* +X012870Y015792D01* +X012810Y015729D01* +X012752Y015663D01* +X012698Y015594D01* +X012646Y015524D01* +X012598Y015451D01* +X012554Y015375D01* +X012512Y015298D01* +X012474Y015220D01* +X012440Y015139D01* +X012409Y015057D01* +X012382Y014974D01* +X012359Y014890D01* +X012340Y014805D01* +X012324Y014719D01* +X012312Y014632D01* +X012304Y014545D01* +X012300Y014458D01* +X012300Y014370D01* +X012304Y014283D01* +X012312Y014196D01* +X012324Y014109D01* +X012340Y014023D01* +X012359Y013938D01* +X012382Y013854D01* +X012409Y013771D01* +X012440Y013689D01* +X012474Y013608D01* +X012512Y013530D01* +X012554Y013453D01* +X012598Y013377D01* +X012646Y013304D01* +X012698Y013234D01* +X012752Y013165D01* +X012810Y013099D01* +X012870Y013036D01* +X012933Y012976D01* +X012999Y012918D01* +X013067Y012864D01* +X013138Y012812D01* +X013211Y012764D01* +X013286Y012719D01* +X013363Y012678D01* +X013442Y012639D01* +X013522Y012605D01* +X013604Y012574D01* +X013687Y012547D01* +X013771Y012524D01* +X013856Y012504D01* +D16* +X011780Y011454D03* +X011780Y010784D03* +X011780Y010114D03* +X011780Y009444D03* +X011780Y008774D03* +D17* +X015534Y016610D02* +X015657Y016610D01* +X015719Y016672D01* +X015841Y016610D02* +X016088Y016857D01* +X016088Y016919D01* +X016026Y016981D01* +X015902Y016981D01* +X015841Y016919D01* +X015719Y016919D02* +X015657Y016981D01* +X015534Y016981D01* +X015472Y016919D01* +X015472Y016672D01* +X015534Y016610D01* +X015841Y016610D02* +X016088Y016610D01* +X011491Y016701D02* +X011244Y016701D01* +X011368Y016701D02* +X011368Y017071D01* +X011244Y016948D01* +X011123Y017010D02* +X011061Y017071D01* +X010938Y017071D01* +X010876Y017010D01* +X010876Y016763D01* +X010938Y016701D01* +X011061Y016701D01* +X011123Y016763D01* +D18* +X022869Y013789D02* +X022869Y007639D01* +D19* +X022634Y007796D03* +X022634Y013633D03* +D20* +X016200Y004573D02* +X016259Y004514D01* +X016190Y004445D01* +X016131Y004504D01* +X016200Y004573D01* +D21* +X016092Y004672D03* +M02* diff --git a/gerber/tests/test_cam.py b/gerber/tests/test_cam.py new file mode 100644 index 0000000..ce4ec44 --- /dev/null +++ b/gerber/tests/test_cam.py @@ -0,0 +1,68 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> + +from ..cam import CamFile, FileSettings +from tests import * + + +def test_filesettings_defaults(): + """ Test FileSettings default values + """ + fs = FileSettings() + assert_equal(fs.format, (2, 5)) + assert_equal(fs.notation, 'absolute') + assert_equal(fs.zero_suppression, 'trailing') + assert_equal(fs.units, 'inch') + + +def test_filesettings_dict(): + """ Test FileSettings Dict + """ + fs = FileSettings() + assert_equal(fs['format'], (2, 5)) + assert_equal(fs['notation'], 'absolute') + assert_equal(fs['zero_suppression'], 'trailing') + assert_equal(fs['units'], 'inch') + + +def test_filesettings_assign(): + """ Test FileSettings attribute assignment + """ + fs = FileSettings() + fs.units = 'test1' + fs.notation = 'test2' + fs.zero_suppression = 'test3' + fs.format = 'test4' + assert_equal(fs.units, 'test1') + assert_equal(fs.notation, 'test2') + assert_equal(fs.zero_suppression, 'test3') + assert_equal(fs.format, 'test4') + + +def test_filesettings_dict_assign(): + """ Test FileSettings dict-style attribute assignment + """ + fs = FileSettings() + fs['units'] = 'metric' + fs['notation'] = 'incremental' + fs['zero_suppression'] = 'leading' + fs['format'] = (1, 2) + assert_equal(fs.units, 'metric') + assert_equal(fs.notation, 'incremental') + assert_equal(fs.zero_suppression, 'leading') + assert_equal(fs.format, (1, 2)) + +def test_camfile_init(): + """ Smoke test CamFile test + """ + cf = CamFile() + +def test_camfile_settings(): + """ Test CamFile Default Settings + """ + cf = CamFile() + assert_equal(cf.settings, FileSettings()) + +
\ No newline at end of file diff --git a/gerber/tests/test_common.py b/gerber/tests/test_common.py new file mode 100644 index 0000000..1e1efe5 --- /dev/null +++ b/gerber/tests/test_common.py @@ -0,0 +1,24 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> +from ..common import read +from ..excellon import ExcellonFile +from ..rs274x import GerberFile +from tests import * + +import os + + +NCDRILL_FILE = os.path.join(os.path.dirname(__file__), + 'resources/ncdrill.DRD') +TOP_COPPER_FILE = os.path.join(os.path.dirname(__file__), + 'resources/top_copper.GTL') + +def test_file_type_detection(): + """ Test file type detection + """ + ncdrill = read(NCDRILL_FILE) + top_copper = read(TOP_COPPER_FILE) + assert(isinstance(ncdrill, ExcellonFile)) + assert(isinstance(top_copper, GerberFile)) diff --git a/gerber/tests/test_excellon.py b/gerber/tests/test_excellon.py new file mode 100644 index 0000000..72e3d7d --- /dev/null +++ b/gerber/tests/test_excellon.py @@ -0,0 +1,32 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> +from ..excellon import read, detect_excellon_format, ExcellonFile +from tests import * + +import os + +NCDRILL_FILE = os.path.join(os.path.dirname(__file__), + 'resources/ncdrill.DRD') + +def test_format_detection(): + """ Test file type detection + """ + settings = detect_excellon_format(NCDRILL_FILE) + assert_equal(settings['format'], (2, 4)) + assert_equal(settings['zero_suppression'], 'leading') + +def test_read(): + ncdrill = read(NCDRILL_FILE) + assert(isinstance(ncdrill, ExcellonFile)) + +def test_read_settings(): + ncdrill = read(NCDRILL_FILE) + assert_equal(ncdrill.settings.format, (2, 4)) + assert_equal(ncdrill.settings.zero_suppression, 'leading') + + + + + diff --git a/gerber/tests/test_excellon_statements.py b/gerber/tests/test_excellon_statements.py new file mode 100644 index 0000000..f2e17ee --- /dev/null +++ b/gerber/tests/test_excellon_statements.py @@ -0,0 +1,270 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> + +from .tests import assert_equal, assert_raises +from ..excellon_statements import * +from ..cam import FileSettings + + +def test_excellontool_factory(): + """ Test ExcellonTool factory method + """ + exc_line = 'T8F00S00C0.12500' + settings = FileSettings(format=(2, 5), zero_suppression='trailing', + units='inch', notation='absolute') + tool = ExcellonTool.from_excellon(exc_line, settings) + assert_equal(tool.diameter, 0.125) + assert_equal(tool.feed_rate, 0) + assert_equal(tool.rpm, 0) + + +def test_excellontool_dump(): + """ Test ExcellonTool to_excellon() + """ + exc_lines = ['T1F00S00C0.01200', 'T2F00S00C0.01500', 'T3F00S00C0.01968', + 'T4F00S00C0.02800', 'T5F00S00C0.03300', 'T6F00S00C0.03800', + 'T7F00S00C0.04300', 'T8F00S00C0.12500', 'T9F00S00C0.13000', ] + settings = FileSettings(format=(2, 5), zero_suppression='trailing', + units='inch', notation='absolute') + for line in exc_lines: + tool = ExcellonTool.from_excellon(line, settings) + assert_equal(tool.to_excellon(), line) + + +def test_excellontool_order(): + settings = FileSettings(format=(2, 5), zero_suppression='trailing', + units='inch', notation='absolute') + line = 'T8F00S00C0.12500' + tool1 = ExcellonTool.from_excellon(line, settings) + line = 'T8C0.12500F00S00' + tool2 = ExcellonTool.from_excellon(line, settings) + assert_equal(tool1.diameter, tool2.diameter) + assert_equal(tool1.feed_rate, tool2.feed_rate) + assert_equal(tool1.rpm, tool2.rpm) + + +def test_toolselection_factory(): + """ Test ToolSelectionStmt factory method + """ + stmt = ToolSelectionStmt.from_excellon('T01') + assert_equal(stmt.tool, 1) + assert_equal(stmt.compensation_index, None) + stmt = ToolSelectionStmt.from_excellon('T0223') + assert_equal(stmt.tool, 2) + assert_equal(stmt.compensation_index, 23) + + +def test_toolselection_dump(): + """ Test ToolSelectionStmt to_excellon() + """ + lines = ['T01', 'T0223', 'T10', 'T09', 'T0000'] + for line in lines: + stmt = ToolSelectionStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_coordinatestmt_factory(): + """ Test CoordinateStmt factory method + """ + line = 'X0278207Y0065293' + stmt = CoordinateStmt.from_excellon(line) + assert_equal(stmt.x, 2.78207) + assert_equal(stmt.y, 0.65293) + + line = 'X02945' + stmt = CoordinateStmt.from_excellon(line) + assert_equal(stmt.x, 2.945) + + line = 'Y00575' + stmt = CoordinateStmt.from_excellon(line) + assert_equal(stmt.y, 0.575) + + +def test_coordinatestmt_dump(): + """ Test CoordinateStmt to_excellon() + """ + lines = ['X0278207Y0065293', 'X0243795', 'Y0082528', 'Y0086028', + 'X0251295Y0081528', 'X02525Y0078', 'X0255Y00575', 'Y0052', + 'X02675', 'Y00575', 'X02425', 'Y0052', 'X023', ] + for line in lines: + stmt = CoordinateStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_commentstmt_factory(): + """ Test CommentStmt factory method + """ + line = ';Layer_Color=9474304' + stmt = CommentStmt.from_excellon(line) + assert_equal(stmt.comment, line[1:]) + + line = ';FILE_FORMAT=2:5' + stmt = CommentStmt.from_excellon(line) + assert_equal(stmt.comment, line[1:]) + + line = ';TYPE=PLATED' + stmt = CommentStmt.from_excellon(line) + assert_equal(stmt.comment, line[1:]) + + +def test_commentstmt_dump(): + """ Test CommentStmt to_excellon() + """ + lines = [';Layer_Color=9474304', ';FILE_FORMAT=2:5', ';TYPE=PLATED', ] + for line in lines: + stmt = CommentStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_unitstmt_factory(): + """ Test UnitStmt factory method + """ + line = 'INCH,LZ' + stmt = UnitStmt.from_excellon(line) + assert_equal(stmt.units, 'inch') + assert_equal(stmt.zero_suppression, 'trailing') + + line = 'METRIC,TZ' + stmt = UnitStmt.from_excellon(line) + assert_equal(stmt.units, 'metric') + assert_equal(stmt.zero_suppression, 'leading') + + +def test_unitstmt_dump(): + """ Test UnitStmt to_excellon() + """ + lines = ['INCH,LZ', 'INCH,TZ', 'METRIC,LZ', 'METRIC,TZ', ] + for line in lines: + stmt = UnitStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_incrementalmode_factory(): + """ Test IncrementalModeStmt factory method + """ + line = 'ICI,ON' + stmt = IncrementalModeStmt.from_excellon(line) + assert_equal(stmt.mode, 'on') + + line = 'ICI,OFF' + stmt = IncrementalModeStmt.from_excellon(line) + assert_equal(stmt.mode, 'off') + + +def test_incrementalmode_dump(): + """ Test IncrementalModeStmt to_excellon() + """ + lines = ['ICI,ON', 'ICI,OFF', ] + for line in lines: + stmt = IncrementalModeStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_incrementalmode_validation(): + """ Test IncrementalModeStmt input validation + """ + assert_raises(ValueError, IncrementalModeStmt, 'OFF-ISH') + + +def test_versionstmt_factory(): + """ Test VersionStmt factory method + """ + line = 'VER,1' + stmt = VersionStmt.from_excellon(line) + assert_equal(stmt.version, 1) + + line = 'VER,2' + stmt = VersionStmt.from_excellon(line) + assert_equal(stmt.version, 2) + + +def test_versionstmt_dump(): + """ Test VersionStmt to_excellon() + """ + lines = ['VER,1', 'VER,2', ] + for line in lines: + stmt = VersionStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + +def test_versionstmt_validation(): + """ Test VersionStmt input validation + """ + assert_raises(ValueError, VersionStmt, 3) + + +def test_formatstmt_factory(): + """ Test FormatStmt factory method + """ + line = 'FMAT,1' + stmt = FormatStmt.from_excellon(line) + assert_equal(stmt.format, 1) + + line = 'FMAT,2' + stmt = FormatStmt.from_excellon(line) + assert_equal(stmt.format, 2) + + +def test_formatstmt_dump(): + """ Test FormatStmt to_excellon() + """ + lines = ['FMAT,1', 'FMAT,2', ] + for line in lines: + stmt = FormatStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_formatstmt_validation(): + """ Test FormatStmt input validation + """ + assert_raises(ValueError, FormatStmt, 3) + + +def test_linktoolstmt_factory(): + """ Test LinkToolStmt factory method + """ + line = '1/2/3/4' + stmt = LinkToolStmt.from_excellon(line) + assert_equal(stmt.linked_tools, [1, 2, 3, 4]) + + line = '01/02/03/04' + stmt = LinkToolStmt.from_excellon(line) + assert_equal(stmt.linked_tools, [1, 2, 3, 4]) + + +def test_linktoolstmt_dump(): + """ Test LinkToolStmt to_excellon() + """ + lines = ['1/2/3/4', '5/6/7', ] + for line in lines: + stmt = LinkToolStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_measmodestmt_factory(): + """ Test MeasuringModeStmt factory method + """ + line = 'M72' + stmt = MeasuringModeStmt.from_excellon(line) + assert_equal(stmt.units, 'inch') + + line = 'M71' + stmt = MeasuringModeStmt.from_excellon(line) + assert_equal(stmt.units, 'metric') + + +def test_measmodestmt_dump(): + """ Test MeasuringModeStmt to_excellon() + """ + lines = ['M71', 'M72', ] + for line in lines: + stmt = MeasuringModeStmt.from_excellon(line) + assert_equal(stmt.to_excellon(), line) + + +def test_measmodestmt_validation(): + """ Test MeasuringModeStmt input validation + """ + assert_raises(ValueError, MeasuringModeStmt.from_excellon, 'M70') + assert_raises(ValueError, MeasuringModeStmt, 'millimeters') diff --git a/gerber/tests/test_gerber_statements.py b/gerber/tests/test_gerber_statements.py new file mode 100644 index 0000000..a463c9d --- /dev/null +++ b/gerber/tests/test_gerber_statements.py @@ -0,0 +1,303 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> + +from .tests import * +from ..gerber_statements import * + + +def test_FSParamStmt_factory(): + """ Test FSParamStruct factory + """ + stmt = {'param': 'FS', 'zero': 'L', 'notation': 'A', 'x': '27'} + fs = FSParamStmt.from_dict(stmt) + assert_equal(fs.param, 'FS') + assert_equal(fs.zero_suppression, 'leading') + assert_equal(fs.notation, 'absolute') + assert_equal(fs.format, (2, 7)) + + stmt = {'param': 'FS', 'zero': 'T', 'notation': 'I', 'x': '27'} + fs = FSParamStmt.from_dict(stmt) + assert_equal(fs.param, 'FS') + assert_equal(fs.zero_suppression, 'trailing') + assert_equal(fs.notation, 'incremental') + assert_equal(fs.format, (2, 7)) + +def test_FSParamStmt(): + """ Test FSParamStmt initialization + """ + param = 'FS' + zeros = 'trailing' + notation = 'absolute' + fmt = (2, 5) + stmt = FSParamStmt(param, zeros, notation, fmt) + assert_equal(stmt.param, param) + assert_equal(stmt.zero_suppression, zeros) + assert_equal(stmt.notation, notation) + assert_equal(stmt.format, fmt) + +def test_FSParamStmt_dump(): + """ Test FSParamStmt to_gerber() + """ + stmt = {'param': 'FS', 'zero': 'L', 'notation': 'A', 'x': '27'} + fs = FSParamStmt.from_dict(stmt) + assert_equal(fs.to_gerber(), '%FSLAX27Y27*%') + + stmt = {'param': 'FS', 'zero': 'T', 'notation': 'I', 'x': '25'} + fs = FSParamStmt.from_dict(stmt) + assert_equal(fs.to_gerber(), '%FSTIX25Y25*%') + + +def test_MOParamStmt_factory(): + """ Test MOParamStruct factory + """ + stmts = [{'param': 'MO', 'mo': 'IN'}, {'param': 'MO', 'mo': 'in'}, ] + for stmt in stmts: + mo = MOParamStmt.from_dict(stmt) + assert_equal(mo.param, 'MO') + assert_equal(mo.mode, 'inch') + + stmts = [{'param': 'MO', 'mo': 'MM'}, {'param': 'MO', 'mo': 'mm'}, ] + for stmt in stmts: + mo = MOParamStmt.from_dict(stmt) + assert_equal(mo.param, 'MO') + assert_equal(mo.mode, 'metric') + +def test_MOParamStmt(): + """ Test MOParamStmt initialization + """ + param = 'MO' + mode = 'inch' + stmt = MOParamStmt(param, mode) + assert_equal(stmt.param, param) + + for mode in ['inch', 'metric']: + stmt = MOParamStmt(param, mode) + assert_equal(stmt.mode, mode) + + +def test_MOParamStmt_dump(): + """ Test MOParamStmt to_gerber() + """ + stmt = {'param': 'MO', 'mo': 'IN'} + mo = MOParamStmt.from_dict(stmt) + assert_equal(mo.to_gerber(), '%MOIN*%') + + stmt = {'param': 'MO', 'mo': 'MM'} + mo = MOParamStmt.from_dict(stmt) + assert_equal(mo.to_gerber(), '%MOMM*%') + + +def test_IPParamStmt_factory(): + """ Test IPParamStruct factory + """ + stmt = {'param': 'IP', 'ip': 'POS'} + ip = IPParamStmt.from_dict(stmt) + assert_equal(ip.ip, 'positive') + + stmt = {'param': 'IP', 'ip': 'NEG'} + ip = IPParamStmt.from_dict(stmt) + assert_equal(ip.ip, 'negative') + +def test_IPParamStmt(): + """ Test IPParamStmt initialization + """ + param = 'IP' + for ip in ['positive', 'negative']: + stmt = IPParamStmt(param, ip) + assert_equal(stmt.param, param) + assert_equal(stmt.ip, ip) + + +def test_IPParamStmt_dump(): + """ Test IPParamStmt to_gerber() + """ + stmt = {'param': 'IP', 'ip': 'POS'} + ip = IPParamStmt.from_dict(stmt) + assert_equal(ip.to_gerber(), '%IPPOS*%') + + stmt = {'param': 'IP', 'ip': 'NEG'} + ip = IPParamStmt.from_dict(stmt) + assert_equal(ip.to_gerber(), '%IPNEG*%') + + +def test_OFParamStmt_factory(): + """ Test OFParamStmt factory + """ + stmt = {'param': 'OF', 'a': '0.1234567', 'b': '0.1234567'} + of = OFParamStmt.from_dict(stmt) + assert_equal(of.a, 0.1234567) + assert_equal(of.b, 0.1234567) + +def test_OFParamStmt(): + """ Test IPParamStmt initialization + """ + param = 'OF' + for val in [0.0, -3.4567]: + stmt = OFParamStmt(param, val, val) + assert_equal(stmt.param, param) + assert_equal(stmt.a, val) + assert_equal(stmt.b, val) + +def test_OFParamStmt_dump(): + """ Test OFParamStmt to_gerber() + """ + stmt = {'param': 'OF', 'a': '0.1234567', 'b': '0.1234567'} + of = OFParamStmt.from_dict(stmt) + assert_equal(of.to_gerber(), '%OFA0.123456B0.123456*%') + + +def test_LPParamStmt_factory(): + """ Test LPParamStmt factory + """ + stmt = {'param': 'LP', 'lp': 'C'} + lp = LPParamStmt.from_dict(stmt) + assert_equal(lp.lp, 'clear') + + stmt = {'param': 'LP', 'lp': 'D'} + lp = LPParamStmt.from_dict(stmt) + assert_equal(lp.lp, 'dark') + +def test_LPParamStmt_dump(): + """ Test LPParamStmt to_gerber() + """ + stmt = {'param': 'LP', 'lp': 'C'} + lp = LPParamStmt.from_dict(stmt) + assert_equal(lp.to_gerber(), '%LPC*%') + + stmt = {'param': 'LP', 'lp': 'D'} + lp = LPParamStmt.from_dict(stmt) + assert_equal(lp.to_gerber(), '%LPD*%') + + +def test_INParamStmt_factory(): + """ Test INParamStmt factory + """ + stmt = {'param': 'IN', 'name': 'test'} + inp = INParamStmt.from_dict(stmt) + assert_equal(inp.name, 'test') + +def test_INParamStmt_dump(): + """ Test INParamStmt to_gerber() + """ + stmt = {'param': 'IN', 'name': 'test'} + inp = INParamStmt.from_dict(stmt) + assert_equal(inp.to_gerber(), '%INtest*%') + + +def test_LNParamStmt_factory(): + """ Test LNParamStmt factory + """ + stmt = {'param': 'LN', 'name': 'test'} + lnp = LNParamStmt.from_dict(stmt) + assert_equal(lnp.name, 'test') + +def test_LNParamStmt_dump(): + """ Test LNParamStmt to_gerber() + """ + stmt = {'param': 'LN', 'name': 'test'} + lnp = LNParamStmt.from_dict(stmt) + assert_equal(lnp.to_gerber(), '%LNtest*%') + +def test_comment_stmt(): + """ Test comment statement + """ + stmt = CommentStmt('A comment') + assert_equal(stmt.type, 'COMMENT') + assert_equal(stmt.comment, 'A comment') + +def test_comment_stmt_dump(): + """ Test CommentStmt to_gerber() + """ + stmt = CommentStmt('A comment') + assert_equal(stmt.to_gerber(), 'G04A comment*') + + +def test_eofstmt(): + """ Test EofStmt + """ + stmt = EofStmt() + assert_equal(stmt.type, 'EOF') + +def test_eofstmt_dump(): + """ Test EofStmt to_gerber() + """ + stmt = EofStmt() + assert_equal(stmt.to_gerber(), 'M02*') + + +def test_quadmodestmt_factory(): + """ Test QuadrantModeStmt.from_gerber() + """ + line = 'G74*' + stmt = QuadrantModeStmt.from_gerber(line) + assert_equal(stmt.type, 'QuadrantMode') + assert_equal(stmt.mode, 'single-quadrant') + + line = 'G75*' + stmt = QuadrantModeStmt.from_gerber(line) + assert_equal(stmt.mode, 'multi-quadrant') + +def test_quadmodestmt_validation(): + """ Test QuadrantModeStmt input validation + """ + line = 'G76*' + assert_raises(ValueError, QuadrantModeStmt.from_gerber, line) + assert_raises(ValueError, QuadrantModeStmt, 'quadrant-ful') + + +def test_quadmodestmt_dump(): + """ Test QuadrantModeStmt.to_gerber() + """ + for line in ('G74*', 'G75*',): + stmt = QuadrantModeStmt.from_gerber(line) + assert_equal(stmt.to_gerber(), line) + + +def test_regionmodestmt_factory(): + """ Test RegionModeStmt.from_gerber() + """ + line = 'G36*' + stmt = RegionModeStmt.from_gerber(line) + assert_equal(stmt.type, 'RegionMode') + assert_equal(stmt.mode, 'on') + + line = 'G37*' + stmt = RegionModeStmt.from_gerber(line) + assert_equal(stmt.mode, 'off') + + +def test_regionmodestmt_validation(): + """ Test RegionModeStmt input validation + """ + line = 'G38*' + assert_raises(ValueError, RegionModeStmt.from_gerber, line) + assert_raises(ValueError, RegionModeStmt, 'off-ish') + + +def test_regionmodestmt_dump(): + """ Test RegionModeStmt.to_gerber() + """ + for line in ('G36*', 'G37*',): + stmt = RegionModeStmt.from_gerber(line) + assert_equal(stmt.to_gerber(), line) + + +def test_unknownstmt(): + """ Test UnknownStmt + """ + line = 'G696969*' + stmt = UnknownStmt(line) + assert_equal(stmt.type, 'UNKNOWN') + assert_equal(stmt.line, line) + + +def test_unknownstmt_dump(): + """ Test UnknownStmt.to_gerber() + """ + lines = ('G696969*', 'M03*',) + for line in lines: + stmt = UnknownStmt(line) + assert_equal(stmt.to_gerber(), line) + diff --git a/gerber/tests/test_rs274x.py b/gerber/tests/test_rs274x.py new file mode 100644 index 0000000..f66a09e --- /dev/null +++ b/gerber/tests/test_rs274x.py @@ -0,0 +1,16 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> +from ..rs274x import read, GerberFile +from tests import * + +import os + +TOP_COPPER_FILE = os.path.join(os.path.dirname(__file__), + 'resources/top_copper.GTL') + + +def test_read(): + top_copper = read(TOP_COPPER_FILE) + assert(isinstance(top_copper, GerberFile)) diff --git a/gerber/tests/test_utils.py b/gerber/tests/test_utils.py new file mode 100644 index 0000000..001a32f --- /dev/null +++ b/gerber/tests/test_utils.py @@ -0,0 +1,83 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> + +from .tests import assert_equal +from ..utils import decimal_string, parse_gerber_value, write_gerber_value + + +def test_zero_suppression(): + """ Test gerber value parser and writer handle zero suppression correctly. + """ + # Default format + fmt = (2, 5) + + # Test leading zero suppression + zero_suppression = 'leading' + test_cases = [('1', 0.00001), ('10', 0.0001), ('100', 0.001), + ('1000', 0.01), ('10000', 0.1), ('100000', 1.0), + ('1000000', 10.0), ('-1', -0.00001), ('-10', -0.0001), + ('-100', -0.001), ('-1000', -0.01), ('-10000', -0.1), + ('-100000', -1.0), ('-1000000', -10.0), ] + for string, value in test_cases: + assert(value == parse_gerber_value(string, fmt, zero_suppression)) + assert(string == write_gerber_value(value, fmt, zero_suppression)) + + # Test trailing zero suppression + zero_suppression = 'trailing' + test_cases = [('1', 10.0), ('01', 1.0), ('001', 0.1), ('0001', 0.01), + ('00001', 0.001), ('000001', 0.0001), + ('0000001', 0.00001), ('-1', -10.0), ('-01', -1.0), + ('-001', -0.1), ('-0001', -0.01), ('-00001', -0.001), + ('-000001', -0.0001), ('-0000001', -0.00001)] + for string, value in test_cases: + assert(value == parse_gerber_value(string, fmt, zero_suppression)) + assert(string == write_gerber_value(value, fmt, zero_suppression)) + + +def test_format(): + """ Test gerber value parser and writer handle format correctly + """ + zero_suppression = 'leading' + test_cases = [((2, 7), '1', 0.0000001), ((2, 6), '1', 0.000001), + ((2, 5), '1', 0.00001), ((2, 4), '1', 0.0001), + ((2, 3), '1', 0.001), ((2, 2), '1', 0.01), + ((2, 1), '1', 0.1), ((2, 7), '-1', -0.0000001), + ((2, 6), '-1', -0.000001), ((2, 5), '-1', -0.00001), + ((2, 4), '-1', -0.0001), ((2, 3), '-1', -0.001), + ((2, 2), '-1', -0.01), ((2, 1), '-1', -0.1), ] + for fmt, string, value in test_cases: + assert(value == parse_gerber_value(string, fmt, zero_suppression)) + assert(string == write_gerber_value(value, fmt, zero_suppression)) + + zero_suppression = 'trailing' + test_cases = [((6, 5), '1', 100000.0), ((5, 5), '1', 10000.0), + ((4, 5), '1', 1000.0), ((3, 5), '1', 100.0), + ((2, 5), '1', 10.0), ((1, 5), '1', 1.0), + ((6, 5), '-1', -100000.0), ((5, 5), '-1', -10000.0), + ((4, 5), '-1', -1000.0), ((3, 5), '-1', -100.0), + ((2, 5), '-1', -10.0), ((1, 5), '-1', -1.0), ] + for fmt, string, value in test_cases: + assert(value == parse_gerber_value(string, fmt, zero_suppression)) + assert(string == write_gerber_value(value, fmt, zero_suppression)) + + +def test_decimal_truncation(): + """ Test decimal_string truncates value to the correct precision + """ + value = 1.123456789 + for x in range(10): + result = decimal_string(value, precision=x) + calculated = '1.' + ''.join(str(y) for y in range(1,x+1)) + assert(result == calculated) + + +def test_decimal_padding(): + """ Test decimal_string padding + """ + value = 1.123 + assert_equal(decimal_string(value, precision=3, padding=True), '1.123') + assert_equal(decimal_string(value, precision=4, padding=True), '1.1230') + assert_equal(decimal_string(value, precision=5, padding=True), '1.12300') + assert_equal(decimal_string(value, precision=6, padding=True), '1.123000') diff --git a/gerber/tests/tests.py b/gerber/tests/tests.py new file mode 100644 index 0000000..29b7899 --- /dev/null +++ b/gerber/tests/tests.py @@ -0,0 +1,18 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Hamilton Kibbe <ham@hamiltonkib.be> + +from nose.tools import assert_in +from nose.tools import assert_not_in +from nose.tools import assert_equal +from nose.tools import assert_not_equal +from nose.tools import assert_true +from nose.tools import assert_false +from nose.tools import assert_raises +from nose.tools import raises +from nose import with_setup + +__all__ = ['assert_in', 'assert_not_in', 'assert_equal', 'assert_not_equal', + 'assert_true', 'assert_false', 'assert_raises', 'raises', + 'with_setup' ] diff --git a/gerber/utils.py b/gerber/utils.py index 00b821b..7749e22 100644 --- a/gerber/utils.py +++ b/gerber/utils.py @@ -23,27 +23,30 @@ This module provides utility functions for working with Gerber and Excellon files. """ +# Author: Hamilton Kibbe <ham@hamiltonkib.be> +# License: + def parse_gerber_value(value, format=(2, 5), zero_suppression='trailing'): """ Convert gerber/excellon formatted string to floating-point number - + .. note:: - Format and zero suppression are configurable. Note that the Excellon - and Gerber formats use opposite terminology with respect to leading - and trailing zeros. The Gerber format specifies which zeros are - suppressed, while the Excellon format specifies which zeros are - included. This function uses the Gerber-file convention, so an - Excellon file in LZ (leading zeros) mode would use - `zero_suppression='trailing'` - - + Format and zero suppression are configurable. Note that the Excellon + and Gerber formats use opposite terminology with respect to leading + and trailing zeros. The Gerber format specifies which zeros are + suppressed, while the Excellon format specifies which zeros are + included. This function uses the Gerber-file convention, so an + Excellon file in LZ (leading zeros) mode would use + `zero_suppression='trailing'` + + Parameters ---------- value : string A Gerber/Excellon-formatted string representing a numerical value. format : tuple (int,int) - Gerber/Excellon precision format expressed as a tuple containing: + Gerber/Excellon precision format expressed as a tuple containing: (number of integer-part digits, number of decimal-part digits) zero_suppression : string @@ -53,12 +56,16 @@ def parse_gerber_value(value, format=(2, 5), zero_suppression='trailing'): ------- value : float The specified value as a floating-point number. - + """ + # Handle excellon edge case with explicit decimal. "That was easy!" + if '.' in value: + return float(value) + # Format precision integer_digits, decimal_digits = format MAX_DIGITS = integer_digits + decimal_digits - + # Absolute maximum number of digits supported. This will handle up to # 6:7 format, which is somewhat supported, even though the gerber spec # only allows up to 6:6 @@ -66,45 +73,41 @@ def parse_gerber_value(value, format=(2, 5), zero_suppression='trailing'): raise ValueError('Parser only supports precision up to 6:7 format') # Remove extraneous information - value = value.strip() - value = value.strip(' +') + #value = value.strip() + value = value.lstrip('+') negative = '-' in value if negative: - value = value.strip(' -') - - # Handle excellon edge case with explicit decimal. "That was easy!" - if '.' in value: - return float(value) - - digits = [digit for digit in '0' * MAX_DIGITS] + value = value.lstrip('-') + + + digits = list('0' * MAX_DIGITS) offset = 0 if zero_suppression == 'trailing' else (MAX_DIGITS - len(value)) for i, digit in enumerate(value): digits[i + offset] = digit - - + result = float(''.join(digits[:integer_digits] + ['.'] + digits[integer_digits:])) - return -1.0 * result if negative else result - - + return -result if negative else result + + def write_gerber_value(value, format=(2, 5), zero_suppression='trailing'): """ Convert a floating point number to a Gerber/Excellon-formatted string. - + .. note:: - Format and zero suppression are configurable. Note that the Excellon - and Gerber formats use opposite terminology with respect to leading - and trailing zeros. The Gerber format specifies which zeros are - suppressed, while the Excellon format specifies which zeros are - included. This function uses the Gerber-file convention, so an - Excellon file in LZ (leading zeros) mode would use + Format and zero suppression are configurable. Note that the Excellon + and Gerber formats use opposite terminology with respect to leading + and trailing zeros. The Gerber format specifies which zeros are + suppressed, while the Excellon format specifies which zeros are + included. This function uses the Gerber-file convention, so an + Excellon file in LZ (leading zeros) mode would use `zero_suppression='trailing'` - + Parameters ---------- value : float A floating point value. format : tuple (n=2) - Gerber/Excellon precision format expressed as a tuple containing: + Gerber/Excellon precision format expressed as a tuple containing: (number of integer-part digits, number of decimal-part digits) zero_suppression : string @@ -118,61 +121,90 @@ def write_gerber_value(value, format=(2, 5), zero_suppression='trailing'): # Format precision integer_digits, decimal_digits = format MAX_DIGITS = integer_digits + decimal_digits - + if MAX_DIGITS > 13 or integer_digits > 6 or decimal_digits > 7: raise ValueError('Parser only supports precision up to 6:7 format') - + + # Edge case... + if value == 0: + return '00' + # negative sign affects padding, so deal with it at the end... - negative = value < 0.0 + negative = value < 0.0 if negative: value = -1.0 * value # Format string for padding out in both directions fmtstring = '%%0%d.0%df' % (MAX_DIGITS + 1, decimal_digits) - digits = [val for val in fmtstring % value if val != '.'] - - # Suppression... + + # Suppression... if zero_suppression == 'trailing': while digits[-1] == '0': digits.pop() else: while digits[0] == '0': digits.pop(0) - + return ''.join(digits) if not negative else ''.join(['-'] + digits) - -def decimal_string(value, precision=6): +def decimal_string(value, precision=6, padding=False): """ Convert float to string with limited precision - + Parameters ---------- value : float A floating point value. - precision : + precision : Maximum number of decimal places to print Returns ------- value : string The specified value as a string. - + """ - floatstr = '%0.20g' % value + floatstr = '%0.10g' % value integer = None decimal = None if '.' in floatstr: - integer, decimal = floatstr.split('.') + integer, decimal = floatstr.split('.') elif ',' in floatstr: - integer, decimal = floatstr.split(',') + integer, decimal = floatstr.split(',') if len(decimal) > precision: decimal = decimal[:precision] + elif padding: + decimal = decimal + (precision - len(decimal)) * '0' if integer or decimal: return ''.join([integer, '.', decimal]) else: return int(floatstr) - + +def detect_file_format(filename): + """ Determine format of a file + + Parameters + ---------- + filename : string + Filename of the file to read. + + Returns + ------- + format : string + File format. either 'excellon' or 'rs274x' + """ + + # Read the first 20 lines + with open(filename, 'r') as f: + lines = [next(f) for x in xrange(20)] + + # Look for + for line in lines: + if 'M48' in line: + return 'excellon' + elif '%FS' in line: + return'rs274x' + return 'unknown' |